From 077e4cb64b63434ed687154467750d6d834e4059 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 9 Jan 2022 22:16:19 +0300 Subject: [PATCH 001/112] Initial commit --- .eslintrc.json => ._eslintrc.json | 0 .eslintrc.js | 59 + .gitignore | 1 + .prettierignore | 1 + .prettierrc | 8 + package-lock.json | 2347 ++++++++++++++++++++++++++++- package.json | 14 +- src/cam.ts | 11 + src/index.ts | 3 + tsconfig.json | 24 + typedoc.json | 4 + 11 files changed, 2405 insertions(+), 67 deletions(-) rename .eslintrc.json => ._eslintrc.json (100%) create mode 100644 .eslintrc.js create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 src/cam.ts create mode 100644 src/index.ts create mode 100644 tsconfig.json create mode 100644 typedoc.json diff --git a/.eslintrc.json b/._eslintrc.json similarity index 100% rename from .eslintrc.json rename to ._eslintrc.json diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..e44ed2a6 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,59 @@ +const commonRules = { + 'no-console': 1, + 'import/extensions': 0, + 'quote-props': 0, + 'import/prefer-default-export': 0, + 'no-await-in-loop': 0, + 'no-restricted-syntax': 0, + 'max-classes-per-file': 0, + 'no-underscore-dangle': 0, + 'no-unused-expressions': 0, + 'no-case-declarations': 0, + 'no-shadow': 0, + 'import/no-cycle': 0, // IMPORTANT +}; + +module.exports = { + plugins: ['@typescript-eslint'], + extends: [ + 'airbnb-base', + 'prettier', + ], + env: { + node: true, + jest: true, + }, + rules: commonRules, + + overrides: [ + { + files: ['*.ts'], + extends: [ + 'airbnb-base', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + ], + rules: { + ...commonRules, + + '@typescript-eslint/camelcase': 0, + '@typescript-eslint/interface-name-prefix': 0, + + '@typescript-eslint/no-explicit-any': 0, // TRY: Remove this + '@typescript-eslint/ban-ts-ignore': 0, // TRY: Remove this + }, + + settings: { + 'import/extensions': ['.ts'], + 'import/parsers': { + '@typescript-eslint/parser': ['.ts'], + }, + 'import/resolver': { + node: { + extensions: ['.ts', '.d.ts', '.js'], + }, + }, + }, + }, + ], +}; diff --git a/.gitignore b/.gitignore index 2911b09f..d5d765b7 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ test.js cam_tests experiments docs +build diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..378eac25 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +build diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..172f059f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "singleQuote": true, + "semi": true, + "trailingComma": "all", + "arrowParens": "always", + "endOfLine": "lf", + "printWidth": 80 +} diff --git a/package-lock.json b/package-lock.json index 434a7486..3ab71809 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,17 +13,25 @@ "xml2js": "^0.4.23" }, "devDependencies": { - "coffeescript": "^1.9.3", + "@typescript-eslint/eslint-plugin": "^5.9.0", + "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", "dot": "^1.1.3", - "eslint": "^8.3.0", + "eslint": "^8.6.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.4", "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^4.0.0", "ip": "^1.1.5", "keypress": "^0.2.1", "mocha": "^9.1.3", "mocha-lcov-reporter": "^1.3.0", "nimble": "^0.0.2", - "nyc": "^15.1.0" + "nyc": "^15.1.0", + "prettier": "^2.5.1", + "typedoc": "^0.22.10", + "typescript": "^4.5.4" }, "engines": { "node": ">=6.0" @@ -448,14 +456,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -486,12 +494,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -600,6 +608,268 @@ "node": ">=8" } }, + "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/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", + "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.9.0", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/type-utils": "5.9.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "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/eslint-plugin/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/@typescript-eslint/experimental-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", + "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "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/experimental-utils/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/@typescript-eslint/experimental-utils/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/@typescript-eslint/parser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", + "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "debug": "^4.3.2" + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", + "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0" + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", + "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.9.0", + "debug": "^4.3.2", + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", + "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", + "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "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/visitor-keys": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", + "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.9.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -607,9 +877,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -729,6 +999,51 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -858,6 +1173,19 @@ "node": ">=8" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "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", @@ -964,19 +1292,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/coffeescript": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", - "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", - "dev": true, - "bin": { - "cake": "bin/cake", - "coffee": "bin/coffee" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1019,6 +1334,12 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -1132,6 +1453,18 @@ "node": ">=8" } }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1150,6 +1483,18 @@ "node": ">=0.3.1" } }, + "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", @@ -1208,6 +1553,57 @@ "node": ">=8.6" } }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "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", @@ -1236,13 +1632,13 @@ } }, "node_modules/eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", - "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", + "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -1253,7 +1649,7 @@ "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.1.0", - "espree": "^9.1.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1290,6 +1686,154 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/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/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", @@ -1333,6 +1877,60 @@ "node": ">=4" } }, + "node_modules/eslint-plugin-import": { + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", + "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.12.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "node_modules/eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", @@ -1395,6 +1993,27 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-scope": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", @@ -1463,12 +2082,12 @@ } }, "node_modules/espree": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", - "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "dependencies": { - "acorn": "^8.6.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^3.1.0" }, @@ -1552,6 +2171,40 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz", + "integrity": "sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ==", + "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", @@ -1564,6 +2217,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "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/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1755,6 +2417,20 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -1764,6 +2440,22 @@ "node": ">=8.0.0" } }, + "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/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -1820,6 +2512,35 @@ "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/globby/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/graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -1870,6 +2591,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "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", @@ -1879,6 +2609,33 @@ "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "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", @@ -1993,12 +2750,38 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "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/ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "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", @@ -2011,6 +2794,34 @@ "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-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -2023,6 +2834,21 @@ "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-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2053,6 +2879,18 @@ "node": ">=0.10.0" } }, + "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", @@ -2062,6 +2900,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -2071,6 +2924,31 @@ "node": ">=8" } }, + "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.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "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", @@ -2083,6 +2961,36 @@ "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", @@ -2101,6 +3009,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -2311,6 +3231,12 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, "node_modules/jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -2423,6 +3349,12 @@ "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/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2447,6 +3379,40 @@ "semver": "bin/semver.js" } }, + "node_modules/marked": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 12" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", @@ -2852,6 +3818,73 @@ "node": "*" } }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "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.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.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", @@ -2989,6 +4022,15 @@ "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/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -3086,6 +4128,30 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -3131,6 +4197,26 @@ "node": ">=0.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", @@ -3245,6 +4331,16 @@ "node": ">=4" } }, + "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", @@ -3260,6 +4356,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "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/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3342,12 +4461,46 @@ "node": ">=8" } }, + "node_modules/shiki": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", + "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-oniguruma": "^1.6.1", + "vscode-textmate": "5.2.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.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "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.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -3419,6 +4572,32 @@ "node": ">=8" } }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "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", @@ -3518,6 +4697,60 @@ "node": ">=0.8" } }, + "node_modules/tsconfig-paths": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/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/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3569,6 +4802,56 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typedoc": { + "version": "0.22.10", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.10.tgz", + "integrity": "sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==", + "dev": true, + "dependencies": { + "glob": "^7.2.0", + "lunr": "^2.3.9", + "marked": "^3.0.8", + "minimatch": "^3.0.4", + "shiki": "^0.9.12" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 12.10.0" + }, + "peerDependencies": { + "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x" + } + }, + "node_modules/typescript": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3608,6 +4891,18 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vscode-oniguruma": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", + "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3623,6 +4918,22 @@ "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", @@ -4094,14 +5405,14 @@ } }, "@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -4128,12 +5439,12 @@ } }, "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } @@ -4214,6 +5525,165 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@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" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", + "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/type-utils": "5.9.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", + "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/parser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", + "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", + "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", + "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", + "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", + "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", + "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "eslint-visitor-keys": "^3.0.0" + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -4221,9 +5691,9 @@ "dev": true }, "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, "acorn-jsx": { @@ -4310,6 +5780,36 @@ "sprintf-js": "~1.0.2" } }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "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 + }, + "array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -4414,6 +5914,16 @@ "write-file-atomic": "^3.0.0" } }, + "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", @@ -4492,12 +6002,6 @@ "wrap-ansi": "^7.0.0" } }, - "coffeescript": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", - "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", - "dev": true - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4534,6 +6038,12 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -4620,6 +6130,15 @@ "strip-bom": "^4.0.0" } }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4632,6 +6151,15 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "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", @@ -4678,6 +6206,45 @@ "ansi-colors": "^4.1.1" } }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "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", @@ -4697,13 +6264,13 @@ "dev": true }, "eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", - "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", + "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -4714,7 +6281,7 @@ "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.1.0", - "espree": "^9.1.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4754,8 +6321,126 @@ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^2.0.1" + "argparse": "^2.0.1" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "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 + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true } } }, @@ -4786,6 +6471,53 @@ } } }, + "eslint-plugin-import": { + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", + "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.12.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", @@ -4829,6 +6561,15 @@ } } }, + "eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, "eslint-scope": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", @@ -4863,12 +6604,12 @@ "dev": true }, "espree": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", - "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "requires": { - "acorn": "^8.6.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^3.1.0" } @@ -4927,6 +6668,36 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz", + "integrity": "sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ==", + "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", @@ -4939,6 +6710,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "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" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5070,12 +6850,33 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "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-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" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -5117,6 +6918,28 @@ "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" + }, + "dependencies": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + } + } + }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -5154,12 +6977,33 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "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-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "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", @@ -5245,12 +7089,32 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "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" + } + }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "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", @@ -5260,6 +7124,22 @@ "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-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, "is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -5269,6 +7149,15 @@ "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-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5290,24 +7179,73 @@ "is-extglob": "^2.1.1" } }, + "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.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, + "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.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "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", @@ -5320,6 +7258,15 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "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": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5489,6 +7436,12 @@ "minimist": "^1.2.5" } }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -5574,6 +7527,12 @@ "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 + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -5591,6 +7550,28 @@ } } }, + "marked": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", @@ -5905,6 +7886,52 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "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.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6006,6 +8033,12 @@ "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 + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -6078,6 +8111,21 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -6111,6 +8159,12 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "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", @@ -6200,6 +8254,12 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "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", @@ -6209,6 +8269,15 @@ "glob": "^7.1.3" } }, + "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" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -6265,12 +8334,40 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shiki": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", + "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", + "dev": true, + "requires": { + "jsonc-parser": "^3.0.0", + "vscode-oniguruma": "^1.6.1", + "vscode-textmate": "5.2.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.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "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.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -6325,6 +8422,26 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -6397,6 +8514,50 @@ "punycode": "^2.1.1" } }, + "tsconfig-paths": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "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" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -6436,6 +8597,37 @@ "is-typedarray": "^1.0.0" } }, + "typedoc": { + "version": "0.22.10", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.10.tgz", + "integrity": "sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==", + "dev": true, + "requires": { + "glob": "^7.2.0", + "lunr": "^2.3.9", + "marked": "^3.0.8", + "minimatch": "^3.0.4", + "shiki": "^0.9.12" + } + }, + "typescript": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6468,6 +8660,18 @@ "extsprintf": "^1.2.0" } }, + "vscode-oniguruma": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", + "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "dev": true + }, + "vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6477,6 +8681,19 @@ "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", diff --git a/package.json b/package.json index e4149e35..0be3a2b9 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "description": "Client to ONVIF NVT devices Profile S: cameras", "main": "lib/onvif.js", "scripts": { + "build": "tsc --build tsconfig.json", "jsdoc": "jsdoc ./lib/*.js --readme ./README.md --destination ./docs", "gh-pages": "jsdoc ./lib/*.js --readme ./README.md --destination ./", "lint": "eslint lib/*.js", @@ -55,15 +56,24 @@ "node": ">=6.0" }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.9.0", + "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", "dot": "^1.1.3", - "eslint": "^8.3.0", + "eslint": "^8.6.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.4", "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^4.0.0", + "ip": "^1.1.5", "keypress": "^0.2.1", "mocha": "^9.1.3", "mocha-lcov-reporter": "^1.3.0", "nimble": "^0.0.2", "nyc": "^15.1.0", - "ip": "^1.1.5" + "prettier": "^2.5.1", + "typedoc": "^0.22.10", + "typescript": "^4.5.4" } } diff --git a/src/cam.ts b/src/cam.ts new file mode 100644 index 00000000..b5c577fb --- /dev/null +++ b/src/cam.ts @@ -0,0 +1,11 @@ +export default class Cam { + private name: string; + + constructor() { + this.name = 'Cam'; + } + + getName() { + return this.name; + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..44ab1d54 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +import Cam from './cam'; + +export { Cam }; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..756d62e5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "module": "CommonJS", + "target": "ES2020", + "sourceMap": true, + "strict": true, + "outDir": "build", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": false, + "noUnusedParameters": true, + "skipLibCheck": true, + "watch": true, + "declaration": true + }, + "exclude": [ + "node_modules" + ], + "include": [ + "src/index.ts" + ] +} diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 00000000..d09a5343 --- /dev/null +++ b/typedoc.json @@ -0,0 +1,4 @@ +{ + "mode": "file", + "out": "docs" +} From ed651f2a079b95779755ee65e1fd4ddf20f83cb6 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 11 Jan 2022 18:22:39 +0300 Subject: [PATCH 002/112] Slice of work --- .eslintrc.js | 78 ++++++++++++++----------- .prettierrc | 2 +- package-lock.json | 13 +++++ package.json | 2 + src/cam.ts | 142 ++++++++++++++++++++++++++++++++++++++++++++-- src/index.ts | 4 +- typedoc.json | 1 - 7 files changed, 198 insertions(+), 44 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index e44ed2a6..6cdc5eee 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,56 +1,68 @@ const commonRules = { - 'no-console': 1, - 'import/extensions': 0, - 'quote-props': 0, - 'import/prefer-default-export': 0, - 'no-await-in-loop': 0, - 'no-restricted-syntax': 0, - 'max-classes-per-file': 0, - 'no-underscore-dangle': 0, - 'no-unused-expressions': 0, - 'no-case-declarations': 0, - 'no-shadow': 0, - 'import/no-cycle': 0, // IMPORTANT + 'no-console' : 1, + 'import/extensions' : 0, + 'quote-props' : 0, + 'import/prefer-default-export' : 0, + 'no-await-in-loop' : 0, + 'no-restricted-syntax' : 0, + 'max-classes-per-file' : 0, + 'no-underscore-dangle' : 0, + 'no-unused-expressions' : 0, + 'no-case-declarations' : 0, + 'no-shadow' : 0, + 'brace-style' : ['error', 'stroustrup'], + 'lines-between-class-members' : 0, + 'max-len' : ['warn', 120], + 'no-nested-ternary' : 0, + 'key-spacing' : ['error', { + afterColon : true, + beforeColon : true, + align : { + beforeColon : true, + afterColon : true, + on : 'colon', + }, + }], + 'import/no-cycle' : 0, // IMPORTANT }; module.exports = { - plugins: ['@typescript-eslint'], - extends: [ + plugins : ['@typescript-eslint'], + extends : [ 'airbnb-base', 'prettier', ], - env: { - node: true, - jest: true, + env : { + node : true, + jest : true, }, - rules: commonRules, + rules : commonRules, - overrides: [ + overrides : [ { - files: ['*.ts'], - extends: [ + files : ['*.ts'], + extends : [ 'airbnb-base', 'plugin:@typescript-eslint/eslint-recommended', 'plugin:@typescript-eslint/recommended', ], - rules: { + rules : { ...commonRules, - '@typescript-eslint/camelcase': 0, - '@typescript-eslint/interface-name-prefix': 0, + '@typescript-eslint/interface-name-prefix' : 0, - '@typescript-eslint/no-explicit-any': 0, // TRY: Remove this - '@typescript-eslint/ban-ts-ignore': 0, // TRY: Remove this + '@typescript-eslint/no-explicit-any' : 0, // TRY: Remove this + '@typescript-eslint/ban-ts-ignore' : 0, // TRY: Remove this }, - settings: { - 'import/extensions': ['.ts'], - 'import/parsers': { - '@typescript-eslint/parser': ['.ts'], + settings : { + 'import/extensions' : ['.ts'], + 'import/parsers' : { + '@typescript-eslint/parser' : ['.ts'], }, - 'import/resolver': { - node: { - extensions: ['.ts', '.d.ts', '.js'], + 'import/resolver' : { + node : { + extensions : ['.ts', '.d.ts', '.js'], }, }, }, diff --git a/.prettierrc b/.prettierrc index 172f059f..f8e1636f 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,5 +4,5 @@ "trailingComma": "all", "arrowParens": "always", "endOfLine": "lf", - "printWidth": 80 + "printWidth": 120 } diff --git a/package-lock.json b/package-lock.json index 3ab71809..3bbb35f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "xml2js": "^0.4.23" }, "devDependencies": { + "@types/node": "^17.0.8", "@typescript-eslint/eslint-plugin": "^5.9.0", "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", @@ -655,6 +656,12 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "node_modules/@types/node": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==", + "dev": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", @@ -5563,6 +5570,12 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/node": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", diff --git a/package.json b/package.json index 0be3a2b9..922acff4 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "main": "lib/onvif.js", "scripts": { "build": "tsc --build tsconfig.json", + "typedoc": "typedoc src", "jsdoc": "jsdoc ./lib/*.js --readme ./README.md --destination ./docs", "gh-pages": "jsdoc ./lib/*.js --readme ./README.md --destination ./", "lint": "eslint lib/*.js", @@ -56,6 +57,7 @@ "node": ">=6.0" }, "devDependencies": { + "@types/node": "^17.0.8", "@typescript-eslint/eslint-plugin": "^5.9.0", "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", diff --git a/src/cam.ts b/src/cam.ts index b5c577fb..d40028cf 100644 --- a/src/cam.ts +++ b/src/cam.ts @@ -1,11 +1,141 @@ -export default class Cam { - private name: string; +import { EventEmitter } from 'events'; +import { SecureContextOptions } from 'tls'; +import https, { Agent, RequestOptions } from 'https'; +import http from 'http'; +import { Buffer } from 'buffer'; - constructor() { - this.name = 'Cam'; +/** + * Cam constructor options + */ +export interface CamOptions { + /** Set true if using `https` protocol, defaults to false. */ + useSecure?: boolean; + /** Set options for https like ca, cert, ciphers, rejectUnauthorized, secureOptions, secureProtocol, etc. */ + secureOptions?: SecureContextOptions; + hostname: string; + username?: string; + password?: string; + port?: number; + path?: string; + timeout?: number; + /** Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections. */ + agent?: Agent | boolean; + /** Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false. */ + preserveAddress: boolean; + /** Set false if the camera should not connect automatically. */ + autoConnect?: boolean; +} + +type CamServices = { + PTZ?: URL, + media?: URL, + imaging?: URL, + events?: URL, + device?: URL, +} + +interface CamRequestOptions extends RequestOptions{ + /** Name of service (ptz, media, etc) */ + service?: keyof CamServices; + /** SOAP body */ + body: string; + /** Defines another url to request */ + url?: string; + /** Make request to PTZ uri or not */ + ptz?: boolean; +} + +export class Cam extends EventEmitter { + public useSecure: boolean; + public secureOptions: SecureContextOptions; + public hostname: string; + public username?: string; + public password?: string; + public port: number; + public path: string; + public timeout: number; + public agent: Agent | boolean; + public preserveAddress: boolean; + private events: Record; + private uri: CamServices; + + constructor(options: CamOptions) { + super(); + this.useSecure = options.useSecure ?? false; + this.secureOptions = options.secureOptions ?? {}; + this.hostname = options.hostname; + this.username = options.username; + this.password = options.password; + this.port = options.port ?? (options.useSecure ? 443 : 80); + this.path = options.path ?? '/onvif/device_service'; + this.timeout = options.timeout || 120000; + this.agent = options.agent || false; + this.preserveAddress = options.preserveAddress || false; + this.events = {}; + this.uri = {}; + /** Bind event handling to the `event` event */ + this.on('newListener', (name) => { + // if this is the first listener, start pulling subscription + if (name === 'event' && this.listeners(name).length === 0) { + setImmediate(() => { + // this._eventRequest(); TODO bring back + }); + } + }); + if (options.autoConnect !== false) { + setImmediate(() => { + this.connect(); + }); + } + } + + private async request(options: CamRequestOptions) { + return new Promise((resolve, reject) => { + let callbackExecuted = false; + let requestOptions = { + ...options, + path : options.service + ? (this.uri[options.service] ? this.uri[options.service]?.pathname : options.service) + : this.path, + }; + requestOptions.headers = { + 'Content-Type' : 'application/soap+xml', + 'Content-Length' : Buffer.byteLength(options.body, 'utf8'), // options.body.length chinese will be wrong here + charset : 'utf-8', + }; + requestOptions.method = 'POST'; + const httpLibrary = this.useSecure ? https : http; + requestOptions = this.useSecure ? { ...requestOptions, ...this.secureOptions } : requestOptions; + const request = httpLibrary.request(requestOptions, (response) => { + const bufs: Buffer[] = []; + let length = 0; + response.on('data', (chunk) => { + bufs.push(chunk); + length += chunk.length; + }); + response.on('end', () => { + if (callbackExecuted) { + return; + } + callbackExecuted = true; + const xml = Buffer.concat(bufs, length).toString('utf8'); + /** + * Indicates raw xml response from device. + * @event Cam#rawResponse + * @type {string} + */ + this.emit('rawResponse', xml); + parseSOAPString(xml, callback); + }); + }); + }); } - getName() { - return this.name; + /** + * Connect to the camera and fill device information properties + */ + async connect() { + // await this.getSystemDateAndTime(); + // await this.getServices(); } } diff --git a/src/index.ts b/src/index.ts index 44ab1d54..5db41e67 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1 @@ -import Cam from './cam'; - -export { Cam }; +export * from './cam'; diff --git a/typedoc.json b/typedoc.json index d09a5343..612df6fb 100644 --- a/typedoc.json +++ b/typedoc.json @@ -1,4 +1,3 @@ { - "mode": "file", "out": "docs" } From 494bdfeb37bb14cd81572f43957b6e1a838bf596 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 11 Jan 2022 19:31:47 +0300 Subject: [PATCH 003/112] utils.ts --- .eslintrc.js | 2 +- package-lock.json | 19 +++++++++ package.json | 1 + src/utils.ts | 101 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 src/utils.ts diff --git a/.eslintrc.js b/.eslintrc.js index 6cdc5eee..98b29831 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -10,7 +10,7 @@ const commonRules = { 'no-unused-expressions' : 0, 'no-case-declarations' : 0, 'no-shadow' : 0, - 'brace-style' : ['error', 'stroustrup'], + 'brace-style' : ["error", "1tbs", { "allowSingleLine" : true }], 'lines-between-class-members' : 0, 'max-len' : ['warn', 120], 'no-nested-ternary' : 0, diff --git a/package-lock.json b/package-lock.json index 3bbb35f7..9fba4842 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ }, "devDependencies": { "@types/node": "^17.0.8", + "@types/xml2js": "^0.4.9", "@typescript-eslint/eslint-plugin": "^5.9.0", "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", @@ -662,6 +663,15 @@ "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==", "dev": true }, + "node_modules/@types/xml2js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", + "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", @@ -5576,6 +5586,15 @@ "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==", "dev": true }, + "@types/xml2js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", + "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", diff --git a/package.json b/package.json index 922acff4..129750a7 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ }, "devDependencies": { "@types/node": "^17.0.8", + "@types/xml2js": "^0.4.9", "@typescript-eslint/eslint-plugin": "^5.9.0", "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 00000000..3cbeef64 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,101 @@ +import xml2js from 'xml2js'; + +const numberRE = /^-?([1-9]\d*|0)(\.\d*)?$/; +const dateRE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(.\d+)?Z$/; +const prefixMatch = /(?!xmlns)^.*:/; + +/** + * Parse SOAP object to pretty JS-object + */ +export function linerase(xml: any): any { + if (Array.isArray(xml)) { + if (xml.length > 1) { + return xml.map(linerase); + } + // eslint-disable-next-line no-param-reassign + [xml] = xml; + } + if (typeof xml === 'object') { + const obj: any = {}; + Object.keys(xml).forEach((key) => { + obj[key] = linerase(xml[key]); + }); + return obj; + } + if (xml === 'true') { + return true; + } + if (xml === 'false') { + return false; + } + if (numberRE.test(xml)) { + return parseFloat(xml); + } + if (dateRE.test(xml)) { + return new Date(xml); + } + return xml; +} + +function s4() { + // eslint-disable-next-line no-bitwise + return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); +} + +/** + * Generate GUID + * @returns {string} + */ +export function guid() { + return (`${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`); +} + +/** + * Parse SOAP response + */ +export async function parseSOAPString(rawXml: string) { + /* Filter out xml name spaces */ + const xml = rawXml.replace(/xmlns([^=]*?)=(".*?")/g, ''); + + const result = await xml2js.parseStringPromise(xml, { + tagNameProcessors : [(tag) => { + const str = tag.replace(prefixMatch, ''); + const secondLetter = str.charAt(1); + if (secondLetter && secondLetter.toUpperCase() !== secondLetter) { + return str.charAt(0).toLowerCase() + str.slice(1); + } + return str; + }], + }); + if (!result || !result.envelope || !result.envelope.body) { + throw new Error('Wrong ONVIF SOAP response'); + } + if (result.envelope.body[0].fault) { + const fault = result.envelope.body[0].fault[0]; + let reason; + try { + if (fault.reason[0].text[0]._) { + reason = fault.reason[0].text[0]._; + } + } catch (e) { + reason = ''; + } + if (!reason) { + try { + reason = JSON.stringify(linerase(fault.code[0])); + } catch (e) { + reason = ''; + } + } + let detail = ''; + try { + [detail] = fault.detail[0].text; + } catch (e) { + detail = ''; + } + + // console.error('Fault:', reason, detail); + throw new Error(`ONVIF SOAP Fault: ${reason}${detail}`); + } + return result.envelope.body; +} From 5ac71dca86c121876c1677a49a9df5626913f9de Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 11 Jan 2022 23:30:13 +0300 Subject: [PATCH 004/112] Slice of work --- .eslintrc.js | 9 +-- src/cam.ts | 160 +++++++++++++++++++++++++++++++++++++++++++++++++-- src/utils.ts | 6 +- 3 files changed, 163 insertions(+), 12 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 98b29831..95c1e625 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -12,7 +12,8 @@ const commonRules = { 'no-shadow' : 0, 'brace-style' : ["error", "1tbs", { "allowSingleLine" : true }], 'lines-between-class-members' : 0, - 'max-len' : ['warn', 120], + 'max-len' : ['warn', 200], + 'class-methods-use-this' : 0, 'no-nested-ternary' : 0, 'key-spacing' : ['error', { afterColon : true, @@ -50,9 +51,9 @@ module.exports = { ...commonRules, '@typescript-eslint/interface-name-prefix' : 0, - - '@typescript-eslint/no-explicit-any' : 0, // TRY: Remove this - '@typescript-eslint/ban-ts-ignore' : 0, // TRY: Remove this + '@typescript-eslint/no-non-null-assertion' : 0, + '@typescript-eslint/no-explicit-any' : 0, // TRY: Remove this + '@typescript-eslint/ban-ts-ignore' : 0, // TRY: Remove this }, settings : { diff --git a/src/cam.ts b/src/cam.ts index d40028cf..971d70a6 100644 --- a/src/cam.ts +++ b/src/cam.ts @@ -3,6 +3,8 @@ import { SecureContextOptions } from 'tls'; import https, { Agent, RequestOptions } from 'https'; import http from 'http'; import { Buffer } from 'buffer'; +import crypto from 'crypto'; +import { linerase, parseSOAPString } from './utils'; /** * Cam constructor options @@ -26,7 +28,7 @@ export interface CamOptions { autoConnect?: boolean; } -type CamServices = { +export type CamServices = { PTZ?: URL, media?: URL, imaging?: URL, @@ -34,7 +36,7 @@ type CamServices = { device?: URL, } -interface CamRequestOptions extends RequestOptions{ +export interface CamRequestOptions extends RequestOptions{ /** Name of service (ptz, media, etc) */ service?: keyof CamServices; /** SOAP body */ @@ -45,6 +47,12 @@ interface CamRequestOptions extends RequestOptions{ ptz?: boolean; } +interface RequestError extends Error { + code: string; + errno: string; + syscall: string; +} + export class Cam extends EventEmitter { public useSecure: boolean; public secureOptions: SecureContextOptions; @@ -58,6 +66,13 @@ export class Cam extends EventEmitter { public preserveAddress: boolean; private events: Record; private uri: CamServices; + private timeShift: number | undefined; + + /** + * Indicates raw xml request to device. + * @event rawData + */ + static rawRequest: 'rawRequest' = 'rawRequest'; constructor(options: CamOptions) { super(); @@ -89,7 +104,60 @@ export class Cam extends EventEmitter { } } - private async request(options: CamRequestOptions) { + /** + * Envelope header for all SOAP messages + * @param openHeader + * @private + */ + private envelopeHeader(openHeader = false) { + let header = '' + + ''; + // Only insert Security if there is a username and password + if (this.username && this.password) { + const req = this.passwordDigest(); + header += '' + + '' + + `${this.username}` + + `${req.passdigest}` + + `${req.nonce}` + + `${req.timestamp}` + + '' + + ''; + } + if (!(openHeader !== undefined && openHeader)) { + header += '' + + ''; + } + return header; + } + + /** + * Envelope footer for all SOAP messages + * @private + */ + private envelopeFooter() { + return '' + + ''; + } + + private passwordDigest() { + const timestamp = (new Date((process.uptime() * 1000) + (this.timeShift || 0))).toISOString(); + const nonce = Buffer.allocUnsafe(16); + nonce.writeUIntLE(Math.ceil(Math.random() * 0x100000000), 0, 4); + nonce.writeUIntLE(Math.ceil(Math.random() * 0x100000000), 4, 4); + nonce.writeUIntLE(Math.ceil(Math.random() * 0x100000000), 8, 4); + nonce.writeUIntLE(Math.ceil(Math.random() * 0x100000000), 12, 4); + const cryptoDigest = crypto.createHash('sha1'); + cryptoDigest.update(Buffer.concat([nonce, Buffer.from(timestamp, 'ascii'), Buffer.from(this.password!, 'ascii')])); + const passdigest = cryptoDigest.digest('base64'); + return { + passdigest, + nonce : nonce.toString('base64'), + timestamp, + }; + } + + private async request(options: CamRequestOptions): Promise<[Record, string]> { return new Promise((resolve, reject) => { let callbackExecuted = false; let requestOptions = { @@ -109,10 +177,12 @@ export class Cam extends EventEmitter { const request = httpLibrary.request(requestOptions, (response) => { const bufs: Buffer[] = []; let length = 0; + response.on('data', (chunk) => { bufs.push(chunk); length += chunk.length; }); + response.on('end', () => { if (callbackExecuted) { return; @@ -125,9 +195,38 @@ export class Cam extends EventEmitter { * @type {string} */ this.emit('rawResponse', xml); - parseSOAPString(xml, callback); + resolve(parseSOAPString(xml)); }); }); + + request.setTimeout(this.timeout, () => { + if (callbackExecuted) { + return; + } + callbackExecuted = true; + request.destroy(); + reject(new Error('Network timeout')); + }); + + request.on('error', (error: RequestError) => { + if (callbackExecuted) { + return; + } + callbackExecuted = true; + /* address, port number or IPCam error */ + if (error.code === 'ECONNREFUSED' && error.errno === 'ECONNREFUSED' && error.syscall === 'connect') { + reject(error); + /* network error */ + } else if (error.code === 'ECONNRESET' && error.errno === 'ECONNRESET' && error.syscall === 'read') { + reject(error); + } else { + reject(error); + } + }); + + this.emit('rawRequest', options.body); + request.write(options.body); + request.end(); }); } @@ -135,7 +234,58 @@ export class Cam extends EventEmitter { * Connect to the camera and fill device information properties */ async connect() { - // await this.getSystemDateAndTime(); + await this.getSystemDateAndTime(); // await this.getServices(); } + + private setupSystemDateAndTime(data: any) { + const systemDateAndTime = data[0].getSystemDateAndTimeResponse[0].systemDateAndTime[0]; + const dateTime = systemDateAndTime.UTCDateTime || systemDateAndTime.localDateTime; + let time; + if (dateTime === undefined) { + // Seen on a cheap Chinese camera from GWellTimes-IPC. Use the current time. + time = new Date(); + } else { + const dt = linerase(dateTime[0]); + time = new Date(Date.UTC(dt.date.year, dt.date.month - 1, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second)); + } + if (!this.timeShift) { + this.timeShift = time.getTime() - (process.uptime() * 1000); + } + return time; + } + + /** + * Receive date and time from cam + */ + async getSystemDateAndTime() { + // The ONVIF spec says this should work without a Password as we need to know any difference in the + // remote NVT's time relative to our own time clock (called the timeShift) before we can calculate the + // correct timestamp in nonce SOAP Authentication header. + // But.. Panasonic and Digital Barriers both have devices that implement ONVIF that only work with + // authenticated getSystemDateAndTime. So for these devices we need to do an authenticated getSystemDateAndTime. + // As 'timeShift' is not set, the local clock MUST be set to the correct time AND the NVT/Camera MUST be set + // to the correct time if the camera implements Replay Attack Protection (eg Axis) + const [data, xml] = await this.request({ + // Try the Unauthenticated Request first. Do not use this._envelopeHeader() as we don't have timeShift yet. + body : + '' + + '' + + '' + + '' + + '', + }); + try { + return this.setupSystemDateAndTime(data); + } catch (error) { + if (xml && xml.toLowerCase().includes('sender not authorized')) { + // Try again with a Username and Password + const [data] = await this.request({ + body : `${this.envelopeHeader()}${this.envelopeFooter()}`, + }); + return this.setupSystemDateAndTime(data); + } + throw error; + } + } } diff --git a/src/utils.ts b/src/utils.ts index 3cbeef64..09f09c8c 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -53,7 +53,7 @@ export function guid() { /** * Parse SOAP response */ -export async function parseSOAPString(rawXml: string) { +export async function parseSOAPString(rawXml: string): Promise<[Record, string]> { /* Filter out xml name spaces */ const xml = rawXml.replace(/xmlns([^=]*?)=(".*?")/g, ''); @@ -87,7 +87,7 @@ export async function parseSOAPString(rawXml: string) { reason = ''; } } - let detail = ''; + let detail; try { [detail] = fault.detail[0].text; } catch (e) { @@ -97,5 +97,5 @@ export async function parseSOAPString(rawXml: string) { // console.error('Fault:', reason, detail); throw new Error(`ONVIF SOAP Fault: ${reason}${detail}`); } - return result.envelope.body; + return [result.envelope.body, xml]; } From 8f4559323d760067368dd9a215ceaf2fa29be9d0 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Wed, 12 Jan 2022 14:14:12 +0300 Subject: [PATCH 005/112] Slice of work --- src/cam.ts | 102 +++++++++++++++++++++++++++++++++++++++++++++------ src/utils.ts | 4 +- 2 files changed, 94 insertions(+), 12 deletions(-) diff --git a/src/cam.ts b/src/cam.ts index 971d70a6..ece9b170 100644 --- a/src/cam.ts +++ b/src/cam.ts @@ -4,6 +4,7 @@ import https, { Agent, RequestOptions } from 'https'; import http from 'http'; import { Buffer } from 'buffer'; import crypto from 'crypto'; +import url from 'url'; import { linerase, parseSOAPString } from './utils'; /** @@ -31,6 +32,7 @@ export interface CamOptions { export type CamServices = { PTZ?: URL, media?: URL, + media2?: URL, imaging?: URL, events?: URL, device?: URL, @@ -53,7 +55,24 @@ interface RequestError extends Error { syscall: string; } +export interface CamService { + /** Namespace uri */ + namespace: string; + /** Uri for requests */ + XAddr: string; + /** Minor version */ + minor: number; + /** Major version */ + major: number; +} + export class Cam extends EventEmitter { + /** + * Indicates raw xml request to device. + * @event rawData + */ + static rawRequest: 'rawRequest' = 'rawRequest'; + public useSecure: boolean; public secureOptions: SecureContextOptions; public hostname: string; @@ -67,12 +86,8 @@ export class Cam extends EventEmitter { private events: Record; private uri: CamServices; private timeShift: number | undefined; - - /** - * Indicates raw xml request to device. - * @event rawData - */ - static rawRequest: 'rawRequest' = 'rawRequest'; + private services: CamService[] | undefined; + private media2Support = false; constructor(options: CamOptions) { super(); @@ -149,10 +164,10 @@ export class Cam extends EventEmitter { nonce.writeUIntLE(Math.ceil(Math.random() * 0x100000000), 12, 4); const cryptoDigest = crypto.createHash('sha1'); cryptoDigest.update(Buffer.concat([nonce, Buffer.from(timestamp, 'ascii'), Buffer.from(this.password!, 'ascii')])); - const passdigest = cryptoDigest.digest('base64'); + const passDigest = cryptoDigest.digest('base64'); return { - passdigest, - nonce : nonce.toString('base64'), + passdigest : passDigest, + nonce : nonce.toString('base64'), timestamp, }; } @@ -168,7 +183,7 @@ export class Cam extends EventEmitter { }; requestOptions.headers = { 'Content-Type' : 'application/soap+xml', - 'Content-Length' : Buffer.byteLength(options.body, 'utf8'), // options.body.length chinese will be wrong here + 'Content-Length' : Buffer.byteLength(options.body, 'utf8'), charset : 'utf-8', }; requestOptions.method = 'POST'; @@ -230,12 +245,30 @@ export class Cam extends EventEmitter { }); } + /** + * Parse url with an eye on `preserveAddress` property + * @param address + * @private + */ + private parseUrl(address: string) { + const parsedAddress = new URL(address); + // If host for service and default host differs, also if preserve address property set + // we substitute host, hostname and port from settings then rebuild the href using .format + if (this.preserveAddress && (this.hostname !== parsedAddress.hostname || this.port.toString() !== parsedAddress.port)) { + parsedAddress.hostname = this.hostname; + parsedAddress.host = `${this.hostname}:${this.port}`; + parsedAddress.port = this.port.toString(); + parsedAddress.href = url.format(parsedAddress); + } + return parsedAddress; + } + /** * Connect to the camera and fill device information properties */ async connect() { await this.getSystemDateAndTime(); - // await this.getServices(); + await this.getServices(); } private setupSystemDateAndTime(data: any) { @@ -288,4 +321,51 @@ export class Cam extends EventEmitter { throw error; } } + + /** + * Returns information about services of the device. + * @param includeCapability + */ + async getServices(includeCapability = true) { + const [data] = await this.request({ + body : `${this.envelopeHeader()}` + + `${includeCapability}` + + `${ + this.envelopeFooter()}`, + }); + this.services = linerase(data).getServicesResponse.service; + // ONVIF Profile T introduced Media2 (ver20) so cameras from around 2020/2021 will have + // two media entries in the ServicesResponse, one for Media (ver10/media) and one for Media2 (ver20/media) + // This is so that existing VMS software can still access the video via the orignal ONVIF Media API + // fill Cam#uri property + if (!this.uri) { + /** + * Device service URIs + * @name Cam#uri + * @property {url} [PTZ] + * @property {url} [media] + * @property {url} [media2] + * @property {url} [imaging] + * @property {url} [events] + * @property {url} [device] + */ + this.uri = {}; + } + this.services!.forEach((service) => { + // Look for services with namespaces and XAddr values + if (Object.prototype.hasOwnProperty.call(service, 'namespace') && Object.prototype.hasOwnProperty.call(service, 'XAddr')) { + // Only parse ONVIF namespaces. Axis cameras return Axis namespaces in GetServices + const parsedNamespace = url.parse(service.namespace); + if (parsedNamespace.hostname === 'www.onvif.org' && parsedNamespace.path) { + const namespaceSplitted = parsedNamespace.path.substring(1).split('/'); // remove leading Slash, then split + // special case for Media and Media2 where cameras supporting Profile S and Profile T (2020/2021 models) have two media services + if (namespaceSplitted[1] === 'media' && namespaceSplitted[0] === 'ver20') { + this.media2Support = true; + namespaceSplitted[1] = 'media2'; + } + this.uri[namespaceSplitted[1] as keyof CamServices] = this.parseUrl(service.XAddr); + } + } + }); + } } diff --git a/src/utils.ts b/src/utils.ts index 09f09c8c..4354db75 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -50,10 +50,12 @@ export function guid() { return (`${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`); } +export type CamResponse = Promise<[Record, string]>; + /** * Parse SOAP response */ -export async function parseSOAPString(rawXml: string): Promise<[Record, string]> { +export async function parseSOAPString(rawXml: string): CamResponse { /* Filter out xml name spaces */ const xml = rawXml.replace(/xmlns([^=]*?)=(".*?")/g, ''); From 11335ab5912db8b299be2b5ea0e07964f2e988f4 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Thu, 13 Jan 2022 18:30:52 +0300 Subject: [PATCH 006/112] Split the class into modules --- README.md | 1 + src/device.ts | 176 +++++++++++++++++++++++++++++++++++++++ src/index.ts | 2 +- src/{cam.ts => onvif.ts} | 128 +++++++++++----------------- 4 files changed, 226 insertions(+), 81 deletions(-) create mode 100644 src/device.ts rename src/{cam.ts => onvif.ts} (79%) diff --git a/README.md b/README.md index 9e4720f1..96af60a2 100644 --- a/README.md +++ b/README.md @@ -413,6 +413,7 @@ configuration object ## Links WSDL schemes and docs: +- https://www.onvif.org/profiles/specifications/ - [Operations index](http://www.onvif.org/onvif/ver20/util/operationIndex.html) - http://www.onvif.org/onvif/ver10/tc/onvif_core_ver10.pdf - http://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl diff --git a/src/device.ts b/src/device.ts new file mode 100644 index 00000000..7e4b262b --- /dev/null +++ b/src/device.ts @@ -0,0 +1,176 @@ +import url from 'url'; +import { CamService, CamServices, Onvif } from './onvif'; +import { linerase } from './utils'; + +export class Device { + private readonly onvif: Onvif; + private services: CamService[] = []; + private media2Support = false; + + constructor(onvif: Onvif) { + this.onvif = onvif; + } + + /** + * Returns information about services of the device. + * @param includeCapability + */ + async getServices(includeCapability = true): Promise { + const [data] = await this.onvif.request({ + body : '' + + `${includeCapability}` + + '', + }); + this.services = linerase(data).getServicesResponse.service; + // ONVIF Profile T introduced Media2 (ver20) so cameras from around 2020/2021 will have + // two media entries in the ServicesResponse, one for Media (ver10/media) and one for Media2 (ver20/media) + // This is so that existing VMS software can still access the video via the orignal ONVIF Media API + // fill Cam#uri property + if (!this.onvif.uri) { + /** + * Device service URIs + * @name Onvif#uri + * @property {url} [PTZ] + * @property {url} [media] + * @property {url} [media2] + * @property {url} [imaging] + * @property {url} [events] + * @property {url} [device] + */ + this.onvif.uri = {}; + } + this.services.forEach((service) => { + // Look for services with namespaces and XAddr values + if (Object.prototype.hasOwnProperty.call(service, 'namespace') && Object.prototype.hasOwnProperty.call(service, 'XAddr')) { + // Only parse ONVIF namespaces. Axis cameras return Axis namespaces in GetServices + const parsedNamespace = url.parse(service.namespace); + if (parsedNamespace.hostname === 'www.onvif.org' && parsedNamespace.path) { + const namespaceSplitted = parsedNamespace.path.substring(1).split('/'); // remove leading Slash, then split + // special case for Media and Media2 where cameras supporting Profile S and Profile T (2020/2021 models) have two media services + if (namespaceSplitted[1] === 'media' && namespaceSplitted[0] === 'ver20') { + this.media2Support = true; + namespaceSplitted[1] = 'media2'; + } + this.onvif.uri[namespaceSplitted[1] as keyof CamServices] = this.onvif.parseUrl(service.XAddr); + } + } + }); + return this.services; + } + + /** + * This method has been replaced by the more generic GetServices method. For capabilities of individual services refer to the GetServiceCapabilities methods. + */ + // eslint-disable-next-line no-use-before-define + async getCapabilities(): Promise { + return { + device : { + XAddr : 'kjh', + }, + }; + } +} + +/** Network capabilities */ +export interface iNetwork { + /** Indicates support for IP filtering */ + IPFilter: boolean; + /** Indicates support for zeroconf */ + zeroConfiguration: boolean; + /** Indicates support for IPv6 */ + IPVersion6: boolean; + /** Indicates support for dynamic DNS configuration */ + dynDNS: boolean; +} + +/** System capabilities */ +export interface iSystem { + /** Indicates support for WS Discovery resolve requests */ + discoveryBye: boolean; + /** Indicates support for remote discovery */ + remoteDiscovery: boolean; + /** Indicates support for system backup through MTOM */ + systemBackup: boolean; + /** Indicates support for retrieval of system logging through MTOM */ + systemLogging: boolean; + /** Indicates support for firmware upgrade through MTOM */ + firmwareUpgrade: boolean; + /** Indicates support for firmware upgrade through HTTP */ + httpFirmwareUpgrade: boolean; + /** Indicates support for system backup through HTTP */ + httpSystemBackup: boolean; + /** Indicates support for retrieval of system logging through HTTP */ + httpSystemLogging: boolean; +} + +export interface iIO { + /** Number of input connectors */ + inputConnectors: number; + /** Number of relay outputs */ + relayOutputs: number; + extension: { + auxiliary: boolean; + auxiliaryCommands: Record; + } +} + +/** Security capabilities */ +export interface iSecurity { + /** Indicates support for TLS 1.1 */ + 'TLS1.1': boolean; + /** Indicates support for TLS 1.2 */ +} +// * @property {object} [device.security] +// * @property {boolean} device.security.'TLS1.1' Indicates support for TLS 1.1 +// * @property {boolean} device.security.'TLS1.2' Indicates support for TLS 1.2 +// * @property {boolean} device.security.onboardKeyGeneration Indicates support for onboard key generation +// * @property {boolean} device.security.accessPolicyConfig Indicates support for access policy configuration +// * @property {boolean} device.security.'X.509Token' Indicates support for WS-Security X.509 token +// * @property {boolean} device.security.SAMLToken Indicates support for WS-Security SAML token +// * @property {boolean} device.security.kerberosToken Indicates support for WS-Security Kerberos token +// * @property {boolean} device.security.RELToken Indicates support for WS-Security REL token +// * @property {object} events Event capabilities +// * @property {string} events.XAddr Event service URI +// * @property {boolean} events.WSSubscriptionPolicySupport Indicates whether or not WS Subscription policy is supported +// * @property {boolean} events.WSPullPointSupport Indicates whether or not WS Pull Point is supported +// * @property {boolean} events.WSPausableSubscriptionManagerInterfaceSupport Indicates whether or not WS Pausable Subscription Manager Interface is supported +// * @property {object} imaging Imaging capabilities +// * @property {string} imaging.XAddr Imaging service URI +// * @property {object} media Media capabilities +// * @property {string} media.XAddr Media service URI +// * @property {object} media.streamingCapabilities Streaming capabilities +// * @property {boolean} media.streamingCapabilities.RTPMulticast Indicates whether or not RTP multicast is supported +// * @property {boolean} media.streamingCapabilities.RTP_TCP Indicates whether or not RTP over TCP is supported +// * @property {boolean} media.streamingCapabilities.RTP_RTSP_TCP Indicates whether or not RTP/RTSP/TCP is supported +// * @property {object} media.streamingCapabilities.extension +// * @property {object} PTZ PTZ capabilities +// * @property {string} PTZ.XAddr PTZ service URI +// * @property {object} [extension] +// * @property {object} extension.deviceIO DeviceIO capabilities +// * @property {string} extension.deviceIO.XAddr DeviceIO service URI +// * @property {number} extension.deviceIO.videoSources +// * @property {number} extension.deviceIO.videoOutputs +// * @property {number} extension.deviceIO.audioSources +// * @property {number} extension.deviceIO.audioOutputs +// * @property {number} extension.deviceIO.relayOutputs +// * @property {object} [extension.extensions] +// * @property {object} [extension.extensions.telexCapabilities] +// * @property {object} [extension.extensions.scdlCapabilities] +// */ + +/** Device capabilities */ +export interface iDevice { + /** Device service URI */ + XAddr: string; + network?: iNetwork; + system?: iSystem; + IO?: iIO; + security?: iSecurity; +} + +/** + * Capability list + */ +export interface iCapabilities { + device: iDevice; +} diff --git a/src/index.ts b/src/index.ts index 5db41e67..e019d32a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1 @@ -export * from './cam'; +export * from './onvif'; diff --git a/src/cam.ts b/src/onvif.ts similarity index 79% rename from src/cam.ts rename to src/onvif.ts index ece9b170..2de5f1ec 100644 --- a/src/cam.ts +++ b/src/onvif.ts @@ -4,8 +4,8 @@ import https, { Agent, RequestOptions } from 'https'; import http from 'http'; import { Buffer } from 'buffer'; import crypto from 'crypto'; -import url from 'url'; import { linerase, parseSOAPString } from './utils'; +import { Device } from './device'; /** * Cam constructor options @@ -25,7 +25,7 @@ export interface CamOptions { agent?: Agent | boolean; /** Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false. */ preserveAddress: boolean; - /** Set false if the camera should not connect automatically. */ + /** Set false if the camera should not connect automatically, defaults false. */ autoConnect?: boolean; } @@ -66,13 +66,14 @@ export interface CamService { major: number; } -export class Cam extends EventEmitter { +export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. * @event rawData */ static rawRequest: 'rawRequest' = 'rawRequest'; + private device: Device; public useSecure: boolean; public secureOptions: SecureContextOptions; public hostname: string; @@ -84,10 +85,8 @@ export class Cam extends EventEmitter { public agent: Agent | boolean; public preserveAddress: boolean; private events: Record; - private uri: CamServices; + public uri: CamServices; private timeShift: number | undefined; - private services: CamService[] | undefined; - private media2Support = false; constructor(options: CamOptions) { super(); @@ -103,6 +102,7 @@ export class Cam extends EventEmitter { this.preserveAddress = options.preserveAddress || false; this.events = {}; this.uri = {}; + this.device = new Device(this); /** Bind event handling to the `event` event */ this.on('newListener', (name) => { // if this is the first listener, start pulling subscription @@ -112,7 +112,7 @@ export class Cam extends EventEmitter { }); } }); - if (options.autoConnect !== false) { + if (options.autoConnect) { setImmediate(() => { this.connect(); }); @@ -172,7 +172,24 @@ export class Cam extends EventEmitter { }; } - private async request(options: CamRequestOptions): Promise<[Record, string]> { + private setupSystemDateAndTime(data: any) { + const systemDateAndTime = data[0].getSystemDateAndTimeResponse[0].systemDateAndTime[0]; + const dateTime = systemDateAndTime.UTCDateTime || systemDateAndTime.localDateTime; + let time; + if (dateTime === undefined) { + // Seen on a cheap Chinese camera from GWellTimes-IPC. Use the current time. + time = new Date(); + } else { + const dt = linerase(dateTime[0]); + time = new Date(Date.UTC(dt.date.year, dt.date.month - 1, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second)); + } + if (!this.timeShift) { + this.timeShift = time.getTime() - (process.uptime() * 1000); + } + return time; + } + + private async rawRequest(options: CamRequestOptions): Promise<[Record, string]> { return new Promise((resolve, reject) => { let callbackExecuted = false; let requestOptions = { @@ -206,7 +223,7 @@ export class Cam extends EventEmitter { const xml = Buffer.concat(bufs, length).toString('utf8'); /** * Indicates raw xml response from device. - * @event Cam#rawResponse + * @event Onvif#rawResponse * @type {string} */ this.emit('rawResponse', xml); @@ -245,12 +262,19 @@ export class Cam extends EventEmitter { }); } + public request(options: CamRequestOptions) { + return this.rawRequest({ + ...options, + body : `${this.envelopeHeader()}${options.body}${this.envelopeFooter()}`, + }); + } + /** * Parse url with an eye on `preserveAddress` property * @param address * @private */ - private parseUrl(address: string) { + public parseUrl(address: string) { const parsedAddress = new URL(address); // If host for service and default host differs, also if preserve address property set // we substitute host, hostname and port from settings then rebuild the href using .format @@ -258,40 +282,15 @@ export class Cam extends EventEmitter { parsedAddress.hostname = this.hostname; parsedAddress.host = `${this.hostname}:${this.port}`; parsedAddress.port = this.port.toString(); - parsedAddress.href = url.format(parsedAddress); + parsedAddress.href = parsedAddress.toString(); } return parsedAddress; } - /** - * Connect to the camera and fill device information properties - */ - async connect() { - await this.getSystemDateAndTime(); - await this.getServices(); - } - - private setupSystemDateAndTime(data: any) { - const systemDateAndTime = data[0].getSystemDateAndTimeResponse[0].systemDateAndTime[0]; - const dateTime = systemDateAndTime.UTCDateTime || systemDateAndTime.localDateTime; - let time; - if (dateTime === undefined) { - // Seen on a cheap Chinese camera from GWellTimes-IPC. Use the current time. - time = new Date(); - } else { - const dt = linerase(dateTime[0]); - time = new Date(Date.UTC(dt.date.year, dt.date.month - 1, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second)); - } - if (!this.timeShift) { - this.timeShift = time.getTime() - (process.uptime() * 1000); - } - return time; - } - /** * Receive date and time from cam */ - async getSystemDateAndTime() { + async getSystemDateAndTime(): Promise { // The ONVIF spec says this should work without a Password as we need to know any difference in the // remote NVT's time relative to our own time clock (called the timeShift) before we can calculate the // correct timestamp in nonce SOAP Authentication header. @@ -299,7 +298,7 @@ export class Cam extends EventEmitter { // authenticated getSystemDateAndTime. So for these devices we need to do an authenticated getSystemDateAndTime. // As 'timeShift' is not set, the local clock MUST be set to the correct time AND the NVT/Camera MUST be set // to the correct time if the camera implements Replay Attack Protection (eg Axis) - const [data, xml] = await this.request({ + const [data, xml] = await this.rawRequest({ // Try the Unauthenticated Request first. Do not use this._envelopeHeader() as we don't have timeShift yet. body : '' @@ -323,49 +322,18 @@ export class Cam extends EventEmitter { } /** - * Returns information about services of the device. - * @param includeCapability + * Connect to the camera and fill device information properties */ - async getServices(includeCapability = true) { - const [data] = await this.request({ - body : `${this.envelopeHeader()}` - + `${includeCapability}` - + `${ - this.envelopeFooter()}`, - }); - this.services = linerase(data).getServicesResponse.service; - // ONVIF Profile T introduced Media2 (ver20) so cameras from around 2020/2021 will have - // two media entries in the ServicesResponse, one for Media (ver10/media) and one for Media2 (ver20/media) - // This is so that existing VMS software can still access the video via the orignal ONVIF Media API - // fill Cam#uri property - if (!this.uri) { - /** - * Device service URIs - * @name Cam#uri - * @property {url} [PTZ] - * @property {url} [media] - * @property {url} [media2] - * @property {url} [imaging] - * @property {url} [events] - * @property {url} [device] - */ - this.uri = {}; + async connect() { + await this.getSystemDateAndTime(); + try { + await this.device.getServices(); + } catch (error) { + await this.device.getCapabilities(); } - this.services!.forEach((service) => { - // Look for services with namespaces and XAddr values - if (Object.prototype.hasOwnProperty.call(service, 'namespace') && Object.prototype.hasOwnProperty.call(service, 'XAddr')) { - // Only parse ONVIF namespaces. Axis cameras return Axis namespaces in GetServices - const parsedNamespace = url.parse(service.namespace); - if (parsedNamespace.hostname === 'www.onvif.org' && parsedNamespace.path) { - const namespaceSplitted = parsedNamespace.path.substring(1).split('/'); // remove leading Slash, then split - // special case for Media and Media2 where cameras supporting Profile S and Profile T (2020/2021 models) have two media services - if (namespaceSplitted[1] === 'media' && namespaceSplitted[0] === 'ver20') { - this.media2Support = true; - namespaceSplitted[1] = 'media2'; - } - this.uri[namespaceSplitted[1] as keyof CamServices] = this.parseUrl(service.XAddr); - } - } - }); + // await Promise.all([this.getProfiles(), this.getVideoSources()]); + // await this.getActiveSources(); + this.emit('connect'); + return this; } } From 926e3e235b38dfc3e73f893ffd9f1bb72b194980 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 14 Jan 2022 20:33:39 +0300 Subject: [PATCH 007/112] Split the class into modules, reworked --- src/device.ts | 342 ++++++++++++++++++++++++++++++++++---------------- src/index.ts | 1 + src/onvif.ts | 49 +++----- 3 files changed, 251 insertions(+), 141 deletions(-) diff --git a/src/device.ts b/src/device.ts index 7e4b262b..d3787a47 100644 --- a/src/device.ts +++ b/src/device.ts @@ -1,10 +1,236 @@ import url from 'url'; -import { CamService, CamServices, Onvif } from './onvif'; +import { Onvif, OnvifServices } from './onvif'; import { linerase } from './utils'; +export interface OnvifService { + /** Namespace uri */ + namespace: string; + /** Uri for requests */ + XAddr: string; + /** Minor version */ + minor: number; + /** Major version */ + major: number; +} + +/** Network capabilities */ +export interface NetworkCapabilities { + /** Indicates support for IP filtering */ + IPFilter?: boolean; + /** Indicates support for zeroconf */ + zeroConfiguration?: boolean; + /** Indicates support for IPv6 */ + IPVersion6?: boolean; + /** Indicates support for dynamic DNS configuration */ + dynDNS?: boolean; + extension: { + dot11Configuration?: boolean; + extension?: any; + } +} + +/** System capabilities */ +export interface SystemCapabilities { + /** Indicates support for WS Discovery resolve requests */ + discoveryBye: boolean; + /** Indicates support for remote discovery */ + remoteDiscovery: boolean; + /** Indicates support for system backup through MTOM */ + systemBackup: boolean; + /** Indicates support for retrieval of system logging through MTOM */ + systemLogging: boolean; + /** Indicates support for firmware upgrade through MTOM */ + firmwareUpgrade: boolean; + /** Indicates support for firmware upgrade through HTTP */ + httpFirmwareUpgrade: boolean; + /** Indicates support for system backup through HTTP */ + httpSystemBackup: boolean; + /** Indicates support for retrieval of system logging through HTTP */ + httpSystemLogging: boolean; +} + +export interface IOCapabilities { + /** Number of input connectors */ + inputConnectors: number; + /** Number of relay outputs */ + relayOutputs: number; + extension: { + auxiliary: boolean; + auxiliaryCommands: Record; + } +} + +/** Security capabilities */ +export interface SecurityCapabilities { + /** Indicates support for TLS 1.1 */ + 'TLS1.1': boolean; + /** Indicates support for TLS 1.2 */ + 'TLS1.2': boolean; + /** Indicates support for onboard key generation */ + onboardKeyGeneration: boolean; + /** Indicates support for access policy configuration */ + accessPolicyConfig: boolean; + /** Indicates support for WS-Security X.509 token */ + 'X.509Token': boolean; + /** Indicates support for WS-Security SAML token */ + SAMLToken: boolean; + /** Indicates support for WS-Security Kerberos token */ + kerberosToken: boolean; + /** Indicates support for WS-Security REL token */ + RELToken: boolean; +} + +/** + * Event capabilities + */ +export interface EventCapabilities { + /** Event service URI */ + XAddr: string; + /** Indicates whether or not WS Subscription policy is supported */ + WSSubscriptionPolicySupport: boolean; + /** Indicates whether or not WS Pull Point is supported */ + WSPullPointSupport: boolean; + /** Indicates whether or not WS Pausable Subscription Manager Interface is supported */ + WSPausableSubscriptionManagerInterfaceSupport: boolean; +} + +export interface ImagingCapabilities { + /** Imaging service URI */ + XAddr: string; +} + +export interface MediaCapabilities { + /** Media service URI */ + XAddr: string; + /** Streaming capabilities */ + streamingCapabilities: { + /** Indicates whether or not RTP multicast is supported */ + RTPMulticast: boolean; + /** Indicates whether or not RTP over TCP is supported */ + RTP_TCP: boolean; + /** Indicates whether or not RTP/RTSP/TCP is supported */ + RTP_RTSP_TCP: boolean; + /** Extensions */ + extension: any; + }; +} + +/** PTZ capabilities */ +export interface PTZCapabilities { + /** PTZ service URI */ + XAddr: string; +} + +export interface DeviceIOCapabilities { + /** DeviceIO service URI */ + XAddr: string; + videoSources: number; + videoOutputs: number; + audioSources: number; + audioOutputs: number; + relayOutputs: number; + extensions: { + telexCapabilities: any; + scdlCapabilities: any; + } +} + +export interface DisplayCapabilities { + XAddr: string; + /** Indication that the SetLayout command supports only predefined layouts */ + fixedLayout: boolean; +} + +export interface RecordingCapabilities { + XAddr: string; + receiverSource: boolean; + mediaProfileSource: boolean; + dynamicRecordings: boolean; + dynamicTracks: boolean; + maxStringLength: number; +} + +export interface SearchCapabilities { + XAddr: string; + metadataSearch: boolean; +} + +export interface ReplayCapabilities { + XAddr: string; +} + +export interface ReceiverCapabilities { + /** The address of the receiver service */ + XAddr: string; + /** Indicates whether the device can receive RTP multicast streams */ + RTP_Multicast: boolean; + /** Indicates whether the device can receive RTP/TCP streams */ + RTP_TCP: boolean; + /** Indicates whether the device can receive RTP/RTSP/TCP streams */ + RTP_RTSP_TCP: boolean; + /** The maximum number of receivers supported by the device */ + supportedReceivers: number; + /** The maximum allowed length for RTSP URIs */ + maximumRTSPURILength: number; +} + +export interface AnalyticsDeviceCapabilities { + XAddr: string; + ruleSupport?: boolean; + extension?: any; +} + +export interface CapabilitiesExtension { + /** DeviceIO capabilities */ + deviceIO?: DeviceIOCapabilities; + display?: DisplayCapabilities; + recording?: RecordingCapabilities; + search?: SearchCapabilities; + replay?: ReplayCapabilities; + receiver?: ReceiverCapabilities; + analyticsDevice?: AnalyticsDeviceCapabilities; +} + +/** Device capabilities */ +export interface DeviceCapabilities { + /** Device service URI */ + XAddr: string; + network?: NetworkCapabilities; + system?: SystemCapabilities; + IO?: IOCapabilities; + security?: SecurityCapabilities; + extensions?: any; +} + +/** Analytics capabilities */ +export interface AnalyticsCapabilities { + /** Analytics service URI */ + XAddr: string; + /** Indicates whether or not rules are supported */ + ruleSupport: boolean; + /** Indicates whether or not modules are supported */ + analyticsModuleSupport: boolean; +} + +/** + * Capability list + */ +export interface Capabilities { + analytics?: AnalyticsCapabilities; + device?: DeviceCapabilities; + events?: EventCapabilities; + imaging?: ImagingCapabilities; + media?: MediaCapabilities; + ptz?: PTZCapabilities; + extension?: CapabilitiesExtension; +} + +/** + * Device methods + */ export class Device { private readonly onvif: Onvif; - private services: CamService[] = []; + private services: OnvifService[] = []; private media2Support = false; constructor(onvif: Onvif) { @@ -13,9 +239,8 @@ export class Device { /** * Returns information about services of the device. - * @param includeCapability */ - async getServices(includeCapability = true): Promise { + async getServices(includeCapability = true): Promise { const [data] = await this.onvif.request({ body : '' + `${includeCapability}` @@ -51,7 +276,7 @@ export class Device { this.media2Support = true; namespaceSplitted[1] = 'media2'; } - this.onvif.uri[namespaceSplitted[1] as keyof CamServices] = this.onvif.parseUrl(service.XAddr); + this.onvif.uri[namespaceSplitted[1] as keyof OnvifServices] = this.onvif.parseUrl(service.XAddr); } } }); @@ -61,8 +286,7 @@ export class Device { /** * This method has been replaced by the more generic GetServices method. For capabilities of individual services refer to the GetServiceCapabilities methods. */ - // eslint-disable-next-line no-use-before-define - async getCapabilities(): Promise { + async getCapabilities(): Promise { return { device : { XAddr : 'kjh', @@ -70,107 +294,3 @@ export class Device { }; } } - -/** Network capabilities */ -export interface iNetwork { - /** Indicates support for IP filtering */ - IPFilter: boolean; - /** Indicates support for zeroconf */ - zeroConfiguration: boolean; - /** Indicates support for IPv6 */ - IPVersion6: boolean; - /** Indicates support for dynamic DNS configuration */ - dynDNS: boolean; -} - -/** System capabilities */ -export interface iSystem { - /** Indicates support for WS Discovery resolve requests */ - discoveryBye: boolean; - /** Indicates support for remote discovery */ - remoteDiscovery: boolean; - /** Indicates support for system backup through MTOM */ - systemBackup: boolean; - /** Indicates support for retrieval of system logging through MTOM */ - systemLogging: boolean; - /** Indicates support for firmware upgrade through MTOM */ - firmwareUpgrade: boolean; - /** Indicates support for firmware upgrade through HTTP */ - httpFirmwareUpgrade: boolean; - /** Indicates support for system backup through HTTP */ - httpSystemBackup: boolean; - /** Indicates support for retrieval of system logging through HTTP */ - httpSystemLogging: boolean; -} - -export interface iIO { - /** Number of input connectors */ - inputConnectors: number; - /** Number of relay outputs */ - relayOutputs: number; - extension: { - auxiliary: boolean; - auxiliaryCommands: Record; - } -} - -/** Security capabilities */ -export interface iSecurity { - /** Indicates support for TLS 1.1 */ - 'TLS1.1': boolean; - /** Indicates support for TLS 1.2 */ -} -// * @property {object} [device.security] -// * @property {boolean} device.security.'TLS1.1' Indicates support for TLS 1.1 -// * @property {boolean} device.security.'TLS1.2' Indicates support for TLS 1.2 -// * @property {boolean} device.security.onboardKeyGeneration Indicates support for onboard key generation -// * @property {boolean} device.security.accessPolicyConfig Indicates support for access policy configuration -// * @property {boolean} device.security.'X.509Token' Indicates support for WS-Security X.509 token -// * @property {boolean} device.security.SAMLToken Indicates support for WS-Security SAML token -// * @property {boolean} device.security.kerberosToken Indicates support for WS-Security Kerberos token -// * @property {boolean} device.security.RELToken Indicates support for WS-Security REL token -// * @property {object} events Event capabilities -// * @property {string} events.XAddr Event service URI -// * @property {boolean} events.WSSubscriptionPolicySupport Indicates whether or not WS Subscription policy is supported -// * @property {boolean} events.WSPullPointSupport Indicates whether or not WS Pull Point is supported -// * @property {boolean} events.WSPausableSubscriptionManagerInterfaceSupport Indicates whether or not WS Pausable Subscription Manager Interface is supported -// * @property {object} imaging Imaging capabilities -// * @property {string} imaging.XAddr Imaging service URI -// * @property {object} media Media capabilities -// * @property {string} media.XAddr Media service URI -// * @property {object} media.streamingCapabilities Streaming capabilities -// * @property {boolean} media.streamingCapabilities.RTPMulticast Indicates whether or not RTP multicast is supported -// * @property {boolean} media.streamingCapabilities.RTP_TCP Indicates whether or not RTP over TCP is supported -// * @property {boolean} media.streamingCapabilities.RTP_RTSP_TCP Indicates whether or not RTP/RTSP/TCP is supported -// * @property {object} media.streamingCapabilities.extension -// * @property {object} PTZ PTZ capabilities -// * @property {string} PTZ.XAddr PTZ service URI -// * @property {object} [extension] -// * @property {object} extension.deviceIO DeviceIO capabilities -// * @property {string} extension.deviceIO.XAddr DeviceIO service URI -// * @property {number} extension.deviceIO.videoSources -// * @property {number} extension.deviceIO.videoOutputs -// * @property {number} extension.deviceIO.audioSources -// * @property {number} extension.deviceIO.audioOutputs -// * @property {number} extension.deviceIO.relayOutputs -// * @property {object} [extension.extensions] -// * @property {object} [extension.extensions.telexCapabilities] -// * @property {object} [extension.extensions.scdlCapabilities] -// */ - -/** Device capabilities */ -export interface iDevice { - /** Device service URI */ - XAddr: string; - network?: iNetwork; - system?: iSystem; - IO?: iIO; - security?: iSecurity; -} - -/** - * Capability list - */ -export interface iCapabilities { - device: iDevice; -} diff --git a/src/index.ts b/src/index.ts index e019d32a..98614c71 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,2 @@ export * from './onvif'; +export * from './device'; diff --git a/src/onvif.ts b/src/onvif.ts index 2de5f1ec..a907c72b 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -10,7 +10,7 @@ import { Device } from './device'; /** * Cam constructor options */ -export interface CamOptions { +export interface OnvifOptions { /** Set true if using `https` protocol, defaults to false. */ useSecure?: boolean; /** Set options for https like ca, cert, ciphers, rejectUnauthorized, secureOptions, secureProtocol, etc. */ @@ -29,18 +29,18 @@ export interface CamOptions { autoConnect?: boolean; } -export type CamServices = { - PTZ?: URL, - media?: URL, - media2?: URL, - imaging?: URL, - events?: URL, - device?: URL, +export interface OnvifServices { + PTZ?: URL; + media?: URL; + media2?: URL; + imaging?: URL; + events?: URL; + device?: URL; } -export interface CamRequestOptions extends RequestOptions{ +export interface OnvifRequestOptions extends RequestOptions{ /** Name of service (ptz, media, etc) */ - service?: keyof CamServices; + service?: keyof OnvifServices; /** SOAP body */ body: string; /** Defines another url to request */ @@ -55,17 +55,6 @@ interface RequestError extends Error { syscall: string; } -export interface CamService { - /** Namespace uri */ - namespace: string; - /** Uri for requests */ - XAddr: string; - /** Minor version */ - minor: number; - /** Major version */ - major: number; -} - export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. @@ -73,7 +62,7 @@ export class Onvif extends EventEmitter { */ static rawRequest: 'rawRequest' = 'rawRequest'; - private device: Device; + public device: Device; public useSecure: boolean; public secureOptions: SecureContextOptions; public hostname: string; @@ -85,10 +74,10 @@ export class Onvif extends EventEmitter { public agent: Agent | boolean; public preserveAddress: boolean; private events: Record; - public uri: CamServices; + public uri: OnvifServices; private timeShift: number | undefined; - constructor(options: CamOptions) { + constructor(options: OnvifOptions) { super(); this.useSecure = options.useSecure ?? false; this.secureOptions = options.secureOptions ?? {}; @@ -133,7 +122,7 @@ export class Onvif extends EventEmitter { header += '' + '' + `${this.username}` - + `${req.passdigest}` + + `${req.passDigest}` + `${req.nonce}` + `${req.timestamp}` + '' @@ -166,8 +155,8 @@ export class Onvif extends EventEmitter { cryptoDigest.update(Buffer.concat([nonce, Buffer.from(timestamp, 'ascii'), Buffer.from(this.password!, 'ascii')])); const passDigest = cryptoDigest.digest('base64'); return { - passdigest : passDigest, - nonce : nonce.toString('base64'), + passDigest, + nonce : nonce.toString('base64'), timestamp, }; } @@ -189,7 +178,7 @@ export class Onvif extends EventEmitter { return time; } - private async rawRequest(options: CamRequestOptions): Promise<[Record, string]> { + private async rawRequest(options: OnvifRequestOptions): Promise<[Record, string]> { return new Promise((resolve, reject) => { let callbackExecuted = false; let requestOptions = { @@ -262,7 +251,7 @@ export class Onvif extends EventEmitter { }); } - public request(options: CamRequestOptions) { + public request(options: OnvifRequestOptions) { return this.rawRequest({ ...options, body : `${this.envelopeHeader()}${options.body}${this.envelopeFooter()}`, @@ -313,7 +302,7 @@ export class Onvif extends EventEmitter { if (xml && xml.toLowerCase().includes('sender not authorized')) { // Try again with a Username and Password const [data] = await this.request({ - body : `${this.envelopeHeader()}${this.envelopeFooter()}`, + body : '}', }); return this.setupSystemDateAndTime(data); } From 241a5004f2ae2ead3b01b370f79be88bda3ba236 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 14 Jan 2022 21:54:16 +0300 Subject: [PATCH 008/112] getCapabilities interfaces --- src/device.ts | 104 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 81 insertions(+), 23 deletions(-) diff --git a/src/device.ts b/src/device.ts index d3787a47..aa4a9a09 100644 --- a/src/device.ts +++ b/src/device.ts @@ -13,6 +13,22 @@ export interface OnvifService { major: number; } +export interface OnvifVersion { + /** Major version number */ + major: number; + /** + * Two digit minor version number. + * If major version number is less than "16", X.0.1 maps to "01" and X.2.1 maps to "21" where X stands for Major version number. + * Otherwise, minor number is month of release, such as "06" for June + */ + minor: number; +} + +export interface NetworkCapabilitiesExtension { + dot11Configuration?: boolean; + extension?: any; +} + /** Network capabilities */ export interface NetworkCapabilities { /** Indicates support for IP filtering */ @@ -23,14 +39,21 @@ export interface NetworkCapabilities { IPVersion6?: boolean; /** Indicates support for dynamic DNS configuration */ dynDNS?: boolean; - extension: { - dot11Configuration?: boolean; - extension?: any; - } + extension: NetworkCapabilitiesExtension; +} + +export interface SystemCapabilitiesExtension { + httpFirmwareUpgrade?: boolean; + httpSystemBackup?: boolean; + httpSystemLogging?: boolean; + httpSupportInformation?: boolean; + extension?: any; } /** System capabilities */ export interface SystemCapabilities { + /** Indicates whether or not WS Discovery resolve requests are supported */ + discoveryResolve: boolean; /** Indicates support for WS Discovery resolve requests */ discoveryBye: boolean; /** Indicates support for remote discovery */ @@ -42,22 +65,41 @@ export interface SystemCapabilities { /** Indicates support for firmware upgrade through MTOM */ firmwareUpgrade: boolean; /** Indicates support for firmware upgrade through HTTP */ - httpFirmwareUpgrade: boolean; + httpFirmwareUpgrade?: boolean; /** Indicates support for system backup through HTTP */ - httpSystemBackup: boolean; + httpSystemBackup?: boolean; /** Indicates support for retrieval of system logging through HTTP */ - httpSystemLogging: boolean; + httpSystemLogging?: boolean; + /** Indicates supported ONVIF version(s) */ + supportedVersions: OnvifVersion; + extensions?: SystemCapabilitiesExtension; +} + +export interface IOCapabilitiesExtension { + auxiliary?: boolean; + auxiliaryCommands?: Record; + extension?: any; } export interface IOCapabilities { /** Number of input connectors */ - inputConnectors: number; + inputConnectors?: number; /** Number of relay outputs */ - relayOutputs: number; - extension: { - auxiliary: boolean; - auxiliaryCommands: Record; - } + relayOutputs?: number; + extension?: IOCapabilitiesExtension; +} + +export interface SecurityCapabilitiesExtension2 { + dot1X: boolean; + /** EAP Methods supported by the device. The int values refer to the IANA EAP Registry */ + supportedEAPMethod?: number; + remoteUserHandling: boolean; +} + +export interface SecurityCapabilitiesExtension { + /** Indicates support for TLS 1.0 */ + 'TLS1.0': boolean; + extension?: SecurityCapabilitiesExtension2; } /** Security capabilities */ @@ -78,6 +120,7 @@ export interface SecurityCapabilities { kerberosToken: boolean; /** Indicates support for WS-Security REL token */ RELToken: boolean; + extension?: SecurityCapabilitiesExtension; } /** @@ -99,20 +142,31 @@ export interface ImagingCapabilities { XAddr: string; } +export interface RealTimeStreamingCapabilities { + /** Indicates whether or not RTP multicast is supported */ + RTPMulticast: boolean; + /** Indicates whether or not RTP over TCP is supported */ + RTP_TCP: boolean; + /** Indicates whether or not RTP/RTSP/TCP is supported */ + RTP_RTSP_TCP: boolean; + /** Extensions */ + extension: any; +} + +export interface ProfileCapabilities { + maximumNumberOfProfiles: number; +} + +export interface MediaCapabilitiesExtension { + profileCapabilities: ProfileCapabilities; +} + export interface MediaCapabilities { /** Media service URI */ XAddr: string; /** Streaming capabilities */ - streamingCapabilities: { - /** Indicates whether or not RTP multicast is supported */ - RTPMulticast: boolean; - /** Indicates whether or not RTP over TCP is supported */ - RTP_TCP: boolean; - /** Indicates whether or not RTP/RTSP/TCP is supported */ - RTP_RTSP_TCP: boolean; - /** Extensions */ - extension: any; - }; + streamingCapabilities: RealTimeStreamingCapabilities; + extension?: MediaCapabilitiesExtension; } /** PTZ capabilities */ @@ -237,6 +291,10 @@ export class Device { this.onvif = onvif; } + getSystemDateAndTime() { + return this.onvif.getSystemDateAndTime(); + } + /** * Returns information about services of the device. */ From a256f65561020d5e733ec5b5978486caf62b59aa Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 14 Jan 2022 23:14:38 +0300 Subject: [PATCH 009/112] getCapabilities method --- src/device.ts | 38 ++++++++++++++++++++++++++++++++------ src/onvif.ts | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/device.ts b/src/device.ts index aa4a9a09..ac9a5d2b 100644 --- a/src/device.ts +++ b/src/device.ts @@ -235,6 +235,7 @@ export interface AnalyticsDeviceCapabilities { } export interface CapabilitiesExtension { + XAddr: string; /** DeviceIO capabilities */ deviceIO?: DeviceIOCapabilities; display?: DisplayCapabilities; @@ -342,13 +343,38 @@ export class Device { } /** - * This method has been replaced by the more generic GetServices method. For capabilities of individual services refer to the GetServiceCapabilities methods. + * This method has been replaced by the more generic GetServices method. + * For capabilities of individual services refer to the GetServiceCapabilities methods. */ async getCapabilities(): Promise { - return { - device : { - XAddr : 'kjh', - }, - }; + const [data] = await this.onvif.request({ + body : '' + + 'All' + + '', + }); + this.onvif.capabilities = linerase(data[0].getCapabilitiesResponse[0].capabilities[0]); + ['PTZ', 'media', 'imaging', 'events', 'device'].forEach((name) => { + const capabilityName = name as keyof Capabilities; + if ('XAddr' in this.onvif.capabilities[capabilityName]!) { + this.onvif.uri[name.toLowerCase() as keyof OnvifServices] = this.onvif.parseUrl(this.onvif.capabilities[capabilityName]!.XAddr); + } + }); + // extensions, eg. deviceIO + if (this.onvif.capabilities.extension) { + Object.keys(this.onvif.capabilities.extension).forEach((ext) => { + const extensionName = ext as keyof CapabilitiesExtension; + // TODO think about complex extensions like `telexCapabilities` and `scdlCapabilities` + if (extensionName !== 'XAddr' && 'XAddr' in this.onvif.capabilities.extension![extensionName]!) { + this.onvif.uri[extensionName] = new URL(this.onvif.capabilities.extension![extensionName]!.XAddr); + } + }); + // HACK for a Profile G NVR that has 'replay' but did not have 'recording' in GetCapabilities + if (this.onvif.uri.replay && !this.onvif.uri.recording) { + const tempRecorderXaddr = this.onvif.uri.replay.href.replace('replay', 'recording'); + this.onvif.emit('warn', `Adding ${tempRecorderXaddr} for bad Profile G device`); + this.onvif.uri.recording = new URL(tempRecorderXaddr); + } + } + return this.onvif.capabilities; } } diff --git a/src/onvif.ts b/src/onvif.ts index a907c72b..7988da95 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -5,7 +5,7 @@ import http from 'http'; import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; -import { Device } from './device'; +import { Capabilities, Device } from './device'; /** * Cam constructor options @@ -36,6 +36,13 @@ export interface OnvifServices { imaging?: URL; events?: URL; device?: URL; + deviceIO?: URL; + search?: URL; + display?: URL; + recording?: URL; + replay?: URL; + receiver?: URL; + analyticsDevice?: URL; } export interface OnvifRequestOptions extends RequestOptions{ @@ -59,8 +66,30 @@ export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. * @event rawData + * @example + * ```typescript + * onvif.on('rawData', (xml) => { console.log('request was', xml); }); + * ``` */ static rawRequest: 'rawRequest' = 'rawRequest'; + /** + * Indicates any warnings + * @event warn + * @example + * ```typescript + * onvif.on('warn', console.warn); + * ``` + */ + static warn: 'warn' = 'warn'; + /** + * Indicates any errors + * @event error + * @example + * ```typescript + * onvif.on('error', console.error); + * ``` + */ + static error: 'error' = 'error'; public device: Device; public useSecure: boolean; @@ -75,7 +104,8 @@ export class Onvif extends EventEmitter { public preserveAddress: boolean; private events: Record; public uri: OnvifServices; - private timeShift: number | undefined; + private timeShift?: number; + public capabilities: Capabilities; constructor(options: OnvifOptions) { super(); @@ -91,6 +121,7 @@ export class Onvif extends EventEmitter { this.preserveAddress = options.preserveAddress || false; this.events = {}; this.uri = {}; + this.capabilities = {}; this.device = new Device(this); /** Bind event handling to the `event` event */ this.on('newListener', (name) => { From 7008ec2a9c068550830d9b43e5edb39deb3c6841 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 15 Jan 2022 04:53:40 +0300 Subject: [PATCH 010/112] Slice of interfaces work --- src/device.ts | 15 +- src/media.ts | 679 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/onvif.ts | 17 +- 3 files changed, 690 insertions(+), 21 deletions(-) create mode 100644 src/media.ts diff --git a/src/device.ts b/src/device.ts index ac9a5d2b..0fff409d 100644 --- a/src/device.ts +++ b/src/device.ts @@ -286,7 +286,7 @@ export interface Capabilities { export class Device { private readonly onvif: Onvif; private services: OnvifService[] = []; - private media2Support = false; + public media2Support = false; constructor(onvif: Onvif) { this.onvif = onvif; @@ -310,19 +310,6 @@ export class Device { // two media entries in the ServicesResponse, one for Media (ver10/media) and one for Media2 (ver20/media) // This is so that existing VMS software can still access the video via the orignal ONVIF Media API // fill Cam#uri property - if (!this.onvif.uri) { - /** - * Device service URIs - * @name Onvif#uri - * @property {url} [PTZ] - * @property {url} [media] - * @property {url} [media2] - * @property {url} [imaging] - * @property {url} [events] - * @property {url} [device] - */ - this.onvif.uri = {}; - } this.services.forEach((service) => { // Look for services with namespaces and XAddr values if (Object.prototype.hasOwnProperty.call(service, 'namespace') && Object.prototype.hasOwnProperty.call(service, 'XAddr')) { diff --git a/src/media.ts b/src/media.ts new file mode 100644 index 00000000..9bd174e8 --- /dev/null +++ b/src/media.ts @@ -0,0 +1,679 @@ +import { isNumber } from 'util'; +import { Onvif } from './onvif'; +import { linerase } from './utils'; + +export interface IntRectangle { + x: number; + y: number; + width: number; + height: number; +} + +export interface Rotate { + /** Parameter to enable/disable Rotation feature */ + mode: 'OFF' | 'ON' | 'AUTO'; + /** Optional parameter to configure how much degree of clockwise rotation of image for On mode. Omitting this parameter for On mode means 180 degree rotation. */ + degree?: number; + extension: any; +} + +export interface LensOffset { + /** Optional horizontal offset of the lens center in normalized coordinates */ + x: number; + /** Optional vertical offset of the lens center in normalized coordinates */ + y: number; +} + +export interface LensProjection { + /** Angle of incidence */ + angle: number; + /** Mapping radius as a consequence of the emergent angle */ + radius: number; + /** Optional ray absorption at the given angle due to vignetting. A value of one means no absorption */ + transmittance?: number; +} + +export interface LensDescription { + /** Optional focal length of the optical system */ + focalLength: number; + /** Offset of the lens center to the imager center in normalized coordinates */ + offset: LensOffset; + /** + * Radial description of the projection characteristics. + * The resulting curve is defined by the B-Spline interpolation over the given elements. + * The element for Radius zero shall not be provided. The projection points shall be ordered with ascending Radius. + * Items outside the last projection Radius shall be assumed to be invisible (black) + */ + projection: LensProjection; + /** Compensation of the x coordinate needed for the ONVIF normalized coordinate system */ + XFactor: number; +} + +export interface SceneOrientation { + /** Parameter to assign the way the camera determines the scene orientation */ + mode: 'MANUAL' | 'AUTO'; + /** + * Assigned or determined scene orientation based on the Mode. + * When assigning the Mode to AUTO, this field is optional and will be ignored by the device. + * When assigning the Mode to MANUAL, this field is required and the device will return an InvalidArgs fault if missing + */ + orientation?: string; +} + +export interface VideoSourceConfigurationExtension2 { + /** Optional element describing the geometric lens distortion. Multiple instances for future variable lens support */ + lensDescription?: LensDescription; + /** Optional element describing the scene orientation in the camera’s field of view */ + sceneOrientation: SceneOrientation; +} + +export interface VideoSourceConfigurationExtension { + /** + * Optional element to configure rotation of captured image. What resolutions a device supports shall be unaffected by the Rotate parameters. + * If a device is configured with Rotate=AUTO, the device shall take control over the Degree parameter and automatically update it so that a client can query current rotation. + * The device shall automatically apply the same rotation to its pan/tilt control direction depending on the following condition: + * if Reverse=AUTO in PTControlDirection or if the device doesn’t support Reverse in PTControlDirection + */ + rotate: Rotate; + extension?: VideoSourceConfigurationExtension2; +} + +export interface VideoSourceConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration + * This informational parameter is read-only. Deprecated for Media2 Service + * */ + useCount: number; + /** Readonly parameter signalling Source configuration's view mode, for devices supporting different view modes as defined in tt:viewModes */ + viewMode: string; + /** Reference to the physical input */ + sourceToken: string; + /** Rectangle specifying the Video capturing area. The capturing area shall not be larger than the whole Video source area */ + bounds: IntRectangle; + extension?: VideoSourceConfigurationExtension; +} + +export interface AudioSourceConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration + * This informational parameter is read-only. Deprecated for Media2 Service + */ + useCount: number; + /** Token of the Audio Source the configuration applies to */ + sourceToken: string; +} + +export interface VideoResolution { + /** Number of the columns of the Video image */ + width: number; + /** Number of the lines of the Video image */ + height: number; +} + +export interface VideoRateControl { + /** Maximum output framerate in fps. If an EncodingInterval is provided the resulting encoded framerate will be reduced by the given factor */ + frameRateLimit: number; + /** Interval at which images are encoded and transmitted. (A value of 1 means that every frame is encoded, a value of 2 means that every 2nd frame is encoded ...) */ + encodingInterval: number; + /** the maximum output bitrate in kbps */ + bitrateLimit: number; +} + +export interface Mpeg4Configuration { + /** + * Determines the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. + * An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. + * The frames in between are coded as P or B Frames + */ + govLength: number; + /** The Mpeg4 profile, either simple profile (SP) or advanced simple profile (ASP) */ + mpeg4Profile: 'SP' | 'ASP'; +} + +export interface H264Configuration { + /** + * Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. + * An entry of 1 indicates I-Frames are continuously generated. + * An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. + * The frames in between are coded as P or B Frames + */ + govLength: number; + /** The H.264 profile, either baseline, main, extended or high */ + H264Profile: 'Baseline' | 'Main' | 'Extended' | 'High'; +} + +export interface IPAddress { + /** Indicates if the address is an IPv4 or IPv6 address */ + type: 'IPv4' | 'IPv6'; + /** IPv4 address */ + IPv4Address?: string; + /** IPv6 address */ + IPv6Address?: string; +} + +export interface MulticastConfiguration { + /** The multicast address (if this address is set to 0 no multicast streaming is enaled) */ + address: IPAddress; + /** + * The RTP mutlicast destination port. A device may support RTCP. + * In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) + * destination port number as defined in the RTSP specification + */ + port: number; + /** + * In case of IPv6 the TTL value is assumed as the hop limit. + * Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets + * from (endlessly) circulating and not limiting scope. In these cases the address contains the scope + */ + TTL: number; + /** + * Read only property signalling that streaming is persistant. + * Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state. + */ + autoStart: boolean; +} + +export type Duration = string; + +export interface VideoEncoderConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** + * A value of true indicates that frame rate is a fixed value rather than an upper limit, + * and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. + * Default is false. + */ + guaranteedFrameRate: boolean; + /** Used video codec, either Jpeg, H.264 or Mpeg4 */ + encoding: 'JPEG' | 'MPEG4' | 'H264'; + /** Configured video resolution */ + resolution: VideoResolution; + /** + * Relative value for the video quantizers and the quality of the video. + * A high value within supported quality range means higher quality + */ + quality: number; + /** Optional element to configure rate control related parameters. */ + rateControl?: VideoRateControl; + /** Optional element to configure Mpeg4 related parameters */ + MPEG4?: Mpeg4Configuration; + /** Optional element to configure H.264 related parameters. */ + H264: H264Configuration; + /** Defines the multicast settings that could be used for video streaming */ + multicast: MulticastConfiguration; + /** The rtsp session timeout for the related video stream */ + sessionTimeout: Duration; +} + +export interface AudioEncoderConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** Audio codec used for encoding the audio input (either G.711, G.726 or AAC) */ + encoding: 'G711' | 'G726' | 'AAC'; + /** The output bitrate in kbps */ + bitrate: number; + /** The output sample rate in kHz */ + sampleRate: number; + /** Defines the multicast settings that could be used for video streaming */ + multicast: MulticastConfiguration; + /** The rtsp session timeout for the related audio stream */ + sessionTimeout: Duration; +} + +export interface ItemList { + /** Value name pair as defined by the corresponding description */ + simpleItem?: { + /** Item name */ + name: string; + /** Item value. The type is defined in the corresponding description */ + value: any; + } + /** Complex value structure */ + elementItem?: any; + extension: any; +} + +export interface Config { + /** Name of the configuration */ + name: string; + /** + * The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements + * returned by GetSupportedRules and GetSupportedAnalyticsModules command. + */ + type: string; + /** List of configuration parameters as defined in the corresponding description */ + parameters: ItemList[]; +} + +export interface AnalyticsEngineConfiguration { + analyticsModule?: Config; + extension?: any; +} + +export interface RuleEngineConfiguration { + rule?: Config; + extension?: any; +} + +export interface VideoAnalyticsConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + analyticsEngineConfiguration: AnalyticsEngineConfiguration; + ruleEngineConfiguration: RuleEngineConfiguration; +} + +export interface PTZSpeed { + /** + * Pan and tilt speed. The x component corresponds to pan and the y component to tilt. + * If omitted in a request, the current (if any) PanTilt movement should not be affected + */ + panTilt: { + x: number; + y: number; + }; + /** A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected */ + zoom: { + x: number; + } +} + +export interface Range { + min: number; + max: number; +} + +export interface Space2DDescription { + /** A URI of coordinate systems */ + URI: string; + /** A range of x-axis */ + XRange: Range; + /** A range of y-axis */ + YRange: Range; +} + +export interface PanTiltLimits { + /** A range of pan tilt limits */ + range: Space2DDescription; +} + +export interface Space1DDescription { + /** A URI of coordinate systems */ + URI: string; + /** A range of x-axis */ + XRange: Range; +} + +export interface ZoomLimits { + range: Space1DDescription; +} + +export interface PTControlDirection { + /** Optional element to configure related parameters for E-Flip */ + EFlip?: { + /** Parameter to enable/disable E-Flip feature */ + mode: 'OFF' | 'ON' | 'Extended'; + }; + /** Optional element to configure related parameters for reversing of PT Control Direction */ + reverse: { + /** Parameter to enable/disable Reverse feature */ + mode: 'OFF' | 'ON' | 'AUTO' | 'Extended'; + }; + extension: any; +} + +export interface PTZConfigurationExtension { + /** Optional element to configure PT Control Direction related features */ + PTControlDirection: PTControlDirection; + extension: any; +} + +export interface PTZConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** The optional acceleration ramp used by the device when moving */ + moveRamp: number; + /** The optional acceleration ramp used by the device when recalling presets */ + presetRamp: number; + /** The optional acceleration ramp used by the device when executing PresetTours */ + presetTourRamp: number; + /** A mandatory reference to the PTZ Node that the PTZ Configuration belongs to */ + nodeToken: string; + /** If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default */ + defaultAbsolutePantTiltPositionSpace?: string; + /** If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default */ + defaultAbsoluteZoomPositionSpace?: string; + /** If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default */ + defaultRelativePanTiltTranslationSpace?: string; + /** If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default */ + defaultRelativeZoomTranslationSpace?: string + /** If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default */ + defaultContinuousPanTiltVelocitySpace?: string; + /** If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default */ + defaultContinuousZoomVelocitySpace?: string; + /** If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds */ + defaultPTZSpeed?: PTZSpeed; + /** If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops */ + defaultPTZTimeout?: Duration; + /** + * The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. + * If the element is present it signals the support for configurable Pan/Tilt limits. + * If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. + * The Pan/Tilt limits are disabled by setting the limits to –INF or +INF + */ + panTiltLimits?: PanTiltLimits; + /** + * The Zoom limits element should be present for a PTZ Node that supports absolute zoom. + * If the element is present it signals the supports for configurable Zoom limits. + * If limits are enabled the zoom movements shall always stay within the specified range. + * The Zoom limits are disabled by settings the limits to -INF and +INF + */ + zoomLimits?: ZoomLimits; + extension?: PTZConfigurationExtension; +} + +export interface Profile { + /** Unique identifier of the profile */ + token: string; + /** A value of true signals that the profile cannot be deleted. Default is false */ + fixed: boolean; + /** User readable name of the profile */ + name: string; + /** Optional configuration of the Video input */ + videoSourceConfiguration?: VideoSourceConfiguration; + /** Optional configuration of the Audio input */ + audioSourceConfiguration?: AudioSourceConfiguration; + /** Optional configuration of the Video encoder */ + videoEncoderConfiguration?: VideoEncoderConfiguration; + /** Optional configuration of the Audio encoder */ + audioEncoderConfiguration?: AudioEncoderConfiguration; + /** Optional configuration of the video analytics module and rule engine */ + videoAnalyticsConfiguration?: VideoAnalyticsConfiguration; + /** Optional configuration of the pan tilt zoom unit */ + PTZConfiguration?: PTZConfiguration; + +// PTZConfiguration - optional; [PTZConfiguration] +// Optional configuration of the pan tilt zoom unit. +// token - required; [ReferenceToken] +// Token that uniquely references this configuration. Length up to 64 characters. +// Name [Name] +// User readable name. Length up to 64 characters. +// UseCount [int] +// Number of internal references currently using this configuration. +// +// This informational parameter is read-only. Deprecated for Media2 Service. +// MoveRamp [int] +// The optional acceleration ramp used by the device when moving. +// PresetRamp [int] +// The optional acceleration ramp used by the device when recalling presets. +// PresetTourRamp [int] +// The optional acceleration ramp used by the device when executing PresetTours. +// NodeToken [ReferenceToken] +// A mandatory reference to the PTZ Node that the PTZ Configuration belongs to. +// DefaultAbsolutePantTiltPositionSpace - optional; [anyURI] +// If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default. +// DefaultAbsoluteZoomPositionSpace - optional; [anyURI] +// If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default. +// DefaultRelativePanTiltTranslationSpace - optional; [anyURI] +// If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default. +// DefaultRelativeZoomTranslationSpace - optional; [anyURI] +// If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default. +// DefaultContinuousPanTiltVelocitySpace - optional; [anyURI] +// If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default. +// DefaultContinuousZoomVelocitySpace - optional; [anyURI] +// If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default. +// DefaultPTZSpeed - optional; [PTZSpeed] +// If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds. +// PanTilt - optional; [Vector2D] +// Pan and tilt speed. The x component corresponds to pan and the y component to tilt. If omitted in a request, the current (if any) PanTilt movement should not be affected. +// Zoom - optional; [Vector1D] +// A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected. +// DefaultPTZTimeout - optional; [duration] +// If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops. +// PanTiltLimits - optional; [PanTiltLimits] +// The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. If the element is present it signals the support for configurable Pan/Tilt limits. If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. The Pan/Tilt limits are disabled by setting the limits to –INF or +INF. +// Range [Space2DDescription] +// A range of pan tilt limits. +// URI [anyURI] +// A URI of coordinate systems. +// XRange [FloatRange] +// A range of x-axis. +// Min [float] +// Max [float] +// YRange [FloatRange] +// A range of y-axis. +// Min [float] +// Max [float] +// ZoomLimits - optional; [ZoomLimits] +// The Zoom limits element should be present for a PTZ Node that supports absolute zoom. If the element is present it signals the supports for configurable Zoom limits. If limits are enabled the zoom movements shall always stay within the specified range. The Zoom limits are disabled by settings the limits to -INF and +INF. +// Range [Space1DDescription] +// A range of zoom limit +// URI [anyURI] +// A URI of coordinate systems. +// XRange [FloatRange] +// A range of x-axis. +// Min [float] +// Max [float] +// Extension - optional; [PTZConfigurationExtension] +// PTControlDirection - optional; [PTControlDirection] +// Optional element to configure PT Control Direction related features. +// EFlip - optional; [EFlip] +// Optional element to configure related parameters for E-Flip. +// Mode [EFlipMode] +// Parameter to enable/disable E-Flip feature. +// - enum { 'OFF', 'ON', 'Extended' } +// Reverse - optional; [Reverse] +// Optional element to configure related parameters for reversing of PT Control Direction. +// Mode [ReverseMode] +// Parameter to enable/disable Reverse feature. +// - enum { 'OFF', 'ON', 'AUTO', 'Extended' } +// Extension - optional; [PTControlDirectionExtension] +// Extension - optional; [PTZConfigurationExtension2] +// MetadataConfiguration - optional; [MetadataConfiguration] +// Optional configuration of the metadata stream. +// token - required; [ReferenceToken] +// Token that uniquely references this configuration. Length up to 64 characters. +// Name [Name] +// User readable name. Length up to 64 characters. +// UseCount [int] +// Number of internal references currently using this configuration. +// +// This informational parameter is read-only. Deprecated for Media2 Service. +// CompressionType [string] +// Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType. +// GeoLocation [boolean] +// Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target. +// ShapePolygon [boolean] +// Optional parameter to configure if the generated metadata stream should contain shape information as polygon. +// PTZStatus - optional; [PTZFilter] +// optional element to configure which PTZ related data is to include in the metadata stream +// Status [boolean] +// True if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN) +// Position [boolean] +// True if the metadata stream shall contain the PTZ position +// Events - optional; [EventSubscription] +// Optional element to configure the streaming of events. A client might be interested in receiving all, none or some of the events produced by the device: +// To get all events: Include the Events element but do not include a filter. +// To get no events: Do not include the Events element. +// To get only some events: Include the Events element and include a filter in the element. +// Filter - optional; [FilterType] +// SubscriptionPolicy - optional; +// Analytics - optional; [boolean] +// Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) +// Multicast [MulticastConfiguration] +// Defines the multicast settings that could be used for video streaming. +// Address [IPAddress] +// The multicast address (if this address is set to 0 no multicast streaming is enaled) +// Type [IPType] +// Indicates if the address is an IPv4 or IPv6 address. +// - enum { 'IPv4', 'IPv6' } +// IPv4Address - optional; [IPv4Address] +// IPv4 address. +// IPv6Address - optional; [IPv6Address] +// IPv6 address +// Port [int] +// The RTP mutlicast destination port. A device may support RTCP. In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) destination port number as defined in the RTSP specification. +// TTL [int] +// In case of IPv6 the TTL value is assumed as the hop limit. Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets from (endlessly) circulating and not limiting scope. In these cases the address contains the scope. +// AutoStart [boolean] +// Read only property signalling that streaming is persistant. Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state. +// SessionTimeout [duration] +// The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) +// AnalyticsEngineConfiguration - optional; [AnalyticsEngineConfiguration] +// Indication which AnalyticsModules shall output metadata. Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration. +// AnalyticsModule - optional, unbounded; [Config] +// Name - required; [string] +// Name of the configuration. +// Type - required; [QName] +// The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements returned by GetSupportedRules and GetSupportedAnalyticsModules command. +// Parameters [ItemList] +// List of configuration parameters as defined in the corresponding description. +// SimpleItem - optional, unbounded; +// Value name pair as defined by the corresponding description. +// Name - required; [string] +// Item name. +// Value - required; [anySimpleType] +// Item value. The type is defined in the corresponding description. +// ElementItem - optional, unbounded; +// Complex value structure. +// Name - required; [string] +// Item name. +// Extension - optional; [ItemListExtension] +// Extension - optional; [AnalyticsEngineConfigurationExtension] +// Extension - optional; [MetadataConfigurationExtension] +// Extension - optional; [ProfileExtension] +// Extensions defined in ONVIF 2.0 +// AudioOutputConfiguration - optional; [AudioOutputConfiguration] +// Optional configuration of the Audio output. +// token - required; [ReferenceToken] +// Token that uniquely references this configuration. Length up to 64 characters. +// Name [Name] +// User readable name. Length up to 64 characters. +// UseCount [int] +// Number of internal references currently using this configuration. +// +// This informational parameter is read-only. Deprecated for Media2 Service. +// OutputToken [ReferenceToken] +// Token of the phsycial Audio output. +// SendPrimacy - optional; [anyURI] +// An audio channel MAY support different types of audio transmission. While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which direction is currently active. An NVC can switch between different modes by setting the AudioOutputConfiguration. +// +// The following modes for the Send-Primacy are defined: +// www.onvif.org/ver20/HalfDuplex/Server The server is allowed to send audio data to the client. The client shall not send audio data via the backchannel to the NVT in this mode. +// www.onvif.org/ver20/HalfDuplex/Client The client is allowed to send audio data via the backchannel to the server. The NVT shall not send audio data to the client in this mode. +// www.onvif.org/ver20/HalfDuplex/Auto It is up to the device how to deal with sending and receiving audio data. +// Acoustic echo cancellation is out of ONVIF scope. +// OutputLevel [int] +// Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRange. +// AudioDecoderConfiguration - optional; [AudioDecoderConfiguration] +// Optional configuration of the Audio decoder. +// token - required; [ReferenceToken] +// Token that uniquely references this configuration. Length up to 64 characters. +// Name [Name] +// User readable name. Length up to 64 characters. +// UseCount [int] +// Number of internal references currently using this configuration. +// +// This informational parameter is read-only. Deprecated for Media2 Service. +// Extension - optional; [ProfileExtension2] +} + +interface MediaProfile { + +} + +export class Media { + private onvif: Onvif; + + constructor(onvif: Onvif) { + this.onvif = onvif; + } + + /** + * Receive profiles + */ + async getProfiles(): Promise<[Profile | MediaProfile]> { + if (this.onvif.device.media2Support) { + // Profile T request using Media2 + // The reply is in a different format to the old API so we convert the data from the new API to the old structure + // for backwards compatibility with existing users of this library + const [data] = await this.onvif.request({ + service : 'media2', + body : '' + + 'All' + + '}', + }); + + // Slight difference in Media1 and Media2 reply XML + // Generate a reply that looks like a Media1 reply for existing library users + this.onvif.profiles = data[0].getProfilesResponse[0].profiles.map((profile: Record) => { + const tmp = linerase(profile); + const newProfile = {}; + newProfile.$ = tmp.$; // copy Profile Token + newProfile.name = tmp.name; + // Media2 Spec says there will be these some or all of these configuration entities + // Video source configuration + // Audio source configuration + // Video encoder configuration + // Audio encoder configuration + // PTZ configuration + // Video analytics configuration + // Metadata configuration + // Audio output configuration + // Audio decoder configuration + if (tmp.configurations.videoSource) { newProfile.videoSourceConfiguration = tmp.configurations.videoSource; } + if (tmp.configurations.audioSource) { newProfile.audioSourceConfiguration = tmp.configurations.audioSource; } + if (tmp.configurations.videoEncoder) { newProfile.videoEncoderConfiguration = tmp.configurations.videoEncoder; } + if (tmp.configurations.audioEncoder) { newProfile.audioEncoderConfiguration = tmp.configurations.audioEncoder; } + if (tmp.configurations.PTZ) { newProfile.PTZConfiguration = tmp.configurations.PTZ; } + if (tmp.configurations.analytics) { newProfile.analyticsConfiguration = tmp.configurations.analytics; } + if (tmp.configurations.metadata) { newProfile.metadataConfiguration = tmp.configurations.metadata; } + if (tmp.configurations.audioOutput) { newProfile.audioOutputConfiguration = tmp.configurations.audioOutput; } + if (tmp.configurations.audioOutput) { newProfile.audioDecoderConfiguration = tmp.configurations.audioDecoder; } + + // TODO - Add Audio + return newProfile; + }); + if (callback) { + callback.call(this, err, this.profiles, xml); + } + } + this.onvif.profiles[0].videoSourceConfiguration!.extension.rotate; + return [{}]; + } +} diff --git a/src/onvif.ts b/src/onvif.ts index 7988da95..b55bc669 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -6,6 +6,7 @@ import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; import { Capabilities, Device } from './device'; +import { Profile } from './media'; /** * Cam constructor options @@ -31,18 +32,18 @@ export interface OnvifOptions { export interface OnvifServices { PTZ?: URL; - media?: URL; - media2?: URL; - imaging?: URL; - events?: URL; + analyticsDevice?: URL; device?: URL; deviceIO?: URL; - search?: URL; display?: URL; + events?: URL; + imaging?: URL; + media2?: URL; + media?: URL; + receiver?: URL; recording?: URL; replay?: URL; - receiver?: URL; - analyticsDevice?: URL; + search?: URL; } export interface OnvifRequestOptions extends RequestOptions{ @@ -106,6 +107,7 @@ export class Onvif extends EventEmitter { public uri: OnvifServices; private timeShift?: number; public capabilities: Capabilities; + public profiles: Profile[]; constructor(options: OnvifOptions) { super(); @@ -122,6 +124,7 @@ export class Onvif extends EventEmitter { this.events = {}; this.uri = {}; this.capabilities = {}; + this.profiles = []; this.device = new Device(this); /** Bind event handling to the `event` event */ this.on('newListener', (name) => { From 80b9f2f7d79a341c4ab20f293727331263df6f52 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 15 Jan 2022 14:33:01 +0300 Subject: [PATCH 011/112] Slice of interfaces work --- src/media.ts | 294 +++++++++++++++++++-------------------------------- 1 file changed, 108 insertions(+), 186 deletions(-) diff --git a/src/media.ts b/src/media.ts index 9bd174e8..bdae7ac9 100644 --- a/src/media.ts +++ b/src/media.ts @@ -1,7 +1,8 @@ -import { isNumber } from 'util'; import { Onvif } from './onvif'; import { linerase } from './utils'; +export type AnyURI = string; + export interface IntRectangle { x: number; y: number; @@ -407,6 +408,97 @@ export interface PTZConfiguration { extension?: PTZConfigurationExtension; } +export interface PTZFilter { + /** `true` if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN) */ + status: boolean; + /** `true` if the metadata stream shall contain the PTZ position */ + position: boolean; +} + +export interface EventSubscription { + filter?: string; + subscriptionPolicy?: any; +} + +export interface MetadataConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType */ + compressionType: string; + /** Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target */ + geoLocation: boolean; + /** Optional parameter to configure if the generated metadata stream should contain shape information as polygon */ + shapePolygon: boolean; + /** Optional element to configure which PTZ related data is to include in the metadata stream */ + PTZStatus?: PTZFilter; + /** + * Optional element to configure the streaming of events. + * A client might be interested in receiving all, none or some of the events produced by the device: + * - To get all events: Include the Events element but do not include a filter + * - To get no events: Do not include the Events element + * - To get only some events: Include the Events element and include a filter in the element + */ + events: EventSubscription; + extension?: any; +} + +export interface AudioOutputConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** Token of the phsycial Audio output */ + outputToken: string; + /** + * An audio channel MAY support different types of audio transmission. + * While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. + * The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which direction is currently active. + * An NVC can switch between different modes by setting the AudioOutputConfiguration. + * The following modes for the Send-Primacy are defined: + * - www.onvif.org/ver20/HalfDuplex/Server The server is allowed to send audio data to the client. + * The client shall not send audio data via the backchannel to the NVT in this mode. + * - www.onvif.org/ver20/HalfDuplex/Client The client is allowed to send audio data via the backchannel to the server. + * The NVT shall not send audio data to the client in this mode. + * - www.onvif.org/ver20/HalfDuplex/Auto It is up to the device how to deal with sending and receiving audio data. + * Acoustic echo cancellation is out of ONVIF scope. + */ + sendPrimacy?: AnyURI; + /** Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRang */ + outputLevel: number; +} + +export interface AudioDecoderConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; +} + +export interface ProfileExtension { + /** Optional configuration of the Audio output */ + audioOutputConfiguration: AudioOutputConfiguration; + /** Optional configuration of the Audio decoder */ + audioDecoderConfiguration: AudioDecoderConfiguration; + extension: any; +} + export interface Profile { /** Unique identifier of the profile */ token: string; @@ -426,191 +518,21 @@ export interface Profile { videoAnalyticsConfiguration?: VideoAnalyticsConfiguration; /** Optional configuration of the pan tilt zoom unit */ PTZConfiguration?: PTZConfiguration; - -// PTZConfiguration - optional; [PTZConfiguration] -// Optional configuration of the pan tilt zoom unit. -// token - required; [ReferenceToken] -// Token that uniquely references this configuration. Length up to 64 characters. -// Name [Name] -// User readable name. Length up to 64 characters. -// UseCount [int] -// Number of internal references currently using this configuration. -// -// This informational parameter is read-only. Deprecated for Media2 Service. -// MoveRamp [int] -// The optional acceleration ramp used by the device when moving. -// PresetRamp [int] -// The optional acceleration ramp used by the device when recalling presets. -// PresetTourRamp [int] -// The optional acceleration ramp used by the device when executing PresetTours. -// NodeToken [ReferenceToken] -// A mandatory reference to the PTZ Node that the PTZ Configuration belongs to. -// DefaultAbsolutePantTiltPositionSpace - optional; [anyURI] -// If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default. -// DefaultAbsoluteZoomPositionSpace - optional; [anyURI] -// If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default. -// DefaultRelativePanTiltTranslationSpace - optional; [anyURI] -// If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default. -// DefaultRelativeZoomTranslationSpace - optional; [anyURI] -// If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default. -// DefaultContinuousPanTiltVelocitySpace - optional; [anyURI] -// If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default. -// DefaultContinuousZoomVelocitySpace - optional; [anyURI] -// If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default. -// DefaultPTZSpeed - optional; [PTZSpeed] -// If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds. -// PanTilt - optional; [Vector2D] -// Pan and tilt speed. The x component corresponds to pan and the y component to tilt. If omitted in a request, the current (if any) PanTilt movement should not be affected. -// Zoom - optional; [Vector1D] -// A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected. -// DefaultPTZTimeout - optional; [duration] -// If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops. -// PanTiltLimits - optional; [PanTiltLimits] -// The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. If the element is present it signals the support for configurable Pan/Tilt limits. If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. The Pan/Tilt limits are disabled by setting the limits to –INF or +INF. -// Range [Space2DDescription] -// A range of pan tilt limits. -// URI [anyURI] -// A URI of coordinate systems. -// XRange [FloatRange] -// A range of x-axis. -// Min [float] -// Max [float] -// YRange [FloatRange] -// A range of y-axis. -// Min [float] -// Max [float] -// ZoomLimits - optional; [ZoomLimits] -// The Zoom limits element should be present for a PTZ Node that supports absolute zoom. If the element is present it signals the supports for configurable Zoom limits. If limits are enabled the zoom movements shall always stay within the specified range. The Zoom limits are disabled by settings the limits to -INF and +INF. -// Range [Space1DDescription] -// A range of zoom limit -// URI [anyURI] -// A URI of coordinate systems. -// XRange [FloatRange] -// A range of x-axis. -// Min [float] -// Max [float] -// Extension - optional; [PTZConfigurationExtension] -// PTControlDirection - optional; [PTControlDirection] -// Optional element to configure PT Control Direction related features. -// EFlip - optional; [EFlip] -// Optional element to configure related parameters for E-Flip. -// Mode [EFlipMode] -// Parameter to enable/disable E-Flip feature. -// - enum { 'OFF', 'ON', 'Extended' } -// Reverse - optional; [Reverse] -// Optional element to configure related parameters for reversing of PT Control Direction. -// Mode [ReverseMode] -// Parameter to enable/disable Reverse feature. -// - enum { 'OFF', 'ON', 'AUTO', 'Extended' } -// Extension - optional; [PTControlDirectionExtension] -// Extension - optional; [PTZConfigurationExtension2] -// MetadataConfiguration - optional; [MetadataConfiguration] -// Optional configuration of the metadata stream. -// token - required; [ReferenceToken] -// Token that uniquely references this configuration. Length up to 64 characters. -// Name [Name] -// User readable name. Length up to 64 characters. -// UseCount [int] -// Number of internal references currently using this configuration. -// -// This informational parameter is read-only. Deprecated for Media2 Service. -// CompressionType [string] -// Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType. -// GeoLocation [boolean] -// Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target. -// ShapePolygon [boolean] -// Optional parameter to configure if the generated metadata stream should contain shape information as polygon. -// PTZStatus - optional; [PTZFilter] -// optional element to configure which PTZ related data is to include in the metadata stream -// Status [boolean] -// True if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN) -// Position [boolean] -// True if the metadata stream shall contain the PTZ position -// Events - optional; [EventSubscription] -// Optional element to configure the streaming of events. A client might be interested in receiving all, none or some of the events produced by the device: -// To get all events: Include the Events element but do not include a filter. -// To get no events: Do not include the Events element. -// To get only some events: Include the Events element and include a filter in the element. -// Filter - optional; [FilterType] -// SubscriptionPolicy - optional; -// Analytics - optional; [boolean] -// Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) -// Multicast [MulticastConfiguration] -// Defines the multicast settings that could be used for video streaming. -// Address [IPAddress] -// The multicast address (if this address is set to 0 no multicast streaming is enaled) -// Type [IPType] -// Indicates if the address is an IPv4 or IPv6 address. -// - enum { 'IPv4', 'IPv6' } -// IPv4Address - optional; [IPv4Address] -// IPv4 address. -// IPv6Address - optional; [IPv6Address] -// IPv6 address -// Port [int] -// The RTP mutlicast destination port. A device may support RTCP. In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) destination port number as defined in the RTSP specification. -// TTL [int] -// In case of IPv6 the TTL value is assumed as the hop limit. Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets from (endlessly) circulating and not limiting scope. In these cases the address contains the scope. -// AutoStart [boolean] -// Read only property signalling that streaming is persistant. Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state. -// SessionTimeout [duration] -// The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) -// AnalyticsEngineConfiguration - optional; [AnalyticsEngineConfiguration] -// Indication which AnalyticsModules shall output metadata. Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration. -// AnalyticsModule - optional, unbounded; [Config] -// Name - required; [string] -// Name of the configuration. -// Type - required; [QName] -// The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements returned by GetSupportedRules and GetSupportedAnalyticsModules command. -// Parameters [ItemList] -// List of configuration parameters as defined in the corresponding description. -// SimpleItem - optional, unbounded; -// Value name pair as defined by the corresponding description. -// Name - required; [string] -// Item name. -// Value - required; [anySimpleType] -// Item value. The type is defined in the corresponding description. -// ElementItem - optional, unbounded; -// Complex value structure. -// Name - required; [string] -// Item name. -// Extension - optional; [ItemListExtension] -// Extension - optional; [AnalyticsEngineConfigurationExtension] -// Extension - optional; [MetadataConfigurationExtension] -// Extension - optional; [ProfileExtension] -// Extensions defined in ONVIF 2.0 -// AudioOutputConfiguration - optional; [AudioOutputConfiguration] -// Optional configuration of the Audio output. -// token - required; [ReferenceToken] -// Token that uniquely references this configuration. Length up to 64 characters. -// Name [Name] -// User readable name. Length up to 64 characters. -// UseCount [int] -// Number of internal references currently using this configuration. -// -// This informational parameter is read-only. Deprecated for Media2 Service. -// OutputToken [ReferenceToken] -// Token of the phsycial Audio output. -// SendPrimacy - optional; [anyURI] -// An audio channel MAY support different types of audio transmission. While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which direction is currently active. An NVC can switch between different modes by setting the AudioOutputConfiguration. -// -// The following modes for the Send-Primacy are defined: -// www.onvif.org/ver20/HalfDuplex/Server The server is allowed to send audio data to the client. The client shall not send audio data via the backchannel to the NVT in this mode. -// www.onvif.org/ver20/HalfDuplex/Client The client is allowed to send audio data via the backchannel to the server. The NVT shall not send audio data to the client in this mode. -// www.onvif.org/ver20/HalfDuplex/Auto It is up to the device how to deal with sending and receiving audio data. -// Acoustic echo cancellation is out of ONVIF scope. -// OutputLevel [int] -// Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRange. -// AudioDecoderConfiguration - optional; [AudioDecoderConfiguration] -// Optional configuration of the Audio decoder. -// token - required; [ReferenceToken] -// Token that uniquely references this configuration. Length up to 64 characters. -// Name [Name] -// User readable name. Length up to 64 characters. -// UseCount [int] -// Number of internal references currently using this configuration. -// -// This informational parameter is read-only. Deprecated for Media2 Service. -// Extension - optional; [ProfileExtension2] + /** Optional configuration of the metadata stream */ + MetadataConfiguration?: MetadataConfiguration; + /** Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) */ + analytics?: boolean; + /** Defines the multicast settings that could be used for video streaming */ + multicast: MulticastConfiguration; + /** The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) */ + sessionTimeout: Duration; + /** + * Indication which AnalyticsModules shall output metadata. + * Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration + */ + analyticsEngineConfiguration?: AnalyticsEngineConfiguration; + /** Extensions defined in ONVIF 2.0 */ + extension?: ProfileExtension; } interface MediaProfile { From c0eaf68370af4bab2f9ec799d60cf8beda038e69 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 15 Jan 2022 16:32:05 +0300 Subject: [PATCH 012/112] `media.getProfiles` method --- src/media.ts | 222 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 169 insertions(+), 53 deletions(-) diff --git a/src/media.ts b/src/media.ts index bdae7ac9..c79dad21 100644 --- a/src/media.ts +++ b/src/media.ts @@ -2,6 +2,8 @@ import { Onvif } from './onvif'; import { linerase } from './utils'; export type AnyURI = string; +export type ReferenceToken = string; +export type Name = string; export interface IntRectangle { x: number; @@ -81,9 +83,9 @@ export interface VideoSourceConfigurationExtension { export interface VideoSourceConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration * This informational parameter is read-only. Deprecated for Media2 Service @@ -100,9 +102,9 @@ export interface VideoSourceConfiguration { export interface AudioSourceConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration * This informational parameter is read-only. Deprecated for Media2 Service @@ -186,9 +188,9 @@ export type Duration = string; export interface VideoEncoderConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -214,7 +216,7 @@ export interface VideoEncoderConfiguration { /** Optional element to configure Mpeg4 related parameters */ MPEG4?: Mpeg4Configuration; /** Optional element to configure H.264 related parameters. */ - H264: H264Configuration; + H264?: H264Configuration; /** Defines the multicast settings that could be used for video streaming */ multicast: MulticastConfiguration; /** The rtsp session timeout for the related video stream */ @@ -223,9 +225,9 @@ export interface VideoEncoderConfiguration { export interface AudioEncoderConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -280,9 +282,9 @@ export interface RuleEngineConfiguration { export interface VideoAnalyticsConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -359,9 +361,9 @@ export interface PTZConfigurationExtension { export interface PTZConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -422,9 +424,9 @@ export interface EventSubscription { export interface MetadataConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -446,21 +448,32 @@ export interface MetadataConfiguration { * - To get only some events: Include the Events element and include a filter in the element */ events: EventSubscription; + /** Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) */ + analytics?: boolean; + /** Defines the multicast settings that could be used for video streaming */ + multicast: MulticastConfiguration; + /** The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) */ + sessionTimeout: Duration; + /** + * Indication which AnalyticsModules shall output metadata. + * Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration + */ + analyticsEngineConfiguration?: AnalyticsEngineConfiguration; extension?: any; } export interface AudioOutputConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. */ useCount: number; /** Token of the phsycial Audio output */ - outputToken: string; + outputToken: ReferenceToken; /** * An audio channel MAY support different types of audio transmission. * While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. @@ -481,9 +494,9 @@ export interface AudioOutputConfiguration { export interface AudioDecoderConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -496,12 +509,12 @@ export interface ProfileExtension { audioOutputConfiguration: AudioOutputConfiguration; /** Optional configuration of the Audio decoder */ audioDecoderConfiguration: AudioDecoderConfiguration; - extension: any; + extension?: any; } export interface Profile { /** Unique identifier of the profile */ - token: string; + token: ReferenceToken; /** A value of true signals that the profile cannot be deleted. Default is false */ fixed: boolean; /** User readable name of the profile */ @@ -519,24 +532,117 @@ export interface Profile { /** Optional configuration of the pan tilt zoom unit */ PTZConfiguration?: PTZConfiguration; /** Optional configuration of the metadata stream */ - MetadataConfiguration?: MetadataConfiguration; - /** Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) */ - analytics?: boolean; + metadataConfiguration?: MetadataConfiguration; + /** Extensions defined in ONVIF 2.0 */ + extension?: ProfileExtension; +} + +export interface VideoRateControl2 { + /** Enforce constant bitrate */ + constantBitRate: boolean; + /** Desired frame rate in fps. The actual rate may be lower due to e.g. performance limitations */ + frameRateLimit: number; + /** the maximum output bitrate in kbps */ + bitrateLimit: number; +} + +export interface VideoEncoder2Configuration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: ReferenceToken; + /** User readable name. Length up to 64 characters */ + name: Name; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount?: number; + /** + * Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. + * An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, + * and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames + */ + govLength: number; + /** The encoder profile as defined in tt:VideoEncodingProfiles */ + profile: string; + /** + * A value of true indicates that frame rate is a fixed value rather than an upper limit, + * and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. + * Default is false. + */ + guaranteedFrameRate: boolean; + /** + * Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types + * https://www.iana.org/assignments/media-types/media-types.xhtml#video + */ + encoding: string; + /** Configured video resolution */ + resolution: VideoResolution; + /** Optional element to configure rate control related parameters. */ + rateControl?: VideoRateControl2; /** Defines the multicast settings that could be used for video streaming */ - multicast: MulticastConfiguration; - /** The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) */ - sessionTimeout: Duration; + mutlicast?: MulticastConfiguration; /** - * Indication which AnalyticsModules shall output metadata. - * Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration + * Relative value for the video quantizers and the quality of the video. + * A high value within supported quality range means higher quality */ - analyticsEngineConfiguration?: AnalyticsEngineConfiguration; - /** Extensions defined in ONVIF 2.0 */ - extension?: ProfileExtension; + quality: number; } -interface MediaProfile { +export interface AudioEncoder2Configuration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: ReferenceToken; + /** User readable name. Length up to 64 characters */ + name: Name; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** + * Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and IANA Media Types + * https://www.iana.org/assignments/media-types/media-types.xhtml#audio + */ + encoding: string; + /** Optional multicast configuration of the audio stream */ + multicast?: MulticastConfiguration; + /** The output bitrate in kbps */ + bitrate: number; + /** The output sample rate in kHz */ + sampleRate: number; +} +export interface ConfigurationSet { + /** Optional configuration of the Video input */ + videoSource?: VideoSourceConfiguration; + /** Optional configuration of the Audio input */ + audioSource?: AudioSourceConfiguration; + /** Optional configuration of the Video encoder */ + videoEncoder?: VideoEncoder2Configuration; + /** Optional configuration of the Audio encoder */ + audioEncoder?: AudioEncoder2Configuration; + /** Optional configuration of the analytics module and rule engine */ + analytics?: VideoAnalyticsConfiguration; + /** Optional configuration of the pan tilt zoom unit */ + PTZ?: PTZConfiguration; + /** Optional configuration of the metadata stream */ + metadata?: MetadataConfiguration; + /** Optional configuration of the Audio output */ + audioOutput?: AudioOutputConfiguration; + /** Optional configuration of the Audio decoder */ + audioDecoder?: AudioDecoderConfiguration; + /** Optional configuration of the Receiver */ + receiver?: any; +} + +export interface MediaProfile { + /** Unique identifier of the profile */ + token: ReferenceToken; + /** A value of true signals that the profile cannot be deleted. Default is false */ + fixed: boolean; + /** User readable name of the profile */ + name: Name; + /** The configurations assigned to the profile */ + configurations: ConfigurationSet; } export class Media { @@ -549,25 +655,25 @@ export class Media { /** * Receive profiles */ - async getProfiles(): Promise<[Profile | MediaProfile]> { + async getProfiles(): Promise<(Profile | MediaProfile)[]> { if (this.onvif.device.media2Support) { // Profile T request using Media2 // The reply is in a different format to the old API so we convert the data from the new API to the old structure // for backwards compatibility with existing users of this library const [data] = await this.onvif.request({ service : 'media2', - body : '' - + 'All' - + '}', + body : 'All', }); // Slight difference in Media1 and Media2 reply XML // Generate a reply that looks like a Media1 reply for existing library users this.onvif.profiles = data[0].getProfilesResponse[0].profiles.map((profile: Record) => { - const tmp = linerase(profile); - const newProfile = {}; - newProfile.$ = tmp.$; // copy Profile Token - newProfile.name = tmp.name; + const tmp = linerase(profile) as MediaProfile; + const newProfile: Profile = { + token : tmp.token, + name : tmp.name, + fixed : tmp.fixed || false, + }; // Media2 Spec says there will be these some or all of these configuration entities // Video source configuration // Audio source configuration @@ -580,22 +686,32 @@ export class Media { // Audio decoder configuration if (tmp.configurations.videoSource) { newProfile.videoSourceConfiguration = tmp.configurations.videoSource; } if (tmp.configurations.audioSource) { newProfile.audioSourceConfiguration = tmp.configurations.audioSource; } - if (tmp.configurations.videoEncoder) { newProfile.videoEncoderConfiguration = tmp.configurations.videoEncoder; } - if (tmp.configurations.audioEncoder) { newProfile.audioEncoderConfiguration = tmp.configurations.audioEncoder; } + if (tmp.configurations.videoEncoder) { + newProfile.videoEncoderConfiguration = tmp.configurations.videoEncoder as unknown as VideoEncoderConfiguration; + } + if (tmp.configurations.audioEncoder) { + newProfile.audioEncoderConfiguration = tmp.configurations.audioEncoder as AudioEncoderConfiguration; + } if (tmp.configurations.PTZ) { newProfile.PTZConfiguration = tmp.configurations.PTZ; } - if (tmp.configurations.analytics) { newProfile.analyticsConfiguration = tmp.configurations.analytics; } + if (tmp.configurations.analytics) { newProfile.videoAnalyticsConfiguration = tmp.configurations.analytics; } if (tmp.configurations.metadata) { newProfile.metadataConfiguration = tmp.configurations.metadata; } - if (tmp.configurations.audioOutput) { newProfile.audioOutputConfiguration = tmp.configurations.audioOutput; } - if (tmp.configurations.audioOutput) { newProfile.audioDecoderConfiguration = tmp.configurations.audioDecoder; } - + if (tmp.configurations.audioOutput || tmp.configurations.audioDecoder) { + newProfile.extension = { + audioOutputConfiguration : tmp.configurations.audioOutput!, + audioDecoderConfiguration : tmp.configurations.audioDecoder!, + }; + } // TODO - Add Audio return newProfile; }); - if (callback) { - callback.call(this, err, this.profiles, xml); - } + return this.onvif.profiles; } - this.onvif.profiles[0].videoSourceConfiguration!.extension.rotate; - return [{}]; + // Original ONVIF Media support (used in Profile S) + const [data] = await this.onvif.request({ + service : 'media', + body : '', + }); + this.onvif.profiles = data[0].getProfilesResponse[0].profiles.map(linerase); + return this.onvif.profiles; } } From 34dfc03575682bbe83bacb6991b5aecc6abde85d Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 15 Jan 2022 21:34:53 +0300 Subject: [PATCH 013/112] `media.getVideoSources` interfaces --- src/media.ts | 304 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/onvif.ts | 4 +- 2 files changed, 301 insertions(+), 7 deletions(-) diff --git a/src/media.ts b/src/media.ts index c79dad21..4d6c4ffc 100644 --- a/src/media.ts +++ b/src/media.ts @@ -645,8 +645,292 @@ export interface MediaProfile { configurations: ConfigurationSet; } +export interface BacklightCompensation { + /** + * Backlight compensation mode (on/off). + * - OFF: Backlight compensation is disabled + * - ON: Backlight compensation is enabled + */ + mode: 'ON' | 'OFF'; + /** Optional level parameter (unit unspecified) */ + level: number; +} + +export interface Rectangle { + x: number; + y: number; + width: number; + height: number; +} + +export interface Exposure { + /** + * Exposure Mode + * - Auto – Enabled the exposure algorithm on the NVT + * - Manual – Disabled exposure algorithm on the NVT + */ + mode: 'AUTO' | 'MANUAL'; + /** The exposure priority mode (low noise/framerate) */ + priority: 'LowNoise' | 'FrameRate'; + /** Rectangular exposure mask */ + window: Rectangle; + /** Minimum value of exposure time range allowed to be used by the algorithm */ + minExposureTime: number; + /** Maximum value of exposure time range allowed to be used by the algorithm */ + maxExposureTime: number; + /** Minimum value of the sensor gain range that is allowed to be used by the algorithm */ + minGain: number; + /** Maximum value of the sensor gain range that is allowed to be used by the algorithm */ + maxGain: number; + /** Minimum value of the iris range allowed to be used by the algorithm */ + minIris: number; + /** Maximum value of the iris range allowed to be used by the algorithm */ + maxIris: number; + /** The fixed exposure time used by the image sensor (μs) */ + exposureTime: number; + /** The fixed gain used by the image sensor (dB) */ + gain: number; + /** The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris */ + iris: number; +} + +export interface FocusConfiguration { + autoFocusMode: 'AUTO' | 'MANUAL'; + defaultSpeed: number; + /** Parameter to set autofocus near limit (unit: meter) */ + nearLimit: number; + /** Parameter to set autofocus far limit (unit: meter). If set to 0.0, infinity will be used */ + farLimit: number; +} + +export interface WideDynamicRange { + /** White dynamic range (on/off) */ + mode: 'OFF' | 'ON'; + /** Optional level parameter (unitless) */ + level: number; +} + +export interface WhiteBalance { + /** Auto whitebalancing mode (auto/manual) */ + mode: 'AUTO' | 'MANUAL'; + /** Rgain (unitless) */ + crGain: number; + /** Bgain (unitless) */ + cbGain: number; +} + +export interface ImagingSettings { + /** Enabled/disabled BLC mode (on/off) */ + backlightCompensation?: BacklightCompensation; + /** Image brightness (unit unspecified) */ + brightness?: number; + /** Color saturation of the image (unit unspecified) */ + colorSaturation?: number + /** Contrast of the image (unit unspecified) */ + contrast?: number; + /** Exposure mode of the device */ + exposure?: Exposure; + /** Focus configuration */ + focus?: FocusConfiguration; + /** Infrared Cutoff Filter settings */ + irCutFilter?: 'ON' | 'OFF' | 'AUTO'; + /** Sharpness of the Video image */ + sharpness?: number; + /** WDR settings */ + wideDynamicRange?: WideDynamicRange; + /** White balance settings */ + whiteBalance?: WhiteBalance; + extension?: any; +} + +export interface BacklightCompensation20 { + /** + * Backlight compensation mode (on/off) + * - OFF: Backlight compensation is disabled + * - ON: Backlight compensation is enabled + */ + mode: 'OFF' | 'ON'; + /** Optional level parameter (unit unspecified) */ + level?: number; +} + +export interface Exposure20 { + /** + * Exposure Mode + * - Auto – Enabled the exposure algorithm on the device + * - Manual – Disabled exposure algorithm on the device + */ + mode: 'AUTO' | 'MANUAL'; + /** The exposure priority mode (low noise/framerate) */ + priority?: 'LowNoise' | 'FrameRate'; + /** Rectangular exposure mask */ + window?: Rectangle; + /** Minimum value of exposure time range allowed to be used by the algorithm */ + minExposureTime?: number; + /** Maximum value of exposure time range allowed to be used by the algorithm */ + maxExposureTime?: number; + /** Minimum value of the sensor gain range that is allowed to be used by the algorithm */ + minGain?: number; + /** Maximum value of the sensor gain range that is allowed to be used by the algorithm */ + maxGain?: number; + /** Minimum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation */ + minIris?: number; + /** Maximum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation */ + maxIris?: number; + /** The fixed exposure time used by the image sensor (μs) */ + exposureTime?: number; + /** The fixed gain used by the image sensor (dB) */ + gain?: number; + /** The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris and positive values map to higher attenuation */ + iris?: number; +} + +export interface FocusConfiguration20 { + /** Zero or more modes as defined in enumeration tt:AFModes */ + AFMode: string[]; + /** + * Mode of auto focus + * - AUTO - The device automatically adjusts focus + * - MANUAL - The device does not automatically adjust focus + * Note: for devices supporting both manual and auto operation at the same time manual operation may be supported + * even if the Mode parameter is set to Auto. + */ + autoFocusMode: 'AUTO' | 'MANUAL'; + defaultSpeed?: number; + /** Parameter to set autofocus near limit (unit: meter) */ + nearLimit?: number; + /** Parameter to set autofocus far limit (unit: meter) */ + farLimit?: number; + extension?: any; +} + +export interface WideDynamicRange20 { + /** Wide dynamic range mode (on/off) */ + mode?: 'OFF' | 'ON'; + /** Optional level parameter (unit unspecified) */ + level?: number; +} + +export interface WhiteBalance20 extends WhiteBalance { + extension: any; +} + +export interface ImageStabilization { + /** Parameter to enable/disable Image Stabilization feature */ + mode: 'OFF' | 'ON' | 'AUTO' | 'Extended'; + /** Optional level parameter (unit unspecified) */ + level?: number; + extension?: any; +} + +export interface IrCutFilterAutoAdjustment { + /** + * Specifies which boundaries to automatically toggle Ir cut filter following parameters are applied to. + * Its options shall be chosen from tt:IrCutFilterAutoBoundaryType + */ + boundaryType: string; + /** + * Adjusts boundary exposure level for toggling Ir cut filter to on/off specified with unitless normalized value + * from +1.0 to -1.0. Zero is default and -1.0 is the darkest adjustment (Unitless). + */ + boundaryOffset?: number; + /** Delay time of toggling Ir cut filter to on/off after crossing of the boundary exposure levels */ + responseTime?: Duration; + extension?: any; +} + +export interface ToneCompensation { + /** Parameter to enable/disable or automatic ToneCompensation feature. Its options shall be chosen from tt:ToneCompensationMode Type */ + mode: string; + /** Optional level parameter specified with unitless normalized value from 0.0 to +1.0 */ + level?: number; + extension?: any; +} + +export interface Defogging { + /** Parameter to enable/disable or automatic Defogging feature. Its options shall be chosen from tt:DefoggingMode Type */ + mode: string; + /** Optional level parameter specified with unitless normalized value from 0.0 to +1.0 */ + level?: number; + extension?: any; +} + +export interface NoiseReduction { + /** + * Level parameter specified with unitless normalized value from 0.0 to +1.0. + * Level=0 means no noise reduction or minimal noise reduction + */ + level: number; +} + +export interface ImagingSettingsExtension203 { + /** Optional element to configure Image Contrast Compensation */ + toneCompensation?: ToneCompensation; + /** Optional element to configure Image Defogging */ + defogging?: Defogging; + /** Optional element to configure Image Noise Reduction */ + noiseReduction?: NoiseReduction; + extension?: any; +} + +export interface ImagingSettingsExtension202 { + /** An optional parameter applied to only auto mode to adjust timing of toggling Ir cut filter */ + irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment; + extension?: ImagingSettingsExtension203; +} + +export interface ImagingSettingsExtension20 { + /** Optional element to configure Image Stabilization feature */ + imageStabilization?: ImageStabilization; + extension?: ImagingSettingsExtension202; +} + +export interface ImagingSettings20 { + /** Enabled/disabled BLC mode (on/off) */ + backlightCompensation?: BacklightCompensation20; + /** Image brightness (unit unspecified) */ + brightness?: number; + /** Color saturation of the image (unit unspecified) */ + colorSaturation?: number; + /** Contrast of the image (unit unspecified) */ + contrast?: number; + /** Exposure mode of the device */ + exposure?: Exposure20; + /** Focus configuration */ + focus?: FocusConfiguration20; + /** Infrared Cutoff Filter settings */ + irCutFilter?: 'ON' | 'OFF' | 'AUTO'; + /** Sharpness of the Video image */ + sharpness?: number; + /** WDR settings */ + wideDynamicRange?: WideDynamicRange20; + /** White balance settings */ + whiteBalance?: WhiteBalance20; + extension?: ImagingSettingsExtension20; +} + +export interface VideoSourceExtension { + /** Optional configuration of the image sensor. To be used if imaging service 2.00 is supported */ + imaging?: ImagingSettings20; + extension?: any; +} + +export interface VideoSource { + /** Unique identifier referencing the physical entity */ + token: ReferenceToken; + /** Frame rate in frames per second */ + framerate: number; + /** Horizontal and vertical resolution */ + resolution: VideoResolution; + /** Optional configuration of the image sensor */ + imaging?: ImagingSettings; + extension?: VideoSourceExtension; +} + export class Media { private onvif: Onvif; + public profiles: Profile[] = []; + public videoSources: VideoSource[] = []; constructor(onvif: Onvif) { this.onvif = onvif; @@ -667,7 +951,7 @@ export class Media { // Slight difference in Media1 and Media2 reply XML // Generate a reply that looks like a Media1 reply for existing library users - this.onvif.profiles = data[0].getProfilesResponse[0].profiles.map((profile: Record) => { + this.profiles = data[0].getProfilesResponse[0].profiles.map((profile: Record) => { const tmp = linerase(profile) as MediaProfile; const newProfile: Profile = { token : tmp.token, @@ -704,14 +988,26 @@ export class Media { // TODO - Add Audio return newProfile; }); - return this.onvif.profiles; + return this.profiles; } // Original ONVIF Media support (used in Profile S) const [data] = await this.onvif.request({ service : 'media', body : '', }); - this.onvif.profiles = data[0].getProfilesResponse[0].profiles.map(linerase); - return this.onvif.profiles; + this.profiles = data[0].getProfilesResponse[0].profiles.map(linerase); + return this.profiles; + } + + async getVideoSources() { + const [data] = await this.onvif.request({ + service : 'media', + body : '', + }); + this.videoSources = linerase(data).getVideoSourcesResponse.videoSources; + // videoSources is an array of video sources, but linerase remove the array if there is only one element inside + // so we convert it back to an array + if (!Array.isArray(this.videoSources)) { this.videoSources = [this.videoSources]; } + return this.videoSources; } } diff --git a/src/onvif.ts b/src/onvif.ts index b55bc669..6b7f8c34 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -107,7 +107,6 @@ export class Onvif extends EventEmitter { public uri: OnvifServices; private timeShift?: number; public capabilities: Capabilities; - public profiles: Profile[]; constructor(options: OnvifOptions) { super(); @@ -124,7 +123,6 @@ export class Onvif extends EventEmitter { this.events = {}; this.uri = {}; this.capabilities = {}; - this.profiles = []; this.device = new Device(this); /** Bind event handling to the `event` event */ this.on('newListener', (name) => { @@ -354,7 +352,7 @@ export class Onvif extends EventEmitter { } catch (error) { await this.device.getCapabilities(); } - // await Promise.all([this.getProfiles(), this.getVideoSources()]); + // await Promise.all([this.media.getProfiles(), this.media.getVideoSources()]); // await this.getActiveSources(); this.emit('connect'); return this; From c8abf39ed5a09abacdc4cfac4cb7320a788672ee Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 16:33:59 +0300 Subject: [PATCH 014/112] `onvif.connect` method --- lib/utils.js | 63 ++++++++++++++++++++++++++++++--------------------- package.json | 1 - src/onvif.ts | 37 ++++++++++++++++++++++-------- tsconfig.json | 3 ++- 4 files changed, 67 insertions(+), 37 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index f56541d9..65a1a255 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -6,9 +6,11 @@ */ const xml2js = require('xml2js') - , numberRE = /^-?([1-9]\d*|0)(\.\d*)?$/ - , dateRE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(.\d+)?Z$/ - , prefixMatch = /(?!xmlns)^.*:/ + ; + + const numberRE = /^-?([1-9]\d*|0)(\.\d*)?$/ + ; const dateRE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(.\d+)?Z$/ + ; const prefixMatch = /(?!xmlns)^.*:/ ; /** @@ -16,27 +18,27 @@ const xml2js = require('xml2js') * @param {object} xml * @returns {object} */ -const linerase = function(xml) { +let linerase = function(xml) { if (Array.isArray(xml)) { if (xml.length > 1) { return xml.map(linerase); - } else { - xml = xml[0]; } + xml = xml[0]; + } if (typeof xml === 'object') { - var obj = {}; - Object.keys(xml).forEach(function(key) { + const obj = {}; + Object.keys(xml).forEach((key) => { obj[key] = linerase(xml[key]); }); return obj; - } else { + } if (xml === 'true') { return true; } if (xml === 'false') { return false; } if (numberRE.test(xml)) { return parseFloat(xml); } if (dateRE.test(xml)) { return new Date(xml); } return xml; - } + }; /** @@ -59,23 +61,23 @@ const parseSOAPString = function(xml, callback) { xml2js.parseString( xml , { - tagNameProcessors: [function(str) { + tagNameProcessors : [function(str) { str = str.replace(prefixMatch, ''); - var secondLetter = str.charAt(1); + const secondLetter = str.charAt(1); if (secondLetter && secondLetter.toUpperCase() !== secondLetter) { return str.charAt(0).toLowerCase() + str.slice(1); - } else { - return str; } + return str; + }] } - , function(err, result) { - if (!result || !result['envelope'] || !result['envelope']['body']) { + , (err, result) => { + if (!result || !result.envelope || !result.envelope.body) { callback(new Error('Wrong ONVIF SOAP response'), null, xml); } else { - if (!err && result['envelope']['body'][0]['fault']) { - var fault = result['envelope']['body'][0]['fault'][0]; - var reason; + if (!err && result.envelope.body[0].fault) { + const fault = result.envelope.body[0].fault[0]; + let reason; try { if (fault.reason[0].text[0]._) { reason = fault.reason[0].text[0]._; @@ -90,7 +92,7 @@ const parseSOAPString = function(xml, callback) { reason = ''; } } - var detail = ''; + let detail = ''; try { detail = fault.detail[0].text[0]; } catch (e) { @@ -98,9 +100,9 @@ const parseSOAPString = function(xml, callback) { } // console.error('Fault:', reason, detail); - err = new Error('ONVIF SOAP Fault: ' + (reason) + (detail)); + err = new Error(`ONVIF SOAP Fault: ${ reason }${detail}`); } - callback(err, result['envelope']['body'], xml); + callback(err, result.envelope.body, xml); } } ); @@ -118,11 +120,20 @@ const s4 = function() { * @returns {string} */ const guid = function() { - return (s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4()); + return (`${s4() + s4() }-${ s4() }-${ s4() }-${ s4() }-${ s4() }${s4() }${s4()}`); }; +const _linerase = linerase; +linerase = (xml) => { + const result = _linerase(xml); + console.log('---------------------------------------------------------------------------------------------'); + console.dir(xml) + console.dir(result); + return result; +} + module.exports = { - linerase: linerase - , parseSOAPString: parseSOAPString - , guid: guid + linerase + , parseSOAPString + , guid }; diff --git a/package.json b/package.json index 129750a7..e958dc02 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "jsdoc": "jsdoc ./lib/*.js --readme ./README.md --destination ./docs", "gh-pages": "jsdoc ./lib/*.js --readme ./README.md --destination ./", "lint": "eslint lib/*.js", - "pretest": "npm run lint", "test": "nyc mocha", "test-on-travis": "nyc npm test && nyc report --reporter=text-lcov | coveralls", "mockserver": "node startServerMockup.js" diff --git a/src/onvif.ts b/src/onvif.ts index 6b7f8c34..0fc113e1 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -6,7 +6,7 @@ import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; import { Capabilities, Device } from './device'; -import { Profile } from './media'; +import { Media, Profile } from './media'; /** * Cam constructor options @@ -25,7 +25,7 @@ export interface OnvifOptions { /** Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections. */ agent?: Agent | boolean; /** Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false. */ - preserveAddress: boolean; + preserveAddress?: boolean; /** Set false if the camera should not connect automatically, defaults false. */ autoConnect?: boolean; } @@ -66,13 +66,22 @@ interface RequestError extends Error { export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. - * @event rawData + * @event rawRequest * @example * ```typescript - * onvif.on('rawData', (xml) => { console.log('request was', xml); }); + * onvif.on('rawRequest', (xml) => { console.log('-> request was', xml); }); * ``` */ static rawRequest: 'rawRequest' = 'rawRequest'; + /** + * Indicates raw xml response from device. + * @event rawResponse + * @example + * ```typescript + * onvif.on('rawResponse', (xml) => { console.log('<- response was', xml); }); + * ``` + */ + static rawResponse: 'rawResponse' = 'rawResponse'; /** * Indicates any warnings * @event warn @@ -92,7 +101,8 @@ export class Onvif extends EventEmitter { */ static error: 'error' = 'error'; - public device: Device; + public readonly device: Device; + public readonly media: Media; public useSecure: boolean; public secureOptions: SecureContextOptions; public hostname: string; @@ -102,7 +112,7 @@ export class Onvif extends EventEmitter { public path: string; public timeout: number; public agent: Agent | boolean; - public preserveAddress: boolean; + public preserveAddress = false; private events: Record; public uri: OnvifServices; private timeShift?: number; @@ -118,12 +128,14 @@ export class Onvif extends EventEmitter { this.port = options.port ?? (options.useSecure ? 443 : 80); this.path = options.path ?? '/onvif/device_service'; this.timeout = options.timeout || 120000; - this.agent = options.agent || false; - this.preserveAddress = options.preserveAddress || false; + this.agent = options.agent ?? false; + this.preserveAddress = options.preserveAddress ?? false; this.events = {}; this.uri = {}; this.capabilities = {}; + this.device = new Device(this); + this.media = new Media(this); /** Bind event handling to the `event` event */ this.on('newListener', (name) => { // if this is the first listener, start pulling subscription @@ -218,6 +230,9 @@ export class Onvif extends EventEmitter { path : options.service ? (this.uri[options.service] ? this.uri[options.service]?.pathname : options.service) : this.path, + port : this.port, + agent : this.agent, // Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections} + timeout : this.timeout, }; requestOptions.headers = { 'Content-Type' : 'application/soap+xml', @@ -342,6 +357,10 @@ export class Onvif extends EventEmitter { } } + async getActiveSources() { + + } + /** * Connect to the camera and fill device information properties */ @@ -352,7 +371,7 @@ export class Onvif extends EventEmitter { } catch (error) { await this.device.getCapabilities(); } - // await Promise.all([this.media.getProfiles(), this.media.getVideoSources()]); + await Promise.all([this.media.getProfiles(), this.media.getVideoSources()]); // await this.getActiveSources(); this.emit('connect'); return this; diff --git a/tsconfig.json b/tsconfig.json index 756d62e5..80dedfc7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,6 +19,7 @@ "node_modules" ], "include": [ - "src/index.ts" + "src/index.ts", + "src/test.ts" ] } From ccb5bdbd6df318720d3a543c3112d7e97e9faf2d Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 16:38:10 +0300 Subject: [PATCH 015/112] Reworked linerase function do add xml atrributes into object instead of `$` property --- src/utils.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 4354db75..8c3786a5 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -16,9 +16,16 @@ export function linerase(xml: any): any { [xml] = xml; } if (typeof xml === 'object') { - const obj: any = {}; + let obj: any = {}; Object.keys(xml).forEach((key) => { - obj[key] = linerase(xml[key]); + if (key === '$') { // for xml attributes + obj = { + ...obj, + ...linerase(xml.$), + }; + } else { + obj[key] = linerase(xml[key]); + } }); return obj; } From 5490edbe0f2511361ea3dab8a5f9891b44392526 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 17:06:52 +0300 Subject: [PATCH 016/112] `onvif.getActiveSources` method --- src/onvif.ts | 77 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 8 deletions(-) diff --git a/src/onvif.ts b/src/onvif.ts index 0fc113e1..f9d294c4 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -117,6 +117,9 @@ export class Onvif extends EventEmitter { public uri: OnvifServices; private timeShift?: number; public capabilities: Capabilities; + public defaultProfiles: Profile[] = []; + public defaultProfile?: Profile; + private activeSources: any; constructor(options: OnvifOptions) { super(); @@ -224,7 +227,7 @@ export class Onvif extends EventEmitter { private async rawRequest(options: OnvifRequestOptions): Promise<[Record, string]> { return new Promise((resolve, reject) => { - let callbackExecuted = false; + let alreadyReturned = false; let requestOptions = { ...options, path : options.service @@ -252,10 +255,10 @@ export class Onvif extends EventEmitter { }); response.on('end', () => { - if (callbackExecuted) { + if (alreadyReturned) { return; } - callbackExecuted = true; + alreadyReturned = true; const xml = Buffer.concat(bufs, length).toString('utf8'); /** * Indicates raw xml response from device. @@ -268,19 +271,19 @@ export class Onvif extends EventEmitter { }); request.setTimeout(this.timeout, () => { - if (callbackExecuted) { + if (alreadyReturned) { return; } - callbackExecuted = true; + alreadyReturned = true; request.destroy(); reject(new Error('Network timeout')); }); request.on('error', (error: RequestError) => { - if (callbackExecuted) { + if (alreadyReturned) { return; } - callbackExecuted = true; + alreadyReturned = true; /* address, port number or IPCam error */ if (error.code === 'ECONNREFUSED' && error.errno === 'ECONNREFUSED' && error.syscall === 'connect') { reject(error); @@ -357,8 +360,66 @@ export class Onvif extends EventEmitter { } } - async getActiveSources() { + /** + * Check and find out video configuration for device + * @private + */ + private async getActiveSources() { + this.media.videoSources.forEach((videoSource, idx) => { + // let's choose first appropriate profile for our video source and make it default + const videoSrcToken = videoSource.token; + const appropriateProfiles = this.media.profiles.filter((profile) => (profile.videoSourceConfiguration + ? profile.videoSourceConfiguration.sourceToken === videoSrcToken + : false) && (profile.videoEncoderConfiguration !== undefined)); + if (appropriateProfiles.length === 0) { + if (idx === 0) { + throw new Error('Unrecognized configuration'); + } else { + return; + } + } + + if (idx === 0) { + [this.defaultProfile] = appropriateProfiles; + } + [this.defaultProfiles[idx]] = appropriateProfiles; + + this.activeSources[idx] = { + sourceToken : videoSource.$.token, + profileToken : this.defaultProfiles[idx].token, + videoSourceConfigurationToken : this.defaultProfiles[idx].videoSourceConfiguration?.token, + }; + if (this.defaultProfiles[idx].videoEncoderConfiguration) { + const configuration = this.defaultProfiles[idx].videoEncoderConfiguration; + this.activeSources[idx].encoding = configuration?.encoding; + this.activeSources[idx].width = configuration?.resolution.width ?? ''; + this.activeSources[idx].height = configuration?.resolution.height ?? ''; + this.activeSources[idx].fps = configuration?.rateControl?.frameRateLimit ?? ''; + this.activeSources[idx].bitrate = configuration?.rateControl?.bitrateLimit ?? ''; + } + + if (idx === 0) { + /** + * Current active video source + * @name Cam#activeSource + * @type {Cam~ActiveSource} + */ + this.activeSource = this.activeSources[idx]; + } + + if (this.defaultProfiles[idx].PTZConfiguration) { + this.activeSources[idx].ptz = { + name : this.defaultProfiles[idx].PTZConfiguration.name, + token : this.defaultProfiles[idx].PTZConfiguration.$.token, + }; + /* + TODO Think about it + if (idx === 0) { + this.defaultProfile.PTZConfiguration = this.activeSources[idx].PTZConfiguration; + } */ + } + }); } /** From 52f6019c9a0cfb7b3bbc79ef1b163627e24cecc6 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 17:42:13 +0300 Subject: [PATCH 017/112] `onvif.getActiveSources` method --- src/onvif.ts | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/onvif.ts b/src/onvif.ts index f9d294c4..606d2a0b 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -6,7 +6,7 @@ import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; import { Capabilities, Device } from './device'; -import { Media, Profile } from './media'; +import { Media, Profile, PTZConfiguration } from './media'; /** * Cam constructor options @@ -63,6 +63,24 @@ interface RequestError extends Error { syscall: string; } +/** + * Information about active video source + */ +export interface ActiveSource { + sourceToken: string; + profileToken: string; + videoSourceConfigurationToken: string; + encoding?: string; + width?: number; + height?: number; + fps?: number; + bitrate?: number; + ptz?: { + name: string; + token: string; + }; +} + export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. @@ -119,7 +137,8 @@ export class Onvif extends EventEmitter { public capabilities: Capabilities; public defaultProfiles: Profile[] = []; public defaultProfile?: Profile; - private activeSources: any; + private activeSources: ActiveSource[] = []; + public activeSource?: ActiveSource; constructor(options: OnvifOptions) { super(); @@ -386,32 +405,27 @@ export class Onvif extends EventEmitter { [this.defaultProfiles[idx]] = appropriateProfiles; this.activeSources[idx] = { - sourceToken : videoSource.$.token, + sourceToken : videoSource.token, profileToken : this.defaultProfiles[idx].token, - videoSourceConfigurationToken : this.defaultProfiles[idx].videoSourceConfiguration?.token, + videoSourceConfigurationToken : this.defaultProfiles[idx].videoSourceConfiguration!.token, }; if (this.defaultProfiles[idx].videoEncoderConfiguration) { const configuration = this.defaultProfiles[idx].videoEncoderConfiguration; this.activeSources[idx].encoding = configuration?.encoding; - this.activeSources[idx].width = configuration?.resolution.width ?? ''; - this.activeSources[idx].height = configuration?.resolution.height ?? ''; - this.activeSources[idx].fps = configuration?.rateControl?.frameRateLimit ?? ''; - this.activeSources[idx].bitrate = configuration?.rateControl?.bitrateLimit ?? ''; + this.activeSources[idx].width = configuration?.resolution.width; + this.activeSources[idx].height = configuration?.resolution.height; + this.activeSources[idx].fps = configuration?.rateControl?.frameRateLimit; + this.activeSources[idx].bitrate = configuration?.rateControl?.bitrateLimit; } if (idx === 0) { - /** - * Current active video source - * @name Cam#activeSource - * @type {Cam~ActiveSource} - */ this.activeSource = this.activeSources[idx]; } if (this.defaultProfiles[idx].PTZConfiguration) { this.activeSources[idx].ptz = { - name : this.defaultProfiles[idx].PTZConfiguration.name, - token : this.defaultProfiles[idx].PTZConfiguration.$.token, + name : this.defaultProfiles[idx].PTZConfiguration!.name, + token : this.defaultProfiles[idx].PTZConfiguration!.token, }; /* TODO Think about it @@ -433,7 +447,7 @@ export class Onvif extends EventEmitter { await this.device.getCapabilities(); } await Promise.all([this.media.getProfiles(), this.media.getVideoSources()]); - // await this.getActiveSources(); + await this.getActiveSources(); this.emit('connect'); return this; } From 9553f2f5785c8295f0f65275d033bd0b3cddeafc Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 17:44:05 +0300 Subject: [PATCH 018/112] Temporary file for tests --- src/test.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test.ts diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 00000000..a4d42911 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,20 @@ +import { Onvif } from './index'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const serverMockup = require('../test/serverMockup'); + +(async () => { + const cam = new Onvif({ + hostname : 'localhost', + username : 'admin', + password : '9999', + port : 10101, + }); + + // cam.on('rawResponse', console.log); + // cam.on('rawRequest', console.log); + await cam.connect(); + const profiles = await cam.media.getProfiles(); + console.log(profiles); + serverMockup.close(); +})().catch(console.error); From 521286316162f74f5830eaf53c959b20c28a5c34 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 20:57:32 +0300 Subject: [PATCH 019/112] Discovery class --- src/discovery.ts | 146 +++++++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 2 + src/onvif.ts | 13 ++++- 3 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 src/discovery.ts diff --git a/src/discovery.ts b/src/discovery.ts new file mode 100644 index 00000000..e88ff1f4 --- /dev/null +++ b/src/discovery.ts @@ -0,0 +1,146 @@ +import { EventEmitter } from 'events'; +import { createSocket, RemoteInfo } from 'dgram'; +import url from 'url'; +import os from 'os'; +import { guid, linerase, parseSOAPString } from './utils'; +import { Onvif } from './onvif'; + +export interface DiscoveryOptions { + /** Timeout in milliseconds for discovery responses, Default 5000 */ + timeout?: number; + /** Set to `false` if you want to omit creating of Cam objects. Default true */ + resolve?: boolean; + /** WS-Discovery message id */ + messageId?: string; + /** Interface to bind on for discovery ex. `eth0` */ + device?: string; + /** Client will listen to discovery data device sent */ + listeningPort?: number; + /** Socket type */ + type?: 'udp4' | 'udp6'; +} + +/** + * Try to find the most suitable record + * Now it is simple ip match + */ +function matchXAddr(xaddrs: URL[], address: string) { + const ipMatch = xaddrs.filter((xaddr) => xaddr.hostname === address); + return ipMatch[0] || xaddrs[0]; +} + +export class Discovery extends EventEmitter { + /** + * Fires when device found + * @event error + * @example + * ```typescript + * discovery.on('device', console.log); + * ``` + */ + static device: 'device' = 'device'; + /** + * Indicates any errors + * @event error + * @example + * ```typescript + * discovery.on('error', console.error); + * ``` + */ + static error: 'error' = 'error'; + + probe(options: DiscoveryOptions): Promise<(Onvif | Record)[]> { + return new Promise((resolve, reject) => { + const cams: Map> = new Map(); + const errors: Error[] = []; + const messageID = `urn:uuid:${options.messageId || guid()}`; + const request = Buffer.from( + '' + + '
' + + `${messageID}` + + 'urn:schemas-xmlsoap-org:ws:2005:04:discovery' + + 'http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe' + + '
' + + '' + + '' + + 'dn:NetworkVideoTransmitter' + + '' + + '' + + '' + + '
', + ); + const socket = createSocket(options.type ?? 'udp4'); + socket.on('error', (err) => { + this.emit('error', err); + }); + + const listener = async (msg: Buffer, rinfo: RemoteInfo) => { + let data; + let xml; + try { + [data, xml] = await parseSOAPString(msg.toString()); + } catch (error) { + errors.push(error as Error); + this.emit('error', error, xml); + return; + } + // TODO check for matching RelatesTo field and messageId + if (!data[0].probeMatches) { + errors.push(new Error(`Wrong SOAP message from ${rinfo.address}:${rinfo.port}\n${xml}`)); + this.emit('error', `Wrong SOAP message from ${rinfo.address}:${rinfo.port}`, xml); + } else { + data = linerase(data); + + // Possible to get multiple matches for the same camera + // when your computer has more than one network adapter in the same subnet + const camAddr = data.probeMatches.probeMatch.endpointReference.address; + if (!cams.has(camAddr)) { + let cam; + if (options.resolve !== false) { + // Create cam with one of the XAddrs uri + const camUris = data.probeMatches.probeMatch.XAddrs.split(' ').map(url.parse); + const camUri = matchXAddr(camUris, rinfo.address); + cam = new Onvif({ + hostname : camUri.hostname, + port : parseInt(camUri.port, 10), + path : camUri.pathname, + urn : camAddr, + }); + } else { + cam = data; + } + cams.set(camAddr, cam); + this.emit('device', cam, rinfo, xml); + } + } + }; + + // If device is specified try to bind to that interface + if (options.device) { + const interfaces = os.networkInterfaces(); + // Try to find the interface based on the device name + if (options.device in interfaces) { + interfaces[options.device]?.forEach((iface) => { + // Only use IPv4 addresses + if (iface.family === 'IPv4') { + socket.bind(options.listeningPort, iface.address); + } + }); + } + } + + socket.on('message', listener); + socket.send(request, 0, request.length, 3702, '239.255.255.250'); + + setTimeout(() => { + socket.removeListener('message', listener); + socket.close(); + if (errors.length === 0) { + resolve(Array.from(cams.values())); + } else { + reject(errors); + } + }, options.timeout || 5000); + }); + } +} diff --git a/src/index.ts b/src/index.ts index 98614c71..af7d9004 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,4 @@ export * from './onvif'; export * from './device'; +export * from './media'; +export * from './discovery'; diff --git a/src/onvif.ts b/src/onvif.ts index 606d2a0b..0c798176 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -6,7 +6,7 @@ import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; import { Capabilities, Device } from './device'; -import { Media, Profile, PTZConfiguration } from './media'; +import { Media, Profile } from './media'; /** * Cam constructor options @@ -22,6 +22,7 @@ export interface OnvifOptions { port?: number; path?: string; timeout?: number; + urn?: string; /** Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections. */ agent?: Agent | boolean; /** Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false. */ @@ -119,6 +120,14 @@ export class Onvif extends EventEmitter { */ static error: 'error' = 'error'; + /** + * Core device namespace for device v1.0 methods + * @example + * ```typescript + * const date = await onvif.device.getSystemDateAndTime(); + * console.log(date.toLocaleString()); + * ``` + */ public readonly device: Device; public readonly media: Media; public useSecure: boolean; @@ -139,6 +148,7 @@ export class Onvif extends EventEmitter { public defaultProfile?: Profile; private activeSources: ActiveSource[] = []; public activeSource?: ActiveSource; + public readonly urn?: string; constructor(options: OnvifOptions) { super(); @@ -150,6 +160,7 @@ export class Onvif extends EventEmitter { this.port = options.port ?? (options.useSecure ? 443 : 80); this.path = options.path ?? '/onvif/device_service'; this.timeout = options.timeout || 120000; + this.urn = options.urn; this.agent = options.agent ?? false; this.preserveAddress = options.preserveAddress ?? false; this.events = {}; From d6caec0cc67e2a62eb812bf893d6597d6044c340 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 21:21:18 +0300 Subject: [PATCH 020/112] Discovery class --- .eslintrc.js | 1 + src/discovery.ts | 4 +++- src/test.ts | 5 ++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 95c1e625..0c0ada64 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -15,6 +15,7 @@ const commonRules = { 'max-len' : ['warn', 200], 'class-methods-use-this' : 0, 'no-nested-ternary' : 0, + 'no-use-before-define' : 0, 'key-spacing' : ['error', { afterColon : true, beforeColon : true, diff --git a/src/discovery.ts b/src/discovery.ts index e88ff1f4..c117a741 100644 --- a/src/discovery.ts +++ b/src/discovery.ts @@ -29,7 +29,7 @@ function matchXAddr(xaddrs: URL[], address: string) { return ipMatch[0] || xaddrs[0]; } -export class Discovery extends EventEmitter { +class DiscoverySingleton extends EventEmitter { /** * Fires when device found * @event error @@ -144,3 +144,5 @@ export class Discovery extends EventEmitter { }); } } + +export const Discovery = new DiscoverySingleton(); diff --git a/src/test.ts b/src/test.ts index a4d42911..b724a02e 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,4 +1,4 @@ -import { Onvif } from './index'; +import { Onvif, Discovery } from './index'; // eslint-disable-next-line @typescript-eslint/no-var-requires const serverMockup = require('../test/serverMockup'); @@ -16,5 +16,8 @@ const serverMockup = require('../test/serverMockup'); await cam.connect(); const profiles = await cam.media.getProfiles(); console.log(profiles); + Discovery.on('device', console.log); + const cams = await Discovery.probe({ timeout : 1000 }); + // console.log(cams); serverMockup.close(); })().catch(console.error); From e7355ce5587c2c1cbc79eb92d3fc52b9cd2ffc57 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 18 Jan 2022 12:21:51 +0300 Subject: [PATCH 021/112] Discovery singleton --- package-lock.json | 80 +++++++++++++++++++++++------------------------ src/discovery.ts | 72 ++++++++++++++++++++++++++++++++++++++++-- src/onvif.ts | 1 + 3 files changed, 110 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9fba4842..bfce5889 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3210,9 +3210,9 @@ } }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "node_modules/json-schema-traverse": { @@ -3255,18 +3255,18 @@ "dev": true }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/keypress": { @@ -3397,12 +3397,12 @@ } }, "node_modules/marked": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", - "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", + "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", "dev": true, "bin": { - "marked": "bin/marked" + "marked": "bin/marked.js" }, "engines": { "node": ">= 12" @@ -4479,9 +4479,9 @@ } }, "node_modules/shiki": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", - "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", + "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", "dev": true, "dependencies": { "jsonc-parser": "^3.0.0", @@ -4820,16 +4820,16 @@ } }, "node_modules/typedoc": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.10.tgz", - "integrity": "sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==", + "version": "0.22.11", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", + "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", "dev": true, "dependencies": { "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^3.0.8", + "marked": "^4.0.10", "minimatch": "^3.0.4", - "shiki": "^0.9.12" + "shiki": "^0.10.0" }, "bin": { "typedoc": "bin/typedoc" @@ -7436,9 +7436,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -7475,14 +7475,14 @@ "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -7583,9 +7583,9 @@ } }, "marked": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", - "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", + "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", "dev": true }, "merge2": { @@ -8367,9 +8367,9 @@ "dev": true }, "shiki": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", - "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", + "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", "dev": true, "requires": { "jsonc-parser": "^3.0.0", @@ -8630,16 +8630,16 @@ } }, "typedoc": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.10.tgz", - "integrity": "sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==", + "version": "0.22.11", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", + "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", "dev": true, "requires": { "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^3.0.8", + "marked": "^4.0.10", "minimatch": "^3.0.4", - "shiki": "^0.9.12" + "shiki": "^0.10.0" } }, "typescript": { diff --git a/src/discovery.ts b/src/discovery.ts index c117a741..67abf8db 100644 --- a/src/discovery.ts +++ b/src/discovery.ts @@ -29,10 +29,14 @@ function matchXAddr(xaddrs: URL[], address: string) { return ipMatch[0] || xaddrs[0]; } -class DiscoverySingleton extends EventEmitter { +/** + * Class for `Discovery` singleton + */ +export class DiscoverySingleton extends EventEmitter { /** * Fires when device found - * @event error + * @param onvif Onvif instance {@link Onvif} or just information object about found device + * @event device * @example * ```typescript * discovery.on('device', console.log); @@ -41,6 +45,7 @@ class DiscoverySingleton extends EventEmitter { static device: 'device' = 'device'; /** * Indicates any errors + * @param error Error instance or array of error instances from {@link Error} * @event error * @example * ```typescript @@ -49,6 +54,46 @@ class DiscoverySingleton extends EventEmitter { */ static error: 'error' = 'error'; + private static instance?: DiscoverySingleton; + + public static get getInstance(): DiscoverySingleton { + if (!DiscoverySingleton.instance) { + DiscoverySingleton.instance = new DiscoverySingleton(); + } + return DiscoverySingleton.instance; + } + + // eslint-disable-next-line no-useless-constructor + private constructor() { + super(); + } + + /** + * Discover NVT devices in the subnetwork + * @param {object} [options] + * @param {number} [options.timeout=5000] timeout in milliseconds for discovery responses + * @param {boolean} [options.resolve=true] set to `false` if you want omit creating of Cam objects + * @param {string} [options.messageId=GUID] WS-Discovery message id + * @param {string} [options.device=defaultroute] Interface to bind on for discovery ex. `eth0` + * @param {number} [options.listeningPort=null] client will listen to discovery data device sent + * @example + * ```typescript + * import { Discovery } from 'onvif'; + * Discovery.on('device', async (cam) => { + * // function would be called as soon as NVT responses + * cam.username = ; + * cam.password = ; + * await cam.connect(); + * }) + * Discovery.probe(); + * ``` + * @example + * import { Discovery } from 'onvif'; + * (async () => { + * const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect()); + * console.log(await cams[0]?.getSystemDateAndTime()); + * })(); + */ probe(options: DiscoveryOptions): Promise<(Onvif | Record)[]> { return new Promise((resolve, reject) => { const cams: Map> = new Map(); @@ -145,4 +190,25 @@ class DiscoverySingleton extends EventEmitter { } } -export const Discovery = new DiscoverySingleton(); +/** + * Singleton for the discovery to provide `probe` method + * {@link Discovery.probe} + * @example + * ```typescript + * import { Discovery } from 'onvif'; + * Discovery.on('device', async (cam) => { + * // function would be called as soon as NVT responses + * cam.username = ; + * cam.password = ; + * await cam.connect(); + * }) + * Discovery.probe(); + * ``` + * @example + * import { Discovery } from 'onvif'; + * (async () => { + * const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect()); + * console.log(await cams[0]?.getSystemDateAndTime()); + * })(); + */ +export const Discovery = DiscoverySingleton.getInstance; diff --git a/src/onvif.ts b/src/onvif.ts index 0c798176..7cac04f9 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -112,6 +112,7 @@ export class Onvif extends EventEmitter { static warn: 'warn' = 'warn'; /** * Indicates any errors + * @param error Error instance from {@link Error} * @event error * @example * ```typescript From 96894e2f39110b6229744676c71f1f7b5e84f81a Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 18 Jan 2022 13:20:43 +0300 Subject: [PATCH 022/112] `getDeviceInformation` method --- src/device.ts | 19 +++++++++++++++++++ src/onvif.ts | 3 ++- src/test.ts | 7 ++++--- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/device.ts b/src/device.ts index 0fff409d..dd4b6fd4 100644 --- a/src/device.ts +++ b/src/device.ts @@ -364,4 +364,23 @@ export class Device { } return this.onvif.capabilities; } + + async getDeviceInformation(): Promise { + const [data] = await this.onvif.request({ body : '' }); + this.onvif.deviceInformation = linerase(data).getDeviceInformationResponse; + return this.onvif.deviceInformation!; + } +} + +export interface DeviceInformation { + /** The manufactor of the device */ + manufacturer: string; + /** The device model */ + model: string; + /** The firmware version in the device */ + firmwareVersion: string; + /** The serial number of the device */ + serialNumber: string; + /** The hardware ID of the device */ + hardwareId: string; } diff --git a/src/onvif.ts b/src/onvif.ts index 7cac04f9..b628e179 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -5,7 +5,7 @@ import http from 'http'; import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; -import { Capabilities, Device } from './device'; +import { Capabilities, Device, DeviceInformation } from './device'; import { Media, Profile } from './media'; /** @@ -150,6 +150,7 @@ export class Onvif extends EventEmitter { private activeSources: ActiveSource[] = []; public activeSource?: ActiveSource; public readonly urn?: string; + public deviceInformation?: DeviceInformation; constructor(options: OnvifOptions) { super(); diff --git a/src/test.ts b/src/test.ts index b724a02e..4559d0be 100644 --- a/src/test.ts +++ b/src/test.ts @@ -15,9 +15,10 @@ const serverMockup = require('../test/serverMockup'); // cam.on('rawRequest', console.log); await cam.connect(); const profiles = await cam.media.getProfiles(); - console.log(profiles); - Discovery.on('device', console.log); - const cams = await Discovery.probe({ timeout : 1000 }); + console.log((await cam.device.getDeviceInformation()).firmwareVersion); + // console.log(profiles); + // Discovery.on('device', console.log); + // const cams = await Discovery.probe({ timeout : 1000 }); // console.log(cams); serverMockup.close(); })().catch(console.error); From 237c037ad2a271b7cccfd87919916da39cff5db0 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 21 Jan 2022 20:30:31 +0300 Subject: [PATCH 023/112] `getHostname` method --- .eslintrc.js | 2 +- IMPLEMENTED.md | 103 +++++++++++++++++++++++++++++++++++++++++++++++++ src/device.ts | 15 +++++++ src/test.ts | 1 + 4 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 IMPLEMENTED.md diff --git a/.eslintrc.js b/.eslintrc.js index 0c0ada64..6659d27d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,5 +1,5 @@ const commonRules = { - 'no-console' : 1, + 'no-console' : 'warn', 'import/extensions' : 0, 'quote-props' : 0, 'import/prefer-default-export' : 0, diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md new file mode 100644 index 00000000..c129c3d0 --- /dev/null +++ b/IMPLEMENTED.md @@ -0,0 +1,103 @@ +# Implemented methods and properties in typescript + +- [ ] activeSource +- [ ] activeSources +- [ ] capabilities +- [ ] defaultProfile +- [ ] defaultProfiles +- [ ] events +- [ ] preserveAddress +- [ ] profiles +- [ ] profiles +- [ ] recordingItem +- [ ] scopes +- [ ] services +- [ ] uri +- [ ] uri +- [ ] videoSources +- [ ] xaddrs +- [ ] absoluteMove +- [ ] addAudioEncoderConfiguration +- [ ] addAudioSourceConfiguration +- [ ] addVideoEncoderConfiguration +- [ ] addVideoSourceConfiguration +- [ ] connect +- [ ] continuousMove +- [ ] createOSD +- [ ] createProfile +- [ ] createPullPointSubscription +- [ ] createUsers +- [ ] deleteOSD +- [ ] deleteProfile +- [ ] deleteUsers +- [ ] getAudioEncoderConfiguration +- [ ] getAudioEncoderConfigurationOptions +- [ ] getAudioEncoderConfigurations +- [ ] getAudioOutputConfigurations +- [ ] getAudioOutputs +- [ ] getAudioSourceConfigurations +- [ ] getAudioSources +- [x] getCapabilities +- [ ] getConfigurationOptions +- [ ] getConfigurations +- [ ] getCurrentImagingPreset +- [x] getDeviceInformation +- [ ] getDNS +- [ ] getEventProperties +- [ ] getEventServiceCapabilities +- [ ] getHostname +- [ ] getImagingServiceCapabilities +- [ ] getImagingSettings +- [ ] getMediaServiceCapabilities +- [ ] getNetworkDefaultGateway +- [ ] getNetworkInterfaces +- [ ] getNetworkProtocols +- [ ] getNodes +- [ ] getNTP +- [ ] getOSDOptions +- [ ] getOSDs +- [ ] getPresets +- [ ] getProfiles +- [ ] getRecordings +- [ ] getReplayUri +- [ ] getScopes +- [ ] getServiceCapabilities +- [x] getServices +- [ ] getSnapshotUri +- [ ] getStatus +- [ ] getStreamUri +- [x] getSystemDateAndTime +- [ ] getUsers +- [ ] getVideoEncoderConfiguration +- [ ] getVideoEncoderConfigurationOptions +- [ ] getVideoEncoderConfigurations +- [ ] getVideoSourceConfigurations +- [ ] getVideoSourceOptions +- [ ] getVideoSources +- [ ] gotoHomePosition +- [ ] gotoPreset +- [ ] pullMessages +- [ ] relativeMove +- [ ] removeAudioEncoderConfiguration +- [ ] removeAudioSourceConfiguration +- [ ] removePreset +- [ ] renew +- [ ] setAudioEncoderConfiguration +- [ ] setCurrentImagingPreset +- [ ] setDNS +- [ ] setHomePosition +- [ ] setImagingSettings +- [ ] setNetworkDefaultGateway +- [ ] setNetworkInterfaces +- [ ] setNTP +- [ ] setOSD +- [ ] setPreset +- [ ] setScopes +- [ ] setSystemDateAndTime +- [ ] setSystemFactoryDefault +- [ ] setUsers +- [ ] setVideoEncoderConfiguration +- [ ] stop +- [ ] subscribe +- [ ] systemReboot +- [ ] unsubscribe diff --git a/src/device.ts b/src/device.ts index dd4b6fd4..bf69b45d 100644 --- a/src/device.ts +++ b/src/device.ts @@ -280,6 +280,14 @@ export interface Capabilities { extension?: CapabilitiesExtension; } +interface HostnameInformation { + /** Indicates whether the hostname is obtained from DHCP or not */ + fromDHCP: boolean; + /** Indicates the hostname */ + name?: string; + extension?: any; +} + /** * Device methods */ @@ -370,6 +378,13 @@ export class Device { this.onvif.deviceInformation = linerase(data).getDeviceInformationResponse; return this.onvif.deviceInformation!; } + + async getHostname(): Promise { + const [data] = await this.onvif.request({ + body : '', + }); + return linerase(data).getHostnameResponse.hostnameInformation; + } } export interface DeviceInformation { diff --git a/src/test.ts b/src/test.ts index 4559d0be..16cbcdb3 100644 --- a/src/test.ts +++ b/src/test.ts @@ -16,6 +16,7 @@ const serverMockup = require('../test/serverMockup'); await cam.connect(); const profiles = await cam.media.getProfiles(); console.log((await cam.device.getDeviceInformation()).firmwareVersion); + console.log((await cam.device.getHostname())); // console.log(profiles); // Discovery.on('device', console.log); // const cams = await Discovery.probe({ timeout : 1000 }); From e5e1fde5d87fe3b9280e51f0e57972a64b7bbd9a Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 22 Jan 2022 16:12:59 +0300 Subject: [PATCH 024/112] Slice of work --- IMPLEMENTED.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md index c129c3d0..69cedee7 100644 --- a/IMPLEMENTED.md +++ b/IMPLEMENTED.md @@ -45,7 +45,7 @@ - [ ] getDNS - [ ] getEventProperties - [ ] getEventServiceCapabilities -- [ ] getHostname +- [x] getHostname - [ ] getImagingServiceCapabilities - [ ] getImagingSettings - [ ] getMediaServiceCapabilities From 3fcbcc4940431b8ad7d8f173290699f48bec9524 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 22 Jan 2022 16:14:18 +0300 Subject: [PATCH 025/112] Slice of work --- IMPLEMENTED.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md index 69cedee7..f889c120 100644 --- a/IMPLEMENTED.md +++ b/IMPLEMENTED.md @@ -1,21 +1,19 @@ # Implemented methods and properties in typescript -- [ ] activeSource -- [ ] activeSources -- [ ] capabilities -- [ ] defaultProfile -- [ ] defaultProfiles +- [x] activeSource +- [x] activeSources +- [x] capabilities +- [x] defaultProfile +- [x] defaultProfiles - [ ] events -- [ ] preserveAddress -- [ ] profiles -- [ ] profiles +- [x] preserveAddress +- [x] profiles - [ ] recordingItem - [ ] scopes -- [ ] services -- [ ] uri -- [ ] uri -- [ ] videoSources -- [ ] xaddrs +- [x] services +- [x] uri +- [x] videoSources +- [x] xaddrs - [ ] absoluteMove - [ ] addAudioEncoderConfiguration - [ ] addAudioSourceConfiguration From 11c760ffe327aa051fae9425ea9cd04845916a54 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Thu, 6 Oct 2022 02:13:44 +0300 Subject: [PATCH 026/112] Update libraries --- ._eslintrc.json | 78 ----------- package-lock.json | 335 +++++++++++++++++++++++++--------------------- package.json | 6 +- src/device.ts | 4 +- 4 files changed, 188 insertions(+), 235 deletions(-) delete mode 100644 ._eslintrc.json diff --git a/._eslintrc.json b/._eslintrc.json deleted file mode 100644 index 8740328e..00000000 --- a/._eslintrc.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "extends": ["eslint:recommended", "plugin:node/recommended"], - "env": { - "node": true, - "mocha": true - }, - "rules": { - "node/no-deprecated-api": 0, - "no-console": 0, - "no-param-reassign": 0, - "no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_" - } - ], - "object-curly-newline": [ - "error", - { - "ObjectPattern": { - "multiline": true - } - } - ], - "strict": 0, - "curly": [ - 2, - "all" - ], - "keyword-spacing": [ - 2, - {} - ], - "space-before-function-paren": [ - 2, - "never" - ], - "no-spaced-func": 2, - "space-infix-ops": 2, - "space-unary-ops": [ - 2, - { - "words": false, - "nonwords": false - } - ], - "no-with": 2, - "brace-style": [ - 2, - "1tbs", - { - "allowSingleLine": true - } - ], - "key-spacing": [ - 2, - { - "beforeColon": false, - "afterColon": true - } - ], - "indent": [ - 2, - "tab", - { - "SwitchCase": 1 - } - ], - "no-mixed-spaces-and-tabs": 2, - "camelcase": [ - 2, - { - "properties": "never" - } - ], - "semi": "error" - } -} diff --git a/package-lock.json b/package-lock.json index bfce5889..3d38d935 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,13 +27,13 @@ "eslint-plugin-prettier": "^4.0.0", "ip": "^1.1.5", "keypress": "^0.2.1", - "mocha": "^9.1.3", + "mocha": "^10.0.0", "mocha-lcov-reporter": "^1.3.0", "nimble": "^0.0.2", "nyc": "^15.1.0", "prettier": "^2.5.1", - "typedoc": "^0.22.10", - "typescript": "^4.5.4" + "typedoc": "^0.23.15", + "typescript": "^4.8.4" }, "engines": { "node": ">=6.0" @@ -1257,10 +1257,16 @@ } }, "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "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", @@ -1424,9 +1430,9 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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" @@ -2564,15 +2570,6 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3249,9 +3246,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "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/jsprim": { @@ -3397,9 +3394,9 @@ } }, "node_modules/marked": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", - "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -3464,48 +3461,46 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14.0.0" }, "funding": { "type": "opencollective", @@ -3527,24 +3522,13 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "node_modules/mocha/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": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "balanced-match": "^1.0.0" } }, "node_modules/mocha/node_modules/js-yaml": { @@ -3559,6 +3543,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3587,9 +3583,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -4479,14 +4475,14 @@ } }, "node_modules/shiki": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", - "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", + "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", "dev": true, "dependencies": { "jsonc-parser": "^3.0.0", "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" + "vscode-textmate": "^6.0.0" } }, "node_modules/side-channel": { @@ -4820,31 +4816,51 @@ } }, "node_modules/typedoc": { - "version": "0.22.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", - "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", + "version": "0.23.15", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.15.tgz", + "integrity": "sha512-x9Zu+tTnwxb9YdVr+zvX7LYzyBl1nieOr6lrSHbHsA22/RJK2m4Y525WIg5Mj4jWCmfL47v6f4hUzY7EIuwS5w==", "dev": true, "dependencies": { - "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^4.0.10", - "minimatch": "^3.0.4", - "shiki": "^0.10.0" + "marked": "^4.0.19", + "minimatch": "^5.1.0", + "shiki": "^0.11.1" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { - "node": ">= 12.10.0" + "node": ">= 14.14" }, "peerDependencies": { - "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x" + "typescript": "4.6.x || 4.7.x || 4.8.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": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -4909,15 +4925,15 @@ } }, "node_modules/vscode-oniguruma": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", - "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", + "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", "dev": true }, "node_modules/vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", + "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", "dev": true }, "node_modules/which": { @@ -4967,9 +4983,9 @@ } }, "node_modules/workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "node_modules/wrap-ansi": { @@ -5991,9 +6007,9 @@ } }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "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", @@ -6133,9 +6149,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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" @@ -6978,12 +6994,6 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -7469,9 +7479,9 @@ } }, "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "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 }, "jsprim": { @@ -7583,9 +7593,9 @@ } }, "marked": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", - "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", "dev": true }, "merge2": { @@ -7629,38 +7639,36 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -7672,18 +7680,13 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "balanced-match": "^1.0.0" } }, "js-yaml": { @@ -7695,6 +7698,15 @@ "argparse": "^2.0.1" } }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -7725,9 +7737,9 @@ "dev": true }, "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, "natural-compare": { @@ -8367,14 +8379,14 @@ "dev": true }, "shiki": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", - "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", + "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", "dev": true, "requires": { "jsonc-parser": "^3.0.0", "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" + "vscode-textmate": "^6.0.0" } }, "side-channel": { @@ -8630,22 +8642,41 @@ } }, "typedoc": { - "version": "0.22.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", - "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", + "version": "0.23.15", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.15.tgz", + "integrity": "sha512-x9Zu+tTnwxb9YdVr+zvX7LYzyBl1nieOr6lrSHbHsA22/RJK2m4Y525WIg5Mj4jWCmfL47v6f4hUzY7EIuwS5w==", "dev": true, "requires": { - "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^4.0.10", - "minimatch": "^3.0.4", - "shiki": "^0.10.0" + "marked": "^4.0.19", + "minimatch": "^5.1.0", + "shiki": "^0.11.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": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true }, "unbox-primitive": { @@ -8693,15 +8724,15 @@ } }, "vscode-oniguruma": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", - "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", + "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", "dev": true }, "vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", + "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", "dev": true }, "which": { @@ -8739,9 +8770,9 @@ "dev": true }, "workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "wrap-ansi": { diff --git a/package.json b/package.json index e958dc02..17b7b77d 100644 --- a/package.json +++ b/package.json @@ -70,12 +70,12 @@ "eslint-plugin-prettier": "^4.0.0", "ip": "^1.1.5", "keypress": "^0.2.1", - "mocha": "^9.1.3", + "mocha": "^10.0.0", "mocha-lcov-reporter": "^1.3.0", "nimble": "^0.0.2", "nyc": "^15.1.0", "prettier": "^2.5.1", - "typedoc": "^0.22.10", - "typescript": "^4.5.4" + "typedoc": "^0.23.15", + "typescript": "^4.8.4" } } diff --git a/src/device.ts b/src/device.ts index bf69b45d..2bf4ba6d 100644 --- a/src/device.ts +++ b/src/device.ts @@ -261,9 +261,9 @@ export interface DeviceCapabilities { export interface AnalyticsCapabilities { /** Analytics service URI */ XAddr: string; - /** Indicates whether or not rules are supported */ + /** Indicates whether rules are supported */ ruleSupport: boolean; - /** Indicates whether or not modules are supported */ + /** Indicates whether modules are supported */ analyticsModuleSupport: boolean; } From b79421dcebd01e9deb45ffe023763cf110e1dab3 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 9 Jan 2022 22:16:19 +0300 Subject: [PATCH 027/112] Initial commit --- .eslintrc.json => ._eslintrc.json | 0 .eslintrc.js | 59 + .gitignore | 1 + .prettierignore | 1 + .prettierrc | 8 + package-lock.json | 2387 ++++++++++++++++++++++++++++- package.json | 14 +- src/cam.ts | 11 + src/index.ts | 3 + tsconfig.json | 24 + typedoc.json | 4 + 11 files changed, 2435 insertions(+), 77 deletions(-) rename .eslintrc.json => ._eslintrc.json (100%) create mode 100644 .eslintrc.js create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 src/cam.ts create mode 100644 src/index.ts create mode 100644 tsconfig.json create mode 100644 typedoc.json diff --git a/.eslintrc.json b/._eslintrc.json similarity index 100% rename from .eslintrc.json rename to ._eslintrc.json diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..e44ed2a6 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,59 @@ +const commonRules = { + 'no-console': 1, + 'import/extensions': 0, + 'quote-props': 0, + 'import/prefer-default-export': 0, + 'no-await-in-loop': 0, + 'no-restricted-syntax': 0, + 'max-classes-per-file': 0, + 'no-underscore-dangle': 0, + 'no-unused-expressions': 0, + 'no-case-declarations': 0, + 'no-shadow': 0, + 'import/no-cycle': 0, // IMPORTANT +}; + +module.exports = { + plugins: ['@typescript-eslint'], + extends: [ + 'airbnb-base', + 'prettier', + ], + env: { + node: true, + jest: true, + }, + rules: commonRules, + + overrides: [ + { + files: ['*.ts'], + extends: [ + 'airbnb-base', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + ], + rules: { + ...commonRules, + + '@typescript-eslint/camelcase': 0, + '@typescript-eslint/interface-name-prefix': 0, + + '@typescript-eslint/no-explicit-any': 0, // TRY: Remove this + '@typescript-eslint/ban-ts-ignore': 0, // TRY: Remove this + }, + + settings: { + 'import/extensions': ['.ts'], + 'import/parsers': { + '@typescript-eslint/parser': ['.ts'], + }, + 'import/resolver': { + node: { + extensions: ['.ts', '.d.ts', '.js'], + }, + }, + }, + }, + ], +}; diff --git a/.gitignore b/.gitignore index 2911b09f..d5d765b7 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ test.js cam_tests experiments docs +build diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..378eac25 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +build diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..172f059f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "singleQuote": true, + "semi": true, + "trailingComma": "all", + "arrowParens": "always", + "endOfLine": "lf", + "printWidth": 80 +} diff --git a/package-lock.json b/package-lock.json index e16ea8a3..3ab71809 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,16 +13,25 @@ "xml2js": "^0.4.23" }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.9.0", + "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", "dot": "^1.1.3", - "eslint": "^8.3.0", + "eslint": "^8.6.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.4", "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^4.0.0", "ip": "^1.1.5", "keypress": "^0.2.1", "mocha": "^9.1.3", "mocha-lcov-reporter": "^1.3.0", "nimble": "^0.0.2", - "nyc": "^15.1.0" + "nyc": "^15.1.0", + "prettier": "^2.5.1", + "typedoc": "^0.22.10", + "typescript": "^4.5.4" }, "engines": { "node": ">=6.0" @@ -447,14 +456,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -485,12 +494,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -599,6 +608,268 @@ "node": ">=8" } }, + "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/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", + "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.9.0", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/type-utils": "5.9.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "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/eslint-plugin/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/@typescript-eslint/experimental-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", + "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "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/experimental-utils/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/@typescript-eslint/experimental-utils/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/@typescript-eslint/parser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", + "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "debug": "^4.3.2" + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", + "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0" + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", + "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.9.0", + "debug": "^4.3.2", + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", + "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", + "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "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/visitor-keys": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", + "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.9.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -606,9 +877,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -728,6 +999,51 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -857,6 +1173,19 @@ "node": ">=8" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "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", @@ -1005,6 +1334,12 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -1118,6 +1453,18 @@ "node": ">=8" } }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1136,6 +1483,18 @@ "node": ">=0.3.1" } }, + "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", @@ -1194,6 +1553,57 @@ "node": ">=8.6" } }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "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", @@ -1222,13 +1632,13 @@ } }, "node_modules/eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", - "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", + "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -1239,7 +1649,7 @@ "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.1.0", - "espree": "^9.1.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1276,6 +1686,154 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/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/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", @@ -1319,6 +1877,60 @@ "node": ">=4" } }, + "node_modules/eslint-plugin-import": { + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", + "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.12.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "node_modules/eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", @@ -1381,6 +1993,27 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-scope": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", @@ -1449,12 +2082,12 @@ } }, "node_modules/espree": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", - "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "dependencies": { - "acorn": "^8.6.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^3.1.0" }, @@ -1538,6 +2171,40 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz", + "integrity": "sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ==", + "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", @@ -1550,6 +2217,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "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/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1741,6 +2417,20 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -1750,6 +2440,22 @@ "node": ">=8.0.0" } }, + "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/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -1806,6 +2512,35 @@ "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/globby/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/graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -1856,13 +2591,49 @@ "node": ">= 0.4.0" } }, - "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==", + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "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-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "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": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/hasha": { @@ -1979,12 +2750,38 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "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/ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "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", @@ -1997,6 +2794,34 @@ "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-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -2009,6 +2834,21 @@ "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-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2039,6 +2879,18 @@ "node": ">=0.10.0" } }, + "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", @@ -2048,6 +2900,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -2057,6 +2924,31 @@ "node": ">=8" } }, + "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.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "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", @@ -2069,6 +2961,36 @@ "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", @@ -2087,6 +3009,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -2259,9 +3193,9 @@ } }, "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "node_modules/json-schema-traverse": { @@ -2297,19 +3231,25 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, + "engines": [ + "node >=0.6.0" + ], "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.4.0", + "json-schema": "0.2.3", "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" } }, "node_modules/keypress": { @@ -2409,6 +3349,12 @@ "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/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2433,6 +3379,40 @@ "semver": "bin/semver.js" } }, + "node_modules/marked": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 12" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", @@ -2467,9 +3447,9 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "node_modules/mocha": { @@ -2838,6 +3818,73 @@ "node": "*" } }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "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.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.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", @@ -2975,6 +4022,15 @@ "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/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -3072,6 +4128,30 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -3117,6 +4197,26 @@ "node": ">=0.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", @@ -3231,6 +4331,16 @@ "node": ">=4" } }, + "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", @@ -3246,6 +4356,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "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/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3324,8 +4457,33 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "engines": { - "node": ">=8" + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", + "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-oniguruma": "^1.6.1", + "vscode-textmate": "5.2.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": { @@ -3334,6 +4492,15 @@ "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "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.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -3405,6 +4572,32 @@ "node": ">=8" } }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "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", @@ -3504,6 +4697,60 @@ "node": ">=0.8" } }, + "node_modules/tsconfig-paths": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/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/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3555,6 +4802,56 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typedoc": { + "version": "0.22.10", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.10.tgz", + "integrity": "sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==", + "dev": true, + "dependencies": { + "glob": "^7.2.0", + "lunr": "^2.3.9", + "marked": "^3.0.8", + "minimatch": "^3.0.4", + "shiki": "^0.9.12" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 12.10.0" + }, + "peerDependencies": { + "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x" + } + }, + "node_modules/typescript": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3594,6 +4891,18 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vscode-oniguruma": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", + "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3609,6 +4918,22 @@ "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", @@ -4080,14 +5405,14 @@ } }, "@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -4114,12 +5439,12 @@ } }, "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } @@ -4200,6 +5525,165 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@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" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", + "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/type-utils": "5.9.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", + "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/parser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", + "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", + "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", + "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", + "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", + "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", + "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "eslint-visitor-keys": "^3.0.0" + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -4207,9 +5691,9 @@ "dev": true }, "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, "acorn-jsx": { @@ -4296,6 +5780,36 @@ "sprintf-js": "~1.0.2" } }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "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 + }, + "array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -4400,6 +5914,16 @@ "write-file-atomic": "^3.0.0" } }, + "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", @@ -4514,6 +6038,12 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -4600,6 +6130,15 @@ "strip-bom": "^4.0.0" } }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4612,6 +6151,15 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "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", @@ -4658,6 +6206,45 @@ "ansi-colors": "^4.1.1" } }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "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", @@ -4677,13 +6264,13 @@ "dev": true }, "eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", - "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", + "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -4694,7 +6281,7 @@ "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.1.0", - "espree": "^9.1.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4734,8 +6321,126 @@ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^2.0.1" + "argparse": "^2.0.1" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "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 + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true } } }, @@ -4766,6 +6471,53 @@ } } }, + "eslint-plugin-import": { + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", + "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.12.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", @@ -4809,6 +6561,15 @@ } } }, + "eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, "eslint-scope": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", @@ -4843,12 +6604,12 @@ "dev": true }, "espree": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", - "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "requires": { - "acorn": "^8.6.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^3.1.0" } @@ -4907,6 +6668,36 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz", + "integrity": "sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ==", + "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", @@ -4919,6 +6710,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "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" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5050,12 +6850,33 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "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-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" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -5097,6 +6918,28 @@ "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" + }, + "dependencies": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + } + } + }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -5134,12 +6977,33 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "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-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "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", @@ -5225,12 +7089,32 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "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" + } + }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "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", @@ -5240,6 +7124,22 @@ "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-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, "is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -5249,6 +7149,15 @@ "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-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5270,24 +7179,73 @@ "is-extglob": "^2.1.1" } }, + "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.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, + "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.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "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", @@ -5300,6 +7258,15 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "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": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5437,9 +7404,9 @@ "dev": true }, "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-schema-traverse": { @@ -5469,15 +7436,21 @@ "minimist": "^1.2.5" } }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.4.0", + "json-schema": "0.2.3", "verror": "1.10.0" } }, @@ -5554,6 +7527,12 @@ "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 + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -5571,6 +7550,28 @@ } } }, + "marked": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", @@ -5596,9 +7597,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mocha": { @@ -5885,6 +7886,52 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "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.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5986,6 +8033,12 @@ "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 + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -6058,6 +8111,21 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -6091,6 +8159,12 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "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", @@ -6180,6 +8254,12 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "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", @@ -6189,6 +8269,15 @@ "glob": "^7.1.3" } }, + "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" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -6245,12 +8334,40 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shiki": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", + "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", + "dev": true, + "requires": { + "jsonc-parser": "^3.0.0", + "vscode-oniguruma": "^1.6.1", + "vscode-textmate": "5.2.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.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "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.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -6305,6 +8422,26 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -6377,6 +8514,50 @@ "punycode": "^2.1.1" } }, + "tsconfig-paths": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "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" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -6416,6 +8597,37 @@ "is-typedarray": "^1.0.0" } }, + "typedoc": { + "version": "0.22.10", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.10.tgz", + "integrity": "sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==", + "dev": true, + "requires": { + "glob": "^7.2.0", + "lunr": "^2.3.9", + "marked": "^3.0.8", + "minimatch": "^3.0.4", + "shiki": "^0.9.12" + } + }, + "typescript": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6448,6 +8660,18 @@ "extsprintf": "^1.2.0" } }, + "vscode-oniguruma": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", + "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "dev": true + }, + "vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6457,6 +8681,19 @@ "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", diff --git a/package.json b/package.json index d74ed488..7fdd3d8a 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "description": "Client to ONVIF NVT devices Profile S: cameras", "main": "lib/onvif.js", "scripts": { + "build": "tsc --build tsconfig.json", "jsdoc": "jsdoc ./lib/*.js --readme ./README.md --destination ./docs", "gh-pages": "jsdoc ./lib/*.js --readme ./README.md --destination ./", "lint": "eslint lib/*.js", @@ -55,15 +56,24 @@ "node": ">=6.0" }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.9.0", + "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", "dot": "^1.1.3", - "eslint": "^8.3.0", + "eslint": "^8.6.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.4", "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^4.0.0", + "ip": "^1.1.5", "keypress": "^0.2.1", "mocha": "^9.1.3", "mocha-lcov-reporter": "^1.3.0", "nimble": "^0.0.2", "nyc": "^15.1.0", - "ip": "^1.1.5" + "prettier": "^2.5.1", + "typedoc": "^0.22.10", + "typescript": "^4.5.4" } } diff --git a/src/cam.ts b/src/cam.ts new file mode 100644 index 00000000..b5c577fb --- /dev/null +++ b/src/cam.ts @@ -0,0 +1,11 @@ +export default class Cam { + private name: string; + + constructor() { + this.name = 'Cam'; + } + + getName() { + return this.name; + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..44ab1d54 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +import Cam from './cam'; + +export { Cam }; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..756d62e5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "module": "CommonJS", + "target": "ES2020", + "sourceMap": true, + "strict": true, + "outDir": "build", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": false, + "noUnusedParameters": true, + "skipLibCheck": true, + "watch": true, + "declaration": true + }, + "exclude": [ + "node_modules" + ], + "include": [ + "src/index.ts" + ] +} diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 00000000..d09a5343 --- /dev/null +++ b/typedoc.json @@ -0,0 +1,4 @@ +{ + "mode": "file", + "out": "docs" +} From efd0a851a51ad50e99dd7bec953230a12260c7bc Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 11 Jan 2022 18:22:39 +0300 Subject: [PATCH 028/112] Slice of work --- .eslintrc.js | 78 ++++++++++++++----------- .prettierrc | 2 +- package-lock.json | 13 +++++ package.json | 2 + src/cam.ts | 142 ++++++++++++++++++++++++++++++++++++++++++++-- src/index.ts | 4 +- typedoc.json | 1 - 7 files changed, 198 insertions(+), 44 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index e44ed2a6..6cdc5eee 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,56 +1,68 @@ const commonRules = { - 'no-console': 1, - 'import/extensions': 0, - 'quote-props': 0, - 'import/prefer-default-export': 0, - 'no-await-in-loop': 0, - 'no-restricted-syntax': 0, - 'max-classes-per-file': 0, - 'no-underscore-dangle': 0, - 'no-unused-expressions': 0, - 'no-case-declarations': 0, - 'no-shadow': 0, - 'import/no-cycle': 0, // IMPORTANT + 'no-console' : 1, + 'import/extensions' : 0, + 'quote-props' : 0, + 'import/prefer-default-export' : 0, + 'no-await-in-loop' : 0, + 'no-restricted-syntax' : 0, + 'max-classes-per-file' : 0, + 'no-underscore-dangle' : 0, + 'no-unused-expressions' : 0, + 'no-case-declarations' : 0, + 'no-shadow' : 0, + 'brace-style' : ['error', 'stroustrup'], + 'lines-between-class-members' : 0, + 'max-len' : ['warn', 120], + 'no-nested-ternary' : 0, + 'key-spacing' : ['error', { + afterColon : true, + beforeColon : true, + align : { + beforeColon : true, + afterColon : true, + on : 'colon', + }, + }], + 'import/no-cycle' : 0, // IMPORTANT }; module.exports = { - plugins: ['@typescript-eslint'], - extends: [ + plugins : ['@typescript-eslint'], + extends : [ 'airbnb-base', 'prettier', ], - env: { - node: true, - jest: true, + env : { + node : true, + jest : true, }, - rules: commonRules, + rules : commonRules, - overrides: [ + overrides : [ { - files: ['*.ts'], - extends: [ + files : ['*.ts'], + extends : [ 'airbnb-base', 'plugin:@typescript-eslint/eslint-recommended', 'plugin:@typescript-eslint/recommended', ], - rules: { + rules : { ...commonRules, - '@typescript-eslint/camelcase': 0, - '@typescript-eslint/interface-name-prefix': 0, + '@typescript-eslint/interface-name-prefix' : 0, - '@typescript-eslint/no-explicit-any': 0, // TRY: Remove this - '@typescript-eslint/ban-ts-ignore': 0, // TRY: Remove this + '@typescript-eslint/no-explicit-any' : 0, // TRY: Remove this + '@typescript-eslint/ban-ts-ignore' : 0, // TRY: Remove this }, - settings: { - 'import/extensions': ['.ts'], - 'import/parsers': { - '@typescript-eslint/parser': ['.ts'], + settings : { + 'import/extensions' : ['.ts'], + 'import/parsers' : { + '@typescript-eslint/parser' : ['.ts'], }, - 'import/resolver': { - node: { - extensions: ['.ts', '.d.ts', '.js'], + 'import/resolver' : { + node : { + extensions : ['.ts', '.d.ts', '.js'], }, }, }, diff --git a/.prettierrc b/.prettierrc index 172f059f..f8e1636f 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,5 +4,5 @@ "trailingComma": "all", "arrowParens": "always", "endOfLine": "lf", - "printWidth": 80 + "printWidth": 120 } diff --git a/package-lock.json b/package-lock.json index 3ab71809..3bbb35f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "xml2js": "^0.4.23" }, "devDependencies": { + "@types/node": "^17.0.8", "@typescript-eslint/eslint-plugin": "^5.9.0", "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", @@ -655,6 +656,12 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "node_modules/@types/node": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==", + "dev": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", @@ -5563,6 +5570,12 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/node": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", diff --git a/package.json b/package.json index 7fdd3d8a..f6ace241 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "main": "lib/onvif.js", "scripts": { "build": "tsc --build tsconfig.json", + "typedoc": "typedoc src", "jsdoc": "jsdoc ./lib/*.js --readme ./README.md --destination ./docs", "gh-pages": "jsdoc ./lib/*.js --readme ./README.md --destination ./", "lint": "eslint lib/*.js", @@ -56,6 +57,7 @@ "node": ">=6.0" }, "devDependencies": { + "@types/node": "^17.0.8", "@typescript-eslint/eslint-plugin": "^5.9.0", "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", diff --git a/src/cam.ts b/src/cam.ts index b5c577fb..d40028cf 100644 --- a/src/cam.ts +++ b/src/cam.ts @@ -1,11 +1,141 @@ -export default class Cam { - private name: string; +import { EventEmitter } from 'events'; +import { SecureContextOptions } from 'tls'; +import https, { Agent, RequestOptions } from 'https'; +import http from 'http'; +import { Buffer } from 'buffer'; - constructor() { - this.name = 'Cam'; +/** + * Cam constructor options + */ +export interface CamOptions { + /** Set true if using `https` protocol, defaults to false. */ + useSecure?: boolean; + /** Set options for https like ca, cert, ciphers, rejectUnauthorized, secureOptions, secureProtocol, etc. */ + secureOptions?: SecureContextOptions; + hostname: string; + username?: string; + password?: string; + port?: number; + path?: string; + timeout?: number; + /** Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections. */ + agent?: Agent | boolean; + /** Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false. */ + preserveAddress: boolean; + /** Set false if the camera should not connect automatically. */ + autoConnect?: boolean; +} + +type CamServices = { + PTZ?: URL, + media?: URL, + imaging?: URL, + events?: URL, + device?: URL, +} + +interface CamRequestOptions extends RequestOptions{ + /** Name of service (ptz, media, etc) */ + service?: keyof CamServices; + /** SOAP body */ + body: string; + /** Defines another url to request */ + url?: string; + /** Make request to PTZ uri or not */ + ptz?: boolean; +} + +export class Cam extends EventEmitter { + public useSecure: boolean; + public secureOptions: SecureContextOptions; + public hostname: string; + public username?: string; + public password?: string; + public port: number; + public path: string; + public timeout: number; + public agent: Agent | boolean; + public preserveAddress: boolean; + private events: Record; + private uri: CamServices; + + constructor(options: CamOptions) { + super(); + this.useSecure = options.useSecure ?? false; + this.secureOptions = options.secureOptions ?? {}; + this.hostname = options.hostname; + this.username = options.username; + this.password = options.password; + this.port = options.port ?? (options.useSecure ? 443 : 80); + this.path = options.path ?? '/onvif/device_service'; + this.timeout = options.timeout || 120000; + this.agent = options.agent || false; + this.preserveAddress = options.preserveAddress || false; + this.events = {}; + this.uri = {}; + /** Bind event handling to the `event` event */ + this.on('newListener', (name) => { + // if this is the first listener, start pulling subscription + if (name === 'event' && this.listeners(name).length === 0) { + setImmediate(() => { + // this._eventRequest(); TODO bring back + }); + } + }); + if (options.autoConnect !== false) { + setImmediate(() => { + this.connect(); + }); + } + } + + private async request(options: CamRequestOptions) { + return new Promise((resolve, reject) => { + let callbackExecuted = false; + let requestOptions = { + ...options, + path : options.service + ? (this.uri[options.service] ? this.uri[options.service]?.pathname : options.service) + : this.path, + }; + requestOptions.headers = { + 'Content-Type' : 'application/soap+xml', + 'Content-Length' : Buffer.byteLength(options.body, 'utf8'), // options.body.length chinese will be wrong here + charset : 'utf-8', + }; + requestOptions.method = 'POST'; + const httpLibrary = this.useSecure ? https : http; + requestOptions = this.useSecure ? { ...requestOptions, ...this.secureOptions } : requestOptions; + const request = httpLibrary.request(requestOptions, (response) => { + const bufs: Buffer[] = []; + let length = 0; + response.on('data', (chunk) => { + bufs.push(chunk); + length += chunk.length; + }); + response.on('end', () => { + if (callbackExecuted) { + return; + } + callbackExecuted = true; + const xml = Buffer.concat(bufs, length).toString('utf8'); + /** + * Indicates raw xml response from device. + * @event Cam#rawResponse + * @type {string} + */ + this.emit('rawResponse', xml); + parseSOAPString(xml, callback); + }); + }); + }); } - getName() { - return this.name; + /** + * Connect to the camera and fill device information properties + */ + async connect() { + // await this.getSystemDateAndTime(); + // await this.getServices(); } } diff --git a/src/index.ts b/src/index.ts index 44ab1d54..5db41e67 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1 @@ -import Cam from './cam'; - -export { Cam }; +export * from './cam'; diff --git a/typedoc.json b/typedoc.json index d09a5343..612df6fb 100644 --- a/typedoc.json +++ b/typedoc.json @@ -1,4 +1,3 @@ { - "mode": "file", "out": "docs" } From c2b47a8264bbccb18470615f4d011104e9d2cd61 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 11 Jan 2022 19:31:47 +0300 Subject: [PATCH 029/112] utils.ts --- .eslintrc.js | 2 +- package-lock.json | 19 +++++++++ package.json | 1 + src/utils.ts | 101 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 src/utils.ts diff --git a/.eslintrc.js b/.eslintrc.js index 6cdc5eee..98b29831 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -10,7 +10,7 @@ const commonRules = { 'no-unused-expressions' : 0, 'no-case-declarations' : 0, 'no-shadow' : 0, - 'brace-style' : ['error', 'stroustrup'], + 'brace-style' : ["error", "1tbs", { "allowSingleLine" : true }], 'lines-between-class-members' : 0, 'max-len' : ['warn', 120], 'no-nested-ternary' : 0, diff --git a/package-lock.json b/package-lock.json index 3bbb35f7..9fba4842 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ }, "devDependencies": { "@types/node": "^17.0.8", + "@types/xml2js": "^0.4.9", "@typescript-eslint/eslint-plugin": "^5.9.0", "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", @@ -662,6 +663,15 @@ "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==", "dev": true }, + "node_modules/@types/xml2js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", + "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", @@ -5576,6 +5586,15 @@ "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==", "dev": true }, + "@types/xml2js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", + "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", diff --git a/package.json b/package.json index f6ace241..4515ddcb 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ }, "devDependencies": { "@types/node": "^17.0.8", + "@types/xml2js": "^0.4.9", "@typescript-eslint/eslint-plugin": "^5.9.0", "@typescript-eslint/parser": "^5.9.0", "coveralls": "^3.1.1", diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 00000000..3cbeef64 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,101 @@ +import xml2js from 'xml2js'; + +const numberRE = /^-?([1-9]\d*|0)(\.\d*)?$/; +const dateRE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(.\d+)?Z$/; +const prefixMatch = /(?!xmlns)^.*:/; + +/** + * Parse SOAP object to pretty JS-object + */ +export function linerase(xml: any): any { + if (Array.isArray(xml)) { + if (xml.length > 1) { + return xml.map(linerase); + } + // eslint-disable-next-line no-param-reassign + [xml] = xml; + } + if (typeof xml === 'object') { + const obj: any = {}; + Object.keys(xml).forEach((key) => { + obj[key] = linerase(xml[key]); + }); + return obj; + } + if (xml === 'true') { + return true; + } + if (xml === 'false') { + return false; + } + if (numberRE.test(xml)) { + return parseFloat(xml); + } + if (dateRE.test(xml)) { + return new Date(xml); + } + return xml; +} + +function s4() { + // eslint-disable-next-line no-bitwise + return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); +} + +/** + * Generate GUID + * @returns {string} + */ +export function guid() { + return (`${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`); +} + +/** + * Parse SOAP response + */ +export async function parseSOAPString(rawXml: string) { + /* Filter out xml name spaces */ + const xml = rawXml.replace(/xmlns([^=]*?)=(".*?")/g, ''); + + const result = await xml2js.parseStringPromise(xml, { + tagNameProcessors : [(tag) => { + const str = tag.replace(prefixMatch, ''); + const secondLetter = str.charAt(1); + if (secondLetter && secondLetter.toUpperCase() !== secondLetter) { + return str.charAt(0).toLowerCase() + str.slice(1); + } + return str; + }], + }); + if (!result || !result.envelope || !result.envelope.body) { + throw new Error('Wrong ONVIF SOAP response'); + } + if (result.envelope.body[0].fault) { + const fault = result.envelope.body[0].fault[0]; + let reason; + try { + if (fault.reason[0].text[0]._) { + reason = fault.reason[0].text[0]._; + } + } catch (e) { + reason = ''; + } + if (!reason) { + try { + reason = JSON.stringify(linerase(fault.code[0])); + } catch (e) { + reason = ''; + } + } + let detail = ''; + try { + [detail] = fault.detail[0].text; + } catch (e) { + detail = ''; + } + + // console.error('Fault:', reason, detail); + throw new Error(`ONVIF SOAP Fault: ${reason}${detail}`); + } + return result.envelope.body; +} From 2e01d102aca83bcaf8625c672c98af7bc9ea7c99 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 11 Jan 2022 23:30:13 +0300 Subject: [PATCH 030/112] Slice of work --- .eslintrc.js | 9 +-- src/cam.ts | 160 +++++++++++++++++++++++++++++++++++++++++++++++++-- src/utils.ts | 6 +- 3 files changed, 163 insertions(+), 12 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 98b29831..95c1e625 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -12,7 +12,8 @@ const commonRules = { 'no-shadow' : 0, 'brace-style' : ["error", "1tbs", { "allowSingleLine" : true }], 'lines-between-class-members' : 0, - 'max-len' : ['warn', 120], + 'max-len' : ['warn', 200], + 'class-methods-use-this' : 0, 'no-nested-ternary' : 0, 'key-spacing' : ['error', { afterColon : true, @@ -50,9 +51,9 @@ module.exports = { ...commonRules, '@typescript-eslint/interface-name-prefix' : 0, - - '@typescript-eslint/no-explicit-any' : 0, // TRY: Remove this - '@typescript-eslint/ban-ts-ignore' : 0, // TRY: Remove this + '@typescript-eslint/no-non-null-assertion' : 0, + '@typescript-eslint/no-explicit-any' : 0, // TRY: Remove this + '@typescript-eslint/ban-ts-ignore' : 0, // TRY: Remove this }, settings : { diff --git a/src/cam.ts b/src/cam.ts index d40028cf..971d70a6 100644 --- a/src/cam.ts +++ b/src/cam.ts @@ -3,6 +3,8 @@ import { SecureContextOptions } from 'tls'; import https, { Agent, RequestOptions } from 'https'; import http from 'http'; import { Buffer } from 'buffer'; +import crypto from 'crypto'; +import { linerase, parseSOAPString } from './utils'; /** * Cam constructor options @@ -26,7 +28,7 @@ export interface CamOptions { autoConnect?: boolean; } -type CamServices = { +export type CamServices = { PTZ?: URL, media?: URL, imaging?: URL, @@ -34,7 +36,7 @@ type CamServices = { device?: URL, } -interface CamRequestOptions extends RequestOptions{ +export interface CamRequestOptions extends RequestOptions{ /** Name of service (ptz, media, etc) */ service?: keyof CamServices; /** SOAP body */ @@ -45,6 +47,12 @@ interface CamRequestOptions extends RequestOptions{ ptz?: boolean; } +interface RequestError extends Error { + code: string; + errno: string; + syscall: string; +} + export class Cam extends EventEmitter { public useSecure: boolean; public secureOptions: SecureContextOptions; @@ -58,6 +66,13 @@ export class Cam extends EventEmitter { public preserveAddress: boolean; private events: Record; private uri: CamServices; + private timeShift: number | undefined; + + /** + * Indicates raw xml request to device. + * @event rawData + */ + static rawRequest: 'rawRequest' = 'rawRequest'; constructor(options: CamOptions) { super(); @@ -89,7 +104,60 @@ export class Cam extends EventEmitter { } } - private async request(options: CamRequestOptions) { + /** + * Envelope header for all SOAP messages + * @param openHeader + * @private + */ + private envelopeHeader(openHeader = false) { + let header = '' + + ''; + // Only insert Security if there is a username and password + if (this.username && this.password) { + const req = this.passwordDigest(); + header += '' + + '' + + `${this.username}` + + `${req.passdigest}` + + `${req.nonce}` + + `${req.timestamp}` + + '' + + ''; + } + if (!(openHeader !== undefined && openHeader)) { + header += '' + + ''; + } + return header; + } + + /** + * Envelope footer for all SOAP messages + * @private + */ + private envelopeFooter() { + return '' + + ''; + } + + private passwordDigest() { + const timestamp = (new Date((process.uptime() * 1000) + (this.timeShift || 0))).toISOString(); + const nonce = Buffer.allocUnsafe(16); + nonce.writeUIntLE(Math.ceil(Math.random() * 0x100000000), 0, 4); + nonce.writeUIntLE(Math.ceil(Math.random() * 0x100000000), 4, 4); + nonce.writeUIntLE(Math.ceil(Math.random() * 0x100000000), 8, 4); + nonce.writeUIntLE(Math.ceil(Math.random() * 0x100000000), 12, 4); + const cryptoDigest = crypto.createHash('sha1'); + cryptoDigest.update(Buffer.concat([nonce, Buffer.from(timestamp, 'ascii'), Buffer.from(this.password!, 'ascii')])); + const passdigest = cryptoDigest.digest('base64'); + return { + passdigest, + nonce : nonce.toString('base64'), + timestamp, + }; + } + + private async request(options: CamRequestOptions): Promise<[Record, string]> { return new Promise((resolve, reject) => { let callbackExecuted = false; let requestOptions = { @@ -109,10 +177,12 @@ export class Cam extends EventEmitter { const request = httpLibrary.request(requestOptions, (response) => { const bufs: Buffer[] = []; let length = 0; + response.on('data', (chunk) => { bufs.push(chunk); length += chunk.length; }); + response.on('end', () => { if (callbackExecuted) { return; @@ -125,9 +195,38 @@ export class Cam extends EventEmitter { * @type {string} */ this.emit('rawResponse', xml); - parseSOAPString(xml, callback); + resolve(parseSOAPString(xml)); }); }); + + request.setTimeout(this.timeout, () => { + if (callbackExecuted) { + return; + } + callbackExecuted = true; + request.destroy(); + reject(new Error('Network timeout')); + }); + + request.on('error', (error: RequestError) => { + if (callbackExecuted) { + return; + } + callbackExecuted = true; + /* address, port number or IPCam error */ + if (error.code === 'ECONNREFUSED' && error.errno === 'ECONNREFUSED' && error.syscall === 'connect') { + reject(error); + /* network error */ + } else if (error.code === 'ECONNRESET' && error.errno === 'ECONNRESET' && error.syscall === 'read') { + reject(error); + } else { + reject(error); + } + }); + + this.emit('rawRequest', options.body); + request.write(options.body); + request.end(); }); } @@ -135,7 +234,58 @@ export class Cam extends EventEmitter { * Connect to the camera and fill device information properties */ async connect() { - // await this.getSystemDateAndTime(); + await this.getSystemDateAndTime(); // await this.getServices(); } + + private setupSystemDateAndTime(data: any) { + const systemDateAndTime = data[0].getSystemDateAndTimeResponse[0].systemDateAndTime[0]; + const dateTime = systemDateAndTime.UTCDateTime || systemDateAndTime.localDateTime; + let time; + if (dateTime === undefined) { + // Seen on a cheap Chinese camera from GWellTimes-IPC. Use the current time. + time = new Date(); + } else { + const dt = linerase(dateTime[0]); + time = new Date(Date.UTC(dt.date.year, dt.date.month - 1, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second)); + } + if (!this.timeShift) { + this.timeShift = time.getTime() - (process.uptime() * 1000); + } + return time; + } + + /** + * Receive date and time from cam + */ + async getSystemDateAndTime() { + // The ONVIF spec says this should work without a Password as we need to know any difference in the + // remote NVT's time relative to our own time clock (called the timeShift) before we can calculate the + // correct timestamp in nonce SOAP Authentication header. + // But.. Panasonic and Digital Barriers both have devices that implement ONVIF that only work with + // authenticated getSystemDateAndTime. So for these devices we need to do an authenticated getSystemDateAndTime. + // As 'timeShift' is not set, the local clock MUST be set to the correct time AND the NVT/Camera MUST be set + // to the correct time if the camera implements Replay Attack Protection (eg Axis) + const [data, xml] = await this.request({ + // Try the Unauthenticated Request first. Do not use this._envelopeHeader() as we don't have timeShift yet. + body : + '' + + '' + + '' + + '' + + '', + }); + try { + return this.setupSystemDateAndTime(data); + } catch (error) { + if (xml && xml.toLowerCase().includes('sender not authorized')) { + // Try again with a Username and Password + const [data] = await this.request({ + body : `${this.envelopeHeader()}${this.envelopeFooter()}`, + }); + return this.setupSystemDateAndTime(data); + } + throw error; + } + } } diff --git a/src/utils.ts b/src/utils.ts index 3cbeef64..09f09c8c 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -53,7 +53,7 @@ export function guid() { /** * Parse SOAP response */ -export async function parseSOAPString(rawXml: string) { +export async function parseSOAPString(rawXml: string): Promise<[Record, string]> { /* Filter out xml name spaces */ const xml = rawXml.replace(/xmlns([^=]*?)=(".*?")/g, ''); @@ -87,7 +87,7 @@ export async function parseSOAPString(rawXml: string) { reason = ''; } } - let detail = ''; + let detail; try { [detail] = fault.detail[0].text; } catch (e) { @@ -97,5 +97,5 @@ export async function parseSOAPString(rawXml: string) { // console.error('Fault:', reason, detail); throw new Error(`ONVIF SOAP Fault: ${reason}${detail}`); } - return result.envelope.body; + return [result.envelope.body, xml]; } From 7cae47814198b759c5baf335b5b2f93a5307be14 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Wed, 12 Jan 2022 14:14:12 +0300 Subject: [PATCH 031/112] Slice of work --- src/cam.ts | 102 +++++++++++++++++++++++++++++++++++++++++++++------ src/utils.ts | 4 +- 2 files changed, 94 insertions(+), 12 deletions(-) diff --git a/src/cam.ts b/src/cam.ts index 971d70a6..ece9b170 100644 --- a/src/cam.ts +++ b/src/cam.ts @@ -4,6 +4,7 @@ import https, { Agent, RequestOptions } from 'https'; import http from 'http'; import { Buffer } from 'buffer'; import crypto from 'crypto'; +import url from 'url'; import { linerase, parseSOAPString } from './utils'; /** @@ -31,6 +32,7 @@ export interface CamOptions { export type CamServices = { PTZ?: URL, media?: URL, + media2?: URL, imaging?: URL, events?: URL, device?: URL, @@ -53,7 +55,24 @@ interface RequestError extends Error { syscall: string; } +export interface CamService { + /** Namespace uri */ + namespace: string; + /** Uri for requests */ + XAddr: string; + /** Minor version */ + minor: number; + /** Major version */ + major: number; +} + export class Cam extends EventEmitter { + /** + * Indicates raw xml request to device. + * @event rawData + */ + static rawRequest: 'rawRequest' = 'rawRequest'; + public useSecure: boolean; public secureOptions: SecureContextOptions; public hostname: string; @@ -67,12 +86,8 @@ export class Cam extends EventEmitter { private events: Record; private uri: CamServices; private timeShift: number | undefined; - - /** - * Indicates raw xml request to device. - * @event rawData - */ - static rawRequest: 'rawRequest' = 'rawRequest'; + private services: CamService[] | undefined; + private media2Support = false; constructor(options: CamOptions) { super(); @@ -149,10 +164,10 @@ export class Cam extends EventEmitter { nonce.writeUIntLE(Math.ceil(Math.random() * 0x100000000), 12, 4); const cryptoDigest = crypto.createHash('sha1'); cryptoDigest.update(Buffer.concat([nonce, Buffer.from(timestamp, 'ascii'), Buffer.from(this.password!, 'ascii')])); - const passdigest = cryptoDigest.digest('base64'); + const passDigest = cryptoDigest.digest('base64'); return { - passdigest, - nonce : nonce.toString('base64'), + passdigest : passDigest, + nonce : nonce.toString('base64'), timestamp, }; } @@ -168,7 +183,7 @@ export class Cam extends EventEmitter { }; requestOptions.headers = { 'Content-Type' : 'application/soap+xml', - 'Content-Length' : Buffer.byteLength(options.body, 'utf8'), // options.body.length chinese will be wrong here + 'Content-Length' : Buffer.byteLength(options.body, 'utf8'), charset : 'utf-8', }; requestOptions.method = 'POST'; @@ -230,12 +245,30 @@ export class Cam extends EventEmitter { }); } + /** + * Parse url with an eye on `preserveAddress` property + * @param address + * @private + */ + private parseUrl(address: string) { + const parsedAddress = new URL(address); + // If host for service and default host differs, also if preserve address property set + // we substitute host, hostname and port from settings then rebuild the href using .format + if (this.preserveAddress && (this.hostname !== parsedAddress.hostname || this.port.toString() !== parsedAddress.port)) { + parsedAddress.hostname = this.hostname; + parsedAddress.host = `${this.hostname}:${this.port}`; + parsedAddress.port = this.port.toString(); + parsedAddress.href = url.format(parsedAddress); + } + return parsedAddress; + } + /** * Connect to the camera and fill device information properties */ async connect() { await this.getSystemDateAndTime(); - // await this.getServices(); + await this.getServices(); } private setupSystemDateAndTime(data: any) { @@ -288,4 +321,51 @@ export class Cam extends EventEmitter { throw error; } } + + /** + * Returns information about services of the device. + * @param includeCapability + */ + async getServices(includeCapability = true) { + const [data] = await this.request({ + body : `${this.envelopeHeader()}` + + `${includeCapability}` + + `${ + this.envelopeFooter()}`, + }); + this.services = linerase(data).getServicesResponse.service; + // ONVIF Profile T introduced Media2 (ver20) so cameras from around 2020/2021 will have + // two media entries in the ServicesResponse, one for Media (ver10/media) and one for Media2 (ver20/media) + // This is so that existing VMS software can still access the video via the orignal ONVIF Media API + // fill Cam#uri property + if (!this.uri) { + /** + * Device service URIs + * @name Cam#uri + * @property {url} [PTZ] + * @property {url} [media] + * @property {url} [media2] + * @property {url} [imaging] + * @property {url} [events] + * @property {url} [device] + */ + this.uri = {}; + } + this.services!.forEach((service) => { + // Look for services with namespaces and XAddr values + if (Object.prototype.hasOwnProperty.call(service, 'namespace') && Object.prototype.hasOwnProperty.call(service, 'XAddr')) { + // Only parse ONVIF namespaces. Axis cameras return Axis namespaces in GetServices + const parsedNamespace = url.parse(service.namespace); + if (parsedNamespace.hostname === 'www.onvif.org' && parsedNamespace.path) { + const namespaceSplitted = parsedNamespace.path.substring(1).split('/'); // remove leading Slash, then split + // special case for Media and Media2 where cameras supporting Profile S and Profile T (2020/2021 models) have two media services + if (namespaceSplitted[1] === 'media' && namespaceSplitted[0] === 'ver20') { + this.media2Support = true; + namespaceSplitted[1] = 'media2'; + } + this.uri[namespaceSplitted[1] as keyof CamServices] = this.parseUrl(service.XAddr); + } + } + }); + } } diff --git a/src/utils.ts b/src/utils.ts index 09f09c8c..4354db75 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -50,10 +50,12 @@ export function guid() { return (`${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`); } +export type CamResponse = Promise<[Record, string]>; + /** * Parse SOAP response */ -export async function parseSOAPString(rawXml: string): Promise<[Record, string]> { +export async function parseSOAPString(rawXml: string): CamResponse { /* Filter out xml name spaces */ const xml = rawXml.replace(/xmlns([^=]*?)=(".*?")/g, ''); From 3db374a41b4da5aba1f78cfa3dcc0c88d869dd8d Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Thu, 13 Jan 2022 18:30:52 +0300 Subject: [PATCH 032/112] Split the class into modules --- README.md | 1 + src/device.ts | 176 +++++++++++++++++++++++++++++++++++++++ src/index.ts | 2 +- src/{cam.ts => onvif.ts} | 128 +++++++++++----------------- 4 files changed, 226 insertions(+), 81 deletions(-) create mode 100644 src/device.ts rename src/{cam.ts => onvif.ts} (79%) diff --git a/README.md b/README.md index 35ed2400..cba37d4c 100644 --- a/README.md +++ b/README.md @@ -413,6 +413,7 @@ configuration object ## Links WSDL schemes and docs: +- https://www.onvif.org/profiles/specifications/ - [Operations index](http://www.onvif.org/onvif/ver20/util/operationIndex.html) - http://www.onvif.org/onvif/ver10/tc/onvif_core_ver10.pdf - http://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl diff --git a/src/device.ts b/src/device.ts new file mode 100644 index 00000000..7e4b262b --- /dev/null +++ b/src/device.ts @@ -0,0 +1,176 @@ +import url from 'url'; +import { CamService, CamServices, Onvif } from './onvif'; +import { linerase } from './utils'; + +export class Device { + private readonly onvif: Onvif; + private services: CamService[] = []; + private media2Support = false; + + constructor(onvif: Onvif) { + this.onvif = onvif; + } + + /** + * Returns information about services of the device. + * @param includeCapability + */ + async getServices(includeCapability = true): Promise { + const [data] = await this.onvif.request({ + body : '' + + `${includeCapability}` + + '', + }); + this.services = linerase(data).getServicesResponse.service; + // ONVIF Profile T introduced Media2 (ver20) so cameras from around 2020/2021 will have + // two media entries in the ServicesResponse, one for Media (ver10/media) and one for Media2 (ver20/media) + // This is so that existing VMS software can still access the video via the orignal ONVIF Media API + // fill Cam#uri property + if (!this.onvif.uri) { + /** + * Device service URIs + * @name Onvif#uri + * @property {url} [PTZ] + * @property {url} [media] + * @property {url} [media2] + * @property {url} [imaging] + * @property {url} [events] + * @property {url} [device] + */ + this.onvif.uri = {}; + } + this.services.forEach((service) => { + // Look for services with namespaces and XAddr values + if (Object.prototype.hasOwnProperty.call(service, 'namespace') && Object.prototype.hasOwnProperty.call(service, 'XAddr')) { + // Only parse ONVIF namespaces. Axis cameras return Axis namespaces in GetServices + const parsedNamespace = url.parse(service.namespace); + if (parsedNamespace.hostname === 'www.onvif.org' && parsedNamespace.path) { + const namespaceSplitted = parsedNamespace.path.substring(1).split('/'); // remove leading Slash, then split + // special case for Media and Media2 where cameras supporting Profile S and Profile T (2020/2021 models) have two media services + if (namespaceSplitted[1] === 'media' && namespaceSplitted[0] === 'ver20') { + this.media2Support = true; + namespaceSplitted[1] = 'media2'; + } + this.onvif.uri[namespaceSplitted[1] as keyof CamServices] = this.onvif.parseUrl(service.XAddr); + } + } + }); + return this.services; + } + + /** + * This method has been replaced by the more generic GetServices method. For capabilities of individual services refer to the GetServiceCapabilities methods. + */ + // eslint-disable-next-line no-use-before-define + async getCapabilities(): Promise { + return { + device : { + XAddr : 'kjh', + }, + }; + } +} + +/** Network capabilities */ +export interface iNetwork { + /** Indicates support for IP filtering */ + IPFilter: boolean; + /** Indicates support for zeroconf */ + zeroConfiguration: boolean; + /** Indicates support for IPv6 */ + IPVersion6: boolean; + /** Indicates support for dynamic DNS configuration */ + dynDNS: boolean; +} + +/** System capabilities */ +export interface iSystem { + /** Indicates support for WS Discovery resolve requests */ + discoveryBye: boolean; + /** Indicates support for remote discovery */ + remoteDiscovery: boolean; + /** Indicates support for system backup through MTOM */ + systemBackup: boolean; + /** Indicates support for retrieval of system logging through MTOM */ + systemLogging: boolean; + /** Indicates support for firmware upgrade through MTOM */ + firmwareUpgrade: boolean; + /** Indicates support for firmware upgrade through HTTP */ + httpFirmwareUpgrade: boolean; + /** Indicates support for system backup through HTTP */ + httpSystemBackup: boolean; + /** Indicates support for retrieval of system logging through HTTP */ + httpSystemLogging: boolean; +} + +export interface iIO { + /** Number of input connectors */ + inputConnectors: number; + /** Number of relay outputs */ + relayOutputs: number; + extension: { + auxiliary: boolean; + auxiliaryCommands: Record; + } +} + +/** Security capabilities */ +export interface iSecurity { + /** Indicates support for TLS 1.1 */ + 'TLS1.1': boolean; + /** Indicates support for TLS 1.2 */ +} +// * @property {object} [device.security] +// * @property {boolean} device.security.'TLS1.1' Indicates support for TLS 1.1 +// * @property {boolean} device.security.'TLS1.2' Indicates support for TLS 1.2 +// * @property {boolean} device.security.onboardKeyGeneration Indicates support for onboard key generation +// * @property {boolean} device.security.accessPolicyConfig Indicates support for access policy configuration +// * @property {boolean} device.security.'X.509Token' Indicates support for WS-Security X.509 token +// * @property {boolean} device.security.SAMLToken Indicates support for WS-Security SAML token +// * @property {boolean} device.security.kerberosToken Indicates support for WS-Security Kerberos token +// * @property {boolean} device.security.RELToken Indicates support for WS-Security REL token +// * @property {object} events Event capabilities +// * @property {string} events.XAddr Event service URI +// * @property {boolean} events.WSSubscriptionPolicySupport Indicates whether or not WS Subscription policy is supported +// * @property {boolean} events.WSPullPointSupport Indicates whether or not WS Pull Point is supported +// * @property {boolean} events.WSPausableSubscriptionManagerInterfaceSupport Indicates whether or not WS Pausable Subscription Manager Interface is supported +// * @property {object} imaging Imaging capabilities +// * @property {string} imaging.XAddr Imaging service URI +// * @property {object} media Media capabilities +// * @property {string} media.XAddr Media service URI +// * @property {object} media.streamingCapabilities Streaming capabilities +// * @property {boolean} media.streamingCapabilities.RTPMulticast Indicates whether or not RTP multicast is supported +// * @property {boolean} media.streamingCapabilities.RTP_TCP Indicates whether or not RTP over TCP is supported +// * @property {boolean} media.streamingCapabilities.RTP_RTSP_TCP Indicates whether or not RTP/RTSP/TCP is supported +// * @property {object} media.streamingCapabilities.extension +// * @property {object} PTZ PTZ capabilities +// * @property {string} PTZ.XAddr PTZ service URI +// * @property {object} [extension] +// * @property {object} extension.deviceIO DeviceIO capabilities +// * @property {string} extension.deviceIO.XAddr DeviceIO service URI +// * @property {number} extension.deviceIO.videoSources +// * @property {number} extension.deviceIO.videoOutputs +// * @property {number} extension.deviceIO.audioSources +// * @property {number} extension.deviceIO.audioOutputs +// * @property {number} extension.deviceIO.relayOutputs +// * @property {object} [extension.extensions] +// * @property {object} [extension.extensions.telexCapabilities] +// * @property {object} [extension.extensions.scdlCapabilities] +// */ + +/** Device capabilities */ +export interface iDevice { + /** Device service URI */ + XAddr: string; + network?: iNetwork; + system?: iSystem; + IO?: iIO; + security?: iSecurity; +} + +/** + * Capability list + */ +export interface iCapabilities { + device: iDevice; +} diff --git a/src/index.ts b/src/index.ts index 5db41e67..e019d32a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1 @@ -export * from './cam'; +export * from './onvif'; diff --git a/src/cam.ts b/src/onvif.ts similarity index 79% rename from src/cam.ts rename to src/onvif.ts index ece9b170..2de5f1ec 100644 --- a/src/cam.ts +++ b/src/onvif.ts @@ -4,8 +4,8 @@ import https, { Agent, RequestOptions } from 'https'; import http from 'http'; import { Buffer } from 'buffer'; import crypto from 'crypto'; -import url from 'url'; import { linerase, parseSOAPString } from './utils'; +import { Device } from './device'; /** * Cam constructor options @@ -25,7 +25,7 @@ export interface CamOptions { agent?: Agent | boolean; /** Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false. */ preserveAddress: boolean; - /** Set false if the camera should not connect automatically. */ + /** Set false if the camera should not connect automatically, defaults false. */ autoConnect?: boolean; } @@ -66,13 +66,14 @@ export interface CamService { major: number; } -export class Cam extends EventEmitter { +export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. * @event rawData */ static rawRequest: 'rawRequest' = 'rawRequest'; + private device: Device; public useSecure: boolean; public secureOptions: SecureContextOptions; public hostname: string; @@ -84,10 +85,8 @@ export class Cam extends EventEmitter { public agent: Agent | boolean; public preserveAddress: boolean; private events: Record; - private uri: CamServices; + public uri: CamServices; private timeShift: number | undefined; - private services: CamService[] | undefined; - private media2Support = false; constructor(options: CamOptions) { super(); @@ -103,6 +102,7 @@ export class Cam extends EventEmitter { this.preserveAddress = options.preserveAddress || false; this.events = {}; this.uri = {}; + this.device = new Device(this); /** Bind event handling to the `event` event */ this.on('newListener', (name) => { // if this is the first listener, start pulling subscription @@ -112,7 +112,7 @@ export class Cam extends EventEmitter { }); } }); - if (options.autoConnect !== false) { + if (options.autoConnect) { setImmediate(() => { this.connect(); }); @@ -172,7 +172,24 @@ export class Cam extends EventEmitter { }; } - private async request(options: CamRequestOptions): Promise<[Record, string]> { + private setupSystemDateAndTime(data: any) { + const systemDateAndTime = data[0].getSystemDateAndTimeResponse[0].systemDateAndTime[0]; + const dateTime = systemDateAndTime.UTCDateTime || systemDateAndTime.localDateTime; + let time; + if (dateTime === undefined) { + // Seen on a cheap Chinese camera from GWellTimes-IPC. Use the current time. + time = new Date(); + } else { + const dt = linerase(dateTime[0]); + time = new Date(Date.UTC(dt.date.year, dt.date.month - 1, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second)); + } + if (!this.timeShift) { + this.timeShift = time.getTime() - (process.uptime() * 1000); + } + return time; + } + + private async rawRequest(options: CamRequestOptions): Promise<[Record, string]> { return new Promise((resolve, reject) => { let callbackExecuted = false; let requestOptions = { @@ -206,7 +223,7 @@ export class Cam extends EventEmitter { const xml = Buffer.concat(bufs, length).toString('utf8'); /** * Indicates raw xml response from device. - * @event Cam#rawResponse + * @event Onvif#rawResponse * @type {string} */ this.emit('rawResponse', xml); @@ -245,12 +262,19 @@ export class Cam extends EventEmitter { }); } + public request(options: CamRequestOptions) { + return this.rawRequest({ + ...options, + body : `${this.envelopeHeader()}${options.body}${this.envelopeFooter()}`, + }); + } + /** * Parse url with an eye on `preserveAddress` property * @param address * @private */ - private parseUrl(address: string) { + public parseUrl(address: string) { const parsedAddress = new URL(address); // If host for service and default host differs, also if preserve address property set // we substitute host, hostname and port from settings then rebuild the href using .format @@ -258,40 +282,15 @@ export class Cam extends EventEmitter { parsedAddress.hostname = this.hostname; parsedAddress.host = `${this.hostname}:${this.port}`; parsedAddress.port = this.port.toString(); - parsedAddress.href = url.format(parsedAddress); + parsedAddress.href = parsedAddress.toString(); } return parsedAddress; } - /** - * Connect to the camera and fill device information properties - */ - async connect() { - await this.getSystemDateAndTime(); - await this.getServices(); - } - - private setupSystemDateAndTime(data: any) { - const systemDateAndTime = data[0].getSystemDateAndTimeResponse[0].systemDateAndTime[0]; - const dateTime = systemDateAndTime.UTCDateTime || systemDateAndTime.localDateTime; - let time; - if (dateTime === undefined) { - // Seen on a cheap Chinese camera from GWellTimes-IPC. Use the current time. - time = new Date(); - } else { - const dt = linerase(dateTime[0]); - time = new Date(Date.UTC(dt.date.year, dt.date.month - 1, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second)); - } - if (!this.timeShift) { - this.timeShift = time.getTime() - (process.uptime() * 1000); - } - return time; - } - /** * Receive date and time from cam */ - async getSystemDateAndTime() { + async getSystemDateAndTime(): Promise { // The ONVIF spec says this should work without a Password as we need to know any difference in the // remote NVT's time relative to our own time clock (called the timeShift) before we can calculate the // correct timestamp in nonce SOAP Authentication header. @@ -299,7 +298,7 @@ export class Cam extends EventEmitter { // authenticated getSystemDateAndTime. So for these devices we need to do an authenticated getSystemDateAndTime. // As 'timeShift' is not set, the local clock MUST be set to the correct time AND the NVT/Camera MUST be set // to the correct time if the camera implements Replay Attack Protection (eg Axis) - const [data, xml] = await this.request({ + const [data, xml] = await this.rawRequest({ // Try the Unauthenticated Request first. Do not use this._envelopeHeader() as we don't have timeShift yet. body : '' @@ -323,49 +322,18 @@ export class Cam extends EventEmitter { } /** - * Returns information about services of the device. - * @param includeCapability + * Connect to the camera and fill device information properties */ - async getServices(includeCapability = true) { - const [data] = await this.request({ - body : `${this.envelopeHeader()}` - + `${includeCapability}` - + `${ - this.envelopeFooter()}`, - }); - this.services = linerase(data).getServicesResponse.service; - // ONVIF Profile T introduced Media2 (ver20) so cameras from around 2020/2021 will have - // two media entries in the ServicesResponse, one for Media (ver10/media) and one for Media2 (ver20/media) - // This is so that existing VMS software can still access the video via the orignal ONVIF Media API - // fill Cam#uri property - if (!this.uri) { - /** - * Device service URIs - * @name Cam#uri - * @property {url} [PTZ] - * @property {url} [media] - * @property {url} [media2] - * @property {url} [imaging] - * @property {url} [events] - * @property {url} [device] - */ - this.uri = {}; + async connect() { + await this.getSystemDateAndTime(); + try { + await this.device.getServices(); + } catch (error) { + await this.device.getCapabilities(); } - this.services!.forEach((service) => { - // Look for services with namespaces and XAddr values - if (Object.prototype.hasOwnProperty.call(service, 'namespace') && Object.prototype.hasOwnProperty.call(service, 'XAddr')) { - // Only parse ONVIF namespaces. Axis cameras return Axis namespaces in GetServices - const parsedNamespace = url.parse(service.namespace); - if (parsedNamespace.hostname === 'www.onvif.org' && parsedNamespace.path) { - const namespaceSplitted = parsedNamespace.path.substring(1).split('/'); // remove leading Slash, then split - // special case for Media and Media2 where cameras supporting Profile S and Profile T (2020/2021 models) have two media services - if (namespaceSplitted[1] === 'media' && namespaceSplitted[0] === 'ver20') { - this.media2Support = true; - namespaceSplitted[1] = 'media2'; - } - this.uri[namespaceSplitted[1] as keyof CamServices] = this.parseUrl(service.XAddr); - } - } - }); + // await Promise.all([this.getProfiles(), this.getVideoSources()]); + // await this.getActiveSources(); + this.emit('connect'); + return this; } } From f98b3363dffef90041d41a1d7e0fbb37e483a86b Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 14 Jan 2022 20:33:39 +0300 Subject: [PATCH 033/112] Split the class into modules, reworked --- src/device.ts | 342 ++++++++++++++++++++++++++++++++++---------------- src/index.ts | 1 + src/onvif.ts | 49 +++----- 3 files changed, 251 insertions(+), 141 deletions(-) diff --git a/src/device.ts b/src/device.ts index 7e4b262b..d3787a47 100644 --- a/src/device.ts +++ b/src/device.ts @@ -1,10 +1,236 @@ import url from 'url'; -import { CamService, CamServices, Onvif } from './onvif'; +import { Onvif, OnvifServices } from './onvif'; import { linerase } from './utils'; +export interface OnvifService { + /** Namespace uri */ + namespace: string; + /** Uri for requests */ + XAddr: string; + /** Minor version */ + minor: number; + /** Major version */ + major: number; +} + +/** Network capabilities */ +export interface NetworkCapabilities { + /** Indicates support for IP filtering */ + IPFilter?: boolean; + /** Indicates support for zeroconf */ + zeroConfiguration?: boolean; + /** Indicates support for IPv6 */ + IPVersion6?: boolean; + /** Indicates support for dynamic DNS configuration */ + dynDNS?: boolean; + extension: { + dot11Configuration?: boolean; + extension?: any; + } +} + +/** System capabilities */ +export interface SystemCapabilities { + /** Indicates support for WS Discovery resolve requests */ + discoveryBye: boolean; + /** Indicates support for remote discovery */ + remoteDiscovery: boolean; + /** Indicates support for system backup through MTOM */ + systemBackup: boolean; + /** Indicates support for retrieval of system logging through MTOM */ + systemLogging: boolean; + /** Indicates support for firmware upgrade through MTOM */ + firmwareUpgrade: boolean; + /** Indicates support for firmware upgrade through HTTP */ + httpFirmwareUpgrade: boolean; + /** Indicates support for system backup through HTTP */ + httpSystemBackup: boolean; + /** Indicates support for retrieval of system logging through HTTP */ + httpSystemLogging: boolean; +} + +export interface IOCapabilities { + /** Number of input connectors */ + inputConnectors: number; + /** Number of relay outputs */ + relayOutputs: number; + extension: { + auxiliary: boolean; + auxiliaryCommands: Record; + } +} + +/** Security capabilities */ +export interface SecurityCapabilities { + /** Indicates support for TLS 1.1 */ + 'TLS1.1': boolean; + /** Indicates support for TLS 1.2 */ + 'TLS1.2': boolean; + /** Indicates support for onboard key generation */ + onboardKeyGeneration: boolean; + /** Indicates support for access policy configuration */ + accessPolicyConfig: boolean; + /** Indicates support for WS-Security X.509 token */ + 'X.509Token': boolean; + /** Indicates support for WS-Security SAML token */ + SAMLToken: boolean; + /** Indicates support for WS-Security Kerberos token */ + kerberosToken: boolean; + /** Indicates support for WS-Security REL token */ + RELToken: boolean; +} + +/** + * Event capabilities + */ +export interface EventCapabilities { + /** Event service URI */ + XAddr: string; + /** Indicates whether or not WS Subscription policy is supported */ + WSSubscriptionPolicySupport: boolean; + /** Indicates whether or not WS Pull Point is supported */ + WSPullPointSupport: boolean; + /** Indicates whether or not WS Pausable Subscription Manager Interface is supported */ + WSPausableSubscriptionManagerInterfaceSupport: boolean; +} + +export interface ImagingCapabilities { + /** Imaging service URI */ + XAddr: string; +} + +export interface MediaCapabilities { + /** Media service URI */ + XAddr: string; + /** Streaming capabilities */ + streamingCapabilities: { + /** Indicates whether or not RTP multicast is supported */ + RTPMulticast: boolean; + /** Indicates whether or not RTP over TCP is supported */ + RTP_TCP: boolean; + /** Indicates whether or not RTP/RTSP/TCP is supported */ + RTP_RTSP_TCP: boolean; + /** Extensions */ + extension: any; + }; +} + +/** PTZ capabilities */ +export interface PTZCapabilities { + /** PTZ service URI */ + XAddr: string; +} + +export interface DeviceIOCapabilities { + /** DeviceIO service URI */ + XAddr: string; + videoSources: number; + videoOutputs: number; + audioSources: number; + audioOutputs: number; + relayOutputs: number; + extensions: { + telexCapabilities: any; + scdlCapabilities: any; + } +} + +export interface DisplayCapabilities { + XAddr: string; + /** Indication that the SetLayout command supports only predefined layouts */ + fixedLayout: boolean; +} + +export interface RecordingCapabilities { + XAddr: string; + receiverSource: boolean; + mediaProfileSource: boolean; + dynamicRecordings: boolean; + dynamicTracks: boolean; + maxStringLength: number; +} + +export interface SearchCapabilities { + XAddr: string; + metadataSearch: boolean; +} + +export interface ReplayCapabilities { + XAddr: string; +} + +export interface ReceiverCapabilities { + /** The address of the receiver service */ + XAddr: string; + /** Indicates whether the device can receive RTP multicast streams */ + RTP_Multicast: boolean; + /** Indicates whether the device can receive RTP/TCP streams */ + RTP_TCP: boolean; + /** Indicates whether the device can receive RTP/RTSP/TCP streams */ + RTP_RTSP_TCP: boolean; + /** The maximum number of receivers supported by the device */ + supportedReceivers: number; + /** The maximum allowed length for RTSP URIs */ + maximumRTSPURILength: number; +} + +export interface AnalyticsDeviceCapabilities { + XAddr: string; + ruleSupport?: boolean; + extension?: any; +} + +export interface CapabilitiesExtension { + /** DeviceIO capabilities */ + deviceIO?: DeviceIOCapabilities; + display?: DisplayCapabilities; + recording?: RecordingCapabilities; + search?: SearchCapabilities; + replay?: ReplayCapabilities; + receiver?: ReceiverCapabilities; + analyticsDevice?: AnalyticsDeviceCapabilities; +} + +/** Device capabilities */ +export interface DeviceCapabilities { + /** Device service URI */ + XAddr: string; + network?: NetworkCapabilities; + system?: SystemCapabilities; + IO?: IOCapabilities; + security?: SecurityCapabilities; + extensions?: any; +} + +/** Analytics capabilities */ +export interface AnalyticsCapabilities { + /** Analytics service URI */ + XAddr: string; + /** Indicates whether or not rules are supported */ + ruleSupport: boolean; + /** Indicates whether or not modules are supported */ + analyticsModuleSupport: boolean; +} + +/** + * Capability list + */ +export interface Capabilities { + analytics?: AnalyticsCapabilities; + device?: DeviceCapabilities; + events?: EventCapabilities; + imaging?: ImagingCapabilities; + media?: MediaCapabilities; + ptz?: PTZCapabilities; + extension?: CapabilitiesExtension; +} + +/** + * Device methods + */ export class Device { private readonly onvif: Onvif; - private services: CamService[] = []; + private services: OnvifService[] = []; private media2Support = false; constructor(onvif: Onvif) { @@ -13,9 +239,8 @@ export class Device { /** * Returns information about services of the device. - * @param includeCapability */ - async getServices(includeCapability = true): Promise { + async getServices(includeCapability = true): Promise { const [data] = await this.onvif.request({ body : '' + `${includeCapability}` @@ -51,7 +276,7 @@ export class Device { this.media2Support = true; namespaceSplitted[1] = 'media2'; } - this.onvif.uri[namespaceSplitted[1] as keyof CamServices] = this.onvif.parseUrl(service.XAddr); + this.onvif.uri[namespaceSplitted[1] as keyof OnvifServices] = this.onvif.parseUrl(service.XAddr); } } }); @@ -61,8 +286,7 @@ export class Device { /** * This method has been replaced by the more generic GetServices method. For capabilities of individual services refer to the GetServiceCapabilities methods. */ - // eslint-disable-next-line no-use-before-define - async getCapabilities(): Promise { + async getCapabilities(): Promise { return { device : { XAddr : 'kjh', @@ -70,107 +294,3 @@ export class Device { }; } } - -/** Network capabilities */ -export interface iNetwork { - /** Indicates support for IP filtering */ - IPFilter: boolean; - /** Indicates support for zeroconf */ - zeroConfiguration: boolean; - /** Indicates support for IPv6 */ - IPVersion6: boolean; - /** Indicates support for dynamic DNS configuration */ - dynDNS: boolean; -} - -/** System capabilities */ -export interface iSystem { - /** Indicates support for WS Discovery resolve requests */ - discoveryBye: boolean; - /** Indicates support for remote discovery */ - remoteDiscovery: boolean; - /** Indicates support for system backup through MTOM */ - systemBackup: boolean; - /** Indicates support for retrieval of system logging through MTOM */ - systemLogging: boolean; - /** Indicates support for firmware upgrade through MTOM */ - firmwareUpgrade: boolean; - /** Indicates support for firmware upgrade through HTTP */ - httpFirmwareUpgrade: boolean; - /** Indicates support for system backup through HTTP */ - httpSystemBackup: boolean; - /** Indicates support for retrieval of system logging through HTTP */ - httpSystemLogging: boolean; -} - -export interface iIO { - /** Number of input connectors */ - inputConnectors: number; - /** Number of relay outputs */ - relayOutputs: number; - extension: { - auxiliary: boolean; - auxiliaryCommands: Record; - } -} - -/** Security capabilities */ -export interface iSecurity { - /** Indicates support for TLS 1.1 */ - 'TLS1.1': boolean; - /** Indicates support for TLS 1.2 */ -} -// * @property {object} [device.security] -// * @property {boolean} device.security.'TLS1.1' Indicates support for TLS 1.1 -// * @property {boolean} device.security.'TLS1.2' Indicates support for TLS 1.2 -// * @property {boolean} device.security.onboardKeyGeneration Indicates support for onboard key generation -// * @property {boolean} device.security.accessPolicyConfig Indicates support for access policy configuration -// * @property {boolean} device.security.'X.509Token' Indicates support for WS-Security X.509 token -// * @property {boolean} device.security.SAMLToken Indicates support for WS-Security SAML token -// * @property {boolean} device.security.kerberosToken Indicates support for WS-Security Kerberos token -// * @property {boolean} device.security.RELToken Indicates support for WS-Security REL token -// * @property {object} events Event capabilities -// * @property {string} events.XAddr Event service URI -// * @property {boolean} events.WSSubscriptionPolicySupport Indicates whether or not WS Subscription policy is supported -// * @property {boolean} events.WSPullPointSupport Indicates whether or not WS Pull Point is supported -// * @property {boolean} events.WSPausableSubscriptionManagerInterfaceSupport Indicates whether or not WS Pausable Subscription Manager Interface is supported -// * @property {object} imaging Imaging capabilities -// * @property {string} imaging.XAddr Imaging service URI -// * @property {object} media Media capabilities -// * @property {string} media.XAddr Media service URI -// * @property {object} media.streamingCapabilities Streaming capabilities -// * @property {boolean} media.streamingCapabilities.RTPMulticast Indicates whether or not RTP multicast is supported -// * @property {boolean} media.streamingCapabilities.RTP_TCP Indicates whether or not RTP over TCP is supported -// * @property {boolean} media.streamingCapabilities.RTP_RTSP_TCP Indicates whether or not RTP/RTSP/TCP is supported -// * @property {object} media.streamingCapabilities.extension -// * @property {object} PTZ PTZ capabilities -// * @property {string} PTZ.XAddr PTZ service URI -// * @property {object} [extension] -// * @property {object} extension.deviceIO DeviceIO capabilities -// * @property {string} extension.deviceIO.XAddr DeviceIO service URI -// * @property {number} extension.deviceIO.videoSources -// * @property {number} extension.deviceIO.videoOutputs -// * @property {number} extension.deviceIO.audioSources -// * @property {number} extension.deviceIO.audioOutputs -// * @property {number} extension.deviceIO.relayOutputs -// * @property {object} [extension.extensions] -// * @property {object} [extension.extensions.telexCapabilities] -// * @property {object} [extension.extensions.scdlCapabilities] -// */ - -/** Device capabilities */ -export interface iDevice { - /** Device service URI */ - XAddr: string; - network?: iNetwork; - system?: iSystem; - IO?: iIO; - security?: iSecurity; -} - -/** - * Capability list - */ -export interface iCapabilities { - device: iDevice; -} diff --git a/src/index.ts b/src/index.ts index e019d32a..98614c71 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,2 @@ export * from './onvif'; +export * from './device'; diff --git a/src/onvif.ts b/src/onvif.ts index 2de5f1ec..a907c72b 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -10,7 +10,7 @@ import { Device } from './device'; /** * Cam constructor options */ -export interface CamOptions { +export interface OnvifOptions { /** Set true if using `https` protocol, defaults to false. */ useSecure?: boolean; /** Set options for https like ca, cert, ciphers, rejectUnauthorized, secureOptions, secureProtocol, etc. */ @@ -29,18 +29,18 @@ export interface CamOptions { autoConnect?: boolean; } -export type CamServices = { - PTZ?: URL, - media?: URL, - media2?: URL, - imaging?: URL, - events?: URL, - device?: URL, +export interface OnvifServices { + PTZ?: URL; + media?: URL; + media2?: URL; + imaging?: URL; + events?: URL; + device?: URL; } -export interface CamRequestOptions extends RequestOptions{ +export interface OnvifRequestOptions extends RequestOptions{ /** Name of service (ptz, media, etc) */ - service?: keyof CamServices; + service?: keyof OnvifServices; /** SOAP body */ body: string; /** Defines another url to request */ @@ -55,17 +55,6 @@ interface RequestError extends Error { syscall: string; } -export interface CamService { - /** Namespace uri */ - namespace: string; - /** Uri for requests */ - XAddr: string; - /** Minor version */ - minor: number; - /** Major version */ - major: number; -} - export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. @@ -73,7 +62,7 @@ export class Onvif extends EventEmitter { */ static rawRequest: 'rawRequest' = 'rawRequest'; - private device: Device; + public device: Device; public useSecure: boolean; public secureOptions: SecureContextOptions; public hostname: string; @@ -85,10 +74,10 @@ export class Onvif extends EventEmitter { public agent: Agent | boolean; public preserveAddress: boolean; private events: Record; - public uri: CamServices; + public uri: OnvifServices; private timeShift: number | undefined; - constructor(options: CamOptions) { + constructor(options: OnvifOptions) { super(); this.useSecure = options.useSecure ?? false; this.secureOptions = options.secureOptions ?? {}; @@ -133,7 +122,7 @@ export class Onvif extends EventEmitter { header += '' + '' + `${this.username}` - + `${req.passdigest}` + + `${req.passDigest}` + `${req.nonce}` + `${req.timestamp}` + '' @@ -166,8 +155,8 @@ export class Onvif extends EventEmitter { cryptoDigest.update(Buffer.concat([nonce, Buffer.from(timestamp, 'ascii'), Buffer.from(this.password!, 'ascii')])); const passDigest = cryptoDigest.digest('base64'); return { - passdigest : passDigest, - nonce : nonce.toString('base64'), + passDigest, + nonce : nonce.toString('base64'), timestamp, }; } @@ -189,7 +178,7 @@ export class Onvif extends EventEmitter { return time; } - private async rawRequest(options: CamRequestOptions): Promise<[Record, string]> { + private async rawRequest(options: OnvifRequestOptions): Promise<[Record, string]> { return new Promise((resolve, reject) => { let callbackExecuted = false; let requestOptions = { @@ -262,7 +251,7 @@ export class Onvif extends EventEmitter { }); } - public request(options: CamRequestOptions) { + public request(options: OnvifRequestOptions) { return this.rawRequest({ ...options, body : `${this.envelopeHeader()}${options.body}${this.envelopeFooter()}`, @@ -313,7 +302,7 @@ export class Onvif extends EventEmitter { if (xml && xml.toLowerCase().includes('sender not authorized')) { // Try again with a Username and Password const [data] = await this.request({ - body : `${this.envelopeHeader()}${this.envelopeFooter()}`, + body : '}', }); return this.setupSystemDateAndTime(data); } From 4d6e973dcfe61de1ea166a846927bd7cea146d52 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 14 Jan 2022 21:54:16 +0300 Subject: [PATCH 034/112] getCapabilities interfaces --- src/device.ts | 104 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 81 insertions(+), 23 deletions(-) diff --git a/src/device.ts b/src/device.ts index d3787a47..aa4a9a09 100644 --- a/src/device.ts +++ b/src/device.ts @@ -13,6 +13,22 @@ export interface OnvifService { major: number; } +export interface OnvifVersion { + /** Major version number */ + major: number; + /** + * Two digit minor version number. + * If major version number is less than "16", X.0.1 maps to "01" and X.2.1 maps to "21" where X stands for Major version number. + * Otherwise, minor number is month of release, such as "06" for June + */ + minor: number; +} + +export interface NetworkCapabilitiesExtension { + dot11Configuration?: boolean; + extension?: any; +} + /** Network capabilities */ export interface NetworkCapabilities { /** Indicates support for IP filtering */ @@ -23,14 +39,21 @@ export interface NetworkCapabilities { IPVersion6?: boolean; /** Indicates support for dynamic DNS configuration */ dynDNS?: boolean; - extension: { - dot11Configuration?: boolean; - extension?: any; - } + extension: NetworkCapabilitiesExtension; +} + +export interface SystemCapabilitiesExtension { + httpFirmwareUpgrade?: boolean; + httpSystemBackup?: boolean; + httpSystemLogging?: boolean; + httpSupportInformation?: boolean; + extension?: any; } /** System capabilities */ export interface SystemCapabilities { + /** Indicates whether or not WS Discovery resolve requests are supported */ + discoveryResolve: boolean; /** Indicates support for WS Discovery resolve requests */ discoveryBye: boolean; /** Indicates support for remote discovery */ @@ -42,22 +65,41 @@ export interface SystemCapabilities { /** Indicates support for firmware upgrade through MTOM */ firmwareUpgrade: boolean; /** Indicates support for firmware upgrade through HTTP */ - httpFirmwareUpgrade: boolean; + httpFirmwareUpgrade?: boolean; /** Indicates support for system backup through HTTP */ - httpSystemBackup: boolean; + httpSystemBackup?: boolean; /** Indicates support for retrieval of system logging through HTTP */ - httpSystemLogging: boolean; + httpSystemLogging?: boolean; + /** Indicates supported ONVIF version(s) */ + supportedVersions: OnvifVersion; + extensions?: SystemCapabilitiesExtension; +} + +export interface IOCapabilitiesExtension { + auxiliary?: boolean; + auxiliaryCommands?: Record; + extension?: any; } export interface IOCapabilities { /** Number of input connectors */ - inputConnectors: number; + inputConnectors?: number; /** Number of relay outputs */ - relayOutputs: number; - extension: { - auxiliary: boolean; - auxiliaryCommands: Record; - } + relayOutputs?: number; + extension?: IOCapabilitiesExtension; +} + +export interface SecurityCapabilitiesExtension2 { + dot1X: boolean; + /** EAP Methods supported by the device. The int values refer to the IANA EAP Registry */ + supportedEAPMethod?: number; + remoteUserHandling: boolean; +} + +export interface SecurityCapabilitiesExtension { + /** Indicates support for TLS 1.0 */ + 'TLS1.0': boolean; + extension?: SecurityCapabilitiesExtension2; } /** Security capabilities */ @@ -78,6 +120,7 @@ export interface SecurityCapabilities { kerberosToken: boolean; /** Indicates support for WS-Security REL token */ RELToken: boolean; + extension?: SecurityCapabilitiesExtension; } /** @@ -99,20 +142,31 @@ export interface ImagingCapabilities { XAddr: string; } +export interface RealTimeStreamingCapabilities { + /** Indicates whether or not RTP multicast is supported */ + RTPMulticast: boolean; + /** Indicates whether or not RTP over TCP is supported */ + RTP_TCP: boolean; + /** Indicates whether or not RTP/RTSP/TCP is supported */ + RTP_RTSP_TCP: boolean; + /** Extensions */ + extension: any; +} + +export interface ProfileCapabilities { + maximumNumberOfProfiles: number; +} + +export interface MediaCapabilitiesExtension { + profileCapabilities: ProfileCapabilities; +} + export interface MediaCapabilities { /** Media service URI */ XAddr: string; /** Streaming capabilities */ - streamingCapabilities: { - /** Indicates whether or not RTP multicast is supported */ - RTPMulticast: boolean; - /** Indicates whether or not RTP over TCP is supported */ - RTP_TCP: boolean; - /** Indicates whether or not RTP/RTSP/TCP is supported */ - RTP_RTSP_TCP: boolean; - /** Extensions */ - extension: any; - }; + streamingCapabilities: RealTimeStreamingCapabilities; + extension?: MediaCapabilitiesExtension; } /** PTZ capabilities */ @@ -237,6 +291,10 @@ export class Device { this.onvif = onvif; } + getSystemDateAndTime() { + return this.onvif.getSystemDateAndTime(); + } + /** * Returns information about services of the device. */ From 66c03bf3fdf432f113f19e1e51c45c18e4273812 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 14 Jan 2022 23:14:38 +0300 Subject: [PATCH 035/112] getCapabilities method --- src/device.ts | 38 ++++++++++++++++++++++++++++++++------ src/onvif.ts | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/device.ts b/src/device.ts index aa4a9a09..ac9a5d2b 100644 --- a/src/device.ts +++ b/src/device.ts @@ -235,6 +235,7 @@ export interface AnalyticsDeviceCapabilities { } export interface CapabilitiesExtension { + XAddr: string; /** DeviceIO capabilities */ deviceIO?: DeviceIOCapabilities; display?: DisplayCapabilities; @@ -342,13 +343,38 @@ export class Device { } /** - * This method has been replaced by the more generic GetServices method. For capabilities of individual services refer to the GetServiceCapabilities methods. + * This method has been replaced by the more generic GetServices method. + * For capabilities of individual services refer to the GetServiceCapabilities methods. */ async getCapabilities(): Promise { - return { - device : { - XAddr : 'kjh', - }, - }; + const [data] = await this.onvif.request({ + body : '' + + 'All' + + '', + }); + this.onvif.capabilities = linerase(data[0].getCapabilitiesResponse[0].capabilities[0]); + ['PTZ', 'media', 'imaging', 'events', 'device'].forEach((name) => { + const capabilityName = name as keyof Capabilities; + if ('XAddr' in this.onvif.capabilities[capabilityName]!) { + this.onvif.uri[name.toLowerCase() as keyof OnvifServices] = this.onvif.parseUrl(this.onvif.capabilities[capabilityName]!.XAddr); + } + }); + // extensions, eg. deviceIO + if (this.onvif.capabilities.extension) { + Object.keys(this.onvif.capabilities.extension).forEach((ext) => { + const extensionName = ext as keyof CapabilitiesExtension; + // TODO think about complex extensions like `telexCapabilities` and `scdlCapabilities` + if (extensionName !== 'XAddr' && 'XAddr' in this.onvif.capabilities.extension![extensionName]!) { + this.onvif.uri[extensionName] = new URL(this.onvif.capabilities.extension![extensionName]!.XAddr); + } + }); + // HACK for a Profile G NVR that has 'replay' but did not have 'recording' in GetCapabilities + if (this.onvif.uri.replay && !this.onvif.uri.recording) { + const tempRecorderXaddr = this.onvif.uri.replay.href.replace('replay', 'recording'); + this.onvif.emit('warn', `Adding ${tempRecorderXaddr} for bad Profile G device`); + this.onvif.uri.recording = new URL(tempRecorderXaddr); + } + } + return this.onvif.capabilities; } } diff --git a/src/onvif.ts b/src/onvif.ts index a907c72b..7988da95 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -5,7 +5,7 @@ import http from 'http'; import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; -import { Device } from './device'; +import { Capabilities, Device } from './device'; /** * Cam constructor options @@ -36,6 +36,13 @@ export interface OnvifServices { imaging?: URL; events?: URL; device?: URL; + deviceIO?: URL; + search?: URL; + display?: URL; + recording?: URL; + replay?: URL; + receiver?: URL; + analyticsDevice?: URL; } export interface OnvifRequestOptions extends RequestOptions{ @@ -59,8 +66,30 @@ export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. * @event rawData + * @example + * ```typescript + * onvif.on('rawData', (xml) => { console.log('request was', xml); }); + * ``` */ static rawRequest: 'rawRequest' = 'rawRequest'; + /** + * Indicates any warnings + * @event warn + * @example + * ```typescript + * onvif.on('warn', console.warn); + * ``` + */ + static warn: 'warn' = 'warn'; + /** + * Indicates any errors + * @event error + * @example + * ```typescript + * onvif.on('error', console.error); + * ``` + */ + static error: 'error' = 'error'; public device: Device; public useSecure: boolean; @@ -75,7 +104,8 @@ export class Onvif extends EventEmitter { public preserveAddress: boolean; private events: Record; public uri: OnvifServices; - private timeShift: number | undefined; + private timeShift?: number; + public capabilities: Capabilities; constructor(options: OnvifOptions) { super(); @@ -91,6 +121,7 @@ export class Onvif extends EventEmitter { this.preserveAddress = options.preserveAddress || false; this.events = {}; this.uri = {}; + this.capabilities = {}; this.device = new Device(this); /** Bind event handling to the `event` event */ this.on('newListener', (name) => { From 58f9382bbcd34879274d2d2da867da77f3bb4d3a Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 15 Jan 2022 04:53:40 +0300 Subject: [PATCH 036/112] Slice of interfaces work --- src/device.ts | 15 +- src/media.ts | 679 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/onvif.ts | 17 +- 3 files changed, 690 insertions(+), 21 deletions(-) create mode 100644 src/media.ts diff --git a/src/device.ts b/src/device.ts index ac9a5d2b..0fff409d 100644 --- a/src/device.ts +++ b/src/device.ts @@ -286,7 +286,7 @@ export interface Capabilities { export class Device { private readonly onvif: Onvif; private services: OnvifService[] = []; - private media2Support = false; + public media2Support = false; constructor(onvif: Onvif) { this.onvif = onvif; @@ -310,19 +310,6 @@ export class Device { // two media entries in the ServicesResponse, one for Media (ver10/media) and one for Media2 (ver20/media) // This is so that existing VMS software can still access the video via the orignal ONVIF Media API // fill Cam#uri property - if (!this.onvif.uri) { - /** - * Device service URIs - * @name Onvif#uri - * @property {url} [PTZ] - * @property {url} [media] - * @property {url} [media2] - * @property {url} [imaging] - * @property {url} [events] - * @property {url} [device] - */ - this.onvif.uri = {}; - } this.services.forEach((service) => { // Look for services with namespaces and XAddr values if (Object.prototype.hasOwnProperty.call(service, 'namespace') && Object.prototype.hasOwnProperty.call(service, 'XAddr')) { diff --git a/src/media.ts b/src/media.ts new file mode 100644 index 00000000..9bd174e8 --- /dev/null +++ b/src/media.ts @@ -0,0 +1,679 @@ +import { isNumber } from 'util'; +import { Onvif } from './onvif'; +import { linerase } from './utils'; + +export interface IntRectangle { + x: number; + y: number; + width: number; + height: number; +} + +export interface Rotate { + /** Parameter to enable/disable Rotation feature */ + mode: 'OFF' | 'ON' | 'AUTO'; + /** Optional parameter to configure how much degree of clockwise rotation of image for On mode. Omitting this parameter for On mode means 180 degree rotation. */ + degree?: number; + extension: any; +} + +export interface LensOffset { + /** Optional horizontal offset of the lens center in normalized coordinates */ + x: number; + /** Optional vertical offset of the lens center in normalized coordinates */ + y: number; +} + +export interface LensProjection { + /** Angle of incidence */ + angle: number; + /** Mapping radius as a consequence of the emergent angle */ + radius: number; + /** Optional ray absorption at the given angle due to vignetting. A value of one means no absorption */ + transmittance?: number; +} + +export interface LensDescription { + /** Optional focal length of the optical system */ + focalLength: number; + /** Offset of the lens center to the imager center in normalized coordinates */ + offset: LensOffset; + /** + * Radial description of the projection characteristics. + * The resulting curve is defined by the B-Spline interpolation over the given elements. + * The element for Radius zero shall not be provided. The projection points shall be ordered with ascending Radius. + * Items outside the last projection Radius shall be assumed to be invisible (black) + */ + projection: LensProjection; + /** Compensation of the x coordinate needed for the ONVIF normalized coordinate system */ + XFactor: number; +} + +export interface SceneOrientation { + /** Parameter to assign the way the camera determines the scene orientation */ + mode: 'MANUAL' | 'AUTO'; + /** + * Assigned or determined scene orientation based on the Mode. + * When assigning the Mode to AUTO, this field is optional and will be ignored by the device. + * When assigning the Mode to MANUAL, this field is required and the device will return an InvalidArgs fault if missing + */ + orientation?: string; +} + +export interface VideoSourceConfigurationExtension2 { + /** Optional element describing the geometric lens distortion. Multiple instances for future variable lens support */ + lensDescription?: LensDescription; + /** Optional element describing the scene orientation in the camera’s field of view */ + sceneOrientation: SceneOrientation; +} + +export interface VideoSourceConfigurationExtension { + /** + * Optional element to configure rotation of captured image. What resolutions a device supports shall be unaffected by the Rotate parameters. + * If a device is configured with Rotate=AUTO, the device shall take control over the Degree parameter and automatically update it so that a client can query current rotation. + * The device shall automatically apply the same rotation to its pan/tilt control direction depending on the following condition: + * if Reverse=AUTO in PTControlDirection or if the device doesn’t support Reverse in PTControlDirection + */ + rotate: Rotate; + extension?: VideoSourceConfigurationExtension2; +} + +export interface VideoSourceConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration + * This informational parameter is read-only. Deprecated for Media2 Service + * */ + useCount: number; + /** Readonly parameter signalling Source configuration's view mode, for devices supporting different view modes as defined in tt:viewModes */ + viewMode: string; + /** Reference to the physical input */ + sourceToken: string; + /** Rectangle specifying the Video capturing area. The capturing area shall not be larger than the whole Video source area */ + bounds: IntRectangle; + extension?: VideoSourceConfigurationExtension; +} + +export interface AudioSourceConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration + * This informational parameter is read-only. Deprecated for Media2 Service + */ + useCount: number; + /** Token of the Audio Source the configuration applies to */ + sourceToken: string; +} + +export interface VideoResolution { + /** Number of the columns of the Video image */ + width: number; + /** Number of the lines of the Video image */ + height: number; +} + +export interface VideoRateControl { + /** Maximum output framerate in fps. If an EncodingInterval is provided the resulting encoded framerate will be reduced by the given factor */ + frameRateLimit: number; + /** Interval at which images are encoded and transmitted. (A value of 1 means that every frame is encoded, a value of 2 means that every 2nd frame is encoded ...) */ + encodingInterval: number; + /** the maximum output bitrate in kbps */ + bitrateLimit: number; +} + +export interface Mpeg4Configuration { + /** + * Determines the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. + * An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. + * The frames in between are coded as P or B Frames + */ + govLength: number; + /** The Mpeg4 profile, either simple profile (SP) or advanced simple profile (ASP) */ + mpeg4Profile: 'SP' | 'ASP'; +} + +export interface H264Configuration { + /** + * Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. + * An entry of 1 indicates I-Frames are continuously generated. + * An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. + * The frames in between are coded as P or B Frames + */ + govLength: number; + /** The H.264 profile, either baseline, main, extended or high */ + H264Profile: 'Baseline' | 'Main' | 'Extended' | 'High'; +} + +export interface IPAddress { + /** Indicates if the address is an IPv4 or IPv6 address */ + type: 'IPv4' | 'IPv6'; + /** IPv4 address */ + IPv4Address?: string; + /** IPv6 address */ + IPv6Address?: string; +} + +export interface MulticastConfiguration { + /** The multicast address (if this address is set to 0 no multicast streaming is enaled) */ + address: IPAddress; + /** + * The RTP mutlicast destination port. A device may support RTCP. + * In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) + * destination port number as defined in the RTSP specification + */ + port: number; + /** + * In case of IPv6 the TTL value is assumed as the hop limit. + * Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets + * from (endlessly) circulating and not limiting scope. In these cases the address contains the scope + */ + TTL: number; + /** + * Read only property signalling that streaming is persistant. + * Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state. + */ + autoStart: boolean; +} + +export type Duration = string; + +export interface VideoEncoderConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** + * A value of true indicates that frame rate is a fixed value rather than an upper limit, + * and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. + * Default is false. + */ + guaranteedFrameRate: boolean; + /** Used video codec, either Jpeg, H.264 or Mpeg4 */ + encoding: 'JPEG' | 'MPEG4' | 'H264'; + /** Configured video resolution */ + resolution: VideoResolution; + /** + * Relative value for the video quantizers and the quality of the video. + * A high value within supported quality range means higher quality + */ + quality: number; + /** Optional element to configure rate control related parameters. */ + rateControl?: VideoRateControl; + /** Optional element to configure Mpeg4 related parameters */ + MPEG4?: Mpeg4Configuration; + /** Optional element to configure H.264 related parameters. */ + H264: H264Configuration; + /** Defines the multicast settings that could be used for video streaming */ + multicast: MulticastConfiguration; + /** The rtsp session timeout for the related video stream */ + sessionTimeout: Duration; +} + +export interface AudioEncoderConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** Audio codec used for encoding the audio input (either G.711, G.726 or AAC) */ + encoding: 'G711' | 'G726' | 'AAC'; + /** The output bitrate in kbps */ + bitrate: number; + /** The output sample rate in kHz */ + sampleRate: number; + /** Defines the multicast settings that could be used for video streaming */ + multicast: MulticastConfiguration; + /** The rtsp session timeout for the related audio stream */ + sessionTimeout: Duration; +} + +export interface ItemList { + /** Value name pair as defined by the corresponding description */ + simpleItem?: { + /** Item name */ + name: string; + /** Item value. The type is defined in the corresponding description */ + value: any; + } + /** Complex value structure */ + elementItem?: any; + extension: any; +} + +export interface Config { + /** Name of the configuration */ + name: string; + /** + * The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements + * returned by GetSupportedRules and GetSupportedAnalyticsModules command. + */ + type: string; + /** List of configuration parameters as defined in the corresponding description */ + parameters: ItemList[]; +} + +export interface AnalyticsEngineConfiguration { + analyticsModule?: Config; + extension?: any; +} + +export interface RuleEngineConfiguration { + rule?: Config; + extension?: any; +} + +export interface VideoAnalyticsConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + analyticsEngineConfiguration: AnalyticsEngineConfiguration; + ruleEngineConfiguration: RuleEngineConfiguration; +} + +export interface PTZSpeed { + /** + * Pan and tilt speed. The x component corresponds to pan and the y component to tilt. + * If omitted in a request, the current (if any) PanTilt movement should not be affected + */ + panTilt: { + x: number; + y: number; + }; + /** A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected */ + zoom: { + x: number; + } +} + +export interface Range { + min: number; + max: number; +} + +export interface Space2DDescription { + /** A URI of coordinate systems */ + URI: string; + /** A range of x-axis */ + XRange: Range; + /** A range of y-axis */ + YRange: Range; +} + +export interface PanTiltLimits { + /** A range of pan tilt limits */ + range: Space2DDescription; +} + +export interface Space1DDescription { + /** A URI of coordinate systems */ + URI: string; + /** A range of x-axis */ + XRange: Range; +} + +export interface ZoomLimits { + range: Space1DDescription; +} + +export interface PTControlDirection { + /** Optional element to configure related parameters for E-Flip */ + EFlip?: { + /** Parameter to enable/disable E-Flip feature */ + mode: 'OFF' | 'ON' | 'Extended'; + }; + /** Optional element to configure related parameters for reversing of PT Control Direction */ + reverse: { + /** Parameter to enable/disable Reverse feature */ + mode: 'OFF' | 'ON' | 'AUTO' | 'Extended'; + }; + extension: any; +} + +export interface PTZConfigurationExtension { + /** Optional element to configure PT Control Direction related features */ + PTControlDirection: PTControlDirection; + extension: any; +} + +export interface PTZConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** The optional acceleration ramp used by the device when moving */ + moveRamp: number; + /** The optional acceleration ramp used by the device when recalling presets */ + presetRamp: number; + /** The optional acceleration ramp used by the device when executing PresetTours */ + presetTourRamp: number; + /** A mandatory reference to the PTZ Node that the PTZ Configuration belongs to */ + nodeToken: string; + /** If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default */ + defaultAbsolutePantTiltPositionSpace?: string; + /** If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default */ + defaultAbsoluteZoomPositionSpace?: string; + /** If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default */ + defaultRelativePanTiltTranslationSpace?: string; + /** If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default */ + defaultRelativeZoomTranslationSpace?: string + /** If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default */ + defaultContinuousPanTiltVelocitySpace?: string; + /** If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default */ + defaultContinuousZoomVelocitySpace?: string; + /** If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds */ + defaultPTZSpeed?: PTZSpeed; + /** If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops */ + defaultPTZTimeout?: Duration; + /** + * The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. + * If the element is present it signals the support for configurable Pan/Tilt limits. + * If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. + * The Pan/Tilt limits are disabled by setting the limits to –INF or +INF + */ + panTiltLimits?: PanTiltLimits; + /** + * The Zoom limits element should be present for a PTZ Node that supports absolute zoom. + * If the element is present it signals the supports for configurable Zoom limits. + * If limits are enabled the zoom movements shall always stay within the specified range. + * The Zoom limits are disabled by settings the limits to -INF and +INF + */ + zoomLimits?: ZoomLimits; + extension?: PTZConfigurationExtension; +} + +export interface Profile { + /** Unique identifier of the profile */ + token: string; + /** A value of true signals that the profile cannot be deleted. Default is false */ + fixed: boolean; + /** User readable name of the profile */ + name: string; + /** Optional configuration of the Video input */ + videoSourceConfiguration?: VideoSourceConfiguration; + /** Optional configuration of the Audio input */ + audioSourceConfiguration?: AudioSourceConfiguration; + /** Optional configuration of the Video encoder */ + videoEncoderConfiguration?: VideoEncoderConfiguration; + /** Optional configuration of the Audio encoder */ + audioEncoderConfiguration?: AudioEncoderConfiguration; + /** Optional configuration of the video analytics module and rule engine */ + videoAnalyticsConfiguration?: VideoAnalyticsConfiguration; + /** Optional configuration of the pan tilt zoom unit */ + PTZConfiguration?: PTZConfiguration; + +// PTZConfiguration - optional; [PTZConfiguration] +// Optional configuration of the pan tilt zoom unit. +// token - required; [ReferenceToken] +// Token that uniquely references this configuration. Length up to 64 characters. +// Name [Name] +// User readable name. Length up to 64 characters. +// UseCount [int] +// Number of internal references currently using this configuration. +// +// This informational parameter is read-only. Deprecated for Media2 Service. +// MoveRamp [int] +// The optional acceleration ramp used by the device when moving. +// PresetRamp [int] +// The optional acceleration ramp used by the device when recalling presets. +// PresetTourRamp [int] +// The optional acceleration ramp used by the device when executing PresetTours. +// NodeToken [ReferenceToken] +// A mandatory reference to the PTZ Node that the PTZ Configuration belongs to. +// DefaultAbsolutePantTiltPositionSpace - optional; [anyURI] +// If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default. +// DefaultAbsoluteZoomPositionSpace - optional; [anyURI] +// If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default. +// DefaultRelativePanTiltTranslationSpace - optional; [anyURI] +// If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default. +// DefaultRelativeZoomTranslationSpace - optional; [anyURI] +// If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default. +// DefaultContinuousPanTiltVelocitySpace - optional; [anyURI] +// If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default. +// DefaultContinuousZoomVelocitySpace - optional; [anyURI] +// If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default. +// DefaultPTZSpeed - optional; [PTZSpeed] +// If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds. +// PanTilt - optional; [Vector2D] +// Pan and tilt speed. The x component corresponds to pan and the y component to tilt. If omitted in a request, the current (if any) PanTilt movement should not be affected. +// Zoom - optional; [Vector1D] +// A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected. +// DefaultPTZTimeout - optional; [duration] +// If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops. +// PanTiltLimits - optional; [PanTiltLimits] +// The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. If the element is present it signals the support for configurable Pan/Tilt limits. If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. The Pan/Tilt limits are disabled by setting the limits to –INF or +INF. +// Range [Space2DDescription] +// A range of pan tilt limits. +// URI [anyURI] +// A URI of coordinate systems. +// XRange [FloatRange] +// A range of x-axis. +// Min [float] +// Max [float] +// YRange [FloatRange] +// A range of y-axis. +// Min [float] +// Max [float] +// ZoomLimits - optional; [ZoomLimits] +// The Zoom limits element should be present for a PTZ Node that supports absolute zoom. If the element is present it signals the supports for configurable Zoom limits. If limits are enabled the zoom movements shall always stay within the specified range. The Zoom limits are disabled by settings the limits to -INF and +INF. +// Range [Space1DDescription] +// A range of zoom limit +// URI [anyURI] +// A URI of coordinate systems. +// XRange [FloatRange] +// A range of x-axis. +// Min [float] +// Max [float] +// Extension - optional; [PTZConfigurationExtension] +// PTControlDirection - optional; [PTControlDirection] +// Optional element to configure PT Control Direction related features. +// EFlip - optional; [EFlip] +// Optional element to configure related parameters for E-Flip. +// Mode [EFlipMode] +// Parameter to enable/disable E-Flip feature. +// - enum { 'OFF', 'ON', 'Extended' } +// Reverse - optional; [Reverse] +// Optional element to configure related parameters for reversing of PT Control Direction. +// Mode [ReverseMode] +// Parameter to enable/disable Reverse feature. +// - enum { 'OFF', 'ON', 'AUTO', 'Extended' } +// Extension - optional; [PTControlDirectionExtension] +// Extension - optional; [PTZConfigurationExtension2] +// MetadataConfiguration - optional; [MetadataConfiguration] +// Optional configuration of the metadata stream. +// token - required; [ReferenceToken] +// Token that uniquely references this configuration. Length up to 64 characters. +// Name [Name] +// User readable name. Length up to 64 characters. +// UseCount [int] +// Number of internal references currently using this configuration. +// +// This informational parameter is read-only. Deprecated for Media2 Service. +// CompressionType [string] +// Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType. +// GeoLocation [boolean] +// Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target. +// ShapePolygon [boolean] +// Optional parameter to configure if the generated metadata stream should contain shape information as polygon. +// PTZStatus - optional; [PTZFilter] +// optional element to configure which PTZ related data is to include in the metadata stream +// Status [boolean] +// True if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN) +// Position [boolean] +// True if the metadata stream shall contain the PTZ position +// Events - optional; [EventSubscription] +// Optional element to configure the streaming of events. A client might be interested in receiving all, none or some of the events produced by the device: +// To get all events: Include the Events element but do not include a filter. +// To get no events: Do not include the Events element. +// To get only some events: Include the Events element and include a filter in the element. +// Filter - optional; [FilterType] +// SubscriptionPolicy - optional; +// Analytics - optional; [boolean] +// Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) +// Multicast [MulticastConfiguration] +// Defines the multicast settings that could be used for video streaming. +// Address [IPAddress] +// The multicast address (if this address is set to 0 no multicast streaming is enaled) +// Type [IPType] +// Indicates if the address is an IPv4 or IPv6 address. +// - enum { 'IPv4', 'IPv6' } +// IPv4Address - optional; [IPv4Address] +// IPv4 address. +// IPv6Address - optional; [IPv6Address] +// IPv6 address +// Port [int] +// The RTP mutlicast destination port. A device may support RTCP. In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) destination port number as defined in the RTSP specification. +// TTL [int] +// In case of IPv6 the TTL value is assumed as the hop limit. Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets from (endlessly) circulating and not limiting scope. In these cases the address contains the scope. +// AutoStart [boolean] +// Read only property signalling that streaming is persistant. Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state. +// SessionTimeout [duration] +// The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) +// AnalyticsEngineConfiguration - optional; [AnalyticsEngineConfiguration] +// Indication which AnalyticsModules shall output metadata. Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration. +// AnalyticsModule - optional, unbounded; [Config] +// Name - required; [string] +// Name of the configuration. +// Type - required; [QName] +// The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements returned by GetSupportedRules and GetSupportedAnalyticsModules command. +// Parameters [ItemList] +// List of configuration parameters as defined in the corresponding description. +// SimpleItem - optional, unbounded; +// Value name pair as defined by the corresponding description. +// Name - required; [string] +// Item name. +// Value - required; [anySimpleType] +// Item value. The type is defined in the corresponding description. +// ElementItem - optional, unbounded; +// Complex value structure. +// Name - required; [string] +// Item name. +// Extension - optional; [ItemListExtension] +// Extension - optional; [AnalyticsEngineConfigurationExtension] +// Extension - optional; [MetadataConfigurationExtension] +// Extension - optional; [ProfileExtension] +// Extensions defined in ONVIF 2.0 +// AudioOutputConfiguration - optional; [AudioOutputConfiguration] +// Optional configuration of the Audio output. +// token - required; [ReferenceToken] +// Token that uniquely references this configuration. Length up to 64 characters. +// Name [Name] +// User readable name. Length up to 64 characters. +// UseCount [int] +// Number of internal references currently using this configuration. +// +// This informational parameter is read-only. Deprecated for Media2 Service. +// OutputToken [ReferenceToken] +// Token of the phsycial Audio output. +// SendPrimacy - optional; [anyURI] +// An audio channel MAY support different types of audio transmission. While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which direction is currently active. An NVC can switch between different modes by setting the AudioOutputConfiguration. +// +// The following modes for the Send-Primacy are defined: +// www.onvif.org/ver20/HalfDuplex/Server The server is allowed to send audio data to the client. The client shall not send audio data via the backchannel to the NVT in this mode. +// www.onvif.org/ver20/HalfDuplex/Client The client is allowed to send audio data via the backchannel to the server. The NVT shall not send audio data to the client in this mode. +// www.onvif.org/ver20/HalfDuplex/Auto It is up to the device how to deal with sending and receiving audio data. +// Acoustic echo cancellation is out of ONVIF scope. +// OutputLevel [int] +// Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRange. +// AudioDecoderConfiguration - optional; [AudioDecoderConfiguration] +// Optional configuration of the Audio decoder. +// token - required; [ReferenceToken] +// Token that uniquely references this configuration. Length up to 64 characters. +// Name [Name] +// User readable name. Length up to 64 characters. +// UseCount [int] +// Number of internal references currently using this configuration. +// +// This informational parameter is read-only. Deprecated for Media2 Service. +// Extension - optional; [ProfileExtension2] +} + +interface MediaProfile { + +} + +export class Media { + private onvif: Onvif; + + constructor(onvif: Onvif) { + this.onvif = onvif; + } + + /** + * Receive profiles + */ + async getProfiles(): Promise<[Profile | MediaProfile]> { + if (this.onvif.device.media2Support) { + // Profile T request using Media2 + // The reply is in a different format to the old API so we convert the data from the new API to the old structure + // for backwards compatibility with existing users of this library + const [data] = await this.onvif.request({ + service : 'media2', + body : '' + + 'All' + + '}', + }); + + // Slight difference in Media1 and Media2 reply XML + // Generate a reply that looks like a Media1 reply for existing library users + this.onvif.profiles = data[0].getProfilesResponse[0].profiles.map((profile: Record) => { + const tmp = linerase(profile); + const newProfile = {}; + newProfile.$ = tmp.$; // copy Profile Token + newProfile.name = tmp.name; + // Media2 Spec says there will be these some or all of these configuration entities + // Video source configuration + // Audio source configuration + // Video encoder configuration + // Audio encoder configuration + // PTZ configuration + // Video analytics configuration + // Metadata configuration + // Audio output configuration + // Audio decoder configuration + if (tmp.configurations.videoSource) { newProfile.videoSourceConfiguration = tmp.configurations.videoSource; } + if (tmp.configurations.audioSource) { newProfile.audioSourceConfiguration = tmp.configurations.audioSource; } + if (tmp.configurations.videoEncoder) { newProfile.videoEncoderConfiguration = tmp.configurations.videoEncoder; } + if (tmp.configurations.audioEncoder) { newProfile.audioEncoderConfiguration = tmp.configurations.audioEncoder; } + if (tmp.configurations.PTZ) { newProfile.PTZConfiguration = tmp.configurations.PTZ; } + if (tmp.configurations.analytics) { newProfile.analyticsConfiguration = tmp.configurations.analytics; } + if (tmp.configurations.metadata) { newProfile.metadataConfiguration = tmp.configurations.metadata; } + if (tmp.configurations.audioOutput) { newProfile.audioOutputConfiguration = tmp.configurations.audioOutput; } + if (tmp.configurations.audioOutput) { newProfile.audioDecoderConfiguration = tmp.configurations.audioDecoder; } + + // TODO - Add Audio + return newProfile; + }); + if (callback) { + callback.call(this, err, this.profiles, xml); + } + } + this.onvif.profiles[0].videoSourceConfiguration!.extension.rotate; + return [{}]; + } +} diff --git a/src/onvif.ts b/src/onvif.ts index 7988da95..b55bc669 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -6,6 +6,7 @@ import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; import { Capabilities, Device } from './device'; +import { Profile } from './media'; /** * Cam constructor options @@ -31,18 +32,18 @@ export interface OnvifOptions { export interface OnvifServices { PTZ?: URL; - media?: URL; - media2?: URL; - imaging?: URL; - events?: URL; + analyticsDevice?: URL; device?: URL; deviceIO?: URL; - search?: URL; display?: URL; + events?: URL; + imaging?: URL; + media2?: URL; + media?: URL; + receiver?: URL; recording?: URL; replay?: URL; - receiver?: URL; - analyticsDevice?: URL; + search?: URL; } export interface OnvifRequestOptions extends RequestOptions{ @@ -106,6 +107,7 @@ export class Onvif extends EventEmitter { public uri: OnvifServices; private timeShift?: number; public capabilities: Capabilities; + public profiles: Profile[]; constructor(options: OnvifOptions) { super(); @@ -122,6 +124,7 @@ export class Onvif extends EventEmitter { this.events = {}; this.uri = {}; this.capabilities = {}; + this.profiles = []; this.device = new Device(this); /** Bind event handling to the `event` event */ this.on('newListener', (name) => { From 86eff4da9795e508368f8817c19ed42b2a9571ad Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 15 Jan 2022 14:33:01 +0300 Subject: [PATCH 037/112] Slice of interfaces work --- src/media.ts | 294 +++++++++++++++++++-------------------------------- 1 file changed, 108 insertions(+), 186 deletions(-) diff --git a/src/media.ts b/src/media.ts index 9bd174e8..bdae7ac9 100644 --- a/src/media.ts +++ b/src/media.ts @@ -1,7 +1,8 @@ -import { isNumber } from 'util'; import { Onvif } from './onvif'; import { linerase } from './utils'; +export type AnyURI = string; + export interface IntRectangle { x: number; y: number; @@ -407,6 +408,97 @@ export interface PTZConfiguration { extension?: PTZConfigurationExtension; } +export interface PTZFilter { + /** `true` if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN) */ + status: boolean; + /** `true` if the metadata stream shall contain the PTZ position */ + position: boolean; +} + +export interface EventSubscription { + filter?: string; + subscriptionPolicy?: any; +} + +export interface MetadataConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType */ + compressionType: string; + /** Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target */ + geoLocation: boolean; + /** Optional parameter to configure if the generated metadata stream should contain shape information as polygon */ + shapePolygon: boolean; + /** Optional element to configure which PTZ related data is to include in the metadata stream */ + PTZStatus?: PTZFilter; + /** + * Optional element to configure the streaming of events. + * A client might be interested in receiving all, none or some of the events produced by the device: + * - To get all events: Include the Events element but do not include a filter + * - To get no events: Do not include the Events element + * - To get only some events: Include the Events element and include a filter in the element + */ + events: EventSubscription; + extension?: any; +} + +export interface AudioOutputConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** Token of the phsycial Audio output */ + outputToken: string; + /** + * An audio channel MAY support different types of audio transmission. + * While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. + * The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which direction is currently active. + * An NVC can switch between different modes by setting the AudioOutputConfiguration. + * The following modes for the Send-Primacy are defined: + * - www.onvif.org/ver20/HalfDuplex/Server The server is allowed to send audio data to the client. + * The client shall not send audio data via the backchannel to the NVT in this mode. + * - www.onvif.org/ver20/HalfDuplex/Client The client is allowed to send audio data via the backchannel to the server. + * The NVT shall not send audio data to the client in this mode. + * - www.onvif.org/ver20/HalfDuplex/Auto It is up to the device how to deal with sending and receiving audio data. + * Acoustic echo cancellation is out of ONVIF scope. + */ + sendPrimacy?: AnyURI; + /** Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRang */ + outputLevel: number; +} + +export interface AudioDecoderConfiguration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: string; + /** User readable name. Length up to 64 characters */ + name: string; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; +} + +export interface ProfileExtension { + /** Optional configuration of the Audio output */ + audioOutputConfiguration: AudioOutputConfiguration; + /** Optional configuration of the Audio decoder */ + audioDecoderConfiguration: AudioDecoderConfiguration; + extension: any; +} + export interface Profile { /** Unique identifier of the profile */ token: string; @@ -426,191 +518,21 @@ export interface Profile { videoAnalyticsConfiguration?: VideoAnalyticsConfiguration; /** Optional configuration of the pan tilt zoom unit */ PTZConfiguration?: PTZConfiguration; - -// PTZConfiguration - optional; [PTZConfiguration] -// Optional configuration of the pan tilt zoom unit. -// token - required; [ReferenceToken] -// Token that uniquely references this configuration. Length up to 64 characters. -// Name [Name] -// User readable name. Length up to 64 characters. -// UseCount [int] -// Number of internal references currently using this configuration. -// -// This informational parameter is read-only. Deprecated for Media2 Service. -// MoveRamp [int] -// The optional acceleration ramp used by the device when moving. -// PresetRamp [int] -// The optional acceleration ramp used by the device when recalling presets. -// PresetTourRamp [int] -// The optional acceleration ramp used by the device when executing PresetTours. -// NodeToken [ReferenceToken] -// A mandatory reference to the PTZ Node that the PTZ Configuration belongs to. -// DefaultAbsolutePantTiltPositionSpace - optional; [anyURI] -// If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default. -// DefaultAbsoluteZoomPositionSpace - optional; [anyURI] -// If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default. -// DefaultRelativePanTiltTranslationSpace - optional; [anyURI] -// If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default. -// DefaultRelativeZoomTranslationSpace - optional; [anyURI] -// If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default. -// DefaultContinuousPanTiltVelocitySpace - optional; [anyURI] -// If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default. -// DefaultContinuousZoomVelocitySpace - optional; [anyURI] -// If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default. -// DefaultPTZSpeed - optional; [PTZSpeed] -// If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds. -// PanTilt - optional; [Vector2D] -// Pan and tilt speed. The x component corresponds to pan and the y component to tilt. If omitted in a request, the current (if any) PanTilt movement should not be affected. -// Zoom - optional; [Vector1D] -// A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected. -// DefaultPTZTimeout - optional; [duration] -// If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops. -// PanTiltLimits - optional; [PanTiltLimits] -// The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. If the element is present it signals the support for configurable Pan/Tilt limits. If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. The Pan/Tilt limits are disabled by setting the limits to –INF or +INF. -// Range [Space2DDescription] -// A range of pan tilt limits. -// URI [anyURI] -// A URI of coordinate systems. -// XRange [FloatRange] -// A range of x-axis. -// Min [float] -// Max [float] -// YRange [FloatRange] -// A range of y-axis. -// Min [float] -// Max [float] -// ZoomLimits - optional; [ZoomLimits] -// The Zoom limits element should be present for a PTZ Node that supports absolute zoom. If the element is present it signals the supports for configurable Zoom limits. If limits are enabled the zoom movements shall always stay within the specified range. The Zoom limits are disabled by settings the limits to -INF and +INF. -// Range [Space1DDescription] -// A range of zoom limit -// URI [anyURI] -// A URI of coordinate systems. -// XRange [FloatRange] -// A range of x-axis. -// Min [float] -// Max [float] -// Extension - optional; [PTZConfigurationExtension] -// PTControlDirection - optional; [PTControlDirection] -// Optional element to configure PT Control Direction related features. -// EFlip - optional; [EFlip] -// Optional element to configure related parameters for E-Flip. -// Mode [EFlipMode] -// Parameter to enable/disable E-Flip feature. -// - enum { 'OFF', 'ON', 'Extended' } -// Reverse - optional; [Reverse] -// Optional element to configure related parameters for reversing of PT Control Direction. -// Mode [ReverseMode] -// Parameter to enable/disable Reverse feature. -// - enum { 'OFF', 'ON', 'AUTO', 'Extended' } -// Extension - optional; [PTControlDirectionExtension] -// Extension - optional; [PTZConfigurationExtension2] -// MetadataConfiguration - optional; [MetadataConfiguration] -// Optional configuration of the metadata stream. -// token - required; [ReferenceToken] -// Token that uniquely references this configuration. Length up to 64 characters. -// Name [Name] -// User readable name. Length up to 64 characters. -// UseCount [int] -// Number of internal references currently using this configuration. -// -// This informational parameter is read-only. Deprecated for Media2 Service. -// CompressionType [string] -// Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType. -// GeoLocation [boolean] -// Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target. -// ShapePolygon [boolean] -// Optional parameter to configure if the generated metadata stream should contain shape information as polygon. -// PTZStatus - optional; [PTZFilter] -// optional element to configure which PTZ related data is to include in the metadata stream -// Status [boolean] -// True if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN) -// Position [boolean] -// True if the metadata stream shall contain the PTZ position -// Events - optional; [EventSubscription] -// Optional element to configure the streaming of events. A client might be interested in receiving all, none or some of the events produced by the device: -// To get all events: Include the Events element but do not include a filter. -// To get no events: Do not include the Events element. -// To get only some events: Include the Events element and include a filter in the element. -// Filter - optional; [FilterType] -// SubscriptionPolicy - optional; -// Analytics - optional; [boolean] -// Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) -// Multicast [MulticastConfiguration] -// Defines the multicast settings that could be used for video streaming. -// Address [IPAddress] -// The multicast address (if this address is set to 0 no multicast streaming is enaled) -// Type [IPType] -// Indicates if the address is an IPv4 or IPv6 address. -// - enum { 'IPv4', 'IPv6' } -// IPv4Address - optional; [IPv4Address] -// IPv4 address. -// IPv6Address - optional; [IPv6Address] -// IPv6 address -// Port [int] -// The RTP mutlicast destination port. A device may support RTCP. In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) destination port number as defined in the RTSP specification. -// TTL [int] -// In case of IPv6 the TTL value is assumed as the hop limit. Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets from (endlessly) circulating and not limiting scope. In these cases the address contains the scope. -// AutoStart [boolean] -// Read only property signalling that streaming is persistant. Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state. -// SessionTimeout [duration] -// The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) -// AnalyticsEngineConfiguration - optional; [AnalyticsEngineConfiguration] -// Indication which AnalyticsModules shall output metadata. Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration. -// AnalyticsModule - optional, unbounded; [Config] -// Name - required; [string] -// Name of the configuration. -// Type - required; [QName] -// The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements returned by GetSupportedRules and GetSupportedAnalyticsModules command. -// Parameters [ItemList] -// List of configuration parameters as defined in the corresponding description. -// SimpleItem - optional, unbounded; -// Value name pair as defined by the corresponding description. -// Name - required; [string] -// Item name. -// Value - required; [anySimpleType] -// Item value. The type is defined in the corresponding description. -// ElementItem - optional, unbounded; -// Complex value structure. -// Name - required; [string] -// Item name. -// Extension - optional; [ItemListExtension] -// Extension - optional; [AnalyticsEngineConfigurationExtension] -// Extension - optional; [MetadataConfigurationExtension] -// Extension - optional; [ProfileExtension] -// Extensions defined in ONVIF 2.0 -// AudioOutputConfiguration - optional; [AudioOutputConfiguration] -// Optional configuration of the Audio output. -// token - required; [ReferenceToken] -// Token that uniquely references this configuration. Length up to 64 characters. -// Name [Name] -// User readable name. Length up to 64 characters. -// UseCount [int] -// Number of internal references currently using this configuration. -// -// This informational parameter is read-only. Deprecated for Media2 Service. -// OutputToken [ReferenceToken] -// Token of the phsycial Audio output. -// SendPrimacy - optional; [anyURI] -// An audio channel MAY support different types of audio transmission. While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which direction is currently active. An NVC can switch between different modes by setting the AudioOutputConfiguration. -// -// The following modes for the Send-Primacy are defined: -// www.onvif.org/ver20/HalfDuplex/Server The server is allowed to send audio data to the client. The client shall not send audio data via the backchannel to the NVT in this mode. -// www.onvif.org/ver20/HalfDuplex/Client The client is allowed to send audio data via the backchannel to the server. The NVT shall not send audio data to the client in this mode. -// www.onvif.org/ver20/HalfDuplex/Auto It is up to the device how to deal with sending and receiving audio data. -// Acoustic echo cancellation is out of ONVIF scope. -// OutputLevel [int] -// Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRange. -// AudioDecoderConfiguration - optional; [AudioDecoderConfiguration] -// Optional configuration of the Audio decoder. -// token - required; [ReferenceToken] -// Token that uniquely references this configuration. Length up to 64 characters. -// Name [Name] -// User readable name. Length up to 64 characters. -// UseCount [int] -// Number of internal references currently using this configuration. -// -// This informational parameter is read-only. Deprecated for Media2 Service. -// Extension - optional; [ProfileExtension2] + /** Optional configuration of the metadata stream */ + MetadataConfiguration?: MetadataConfiguration; + /** Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) */ + analytics?: boolean; + /** Defines the multicast settings that could be used for video streaming */ + multicast: MulticastConfiguration; + /** The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) */ + sessionTimeout: Duration; + /** + * Indication which AnalyticsModules shall output metadata. + * Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration + */ + analyticsEngineConfiguration?: AnalyticsEngineConfiguration; + /** Extensions defined in ONVIF 2.0 */ + extension?: ProfileExtension; } interface MediaProfile { From 2b17bb74f26edcd6fd04fed4285fcfbd13bf84bb Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 15 Jan 2022 16:32:05 +0300 Subject: [PATCH 038/112] `media.getProfiles` method --- src/media.ts | 222 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 169 insertions(+), 53 deletions(-) diff --git a/src/media.ts b/src/media.ts index bdae7ac9..c79dad21 100644 --- a/src/media.ts +++ b/src/media.ts @@ -2,6 +2,8 @@ import { Onvif } from './onvif'; import { linerase } from './utils'; export type AnyURI = string; +export type ReferenceToken = string; +export type Name = string; export interface IntRectangle { x: number; @@ -81,9 +83,9 @@ export interface VideoSourceConfigurationExtension { export interface VideoSourceConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration * This informational parameter is read-only. Deprecated for Media2 Service @@ -100,9 +102,9 @@ export interface VideoSourceConfiguration { export interface AudioSourceConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration * This informational parameter is read-only. Deprecated for Media2 Service @@ -186,9 +188,9 @@ export type Duration = string; export interface VideoEncoderConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -214,7 +216,7 @@ export interface VideoEncoderConfiguration { /** Optional element to configure Mpeg4 related parameters */ MPEG4?: Mpeg4Configuration; /** Optional element to configure H.264 related parameters. */ - H264: H264Configuration; + H264?: H264Configuration; /** Defines the multicast settings that could be used for video streaming */ multicast: MulticastConfiguration; /** The rtsp session timeout for the related video stream */ @@ -223,9 +225,9 @@ export interface VideoEncoderConfiguration { export interface AudioEncoderConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -280,9 +282,9 @@ export interface RuleEngineConfiguration { export interface VideoAnalyticsConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -359,9 +361,9 @@ export interface PTZConfigurationExtension { export interface PTZConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -422,9 +424,9 @@ export interface EventSubscription { export interface MetadataConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -446,21 +448,32 @@ export interface MetadataConfiguration { * - To get only some events: Include the Events element and include a filter in the element */ events: EventSubscription; + /** Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) */ + analytics?: boolean; + /** Defines the multicast settings that could be used for video streaming */ + multicast: MulticastConfiguration; + /** The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) */ + sessionTimeout: Duration; + /** + * Indication which AnalyticsModules shall output metadata. + * Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration + */ + analyticsEngineConfiguration?: AnalyticsEngineConfiguration; extension?: any; } export interface AudioOutputConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. */ useCount: number; /** Token of the phsycial Audio output */ - outputToken: string; + outputToken: ReferenceToken; /** * An audio channel MAY support different types of audio transmission. * While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. @@ -481,9 +494,9 @@ export interface AudioOutputConfiguration { export interface AudioDecoderConfiguration { /** Token that uniquely references this configuration. Length up to 64 characters */ - token: string; + token: ReferenceToken; /** User readable name. Length up to 64 characters */ - name: string; + name: Name; /** * Number of internal references currently using this configuration. * This informational parameter is read-only. Deprecated for Media2 Service. @@ -496,12 +509,12 @@ export interface ProfileExtension { audioOutputConfiguration: AudioOutputConfiguration; /** Optional configuration of the Audio decoder */ audioDecoderConfiguration: AudioDecoderConfiguration; - extension: any; + extension?: any; } export interface Profile { /** Unique identifier of the profile */ - token: string; + token: ReferenceToken; /** A value of true signals that the profile cannot be deleted. Default is false */ fixed: boolean; /** User readable name of the profile */ @@ -519,24 +532,117 @@ export interface Profile { /** Optional configuration of the pan tilt zoom unit */ PTZConfiguration?: PTZConfiguration; /** Optional configuration of the metadata stream */ - MetadataConfiguration?: MetadataConfiguration; - /** Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) */ - analytics?: boolean; + metadataConfiguration?: MetadataConfiguration; + /** Extensions defined in ONVIF 2.0 */ + extension?: ProfileExtension; +} + +export interface VideoRateControl2 { + /** Enforce constant bitrate */ + constantBitRate: boolean; + /** Desired frame rate in fps. The actual rate may be lower due to e.g. performance limitations */ + frameRateLimit: number; + /** the maximum output bitrate in kbps */ + bitrateLimit: number; +} + +export interface VideoEncoder2Configuration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: ReferenceToken; + /** User readable name. Length up to 64 characters */ + name: Name; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount?: number; + /** + * Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. + * An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, + * and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames + */ + govLength: number; + /** The encoder profile as defined in tt:VideoEncodingProfiles */ + profile: string; + /** + * A value of true indicates that frame rate is a fixed value rather than an upper limit, + * and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. + * Default is false. + */ + guaranteedFrameRate: boolean; + /** + * Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types + * https://www.iana.org/assignments/media-types/media-types.xhtml#video + */ + encoding: string; + /** Configured video resolution */ + resolution: VideoResolution; + /** Optional element to configure rate control related parameters. */ + rateControl?: VideoRateControl2; /** Defines the multicast settings that could be used for video streaming */ - multicast: MulticastConfiguration; - /** The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) */ - sessionTimeout: Duration; + mutlicast?: MulticastConfiguration; /** - * Indication which AnalyticsModules shall output metadata. - * Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration + * Relative value for the video quantizers and the quality of the video. + * A high value within supported quality range means higher quality */ - analyticsEngineConfiguration?: AnalyticsEngineConfiguration; - /** Extensions defined in ONVIF 2.0 */ - extension?: ProfileExtension; + quality: number; } -interface MediaProfile { +export interface AudioEncoder2Configuration { + /** Token that uniquely references this configuration. Length up to 64 characters */ + token: ReferenceToken; + /** User readable name. Length up to 64 characters */ + name: Name; + /** + * Number of internal references currently using this configuration. + * This informational parameter is read-only. Deprecated for Media2 Service. + */ + useCount: number; + /** + * Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and IANA Media Types + * https://www.iana.org/assignments/media-types/media-types.xhtml#audio + */ + encoding: string; + /** Optional multicast configuration of the audio stream */ + multicast?: MulticastConfiguration; + /** The output bitrate in kbps */ + bitrate: number; + /** The output sample rate in kHz */ + sampleRate: number; +} +export interface ConfigurationSet { + /** Optional configuration of the Video input */ + videoSource?: VideoSourceConfiguration; + /** Optional configuration of the Audio input */ + audioSource?: AudioSourceConfiguration; + /** Optional configuration of the Video encoder */ + videoEncoder?: VideoEncoder2Configuration; + /** Optional configuration of the Audio encoder */ + audioEncoder?: AudioEncoder2Configuration; + /** Optional configuration of the analytics module and rule engine */ + analytics?: VideoAnalyticsConfiguration; + /** Optional configuration of the pan tilt zoom unit */ + PTZ?: PTZConfiguration; + /** Optional configuration of the metadata stream */ + metadata?: MetadataConfiguration; + /** Optional configuration of the Audio output */ + audioOutput?: AudioOutputConfiguration; + /** Optional configuration of the Audio decoder */ + audioDecoder?: AudioDecoderConfiguration; + /** Optional configuration of the Receiver */ + receiver?: any; +} + +export interface MediaProfile { + /** Unique identifier of the profile */ + token: ReferenceToken; + /** A value of true signals that the profile cannot be deleted. Default is false */ + fixed: boolean; + /** User readable name of the profile */ + name: Name; + /** The configurations assigned to the profile */ + configurations: ConfigurationSet; } export class Media { @@ -549,25 +655,25 @@ export class Media { /** * Receive profiles */ - async getProfiles(): Promise<[Profile | MediaProfile]> { + async getProfiles(): Promise<(Profile | MediaProfile)[]> { if (this.onvif.device.media2Support) { // Profile T request using Media2 // The reply is in a different format to the old API so we convert the data from the new API to the old structure // for backwards compatibility with existing users of this library const [data] = await this.onvif.request({ service : 'media2', - body : '' - + 'All' - + '}', + body : 'All', }); // Slight difference in Media1 and Media2 reply XML // Generate a reply that looks like a Media1 reply for existing library users this.onvif.profiles = data[0].getProfilesResponse[0].profiles.map((profile: Record) => { - const tmp = linerase(profile); - const newProfile = {}; - newProfile.$ = tmp.$; // copy Profile Token - newProfile.name = tmp.name; + const tmp = linerase(profile) as MediaProfile; + const newProfile: Profile = { + token : tmp.token, + name : tmp.name, + fixed : tmp.fixed || false, + }; // Media2 Spec says there will be these some or all of these configuration entities // Video source configuration // Audio source configuration @@ -580,22 +686,32 @@ export class Media { // Audio decoder configuration if (tmp.configurations.videoSource) { newProfile.videoSourceConfiguration = tmp.configurations.videoSource; } if (tmp.configurations.audioSource) { newProfile.audioSourceConfiguration = tmp.configurations.audioSource; } - if (tmp.configurations.videoEncoder) { newProfile.videoEncoderConfiguration = tmp.configurations.videoEncoder; } - if (tmp.configurations.audioEncoder) { newProfile.audioEncoderConfiguration = tmp.configurations.audioEncoder; } + if (tmp.configurations.videoEncoder) { + newProfile.videoEncoderConfiguration = tmp.configurations.videoEncoder as unknown as VideoEncoderConfiguration; + } + if (tmp.configurations.audioEncoder) { + newProfile.audioEncoderConfiguration = tmp.configurations.audioEncoder as AudioEncoderConfiguration; + } if (tmp.configurations.PTZ) { newProfile.PTZConfiguration = tmp.configurations.PTZ; } - if (tmp.configurations.analytics) { newProfile.analyticsConfiguration = tmp.configurations.analytics; } + if (tmp.configurations.analytics) { newProfile.videoAnalyticsConfiguration = tmp.configurations.analytics; } if (tmp.configurations.metadata) { newProfile.metadataConfiguration = tmp.configurations.metadata; } - if (tmp.configurations.audioOutput) { newProfile.audioOutputConfiguration = tmp.configurations.audioOutput; } - if (tmp.configurations.audioOutput) { newProfile.audioDecoderConfiguration = tmp.configurations.audioDecoder; } - + if (tmp.configurations.audioOutput || tmp.configurations.audioDecoder) { + newProfile.extension = { + audioOutputConfiguration : tmp.configurations.audioOutput!, + audioDecoderConfiguration : tmp.configurations.audioDecoder!, + }; + } // TODO - Add Audio return newProfile; }); - if (callback) { - callback.call(this, err, this.profiles, xml); - } + return this.onvif.profiles; } - this.onvif.profiles[0].videoSourceConfiguration!.extension.rotate; - return [{}]; + // Original ONVIF Media support (used in Profile S) + const [data] = await this.onvif.request({ + service : 'media', + body : '', + }); + this.onvif.profiles = data[0].getProfilesResponse[0].profiles.map(linerase); + return this.onvif.profiles; } } From 3938114077fa12cf58d591fdaf826933a1929f1e Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 15 Jan 2022 21:34:53 +0300 Subject: [PATCH 039/112] `media.getVideoSources` interfaces --- src/media.ts | 304 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/onvif.ts | 4 +- 2 files changed, 301 insertions(+), 7 deletions(-) diff --git a/src/media.ts b/src/media.ts index c79dad21..4d6c4ffc 100644 --- a/src/media.ts +++ b/src/media.ts @@ -645,8 +645,292 @@ export interface MediaProfile { configurations: ConfigurationSet; } +export interface BacklightCompensation { + /** + * Backlight compensation mode (on/off). + * - OFF: Backlight compensation is disabled + * - ON: Backlight compensation is enabled + */ + mode: 'ON' | 'OFF'; + /** Optional level parameter (unit unspecified) */ + level: number; +} + +export interface Rectangle { + x: number; + y: number; + width: number; + height: number; +} + +export interface Exposure { + /** + * Exposure Mode + * - Auto – Enabled the exposure algorithm on the NVT + * - Manual – Disabled exposure algorithm on the NVT + */ + mode: 'AUTO' | 'MANUAL'; + /** The exposure priority mode (low noise/framerate) */ + priority: 'LowNoise' | 'FrameRate'; + /** Rectangular exposure mask */ + window: Rectangle; + /** Minimum value of exposure time range allowed to be used by the algorithm */ + minExposureTime: number; + /** Maximum value of exposure time range allowed to be used by the algorithm */ + maxExposureTime: number; + /** Minimum value of the sensor gain range that is allowed to be used by the algorithm */ + minGain: number; + /** Maximum value of the sensor gain range that is allowed to be used by the algorithm */ + maxGain: number; + /** Minimum value of the iris range allowed to be used by the algorithm */ + minIris: number; + /** Maximum value of the iris range allowed to be used by the algorithm */ + maxIris: number; + /** The fixed exposure time used by the image sensor (μs) */ + exposureTime: number; + /** The fixed gain used by the image sensor (dB) */ + gain: number; + /** The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris */ + iris: number; +} + +export interface FocusConfiguration { + autoFocusMode: 'AUTO' | 'MANUAL'; + defaultSpeed: number; + /** Parameter to set autofocus near limit (unit: meter) */ + nearLimit: number; + /** Parameter to set autofocus far limit (unit: meter). If set to 0.0, infinity will be used */ + farLimit: number; +} + +export interface WideDynamicRange { + /** White dynamic range (on/off) */ + mode: 'OFF' | 'ON'; + /** Optional level parameter (unitless) */ + level: number; +} + +export interface WhiteBalance { + /** Auto whitebalancing mode (auto/manual) */ + mode: 'AUTO' | 'MANUAL'; + /** Rgain (unitless) */ + crGain: number; + /** Bgain (unitless) */ + cbGain: number; +} + +export interface ImagingSettings { + /** Enabled/disabled BLC mode (on/off) */ + backlightCompensation?: BacklightCompensation; + /** Image brightness (unit unspecified) */ + brightness?: number; + /** Color saturation of the image (unit unspecified) */ + colorSaturation?: number + /** Contrast of the image (unit unspecified) */ + contrast?: number; + /** Exposure mode of the device */ + exposure?: Exposure; + /** Focus configuration */ + focus?: FocusConfiguration; + /** Infrared Cutoff Filter settings */ + irCutFilter?: 'ON' | 'OFF' | 'AUTO'; + /** Sharpness of the Video image */ + sharpness?: number; + /** WDR settings */ + wideDynamicRange?: WideDynamicRange; + /** White balance settings */ + whiteBalance?: WhiteBalance; + extension?: any; +} + +export interface BacklightCompensation20 { + /** + * Backlight compensation mode (on/off) + * - OFF: Backlight compensation is disabled + * - ON: Backlight compensation is enabled + */ + mode: 'OFF' | 'ON'; + /** Optional level parameter (unit unspecified) */ + level?: number; +} + +export interface Exposure20 { + /** + * Exposure Mode + * - Auto – Enabled the exposure algorithm on the device + * - Manual – Disabled exposure algorithm on the device + */ + mode: 'AUTO' | 'MANUAL'; + /** The exposure priority mode (low noise/framerate) */ + priority?: 'LowNoise' | 'FrameRate'; + /** Rectangular exposure mask */ + window?: Rectangle; + /** Minimum value of exposure time range allowed to be used by the algorithm */ + minExposureTime?: number; + /** Maximum value of exposure time range allowed to be used by the algorithm */ + maxExposureTime?: number; + /** Minimum value of the sensor gain range that is allowed to be used by the algorithm */ + minGain?: number; + /** Maximum value of the sensor gain range that is allowed to be used by the algorithm */ + maxGain?: number; + /** Minimum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation */ + minIris?: number; + /** Maximum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation */ + maxIris?: number; + /** The fixed exposure time used by the image sensor (μs) */ + exposureTime?: number; + /** The fixed gain used by the image sensor (dB) */ + gain?: number; + /** The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris and positive values map to higher attenuation */ + iris?: number; +} + +export interface FocusConfiguration20 { + /** Zero or more modes as defined in enumeration tt:AFModes */ + AFMode: string[]; + /** + * Mode of auto focus + * - AUTO - The device automatically adjusts focus + * - MANUAL - The device does not automatically adjust focus + * Note: for devices supporting both manual and auto operation at the same time manual operation may be supported + * even if the Mode parameter is set to Auto. + */ + autoFocusMode: 'AUTO' | 'MANUAL'; + defaultSpeed?: number; + /** Parameter to set autofocus near limit (unit: meter) */ + nearLimit?: number; + /** Parameter to set autofocus far limit (unit: meter) */ + farLimit?: number; + extension?: any; +} + +export interface WideDynamicRange20 { + /** Wide dynamic range mode (on/off) */ + mode?: 'OFF' | 'ON'; + /** Optional level parameter (unit unspecified) */ + level?: number; +} + +export interface WhiteBalance20 extends WhiteBalance { + extension: any; +} + +export interface ImageStabilization { + /** Parameter to enable/disable Image Stabilization feature */ + mode: 'OFF' | 'ON' | 'AUTO' | 'Extended'; + /** Optional level parameter (unit unspecified) */ + level?: number; + extension?: any; +} + +export interface IrCutFilterAutoAdjustment { + /** + * Specifies which boundaries to automatically toggle Ir cut filter following parameters are applied to. + * Its options shall be chosen from tt:IrCutFilterAutoBoundaryType + */ + boundaryType: string; + /** + * Adjusts boundary exposure level for toggling Ir cut filter to on/off specified with unitless normalized value + * from +1.0 to -1.0. Zero is default and -1.0 is the darkest adjustment (Unitless). + */ + boundaryOffset?: number; + /** Delay time of toggling Ir cut filter to on/off after crossing of the boundary exposure levels */ + responseTime?: Duration; + extension?: any; +} + +export interface ToneCompensation { + /** Parameter to enable/disable or automatic ToneCompensation feature. Its options shall be chosen from tt:ToneCompensationMode Type */ + mode: string; + /** Optional level parameter specified with unitless normalized value from 0.0 to +1.0 */ + level?: number; + extension?: any; +} + +export interface Defogging { + /** Parameter to enable/disable or automatic Defogging feature. Its options shall be chosen from tt:DefoggingMode Type */ + mode: string; + /** Optional level parameter specified with unitless normalized value from 0.0 to +1.0 */ + level?: number; + extension?: any; +} + +export interface NoiseReduction { + /** + * Level parameter specified with unitless normalized value from 0.0 to +1.0. + * Level=0 means no noise reduction or minimal noise reduction + */ + level: number; +} + +export interface ImagingSettingsExtension203 { + /** Optional element to configure Image Contrast Compensation */ + toneCompensation?: ToneCompensation; + /** Optional element to configure Image Defogging */ + defogging?: Defogging; + /** Optional element to configure Image Noise Reduction */ + noiseReduction?: NoiseReduction; + extension?: any; +} + +export interface ImagingSettingsExtension202 { + /** An optional parameter applied to only auto mode to adjust timing of toggling Ir cut filter */ + irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment; + extension?: ImagingSettingsExtension203; +} + +export interface ImagingSettingsExtension20 { + /** Optional element to configure Image Stabilization feature */ + imageStabilization?: ImageStabilization; + extension?: ImagingSettingsExtension202; +} + +export interface ImagingSettings20 { + /** Enabled/disabled BLC mode (on/off) */ + backlightCompensation?: BacklightCompensation20; + /** Image brightness (unit unspecified) */ + brightness?: number; + /** Color saturation of the image (unit unspecified) */ + colorSaturation?: number; + /** Contrast of the image (unit unspecified) */ + contrast?: number; + /** Exposure mode of the device */ + exposure?: Exposure20; + /** Focus configuration */ + focus?: FocusConfiguration20; + /** Infrared Cutoff Filter settings */ + irCutFilter?: 'ON' | 'OFF' | 'AUTO'; + /** Sharpness of the Video image */ + sharpness?: number; + /** WDR settings */ + wideDynamicRange?: WideDynamicRange20; + /** White balance settings */ + whiteBalance?: WhiteBalance20; + extension?: ImagingSettingsExtension20; +} + +export interface VideoSourceExtension { + /** Optional configuration of the image sensor. To be used if imaging service 2.00 is supported */ + imaging?: ImagingSettings20; + extension?: any; +} + +export interface VideoSource { + /** Unique identifier referencing the physical entity */ + token: ReferenceToken; + /** Frame rate in frames per second */ + framerate: number; + /** Horizontal and vertical resolution */ + resolution: VideoResolution; + /** Optional configuration of the image sensor */ + imaging?: ImagingSettings; + extension?: VideoSourceExtension; +} + export class Media { private onvif: Onvif; + public profiles: Profile[] = []; + public videoSources: VideoSource[] = []; constructor(onvif: Onvif) { this.onvif = onvif; @@ -667,7 +951,7 @@ export class Media { // Slight difference in Media1 and Media2 reply XML // Generate a reply that looks like a Media1 reply for existing library users - this.onvif.profiles = data[0].getProfilesResponse[0].profiles.map((profile: Record) => { + this.profiles = data[0].getProfilesResponse[0].profiles.map((profile: Record) => { const tmp = linerase(profile) as MediaProfile; const newProfile: Profile = { token : tmp.token, @@ -704,14 +988,26 @@ export class Media { // TODO - Add Audio return newProfile; }); - return this.onvif.profiles; + return this.profiles; } // Original ONVIF Media support (used in Profile S) const [data] = await this.onvif.request({ service : 'media', body : '', }); - this.onvif.profiles = data[0].getProfilesResponse[0].profiles.map(linerase); - return this.onvif.profiles; + this.profiles = data[0].getProfilesResponse[0].profiles.map(linerase); + return this.profiles; + } + + async getVideoSources() { + const [data] = await this.onvif.request({ + service : 'media', + body : '', + }); + this.videoSources = linerase(data).getVideoSourcesResponse.videoSources; + // videoSources is an array of video sources, but linerase remove the array if there is only one element inside + // so we convert it back to an array + if (!Array.isArray(this.videoSources)) { this.videoSources = [this.videoSources]; } + return this.videoSources; } } diff --git a/src/onvif.ts b/src/onvif.ts index b55bc669..6b7f8c34 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -107,7 +107,6 @@ export class Onvif extends EventEmitter { public uri: OnvifServices; private timeShift?: number; public capabilities: Capabilities; - public profiles: Profile[]; constructor(options: OnvifOptions) { super(); @@ -124,7 +123,6 @@ export class Onvif extends EventEmitter { this.events = {}; this.uri = {}; this.capabilities = {}; - this.profiles = []; this.device = new Device(this); /** Bind event handling to the `event` event */ this.on('newListener', (name) => { @@ -354,7 +352,7 @@ export class Onvif extends EventEmitter { } catch (error) { await this.device.getCapabilities(); } - // await Promise.all([this.getProfiles(), this.getVideoSources()]); + // await Promise.all([this.media.getProfiles(), this.media.getVideoSources()]); // await this.getActiveSources(); this.emit('connect'); return this; From 0e8cdaf27482457a959fef7c3942c551243cbce7 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 16:33:59 +0300 Subject: [PATCH 040/112] `onvif.connect` method --- lib/utils.js | 63 ++++++++++++++++++++++++++++++--------------------- package.json | 1 - src/onvif.ts | 37 ++++++++++++++++++++++-------- tsconfig.json | 3 ++- 4 files changed, 67 insertions(+), 37 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index f56541d9..65a1a255 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -6,9 +6,11 @@ */ const xml2js = require('xml2js') - , numberRE = /^-?([1-9]\d*|0)(\.\d*)?$/ - , dateRE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(.\d+)?Z$/ - , prefixMatch = /(?!xmlns)^.*:/ + ; + + const numberRE = /^-?([1-9]\d*|0)(\.\d*)?$/ + ; const dateRE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(.\d+)?Z$/ + ; const prefixMatch = /(?!xmlns)^.*:/ ; /** @@ -16,27 +18,27 @@ const xml2js = require('xml2js') * @param {object} xml * @returns {object} */ -const linerase = function(xml) { +let linerase = function(xml) { if (Array.isArray(xml)) { if (xml.length > 1) { return xml.map(linerase); - } else { - xml = xml[0]; } + xml = xml[0]; + } if (typeof xml === 'object') { - var obj = {}; - Object.keys(xml).forEach(function(key) { + const obj = {}; + Object.keys(xml).forEach((key) => { obj[key] = linerase(xml[key]); }); return obj; - } else { + } if (xml === 'true') { return true; } if (xml === 'false') { return false; } if (numberRE.test(xml)) { return parseFloat(xml); } if (dateRE.test(xml)) { return new Date(xml); } return xml; - } + }; /** @@ -59,23 +61,23 @@ const parseSOAPString = function(xml, callback) { xml2js.parseString( xml , { - tagNameProcessors: [function(str) { + tagNameProcessors : [function(str) { str = str.replace(prefixMatch, ''); - var secondLetter = str.charAt(1); + const secondLetter = str.charAt(1); if (secondLetter && secondLetter.toUpperCase() !== secondLetter) { return str.charAt(0).toLowerCase() + str.slice(1); - } else { - return str; } + return str; + }] } - , function(err, result) { - if (!result || !result['envelope'] || !result['envelope']['body']) { + , (err, result) => { + if (!result || !result.envelope || !result.envelope.body) { callback(new Error('Wrong ONVIF SOAP response'), null, xml); } else { - if (!err && result['envelope']['body'][0]['fault']) { - var fault = result['envelope']['body'][0]['fault'][0]; - var reason; + if (!err && result.envelope.body[0].fault) { + const fault = result.envelope.body[0].fault[0]; + let reason; try { if (fault.reason[0].text[0]._) { reason = fault.reason[0].text[0]._; @@ -90,7 +92,7 @@ const parseSOAPString = function(xml, callback) { reason = ''; } } - var detail = ''; + let detail = ''; try { detail = fault.detail[0].text[0]; } catch (e) { @@ -98,9 +100,9 @@ const parseSOAPString = function(xml, callback) { } // console.error('Fault:', reason, detail); - err = new Error('ONVIF SOAP Fault: ' + (reason) + (detail)); + err = new Error(`ONVIF SOAP Fault: ${ reason }${detail}`); } - callback(err, result['envelope']['body'], xml); + callback(err, result.envelope.body, xml); } } ); @@ -118,11 +120,20 @@ const s4 = function() { * @returns {string} */ const guid = function() { - return (s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4()); + return (`${s4() + s4() }-${ s4() }-${ s4() }-${ s4() }-${ s4() }${s4() }${s4()}`); }; +const _linerase = linerase; +linerase = (xml) => { + const result = _linerase(xml); + console.log('---------------------------------------------------------------------------------------------'); + console.dir(xml) + console.dir(result); + return result; +} + module.exports = { - linerase: linerase - , parseSOAPString: parseSOAPString - , guid: guid + linerase + , parseSOAPString + , guid }; diff --git a/package.json b/package.json index 4515ddcb..2d4db337 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "jsdoc": "jsdoc ./lib/*.js --readme ./README.md --destination ./docs", "gh-pages": "jsdoc ./lib/*.js --readme ./README.md --destination ./", "lint": "eslint lib/*.js", - "pretest": "npm run lint", "test": "nyc mocha", "test-on-travis": "nyc npm test && nyc report --reporter=text-lcov | coveralls", "mockserver": "node startServerMockup.js" diff --git a/src/onvif.ts b/src/onvif.ts index 6b7f8c34..0fc113e1 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -6,7 +6,7 @@ import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; import { Capabilities, Device } from './device'; -import { Profile } from './media'; +import { Media, Profile } from './media'; /** * Cam constructor options @@ -25,7 +25,7 @@ export interface OnvifOptions { /** Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections. */ agent?: Agent | boolean; /** Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false. */ - preserveAddress: boolean; + preserveAddress?: boolean; /** Set false if the camera should not connect automatically, defaults false. */ autoConnect?: boolean; } @@ -66,13 +66,22 @@ interface RequestError extends Error { export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. - * @event rawData + * @event rawRequest * @example * ```typescript - * onvif.on('rawData', (xml) => { console.log('request was', xml); }); + * onvif.on('rawRequest', (xml) => { console.log('-> request was', xml); }); * ``` */ static rawRequest: 'rawRequest' = 'rawRequest'; + /** + * Indicates raw xml response from device. + * @event rawResponse + * @example + * ```typescript + * onvif.on('rawResponse', (xml) => { console.log('<- response was', xml); }); + * ``` + */ + static rawResponse: 'rawResponse' = 'rawResponse'; /** * Indicates any warnings * @event warn @@ -92,7 +101,8 @@ export class Onvif extends EventEmitter { */ static error: 'error' = 'error'; - public device: Device; + public readonly device: Device; + public readonly media: Media; public useSecure: boolean; public secureOptions: SecureContextOptions; public hostname: string; @@ -102,7 +112,7 @@ export class Onvif extends EventEmitter { public path: string; public timeout: number; public agent: Agent | boolean; - public preserveAddress: boolean; + public preserveAddress = false; private events: Record; public uri: OnvifServices; private timeShift?: number; @@ -118,12 +128,14 @@ export class Onvif extends EventEmitter { this.port = options.port ?? (options.useSecure ? 443 : 80); this.path = options.path ?? '/onvif/device_service'; this.timeout = options.timeout || 120000; - this.agent = options.agent || false; - this.preserveAddress = options.preserveAddress || false; + this.agent = options.agent ?? false; + this.preserveAddress = options.preserveAddress ?? false; this.events = {}; this.uri = {}; this.capabilities = {}; + this.device = new Device(this); + this.media = new Media(this); /** Bind event handling to the `event` event */ this.on('newListener', (name) => { // if this is the first listener, start pulling subscription @@ -218,6 +230,9 @@ export class Onvif extends EventEmitter { path : options.service ? (this.uri[options.service] ? this.uri[options.service]?.pathname : options.service) : this.path, + port : this.port, + agent : this.agent, // Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections} + timeout : this.timeout, }; requestOptions.headers = { 'Content-Type' : 'application/soap+xml', @@ -342,6 +357,10 @@ export class Onvif extends EventEmitter { } } + async getActiveSources() { + + } + /** * Connect to the camera and fill device information properties */ @@ -352,7 +371,7 @@ export class Onvif extends EventEmitter { } catch (error) { await this.device.getCapabilities(); } - // await Promise.all([this.media.getProfiles(), this.media.getVideoSources()]); + await Promise.all([this.media.getProfiles(), this.media.getVideoSources()]); // await this.getActiveSources(); this.emit('connect'); return this; diff --git a/tsconfig.json b/tsconfig.json index 756d62e5..80dedfc7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,6 +19,7 @@ "node_modules" ], "include": [ - "src/index.ts" + "src/index.ts", + "src/test.ts" ] } From d8f89fcf9862150fe3cbb8a5ca80a57b6a3158c9 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 16:38:10 +0300 Subject: [PATCH 041/112] Reworked linerase function do add xml atrributes into object instead of `$` property --- src/utils.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 4354db75..8c3786a5 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -16,9 +16,16 @@ export function linerase(xml: any): any { [xml] = xml; } if (typeof xml === 'object') { - const obj: any = {}; + let obj: any = {}; Object.keys(xml).forEach((key) => { - obj[key] = linerase(xml[key]); + if (key === '$') { // for xml attributes + obj = { + ...obj, + ...linerase(xml.$), + }; + } else { + obj[key] = linerase(xml[key]); + } }); return obj; } From b6ccdf668546cd86f048ceb8fd1edda4d0ec9b69 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 17:06:52 +0300 Subject: [PATCH 042/112] `onvif.getActiveSources` method --- src/onvif.ts | 77 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 8 deletions(-) diff --git a/src/onvif.ts b/src/onvif.ts index 0fc113e1..f9d294c4 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -117,6 +117,9 @@ export class Onvif extends EventEmitter { public uri: OnvifServices; private timeShift?: number; public capabilities: Capabilities; + public defaultProfiles: Profile[] = []; + public defaultProfile?: Profile; + private activeSources: any; constructor(options: OnvifOptions) { super(); @@ -224,7 +227,7 @@ export class Onvif extends EventEmitter { private async rawRequest(options: OnvifRequestOptions): Promise<[Record, string]> { return new Promise((resolve, reject) => { - let callbackExecuted = false; + let alreadyReturned = false; let requestOptions = { ...options, path : options.service @@ -252,10 +255,10 @@ export class Onvif extends EventEmitter { }); response.on('end', () => { - if (callbackExecuted) { + if (alreadyReturned) { return; } - callbackExecuted = true; + alreadyReturned = true; const xml = Buffer.concat(bufs, length).toString('utf8'); /** * Indicates raw xml response from device. @@ -268,19 +271,19 @@ export class Onvif extends EventEmitter { }); request.setTimeout(this.timeout, () => { - if (callbackExecuted) { + if (alreadyReturned) { return; } - callbackExecuted = true; + alreadyReturned = true; request.destroy(); reject(new Error('Network timeout')); }); request.on('error', (error: RequestError) => { - if (callbackExecuted) { + if (alreadyReturned) { return; } - callbackExecuted = true; + alreadyReturned = true; /* address, port number or IPCam error */ if (error.code === 'ECONNREFUSED' && error.errno === 'ECONNREFUSED' && error.syscall === 'connect') { reject(error); @@ -357,8 +360,66 @@ export class Onvif extends EventEmitter { } } - async getActiveSources() { + /** + * Check and find out video configuration for device + * @private + */ + private async getActiveSources() { + this.media.videoSources.forEach((videoSource, idx) => { + // let's choose first appropriate profile for our video source and make it default + const videoSrcToken = videoSource.token; + const appropriateProfiles = this.media.profiles.filter((profile) => (profile.videoSourceConfiguration + ? profile.videoSourceConfiguration.sourceToken === videoSrcToken + : false) && (profile.videoEncoderConfiguration !== undefined)); + if (appropriateProfiles.length === 0) { + if (idx === 0) { + throw new Error('Unrecognized configuration'); + } else { + return; + } + } + + if (idx === 0) { + [this.defaultProfile] = appropriateProfiles; + } + [this.defaultProfiles[idx]] = appropriateProfiles; + + this.activeSources[idx] = { + sourceToken : videoSource.$.token, + profileToken : this.defaultProfiles[idx].token, + videoSourceConfigurationToken : this.defaultProfiles[idx].videoSourceConfiguration?.token, + }; + if (this.defaultProfiles[idx].videoEncoderConfiguration) { + const configuration = this.defaultProfiles[idx].videoEncoderConfiguration; + this.activeSources[idx].encoding = configuration?.encoding; + this.activeSources[idx].width = configuration?.resolution.width ?? ''; + this.activeSources[idx].height = configuration?.resolution.height ?? ''; + this.activeSources[idx].fps = configuration?.rateControl?.frameRateLimit ?? ''; + this.activeSources[idx].bitrate = configuration?.rateControl?.bitrateLimit ?? ''; + } + + if (idx === 0) { + /** + * Current active video source + * @name Cam#activeSource + * @type {Cam~ActiveSource} + */ + this.activeSource = this.activeSources[idx]; + } + + if (this.defaultProfiles[idx].PTZConfiguration) { + this.activeSources[idx].ptz = { + name : this.defaultProfiles[idx].PTZConfiguration.name, + token : this.defaultProfiles[idx].PTZConfiguration.$.token, + }; + /* + TODO Think about it + if (idx === 0) { + this.defaultProfile.PTZConfiguration = this.activeSources[idx].PTZConfiguration; + } */ + } + }); } /** From 5b8e0a231a9cb1f4e0006fcf3d89585030268a06 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 17:42:13 +0300 Subject: [PATCH 043/112] `onvif.getActiveSources` method --- src/onvif.ts | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/onvif.ts b/src/onvif.ts index f9d294c4..606d2a0b 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -6,7 +6,7 @@ import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; import { Capabilities, Device } from './device'; -import { Media, Profile } from './media'; +import { Media, Profile, PTZConfiguration } from './media'; /** * Cam constructor options @@ -63,6 +63,24 @@ interface RequestError extends Error { syscall: string; } +/** + * Information about active video source + */ +export interface ActiveSource { + sourceToken: string; + profileToken: string; + videoSourceConfigurationToken: string; + encoding?: string; + width?: number; + height?: number; + fps?: number; + bitrate?: number; + ptz?: { + name: string; + token: string; + }; +} + export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. @@ -119,7 +137,8 @@ export class Onvif extends EventEmitter { public capabilities: Capabilities; public defaultProfiles: Profile[] = []; public defaultProfile?: Profile; - private activeSources: any; + private activeSources: ActiveSource[] = []; + public activeSource?: ActiveSource; constructor(options: OnvifOptions) { super(); @@ -386,32 +405,27 @@ export class Onvif extends EventEmitter { [this.defaultProfiles[idx]] = appropriateProfiles; this.activeSources[idx] = { - sourceToken : videoSource.$.token, + sourceToken : videoSource.token, profileToken : this.defaultProfiles[idx].token, - videoSourceConfigurationToken : this.defaultProfiles[idx].videoSourceConfiguration?.token, + videoSourceConfigurationToken : this.defaultProfiles[idx].videoSourceConfiguration!.token, }; if (this.defaultProfiles[idx].videoEncoderConfiguration) { const configuration = this.defaultProfiles[idx].videoEncoderConfiguration; this.activeSources[idx].encoding = configuration?.encoding; - this.activeSources[idx].width = configuration?.resolution.width ?? ''; - this.activeSources[idx].height = configuration?.resolution.height ?? ''; - this.activeSources[idx].fps = configuration?.rateControl?.frameRateLimit ?? ''; - this.activeSources[idx].bitrate = configuration?.rateControl?.bitrateLimit ?? ''; + this.activeSources[idx].width = configuration?.resolution.width; + this.activeSources[idx].height = configuration?.resolution.height; + this.activeSources[idx].fps = configuration?.rateControl?.frameRateLimit; + this.activeSources[idx].bitrate = configuration?.rateControl?.bitrateLimit; } if (idx === 0) { - /** - * Current active video source - * @name Cam#activeSource - * @type {Cam~ActiveSource} - */ this.activeSource = this.activeSources[idx]; } if (this.defaultProfiles[idx].PTZConfiguration) { this.activeSources[idx].ptz = { - name : this.defaultProfiles[idx].PTZConfiguration.name, - token : this.defaultProfiles[idx].PTZConfiguration.$.token, + name : this.defaultProfiles[idx].PTZConfiguration!.name, + token : this.defaultProfiles[idx].PTZConfiguration!.token, }; /* TODO Think about it @@ -433,7 +447,7 @@ export class Onvif extends EventEmitter { await this.device.getCapabilities(); } await Promise.all([this.media.getProfiles(), this.media.getVideoSources()]); - // await this.getActiveSources(); + await this.getActiveSources(); this.emit('connect'); return this; } From 089fbbf685a376dd585b33c624b6054b1a6f6a0b Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 17:44:05 +0300 Subject: [PATCH 044/112] Temporary file for tests --- src/test.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test.ts diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 00000000..a4d42911 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,20 @@ +import { Onvif } from './index'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const serverMockup = require('../test/serverMockup'); + +(async () => { + const cam = new Onvif({ + hostname : 'localhost', + username : 'admin', + password : '9999', + port : 10101, + }); + + // cam.on('rawResponse', console.log); + // cam.on('rawRequest', console.log); + await cam.connect(); + const profiles = await cam.media.getProfiles(); + console.log(profiles); + serverMockup.close(); +})().catch(console.error); From 419b3cc900f35666a177fcb5d4fcc955c1a673ca Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 20:57:32 +0300 Subject: [PATCH 045/112] Discovery class --- src/discovery.ts | 146 +++++++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 2 + src/onvif.ts | 13 ++++- 3 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 src/discovery.ts diff --git a/src/discovery.ts b/src/discovery.ts new file mode 100644 index 00000000..e88ff1f4 --- /dev/null +++ b/src/discovery.ts @@ -0,0 +1,146 @@ +import { EventEmitter } from 'events'; +import { createSocket, RemoteInfo } from 'dgram'; +import url from 'url'; +import os from 'os'; +import { guid, linerase, parseSOAPString } from './utils'; +import { Onvif } from './onvif'; + +export interface DiscoveryOptions { + /** Timeout in milliseconds for discovery responses, Default 5000 */ + timeout?: number; + /** Set to `false` if you want to omit creating of Cam objects. Default true */ + resolve?: boolean; + /** WS-Discovery message id */ + messageId?: string; + /** Interface to bind on for discovery ex. `eth0` */ + device?: string; + /** Client will listen to discovery data device sent */ + listeningPort?: number; + /** Socket type */ + type?: 'udp4' | 'udp6'; +} + +/** + * Try to find the most suitable record + * Now it is simple ip match + */ +function matchXAddr(xaddrs: URL[], address: string) { + const ipMatch = xaddrs.filter((xaddr) => xaddr.hostname === address); + return ipMatch[0] || xaddrs[0]; +} + +export class Discovery extends EventEmitter { + /** + * Fires when device found + * @event error + * @example + * ```typescript + * discovery.on('device', console.log); + * ``` + */ + static device: 'device' = 'device'; + /** + * Indicates any errors + * @event error + * @example + * ```typescript + * discovery.on('error', console.error); + * ``` + */ + static error: 'error' = 'error'; + + probe(options: DiscoveryOptions): Promise<(Onvif | Record)[]> { + return new Promise((resolve, reject) => { + const cams: Map> = new Map(); + const errors: Error[] = []; + const messageID = `urn:uuid:${options.messageId || guid()}`; + const request = Buffer.from( + '' + + '
' + + `${messageID}` + + 'urn:schemas-xmlsoap-org:ws:2005:04:discovery' + + 'http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe' + + '
' + + '' + + '' + + 'dn:NetworkVideoTransmitter' + + '' + + '' + + '' + + '
', + ); + const socket = createSocket(options.type ?? 'udp4'); + socket.on('error', (err) => { + this.emit('error', err); + }); + + const listener = async (msg: Buffer, rinfo: RemoteInfo) => { + let data; + let xml; + try { + [data, xml] = await parseSOAPString(msg.toString()); + } catch (error) { + errors.push(error as Error); + this.emit('error', error, xml); + return; + } + // TODO check for matching RelatesTo field and messageId + if (!data[0].probeMatches) { + errors.push(new Error(`Wrong SOAP message from ${rinfo.address}:${rinfo.port}\n${xml}`)); + this.emit('error', `Wrong SOAP message from ${rinfo.address}:${rinfo.port}`, xml); + } else { + data = linerase(data); + + // Possible to get multiple matches for the same camera + // when your computer has more than one network adapter in the same subnet + const camAddr = data.probeMatches.probeMatch.endpointReference.address; + if (!cams.has(camAddr)) { + let cam; + if (options.resolve !== false) { + // Create cam with one of the XAddrs uri + const camUris = data.probeMatches.probeMatch.XAddrs.split(' ').map(url.parse); + const camUri = matchXAddr(camUris, rinfo.address); + cam = new Onvif({ + hostname : camUri.hostname, + port : parseInt(camUri.port, 10), + path : camUri.pathname, + urn : camAddr, + }); + } else { + cam = data; + } + cams.set(camAddr, cam); + this.emit('device', cam, rinfo, xml); + } + } + }; + + // If device is specified try to bind to that interface + if (options.device) { + const interfaces = os.networkInterfaces(); + // Try to find the interface based on the device name + if (options.device in interfaces) { + interfaces[options.device]?.forEach((iface) => { + // Only use IPv4 addresses + if (iface.family === 'IPv4') { + socket.bind(options.listeningPort, iface.address); + } + }); + } + } + + socket.on('message', listener); + socket.send(request, 0, request.length, 3702, '239.255.255.250'); + + setTimeout(() => { + socket.removeListener('message', listener); + socket.close(); + if (errors.length === 0) { + resolve(Array.from(cams.values())); + } else { + reject(errors); + } + }, options.timeout || 5000); + }); + } +} diff --git a/src/index.ts b/src/index.ts index 98614c71..af7d9004 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,4 @@ export * from './onvif'; export * from './device'; +export * from './media'; +export * from './discovery'; diff --git a/src/onvif.ts b/src/onvif.ts index 606d2a0b..0c798176 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -6,7 +6,7 @@ import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; import { Capabilities, Device } from './device'; -import { Media, Profile, PTZConfiguration } from './media'; +import { Media, Profile } from './media'; /** * Cam constructor options @@ -22,6 +22,7 @@ export interface OnvifOptions { port?: number; path?: string; timeout?: number; + urn?: string; /** Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections. */ agent?: Agent | boolean; /** Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false. */ @@ -119,6 +120,14 @@ export class Onvif extends EventEmitter { */ static error: 'error' = 'error'; + /** + * Core device namespace for device v1.0 methods + * @example + * ```typescript + * const date = await onvif.device.getSystemDateAndTime(); + * console.log(date.toLocaleString()); + * ``` + */ public readonly device: Device; public readonly media: Media; public useSecure: boolean; @@ -139,6 +148,7 @@ export class Onvif extends EventEmitter { public defaultProfile?: Profile; private activeSources: ActiveSource[] = []; public activeSource?: ActiveSource; + public readonly urn?: string; constructor(options: OnvifOptions) { super(); @@ -150,6 +160,7 @@ export class Onvif extends EventEmitter { this.port = options.port ?? (options.useSecure ? 443 : 80); this.path = options.path ?? '/onvif/device_service'; this.timeout = options.timeout || 120000; + this.urn = options.urn; this.agent = options.agent ?? false; this.preserveAddress = options.preserveAddress ?? false; this.events = {}; From 82f5d97a77d18fb4f0d9047d990688888660ed00 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Jan 2022 21:21:18 +0300 Subject: [PATCH 046/112] Discovery class --- .eslintrc.js | 1 + src/discovery.ts | 4 +++- src/test.ts | 5 ++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 95c1e625..0c0ada64 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -15,6 +15,7 @@ const commonRules = { 'max-len' : ['warn', 200], 'class-methods-use-this' : 0, 'no-nested-ternary' : 0, + 'no-use-before-define' : 0, 'key-spacing' : ['error', { afterColon : true, beforeColon : true, diff --git a/src/discovery.ts b/src/discovery.ts index e88ff1f4..c117a741 100644 --- a/src/discovery.ts +++ b/src/discovery.ts @@ -29,7 +29,7 @@ function matchXAddr(xaddrs: URL[], address: string) { return ipMatch[0] || xaddrs[0]; } -export class Discovery extends EventEmitter { +class DiscoverySingleton extends EventEmitter { /** * Fires when device found * @event error @@ -144,3 +144,5 @@ export class Discovery extends EventEmitter { }); } } + +export const Discovery = new DiscoverySingleton(); diff --git a/src/test.ts b/src/test.ts index a4d42911..b724a02e 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,4 +1,4 @@ -import { Onvif } from './index'; +import { Onvif, Discovery } from './index'; // eslint-disable-next-line @typescript-eslint/no-var-requires const serverMockup = require('../test/serverMockup'); @@ -16,5 +16,8 @@ const serverMockup = require('../test/serverMockup'); await cam.connect(); const profiles = await cam.media.getProfiles(); console.log(profiles); + Discovery.on('device', console.log); + const cams = await Discovery.probe({ timeout : 1000 }); + // console.log(cams); serverMockup.close(); })().catch(console.error); From 4c252351e3d3d03989fb55f7f19713d705ff4242 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 18 Jan 2022 12:21:51 +0300 Subject: [PATCH 047/112] Discovery singleton --- package-lock.json | 80 +++++++++++++++++++++++------------------------ src/discovery.ts | 72 ++++++++++++++++++++++++++++++++++++++++-- src/onvif.ts | 1 + 3 files changed, 110 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9fba4842..bfce5889 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3210,9 +3210,9 @@ } }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "node_modules/json-schema-traverse": { @@ -3255,18 +3255,18 @@ "dev": true }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/keypress": { @@ -3397,12 +3397,12 @@ } }, "node_modules/marked": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", - "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", + "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", "dev": true, "bin": { - "marked": "bin/marked" + "marked": "bin/marked.js" }, "engines": { "node": ">= 12" @@ -4479,9 +4479,9 @@ } }, "node_modules/shiki": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", - "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", + "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", "dev": true, "dependencies": { "jsonc-parser": "^3.0.0", @@ -4820,16 +4820,16 @@ } }, "node_modules/typedoc": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.10.tgz", - "integrity": "sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==", + "version": "0.22.11", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", + "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", "dev": true, "dependencies": { "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^3.0.8", + "marked": "^4.0.10", "minimatch": "^3.0.4", - "shiki": "^0.9.12" + "shiki": "^0.10.0" }, "bin": { "typedoc": "bin/typedoc" @@ -7436,9 +7436,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -7475,14 +7475,14 @@ "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -7583,9 +7583,9 @@ } }, "marked": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", - "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", + "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", "dev": true }, "merge2": { @@ -8367,9 +8367,9 @@ "dev": true }, "shiki": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", - "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", + "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", "dev": true, "requires": { "jsonc-parser": "^3.0.0", @@ -8630,16 +8630,16 @@ } }, "typedoc": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.10.tgz", - "integrity": "sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==", + "version": "0.22.11", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", + "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", "dev": true, "requires": { "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^3.0.8", + "marked": "^4.0.10", "minimatch": "^3.0.4", - "shiki": "^0.9.12" + "shiki": "^0.10.0" } }, "typescript": { diff --git a/src/discovery.ts b/src/discovery.ts index c117a741..67abf8db 100644 --- a/src/discovery.ts +++ b/src/discovery.ts @@ -29,10 +29,14 @@ function matchXAddr(xaddrs: URL[], address: string) { return ipMatch[0] || xaddrs[0]; } -class DiscoverySingleton extends EventEmitter { +/** + * Class for `Discovery` singleton + */ +export class DiscoverySingleton extends EventEmitter { /** * Fires when device found - * @event error + * @param onvif Onvif instance {@link Onvif} or just information object about found device + * @event device * @example * ```typescript * discovery.on('device', console.log); @@ -41,6 +45,7 @@ class DiscoverySingleton extends EventEmitter { static device: 'device' = 'device'; /** * Indicates any errors + * @param error Error instance or array of error instances from {@link Error} * @event error * @example * ```typescript @@ -49,6 +54,46 @@ class DiscoverySingleton extends EventEmitter { */ static error: 'error' = 'error'; + private static instance?: DiscoverySingleton; + + public static get getInstance(): DiscoverySingleton { + if (!DiscoverySingleton.instance) { + DiscoverySingleton.instance = new DiscoverySingleton(); + } + return DiscoverySingleton.instance; + } + + // eslint-disable-next-line no-useless-constructor + private constructor() { + super(); + } + + /** + * Discover NVT devices in the subnetwork + * @param {object} [options] + * @param {number} [options.timeout=5000] timeout in milliseconds for discovery responses + * @param {boolean} [options.resolve=true] set to `false` if you want omit creating of Cam objects + * @param {string} [options.messageId=GUID] WS-Discovery message id + * @param {string} [options.device=defaultroute] Interface to bind on for discovery ex. `eth0` + * @param {number} [options.listeningPort=null] client will listen to discovery data device sent + * @example + * ```typescript + * import { Discovery } from 'onvif'; + * Discovery.on('device', async (cam) => { + * // function would be called as soon as NVT responses + * cam.username = ; + * cam.password = ; + * await cam.connect(); + * }) + * Discovery.probe(); + * ``` + * @example + * import { Discovery } from 'onvif'; + * (async () => { + * const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect()); + * console.log(await cams[0]?.getSystemDateAndTime()); + * })(); + */ probe(options: DiscoveryOptions): Promise<(Onvif | Record)[]> { return new Promise((resolve, reject) => { const cams: Map> = new Map(); @@ -145,4 +190,25 @@ class DiscoverySingleton extends EventEmitter { } } -export const Discovery = new DiscoverySingleton(); +/** + * Singleton for the discovery to provide `probe` method + * {@link Discovery.probe} + * @example + * ```typescript + * import { Discovery } from 'onvif'; + * Discovery.on('device', async (cam) => { + * // function would be called as soon as NVT responses + * cam.username = ; + * cam.password = ; + * await cam.connect(); + * }) + * Discovery.probe(); + * ``` + * @example + * import { Discovery } from 'onvif'; + * (async () => { + * const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect()); + * console.log(await cams[0]?.getSystemDateAndTime()); + * })(); + */ +export const Discovery = DiscoverySingleton.getInstance; diff --git a/src/onvif.ts b/src/onvif.ts index 0c798176..7cac04f9 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -112,6 +112,7 @@ export class Onvif extends EventEmitter { static warn: 'warn' = 'warn'; /** * Indicates any errors + * @param error Error instance from {@link Error} * @event error * @example * ```typescript From 80f1c43c61596f486d876dd163b91678757749ab Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 18 Jan 2022 13:20:43 +0300 Subject: [PATCH 048/112] `getDeviceInformation` method --- src/device.ts | 19 +++++++++++++++++++ src/onvif.ts | 3 ++- src/test.ts | 7 ++++--- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/device.ts b/src/device.ts index 0fff409d..dd4b6fd4 100644 --- a/src/device.ts +++ b/src/device.ts @@ -364,4 +364,23 @@ export class Device { } return this.onvif.capabilities; } + + async getDeviceInformation(): Promise { + const [data] = await this.onvif.request({ body : '' }); + this.onvif.deviceInformation = linerase(data).getDeviceInformationResponse; + return this.onvif.deviceInformation!; + } +} + +export interface DeviceInformation { + /** The manufactor of the device */ + manufacturer: string; + /** The device model */ + model: string; + /** The firmware version in the device */ + firmwareVersion: string; + /** The serial number of the device */ + serialNumber: string; + /** The hardware ID of the device */ + hardwareId: string; } diff --git a/src/onvif.ts b/src/onvif.ts index 7cac04f9..b628e179 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -5,7 +5,7 @@ import http from 'http'; import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; -import { Capabilities, Device } from './device'; +import { Capabilities, Device, DeviceInformation } from './device'; import { Media, Profile } from './media'; /** @@ -150,6 +150,7 @@ export class Onvif extends EventEmitter { private activeSources: ActiveSource[] = []; public activeSource?: ActiveSource; public readonly urn?: string; + public deviceInformation?: DeviceInformation; constructor(options: OnvifOptions) { super(); diff --git a/src/test.ts b/src/test.ts index b724a02e..4559d0be 100644 --- a/src/test.ts +++ b/src/test.ts @@ -15,9 +15,10 @@ const serverMockup = require('../test/serverMockup'); // cam.on('rawRequest', console.log); await cam.connect(); const profiles = await cam.media.getProfiles(); - console.log(profiles); - Discovery.on('device', console.log); - const cams = await Discovery.probe({ timeout : 1000 }); + console.log((await cam.device.getDeviceInformation()).firmwareVersion); + // console.log(profiles); + // Discovery.on('device', console.log); + // const cams = await Discovery.probe({ timeout : 1000 }); // console.log(cams); serverMockup.close(); })().catch(console.error); From 8a65e41f5fe7c5eea6901ff294be7ef869084378 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 21 Jan 2022 20:30:31 +0300 Subject: [PATCH 049/112] `getHostname` method --- .eslintrc.js | 2 +- IMPLEMENTED.md | 103 +++++++++++++++++++++++++++++++++++++++++++++++++ src/device.ts | 15 +++++++ src/test.ts | 1 + 4 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 IMPLEMENTED.md diff --git a/.eslintrc.js b/.eslintrc.js index 0c0ada64..6659d27d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,5 +1,5 @@ const commonRules = { - 'no-console' : 1, + 'no-console' : 'warn', 'import/extensions' : 0, 'quote-props' : 0, 'import/prefer-default-export' : 0, diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md new file mode 100644 index 00000000..c129c3d0 --- /dev/null +++ b/IMPLEMENTED.md @@ -0,0 +1,103 @@ +# Implemented methods and properties in typescript + +- [ ] activeSource +- [ ] activeSources +- [ ] capabilities +- [ ] defaultProfile +- [ ] defaultProfiles +- [ ] events +- [ ] preserveAddress +- [ ] profiles +- [ ] profiles +- [ ] recordingItem +- [ ] scopes +- [ ] services +- [ ] uri +- [ ] uri +- [ ] videoSources +- [ ] xaddrs +- [ ] absoluteMove +- [ ] addAudioEncoderConfiguration +- [ ] addAudioSourceConfiguration +- [ ] addVideoEncoderConfiguration +- [ ] addVideoSourceConfiguration +- [ ] connect +- [ ] continuousMove +- [ ] createOSD +- [ ] createProfile +- [ ] createPullPointSubscription +- [ ] createUsers +- [ ] deleteOSD +- [ ] deleteProfile +- [ ] deleteUsers +- [ ] getAudioEncoderConfiguration +- [ ] getAudioEncoderConfigurationOptions +- [ ] getAudioEncoderConfigurations +- [ ] getAudioOutputConfigurations +- [ ] getAudioOutputs +- [ ] getAudioSourceConfigurations +- [ ] getAudioSources +- [x] getCapabilities +- [ ] getConfigurationOptions +- [ ] getConfigurations +- [ ] getCurrentImagingPreset +- [x] getDeviceInformation +- [ ] getDNS +- [ ] getEventProperties +- [ ] getEventServiceCapabilities +- [ ] getHostname +- [ ] getImagingServiceCapabilities +- [ ] getImagingSettings +- [ ] getMediaServiceCapabilities +- [ ] getNetworkDefaultGateway +- [ ] getNetworkInterfaces +- [ ] getNetworkProtocols +- [ ] getNodes +- [ ] getNTP +- [ ] getOSDOptions +- [ ] getOSDs +- [ ] getPresets +- [ ] getProfiles +- [ ] getRecordings +- [ ] getReplayUri +- [ ] getScopes +- [ ] getServiceCapabilities +- [x] getServices +- [ ] getSnapshotUri +- [ ] getStatus +- [ ] getStreamUri +- [x] getSystemDateAndTime +- [ ] getUsers +- [ ] getVideoEncoderConfiguration +- [ ] getVideoEncoderConfigurationOptions +- [ ] getVideoEncoderConfigurations +- [ ] getVideoSourceConfigurations +- [ ] getVideoSourceOptions +- [ ] getVideoSources +- [ ] gotoHomePosition +- [ ] gotoPreset +- [ ] pullMessages +- [ ] relativeMove +- [ ] removeAudioEncoderConfiguration +- [ ] removeAudioSourceConfiguration +- [ ] removePreset +- [ ] renew +- [ ] setAudioEncoderConfiguration +- [ ] setCurrentImagingPreset +- [ ] setDNS +- [ ] setHomePosition +- [ ] setImagingSettings +- [ ] setNetworkDefaultGateway +- [ ] setNetworkInterfaces +- [ ] setNTP +- [ ] setOSD +- [ ] setPreset +- [ ] setScopes +- [ ] setSystemDateAndTime +- [ ] setSystemFactoryDefault +- [ ] setUsers +- [ ] setVideoEncoderConfiguration +- [ ] stop +- [ ] subscribe +- [ ] systemReboot +- [ ] unsubscribe diff --git a/src/device.ts b/src/device.ts index dd4b6fd4..bf69b45d 100644 --- a/src/device.ts +++ b/src/device.ts @@ -280,6 +280,14 @@ export interface Capabilities { extension?: CapabilitiesExtension; } +interface HostnameInformation { + /** Indicates whether the hostname is obtained from DHCP or not */ + fromDHCP: boolean; + /** Indicates the hostname */ + name?: string; + extension?: any; +} + /** * Device methods */ @@ -370,6 +378,13 @@ export class Device { this.onvif.deviceInformation = linerase(data).getDeviceInformationResponse; return this.onvif.deviceInformation!; } + + async getHostname(): Promise { + const [data] = await this.onvif.request({ + body : '', + }); + return linerase(data).getHostnameResponse.hostnameInformation; + } } export interface DeviceInformation { diff --git a/src/test.ts b/src/test.ts index 4559d0be..16cbcdb3 100644 --- a/src/test.ts +++ b/src/test.ts @@ -16,6 +16,7 @@ const serverMockup = require('../test/serverMockup'); await cam.connect(); const profiles = await cam.media.getProfiles(); console.log((await cam.device.getDeviceInformation()).firmwareVersion); + console.log((await cam.device.getHostname())); // console.log(profiles); // Discovery.on('device', console.log); // const cams = await Discovery.probe({ timeout : 1000 }); From dd81951c950c949a9e394d1a4d98a007b1a0777e Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 22 Jan 2022 16:12:59 +0300 Subject: [PATCH 050/112] Slice of work --- IMPLEMENTED.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md index c129c3d0..69cedee7 100644 --- a/IMPLEMENTED.md +++ b/IMPLEMENTED.md @@ -45,7 +45,7 @@ - [ ] getDNS - [ ] getEventProperties - [ ] getEventServiceCapabilities -- [ ] getHostname +- [x] getHostname - [ ] getImagingServiceCapabilities - [ ] getImagingSettings - [ ] getMediaServiceCapabilities From 91724fbc674cd4d6d2337773cb3f44c2eb4907c8 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 22 Jan 2022 16:14:18 +0300 Subject: [PATCH 051/112] Slice of work --- IMPLEMENTED.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md index 69cedee7..f889c120 100644 --- a/IMPLEMENTED.md +++ b/IMPLEMENTED.md @@ -1,21 +1,19 @@ # Implemented methods and properties in typescript -- [ ] activeSource -- [ ] activeSources -- [ ] capabilities -- [ ] defaultProfile -- [ ] defaultProfiles +- [x] activeSource +- [x] activeSources +- [x] capabilities +- [x] defaultProfile +- [x] defaultProfiles - [ ] events -- [ ] preserveAddress -- [ ] profiles -- [ ] profiles +- [x] preserveAddress +- [x] profiles - [ ] recordingItem - [ ] scopes -- [ ] services -- [ ] uri -- [ ] uri -- [ ] videoSources -- [ ] xaddrs +- [x] services +- [x] uri +- [x] videoSources +- [x] xaddrs - [ ] absoluteMove - [ ] addAudioEncoderConfiguration - [ ] addAudioSourceConfiguration From a973f4ef5d6b2c966843a48bf13eb6cbf4b629b3 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Thu, 6 Oct 2022 02:13:44 +0300 Subject: [PATCH 052/112] Update libraries --- ._eslintrc.json | 78 ----------- package-lock.json | 335 +++++++++++++++++++++++++--------------------- package.json | 6 +- src/device.ts | 4 +- 4 files changed, 188 insertions(+), 235 deletions(-) delete mode 100644 ._eslintrc.json diff --git a/._eslintrc.json b/._eslintrc.json deleted file mode 100644 index 8740328e..00000000 --- a/._eslintrc.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "extends": ["eslint:recommended", "plugin:node/recommended"], - "env": { - "node": true, - "mocha": true - }, - "rules": { - "node/no-deprecated-api": 0, - "no-console": 0, - "no-param-reassign": 0, - "no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_" - } - ], - "object-curly-newline": [ - "error", - { - "ObjectPattern": { - "multiline": true - } - } - ], - "strict": 0, - "curly": [ - 2, - "all" - ], - "keyword-spacing": [ - 2, - {} - ], - "space-before-function-paren": [ - 2, - "never" - ], - "no-spaced-func": 2, - "space-infix-ops": 2, - "space-unary-ops": [ - 2, - { - "words": false, - "nonwords": false - } - ], - "no-with": 2, - "brace-style": [ - 2, - "1tbs", - { - "allowSingleLine": true - } - ], - "key-spacing": [ - 2, - { - "beforeColon": false, - "afterColon": true - } - ], - "indent": [ - 2, - "tab", - { - "SwitchCase": 1 - } - ], - "no-mixed-spaces-and-tabs": 2, - "camelcase": [ - 2, - { - "properties": "never" - } - ], - "semi": "error" - } -} diff --git a/package-lock.json b/package-lock.json index bfce5889..3d38d935 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,13 +27,13 @@ "eslint-plugin-prettier": "^4.0.0", "ip": "^1.1.5", "keypress": "^0.2.1", - "mocha": "^9.1.3", + "mocha": "^10.0.0", "mocha-lcov-reporter": "^1.3.0", "nimble": "^0.0.2", "nyc": "^15.1.0", "prettier": "^2.5.1", - "typedoc": "^0.22.10", - "typescript": "^4.5.4" + "typedoc": "^0.23.15", + "typescript": "^4.8.4" }, "engines": { "node": ">=6.0" @@ -1257,10 +1257,16 @@ } }, "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "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", @@ -1424,9 +1430,9 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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" @@ -2564,15 +2570,6 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3249,9 +3246,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "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/jsprim": { @@ -3397,9 +3394,9 @@ } }, "node_modules/marked": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", - "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -3464,48 +3461,46 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14.0.0" }, "funding": { "type": "opencollective", @@ -3527,24 +3522,13 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "node_modules/mocha/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": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "balanced-match": "^1.0.0" } }, "node_modules/mocha/node_modules/js-yaml": { @@ -3559,6 +3543,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3587,9 +3583,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -4479,14 +4475,14 @@ } }, "node_modules/shiki": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", - "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", + "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", "dev": true, "dependencies": { "jsonc-parser": "^3.0.0", "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" + "vscode-textmate": "^6.0.0" } }, "node_modules/side-channel": { @@ -4820,31 +4816,51 @@ } }, "node_modules/typedoc": { - "version": "0.22.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", - "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", + "version": "0.23.15", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.15.tgz", + "integrity": "sha512-x9Zu+tTnwxb9YdVr+zvX7LYzyBl1nieOr6lrSHbHsA22/RJK2m4Y525WIg5Mj4jWCmfL47v6f4hUzY7EIuwS5w==", "dev": true, "dependencies": { - "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^4.0.10", - "minimatch": "^3.0.4", - "shiki": "^0.10.0" + "marked": "^4.0.19", + "minimatch": "^5.1.0", + "shiki": "^0.11.1" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { - "node": ">= 12.10.0" + "node": ">= 14.14" }, "peerDependencies": { - "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x" + "typescript": "4.6.x || 4.7.x || 4.8.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": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -4909,15 +4925,15 @@ } }, "node_modules/vscode-oniguruma": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", - "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", + "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", "dev": true }, "node_modules/vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", + "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", "dev": true }, "node_modules/which": { @@ -4967,9 +4983,9 @@ } }, "node_modules/workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "node_modules/wrap-ansi": { @@ -5991,9 +6007,9 @@ } }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "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", @@ -6133,9 +6149,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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" @@ -6978,12 +6994,6 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -7469,9 +7479,9 @@ } }, "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "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 }, "jsprim": { @@ -7583,9 +7593,9 @@ } }, "marked": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", - "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", "dev": true }, "merge2": { @@ -7629,38 +7639,36 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -7672,18 +7680,13 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "balanced-match": "^1.0.0" } }, "js-yaml": { @@ -7695,6 +7698,15 @@ "argparse": "^2.0.1" } }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -7725,9 +7737,9 @@ "dev": true }, "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, "natural-compare": { @@ -8367,14 +8379,14 @@ "dev": true }, "shiki": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", - "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", + "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", "dev": true, "requires": { "jsonc-parser": "^3.0.0", "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" + "vscode-textmate": "^6.0.0" } }, "side-channel": { @@ -8630,22 +8642,41 @@ } }, "typedoc": { - "version": "0.22.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", - "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", + "version": "0.23.15", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.15.tgz", + "integrity": "sha512-x9Zu+tTnwxb9YdVr+zvX7LYzyBl1nieOr6lrSHbHsA22/RJK2m4Y525WIg5Mj4jWCmfL47v6f4hUzY7EIuwS5w==", "dev": true, "requires": { - "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^4.0.10", - "minimatch": "^3.0.4", - "shiki": "^0.10.0" + "marked": "^4.0.19", + "minimatch": "^5.1.0", + "shiki": "^0.11.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": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true }, "unbox-primitive": { @@ -8693,15 +8724,15 @@ } }, "vscode-oniguruma": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", - "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", + "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", "dev": true }, "vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", + "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", "dev": true }, "which": { @@ -8739,9 +8770,9 @@ "dev": true }, "workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "wrap-ansi": { diff --git a/package.json b/package.json index 2d4db337..d9b58168 100644 --- a/package.json +++ b/package.json @@ -70,12 +70,12 @@ "eslint-plugin-prettier": "^4.0.0", "ip": "^1.1.5", "keypress": "^0.2.1", - "mocha": "^9.1.3", + "mocha": "^10.0.0", "mocha-lcov-reporter": "^1.3.0", "nimble": "^0.0.2", "nyc": "^15.1.0", "prettier": "^2.5.1", - "typedoc": "^0.22.10", - "typescript": "^4.5.4" + "typedoc": "^0.23.15", + "typescript": "^4.8.4" } } diff --git a/src/device.ts b/src/device.ts index bf69b45d..2bf4ba6d 100644 --- a/src/device.ts +++ b/src/device.ts @@ -261,9 +261,9 @@ export interface DeviceCapabilities { export interface AnalyticsCapabilities { /** Analytics service URI */ XAddr: string; - /** Indicates whether or not rules are supported */ + /** Indicates whether rules are supported */ ruleSupport: boolean; - /** Indicates whether or not modules are supported */ + /** Indicates whether modules are supported */ analyticsModuleSupport: boolean; } From 08162c9c550297b05357d49a8c1c9f60eed302c8 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 9 Oct 2022 16:16:18 +0300 Subject: [PATCH 053/112] fix missing `hostname` parameter in requests --- src/onvif.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/onvif.ts b/src/onvif.ts index b628e179..7ac638ce 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -182,7 +182,7 @@ export class Onvif extends EventEmitter { }); if (options.autoConnect) { setImmediate(() => { - this.connect(); + this.connect().catch((error) => this.emit('error', error)); }); } } @@ -260,9 +260,10 @@ export class Onvif extends EventEmitter { private async rawRequest(options: OnvifRequestOptions): Promise<[Record, string]> { return new Promise((resolve, reject) => { let alreadyReturned = false; - let requestOptions = { + const requestOptions = { ...options, - path : options.service + hostname : this.hostname, + path : options.service ? (this.uri[options.service] ? this.uri[options.service]?.pathname : options.service) : this.path, port : this.port, @@ -276,7 +277,9 @@ export class Onvif extends EventEmitter { }; requestOptions.method = 'POST'; const httpLibrary = this.useSecure ? https : http; - requestOptions = this.useSecure ? { ...requestOptions, ...this.secureOptions } : requestOptions; + if (this.useSecure) { + Object.assign(requestOptions, this.secureOptions); + } const request = httpLibrary.request(requestOptions, (response) => { const bufs: Buffer[] = []; let length = 0; @@ -334,6 +337,9 @@ export class Onvif extends EventEmitter { } public request(options: OnvifRequestOptions) { + if (!options.body) { + throw new Error("There is no 'body' field in request options"); + } return this.rawRequest({ ...options, body : `${this.envelopeHeader()}${options.body}${this.envelopeFooter()}`, From 471decf70d8704c47dce86c7d4940b523d4a4d65 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 9 Oct 2022 19:10:50 +0300 Subject: [PATCH 054/112] First steps to add class that represents old API from v.0.x Add common tests for this class --- .eslintrc.js | 5 +- .mocharc.js | 4 +- legacyTest/common.js | 545 ++++++++++++++++++ legacyTest/serverMockup.js | 130 +++++ legacyTest/serverMockup/Error.xml | 35 ++ legacyTest/serverMockup/GetCapabilities.xml | 84 +++ .../serverMockup/GetCapabilitiesEncoder.xml | 114 ++++ .../serverMockup/GetConfigurationOptions.xml | 92 +++ legacyTest/serverMockup/GetConfigurations.xml | 32 + .../serverMockup/GetDeviceInformation.xml | 22 + .../serverMockup/GetEventProperties.xml | 26 + legacyTest/serverMockup/GetHostname.xml | 20 + legacyTest/serverMockup/GetNodes.xml | 100 ++++ legacyTest/serverMockup/GetProfiles.xml | 71 +++ legacyTest/serverMockup/GetScopes.xml | 49 ++ .../serverMockup/GetServiceCapabilities.xml | 22 + legacyTest/serverMockup/GetServices.xml | 65 +++ legacyTest/serverMockup/GetSnapshotUri.xml | 23 + legacyTest/serverMockup/GetStatus.xml | 28 + legacyTest/serverMockup/GetStreamUri.xml | 23 + .../serverMockup/GetSystemDateAndTime.xml | 26 + .../GetVideoSourceConfigurations.xml | 23 + .../serverMockup/GetVideoSourcesEncoder.xml | 66 +++ legacyTest/serverMockup/Probe.xml | 26 + legacyTest/serverMockup/PullMessages.xml | 64 ++ legacyTest/serverMockup/SetScopes.xml | 16 + .../serverMockup/SetSystemDateAndTime.xml | 16 + legacyTest/serverMockup/SystemReboot.xml | 18 + legacyTest/serverMockup/Unsubscribe.xml | 14 + .../serverMockup/device.CreateUsers.xml | 6 + .../serverMockup/device.DeleteUsers.xml | 6 + legacyTest/serverMockup/device.GetDNS.xml | 18 + legacyTest/serverMockup/device.GetNTP.xml | 24 + .../device.GetNetworkDefaultGateway.xml | 11 + .../device.GetNetworkInterfaces.xml | 53 ++ legacyTest/serverMockup/device.GetUsers.xml | 17 + .../device.GetZeroConfiguration.xml | 12 + legacyTest/serverMockup/device.SetDNS.xml | 6 + legacyTest/serverMockup/device.SetNTP.xml | 16 + .../device.SetNetworkDefaultGateway.xml | 6 + .../device.SetNetworkInterfaces.xml | 8 + .../device.SetSystemFactoryDefault.xml | 6 + legacyTest/serverMockup/device.SetUser.xml | 6 + .../events.CreatePullPointSubscription.xml | 23 + .../events.GetServiceCapabilities.xml | 18 + .../serverMockup/imaging.GetCurrentPreset.xml | 22 + .../imaging.GetImagingSettings.xml | 26 + .../serverMockup/imaging.GetOptions.xml | 21 + .../imaging.GetServiceCapabilities.xml | 18 + .../serverMockup/imaging.SetCurrentPreset.xml | 16 + .../imaging.SetImagingSettings.xml | 15 + .../media.AddAudioEncoderConfiguration.xml | 5 + .../media.AddAudioSourceConfiguration.xml | 5 + .../media.AddVideoEncoderConfiguration.xml | 5 + .../media.AddVideoSourceConfiguration.xml | 5 + .../serverMockup/media.CreateProfile.xml | 19 + .../serverMockup/media.DeleteProfile.xml | 16 + .../media.GetAudioEncoderConfiguration.xml | 32 + ...ia.GetAudioEncoderConfigurationOptions.xml | 32 + .../media.GetAudioEncoderConfigurations.xml | 32 + .../serverMockup/media.GetAudioSources.xml | 19 + legacyTest/serverMockup/media.GetOSDOptions | 48 ++ .../media.GetServiceCapabilities.xml | 11 + .../media.GetVideoEncoderConfiguration.xml | 46 ++ ...ia.GetVideoEncoderConfigurationOptions.xml | 87 +++ .../media.GetVideoEncoderConfigurations.xml | 46 ++ .../serverMockup/media.GetVideoSources.xml | 24 + .../media.RemoveAudioEncoderConfiguration.xml | 5 + .../media.RemoveAudioSourceConfiguration.xml | 5 + .../media.SetAudioEncoderConfiguration.xml | 16 + .../media.SetVideoEncoderConfiguration.xml | 16 + legacyTest/serverMockup/ptz.AbsoluteMove.xml | 16 + .../serverMockup/ptz.ContinuousMove.xml | 16 + legacyTest/serverMockup/ptz.GetPresets.xml | 154 +++++ .../serverMockup/ptz.GotoHomePosition.xml | 16 + legacyTest/serverMockup/ptz.GotoPreset.xml | 16 + legacyTest/serverMockup/ptz.RelativeMove.xml | 16 + legacyTest/serverMockup/ptz.RemovePreset.xml | 16 + .../serverMockup/ptz.SetHomePosition.xml | 16 + legacyTest/serverMockup/ptz.SetPreset.xml | 18 + legacyTest/serverMockup/ptz.Stop.xml | 16 + lib/utils.js | 11 +- package.json | 3 +- src/legacy/cam.ts | 60 ++ tsconfig.json | 5 +- 85 files changed, 2948 insertions(+), 18 deletions(-) create mode 100644 legacyTest/common.js create mode 100644 legacyTest/serverMockup.js create mode 100644 legacyTest/serverMockup/Error.xml create mode 100644 legacyTest/serverMockup/GetCapabilities.xml create mode 100644 legacyTest/serverMockup/GetCapabilitiesEncoder.xml create mode 100644 legacyTest/serverMockup/GetConfigurationOptions.xml create mode 100644 legacyTest/serverMockup/GetConfigurations.xml create mode 100644 legacyTest/serverMockup/GetDeviceInformation.xml create mode 100644 legacyTest/serverMockup/GetEventProperties.xml create mode 100644 legacyTest/serverMockup/GetHostname.xml create mode 100644 legacyTest/serverMockup/GetNodes.xml create mode 100644 legacyTest/serverMockup/GetProfiles.xml create mode 100644 legacyTest/serverMockup/GetScopes.xml create mode 100644 legacyTest/serverMockup/GetServiceCapabilities.xml create mode 100644 legacyTest/serverMockup/GetServices.xml create mode 100644 legacyTest/serverMockup/GetSnapshotUri.xml create mode 100644 legacyTest/serverMockup/GetStatus.xml create mode 100644 legacyTest/serverMockup/GetStreamUri.xml create mode 100644 legacyTest/serverMockup/GetSystemDateAndTime.xml create mode 100644 legacyTest/serverMockup/GetVideoSourceConfigurations.xml create mode 100644 legacyTest/serverMockup/GetVideoSourcesEncoder.xml create mode 100644 legacyTest/serverMockup/Probe.xml create mode 100644 legacyTest/serverMockup/PullMessages.xml create mode 100644 legacyTest/serverMockup/SetScopes.xml create mode 100644 legacyTest/serverMockup/SetSystemDateAndTime.xml create mode 100644 legacyTest/serverMockup/SystemReboot.xml create mode 100644 legacyTest/serverMockup/Unsubscribe.xml create mode 100644 legacyTest/serverMockup/device.CreateUsers.xml create mode 100644 legacyTest/serverMockup/device.DeleteUsers.xml create mode 100644 legacyTest/serverMockup/device.GetDNS.xml create mode 100644 legacyTest/serverMockup/device.GetNTP.xml create mode 100644 legacyTest/serverMockup/device.GetNetworkDefaultGateway.xml create mode 100644 legacyTest/serverMockup/device.GetNetworkInterfaces.xml create mode 100644 legacyTest/serverMockup/device.GetUsers.xml create mode 100644 legacyTest/serverMockup/device.GetZeroConfiguration.xml create mode 100644 legacyTest/serverMockup/device.SetDNS.xml create mode 100644 legacyTest/serverMockup/device.SetNTP.xml create mode 100644 legacyTest/serverMockup/device.SetNetworkDefaultGateway.xml create mode 100644 legacyTest/serverMockup/device.SetNetworkInterfaces.xml create mode 100644 legacyTest/serverMockup/device.SetSystemFactoryDefault.xml create mode 100644 legacyTest/serverMockup/device.SetUser.xml create mode 100644 legacyTest/serverMockup/events.CreatePullPointSubscription.xml create mode 100644 legacyTest/serverMockup/events.GetServiceCapabilities.xml create mode 100644 legacyTest/serverMockup/imaging.GetCurrentPreset.xml create mode 100644 legacyTest/serverMockup/imaging.GetImagingSettings.xml create mode 100644 legacyTest/serverMockup/imaging.GetOptions.xml create mode 100644 legacyTest/serverMockup/imaging.GetServiceCapabilities.xml create mode 100644 legacyTest/serverMockup/imaging.SetCurrentPreset.xml create mode 100644 legacyTest/serverMockup/imaging.SetImagingSettings.xml create mode 100644 legacyTest/serverMockup/media.AddAudioEncoderConfiguration.xml create mode 100644 legacyTest/serverMockup/media.AddAudioSourceConfiguration.xml create mode 100644 legacyTest/serverMockup/media.AddVideoEncoderConfiguration.xml create mode 100644 legacyTest/serverMockup/media.AddVideoSourceConfiguration.xml create mode 100644 legacyTest/serverMockup/media.CreateProfile.xml create mode 100644 legacyTest/serverMockup/media.DeleteProfile.xml create mode 100644 legacyTest/serverMockup/media.GetAudioEncoderConfiguration.xml create mode 100644 legacyTest/serverMockup/media.GetAudioEncoderConfigurationOptions.xml create mode 100644 legacyTest/serverMockup/media.GetAudioEncoderConfigurations.xml create mode 100644 legacyTest/serverMockup/media.GetAudioSources.xml create mode 100644 legacyTest/serverMockup/media.GetOSDOptions create mode 100644 legacyTest/serverMockup/media.GetServiceCapabilities.xml create mode 100644 legacyTest/serverMockup/media.GetVideoEncoderConfiguration.xml create mode 100644 legacyTest/serverMockup/media.GetVideoEncoderConfigurationOptions.xml create mode 100644 legacyTest/serverMockup/media.GetVideoEncoderConfigurations.xml create mode 100644 legacyTest/serverMockup/media.GetVideoSources.xml create mode 100644 legacyTest/serverMockup/media.RemoveAudioEncoderConfiguration.xml create mode 100644 legacyTest/serverMockup/media.RemoveAudioSourceConfiguration.xml create mode 100644 legacyTest/serverMockup/media.SetAudioEncoderConfiguration.xml create mode 100644 legacyTest/serverMockup/media.SetVideoEncoderConfiguration.xml create mode 100644 legacyTest/serverMockup/ptz.AbsoluteMove.xml create mode 100644 legacyTest/serverMockup/ptz.ContinuousMove.xml create mode 100644 legacyTest/serverMockup/ptz.GetPresets.xml create mode 100644 legacyTest/serverMockup/ptz.GotoHomePosition.xml create mode 100644 legacyTest/serverMockup/ptz.GotoPreset.xml create mode 100644 legacyTest/serverMockup/ptz.RelativeMove.xml create mode 100644 legacyTest/serverMockup/ptz.RemovePreset.xml create mode 100644 legacyTest/serverMockup/ptz.SetHomePosition.xml create mode 100644 legacyTest/serverMockup/ptz.SetPreset.xml create mode 100644 legacyTest/serverMockup/ptz.Stop.xml create mode 100644 src/legacy/cam.ts diff --git a/.eslintrc.js b/.eslintrc.js index 6659d27d..e61bac27 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -35,8 +35,9 @@ module.exports = { 'prettier', ], env : { - node : true, - jest : true, + node : true, + jest : true, + mocha : true, }, rules : commonRules, diff --git a/.mocharc.js b/.mocharc.js index 8a636aa8..790c8a51 100644 --- a/.mocharc.js +++ b/.mocharc.js @@ -1,4 +1,4 @@ module.exports = { - 'spec': 'test/*.js', - 'exclude': 'test/serverMockup.js' + 'spec': 'legacyTest/*.js', + 'exclude': 'legacyTest/serverMockup.js' }; diff --git a/legacyTest/common.js b/legacyTest/common.js new file mode 100644 index 00000000..7154bf13 --- /dev/null +++ b/legacyTest/common.js @@ -0,0 +1,545 @@ +const synthTest = !process.env.HOSTNAME; + +const assert = require('assert'); +const onvif = require('../build/legacy/cam'); + +let serverMockup; +if (synthTest) { + // eslint-disable-next-line import/no-useless-path-segments + serverMockup = require('../legacyTest/serverMockup'); +} + +describe('Common functions', () => { + let cam = null; + before(done => { + serverMockup.start((err) => { + assert.equal(err, null); + const options = { + hostname : process.env.HOSTNAME || 'localhost', + username : process.env.USERNAME || 'admin', + password : process.env.PASSWORD || '9999', + port : process.env.PORT ? parseInt(process.env.PORT, 10) : 10101, + }; + cam = new onvif.Cam(options, done); + }) + }); + + after(done => { + if (synthTest) { + serverMockup.close(); + done(); + } + }); + + describe('default params', () => { + it('should set default port and path when no one is specified', (done) => { + const defaultCam = new onvif.Cam({}); + assert.strictEqual(defaultCam.port, 80); + assert.strictEqual(defaultCam.path, '/onvif/device_service'); + done(); + }); + }); + + describe('default autoconnect', () => { + it('should connect automatically', (done) => { + const callbackFunction = () => done(); + new onvif.Cam({}, callbackFunction); + }); + }); + + describe('autoconnect disabled', () => { + it('should not connect automatically', (done) => { + const options = { + autoconnect : false, + timeout : 0 + }; + new onvif.Cam(options, assert.fail); + setTimeout(done, 100); + }); + }); + + describe('_request', () => { + it('brokes when no arguments are passed', (done) => { + assert.throws(() => cam._request()); + done(); + }); + it('brokes when no callback is passed', (done) => { + assert.throws(() => cam._request({})); + done(); + }); + it('brokes when no options.body is passed', (done) => { + assert.throws(() => cam._request({}, () => {})); + done(); + }); + it('should return an error message when the network is unreachible', (done) => { + const host = cam.hostname; + cam.hostname = 'wrong hostname'; + cam._request({body : 'test'}, (err) => { + assert.notStrictEqual(err, null); + cam.hostname = host; + done(); + }); + }); + it('should return an error message when the server request times out', (done) => { + const host = cam.hostname; + const oldTimeout = cam.timeout; + cam.hostname = '10.255.255.1'; + cam.timeout = 500; + console.time('a'); + cam._request({body : 'timeout'}, (err) => { + assert.notStrictEqual(err, null); + cam.timeout = oldTimeout; + cam.hostname = host; + console.timeEnd('a'); + done(); + }); + }); + it('should work nice with the proper request body', (done) => { + cam._request({ + body : '' + + '' + + '' + + '' + + '' + } + , (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + it('should handle SOAP Fault as an error (http://www.onvif.org/onvif/ver10/tc/onvif_core_ver10.pdf, pp.45-46)', (done) => { + cam._request({body : '' + + '' + + '' + + '' + + ''} + , (err) => { + assert.notStrictEqual(err, null); + assert.ok(err instanceof Error); + done(); + }); + }); + }); + + describe('connect', () => { + it('should connect to the cam, fill startup properties', (done) => { + cam.connect((err) => { + assert.strictEqual(err, null); + assert.ok(cam.capabilities || cam.services); + if (synthTest) { + assert.ok(cam.uri.ptz); + } + assert.ok(cam.uri.media); + assert.ok(cam.videoSources); + assert.ok(cam.profiles); + assert.ok(cam.defaultProfile); + assert.ok(cam.activeSource); + done(); + }); + }); + it('should return an error when upstart is unfinished', (done) => { + cam.getCapabilities = (cb) => cb(new Error('error')); + cam.connect((err) => { + assert.notStrictEqual(err, null); + delete cam.getCapabilities; + done(); + }); + }); + }); + + describe('getSystemDateAndTime', () => { + it('should return valid date', (done) => { + cam.getSystemDateAndTime((err, data) => { + assert.strictEqual(err, null); + assert.ok(data instanceof Date); + done(); + }); + }); + }); + + describe('setSystemDateAndTime', () => { + it('should throws an error when `dateTimeType` is wrong', (done) => { + cam.setSystemDateAndTime({ + dateTimeType : 'blah' + }, (err) => { + assert.notStrictEqual(err, null); + done(); + }); + }); + if (synthTest) { + it('should set system date and time', (done) => { + cam.setSystemDateAndTime({ + dateTimeType : 'Manual', + dateTime : new Date(), + daylightSavings : true, + timezone : 'MSK', + }, (err, data) => { + assert.strictEqual(err, null); + assert.ok(data instanceof Date); + done(); + }); + }); + it('should return an error when SetSystemDateAndTime message returns error', (done) => { + serverMockup.conf.bad = true; + cam.setSystemDateAndTime({ + dateTimeType : 'Manual', + dateTime : new Date(), + daylightSavings : true, + timezone : 'MSK', + }, (err) => { + assert.notStrictEqual(err, null); + delete serverMockup.conf.bad; + done(); + }); + }); + } + }); + + describe('getHostname', () => { + it('should return device name', (done) => { + cam.getHostname((err, data) => { + assert.strictEqual(err, null); + assert.ok(typeof data.fromDHCP === 'boolean'); + done(); + }); + }); + }); + + describe('getScopes', () => { + it('should return device scopes as array when different scopes', (done) => { + cam.getScopes((err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data)); + data.forEach((scope) => { + assert.ok(scope.scopeDef); + assert.ok(scope.scopeItem); + }); + done(); + }); + }); + if (synthTest) { + it('should return device scopes as array when one scope', (done) => { + serverMockup.conf.count = 1; + cam.getScopes((err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data)); + data.forEach((scope) => { + assert.ok(scope.scopeDef); + assert.ok(scope.scopeItem); + delete serverMockup.conf.count; + done(); + }); + }); + }); + it('should return device scopes as array when no scopes', (done) => { + serverMockup.conf.count = 0; + cam.getScopes((err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data)); + data.forEach((scope) => { + assert.ok(scope.scopeDef); + assert.ok(scope.scopeItem); + delete serverMockup.conf.count; + + }); + done(); + }); + }); + } + }); + + describe('setScopes', () => { + it('should set and return device scopes as array', (done) => { + cam.setScopes(['onvif://www.onvif.org/none'], (err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data)); + data.forEach((scope) => { + assert.ok(scope.scopeDef); + assert.ok(scope.scopeItem); + }); + done(); + }); + }); + if (synthTest) { + it('should return an error when SetScopes message returns error', (done) => { + serverMockup.conf.bad = true; + cam.setScopes(['onvif://www.onvif.org/none'], (err) => { + assert.notStrictEqual(err, null); + delete serverMockup.conf.bad; + done(); + }); + }); + } + }); + + describe('getCapabilities', () => { + it('should return a capabilities object with correspondent properties and also set them into #capability property', (done) => { + cam.getCapabilities((err, data) => { + assert.strictEqual(err, null); + assert.ok(cam.profiles.every((profile) => + ['name', 'videoSourceConfiguration', 'videoEncoderConfiguration', 'PTZConfiguration'] + .every((prop) => profile[prop]))); + assert.strictEqual(cam.capabilities, data); + done(); + }); + }); + it('should store PTZ link in ptzUri property', (done) => { + assert.strictEqual(cam.uri.ptz.href, cam.capabilities.PTZ.XAddr); + done(); + }); + it('should store uri links for extensions', (done) => { + assert.ok(Object.keys(cam.capabilities.extension).every((ext) => cam.uri[ext])); + done(); + }); + }); + + describe('getServiceCapabilities', () => { + it('should return a service capabilities object and also set them into #serviceCapabilities property', (done) => { + cam.getServiceCapabilities((err, data) => { + assert.strictEqual(err, null); + if (synthTest) { + assert.ok(['network', 'security', 'system', 'auxiliaryCommands'].every((prop) => data[prop])); + } else { + assert.ok(['network', 'security', 'system'].every((prop) => data[prop])); + } + assert.strictEqual(cam.serviceCapabilities, data); + done(); + }); + }); + }); + + describe('getActiveSources', () => { + it('should find at least one appropriate source', () => { + cam.getActiveSources(); + assert.ok(cam.defaultProfile); + assert.ok(cam.activeSource); + }); + it('should throws an error when no one profile has actual videosource token', () => { + const realProfiles = cam.profiles; + cam.profiles.forEach((profile) => profile.videoSourceConfiguration.sourceToken = 'crap'); + assert.throws(cam.getActiveSources, Error); + cam.profiles = realProfiles; + }); + // I can't remember and understand why it is here :) + // ###it 'should populate activeSources and defaultProfiles when more than one video source exists', () -> + // fs.rename './serverMockup/GetVideoSources.xml', './serverMockup/GetVideoSources.single', (err) -> + // assert.equal err, null + // fs.rename './serverMockup/GetVideoSourcesEncoder.xml', './serverMockup/GetVideoSources.xml', (err) -> + // assert.equal err, null + // cam.getActiveSources() + // assert.isArray(cam.activeSources) + // assert.isArray(cam.defaultProfiles) + // + // fs.rename './serverMockup/GetVideoSources.xml', './serverMockup/GetVideoSourcesEncoder.xml', (err) -> + // assert.equal err, null + // fs.rename './serverMockup/GetVideoSources.single', './serverMockup/GetVideoSources.xml', (err) -> + // assert.equal err, null### + }); + + describe('getVideoSources', () => { + it('should return a videosources object with correspondent properties and also set them into videoSources property', (done) => { + cam.getVideoSources((err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data)); + data.every((d) => { + assert.ok(['$', 'framerate', 'resolution'].every((prop) => d[prop] !== undefined)); + assert.strictEqual(cam.videoSources, data); + }); + done(); + }); + }); + }); + + describe('getServices', () => { + it('should return an array of services objects', (done) => { + cam.getServices(true, (err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data)); + assert.ok(data.every((service) => service.namespace && service.XAddr && service.version)); + done(); + }); + }); + }); + + describe('getDeviceInformation', () => { + it('should return an information about device', (done) => { + cam.getDeviceInformation((err, data) => { + assert.strictEqual(err, null); + assert.ok(['manufacturer', 'model', 'firmwareVersion', 'serialNumber', 'hardwareId'] + .every((prop) => data[prop] !== undefined)); + console.log('Device Information:', data); + assert.strictEqual(cam.deviceInformation, data); + done(); + }); + }); + }); + + describe('getStreamUri', () => { + it('should return a media stream uri', (done) => { + cam.getStreamUri({protocol : 'HTTP'}, (err, data) => { + assert.strictEqual(err, null); + assert.ok(['uri', 'invalidAfterConnect', 'invalidAfterReboot', 'timeout'].every((prop) => data[prop] !== undefined)); + done(); + }); + }); + it('should return a default media stream uri with no options passed', (done) => { + cam.getStreamUri((err, data) => { + assert.strictEqual(err, null); + assert.ok(['uri', 'invalidAfterConnect', 'invalidAfterReboot', 'timeout'].every((prop) => data[prop] !== undefined)); + done(); + }); + }); + }); + + describe('getSnapshotUri', () => { + it('should return a default media uri with no options passed', (done) => { + cam.getSnapshotUri((err, data) => { + assert.strictEqual(err, null); + assert.ok(['uri', 'invalidAfterConnect', 'invalidAfterReboot', 'timeout'].every((prop) => data[prop] !== undefined)); + done(); + }); + }); + }); + + describe('getNodes', () => { + it('should return object of nodes and sets them to #nodes', (done) => { + cam.getNodes((err, data) => { + assert.strictEqual(err, null); + assert.ok(typeof data === 'object'); + assert.deepStrictEqual(cam.nodes, data); + done(); + }); + }); + }); + + describe('getConfigurations', () => { + it('should return object of configurations and sets them to #configurations', (done) => { + cam.getConfigurations((err, data) => { + assert.strictEqual(err, null); + assert.ok(typeof data === 'object'); + assert.deepStrictEqual(cam.configurations, data); + done(); + }); + }); + }); + + describe('getConfigurationOptions', () => { + it('should return an options object for every configuration token', (done) => { + const tokens = Object.keys(cam.configurations); + let cou = tokens.length; + tokens.forEach((token) => { + cam.getConfigurationOptions(token, (err, data) => { + assert.strictEqual(err, null); + assert.ok(typeof data === 'object'); + if (!--cou) { + done(); + } + }); + }); + }); + }); + + describe('systemReboot', () => { + if (synthTest) { + it('should return a server message', (done) => { + cam.systemReboot((err, data) => { + assert.strictEqual(err, null); + assert.strictEqual(typeof data, 'string'); + done(); + }); + }); + } + }); + + describe('EventEmitter', () => { + let onEvent = null; + let eventNbr = 0; + + it('should listen with `addListener`', (done) => { + cam.removeAllListeners(); // Remove all listeners in case some remains + eventNbr = 0; + onEvent = () => eventNbr += 1; + cam.addListener('myEvent', onEvent); + const listeners = cam.listeners('myEvent'); + assert.strictEqual(listeners.length, 1); + const listenerCount = cam.listenerCount('myEvent'); + assert.strictEqual(listenerCount, 1); + setTimeout(() => cam.emit('myEvent', ''), 250); + setTimeout(() => { + assert.ok(eventNbr > 0); + done(); + }, 1000); + }); + it('should stop listening with `removeListener`', (done) => { + eventNbr = 0; + cam.removeListener('myEvent', onEvent); + const listeners = cam.listeners('myEvent'); + assert.strictEqual(listeners.length, 0); + const listenerCount = cam.listenerCount('myEvent'); + assert.strictEqual(listenerCount, 0); + setTimeout(() => cam.emit('myEvent', ''), 250); + setTimeout(() => { + assert.ok(eventNbr === 0); + done(); + }, 500); + }); + it('should listen with `on`', (done) => { + cam.removeAllListeners(); // Remove all listeners in case some remains + eventNbr = 0; + onEvent = () => eventNbr += 1; + cam.on('myEvent', onEvent); + const listeners = cam.listeners('myEvent'); + assert.strictEqual(listeners.length, 1); + const listenerCount = cam.listenerCount('myEvent'); + assert.equal(listenerCount, 1); + setTimeout(() => cam.emit('myEvent', ''), 250); + setTimeout(() => { + assert.ok(eventNbr > 0); + done(); + }, 500); + }); + // Another strange part + // # it 'should stop listening with `off`', (done) -> + // # eventNbr = 0 + // # cam.off 'myEvent', onEvent + // # # cam.removeListener 'myEvent', onEvent + // # listeners = cam.listeners 'myEvent' + // # assert.equal listeners.length, 0 + // # listenerCount = cam.listenerCount 'myEvent' + // # assert.equal listenerCount, 0 + // # setTimeout () -> + // # cam.emit 'myEvent', '' + // # , 250 + // # setTimeout () -> + // # assert.ok eventNbr == 0 + // # done() + // # , 500 + it('should listen only once with `once`', (done) => { + cam.removeAllListeners('myEvent'); // Remove all listeners in case some remains + setTimeout(() => { + eventNbr = 0; + onEvent = () => eventNbr += 1; + cam.once('myEvent', onEvent); + let listeners = cam.listeners('myEvent'); + assert.strictEqual(listeners.length, 1); + let listenerCount = cam.listenerCount('myEvent'); + assert.strictEqual(listenerCount, 1); + const emit = () => cam.emit('myEvent', ''); + setTimeout(() => { + setImmediate(emit); // Send twice + setImmediate(emit); + }, 100); + setTimeout(() => { + assert.ok(eventNbr === 1); + listeners = cam.listeners('myEvent'); + assert.strictEqual(listeners.length, 0); + listenerCount = cam.listenerCount('myEvent'); + assert.strictEqual(listenerCount, 0); + done(); + }, 500); + } + , 100); + }); + }); +}); + diff --git a/legacyTest/serverMockup.js b/legacyTest/serverMockup.js new file mode 100644 index 00000000..a27f4d23 --- /dev/null +++ b/legacyTest/serverMockup.js @@ -0,0 +1,130 @@ +const http = require('http'); +const dgram = require('dgram'); +const xml2js = require('xml2js'); +const fs = require('fs'); +const Buffer = require('buffer').Buffer; +// eslint-disable-next-line node/no-unpublished-require +const template = require('dot').template; +const reBody = /(.*)<\/s:Body>/; +const reCommand = /<(\S*) /; +const reNS = /xmlns="http:\/\/www.onvif.org\/\S*\/(\S*)\/wsdl"/; +const __xmldir = __dirname + '/serverMockup/'; +const conf = { + port: parseInt(process.env.PORT) || 10101, // server port + hostname: process.env.HOSTNAME || 'localhost', + pullPointUrl: '/onvif/subscription?Idx=6', +}; + +const verbose = process.env.VERBOSE || false; + +const listener = (req, res) => { + req.setEncoding('utf8'); + const buf = []; + req.on('data', (chunk) => buf.push(chunk)); + req.on('end', () => { + let request; + if (Buffer.isBuffer(buf)) { + request = Buffer.concat(buf); + } else { + request = buf.join(''); + } + // Find body and command name + const body = reBody.exec(request); + if (!body) { + return res.end(); + } + const header = body[1]; + let command = reCommand.exec(header)[1]; + if (!command) { + return res.end(); + } + // Look for ONVIF namespaces + const onvifNamespaces = reNS.exec(header); + let ns = ''; + if (onvifNamespaces) { + ns = onvifNamespaces[1]; + } + if (verbose) { + console.log('received', ns, command); + } + if (fs.existsSync(__xmldir + ns + '.' + command + '.xml')) { + command = ns + '.' + command; + } + if (!fs.existsSync(__xmldir + command + '.xml')) { + command = 'Error'; + } + const fileName = __xmldir + command + '.xml'; + if (verbose) { + console.log('serving', fileName); + } + res.setHeader('Content-Type', 'application/soap+xml;charset=UTF-8'); + res.end(template(fs.readFileSync(fileName))(conf)); + }); +}; + +// Discovery service +const discoverReply = dgram.createSocket('udp4'); +const discover = dgram.createSocket({ type: 'udp4', reuseAddr: true }); +discover.on('error', (err) => { throw err; }); +discover.on('message', (msg, rinfo) => { + if (verbose) { + console.log('Discovery received'); + } + // Extract MessageTo from the XML. xml2ns options remove the namespace tags and ensure element character content is accessed with '_' + xml2js.parseString(msg.toString(), { explicitCharkey: true, tagNameProcessors: [xml2js.processors.stripPrefix]}, (err, result) => { + const msgId = result.Envelope.Header[0].MessageID[0]._; + const discoverMsg = Buffer.from(fs + .readFileSync(__xmldir + 'Probe.xml') + .toString() + .replace('RELATES_TO', msgId) + .replace('SERVICE_URI', 'http://' + conf.hostname + ':' + conf.port + '/onvif/device_service') + ); + switch (msgId) { + // Wrong message test + case 'urn:uuid:e7707': discoverReply.send(Buffer.from('lollipop'), 0, 8, rinfo.port, rinfo.address); + break; + // Double sending test + case 'urn:uuid:d0-61e': + discoverReply.send(discoverMsg, 0, discoverMsg.length, rinfo.port, rinfo.address); + discoverReply.send(discoverMsg, 0, discoverMsg.length, rinfo.port, rinfo.address); + break; + default: discoverReply.send(discoverMsg, 0, discoverMsg.length, rinfo.port, rinfo.address); + } + }); +}); + +if (verbose) { + console.log('Listening for Discovery Messages on Port 3702'); +} +discover.bind(3702, () => discover.addMembership('239.255.255.250')); + +let server = null; +const start = (callback) => { + if (server !== null) { + return server + } + server = http.createServer(listener).listen(conf.port, (err) => { + if (verbose) { + console.log('Listening on port', conf.port); + } + callback(err); + }); + return server; +} + +const close = () => { + discover.close(); + discoverReply.close(); + server.close(); + if (verbose) { + console.log('Closing ServerMockup'); + } +}; + +module.exports = { + start: start, + server: server, + conf: conf, + discover: discover, + close: close, +}; diff --git a/legacyTest/serverMockup/Error.xml b/legacyTest/serverMockup/Error.xml new file mode 100644 index 00000000..dc06bba2 --- /dev/null +++ b/legacyTest/serverMockup/Error.xml @@ -0,0 +1,35 @@ + + + + + + + fault code + + + + ter:fault subcode + + + + ter:fault subcode + + + + + + + fault reason + + + http://www.w3.org/2003/05/soap-envelope/node/ultimateReceiver + http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver + + + fault detail + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetCapabilities.xml b/legacyTest/serverMockup/GetCapabilities.xml new file mode 100644 index 00000000..d9e5bb25 --- /dev/null +++ b/legacyTest/serverMockup/GetCapabilities.xml @@ -0,0 +1,84 @@ + + + + + + admin + 5y9Zcgk2iMChJdQw/yOKEtqsI/0= + Nzg1MDE2OTYz + 2014-12-24T16:20:37.475Z + + + + + + + + http://192.168.68.111/onvif/services + + false + true + false + false + + + false + false + false + false + false + false + + 2 + 40 + + + + 1 + 1 + + + true + false + false + false + false + false + false + false + + + + http://192.168.68.111/onvif/services + false + true + false + + + http://192.168.68.111/onvif/services + + + http://192.168.68.111/onvif/services + + false + true + true + + + + http://192.168.68.111/onvif/services + + + + http://192.168.68.111/onvif/services + 1 + 0 + 1 + 0 + 1 + + + + + + diff --git a/legacyTest/serverMockup/GetCapabilitiesEncoder.xml b/legacyTest/serverMockup/GetCapabilitiesEncoder.xml new file mode 100644 index 00000000..62ad5fa6 --- /dev/null +++ b/legacyTest/serverMockup/GetCapabilitiesEncoder.xml @@ -0,0 +1,114 @@ + + + + http://www.onvif.org/ver10/device/wsdl/GetCapabilities + + + + + + http://192.168.30.65/onvif/device_service + + true + true + true + true + + false + + + + true + true + false + false + true + false + + 0 + 02 + + + 2 + 00 + + + 2 + 01 + + + 2 + 02 + + + false + false + false + false + + + + 8 + 8 + + + true + true + true + false + true + false + false + false + + true + + false + 0 + false + + + + + + http://192.168.30.65/onvif/event_service + true + true + false + 10 + 10 + false + + + http://192.168.30.65/onvif/device_service + + + http://192.168.30.65/onvif/device_service + + true + true + true + + + + 16 + + + + + http://192.168.30.65/onvif/device_service + + + + http://192.168.30.65/onvif/deviceio_service + 8 + 0 + 8 + 8 + 8 + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetConfigurationOptions.xml b/legacyTest/serverMockup/GetConfigurationOptions.xml new file mode 100644 index 00000000..b2f2a166 --- /dev/null +++ b/legacyTest/serverMockup/GetConfigurationOptions.xml @@ -0,0 +1,92 @@ + + + + + admin + Bl/n3Hmj73QjGWbInr028/pfUYU= + NjQ4NzcyMTc3Mw== + 2015-01-26T15:48:06.803Z + + + + + + + + + http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace + + 0 + 1 + + + 0 + 1 + + + + http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace + + 0 + 1 + + + + http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace + + -1 + 1 + + + -1 + 1 + + + + http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace + + -1 + 1 + + + + http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace + + -1 + 1 + + + -1 + 1 + + + + http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace + + -1 + 1 + + + + http://www.onvif.org/ver10/tptz/PanTiltSpaces/GenericSpeedSpace + + 0 + 1 + + + + http://www.onvif.org/ver10/tptz/ZoomSpaces/ZoomGenericSpeedSpace + + 0 + 1 + + + + + PT0S + PT10S + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetConfigurations.xml b/legacyTest/serverMockup/GetConfigurations.xml new file mode 100644 index 00000000..ad31b42f --- /dev/null +++ b/legacyTest/serverMockup/GetConfigurations.xml @@ -0,0 +1,32 @@ + + + + + admin + 5ZMIRFIi3NXtduHE4nywG5E0OaQ= + MjEyNDMxMTM4NA== + 2015-01-26T15:48:06.756Z + + + + + + + default + 1 + default + http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace + http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace + http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace + http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace + http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace + http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace + + + + + PT1093754.348S + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetDeviceInformation.xml b/legacyTest/serverMockup/GetDeviceInformation.xml new file mode 100644 index 00000000..349b431e --- /dev/null +++ b/legacyTest/serverMockup/GetDeviceInformation.xml @@ -0,0 +1,22 @@ + + + + + + admin + GBojZCRixHjpO9rnY+SxhdxZ5bc= + NDczOTcxNjIzNw== + 2014-12-24T16:29:56.117Z + + + + + + Mockup Manufacturer + Mockup Model + Mockup_15_14_13 + 00000000 + MOCKUP + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetEventProperties.xml b/legacyTest/serverMockup/GetEventProperties.xml new file mode 100644 index 00000000..3270709d --- /dev/null +++ b/legacyTest/serverMockup/GetEventProperties.xml @@ -0,0 +1,26 @@ + + + + http://www.onvif.org/ver10/events/wsdl/EventPortType/GetEventPropertiesResponse + + + admin + V+TJA2do4w2hMT803q9qrzi+EdQ= + MzU4NzA4NzYwNQ== + 2015-05-12T11:11:14.445Z + + + + + + http://www.onvif.org/onvif/ver10/topics/topicns.xml + http://www.axis.com/2009/event/topics + true + + http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet + http://docs.oasis-open.org/wsn/t-1/TopicExpression/Concrete + http://www.onvif.org/ver10/tev/messageContentFilter/ItemFilter + http://www.onvif.org/onvif/ver10/schema/onvif.xsd + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetHostname.xml b/legacyTest/serverMockup/GetHostname.xml new file mode 100644 index 00000000..8aca551d --- /dev/null +++ b/legacyTest/serverMockup/GetHostname.xml @@ -0,0 +1,20 @@ + + + + + admin + 9fRcdex6HbIR3sOG+x5BNuJjqp4= + OTkzNjEyMjA3Mw== + 2015-07-01T15:37:36.319Z + + + + + + + false + IPNC-RDK + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetNodes.xml b/legacyTest/serverMockup/GetNodes.xml new file mode 100644 index 00000000..4584f659 --- /dev/null +++ b/legacyTest/serverMockup/GetNodes.xml @@ -0,0 +1,100 @@ + + + + + + admin + cCKZ4/YgcxF/M6Tl8A61hg4N90I= + MTM3OTQ1MDk5Mw== + 2015-01-22T16:58:33.140Z + + + + + + + default + + + http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace + + 0 + 1 + + + 0 + 1 + + + + http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace + + 0 + 1 + + + + http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace + + -1 + 1 + + + -1 + 1 + + + + http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace + + -1 + 1 + + + + http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace + + -1 + 1 + + + -1 + 1 + + + + http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace + + -1 + 1 + + + + http://www.onvif.org/ver10/tptz/PanTiltSpaces/GenericSpeedSpace + + 0 + 1 + + + + http://www.onvif.org/ver10/tptz/ZoomSpaces/ZoomGenericSpeedSpace + + 0 + 1 + + + + 360 + true + AUX1 + AUX2 + AUX3 + AUX4 + AUX5 + AUX6 + AUX7 + AUX8 + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetProfiles.xml b/legacyTest/serverMockup/GetProfiles.xml new file mode 100644 index 00000000..6bec6a83 --- /dev/null +++ b/legacyTest/serverMockup/GetProfiles.xml @@ -0,0 +1,71 @@ + + + + + + admin + eqy980Ghbsq3pGRTc/9ogfBa/oA= + NzQ2MTAxMDk3NQ== + 2014-12-24T16:20:37.481Z + + + + + + + main + + vscfg0 + 1 + vidsrc0 + + + + Main stream encoder + 1 + H264 + + 1920 + 1080 + + 8 + + 5 + 1 + 1000 + + + 30 + High + + + + IPv4 + 0.0.0.0 + + 0 + 0 + false + + PT60S + + + default + 1 + default + http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace + http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace + http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace + http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace + http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace + http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace + + + + + PT1093754.348S + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetScopes.xml b/legacyTest/serverMockup/GetScopes.xml new file mode 100644 index 00000000..890f30f3 --- /dev/null +++ b/legacyTest/serverMockup/GetScopes.xml @@ -0,0 +1,49 @@ + + + + + + admin + m9KmXKm11Sr3yst3mL1qgWFnRRI= + MzI0NjgxODk4NA== + 2015-07-01T16:07:13.613Z + + + + + + {{? typeof it.count === 'undefined' || it.count > 0 }} + + Fixed + onvif://www.onvif.org/Profile/Streaming + + {{?}} + {{? typeof it.count === 'undefined' || it.count > 1 }} + + Fixed + onvif://www.onvif.org/type/video_encoder + + + Fixed + onvif://www.onvif.org/type/audio_encoder + + + Fixed + onvif://www.onvif.org/type/ptz + + + Fixed + onvif://www.onvif.org/hardware/HD_PREDATOR + + + Configurable + onvif://www.onvif.org/name/PREDATOR + + + Configurable + onvif://www.onvif.org/location/ + + {{?}} + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetServiceCapabilities.xml b/legacyTest/serverMockup/GetServiceCapabilities.xml new file mode 100644 index 00000000..5b66e8a4 --- /dev/null +++ b/legacyTest/serverMockup/GetServiceCapabilities.xml @@ -0,0 +1,22 @@ + + + + + admin + lQNuXfCNx5a8z0tEMGnj4+HogCg= + NTE4NzM3MjUyOQ== + 2015-01-23T15:58:36.584Z + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetServices.xml b/legacyTest/serverMockup/GetServices.xml new file mode 100644 index 00000000..d24e6db4 --- /dev/null +++ b/legacyTest/serverMockup/GetServices.xml @@ -0,0 +1,65 @@ + + + + + + admin + s1Kq3uO8l/Nwp48xOwRt5TYWqy8= + NTkyOTYxNTEyMw== + 2014-12-24T16:29:17.999Z + + + + + + + http://www.onvif.org/ver10/device/wsdl + http://192.168.68.111/onvif/services + + 2 + 42 + + + + http://www.onvif.org/ver10/media/wsdl + http://192.168.68.111/onvif/services + + 2 + 41 + + + + http://www.onvif.org/ver10/events/wsdl + http://192.168.68.111/onvif/services + + 2 + 40 + + + + http://www.onvif.org/ver10/deviceIO/wsdl + http://192.168.68.111/onvif/services + + 2 + 20 + + + + http://www.onvif.org/ver20/ptz/wsdl + http://192.168.68.111/onvif/services + + 2 + 41 + + + + http://www.onvif.org/ver20/imaging/wsdl + http://192.168.68.111/onvif/services + + 2 + 30 + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetSnapshotUri.xml b/legacyTest/serverMockup/GetSnapshotUri.xml new file mode 100644 index 00000000..4a1050cb --- /dev/null +++ b/legacyTest/serverMockup/GetSnapshotUri.xml @@ -0,0 +1,23 @@ + + + + + + admin + Eikg93ADHyNiflt5IOkjpIDbEB8= + NTE3MDA5ODgzMg== + 2014-12-25T16:28:49.646Z + + + + + + + http://192.168.68.111/onvif-cgi/jpg/image.cgi?resolution=800x600&compression=20&camera=1 + false + false + PT0S + + + + diff --git a/legacyTest/serverMockup/GetStatus.xml b/legacyTest/serverMockup/GetStatus.xml new file mode 100644 index 00000000..c6df71a9 --- /dev/null +++ b/legacyTest/serverMockup/GetStatus.xml @@ -0,0 +1,28 @@ + + + + + + admin + 9SFMJiCu7tu//j6QANeCKLxNBZg= + NjUyNDc5MzMwMQ== + 2014-12-29T17:14:45.863Z + + + + + + + + + + + + IDLE + IDLE + + 2014-12-29T20:01:31Z + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetStreamUri.xml b/legacyTest/serverMockup/GetStreamUri.xml new file mode 100644 index 00000000..7ad1d50f --- /dev/null +++ b/legacyTest/serverMockup/GetStreamUri.xml @@ -0,0 +1,23 @@ + + + + + + admin + Eikg93ADHyNiflt5IOkjpIDbEB8= + NTE3MDA5ODgzMg== + 2014-12-25T16:28:49.646Z + + + + + + + rtsp://192.168.68.111/h264main + false + false + PT0S + + + + diff --git a/legacyTest/serverMockup/GetSystemDateAndTime.xml b/legacyTest/serverMockup/GetSystemDateAndTime.xml new file mode 100644 index 00000000..03c80c48 --- /dev/null +++ b/legacyTest/serverMockup/GetSystemDateAndTime.xml @@ -0,0 +1,26 @@ + + + + + + Manual + true + + MoroccoStandardTime0 + + + + 19 + 14 + 37 + + + 2014 + 12 + 24 + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetVideoSourceConfigurations.xml b/legacyTest/serverMockup/GetVideoSourceConfigurations.xml new file mode 100644 index 00000000..285adc93 --- /dev/null +++ b/legacyTest/serverMockup/GetVideoSourceConfigurations.xml @@ -0,0 +1,23 @@ + + + + + + admin + 3bTNQfZQ8CmlZXUUgPW9DV8+AXc= + MTMyNjk0MzY0MQ== + 2015-08-06T10:43:54.174Z + + + + + + + vscfg0 + 3 + vidsrc0 + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/GetVideoSourcesEncoder.xml b/legacyTest/serverMockup/GetVideoSourcesEncoder.xml new file mode 100644 index 00000000..01254558 --- /dev/null +++ b/legacyTest/serverMockup/GetVideoSourcesEncoder.xml @@ -0,0 +1,66 @@ + + + + http://www.onvif.org/ver10/media/wsdlGetVideoSources/ + + + + + 30.0 + + 720 + 480 + + + + 30.0 + + 720 + 480 + + + + 30.0 + + 720 + 480 + + + + 30.0 + + 720 + 480 + + + + 30.0 + + 720 + 480 + + + + 30.0 + + 720 + 480 + + + + 30.0 + + 720 + 480 + + + + 30.0 + + 720 + 480 + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/Probe.xml b/legacyTest/serverMockup/Probe.xml new file mode 100644 index 00000000..06a0f8da --- /dev/null +++ b/legacyTest/serverMockup/Probe.xml @@ -0,0 +1,26 @@ + + + + urn:uuid:01234567-dead-beef-baad-abcdeffedcba + RELATES_TO + + http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous + + http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous + http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches + + + + + + + uuid:c9790c3a-701b-464d-a189-0060351c8ada + + dn:NetworkVideoTransmitter tds:Device + onvif://www.onvif.org/Profile/Streaming onvif://www.onvif.org/type/video_encoder onvif://www.onvif.org/type/audio_encoder onvif://www.onvif.org/type/ptz onvif://www.onvif.org/hardware/HD_PREDATOR onvif://www.onvif.org/name/PREDATOR onvif://www.onvif.org/location/ + SERVICE_URI + 1 + + + + diff --git a/legacyTest/serverMockup/PullMessages.xml b/legacyTest/serverMockup/PullMessages.xml new file mode 100644 index 00000000..c8886422 --- /dev/null +++ b/legacyTest/serverMockup/PullMessages.xml @@ -0,0 +1,64 @@ + + + + http://www.onvif.org/ver10/events/wsdl/PullPointSubscription/PullMessagesResponse + + + admin + 9RVShfxUBaE3UOn1C+tTp/vv/BE= + MjkwMDQzMzQ5OQ== + 2015-05-14T13:57:50.230Z + + + + + + 2000-01-03T03:58:33Z + 2000-01-03T04:04:02Z + {{? Math.random() < 0.5 }} + + + http://{{=it.hostname}}:{{=it.port}}{{=it.pullPointUrl}} + + + tns1:RuleEngine/CellMotionDetector/Motion + + + + + + + + + + + + + + + {{?}} + {{? Math.random() < 0.5 }} + + + http://{{=it.hostname}}:{{=it.port}}{{=it.pullPointUrl}} + + + tns1:RuleEngine/CellMotionDetector/Motion + + + + + + + + + + + + + + + {{?}} + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/SetScopes.xml b/legacyTest/serverMockup/SetScopes.xml new file mode 100644 index 00000000..3b7c1fe4 --- /dev/null +++ b/legacyTest/serverMockup/SetScopes.xml @@ -0,0 +1,16 @@ + + + + + + admin + 1M5k9hY0YuiwW8DtkPpJb9WwP8o= + MTE1NzM1MTE0OA== + 2015-07-03T15:03:18.933Z + + + + + {{? it.bad }}wrong response{{?}} + + \ No newline at end of file diff --git a/legacyTest/serverMockup/SetSystemDateAndTime.xml b/legacyTest/serverMockup/SetSystemDateAndTime.xml new file mode 100644 index 00000000..700b3dbd --- /dev/null +++ b/legacyTest/serverMockup/SetSystemDateAndTime.xml @@ -0,0 +1,16 @@ + + + + + + admin + 1M5k9hY0YuiwW8DtkPpJb9WwP8o= + MTE1NzM1MTE0OA== + 2015-07-03T15:03:18.933Z + + + + + {{? it.bad }}wrong response{{?}} + + \ No newline at end of file diff --git a/legacyTest/serverMockup/SystemReboot.xml b/legacyTest/serverMockup/SystemReboot.xml new file mode 100644 index 00000000..54dfb4f5 --- /dev/null +++ b/legacyTest/serverMockup/SystemReboot.xml @@ -0,0 +1,18 @@ + + + + + + admin + OJXO23NJNMJjVh4FKwU1lA7JxvA= + MzkxNjk5NDI2Mg== + 2015-04-20T08:42:46.633Z + + + + + + Reboot in 30 secs + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/Unsubscribe.xml b/legacyTest/serverMockup/Unsubscribe.xml new file mode 100644 index 00000000..e33c3f70 --- /dev/null +++ b/legacyTest/serverMockup/Unsubscribe.xml @@ -0,0 +1,14 @@ + + + + + http://docs.oasis-open.org/wsn/bw-2/SubscriptionManager/UnsubscribeResponse + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/device.CreateUsers.xml b/legacyTest/serverMockup/device.CreateUsers.xml new file mode 100644 index 00000000..07ebe09d --- /dev/null +++ b/legacyTest/serverMockup/device.CreateUsers.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/legacyTest/serverMockup/device.DeleteUsers.xml b/legacyTest/serverMockup/device.DeleteUsers.xml new file mode 100644 index 00000000..2106454f --- /dev/null +++ b/legacyTest/serverMockup/device.DeleteUsers.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/legacyTest/serverMockup/device.GetDNS.xml b/legacyTest/serverMockup/device.GetDNS.xml new file mode 100644 index 00000000..6a57ac46 --- /dev/null +++ b/legacyTest/serverMockup/device.GetDNS.xml @@ -0,0 +1,18 @@ + + + + + + false + + IPv4 + 4.4.4.4 + + + IPv4 + 8.8.8.8 + + + + + diff --git a/legacyTest/serverMockup/device.GetNTP.xml b/legacyTest/serverMockup/device.GetNTP.xml new file mode 100644 index 00000000..268206cb --- /dev/null +++ b/legacyTest/serverMockup/device.GetNTP.xml @@ -0,0 +1,24 @@ + + + + + + admin + M7QDTL5YN3nDRkR9k1JCgBZEHuE= + MzM3NjAyNTA0OA== + 2015-08-04T16:54:03.521Z + + + + + + + false + + IPv4 + 192.168.1.168 + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/device.GetNetworkDefaultGateway.xml b/legacyTest/serverMockup/device.GetNetworkDefaultGateway.xml new file mode 100644 index 00000000..7cea9326 --- /dev/null +++ b/legacyTest/serverMockup/device.GetNetworkDefaultGateway.xml @@ -0,0 +1,11 @@ + + + + + + 192.168.0.1 + + + + + diff --git a/legacyTest/serverMockup/device.GetNetworkInterfaces.xml b/legacyTest/serverMockup/device.GetNetworkInterfaces.xml new file mode 100644 index 00000000..05cabf47 --- /dev/null +++ b/legacyTest/serverMockup/device.GetNetworkInterfaces.xml @@ -0,0 +1,53 @@ + + + + + + true + + eth0 + 28:57:be:65:7d:d5 + 1500 + + + + true + 100 + Full + + + true + 100 + Full + + 0 + + + true + + + 192.168.68.111 + 24 + + false + + + + true + + false + Off + + fe80::2a57:beff:fe65:7dd5 + 64 + + + fe80::2a57:beff:fe65:7dd5 + 64 + + + + + + + diff --git a/legacyTest/serverMockup/device.GetUsers.xml b/legacyTest/serverMockup/device.GetUsers.xml new file mode 100644 index 00000000..c89c4abc --- /dev/null +++ b/legacyTest/serverMockup/device.GetUsers.xml @@ -0,0 +1,17 @@ + + + + + + admin + admin + Administrator + + + operator + operator + Operator + + + + diff --git a/legacyTest/serverMockup/device.GetZeroConfiguration.xml b/legacyTest/serverMockup/device.GetZeroConfiguration.xml new file mode 100644 index 00000000..3bdd2c84 --- /dev/null +++ b/legacyTest/serverMockup/device.GetZeroConfiguration.xml @@ -0,0 +1,12 @@ + + + + + + eth0 + true + 192.168.1.11 + + + + diff --git a/legacyTest/serverMockup/device.SetDNS.xml b/legacyTest/serverMockup/device.SetDNS.xml new file mode 100644 index 00000000..1023b3e0 --- /dev/null +++ b/legacyTest/serverMockup/device.SetDNS.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/legacyTest/serverMockup/device.SetNTP.xml b/legacyTest/serverMockup/device.SetNTP.xml new file mode 100644 index 00000000..c6fd861a --- /dev/null +++ b/legacyTest/serverMockup/device.SetNTP.xml @@ -0,0 +1,16 @@ + + + + + + admin + eliaXbApIqQG28nylVqMTueOX8Y= + NzU4NzU0MTg1 + 2015-08-04T17:09:51.038Z + + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/device.SetNetworkDefaultGateway.xml b/legacyTest/serverMockup/device.SetNetworkDefaultGateway.xml new file mode 100644 index 00000000..07ebfa58 --- /dev/null +++ b/legacyTest/serverMockup/device.SetNetworkDefaultGateway.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/legacyTest/serverMockup/device.SetNetworkInterfaces.xml b/legacyTest/serverMockup/device.SetNetworkInterfaces.xml new file mode 100644 index 00000000..fe23684e --- /dev/null +++ b/legacyTest/serverMockup/device.SetNetworkInterfaces.xml @@ -0,0 +1,8 @@ + + + + + false + + + diff --git a/legacyTest/serverMockup/device.SetSystemFactoryDefault.xml b/legacyTest/serverMockup/device.SetSystemFactoryDefault.xml new file mode 100644 index 00000000..73ee4738 --- /dev/null +++ b/legacyTest/serverMockup/device.SetSystemFactoryDefault.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/device.SetUser.xml b/legacyTest/serverMockup/device.SetUser.xml new file mode 100644 index 00000000..25c03b71 --- /dev/null +++ b/legacyTest/serverMockup/device.SetUser.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/legacyTest/serverMockup/events.CreatePullPointSubscription.xml b/legacyTest/serverMockup/events.CreatePullPointSubscription.xml new file mode 100644 index 00000000..f612103a --- /dev/null +++ b/legacyTest/serverMockup/events.CreatePullPointSubscription.xml @@ -0,0 +1,23 @@ + + + + http://www.onvif.org/ver10/events/wsdl/EventPortType/CreatePullPointSubscriptionResponse + + + admin + uhZZ9pEUN6+bX5EO5FlWleaGa/c= + MTA2Nzc5ODk2Nw== + {{=new Date().toISOString()}} + + + + + + + http://{{=it.hostname}}:{{=it.port}}{{=it.pullPointUrl}} + + {{=new Date().toISOString()}} + {{=new Date(Date.now()+5000).toISOString()}} + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/events.GetServiceCapabilities.xml b/legacyTest/serverMockup/events.GetServiceCapabilities.xml new file mode 100644 index 00000000..37c536f3 --- /dev/null +++ b/legacyTest/serverMockup/events.GetServiceCapabilities.xml @@ -0,0 +1,18 @@ + + + + + + admin + p6x7GogVRoUOVKahZouY/SvnRzw= + MTUzNzQxOTQyMw== + 2015-05-12T11:53:08.504Z + + + + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/imaging.GetCurrentPreset.xml b/legacyTest/serverMockup/imaging.GetCurrentPreset.xml new file mode 100644 index 00000000..21a2092b --- /dev/null +++ b/legacyTest/serverMockup/imaging.GetCurrentPreset.xml @@ -0,0 +1,22 @@ + + + + + + admin + OBkjVbgwzj0Kni6PMEirnxd4amA= + MzE4OTc3MDQyNA== + 2015-06-22T16:20:49.011Z + + + + + + + main + 128 + main + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/imaging.GetImagingSettings.xml b/legacyTest/serverMockup/imaging.GetImagingSettings.xml new file mode 100644 index 00000000..55f6689f --- /dev/null +++ b/legacyTest/serverMockup/imaging.GetImagingSettings.xml @@ -0,0 +1,26 @@ + + + + + + admin + OBkjVbgwzj0Kni6PMEirnxd4amA= + MzE4OTc3MDQyNA== + 2015-06-22T16:20:49.011Z + + + + + + + 255 + 128 + 128 + + AUTO + + 128 + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/imaging.GetOptions.xml b/legacyTest/serverMockup/imaging.GetOptions.xml new file mode 100644 index 00000000..db32853c --- /dev/null +++ b/legacyTest/serverMockup/imaging.GetOptions.xml @@ -0,0 +1,21 @@ + + + + + + + 0.00 + 255.00 + + + 0.00 + 255.00 + + + 0.00 + 255.00 + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/imaging.GetServiceCapabilities.xml b/legacyTest/serverMockup/imaging.GetServiceCapabilities.xml new file mode 100644 index 00000000..03400673 --- /dev/null +++ b/legacyTest/serverMockup/imaging.GetServiceCapabilities.xml @@ -0,0 +1,18 @@ + + + + + + admin + mJuD/BXtwboUOWdoTTUFcWxTNyo= + IywteLw60U/ozdLnYLo88A== + 2001-04-13T12:26:15.299Z + + + + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/imaging.SetCurrentPreset.xml b/legacyTest/serverMockup/imaging.SetCurrentPreset.xml new file mode 100644 index 00000000..ecbb08d1 --- /dev/null +++ b/legacyTest/serverMockup/imaging.SetCurrentPreset.xml @@ -0,0 +1,16 @@ + + + + + + admin + XxKbln8Ajn9tM4/ikobaunLC1qc= + NjYxNTE4MTk1OQ== + 2014-12-27T21:40:40.411Z + + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/imaging.SetImagingSettings.xml b/legacyTest/serverMockup/imaging.SetImagingSettings.xml new file mode 100644 index 00000000..8ac56905 --- /dev/null +++ b/legacyTest/serverMockup/imaging.SetImagingSettings.xml @@ -0,0 +1,15 @@ + + + + + admin + DdWN7GrVjzzLZUz2+mkzex7ZlKU= + OTI2NjA2MTExNQ== + 2015-06-23T08:58:29.799Z + + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.AddAudioEncoderConfiguration.xml b/legacyTest/serverMockup/media.AddAudioEncoderConfiguration.xml new file mode 100644 index 00000000..4d8641d5 --- /dev/null +++ b/legacyTest/serverMockup/media.AddAudioEncoderConfiguration.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/legacyTest/serverMockup/media.AddAudioSourceConfiguration.xml b/legacyTest/serverMockup/media.AddAudioSourceConfiguration.xml new file mode 100644 index 00000000..13be1dfd --- /dev/null +++ b/legacyTest/serverMockup/media.AddAudioSourceConfiguration.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/legacyTest/serverMockup/media.AddVideoEncoderConfiguration.xml b/legacyTest/serverMockup/media.AddVideoEncoderConfiguration.xml new file mode 100644 index 00000000..5a5b8c26 --- /dev/null +++ b/legacyTest/serverMockup/media.AddVideoEncoderConfiguration.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/legacyTest/serverMockup/media.AddVideoSourceConfiguration.xml b/legacyTest/serverMockup/media.AddVideoSourceConfiguration.xml new file mode 100644 index 00000000..43321853 --- /dev/null +++ b/legacyTest/serverMockup/media.AddVideoSourceConfiguration.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/legacyTest/serverMockup/media.CreateProfile.xml b/legacyTest/serverMockup/media.CreateProfile.xml new file mode 100644 index 00000000..e4a2e923 --- /dev/null +++ b/legacyTest/serverMockup/media.CreateProfile.xml @@ -0,0 +1,19 @@ + + + + + admin + fwb2EHRVv8DFlh4A9jLmSH+7VRs= + MjEzNjQzMTMyNQ== + 2015-08-05T15:53:42.463Z + + + + + + + test + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.DeleteProfile.xml b/legacyTest/serverMockup/media.DeleteProfile.xml new file mode 100644 index 00000000..247b9056 --- /dev/null +++ b/legacyTest/serverMockup/media.DeleteProfile.xml @@ -0,0 +1,16 @@ + + + + + + admin + oUjGCqgRooHjESdtadh4ya22N6w= + NjkzMzkyMDgzMw== + 2015-08-05T15:59:14.099Z + + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.GetAudioEncoderConfiguration.xml b/legacyTest/serverMockup/media.GetAudioEncoderConfiguration.xml new file mode 100644 index 00000000..dc94f263 --- /dev/null +++ b/legacyTest/serverMockup/media.GetAudioEncoderConfiguration.xml @@ -0,0 +1,32 @@ + + + + + + admin + xOw2NVPDVsnxRk5sz3ET1qvrlTM= + MzQzOTU0MzYwNg== + 2015-08-07T12:29:20.309Z + + + + + + + Main stream encoder + 2 + G711 + + + IPv4 + 0.0.0.0 + + 0 + 0 + false + + PT60S + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.GetAudioEncoderConfigurationOptions.xml b/legacyTest/serverMockup/media.GetAudioEncoderConfigurationOptions.xml new file mode 100644 index 00000000..5988bcef --- /dev/null +++ b/legacyTest/serverMockup/media.GetAudioEncoderConfigurationOptions.xml @@ -0,0 +1,32 @@ + + + + + + admin + BxkG1geIeWjMviA+YKXixp8Y65E= + oOTVCIjclqetvCsrxDzFAw== + 2001-04-13T10:18:34.295Z + + + + + + + + G711 + + + 5 + 10 + 15 + + + 5 + 10 + 15 + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.GetAudioEncoderConfigurations.xml b/legacyTest/serverMockup/media.GetAudioEncoderConfigurations.xml new file mode 100644 index 00000000..328d61f6 --- /dev/null +++ b/legacyTest/serverMockup/media.GetAudioEncoderConfigurations.xml @@ -0,0 +1,32 @@ + + + + + + admin + xOw2NVPDVsnxRk5sz3ET1qvrlTM= + MzQzOTU0MzYwNg== + 2015-08-07T12:29:20.309Z + + + + + + + Main stream encoder + 2 + G711 + + + IPv4 + 0.0.0.0 + + 0 + 0 + false + + PT60S + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.GetAudioSources.xml b/legacyTest/serverMockup/media.GetAudioSources.xml new file mode 100644 index 00000000..f6c9a0ab --- /dev/null +++ b/legacyTest/serverMockup/media.GetAudioSources.xml @@ -0,0 +1,19 @@ + + + + + + admin + zrbiJA5e0IkzAeYHk/HAlTgBs9Q= + NDU3MTE0NzM1OQ== + 2014-12-24T16:07:17.112Z + + + + + + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.GetOSDOptions b/legacyTest/serverMockup/media.GetOSDOptions new file mode 100644 index 00000000..c89795fc --- /dev/null +++ b/legacyTest/serverMockup/media.GetOSDOptions @@ -0,0 +1,48 @@ + + + + + + Text + UpperLeft + LowerLeft + Custom + + Plain + Date + Time + DateAndTime + + 16 + 64 + + MM/dd/yyyy + dd/MM/yyyy + yyyy/MM/dd + yyyy-MM-dd + hh:mm:ss tt + HH:mm:ss + + + + + 0.000000 + 255.000000 + + + 0.000000 + 255.000000 + + + 0.000000 + 255.000000 + + http://www.onvif.org/ver10/colorspace/YCbCr + + + + + + + + diff --git a/legacyTest/serverMockup/media.GetServiceCapabilities.xml b/legacyTest/serverMockup/media.GetServiceCapabilities.xml new file mode 100644 index 00000000..c7d5a269 --- /dev/null +++ b/legacyTest/serverMockup/media.GetServiceCapabilities.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/legacyTest/serverMockup/media.GetVideoEncoderConfiguration.xml b/legacyTest/serverMockup/media.GetVideoEncoderConfiguration.xml new file mode 100644 index 00000000..c8b62398 --- /dev/null +++ b/legacyTest/serverMockup/media.GetVideoEncoderConfiguration.xml @@ -0,0 +1,46 @@ + + + + + + admin + 1U9c951ZK6lHR74Fa8QYv8AKExQ= + MTcxMzIzNDk1NQ== + 2015-08-27T15:03:50.606Z + + + + + + + Main stream encoder + 2 + H264 + + 1920 + 1080 + + 6 + + 5 + 1 + 512 + + + 30 + High + + + + IPv4 + 0.0.0.0 + + 0 + 0 + false + + PT60S + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.GetVideoEncoderConfigurationOptions.xml b/legacyTest/serverMockup/media.GetVideoEncoderConfigurationOptions.xml new file mode 100644 index 00000000..0712ae89 --- /dev/null +++ b/legacyTest/serverMockup/media.GetVideoEncoderConfigurationOptions.xml @@ -0,0 +1,87 @@ + + + + + + admin + BxkG1geIeWjMviA+YKXixp8Y65E= + oOTVCIjclqetvCsrxDzFAw== + 2001-04-13T10:18:34.295Z + + + + + + + + 1 + 100 + + + + 5 + 25 + + + 1 + 1 + + + + + 1920 + 1080 + + + 1280 + 720 + + + 720 + 576 + + + 1 + 25 + + + 5 + 25 + + + 1 + 1 + + SP + + + + 1920 + 1080 + + + 1280 + 720 + + + 720 + 576 + + + 1 + 25 + + + 5 + 25 + + + 1 + 1 + + High + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.GetVideoEncoderConfigurations.xml b/legacyTest/serverMockup/media.GetVideoEncoderConfigurations.xml new file mode 100644 index 00000000..03489086 --- /dev/null +++ b/legacyTest/serverMockup/media.GetVideoEncoderConfigurations.xml @@ -0,0 +1,46 @@ + + + + + + admin + xOw2NVPDVsnxRk5sz3ET1qvrlTM= + MzQzOTU0MzYwNg== + 2015-08-07T12:29:20.309Z + + + + + + + Main stream encoder + 2 + H264 + + 1920 + 1080 + + 6 + + 5 + 1 + 512 + + + 30 + High + + + + IPv4 + 0.0.0.0 + + 0 + 0 + false + + PT60S + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.GetVideoSources.xml b/legacyTest/serverMockup/media.GetVideoSources.xml new file mode 100644 index 00000000..da6e5045 --- /dev/null +++ b/legacyTest/serverMockup/media.GetVideoSources.xml @@ -0,0 +1,24 @@ + + + + + + admin + zrbiJA5e0IkzAeYHk/HAlTgBs9Q= + NDU3MTE0NzM1OQ== + 2014-12-24T16:07:17.112Z + + + + + + + 30 + + 1920 + 1080 + + + + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.RemoveAudioEncoderConfiguration.xml b/legacyTest/serverMockup/media.RemoveAudioEncoderConfiguration.xml new file mode 100644 index 00000000..ea6bd1aa --- /dev/null +++ b/legacyTest/serverMockup/media.RemoveAudioEncoderConfiguration.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/legacyTest/serverMockup/media.RemoveAudioSourceConfiguration.xml b/legacyTest/serverMockup/media.RemoveAudioSourceConfiguration.xml new file mode 100644 index 00000000..cfd76a3d --- /dev/null +++ b/legacyTest/serverMockup/media.RemoveAudioSourceConfiguration.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/legacyTest/serverMockup/media.SetAudioEncoderConfiguration.xml b/legacyTest/serverMockup/media.SetAudioEncoderConfiguration.xml new file mode 100644 index 00000000..2ad5aa72 --- /dev/null +++ b/legacyTest/serverMockup/media.SetAudioEncoderConfiguration.xml @@ -0,0 +1,16 @@ + + + + + + admin + BxkG1geIeWjMviA+YKXixp8Y65E= + oOTVCIjclqetvCsrxDzFAw== + 2001-04-13T10:18:34.295Z + + + + + {{? it.bad }}some fault message{{?}} + + \ No newline at end of file diff --git a/legacyTest/serverMockup/media.SetVideoEncoderConfiguration.xml b/legacyTest/serverMockup/media.SetVideoEncoderConfiguration.xml new file mode 100644 index 00000000..da90b16b --- /dev/null +++ b/legacyTest/serverMockup/media.SetVideoEncoderConfiguration.xml @@ -0,0 +1,16 @@ + + + + + + admin + UaaqR5iscFlr/ICXaE5oVcU2u34= + OTY5MDQ3ODExNA== + 2015-08-27T14:34:26.217Z + + + + + {{? it.bad }}some fault message{{?}} + + \ No newline at end of file diff --git a/legacyTest/serverMockup/ptz.AbsoluteMove.xml b/legacyTest/serverMockup/ptz.AbsoluteMove.xml new file mode 100644 index 00000000..de529984 --- /dev/null +++ b/legacyTest/serverMockup/ptz.AbsoluteMove.xml @@ -0,0 +1,16 @@ + + + + + + admin + XxKbln8Ajn9tM4/ikobaunLC1qc= + NjYxNTE4MTk1OQ== + 2014-12-27T21:40:40.411Z + + + + + + + diff --git a/legacyTest/serverMockup/ptz.ContinuousMove.xml b/legacyTest/serverMockup/ptz.ContinuousMove.xml new file mode 100644 index 00000000..4bf86071 --- /dev/null +++ b/legacyTest/serverMockup/ptz.ContinuousMove.xml @@ -0,0 +1,16 @@ + + + + + + admin + QeEteGr3bq/6wSzWasI9aoaXoAM= + MzgzNzU1MDQwMg== + 2015-03-13T16:19:51.840Z + + + + + + + diff --git a/legacyTest/serverMockup/ptz.GetPresets.xml b/legacyTest/serverMockup/ptz.GetPresets.xml new file mode 100644 index 00000000..b84f9a26 --- /dev/null +++ b/legacyTest/serverMockup/ptz.GetPresets.xml @@ -0,0 +1,154 @@ + + + + + + admin + o2/fd8sFdCFcqisToY0/WKiQiPM= + NTQzOTU2NDk4MA== + 2014-12-25T16:38:59.919Z + + + + + + + P001 + + {{? !it.one }} + + P002 + + + P003 + + + P004 + + + P005 + + + P006 + + + P007 + + + P008 + + + P009 + + + P010 + + + P011 + + + P012 + + + P013 + + + P014 + + + P015 + + + P016 + + + P017 + + + P018 + + + P019 + + + P020 + + + DarkAutoIROn + + + DarkAutoWhiteOn + + + DarkAutoLightsOff + + + DarkAutoMono + + + DarkAutoColour + + + DarkAutoFocusWhite + + + DarkAutoFocusIR + + + DoubleWipe + + + PermanentIntermittentWipe + + + PermanentFastWipe + + + TimedIntermittentWipe + + + TimedFastWipe + + + WipeOff + + + DeFogOn + + + DeFogOff + + + WasherOn + + + WasherOff + + + ForceWhiteLightsOn + + + ForceWhiteLightsOff + + + WhiteLightsOn + + + WhiteLightsOff + + + WhiteExclusionLeft + + + WhiteExclusionRight + + + WasherPosition + + + Home + + {{?}} + + + diff --git a/legacyTest/serverMockup/ptz.GotoHomePosition.xml b/legacyTest/serverMockup/ptz.GotoHomePosition.xml new file mode 100644 index 00000000..d35a4ae7 --- /dev/null +++ b/legacyTest/serverMockup/ptz.GotoHomePosition.xml @@ -0,0 +1,16 @@ + + + + + + admin + o2/fd8sFdCFcqisToY0/WKiQiPM= + NTQzOTU2NDk4MA== + 2014-12-25T16:38:59.919Z + + + + + + + diff --git a/legacyTest/serverMockup/ptz.GotoPreset.xml b/legacyTest/serverMockup/ptz.GotoPreset.xml new file mode 100644 index 00000000..319ff3de --- /dev/null +++ b/legacyTest/serverMockup/ptz.GotoPreset.xml @@ -0,0 +1,16 @@ + + + + + + admin + 8ApJBB1EUR6Y0StFdI54WET3d+M= + OTI1ODE3Mjk1 + 2015-03-12T15:09:17.588Z + + + + + + + diff --git a/legacyTest/serverMockup/ptz.RelativeMove.xml b/legacyTest/serverMockup/ptz.RelativeMove.xml new file mode 100644 index 00000000..f61e0db2 --- /dev/null +++ b/legacyTest/serverMockup/ptz.RelativeMove.xml @@ -0,0 +1,16 @@ + + + + + + admin + H2rv5RwZ1aV2yysb2y+hURWTNHc= + Mjk1NzUyMjc0Mg== + 2014-12-29T17:02:56.157Z + + + + + + + diff --git a/legacyTest/serverMockup/ptz.RemovePreset.xml b/legacyTest/serverMockup/ptz.RemovePreset.xml new file mode 100644 index 00000000..110dfcca --- /dev/null +++ b/legacyTest/serverMockup/ptz.RemovePreset.xml @@ -0,0 +1,16 @@ + + + + + + admin + o2/fd8sFdCFcqisToY0/WKiQiPM= + NTQzOTU2NDk4MA== + 2014-12-25T16:38:59.919Z + + + + + + + diff --git a/legacyTest/serverMockup/ptz.SetHomePosition.xml b/legacyTest/serverMockup/ptz.SetHomePosition.xml new file mode 100644 index 00000000..c3f0278b --- /dev/null +++ b/legacyTest/serverMockup/ptz.SetHomePosition.xml @@ -0,0 +1,16 @@ + + + + + + admin + o2/fd8sFdCFcqisToY0/WKiQiPM= + NTQzOTU2NDk4MA== + 2014-12-25T16:38:59.919Z + + + + + + + diff --git a/legacyTest/serverMockup/ptz.SetPreset.xml b/legacyTest/serverMockup/ptz.SetPreset.xml new file mode 100644 index 00000000..ad5f4844 --- /dev/null +++ b/legacyTest/serverMockup/ptz.SetPreset.xml @@ -0,0 +1,18 @@ + + + + + + admin + o2/fd8sFdCFcqisToY0/WKiQiPM= + NTQzOTU2NDk4MA== + 2014-12-25T16:38:59.919Z + + + + + + 20 + + + diff --git a/legacyTest/serverMockup/ptz.Stop.xml b/legacyTest/serverMockup/ptz.Stop.xml new file mode 100644 index 00000000..d8026f1f --- /dev/null +++ b/legacyTest/serverMockup/ptz.Stop.xml @@ -0,0 +1,16 @@ + + + + + + admin + rRa+j6yJG8so1WZA+tiKaryNmlc= + ODYzMzc5OTY4MQ== + 2015-03-13T08:57:27.653Z + + + + + + + diff --git a/lib/utils.js b/lib/utils.js index 65a1a255..2022a45c 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -18,7 +18,7 @@ const xml2js = require('xml2js') * @param {object} xml * @returns {object} */ -let linerase = function(xml) { +const linerase = function(xml) { if (Array.isArray(xml)) { if (xml.length > 1) { return xml.map(linerase); @@ -123,15 +123,6 @@ const guid = function() { return (`${s4() + s4() }-${ s4() }-${ s4() }-${ s4() }-${ s4() }${s4() }${s4()}`); }; -const _linerase = linerase; -linerase = (xml) => { - const result = _linerase(xml); - console.log('---------------------------------------------------------------------------------------------'); - console.dir(xml) - console.dir(result); - return result; -} - module.exports = { linerase , parseSOAPString diff --git a/package.json b/package.json index d9b58168..fd02962c 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "description": "Client to ONVIF NVT devices Profile S: cameras", "main": "lib/onvif.js", "scripts": { - "build": "tsc --build tsconfig.json", + "build": "tsc --build", + "watch": "tsc --build --watch", "typedoc": "typedoc src", "jsdoc": "jsdoc ./lib/*.js --readme ./README.md --destination ./docs", "gh-pages": "jsdoc ./lib/*.js --readme ./README.md --destination ./", diff --git a/src/legacy/cam.ts b/src/legacy/cam.ts new file mode 100644 index 00000000..a3a3b0c0 --- /dev/null +++ b/src/legacy/cam.ts @@ -0,0 +1,60 @@ +/** + * Module to provide backward compatibility with versions 0.x + */ + +import { EventEmitter } from 'events'; +import { Onvif, OnvifRequestOptions } from '../onvif'; + +type Callback = (error: any, result?: any) => void; + +export class Cam extends EventEmitter { + private onvif: Onvif; + constructor(options: any, callback: Callback) { + super(); + this.onvif = new Onvif({ + ...options, + autoConnect : callback !== undefined ? false : options.autoconnect, + }); + if (callback) { + this.onvif.connect().then((result) => callback(null, result)).catch(callback); + } + } + + get port() { + return this.onvif.port; + } + + get path() { + return this.onvif.path; + } + + set hostname(name: string) { + this.onvif.hostname = name; + } + + set timeout(time: number) { + this.onvif.timeout = time; + } + + get timeout() { + return this.onvif.timeout; + } + + connect(callback: Callback) { + this.onvif.connect().then((result) => callback(null, result)).catch(callback); + } + + _request(options: OnvifRequestOptions, callback: Callback) { + console.log('what?'); + if (typeof callback !== 'function') { + throw new Error('`callback` must be a function'); + } + this.onvif.request(options).then((result) => { + console.log(result); + callback(null, result); + }).catch((error) => { + console.error(error); + callback(error); + }); + } +} diff --git a/tsconfig.json b/tsconfig.json index 80dedfc7..f5496e7c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,13 +13,12 @@ "noUnusedParameters": true, "skipLibCheck": true, "watch": true, - "declaration": true + "declaration": true, }, "exclude": [ "node_modules" ], "include": [ - "src/index.ts", - "src/test.ts" + "src/**/*" ] } From ff5809ba87d3a0246a2c405f36b6db9b5fda202e Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 9 Oct 2022 23:12:26 +0300 Subject: [PATCH 055/112] add `setSystemDateAndTime` method, reworked tests --- legacyTest/common.js | 9 +------- src/device.ts | 8 +++++-- src/legacy/cam.ts | 51 ++++++++++++++++++++------------------------ src/onvif.ts | 51 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 38 deletions(-) diff --git a/legacyTest/common.js b/legacyTest/common.js index 7154bf13..4c15f3c7 100644 --- a/legacyTest/common.js +++ b/legacyTest/common.js @@ -85,23 +85,16 @@ describe('Common functions', () => { const oldTimeout = cam.timeout; cam.hostname = '10.255.255.1'; cam.timeout = 500; - console.time('a'); cam._request({body : 'timeout'}, (err) => { assert.notStrictEqual(err, null); cam.timeout = oldTimeout; cam.hostname = host; - console.timeEnd('a'); done(); }); }); it('should work nice with the proper request body', (done) => { cam._request({ - body : '' + - '' + - '' + - '' + - '' - } + body : ''} , (err) => { assert.strictEqual(err, null); done(); diff --git a/src/device.ts b/src/device.ts index 2bf4ba6d..01c5f52a 100644 --- a/src/device.ts +++ b/src/device.ts @@ -1,5 +1,5 @@ import url from 'url'; -import { Onvif, OnvifServices } from './onvif'; +import { Onvif, OnvifServices, SetSystemDateAndTimeOptions } from './onvif'; import { linerase } from './utils'; export interface OnvifService { @@ -293,7 +293,7 @@ interface HostnameInformation { */ export class Device { private readonly onvif: Onvif; - private services: OnvifService[] = []; + public services: OnvifService[] = []; public media2Support = false; constructor(onvif: Onvif) { @@ -304,6 +304,10 @@ export class Device { return this.onvif.getSystemDateAndTime(); } + setSystemDateAndTime(options: SetSystemDateAndTimeOptions) { + return this.onvif.setSystemDateAndTime(options); + } + /** * Returns information about services of the device. */ diff --git a/src/legacy/cam.ts b/src/legacy/cam.ts index a3a3b0c0..12f4c5ff 100644 --- a/src/legacy/cam.ts +++ b/src/legacy/cam.ts @@ -3,7 +3,7 @@ */ import { EventEmitter } from 'events'; -import { Onvif, OnvifRequestOptions } from '../onvif'; +import { Onvif, OnvifRequestOptions, SetSystemDateAndTimeOptions } from '../onvif'; type Callback = (error: any, result?: any) => void; @@ -20,41 +20,36 @@ export class Cam extends EventEmitter { } } - get port() { - return this.onvif.port; - } - - get path() { - return this.onvif.path; - } - - set hostname(name: string) { - this.onvif.hostname = name; - } - - set timeout(time: number) { - this.onvif.timeout = time; - } - - get timeout() { - return this.onvif.timeout; - } + get port() { return this.onvif.port; } + get path() { return this.onvif.path; } + set hostname(name: string) { this.onvif.hostname = name; } + set timeout(time: number) { this.onvif.timeout = time; } + get timeout() { return this.onvif.timeout; } + get services() { return this.onvif.device.services; } + get capabilities() { return this.onvif.capabilities; } + get uri() { return this.onvif.uri; } + get videoSources() { return this.onvif.media.videoSources; } + get profiles() { return this.onvif.media.profiles; } + get defaultProfile() { return this.onvif.defaultProfile; } + get defaultProfiles() { return this.onvif.defaultProfiles; } + get activeSource() { return this.onvif.activeSource; } connect(callback: Callback) { this.onvif.connect().then((result) => callback(null, result)).catch(callback); } _request(options: OnvifRequestOptions, callback: Callback) { - console.log('what?'); if (typeof callback !== 'function') { throw new Error('`callback` must be a function'); } - this.onvif.request(options).then((result) => { - console.log(result); - callback(null, result); - }).catch((error) => { - console.error(error); - callback(error); - }); + this.onvif.request(options).then((result) => callback(null, result)).catch(callback); + } + + getSystemDateAndTime(callback: Callback) { + this.onvif.device.getSystemDateAndTime().then((result) => callback(null, result)).catch(callback); + } + + setSystemDateAndTime(value: SetSystemDateAndTimeOptions, callback: Callback) { + this.onvif.device.setSystemDateAndTime(value).then((result) => callback(null, result)).catch(callback); } } diff --git a/src/onvif.ts b/src/onvif.ts index 7ac638ce..310c807f 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -82,6 +82,13 @@ export interface ActiveSource { }; } +export interface SetSystemDateAndTimeOptions { + dateTime?: Date; + dateTimeType: 'Manual' | 'NTP'; + daylightSavings?: boolean; + timezone?: string; +} + export class Onvif extends EventEmitter { /** * Indicates raw xml request to device. @@ -181,6 +188,7 @@ export class Onvif extends EventEmitter { } }); if (options.autoConnect) { + console.log('AUTOCONNN'); setImmediate(() => { this.connect().catch((error) => this.emit('error', error)); }); @@ -398,6 +406,48 @@ export class Onvif extends EventEmitter { } } + async setSystemDateAndTime(options: SetSystemDateAndTimeOptions) { + if (!['Manual', 'NTP'].includes(options.dateTimeType)) { + throw new Error('DateTimeType should be `Manual` or `NTP`'); + } + const [data] = await this.request({ + // Try the Unauthenticated Request first. Do not use this._envelopeHeader() as we don't have timeShift yet. + body : + '' + + `${ + options.dateTimeType + }` + + `${ + !!options.daylightSavings + }${ + options.timezone !== undefined + ? '' + + `${ + options.timezone + }` + + '' : '' + }${options.dateTime !== undefined && options.dateTime instanceof Date + ? '' + + '' + + '' + + `${options.dateTime.getUTCFullYear()}` + + `${options.dateTime.getUTCMonth() + 1}` + + `${options.dateTime.getUTCDate()}` + + '' + + '' : '' + }`, + }); + if (linerase(data).setSystemDateAndTimeResponse !== '') { + throw new Error(`Wrong 'SetSystemDateAndTime' response: '${linerase(data).setSystemDateAndTimeResponse}'`); + } + // get new system time from device + return this.getSystemDateAndTime(); + } + /** * Check and find out video configuration for device * @private @@ -460,6 +510,7 @@ export class Onvif extends EventEmitter { */ async connect() { await this.getSystemDateAndTime(); + // Try to get services (new approach). If not, get capabilities try { await this.device.getServices(); } catch (error) { From 13d66f2e7140fe9c78d3e5fced584af4dd6d2e6a Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Mon, 10 Oct 2022 02:32:35 +0300 Subject: [PATCH 056/112] add `scopes`, `setSystemDateAndTime`, `getServiceCapabilities` methods --- IMPLEMENTED.md | 8 +-- src/device.ts | 180 +++++++++++++++++++++++++++++++++++++++++----- src/legacy/cam.ts | 21 ++++++ src/onvif.ts | 5 +- 4 files changed, 191 insertions(+), 23 deletions(-) diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md index f889c120..49ed9a27 100644 --- a/IMPLEMENTED.md +++ b/IMPLEMENTED.md @@ -9,7 +9,7 @@ - [x] preserveAddress - [x] profiles - [ ] recordingItem -- [ ] scopes +- [x] scopes - [x] services - [x] uri - [x] videoSources @@ -59,7 +59,7 @@ - [ ] getRecordings - [ ] getReplayUri - [ ] getScopes -- [ ] getServiceCapabilities +- [x] getServiceCapabilities - [x] getServices - [ ] getSnapshotUri - [ ] getStatus @@ -90,8 +90,8 @@ - [ ] setNTP - [ ] setOSD - [ ] setPreset -- [ ] setScopes -- [ ] setSystemDateAndTime +- [x] setScopes +- [x] setSystemDateAndTime - [ ] setSystemFactoryDefault - [ ] setUsers - [ ] setVideoEncoderConfiguration diff --git a/src/device.ts b/src/device.ts index 01c5f52a..ea6827f2 100644 --- a/src/device.ts +++ b/src/device.ts @@ -39,6 +39,16 @@ export interface NetworkCapabilities { IPVersion6?: boolean; /** Indicates support for dynamic DNS configuration */ dynDNS?: boolean; + /** Indicates support for IEEE 802.11 configuration */ + dot11Configuration?: boolean; + /** Indicates the maximum number of Dot1X configurations supported by the device */ + dot1XConfigurations?: number; + /** Indicates support for retrieval of hostname from DHCP */ + hostnameFromDHCP?: boolean; + /** Maximum number of NTP servers supported by the devices SetNTP command */ + NTP: number; + /** Indicates support for Stateful IPv6 DHCP */ + DHCPv6: boolean; extension: NetworkCapabilitiesExtension; } @@ -72,6 +82,26 @@ export interface SystemCapabilities { httpSystemLogging?: boolean; /** Indicates supported ONVIF version(s) */ supportedVersions: OnvifVersion; + /** Indicates support for retrieving support information through HTTP */ + httpSupportInformation?: boolean; + /** Indicates support for storage configuration interfaces */ + storageConfiguration?: boolean; + /** Indicates maximum number of storage configurations supported */ + maxStorageConfigurations?: number; + /** If present signals support for geo location. The value signals the supported number of entries */ + geoLocationEntries?: number; + /** List of supported automatic GeoLocation adjustment supported by the device. Valid items are defined by tds:AutoGeoMode */ + autoGeo?: string[]; + /** Enumerates the supported StorageTypes, see tds:StorageType */ + storageTypesSupported?: string[]; + /** Indicates no support for network discovery */ + discoveryNotSupported?: boolean; + /** Indicates no support for network configuration */ + networkConfigNotSupported?: boolean; + /** Indicates no support for user configuration */ + userConfigNotSupported?: boolean; + /** List of supported Addons by the device */ + addons?: string[]; extensions?: SystemCapabilitiesExtension; } @@ -104,6 +134,8 @@ export interface SecurityCapabilitiesExtension { /** Security capabilities */ export interface SecurityCapabilities { + /** Indicates support for TLS 1.1 */ + 'TLS1.0'?: boolean; /** Indicates support for TLS 1.1 */ 'TLS1.1': boolean; /** Indicates support for TLS 1.2 */ @@ -112,14 +144,36 @@ export interface SecurityCapabilities { onboardKeyGeneration: boolean; /** Indicates support for access policy configuration */ accessPolicyConfig: boolean; + /** Indicates support for the ONVIF default access policy */ + defaultAccessPolicy?: boolean; + /** Indicates support for IEEE 802.1X configuration */ + dot1X?: boolean; + /** Indicates support for remote user configuration. Used when accessing another device */ + remoteUserHandling?: boolean; /** Indicates support for WS-Security X.509 token */ 'X.509Token': boolean; /** Indicates support for WS-Security SAML token */ SAMLToken: boolean; /** Indicates support for WS-Security Kerberos token */ kerberosToken: boolean; + /** Indicates support for WS-Security Username token */ + usernameToken?: boolean; + /** Indicates support for WS over HTTP digest authenticated communication layer */ + httpDigest?: boolean; /** Indicates support for WS-Security REL token */ RELToken: boolean; + /** EAP Methods supported by the device. The int values refer to the IANA EAP Registry */ + supportedEAPMethods?: number[]; + /** The maximum number of users that the device supports */ + maxUsers?: number; + /** Maximum number of characters supported for the username by CreateUsers */ + maxUserNameLength?: number; + /** Maximum number of characters supported for the password by CreateUsers and SetUser */ + maxPasswordLength?: number; + /** Indicates which security policies are supported. Options are: ModifyPassword, PasswordComplexity, AuthFailureWarnings */ + securityPolicies?: string[]; + /** Maximum number of passwords that the device can remember for each user */ + maxPasswordHistory: number; extension?: SecurityCapabilitiesExtension; } @@ -280,7 +334,7 @@ export interface Capabilities { extension?: CapabilitiesExtension; } -interface HostnameInformation { +export interface HostnameInformation { /** Indicates whether the hostname is obtained from DHCP or not */ fromDHCP: boolean; /** Indicates the hostname */ @@ -288,13 +342,62 @@ interface HostnameInformation { extension?: any; } +export interface DeviceInformation { + /** The manufactor of the device */ + manufacturer: string; + /** The device model */ + model: string; + /** The firmware version in the device */ + firmwareVersion: string; + /** The serial number of the device */ + serialNumber: string; + /** The hardware ID of the device */ + hardwareId: string; +} + +export interface Scope { + /** Indicates if the scope is fixed or configurable */ + scopeDef: 'Fixed' | 'Configurable'; + /** Scope item URI */ + scopeItem: string; +} + +export interface MiscCapabilities { + /** Lists of commands supported by SendAuxiliaryCommand */ + auxiliaryCommands: string[]; +} + +export interface DeviceServiceCapabilities { + /** Network capabilities */ + network?: NetworkCapabilities; + /** Security capabilities */ + security?: SecurityCapabilities; + /** System capabilities */ + system?: SystemCapabilities; + /** Capabilities that do not fit in any of the other categories */ + misc?: MiscCapabilities; + /** The same as misc field */ + auxiliaryCommands?: string[]; +} + /** * Device methods */ export class Device { private readonly onvif: Onvif; - public services: OnvifService[] = []; + #services: OnvifService[] = []; + get services() { + return this.#services; + } public media2Support = false; + #scopes: Scope[] = []; + get scopes() { + return this.#scopes; + } + #serviceCapabilities: DeviceServiceCapabilities = {}; + get serviceCapabilities() { + return this.#serviceCapabilities; + } constructor(onvif: Onvif) { this.onvif = onvif; @@ -317,12 +420,12 @@ export class Device { + `${includeCapability}` + '
', }); - this.services = linerase(data).getServicesResponse.service; + this.#services = linerase(data).getServicesResponse.service; // ONVIF Profile T introduced Media2 (ver20) so cameras from around 2020/2021 will have // two media entries in the ServicesResponse, one for Media (ver10/media) and one for Media2 (ver20/media) // This is so that existing VMS software can still access the video via the orignal ONVIF Media API // fill Cam#uri property - this.services.forEach((service) => { + this.#services.forEach((service) => { // Look for services with namespaces and XAddr values if (Object.prototype.hasOwnProperty.call(service, 'namespace') && Object.prototype.hasOwnProperty.call(service, 'XAddr')) { // Only parse ONVIF namespaces. Axis cameras return Axis namespaces in GetServices @@ -338,7 +441,7 @@ export class Device { } } }); - return this.services; + return this.#services; } /** @@ -377,29 +480,72 @@ export class Device { return this.onvif.capabilities; } + /** + * Receive device information + */ async getDeviceInformation(): Promise { const [data] = await this.onvif.request({ body : '' }); this.onvif.deviceInformation = linerase(data).getDeviceInformationResponse; return this.onvif.deviceInformation!; } + /** + * Receive hostname information + */ async getHostname(): Promise { const [data] = await this.onvif.request({ body : '', }); return linerase(data).getHostnameResponse.hostnameInformation; } -} -export interface DeviceInformation { - /** The manufactor of the device */ - manufacturer: string; - /** The device model */ - model: string; - /** The firmware version in the device */ - firmwareVersion: string; - /** The serial number of the device */ - serialNumber: string; - /** The hardware ID of the device */ - hardwareId: string; + /** + * Receive the scope parameters of a device + */ + async getScopes(): Promise { + const [data] = await this.onvif.request({ + body : '', + }); + this.#scopes = linerase(data).getScopesResponse.scopes; + if (this.#scopes === undefined) { + this.#scopes = []; + } else if (!Array.isArray(this.#scopes)) { + this.#scopes = [this.#scopes]; + } + return this.#scopes; + } + + /** + * Set the scope parameters of a device + * @param scopes Array of scope's uris + */ + async setScopes(scopes: string[]) { + const [data] = await this.onvif.request({ + body : `${ + scopes.map((uri) => `${uri}`).join('') + }`, + }); + if (linerase(data).setScopesResponse !== '') { + throw new Error('Wrong `SetScopes` response'); + } + // get new scopes from device + return this.getScopes(); + } + + async getServiceCapabilities() { + const [data] = await this.onvif.request({ + body : '', + }); + const capabilitiesResponse = linerase(data); + this.#serviceCapabilities = { + network : capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.network, + security : capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.security, + system : capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.system, + }; + if (capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc) { + this.#serviceCapabilities.misc = capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc; + this.#serviceCapabilities.auxiliaryCommands = capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc.AuxiliaryCommands.split(' '); + } + return this.#serviceCapabilities; + } } diff --git a/src/legacy/cam.ts b/src/legacy/cam.ts index 12f4c5ff..0b35f722 100644 --- a/src/legacy/cam.ts +++ b/src/legacy/cam.ts @@ -33,6 +33,7 @@ export class Cam extends EventEmitter { get defaultProfile() { return this.onvif.defaultProfile; } get defaultProfiles() { return this.onvif.defaultProfiles; } get activeSource() { return this.onvif.activeSource; } + get serviceCapabilities() { return this.onvif.device.serviceCapabilities; } connect(callback: Callback) { this.onvif.connect().then((result) => callback(null, result)).catch(callback); @@ -52,4 +53,24 @@ export class Cam extends EventEmitter { setSystemDateAndTime(value: SetSystemDateAndTimeOptions, callback: Callback) { this.onvif.device.setSystemDateAndTime(value).then((result) => callback(null, result)).catch(callback); } + + getHostname(callback: Callback) { + this.onvif.device.getHostname().then((result) => callback(null, result)).catch(callback); + } + + getScopes(callback: Callback) { + this.onvif.device.getScopes().then((result) => callback(null, result)).catch(callback); + } + + setScopes(value: string[], callback: Callback) { + this.onvif.device.setScopes(value).then((result) => callback(null, result)).catch(callback); + } + + getCapabilities(callback: Callback) { + this.onvif.device.getCapabilities().then((result) => callback(null, result)).catch(callback); + } + + getServiceCapabilities(callback: Callback) { + this.onvif.device.getServiceCapabilities().then((result) => callback(null, result)).catch(callback); + } } diff --git a/src/onvif.ts b/src/onvif.ts index 310c807f..a244c580 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -188,7 +188,6 @@ export class Onvif extends EventEmitter { } }); if (options.autoConnect) { - console.log('AUTOCONNN'); setImmediate(() => { this.connect().catch((error) => this.emit('error', error)); }); @@ -405,7 +404,9 @@ export class Onvif extends EventEmitter { throw error; } } - + /** + * Set the device system date and time + */ async setSystemDateAndTime(options: SetSystemDateAndTimeOptions) { if (!['Manual', 'NTP'].includes(options.dateTimeType)) { throw new Error('DateTimeType should be `Manual` or `NTP`'); From bcb467043259a842c88a359fd0f1caea1b73dd1d Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 11 Oct 2022 23:14:46 +0300 Subject: [PATCH 057/112] Add `getActiveSources`, `getSnapshotUri`, `getStreamUri` methods and tests --- .eslintrc.js | 1 + IMPLEMENTED.md | 6 ++- legacyTest/common.js | 8 ++-- src/legacy/cam.ts | 40 +++++++++++++++++ src/media.ts | 104 ++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 152 insertions(+), 7 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index e61bac27..883ca405 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -7,6 +7,7 @@ const commonRules = { 'no-restricted-syntax' : 0, 'max-classes-per-file' : 0, 'no-underscore-dangle' : 0, + 'no-param-reassign' : 0, 'no-unused-expressions' : 0, 'no-case-declarations' : 0, 'no-shadow' : 0, diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md index 49ed9a27..683070de 100644 --- a/IMPLEMENTED.md +++ b/IMPLEMENTED.md @@ -28,6 +28,7 @@ - [ ] deleteOSD - [ ] deleteProfile - [ ] deleteUsers +- [x] getActiveSources - [ ] getAudioEncoderConfiguration - [ ] getAudioEncoderConfigurationOptions - [ ] getAudioEncoderConfigurations @@ -61,14 +62,15 @@ - [ ] getScopes - [x] getServiceCapabilities - [x] getServices -- [ ] getSnapshotUri +- [x] getSnapshotUri - [ ] getStatus -- [ ] getStreamUri +- [x] getStreamUri - [x] getSystemDateAndTime - [ ] getUsers - [ ] getVideoEncoderConfiguration - [ ] getVideoEncoderConfigurationOptions - [ ] getVideoEncoderConfigurations +- [ ] getVideoOutputs - [ ] getVideoSourceConfigurations - [ ] getVideoSourceOptions - [ ] getVideoSources diff --git a/legacyTest/common.js b/legacyTest/common.js index 4c15f3c7..dc227d9f 100644 --- a/legacyTest/common.js +++ b/legacyTest/common.js @@ -5,7 +5,7 @@ const onvif = require('../build/legacy/cam'); let serverMockup; if (synthTest) { - // eslint-disable-next-line import/no-useless-path-segments + // eslint-disable-next-line import/no-useless-path-segments,global-require serverMockup = require('../legacyTest/serverMockup'); } @@ -334,8 +334,8 @@ describe('Common functions', () => { cam.getVideoSources((err, data) => { assert.strictEqual(err, null); assert.ok(Array.isArray(data)); - data.every((d) => { - assert.ok(['$', 'framerate', 'resolution'].every((prop) => d[prop] !== undefined)); + data.forEach((d) => { + assert.ok(['token', 'framerate', 'resolution'].every((prop) => d[prop] !== undefined)); assert.strictEqual(cam.videoSources, data); }); done(); @@ -356,7 +356,7 @@ describe('Common functions', () => { describe('getDeviceInformation', () => { it('should return an information about device', (done) => { - cam.getDeviceInformation((err, data) => { + cam.getDeviceInformation((err, data) => { assert.strictEqual(err, null); assert.ok(['manufacturer', 'model', 'firmwareVersion', 'serialNumber', 'hardwareId'] .every((prop) => data[prop] !== undefined)); diff --git a/src/legacy/cam.ts b/src/legacy/cam.ts index 0b35f722..06bba9c6 100644 --- a/src/legacy/cam.ts +++ b/src/legacy/cam.ts @@ -4,6 +4,7 @@ import { EventEmitter } from 'events'; import { Onvif, OnvifRequestOptions, SetSystemDateAndTimeOptions } from '../onvif'; +import { GetSnapshotUriOptions, GetStreamUriOptions } from '../media'; type Callback = (error: any, result?: any) => void; @@ -34,6 +35,7 @@ export class Cam extends EventEmitter { get defaultProfiles() { return this.onvif.defaultProfiles; } get activeSource() { return this.onvif.activeSource; } get serviceCapabilities() { return this.onvif.device.serviceCapabilities; } + get deviceInformation() { return this.onvif.deviceInformation; } connect(callback: Callback) { this.onvif.connect().then((result) => callback(null, result)).catch(callback); @@ -73,4 +75,42 @@ export class Cam extends EventEmitter { getServiceCapabilities(callback: Callback) { this.onvif.device.getServiceCapabilities().then((result) => callback(null, result)).catch(callback); } + + getActiveSources(callback: Callback) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this.onvif.getActiveSources().then((result) => callback(null, result)).catch(callback); + } + + getVideoSources(callback: Callback) { + this.onvif.media.getVideoSources().then((result) => callback(null, result)).catch(callback); + } + + getServices(includeCapability: boolean, callback: Callback) { + this.onvif.device.getServices(includeCapability).then((result) => callback(null, result)).catch(callback); + } + + getDeviceInformation(callback: Callback) { + this.onvif.device.getDeviceInformation().then((result) => callback(null, result)).catch(callback); + } + + getStreamUri(options: GetStreamUriOptions, callback: Callback): void + getStreamUri(callback: Callback): void + getStreamUri(options: GetStreamUriOptions | Callback, callback?: Callback) { + if (callback) { + this.onvif.media.getStreamUri(options as GetStreamUriOptions).then((result) => callback(null, result)).catch(callback); + } + this.onvif.media.getStreamUri().then((result) => (options as Callback)(null, result)).catch(options as Callback); + } + + getSnapshotUri(options: GetSnapshotUriOptions, callback: Callback): void + getSnapshotUri(callback: Callback): void + getSnapshotUri(options: GetSnapshotUriOptions | Callback, callback?: Callback) { + if (callback) { + this.onvif.media.getSnapshotUri(options as GetSnapshotUriOptions) + .then((result) => callback(null, result)).catch(callback); + } + this.onvif.media.getSnapshotUri().then((result) => (options as Callback)(null, result)) + .catch(options as Callback); + } } diff --git a/src/media.ts b/src/media.ts index 4d6c4ffc..249effba 100644 --- a/src/media.ts +++ b/src/media.ts @@ -927,6 +927,18 @@ export interface VideoSource { extension?: VideoSourceExtension; } +export interface GetStreamUriOptions { + profileToken?: ReferenceToken; + stream?: 'RTP-Unicast' | 'RTP-Multicast'; + protocol?: + 'RtspUnicast' | 'RtspMulticast' | 'RTSP' | 'RtspOverHttp' | // for Media2 + 'UDP'| 'TCP' | 'HTTP'; // for Media1 +} + +export interface GetSnapshotUriOptions { + profileToken?: ReferenceToken; +} + export class Media { private onvif: Onvif; public profiles: Profile[] = []; @@ -1005,9 +1017,99 @@ export class Media { body : '', }); this.videoSources = linerase(data).getVideoSourcesResponse.videoSources; - // videoSources is an array of video sources, but linerase remove the array if there is only one element inside + // videoSources is an array of video sources, but linerase remove the array if there is only one element inside, // so we convert it back to an array if (!Array.isArray(this.videoSources)) { this.videoSources = [this.videoSources]; } return this.videoSources; } + + /** + * This method requests a URI that can be used to initiate a live media stream using RTSP as the control protocol. + * The returned URI shall remain valid indefinitely even if the profile is changed. + * Method uses Media2 if device supports it. + * + * For Media2 you need to provide only `protocol` parameter ('RTPS' by default). Here is supported values from the + * ONVIF documentation: + * Defined stream types are + * - RtspUnicast RTSP streaming RTP as UDP Unicast. + * - RtspMulticast RTSP streaming RTP as UDP Multicast. + * - RTSP RTSP streaming RTP over TCP. + * - RtspOverHttp Tunneling both the RTSP control channel and the RTP stream over HTTP or HTTPS. + * + * For Media1 you need to set both parameters: protocl and stream (RTP-Unicast by default) If Media2 supported + * by device, this parameters will be converted to Media2 call. This is excerpt from ONVIF documentation: + * The correct syntax for the StreamSetup element for these media stream setups defined in 5.1.1 of the streaming specification are as follows: + * - RTP unicast over UDP: StreamType = "RTP_unicast", TransportProtocol = "UDP" + * - RTP over RTSP over HTTP over TCP: StreamType = "RTP_unicast", TransportProtocol = "HTTP" + * - RTP over RTSP over TCP: StreamType = "RTP_unicast", TransportProtocol = "RTSP" + */ + async getStreamUri(options: GetStreamUriOptions = {}): + Promise<{uri: string, invalidAfterConnect?: boolean, invalidAfterReboot?: boolean, timeout?: Duration}> { + const { + profileToken, + stream = 'RTP-Unicast', + } = options; + let { protocol = 'RTSP' } = options; + if (this.onvif.device.media2Support) { + // Permitted values for options.protocol are :- + // RtspUnicast - RTSP streaming RTP via UDP Unicast. + // RtspMulticast - RTSP streaming RTP via UDP Multicast. + // RTSP - RTSP streaming RTP over TCP. + // RtspOverHttp - Tunneling both the RTSP control channel and the RTP stream over HTTP or HTTPS. + + // For backwards compatibility this function will convert Media1 Stream and Transport Protocol to a Media2 protocol + if (protocol === 'HTTP') { protocol = 'RtspOverHttp'; } + if (protocol === 'TCP') { protocol = 'RTSP'; } + if (protocol === 'UDP' && stream === 'RTP-Unicast') { protocol = 'RtspUnicast'; } + if (protocol === 'UDP' && stream === 'RTP-Multicast') { protocol = 'RtspMulticast'; } + + // Profile T request using Media2 + const [data] = await this.onvif.request({ + service : 'media2', + body : '' + + `${protocol}` + + `${profileToken || this.onvif.activeSource!.profileToken}` + + '', + }); + return linerase(data).getStreamUriResponse; + } + // Original (v.1.0) ONVIF Specification for Media (used in Profile S) + const [data] = await this.onvif.request({ + service : 'media', + body : '' + + '' + + `${stream}` + + '' + + `${protocol || 'RTSP'}` + + '' + + '' + + `${profileToken || this.onvif.activeSource!.profileToken}` + + '', + }); + return linerase(data).getStreamUriResponse.mediaUri; + } + + /** + * Receive snapshot URI + * @param profileToken + */ + async getSnapshotUri({ profileToken }: GetSnapshotUriOptions = {}): Promise<{uri: string}> { + if (this.onvif.device.media2Support) { + // Profile T request using Media2 + const [data] = await this.onvif.request({ + service : 'media2', + body : '' + + `${profileToken || this.onvif.activeSource!.profileToken}` + + '', + }); + return linerase(data).getSnapshotUriResponse; + } + const [data] = await this.onvif.request({ + service : 'media', + body : '' + + `${profileToken || this.onvif.activeSource!.profileToken}` + + '', + }); + return linerase(data).getSnapshotUriResponse.mediaUri; + } } From 70e56f8f0021f756343f38f51fab7f5dde8f3702 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Wed, 12 Oct 2022 14:30:08 +0300 Subject: [PATCH 058/112] Add `getActiveSources`, `getSnapshotUri`, `getStreamUri` methods and tests --- legacyTest/common.js | 2 +- src/legacy/cam.ts | 5 ++ src/media.ts | 14 +++--- src/onvif.ts | 11 ++++- src/ptz.ts | 113 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 10 deletions(-) create mode 100644 src/ptz.ts diff --git a/legacyTest/common.js b/legacyTest/common.js index dc227d9f..1659cb81 100644 --- a/legacyTest/common.js +++ b/legacyTest/common.js @@ -396,7 +396,7 @@ describe('Common functions', () => { describe('getNodes', () => { it('should return object of nodes and sets them to #nodes', (done) => { - cam.getNodes((err, data) => { + cam.getNodes((err, data, xml) => { assert.strictEqual(err, null); assert.ok(typeof data === 'object'); assert.deepStrictEqual(cam.nodes, data); diff --git a/src/legacy/cam.ts b/src/legacy/cam.ts index 06bba9c6..e3af2be3 100644 --- a/src/legacy/cam.ts +++ b/src/legacy/cam.ts @@ -36,6 +36,7 @@ export class Cam extends EventEmitter { get activeSource() { return this.onvif.activeSource; } get serviceCapabilities() { return this.onvif.device.serviceCapabilities; } get deviceInformation() { return this.onvif.deviceInformation; } + get nodes() { return this.onvif.ptz.nodes; } connect(callback: Callback) { this.onvif.connect().then((result) => callback(null, result)).catch(callback); @@ -113,4 +114,8 @@ export class Cam extends EventEmitter { this.onvif.media.getSnapshotUri().then((result) => (options as Callback)(null, result)) .catch(options as Callback); } + + getNodes(callback: Callback) { + this.onvif.ptz.getNodes().then((result) => callback(null, result)).catch(callback); + } } diff --git a/src/media.ts b/src/media.ts index 249effba..518e2617 100644 --- a/src/media.ts +++ b/src/media.ts @@ -1,10 +1,8 @@ -import { Onvif } from './onvif'; +import { + AnyURI, Name, Onvif, ReferenceToken, +} from './onvif'; import { linerase } from './utils'; -export type AnyURI = string; -export type ReferenceToken = string; -export type Name = string; - export interface IntRectangle { x: number; y: number; @@ -316,7 +314,7 @@ export interface Range { export interface Space2DDescription { /** A URI of coordinate systems */ - URI: string; + URI: AnyURI; /** A range of x-axis */ XRange: Range; /** A range of y-axis */ @@ -1044,7 +1042,7 @@ export class Media { * - RTP over RTSP over TCP: StreamType = "RTP_unicast", TransportProtocol = "RTSP" */ async getStreamUri(options: GetStreamUriOptions = {}): - Promise<{uri: string, invalidAfterConnect?: boolean, invalidAfterReboot?: boolean, timeout?: Duration}> { + Promise<{uri: AnyURI, invalidAfterConnect?: boolean, invalidAfterReboot?: boolean, timeout?: Duration}> { const { profileToken, stream = 'RTP-Unicast', @@ -1093,7 +1091,7 @@ export class Media { * Receive snapshot URI * @param profileToken */ - async getSnapshotUri({ profileToken }: GetSnapshotUriOptions = {}): Promise<{uri: string}> { + async getSnapshotUri({ profileToken }: GetSnapshotUriOptions = {}): Promise<{uri: AnyURI}> { if (this.onvif.device.media2Support) { // Profile T request using Media2 const [data] = await this.onvif.request({ diff --git a/src/onvif.ts b/src/onvif.ts index a244c580..a1fc703b 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -7,6 +7,12 @@ import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; import { Capabilities, Device, DeviceInformation } from './device'; import { Media, Profile } from './media'; +import { PTZ } from './ptz'; + +// Common types +export type AnyURI = string; +export type ReferenceToken = string; +export type Name = string; /** * Cam constructor options @@ -32,7 +38,7 @@ export interface OnvifOptions { } export interface OnvifServices { - PTZ?: URL; + ptz?: URL; analyticsDevice?: URL; device?: URL; deviceIO?: URL; @@ -138,6 +144,7 @@ export class Onvif extends EventEmitter { */ public readonly device: Device; public readonly media: Media; + public readonly ptz: PTZ; public useSecure: boolean; public secureOptions: SecureContextOptions; public hostname: string; @@ -178,6 +185,8 @@ export class Onvif extends EventEmitter { this.device = new Device(this); this.media = new Media(this); + this.ptz = new PTZ(this); + /** Bind event handling to the `event` event */ this.on('newListener', (name) => { // if this is the first listener, start pulling subscription diff --git a/src/ptz.ts b/src/ptz.ts new file mode 100644 index 00000000..7e38e53b --- /dev/null +++ b/src/ptz.ts @@ -0,0 +1,113 @@ +import { Onvif, ReferenceToken } from './onvif'; +import { linerase } from './utils'; +import { Space1DDescription, Space2DDescription } from './media'; + +interface PTZPresetTourSupported { + /** Indicates number of preset tours that can be created. Required preset tour operations shall be available for this + * PTZ Node if one or more preset tour is supported */ + maximumNumberOfPresetTours: number; + /** Indicates which preset tour operations are available for this PTZ Node */ + ptzPresetTourOperation: 'Start' | 'Stop' | 'Pause' | 'Extended'; +} + +export interface PTZNode { + /** Unique identifier referencing the physical entity */ + token: ReferenceToken; + /** Indication whether the HomePosition of a Node is fixed or it can be changed via the SetHomePosition command */ + fixedHomePosition: boolean; + /** Indication whether the Node supports the geo-referenced move command */ + geoMove: boolean; + /** A unique identifier that is used to reference PTZ Nodes */ + name?: string; + /** A list of Coordinate Systems available for the PTZ Node. For each Coordinate System, the PTZ Node MUST specify + * its allowed range */ + ptzSpaces: PTZSpace[]; + /** All preset operations MUST be available for this PTZ Node if one preset is supported */ + maximumNumberOfPresets: number; + /** A boolean operator specifying the availability of a home position. If set to true, the Home Position Operations + * MUST be available for this PTZ Node */ + homeSupported: boolean; + /** A list of supported Auxiliary commands. If the list is not empty, the Auxiliary Operations MUST be available for + * this PTZ Node */ + auxiliaryCommands?: any; + extension?: { + /** Detail of supported Preset Tour feature */ + supportedPresetTour?: PTZPresetTourSupported + extension?: any; + }; +} + +export interface PTZSpace { + /** The Generic Pan/Tilt Position space is provided by every PTZ node that supports absolute Pan/Tilt, since it + * does not relate to a specific physical range. Instead, the range should be defined as the full range of the PTZ + * unit normalized to the range -1 to 1 resulting in the following space description */ + absolutePanTiltPositionSpace?: Space2DDescription; + /** The Generic Zoom Position Space is provided by every PTZ node that supports absolute Zoom, since it does not + * relate to a specific physical range. Instead, the range should be defined as the full range of the Zoom normalized + * to the range 0 (wide) to 1 (tele). There is no assumption about how the generic zoom range is mapped + * to magnification, FOV or other physical zoom dimension */ + absoluteZoomPositionSpace?: Space1DDescription; + /** The Generic Pan/Tilt translation space is provided by every PTZ node that supports relative Pan/Tilt, since it + * does not relate to a specific physical range. Instead, the range should be defined as the full positive and + * negative translation range of the PTZ unit normalized to the range -1 to 1, where positive translation would mean + * clockwise rotation or movement in right/up direction resulting in the following space description */ + relativePanTiltTranslationSpace?: Space2DDescription; + /** The Generic Zoom Translation Space is provided by every PTZ node that supports relative Zoom, since it does not + * relate to a specific physical range. Instead, the corresponding absolute range should be defined as the full + * positive and negative translation range of the Zoom normalized to the range -1 to1, where a positive translation + * maps to a movement in TELE direction. The translation is signed to indicate direction (negative is to wide, + * positive is to tele). There is no assumption about how the generic zoom range is mapped to magnification, FOV or + * other physical zoom dimension. This results in the following space description */ + relativeZoomTranslationSpace?: Space1DDescription; + /** The generic Pan/Tilt velocity space shall be provided by every PTZ node, since it does not relate to a specific + * physical range. Instead, the range should be defined as a range of the PTZ unit’s speed normalized to the range + * -1 to 1, where a positive velocity would map to clockwise rotation or movement in the right/up direction. A signed + * speed can be independently specified for the pan and tilt component resulting in the following space description */ + continuousPanTiltVelocitySpace?: Space2DDescription; + /** The generic zoom velocity space specifies a zoom factor velocity without knowing the underlying physical model. + * The range should be normalized from -1 to 1, where a positive velocity would map to TELE direction. A generic zoom + * velocity space description resembles the following */ + continuousZoomVelocitySpace?: Space1DDescription; + /** The speed space specifies the speed for a Pan/Tilt movement when moving to an absolute position or to a relative + * translation. In contrast to the velocity spaces, speed spaces do not contain any directional information. The speed + * of a combined Pan/Tilt movement is represented by a single non-negative scalar value */ + panTiltSpeedSpace?: Space1DDescription; + /** The speed space specifies the speed for a Zoom movement when moving to an absolute position or to a relative + * translation. In contrast to the velocity spaces, speed spaces do not contain any directional information */ + zoomSpeedSpace?: Space1DDescription; + extension?: any; +} + +type ResponsePTZNode = PTZNode & {$?: ReferenceToken}; + +/** + * PTZ methods + */ +export class PTZ { + private readonly onvif: Onvif; + #nodes: Record = {}; + get nodes() { + return this.#nodes; + } + + constructor(onvif: Onvif) { + this.onvif = onvif; + } + + /** + * Returns the properties of the requested PTZ node, if it exists. + * Use this function to get maximum number of presets, ranges of admitted values for x, y, zoom, iris, focus + */ + async getNodes() { + const [data] = await this.onvif.request({ + service : 'ptz', + body : '', + }); + this.#nodes = {}; + data[0].getNodesResponse.forEach((ptzNode: any) => { + const node: ResponsePTZNode = linerase(ptzNode.PTZNode[0]); + this.#nodes[node.token] = node; + }); + return this.#nodes; + } +} From 20f40316b8011a84d5ed5bda905978487bf737a6 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Thu, 13 Oct 2022 00:31:49 +0300 Subject: [PATCH 059/112] Add `getConfigurationOptions`, `getConfigurations`, `getNodes` `systemReboot` methods and make legacy version common tests compliant --- IMPLEMENTED.md | 8 ++--- legacyTest/common.js | 4 +-- src/device.ts | 22 ++++++++++-- src/legacy/cam.ts | 33 +++++++++++++---- src/media.ts | 24 +++++++------ src/onvif.ts | 2 +- src/ptz.ts | 85 ++++++++++++++++++++++++++++++++++++++++++-- src/test.ts | 8 +++-- src/utils.ts | 1 - 9 files changed, 154 insertions(+), 33 deletions(-) diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md index 683070de..bd43b71a 100644 --- a/IMPLEMENTED.md +++ b/IMPLEMENTED.md @@ -37,8 +37,8 @@ - [ ] getAudioSourceConfigurations - [ ] getAudioSources - [x] getCapabilities -- [ ] getConfigurationOptions -- [ ] getConfigurations +- [x] getConfigurationOptions +- [x] getConfigurations - [ ] getCurrentImagingPreset - [x] getDeviceInformation - [ ] getDNS @@ -51,7 +51,7 @@ - [ ] getNetworkDefaultGateway - [ ] getNetworkInterfaces - [ ] getNetworkProtocols -- [ ] getNodes +- [x] getNodes - [ ] getNTP - [ ] getOSDOptions - [ ] getOSDs @@ -99,5 +99,5 @@ - [ ] setVideoEncoderConfiguration - [ ] stop - [ ] subscribe -- [ ] systemReboot +- [x] systemReboot - [ ] unsubscribe diff --git a/legacyTest/common.js b/legacyTest/common.js index 1659cb81..51ff7e1c 100644 --- a/legacyTest/common.js +++ b/legacyTest/common.js @@ -120,7 +120,7 @@ describe('Common functions', () => { assert.strictEqual(err, null); assert.ok(cam.capabilities || cam.services); if (synthTest) { - assert.ok(cam.uri.ptz); + assert.ok(cam.uri.PTZ); } assert.ok(cam.uri.media); assert.ok(cam.videoSources); @@ -277,7 +277,7 @@ describe('Common functions', () => { }); }); it('should store PTZ link in ptzUri property', (done) => { - assert.strictEqual(cam.uri.ptz.href, cam.capabilities.PTZ.XAddr); + assert.strictEqual(cam.uri.PTZ.href, cam.capabilities.PTZ.XAddr); done(); }); it('should store uri links for extensions', (done) => { diff --git a/src/device.ts b/src/device.ts index ea6827f2..ba4e6613 100644 --- a/src/device.ts +++ b/src/device.ts @@ -432,10 +432,13 @@ export class Device { const parsedNamespace = url.parse(service.namespace); if (parsedNamespace.hostname === 'www.onvif.org' && parsedNamespace.path) { const namespaceSplitted = parsedNamespace.path.substring(1).split('/'); // remove leading Slash, then split - // special case for Media and Media2 where cameras supporting Profile S and Profile T (2020/2021 models) have two media services if (namespaceSplitted[1] === 'media' && namespaceSplitted[0] === 'ver20') { + // special case for Media and Media2 where cameras supporting Profile S and Profile T (2020/2021 models) have two media services this.media2Support = true; namespaceSplitted[1] = 'media2'; + } else if (namespaceSplitted[1] === 'ptz') { + // uppercase PTZ namespace to fit names convention + namespaceSplitted[1] = 'PTZ'; } this.onvif.uri[namespaceSplitted[1] as keyof OnvifServices] = this.onvif.parseUrl(service.XAddr); } @@ -445,7 +448,7 @@ export class Device { } /** - * This method has been replaced by the more generic GetServices method. + * This method has been replaced by the more generic {@link Device.getServices | GetServices} method. * For capabilities of individual services refer to the GetServiceCapabilities methods. */ async getCapabilities(): Promise { @@ -458,7 +461,7 @@ export class Device { ['PTZ', 'media', 'imaging', 'events', 'device'].forEach((name) => { const capabilityName = name as keyof Capabilities; if ('XAddr' in this.onvif.capabilities[capabilityName]!) { - this.onvif.uri[name.toLowerCase() as keyof OnvifServices] = this.onvif.parseUrl(this.onvif.capabilities[capabilityName]!.XAddr); + this.onvif.uri[name as keyof OnvifServices] = this.onvif.parseUrl(this.onvif.capabilities[capabilityName]!.XAddr); } }); // extensions, eg. deviceIO @@ -532,6 +535,9 @@ export class Device { return this.getScopes(); } + /** + * Returns the capabilities of the device service. The result is returned in a typed answer + */ async getServiceCapabilities() { const [data] = await this.onvif.request({ body : '', @@ -548,4 +554,14 @@ export class Device { } return this.#serviceCapabilities; } + + /** + * This operation reboots the device + */ + async systemReboot(): Promise { + return this.onvif.request({ + service : 'device', // or 'deviceIO' ? + body : '', + }).then(([data]) => data[0].systemRebootResponse[0].message[0]); + } } diff --git a/src/legacy/cam.ts b/src/legacy/cam.ts index e3af2be3..ef1dd458 100644 --- a/src/legacy/cam.ts +++ b/src/legacy/cam.ts @@ -3,7 +3,9 @@ */ import { EventEmitter } from 'events'; -import { Onvif, OnvifRequestOptions, SetSystemDateAndTimeOptions } from '../onvif'; +import { + Onvif, OnvifRequestOptions, ReferenceToken, SetSystemDateAndTimeOptions, +} from '../onvif'; import { GetSnapshotUriOptions, GetStreamUriOptions } from '../media'; type Callback = (error: any, result?: any) => void; @@ -37,6 +39,7 @@ export class Cam extends EventEmitter { get serviceCapabilities() { return this.onvif.device.serviceCapabilities; } get deviceInformation() { return this.onvif.deviceInformation; } get nodes() { return this.onvif.ptz.nodes; } + get configurations() { return this.onvif.ptz.configurations; } connect(callback: Callback) { this.onvif.connect().then((result) => callback(null, result)).catch(callback); @@ -74,7 +77,8 @@ export class Cam extends EventEmitter { } getServiceCapabilities(callback: Callback) { - this.onvif.device.getServiceCapabilities().then((result) => callback(null, result)).catch(callback); + this.onvif.device.getServiceCapabilities() + .then((result) => callback(null, result)).catch(callback); } getActiveSources(callback: Callback) { @@ -88,20 +92,24 @@ export class Cam extends EventEmitter { } getServices(includeCapability: boolean, callback: Callback) { - this.onvif.device.getServices(includeCapability).then((result) => callback(null, result)).catch(callback); + this.onvif.device.getServices(includeCapability) + .then((result) => callback(null, result)).catch(callback); } getDeviceInformation(callback: Callback) { - this.onvif.device.getDeviceInformation().then((result) => callback(null, result)).catch(callback); + this.onvif.device.getDeviceInformation() + .then((result) => callback(null, result)).catch(callback); } getStreamUri(options: GetStreamUriOptions, callback: Callback): void getStreamUri(callback: Callback): void getStreamUri(options: GetStreamUriOptions | Callback, callback?: Callback) { if (callback) { - this.onvif.media.getStreamUri(options as GetStreamUriOptions).then((result) => callback(null, result)).catch(callback); + this.onvif.media.getStreamUri(options as GetStreamUriOptions) + .then((result) => callback(null, result)).catch(callback); } - this.onvif.media.getStreamUri().then((result) => (options as Callback)(null, result)).catch(options as Callback); + this.onvif.media.getStreamUri() + .then((result) => (options as Callback)(null, result)).catch(options as Callback); } getSnapshotUri(options: GetSnapshotUriOptions, callback: Callback): void @@ -118,4 +126,17 @@ export class Cam extends EventEmitter { getNodes(callback: Callback) { this.onvif.ptz.getNodes().then((result) => callback(null, result)).catch(callback); } + + getConfigurations(callback: Callback) { + this.onvif.ptz.getConfigurations().then((result) => callback(null, result)).catch(callback); + } + + getConfigurationOptions(configurationToken: ReferenceToken, callback: Callback) { + this.onvif.ptz.getConfigurationOptions({ configurationToken }) + .then((result) => callback(null, result)).catch(callback); + } + + systemReboot(callback: Callback) { + this.onvif.device.systemReboot().then((result) => callback(null, result)).catch(callback); + } } diff --git a/src/media.ts b/src/media.ts index 518e2617..248e74ef 100644 --- a/src/media.ts +++ b/src/media.ts @@ -292,19 +292,23 @@ export interface VideoAnalyticsConfiguration { ruleEngineConfiguration: RuleEngineConfiguration; } +export interface Vector2D { + x: number; + y: number; +} + +export interface Vector1D { + x: number; +} + export interface PTZSpeed { /** * Pan and tilt speed. The x component corresponds to pan and the y component to tilt. * If omitted in a request, the current (if any) PanTilt movement should not be affected */ - panTilt: { - x: number; - y: number; - }; + panTilt: Vector2D; /** A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected */ - zoom: { - x: number; - } + zoom: Vector1D; } export interface Range { @@ -368,11 +372,11 @@ export interface PTZConfiguration { */ useCount: number; /** The optional acceleration ramp used by the device when moving */ - moveRamp: number; + moveRamp?: number; /** The optional acceleration ramp used by the device when recalling presets */ - presetRamp: number; + presetRamp?: number; /** The optional acceleration ramp used by the device when executing PresetTours */ - presetTourRamp: number; + presetTourRamp?: number; /** A mandatory reference to the PTZ Node that the PTZ Configuration belongs to */ nodeToken: string; /** If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default */ diff --git a/src/onvif.ts b/src/onvif.ts index a1fc703b..7aeacad8 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -38,7 +38,7 @@ export interface OnvifOptions { } export interface OnvifServices { - ptz?: URL; + PTZ?: URL; analyticsDevice?: URL; device?: URL; deviceIO?: URL; diff --git a/src/ptz.ts b/src/ptz.ts index 7e38e53b..ba15a6a5 100644 --- a/src/ptz.ts +++ b/src/ptz.ts @@ -1,6 +1,8 @@ import { Onvif, ReferenceToken } from './onvif'; import { linerase } from './utils'; -import { Space1DDescription, Space2DDescription } from './media'; +import { + Duration, PTZConfiguration, Space1DDescription, Space2DDescription, +} from './media'; interface PTZPresetTourSupported { /** Indicates number of preset tours that can be created. Required preset tour operations shall be available for this @@ -21,7 +23,7 @@ export interface PTZNode { name?: string; /** A list of Coordinate Systems available for the PTZ Node. For each Coordinate System, the PTZ Node MUST specify * its allowed range */ - ptzSpaces: PTZSpace[]; + supportedPTZSpaces: PTZSpace[]; /** All preset operations MUST be available for this PTZ Node if one preset is supported */ maximumNumberOfPresets: number; /** A boolean operator specifying the availability of a home position. If set to true, the Home Position Operations @@ -80,6 +82,40 @@ export interface PTZSpace { type ResponsePTZNode = PTZNode & {$?: ReferenceToken}; +interface DurationRange { + min: Duration; + max: Duration; +} + +interface PTControlDirectionOptions { + /** Supported options for EFlip feature */ + EFlip?: { + /** Options of EFlip mode parameter */ + mode?: 'OFF' | 'ON' | 'Extended' + extension?: any; + }; + /** Supported options for Reverse feature */ + reverse?: { + /** Options of Reverse mode parameter */ + mode?: 'OFF' | 'ON' | 'AUTO' | 'Extended' + extension?: any; + }; +} + +/** The requested PTZ configuration options */ +interface PTZConfigurationOptions { + /** The list of acceleration ramps supported by the device. The smallest acceleration value corresponds to the minimal + * index, the highest acceleration corresponds to the maximum index */ + PTZRamps: number[]; + /** A list of supported coordinate systems including their range limitations */ + spaces: PTZSpace[]; + /** A timeout Range within which Timeouts are accepted by the PTZ Node */ + PTZTimeout: DurationRange; + /** Supported options for PT Direction Control */ + PTControlDirection?: PTControlDirectionOptions + extension: any; +} + /** * PTZ methods */ @@ -89,6 +125,10 @@ export class PTZ { get nodes() { return this.#nodes; } + #configurations: Record = {}; + get configurations() { + return this.#configurations; + } constructor(onvif: Onvif) { this.onvif = onvif; @@ -100,7 +140,7 @@ export class PTZ { */ async getNodes() { const [data] = await this.onvif.request({ - service : 'ptz', + service : 'PTZ', body : '', }); this.#nodes = {}; @@ -110,4 +150,43 @@ export class PTZ { }); return this.#nodes; } + + /** + * Get an array with all the existing PTZConfigurations from the device + */ + async getConfigurations() { + const [data] = await this.onvif.request({ + service : 'PTZ', + body : '' + + '', + }); + this.#configurations = {}; + if (!Array.isArray(data[0].getConfigurationsResponse[0].PTZConfiguration)) { + return this.#configurations; + } + data[0].getConfigurationsResponse[0].PTZConfiguration.forEach((configuration: any) => { + const result = linerase(configuration); + this.#configurations[result.token] = result; + }); + return this.#configurations; + } + + /** + * List supported coordinate systems including their range limitations. + * Therefore, the options MAY differ depending on whether the PTZ Configuration is assigned to a Profile containing + * a Video Source Configuration. In that case, the options may additionally contain coordinate systems referring to + * the image coordinate system described by the Video Source Configuration. If the PTZ Node supports continuous + * movements, it shall return a Timeout Range within which Timeouts are accepted by the PTZ Node + * @param configurationToken Token of an existing configuration that the options are intended for + */ + async getConfigurationOptions({ configurationToken }: { configurationToken: ReferenceToken }): + Promise { + const [data] = await this.onvif.request({ + service : 'PTZ', + body : '' + + `${configurationToken}` + + '', + }); + return linerase(data); + } } diff --git a/src/test.ts b/src/test.ts index 16cbcdb3..7a6d1d40 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,4 +1,4 @@ -import { Onvif, Discovery } from './index'; +import { Onvif, Discovery, Profile } from './index'; // eslint-disable-next-line @typescript-eslint/no-var-requires const serverMockup = require('../test/serverMockup'); @@ -17,9 +17,11 @@ const serverMockup = require('../test/serverMockup'); const profiles = await cam.media.getProfiles(); console.log((await cam.device.getDeviceInformation()).firmwareVersion); console.log((await cam.device.getHostname())); + // console.log(((await cam.media.getProfiles())[0] as Profile).PTZConfiguration); + console.log(await cam.ptz.getConfigurations()); + console.log(await cam.device.systemReboot()); // console.log(profiles); // Discovery.on('device', console.log); // const cams = await Discovery.probe({ timeout : 1000 }); // console.log(cams); - serverMockup.close(); -})().catch(console.error); +})().catch(console.error).finally(serverMockup.close); diff --git a/src/utils.ts b/src/utils.ts index 8c3786a5..e328d7ff 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -12,7 +12,6 @@ export function linerase(xml: any): any { if (xml.length > 1) { return xml.map(linerase); } - // eslint-disable-next-line no-param-reassign [xml] = xml; } if (typeof xml === 'object') { From f6ebe0ff241004f5bf040b7ee813b3c8b90c3590 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Thu, 13 Oct 2022 15:31:11 +0300 Subject: [PATCH 060/112] Add `getPresets`, method --- IMPLEMENTED.md | 2 +- legacyTest/common.js | 18 +- legacyTest/ptz.js | 197 ++++++++++++++++++ legacyTest/serverMockup/GetConfigurations.xml | 20 +- src/legacy/cam.ts | 24 +++ src/ptz.ts | 49 ++++- 6 files changed, 302 insertions(+), 8 deletions(-) create mode 100644 legacyTest/ptz.js diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md index bd43b71a..dd54df14 100644 --- a/IMPLEMENTED.md +++ b/IMPLEMENTED.md @@ -55,7 +55,7 @@ - [ ] getNTP - [ ] getOSDOptions - [ ] getOSDs -- [ ] getPresets +- [x] getPresets - [ ] getProfiles - [ ] getRecordings - [ ] getReplayUri diff --git a/legacyTest/common.js b/legacyTest/common.js index 51ff7e1c..6c41724c 100644 --- a/legacyTest/common.js +++ b/legacyTest/common.js @@ -1,3 +1,4 @@ +/* eslint-disable no-return-assign, no-new, no-unused-vars, global-require, import/no-useless-path-segments */ const synthTest = !process.env.HOSTNAME; const assert = require('assert'); @@ -5,7 +6,6 @@ const onvif = require('../build/legacy/cam'); let serverMockup; if (synthTest) { - // eslint-disable-next-line import/no-useless-path-segments,global-require serverMockup = require('../legacyTest/serverMockup'); } @@ -410,10 +410,23 @@ describe('Common functions', () => { cam.getConfigurations((err, data) => { assert.strictEqual(err, null); assert.ok(typeof data === 'object'); + assert.ok(Object.keys(data).every((confName) => typeof data[confName] === 'object')); assert.deepStrictEqual(cam.configurations, data); done(); }); }); + if (synthTest) { + it('should work with one configuration', (done) => { + serverMockup.conf.one = true; + cam.getConfigurations((err, data) => { + assert.strictEqual(err, null); + assert.ok(typeof data === 'object'); + assert.ok(Object.keys(data).every((confName) => typeof data[confName] === 'object')); + delete serverMockup.conf.one; + done(); + }); + }); + } }); describe('getConfigurationOptions', () => { @@ -424,7 +437,8 @@ describe('Common functions', () => { cam.getConfigurationOptions(token, (err, data) => { assert.strictEqual(err, null); assert.ok(typeof data === 'object'); - if (!--cou) { + cou -= 1; + if (!cou) { done(); } }); diff --git a/legacyTest/ptz.js b/legacyTest/ptz.js new file mode 100644 index 00000000..c64e0bad --- /dev/null +++ b/legacyTest/ptz.js @@ -0,0 +1,197 @@ +/* eslint-disable no-return-assign, no-new, no-unused-vars, global-require, import/no-useless-path-segments */ +const synthTest = !process.env.HOSTNAME; + +const assert = require('assert'); +const onvif = require('../build/legacy/cam'); + +let serverMockup; +if (synthTest) { + serverMockup = require('../legacyTest/serverMockup'); +} + +describe('PTZ', () => { + let cam = null; + before(done => { + serverMockup.start((err) => { + assert.equal(err, null); + const options = { + hostname : process.env.HOSTNAME || 'localhost', + username : process.env.USERNAME || 'admin', + password : process.env.PASSWORD || '9999', + port : process.env.PORT ? parseInt(process.env.PORT, 10) : 10101, + }; + cam = new onvif.Cam(options, done); + }) + }); + + after(done => { + if (synthTest) { + serverMockup.close(); + done(); + } + }); + + describe('getPresets', () => { + it('should return array of preset objects and sets them to #presets', (done) => { + cam.getPresets({}, (err, data) => { + assert.deepEqual(err, null); + assert.ok(Object.keys(data).every((presetName) => typeof data[presetName] === 'string')); + done(); + }); + }); + it('should return array of preset objects and sets them to #presets without options', (done) => { + cam.getPresets((err, data) => { + assert.strictEqual(err, null); + assert.ok(Object.keys(data).every((presetName) => typeof data[presetName] === 'string')); + done(); + }); + }); + if (synthTest) { + it('should work with one preset', (done) => { + serverMockup.conf.one = true; + cam.getPresets((err, data) => { + assert.strictEqual(err, null); + assert.ok(Object.keys(data).every((presetName) => typeof data[presetName] === 'string')); + delete serverMockup.conf.one; + done(); + }); + }); + } + }); + + describe('gotoPreset', () => { + it('should just run', (done) => { + cam.gotoPreset({preset : Object.keys(cam.profiles)[0]}, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + it('should run with speed definition', (done) => { + cam.gotoPreset({preset : Object.keys(cam.profiles)[0], speed : 0.1}, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + }); + + describe('setPreset', () => { + it('should run with preset name (new)', (done) => { + cam.setPreset({presetName : 'testPreset'}, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + it('should run with preset token (update)', (done) => { + cam.setPreset({presetToken : 1}, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + }); + + describe('removePreset', () => { + it('should just run', (done) => { + cam.removePreset({presetToken : Object.keys(cam.profiles)[0]}, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + }); + + describe('gotoHomePosition', () => { + it('should just run', (done) => { + cam.gotoHomePosition({speed : {x : 1.0, y : 1.0, zoom : 1.0}}, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + }); + + describe('setHomePosition', () => { + it('should just run', (done) => { + cam.setHomePosition({}, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + }); + + describe('absolute move', () => { + it('should returns empty RelativeResponseObject', (done) => { + cam.absoluteMove({ + x : 1, + y : 1, + zoom : 1, + }, done); + }); + it('should works without callback', () => { + cam.absoluteMove({ + x : 0, + y : 0, + zoom : 1, + }); + }); + }); + + describe('relative move', () => { + it('should returns empty RelativeResponseObject', (done) => { + cam.relativeMove({ + speed : { + x : 0.1, + y : 0.1, + }, + x : 1, + y : 1, + zoom : 1, + }, done); + }); + it('should works without callback', () => { + cam.relativeMove({ + speed : { + x : 0.1, + y : 0.1, + }, + x : 1, + y : 1, + zoom : 1, + }); + }); + }); + + describe('continuous move', () => { + it('should returns empty ContinuousResponseObject', (done) => { + cam.continuousMove({ + x : 0.1, + y : 0.1, + zoom : 0, + }, done); + }); + it('should set omitted pan-tilt parameters to zero', (done) => { + cam.continuousMove({ + x : 0.1, + zoom : 0, + }, done); + }); + }); + + describe('stop', () => { + it('should stop all movements when options are ommited', (done) => cam.stop(done)); + it('should stop only zoom movement', (done) => cam.stop({zoom : true}, done)); + it('should stop only pan-tilt movement', (done) => cam.stop({panTilt : true}, done)); + it('should stop all movements', (done) => cam.stop({zoom : true, panTilt : true}, done)); + it('should work without callback', (done) => { + cam.stop({}); + cam.stop(); + done(); + }); + }); + + describe('getStatus', () => { + it('should returns position status', (done) => { + cam.getStatus({}, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + }); +}); diff --git a/legacyTest/serverMockup/GetConfigurations.xml b/legacyTest/serverMockup/GetConfigurations.xml index ad31b42f..e5901abd 100644 --- a/legacyTest/serverMockup/GetConfigurations.xml +++ b/legacyTest/serverMockup/GetConfigurations.xml @@ -27,6 +27,24 @@ PT1093754.348S + {{? !it.one }} + + zzz + 1 + default + http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace + http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace + http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace + http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace + http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace + http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace + + + + + PT1093754.348S + + {{?}} - \ No newline at end of file + diff --git a/src/legacy/cam.ts b/src/legacy/cam.ts index ef1dd458..5a178aad 100644 --- a/src/legacy/cam.ts +++ b/src/legacy/cam.ts @@ -7,6 +7,7 @@ import { Onvif, OnvifRequestOptions, ReferenceToken, SetSystemDateAndTimeOptions, } from '../onvif'; import { GetSnapshotUriOptions, GetStreamUriOptions } from '../media'; +import { GetPresetsOptions } from '../ptz'; type Callback = (error: any, result?: any) => void; @@ -40,6 +41,10 @@ export class Cam extends EventEmitter { get deviceInformation() { return this.onvif.deviceInformation; } get nodes() { return this.onvif.ptz.nodes; } get configurations() { return this.onvif.ptz.configurations; } + get presets() { + return Object.fromEntries(Object.values(this.onvif.ptz.presets) + .map((preset) => [preset.name, preset.token])); + } connect(callback: Callback) { this.onvif.connect().then((result) => callback(null, result)).catch(callback); @@ -139,4 +144,23 @@ export class Cam extends EventEmitter { systemReboot(callback: Callback) { this.onvif.device.systemReboot().then((result) => callback(null, result)).catch(callback); } + + getPresets(options: GetPresetsOptions, callback: Callback): void + getPresets(callback: Callback): void + getPresets(options: GetPresetsOptions | Callback, callback?: Callback) { + if (callback) { + this.onvif.ptz.getPresets(options as GetPresetsOptions) + .then((result) => callback( + null, + Object.fromEntries(Object.values(result).map((preset) => [preset.name, preset.token])), + )) + .catch(callback); + } + this.onvif.ptz.getPresets() + .then((result) => (options as Callback)( + null, + Object.fromEntries(Object.values(result).map((preset) => [preset.name, preset.token])), + )) + .catch(options as Callback); + } } diff --git a/src/ptz.ts b/src/ptz.ts index ba15a6a5..cd32118b 100644 --- a/src/ptz.ts +++ b/src/ptz.ts @@ -1,7 +1,7 @@ import { Onvif, ReferenceToken } from './onvif'; import { linerase } from './utils'; import { - Duration, PTZConfiguration, Space1DDescription, Space2DDescription, + Duration, PTZConfiguration, Space1DDescription, Space2DDescription, Vector1D, Vector2D, } from './media'; interface PTZPresetTourSupported { @@ -82,12 +82,12 @@ export interface PTZSpace { type ResponsePTZNode = PTZNode & {$?: ReferenceToken}; -interface DurationRange { +export interface DurationRange { min: Duration; max: Duration; } -interface PTControlDirectionOptions { +export interface PTControlDirectionOptions { /** Supported options for EFlip feature */ EFlip?: { /** Options of EFlip mode parameter */ @@ -103,7 +103,7 @@ interface PTControlDirectionOptions { } /** The requested PTZ configuration options */ -interface PTZConfigurationOptions { +export interface PTZConfigurationOptions { /** The list of acceleration ramps supported by the device. The smallest acceleration value corresponds to the minimal * index, the highest acceleration corresponds to the maximum index */ PTZRamps: number[]; @@ -116,6 +116,26 @@ interface PTZConfigurationOptions { extension: any; } +export interface GetPresetsOptions { + profileToken?: ReferenceToken; +} + +export interface PTZVector { + /** Pan and tilt position. The x component corresponds to pan and the y component to tilt. */ + panTilt: Vector2D; + /** A zoom position. */ + zoom: Vector1D; +} + +/** A list of presets which are available for the requested MediaProfile. */ +export interface PTZPreset { + token: ReferenceToken; + /** A list of preset position name */ + name?: string; + /** A list of preset position */ + PTZPosition?: PTZVector; +} + /** * PTZ methods */ @@ -129,6 +149,10 @@ export class PTZ { get configurations() { return this.#configurations; } + #presets: Record = {}; + get presets() { + return this.#presets; + } constructor(onvif: Onvif) { this.onvif = onvif; @@ -189,4 +213,21 @@ export class PTZ { }); return linerase(data); } + + async getPresets({ profileToken }: GetPresetsOptions = {}) { + const [data] = await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken || this.onvif.activeSource!.profileToken}` + + '', + }); + this.#presets = {}; + const result = linerase(data[0].getPresetsResponse[0].preset); + if (Array.isArray(result)) { + linerase(result).forEach((preset: any) => this.#presets[preset.token] = preset); + } else { + this.#presets[result.token] = result; + } + return this.#presets; + } } From 92c353691306587d9f1ba6171fdb231ecad331d3 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 15 Oct 2022 20:35:47 +0300 Subject: [PATCH 061/112] Add `gotoPreset`, `setPreset` methods --- .eslintrc.js | 3 +- .mocharc.js | 4 +- IMPLEMENTED.md | 4 +- {legacyTest => compatibilityTest}/common.js | 2 +- {legacyTest => compatibilityTest}/ptz.js | 26 ++-- .../serverMockup.js | 0 .../serverMockup/Error.xml | 0 .../serverMockup/GetCapabilities.xml | 0 .../serverMockup/GetCapabilitiesEncoder.xml | 0 .../serverMockup/GetConfigurationOptions.xml | 0 .../serverMockup/GetConfigurations.xml | 0 .../serverMockup/GetDeviceInformation.xml | 0 .../serverMockup/GetEventProperties.xml | 0 .../serverMockup/GetHostname.xml | 0 .../serverMockup/GetNodes.xml | 0 .../serverMockup/GetProfiles.xml | 0 .../serverMockup/GetScopes.xml | 0 .../serverMockup/GetServiceCapabilities.xml | 0 .../serverMockup/GetServices.xml | 0 .../serverMockup/GetSnapshotUri.xml | 0 .../serverMockup/GetStatus.xml | 0 .../serverMockup/GetStreamUri.xml | 0 .../serverMockup/GetSystemDateAndTime.xml | 0 .../GetVideoSourceConfigurations.xml | 0 .../serverMockup/GetVideoSourcesEncoder.xml | 0 .../serverMockup/Probe.xml | 0 .../serverMockup/PullMessages.xml | 0 .../serverMockup/SetScopes.xml | 0 .../serverMockup/SetSystemDateAndTime.xml | 0 .../serverMockup/SystemReboot.xml | 0 .../serverMockup/Unsubscribe.xml | 0 .../serverMockup/device.CreateUsers.xml | 0 .../serverMockup/device.DeleteUsers.xml | 0 .../serverMockup/device.GetDNS.xml | 0 .../serverMockup/device.GetNTP.xml | 0 .../device.GetNetworkDefaultGateway.xml | 0 .../device.GetNetworkInterfaces.xml | 0 .../serverMockup/device.GetUsers.xml | 0 .../device.GetZeroConfiguration.xml | 0 .../serverMockup/device.SetDNS.xml | 0 .../serverMockup/device.SetNTP.xml | 0 .../device.SetNetworkDefaultGateway.xml | 0 .../device.SetNetworkInterfaces.xml | 0 .../device.SetSystemFactoryDefault.xml | 0 .../serverMockup/device.SetUser.xml | 0 .../events.CreatePullPointSubscription.xml | 0 .../events.GetServiceCapabilities.xml | 0 .../serverMockup/imaging.GetCurrentPreset.xml | 0 .../imaging.GetImagingSettings.xml | 0 .../serverMockup/imaging.GetOptions.xml | 0 .../imaging.GetServiceCapabilities.xml | 0 .../serverMockup/imaging.SetCurrentPreset.xml | 0 .../imaging.SetImagingSettings.xml | 0 .../media.AddAudioEncoderConfiguration.xml | 0 .../media.AddAudioSourceConfiguration.xml | 0 .../media.AddVideoEncoderConfiguration.xml | 0 .../media.AddVideoSourceConfiguration.xml | 0 .../serverMockup/media.CreateProfile.xml | 0 .../serverMockup/media.DeleteProfile.xml | 0 .../media.GetAudioEncoderConfiguration.xml | 0 ...ia.GetAudioEncoderConfigurationOptions.xml | 0 .../media.GetAudioEncoderConfigurations.xml | 0 .../serverMockup/media.GetAudioSources.xml | 0 .../serverMockup/media.GetOSDOptions | 0 .../media.GetServiceCapabilities.xml | 0 .../media.GetVideoEncoderConfiguration.xml | 0 ...ia.GetVideoEncoderConfigurationOptions.xml | 0 .../media.GetVideoEncoderConfigurations.xml | 0 .../serverMockup/media.GetVideoSources.xml | 0 .../media.RemoveAudioEncoderConfiguration.xml | 0 .../media.RemoveAudioSourceConfiguration.xml | 0 .../media.SetAudioEncoderConfiguration.xml | 0 .../media.SetVideoEncoderConfiguration.xml | 0 .../serverMockup/ptz.AbsoluteMove.xml | 0 .../serverMockup/ptz.ContinuousMove.xml | 0 .../serverMockup/ptz.GetPresets.xml | 0 .../serverMockup/ptz.GotoHomePosition.xml | 0 .../serverMockup/ptz.GotoPreset.xml | 0 .../serverMockup/ptz.RelativeMove.xml | 0 .../serverMockup/ptz.RemovePreset.xml | 0 .../serverMockup/ptz.SetHomePosition.xml | 0 .../serverMockup/ptz.SetPreset.xml | 0 .../serverMockup/ptz.Stop.xml | 0 package-lock.json | 4 +- src/{legacy => compatibility}/cam.ts | 10 +- src/ptz.ts | 117 ++++++++++++++++-- 86 files changed, 138 insertions(+), 32 deletions(-) rename {legacyTest => compatibilityTest}/common.js (99%) rename {legacyTest => compatibilityTest}/ptz.js (85%) rename {legacyTest => compatibilityTest}/serverMockup.js (100%) rename {legacyTest => compatibilityTest}/serverMockup/Error.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetCapabilities.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetCapabilitiesEncoder.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetConfigurationOptions.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetConfigurations.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetDeviceInformation.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetEventProperties.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetHostname.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetNodes.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetProfiles.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetScopes.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetServiceCapabilities.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetServices.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetSnapshotUri.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetStatus.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetStreamUri.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetSystemDateAndTime.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetVideoSourceConfigurations.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/GetVideoSourcesEncoder.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/Probe.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/PullMessages.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/SetScopes.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/SetSystemDateAndTime.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/SystemReboot.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/Unsubscribe.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.CreateUsers.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.DeleteUsers.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.GetDNS.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.GetNTP.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.GetNetworkDefaultGateway.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.GetNetworkInterfaces.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.GetUsers.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.GetZeroConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.SetDNS.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.SetNTP.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.SetNetworkDefaultGateway.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.SetNetworkInterfaces.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.SetSystemFactoryDefault.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/device.SetUser.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/events.CreatePullPointSubscription.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/events.GetServiceCapabilities.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/imaging.GetCurrentPreset.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/imaging.GetImagingSettings.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/imaging.GetOptions.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/imaging.GetServiceCapabilities.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/imaging.SetCurrentPreset.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/imaging.SetImagingSettings.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.AddAudioEncoderConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.AddAudioSourceConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.AddVideoEncoderConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.AddVideoSourceConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.CreateProfile.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.DeleteProfile.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.GetAudioEncoderConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.GetAudioEncoderConfigurationOptions.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.GetAudioEncoderConfigurations.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.GetAudioSources.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.GetOSDOptions (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.GetServiceCapabilities.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.GetVideoEncoderConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.GetVideoEncoderConfigurationOptions.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.GetVideoEncoderConfigurations.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.GetVideoSources.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.RemoveAudioEncoderConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.RemoveAudioSourceConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.SetAudioEncoderConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/media.SetVideoEncoderConfiguration.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/ptz.AbsoluteMove.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/ptz.ContinuousMove.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/ptz.GetPresets.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/ptz.GotoHomePosition.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/ptz.GotoPreset.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/ptz.RelativeMove.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/ptz.RemovePreset.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/ptz.SetHomePosition.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/ptz.SetPreset.xml (100%) rename {legacyTest => compatibilityTest}/serverMockup/ptz.Stop.xml (100%) rename src/{legacy => compatibility}/cam.ts (93%) diff --git a/.eslintrc.js b/.eslintrc.js index 883ca405..6a4884c8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -26,7 +26,8 @@ const commonRules = { on : 'colon', }, }], - 'import/no-cycle' : 0, // IMPORTANT + '@typescript-eslint/member-delimiter-style' : 1, + 'import/no-cycle' : 0, // IMPORTANT }; module.exports = { diff --git a/.mocharc.js b/.mocharc.js index 790c8a51..b3ec7654 100644 --- a/.mocharc.js +++ b/.mocharc.js @@ -1,4 +1,4 @@ module.exports = { - 'spec': 'legacyTest/*.js', - 'exclude': 'legacyTest/serverMockup.js' + 'spec': 'compatibilityTest/*.js', + 'exclude': 'compatibilityTest/serverMockup.js' }; diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md index dd54df14..c8687bd2 100644 --- a/IMPLEMENTED.md +++ b/IMPLEMENTED.md @@ -75,7 +75,7 @@ - [ ] getVideoSourceOptions - [ ] getVideoSources - [ ] gotoHomePosition -- [ ] gotoPreset +- [x] gotoPreset - [ ] pullMessages - [ ] relativeMove - [ ] removeAudioEncoderConfiguration @@ -91,7 +91,7 @@ - [ ] setNetworkInterfaces - [ ] setNTP - [ ] setOSD -- [ ] setPreset +- [x] setPreset - [x] setScopes - [x] setSystemDateAndTime - [ ] setSystemFactoryDefault diff --git a/legacyTest/common.js b/compatibilityTest/common.js similarity index 99% rename from legacyTest/common.js rename to compatibilityTest/common.js index 6c41724c..b9d164e2 100644 --- a/legacyTest/common.js +++ b/compatibilityTest/common.js @@ -6,7 +6,7 @@ const onvif = require('../build/legacy/cam'); let serverMockup; if (synthTest) { - serverMockup = require('../legacyTest/serverMockup'); + serverMockup = require('../compatibilityTest/serverMockup'); } describe('Common functions', () => { diff --git a/legacyTest/ptz.js b/compatibilityTest/ptz.js similarity index 85% rename from legacyTest/ptz.js rename to compatibilityTest/ptz.js index c64e0bad..3e65f463 100644 --- a/legacyTest/ptz.js +++ b/compatibilityTest/ptz.js @@ -2,11 +2,11 @@ const synthTest = !process.env.HOSTNAME; const assert = require('assert'); -const onvif = require('../build/legacy/cam'); +const onvif = require('../build/compatibility/cam'); let serverMockup; if (synthTest) { - serverMockup = require('../legacyTest/serverMockup'); + serverMockup = require('../compatibilityTest/serverMockup'); } describe('PTZ', () => { @@ -61,29 +61,31 @@ describe('PTZ', () => { describe('gotoPreset', () => { it('should just run', (done) => { - cam.gotoPreset({preset : Object.keys(cam.profiles)[0]}, (err) => { - assert.strictEqual(err, null); - done(); - }); + cam.gotoPreset({preset : Object.keys(cam.profiles)[0]}, done); }); it('should run with speed definition', (done) => { - cam.gotoPreset({preset : Object.keys(cam.profiles)[0], speed : 0.1}, (err) => { - assert.strictEqual(err, null); - done(); - }); + cam.gotoPreset({preset : Object.keys(cam.profiles)[0], speed : {pan : 0.1}}, done); + }); + it('should run with speed definition', (done) => { + cam.gotoPreset({preset : Object.keys(cam.profiles)[0], speed : {x : 0.1}}, done); + }); + it('should run with speed definition', (done) => { + cam.gotoPreset({preset : Object.keys(cam.profiles)[0], speed : {panTilt : {x : 0.1}}}, done); }); }); describe('setPreset', () => { it('should run with preset name (new)', (done) => { - cam.setPreset({presetName : 'testPreset'}, (err) => { + cam.setPreset({presetName : 'testPreset'}, (err, response) => { assert.strictEqual(err, null); + assert.ok(response.presetToken !== undefined); done(); }); }); it('should run with preset token (update)', (done) => { - cam.setPreset({presetToken : 1}, (err) => { + cam.setPreset({presetToken : 1}, (err, response) => { assert.strictEqual(err, null); + assert.ok(response.presetToken !== undefined); done(); }); }); diff --git a/legacyTest/serverMockup.js b/compatibilityTest/serverMockup.js similarity index 100% rename from legacyTest/serverMockup.js rename to compatibilityTest/serverMockup.js diff --git a/legacyTest/serverMockup/Error.xml b/compatibilityTest/serverMockup/Error.xml similarity index 100% rename from legacyTest/serverMockup/Error.xml rename to compatibilityTest/serverMockup/Error.xml diff --git a/legacyTest/serverMockup/GetCapabilities.xml b/compatibilityTest/serverMockup/GetCapabilities.xml similarity index 100% rename from legacyTest/serverMockup/GetCapabilities.xml rename to compatibilityTest/serverMockup/GetCapabilities.xml diff --git a/legacyTest/serverMockup/GetCapabilitiesEncoder.xml b/compatibilityTest/serverMockup/GetCapabilitiesEncoder.xml similarity index 100% rename from legacyTest/serverMockup/GetCapabilitiesEncoder.xml rename to compatibilityTest/serverMockup/GetCapabilitiesEncoder.xml diff --git a/legacyTest/serverMockup/GetConfigurationOptions.xml b/compatibilityTest/serverMockup/GetConfigurationOptions.xml similarity index 100% rename from legacyTest/serverMockup/GetConfigurationOptions.xml rename to compatibilityTest/serverMockup/GetConfigurationOptions.xml diff --git a/legacyTest/serverMockup/GetConfigurations.xml b/compatibilityTest/serverMockup/GetConfigurations.xml similarity index 100% rename from legacyTest/serverMockup/GetConfigurations.xml rename to compatibilityTest/serverMockup/GetConfigurations.xml diff --git a/legacyTest/serverMockup/GetDeviceInformation.xml b/compatibilityTest/serverMockup/GetDeviceInformation.xml similarity index 100% rename from legacyTest/serverMockup/GetDeviceInformation.xml rename to compatibilityTest/serverMockup/GetDeviceInformation.xml diff --git a/legacyTest/serverMockup/GetEventProperties.xml b/compatibilityTest/serverMockup/GetEventProperties.xml similarity index 100% rename from legacyTest/serverMockup/GetEventProperties.xml rename to compatibilityTest/serverMockup/GetEventProperties.xml diff --git a/legacyTest/serverMockup/GetHostname.xml b/compatibilityTest/serverMockup/GetHostname.xml similarity index 100% rename from legacyTest/serverMockup/GetHostname.xml rename to compatibilityTest/serverMockup/GetHostname.xml diff --git a/legacyTest/serverMockup/GetNodes.xml b/compatibilityTest/serverMockup/GetNodes.xml similarity index 100% rename from legacyTest/serverMockup/GetNodes.xml rename to compatibilityTest/serverMockup/GetNodes.xml diff --git a/legacyTest/serverMockup/GetProfiles.xml b/compatibilityTest/serverMockup/GetProfiles.xml similarity index 100% rename from legacyTest/serverMockup/GetProfiles.xml rename to compatibilityTest/serverMockup/GetProfiles.xml diff --git a/legacyTest/serverMockup/GetScopes.xml b/compatibilityTest/serverMockup/GetScopes.xml similarity index 100% rename from legacyTest/serverMockup/GetScopes.xml rename to compatibilityTest/serverMockup/GetScopes.xml diff --git a/legacyTest/serverMockup/GetServiceCapabilities.xml b/compatibilityTest/serverMockup/GetServiceCapabilities.xml similarity index 100% rename from legacyTest/serverMockup/GetServiceCapabilities.xml rename to compatibilityTest/serverMockup/GetServiceCapabilities.xml diff --git a/legacyTest/serverMockup/GetServices.xml b/compatibilityTest/serverMockup/GetServices.xml similarity index 100% rename from legacyTest/serverMockup/GetServices.xml rename to compatibilityTest/serverMockup/GetServices.xml diff --git a/legacyTest/serverMockup/GetSnapshotUri.xml b/compatibilityTest/serverMockup/GetSnapshotUri.xml similarity index 100% rename from legacyTest/serverMockup/GetSnapshotUri.xml rename to compatibilityTest/serverMockup/GetSnapshotUri.xml diff --git a/legacyTest/serverMockup/GetStatus.xml b/compatibilityTest/serverMockup/GetStatus.xml similarity index 100% rename from legacyTest/serverMockup/GetStatus.xml rename to compatibilityTest/serverMockup/GetStatus.xml diff --git a/legacyTest/serverMockup/GetStreamUri.xml b/compatibilityTest/serverMockup/GetStreamUri.xml similarity index 100% rename from legacyTest/serverMockup/GetStreamUri.xml rename to compatibilityTest/serverMockup/GetStreamUri.xml diff --git a/legacyTest/serverMockup/GetSystemDateAndTime.xml b/compatibilityTest/serverMockup/GetSystemDateAndTime.xml similarity index 100% rename from legacyTest/serverMockup/GetSystemDateAndTime.xml rename to compatibilityTest/serverMockup/GetSystemDateAndTime.xml diff --git a/legacyTest/serverMockup/GetVideoSourceConfigurations.xml b/compatibilityTest/serverMockup/GetVideoSourceConfigurations.xml similarity index 100% rename from legacyTest/serverMockup/GetVideoSourceConfigurations.xml rename to compatibilityTest/serverMockup/GetVideoSourceConfigurations.xml diff --git a/legacyTest/serverMockup/GetVideoSourcesEncoder.xml b/compatibilityTest/serverMockup/GetVideoSourcesEncoder.xml similarity index 100% rename from legacyTest/serverMockup/GetVideoSourcesEncoder.xml rename to compatibilityTest/serverMockup/GetVideoSourcesEncoder.xml diff --git a/legacyTest/serverMockup/Probe.xml b/compatibilityTest/serverMockup/Probe.xml similarity index 100% rename from legacyTest/serverMockup/Probe.xml rename to compatibilityTest/serverMockup/Probe.xml diff --git a/legacyTest/serverMockup/PullMessages.xml b/compatibilityTest/serverMockup/PullMessages.xml similarity index 100% rename from legacyTest/serverMockup/PullMessages.xml rename to compatibilityTest/serverMockup/PullMessages.xml diff --git a/legacyTest/serverMockup/SetScopes.xml b/compatibilityTest/serverMockup/SetScopes.xml similarity index 100% rename from legacyTest/serverMockup/SetScopes.xml rename to compatibilityTest/serverMockup/SetScopes.xml diff --git a/legacyTest/serverMockup/SetSystemDateAndTime.xml b/compatibilityTest/serverMockup/SetSystemDateAndTime.xml similarity index 100% rename from legacyTest/serverMockup/SetSystemDateAndTime.xml rename to compatibilityTest/serverMockup/SetSystemDateAndTime.xml diff --git a/legacyTest/serverMockup/SystemReboot.xml b/compatibilityTest/serverMockup/SystemReboot.xml similarity index 100% rename from legacyTest/serverMockup/SystemReboot.xml rename to compatibilityTest/serverMockup/SystemReboot.xml diff --git a/legacyTest/serverMockup/Unsubscribe.xml b/compatibilityTest/serverMockup/Unsubscribe.xml similarity index 100% rename from legacyTest/serverMockup/Unsubscribe.xml rename to compatibilityTest/serverMockup/Unsubscribe.xml diff --git a/legacyTest/serverMockup/device.CreateUsers.xml b/compatibilityTest/serverMockup/device.CreateUsers.xml similarity index 100% rename from legacyTest/serverMockup/device.CreateUsers.xml rename to compatibilityTest/serverMockup/device.CreateUsers.xml diff --git a/legacyTest/serverMockup/device.DeleteUsers.xml b/compatibilityTest/serverMockup/device.DeleteUsers.xml similarity index 100% rename from legacyTest/serverMockup/device.DeleteUsers.xml rename to compatibilityTest/serverMockup/device.DeleteUsers.xml diff --git a/legacyTest/serverMockup/device.GetDNS.xml b/compatibilityTest/serverMockup/device.GetDNS.xml similarity index 100% rename from legacyTest/serverMockup/device.GetDNS.xml rename to compatibilityTest/serverMockup/device.GetDNS.xml diff --git a/legacyTest/serverMockup/device.GetNTP.xml b/compatibilityTest/serverMockup/device.GetNTP.xml similarity index 100% rename from legacyTest/serverMockup/device.GetNTP.xml rename to compatibilityTest/serverMockup/device.GetNTP.xml diff --git a/legacyTest/serverMockup/device.GetNetworkDefaultGateway.xml b/compatibilityTest/serverMockup/device.GetNetworkDefaultGateway.xml similarity index 100% rename from legacyTest/serverMockup/device.GetNetworkDefaultGateway.xml rename to compatibilityTest/serverMockup/device.GetNetworkDefaultGateway.xml diff --git a/legacyTest/serverMockup/device.GetNetworkInterfaces.xml b/compatibilityTest/serverMockup/device.GetNetworkInterfaces.xml similarity index 100% rename from legacyTest/serverMockup/device.GetNetworkInterfaces.xml rename to compatibilityTest/serverMockup/device.GetNetworkInterfaces.xml diff --git a/legacyTest/serverMockup/device.GetUsers.xml b/compatibilityTest/serverMockup/device.GetUsers.xml similarity index 100% rename from legacyTest/serverMockup/device.GetUsers.xml rename to compatibilityTest/serverMockup/device.GetUsers.xml diff --git a/legacyTest/serverMockup/device.GetZeroConfiguration.xml b/compatibilityTest/serverMockup/device.GetZeroConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/device.GetZeroConfiguration.xml rename to compatibilityTest/serverMockup/device.GetZeroConfiguration.xml diff --git a/legacyTest/serverMockup/device.SetDNS.xml b/compatibilityTest/serverMockup/device.SetDNS.xml similarity index 100% rename from legacyTest/serverMockup/device.SetDNS.xml rename to compatibilityTest/serverMockup/device.SetDNS.xml diff --git a/legacyTest/serverMockup/device.SetNTP.xml b/compatibilityTest/serverMockup/device.SetNTP.xml similarity index 100% rename from legacyTest/serverMockup/device.SetNTP.xml rename to compatibilityTest/serverMockup/device.SetNTP.xml diff --git a/legacyTest/serverMockup/device.SetNetworkDefaultGateway.xml b/compatibilityTest/serverMockup/device.SetNetworkDefaultGateway.xml similarity index 100% rename from legacyTest/serverMockup/device.SetNetworkDefaultGateway.xml rename to compatibilityTest/serverMockup/device.SetNetworkDefaultGateway.xml diff --git a/legacyTest/serverMockup/device.SetNetworkInterfaces.xml b/compatibilityTest/serverMockup/device.SetNetworkInterfaces.xml similarity index 100% rename from legacyTest/serverMockup/device.SetNetworkInterfaces.xml rename to compatibilityTest/serverMockup/device.SetNetworkInterfaces.xml diff --git a/legacyTest/serverMockup/device.SetSystemFactoryDefault.xml b/compatibilityTest/serverMockup/device.SetSystemFactoryDefault.xml similarity index 100% rename from legacyTest/serverMockup/device.SetSystemFactoryDefault.xml rename to compatibilityTest/serverMockup/device.SetSystemFactoryDefault.xml diff --git a/legacyTest/serverMockup/device.SetUser.xml b/compatibilityTest/serverMockup/device.SetUser.xml similarity index 100% rename from legacyTest/serverMockup/device.SetUser.xml rename to compatibilityTest/serverMockup/device.SetUser.xml diff --git a/legacyTest/serverMockup/events.CreatePullPointSubscription.xml b/compatibilityTest/serverMockup/events.CreatePullPointSubscription.xml similarity index 100% rename from legacyTest/serverMockup/events.CreatePullPointSubscription.xml rename to compatibilityTest/serverMockup/events.CreatePullPointSubscription.xml diff --git a/legacyTest/serverMockup/events.GetServiceCapabilities.xml b/compatibilityTest/serverMockup/events.GetServiceCapabilities.xml similarity index 100% rename from legacyTest/serverMockup/events.GetServiceCapabilities.xml rename to compatibilityTest/serverMockup/events.GetServiceCapabilities.xml diff --git a/legacyTest/serverMockup/imaging.GetCurrentPreset.xml b/compatibilityTest/serverMockup/imaging.GetCurrentPreset.xml similarity index 100% rename from legacyTest/serverMockup/imaging.GetCurrentPreset.xml rename to compatibilityTest/serverMockup/imaging.GetCurrentPreset.xml diff --git a/legacyTest/serverMockup/imaging.GetImagingSettings.xml b/compatibilityTest/serverMockup/imaging.GetImagingSettings.xml similarity index 100% rename from legacyTest/serverMockup/imaging.GetImagingSettings.xml rename to compatibilityTest/serverMockup/imaging.GetImagingSettings.xml diff --git a/legacyTest/serverMockup/imaging.GetOptions.xml b/compatibilityTest/serverMockup/imaging.GetOptions.xml similarity index 100% rename from legacyTest/serverMockup/imaging.GetOptions.xml rename to compatibilityTest/serverMockup/imaging.GetOptions.xml diff --git a/legacyTest/serverMockup/imaging.GetServiceCapabilities.xml b/compatibilityTest/serverMockup/imaging.GetServiceCapabilities.xml similarity index 100% rename from legacyTest/serverMockup/imaging.GetServiceCapabilities.xml rename to compatibilityTest/serverMockup/imaging.GetServiceCapabilities.xml diff --git a/legacyTest/serverMockup/imaging.SetCurrentPreset.xml b/compatibilityTest/serverMockup/imaging.SetCurrentPreset.xml similarity index 100% rename from legacyTest/serverMockup/imaging.SetCurrentPreset.xml rename to compatibilityTest/serverMockup/imaging.SetCurrentPreset.xml diff --git a/legacyTest/serverMockup/imaging.SetImagingSettings.xml b/compatibilityTest/serverMockup/imaging.SetImagingSettings.xml similarity index 100% rename from legacyTest/serverMockup/imaging.SetImagingSettings.xml rename to compatibilityTest/serverMockup/imaging.SetImagingSettings.xml diff --git a/legacyTest/serverMockup/media.AddAudioEncoderConfiguration.xml b/compatibilityTest/serverMockup/media.AddAudioEncoderConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/media.AddAudioEncoderConfiguration.xml rename to compatibilityTest/serverMockup/media.AddAudioEncoderConfiguration.xml diff --git a/legacyTest/serverMockup/media.AddAudioSourceConfiguration.xml b/compatibilityTest/serverMockup/media.AddAudioSourceConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/media.AddAudioSourceConfiguration.xml rename to compatibilityTest/serverMockup/media.AddAudioSourceConfiguration.xml diff --git a/legacyTest/serverMockup/media.AddVideoEncoderConfiguration.xml b/compatibilityTest/serverMockup/media.AddVideoEncoderConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/media.AddVideoEncoderConfiguration.xml rename to compatibilityTest/serverMockup/media.AddVideoEncoderConfiguration.xml diff --git a/legacyTest/serverMockup/media.AddVideoSourceConfiguration.xml b/compatibilityTest/serverMockup/media.AddVideoSourceConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/media.AddVideoSourceConfiguration.xml rename to compatibilityTest/serverMockup/media.AddVideoSourceConfiguration.xml diff --git a/legacyTest/serverMockup/media.CreateProfile.xml b/compatibilityTest/serverMockup/media.CreateProfile.xml similarity index 100% rename from legacyTest/serverMockup/media.CreateProfile.xml rename to compatibilityTest/serverMockup/media.CreateProfile.xml diff --git a/legacyTest/serverMockup/media.DeleteProfile.xml b/compatibilityTest/serverMockup/media.DeleteProfile.xml similarity index 100% rename from legacyTest/serverMockup/media.DeleteProfile.xml rename to compatibilityTest/serverMockup/media.DeleteProfile.xml diff --git a/legacyTest/serverMockup/media.GetAudioEncoderConfiguration.xml b/compatibilityTest/serverMockup/media.GetAudioEncoderConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/media.GetAudioEncoderConfiguration.xml rename to compatibilityTest/serverMockup/media.GetAudioEncoderConfiguration.xml diff --git a/legacyTest/serverMockup/media.GetAudioEncoderConfigurationOptions.xml b/compatibilityTest/serverMockup/media.GetAudioEncoderConfigurationOptions.xml similarity index 100% rename from legacyTest/serverMockup/media.GetAudioEncoderConfigurationOptions.xml rename to compatibilityTest/serverMockup/media.GetAudioEncoderConfigurationOptions.xml diff --git a/legacyTest/serverMockup/media.GetAudioEncoderConfigurations.xml b/compatibilityTest/serverMockup/media.GetAudioEncoderConfigurations.xml similarity index 100% rename from legacyTest/serverMockup/media.GetAudioEncoderConfigurations.xml rename to compatibilityTest/serverMockup/media.GetAudioEncoderConfigurations.xml diff --git a/legacyTest/serverMockup/media.GetAudioSources.xml b/compatibilityTest/serverMockup/media.GetAudioSources.xml similarity index 100% rename from legacyTest/serverMockup/media.GetAudioSources.xml rename to compatibilityTest/serverMockup/media.GetAudioSources.xml diff --git a/legacyTest/serverMockup/media.GetOSDOptions b/compatibilityTest/serverMockup/media.GetOSDOptions similarity index 100% rename from legacyTest/serverMockup/media.GetOSDOptions rename to compatibilityTest/serverMockup/media.GetOSDOptions diff --git a/legacyTest/serverMockup/media.GetServiceCapabilities.xml b/compatibilityTest/serverMockup/media.GetServiceCapabilities.xml similarity index 100% rename from legacyTest/serverMockup/media.GetServiceCapabilities.xml rename to compatibilityTest/serverMockup/media.GetServiceCapabilities.xml diff --git a/legacyTest/serverMockup/media.GetVideoEncoderConfiguration.xml b/compatibilityTest/serverMockup/media.GetVideoEncoderConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/media.GetVideoEncoderConfiguration.xml rename to compatibilityTest/serverMockup/media.GetVideoEncoderConfiguration.xml diff --git a/legacyTest/serverMockup/media.GetVideoEncoderConfigurationOptions.xml b/compatibilityTest/serverMockup/media.GetVideoEncoderConfigurationOptions.xml similarity index 100% rename from legacyTest/serverMockup/media.GetVideoEncoderConfigurationOptions.xml rename to compatibilityTest/serverMockup/media.GetVideoEncoderConfigurationOptions.xml diff --git a/legacyTest/serverMockup/media.GetVideoEncoderConfigurations.xml b/compatibilityTest/serverMockup/media.GetVideoEncoderConfigurations.xml similarity index 100% rename from legacyTest/serverMockup/media.GetVideoEncoderConfigurations.xml rename to compatibilityTest/serverMockup/media.GetVideoEncoderConfigurations.xml diff --git a/legacyTest/serverMockup/media.GetVideoSources.xml b/compatibilityTest/serverMockup/media.GetVideoSources.xml similarity index 100% rename from legacyTest/serverMockup/media.GetVideoSources.xml rename to compatibilityTest/serverMockup/media.GetVideoSources.xml diff --git a/legacyTest/serverMockup/media.RemoveAudioEncoderConfiguration.xml b/compatibilityTest/serverMockup/media.RemoveAudioEncoderConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/media.RemoveAudioEncoderConfiguration.xml rename to compatibilityTest/serverMockup/media.RemoveAudioEncoderConfiguration.xml diff --git a/legacyTest/serverMockup/media.RemoveAudioSourceConfiguration.xml b/compatibilityTest/serverMockup/media.RemoveAudioSourceConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/media.RemoveAudioSourceConfiguration.xml rename to compatibilityTest/serverMockup/media.RemoveAudioSourceConfiguration.xml diff --git a/legacyTest/serverMockup/media.SetAudioEncoderConfiguration.xml b/compatibilityTest/serverMockup/media.SetAudioEncoderConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/media.SetAudioEncoderConfiguration.xml rename to compatibilityTest/serverMockup/media.SetAudioEncoderConfiguration.xml diff --git a/legacyTest/serverMockup/media.SetVideoEncoderConfiguration.xml b/compatibilityTest/serverMockup/media.SetVideoEncoderConfiguration.xml similarity index 100% rename from legacyTest/serverMockup/media.SetVideoEncoderConfiguration.xml rename to compatibilityTest/serverMockup/media.SetVideoEncoderConfiguration.xml diff --git a/legacyTest/serverMockup/ptz.AbsoluteMove.xml b/compatibilityTest/serverMockup/ptz.AbsoluteMove.xml similarity index 100% rename from legacyTest/serverMockup/ptz.AbsoluteMove.xml rename to compatibilityTest/serverMockup/ptz.AbsoluteMove.xml diff --git a/legacyTest/serverMockup/ptz.ContinuousMove.xml b/compatibilityTest/serverMockup/ptz.ContinuousMove.xml similarity index 100% rename from legacyTest/serverMockup/ptz.ContinuousMove.xml rename to compatibilityTest/serverMockup/ptz.ContinuousMove.xml diff --git a/legacyTest/serverMockup/ptz.GetPresets.xml b/compatibilityTest/serverMockup/ptz.GetPresets.xml similarity index 100% rename from legacyTest/serverMockup/ptz.GetPresets.xml rename to compatibilityTest/serverMockup/ptz.GetPresets.xml diff --git a/legacyTest/serverMockup/ptz.GotoHomePosition.xml b/compatibilityTest/serverMockup/ptz.GotoHomePosition.xml similarity index 100% rename from legacyTest/serverMockup/ptz.GotoHomePosition.xml rename to compatibilityTest/serverMockup/ptz.GotoHomePosition.xml diff --git a/legacyTest/serverMockup/ptz.GotoPreset.xml b/compatibilityTest/serverMockup/ptz.GotoPreset.xml similarity index 100% rename from legacyTest/serverMockup/ptz.GotoPreset.xml rename to compatibilityTest/serverMockup/ptz.GotoPreset.xml diff --git a/legacyTest/serverMockup/ptz.RelativeMove.xml b/compatibilityTest/serverMockup/ptz.RelativeMove.xml similarity index 100% rename from legacyTest/serverMockup/ptz.RelativeMove.xml rename to compatibilityTest/serverMockup/ptz.RelativeMove.xml diff --git a/legacyTest/serverMockup/ptz.RemovePreset.xml b/compatibilityTest/serverMockup/ptz.RemovePreset.xml similarity index 100% rename from legacyTest/serverMockup/ptz.RemovePreset.xml rename to compatibilityTest/serverMockup/ptz.RemovePreset.xml diff --git a/legacyTest/serverMockup/ptz.SetHomePosition.xml b/compatibilityTest/serverMockup/ptz.SetHomePosition.xml similarity index 100% rename from legacyTest/serverMockup/ptz.SetHomePosition.xml rename to compatibilityTest/serverMockup/ptz.SetHomePosition.xml diff --git a/legacyTest/serverMockup/ptz.SetPreset.xml b/compatibilityTest/serverMockup/ptz.SetPreset.xml similarity index 100% rename from legacyTest/serverMockup/ptz.SetPreset.xml rename to compatibilityTest/serverMockup/ptz.SetPreset.xml diff --git a/legacyTest/serverMockup/ptz.Stop.xml b/compatibilityTest/serverMockup/ptz.Stop.xml similarity index 100% rename from legacyTest/serverMockup/ptz.Stop.xml rename to compatibilityTest/serverMockup/ptz.Stop.xml diff --git a/package-lock.json b/package-lock.json index 3d38d935..60da9703 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "onvif", - "version": "0.6.5", + "version": "0.6.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "onvif", - "version": "0.6.5", + "version": "0.6.6", "license": "MIT", "dependencies": { "lodash.get": "^4.4.2", diff --git a/src/legacy/cam.ts b/src/compatibility/cam.ts similarity index 93% rename from src/legacy/cam.ts rename to src/compatibility/cam.ts index 5a178aad..fc8f0f09 100644 --- a/src/legacy/cam.ts +++ b/src/compatibility/cam.ts @@ -7,7 +7,7 @@ import { Onvif, OnvifRequestOptions, ReferenceToken, SetSystemDateAndTimeOptions, } from '../onvif'; import { GetSnapshotUriOptions, GetStreamUriOptions } from '../media'; -import { GetPresetsOptions } from '../ptz'; +import { GetPresetsOptions, GotoPresetOptions, SetPresetOptions } from '../ptz'; type Callback = (error: any, result?: any) => void; @@ -163,4 +163,12 @@ export class Cam extends EventEmitter { )) .catch(options as Callback); } + + async gotoPreset(options: GotoPresetOptions, callback: Callback) { + this.onvif.ptz.gotoPreset(options).then((result) => callback(null, result)).catch(callback); + } + + async setPreset(options: SetPresetOptions, callback: Callback) { + this.onvif.ptz.setPreset(options).then((result) => callback(null, result)).catch(callback); + } } diff --git a/src/ptz.ts b/src/ptz.ts index cd32118b..e87269d3 100644 --- a/src/ptz.ts +++ b/src/ptz.ts @@ -34,7 +34,7 @@ export interface PTZNode { auxiliaryCommands?: any; extension?: { /** Detail of supported Preset Tour feature */ - supportedPresetTour?: PTZPresetTourSupported + supportedPresetTour?: PTZPresetTourSupported; extension?: any; }; } @@ -91,13 +91,13 @@ export interface PTControlDirectionOptions { /** Supported options for EFlip feature */ EFlip?: { /** Options of EFlip mode parameter */ - mode?: 'OFF' | 'ON' | 'Extended' + mode?: 'OFF' | 'ON' | 'Extended'; extension?: any; }; /** Supported options for Reverse feature */ reverse?: { /** Options of Reverse mode parameter */ - mode?: 'OFF' | 'ON' | 'AUTO' | 'Extended' + mode?: 'OFF' | 'ON' | 'AUTO' | 'Extended'; extension?: any; }; } @@ -112,7 +112,7 @@ export interface PTZConfigurationOptions { /** A timeout Range within which Timeouts are accepted by the PTZ Node */ PTZTimeout: DurationRange; /** Supported options for PT Direction Control */ - PTControlDirection?: PTControlDirectionOptions + PTControlDirection?: PTControlDirectionOptions; extension: any; } @@ -120,13 +120,6 @@ export interface GetPresetsOptions { profileToken?: ReferenceToken; } -export interface PTZVector { - /** Pan and tilt position. The x component corresponds to pan and the y component to tilt. */ - panTilt: Vector2D; - /** A zoom position. */ - zoom: Vector1D; -} - /** A list of presets which are available for the requested MediaProfile. */ export interface PTZPreset { token: ReferenceToken; @@ -136,6 +129,50 @@ export interface PTZPreset { PTZPosition?: PTZVector; } +export interface PTZVector { + panTilt?: Vector2D; + zoom?: Vector1D; +} + +/** + * Simplified structure of PTZ vector to use as an input argument for position and speed in movement commands. + * */ +interface PTZInputVector { + /** Pan value */ + pan?: number; + /** Synonym for pan value */ + x?: number; + /** Tilt value */ + tilt?: number; + /** Synonym for tilt value */ + y?: number; + /** Zoom value */ + zoom?: number; +} + +export interface GotoPresetOptions { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; + /** A requested preset token. From {@link PTZ.presets} property */ + presetToken: ReferenceToken; + /** A requested speed.The speed parameter can only be specified when Speed Spaces are available for the PTZ Node. */ + speed?: PTZVector | PTZInputVector; +} + +export interface SetPresetOptions { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; + /** A requested preset name. */ + presetName: string; + /** A requested preset token. */ + presetToken?: ReferenceToken; +} + +export interface SetPresetResponse { + /** A token to the Preset which has been set. */ + presetToken: ReferenceToken; +} + /** * PTZ methods */ @@ -224,10 +261,68 @@ export class PTZ { this.#presets = {}; const result = linerase(data[0].getPresetsResponse[0].preset); if (Array.isArray(result)) { + // eslint-disable-next-line no-return-assign linerase(result).forEach((preset: any) => this.#presets[preset.token] = preset); } else { this.#presets[result.token] = result; } return this.#presets; } + + private static formatPTZSimpleVector({ + pan, tilt, x, y, zoom, + }: PTZInputVector = { + x : 0, y : 0, zoom : 0, + }): PTZVector { + return { + panTilt : { + x : pan || x, + y : tilt || y, + }, + zoom : { + x : zoom, + }, + }; + } + + private static PTZVectorToXML(input: PTZVector | PTZInputVector) { + const vector: PTZVector = ('x' in input || 'pan' in input) ? PTZ.formatPTZSimpleVector(input) : (input as PTZVector); + return ( + (vector.panTilt ? `` : '') + + (vector.zoom ? `` : '') + ); + } + + async gotoPreset({ profileToken, presetToken, speed }: GotoPresetOptions): Promise { + await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken || this.onvif.activeSource!.profileToken}` + + `${presetToken}${ + speed ? `${PTZ.PTZVectorToXML(speed)}` : '' + }`, + }); + } + + /** + * The SetPreset command saves the current device position parameters so that the device can move to the saved preset + * position through the GotoPreset operation. In order to create a new preset, the SetPresetRequest contains no + * PresetToken. If creation is successful, the Response contains the PresetToken which uniquely identifies the Preset. + * An existing Preset can be overwritten by specifying the PresetToken of the corresponding Preset. In both cases + * (overwriting or creation) an optional PresetName can be specified. The operation fails if the PTZ device is moving + * during the SetPreset operation. The device MAY internally save additional states such as imaging properties in the + * PTZ Preset which then should be recalled in the GotoPreset operation. + * @param options + */ + async setPreset({ profileToken, presetName, presetToken }: SetPresetOptions): Promise { + const [data] = await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken || this.onvif.activeSource!.profileToken}` + + `${presetName}${ + presetToken ? `${presetToken}` : '' + }`, + }); + return linerase(data[0].setPresetResponse); + } } From d0b7462c2ed990bf4e994b382198fb54a42aeba7 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 16 Oct 2022 22:31:48 +0300 Subject: [PATCH 062/112] Add `setHomePosition`, `removePreset`, `gotoHomePosition`, `getStatus` methods --- IMPLEMENTED.md | 8 +-- compatibilityTest/ptz.js | 8 ++- package-lock.json | 18 +++--- package.json | 4 +- src/compatibility/cam.ts | 30 +++++++++- src/index.ts | 2 + src/onvif.ts | 2 +- src/ptz.ts | 124 ++++++++++++++++++++++++++++++++++++--- src/test.ts | 4 +- 9 files changed, 174 insertions(+), 26 deletions(-) diff --git a/IMPLEMENTED.md b/IMPLEMENTED.md index c8687bd2..aa0dccc8 100644 --- a/IMPLEMENTED.md +++ b/IMPLEMENTED.md @@ -63,7 +63,7 @@ - [x] getServiceCapabilities - [x] getServices - [x] getSnapshotUri -- [ ] getStatus +- [x] getStatus - [x] getStreamUri - [x] getSystemDateAndTime - [ ] getUsers @@ -74,18 +74,18 @@ - [ ] getVideoSourceConfigurations - [ ] getVideoSourceOptions - [ ] getVideoSources -- [ ] gotoHomePosition +- [x] gotoHomePosition - [x] gotoPreset - [ ] pullMessages - [ ] relativeMove - [ ] removeAudioEncoderConfiguration - [ ] removeAudioSourceConfiguration -- [ ] removePreset +- [x] removePreset - [ ] renew - [ ] setAudioEncoderConfiguration - [ ] setCurrentImagingPreset - [ ] setDNS -- [ ] setHomePosition +- [x] setHomePosition - [ ] setImagingSettings - [ ] setNetworkDefaultGateway - [ ] setNetworkInterfaces diff --git a/compatibilityTest/ptz.js b/compatibilityTest/ptz.js index 3e65f463..f7b68cc8 100644 --- a/compatibilityTest/ptz.js +++ b/compatibilityTest/ptz.js @@ -190,7 +190,13 @@ describe('PTZ', () => { describe('getStatus', () => { it('should returns position status', (done) => { - cam.getStatus({}, (err) => { + cam.getStatus({}, (err, data) => { + assert.strictEqual(err, null); + done(); + }); + }); + it('should returns position status without arguments', (done) => { + cam.getStatus((err, data) => { assert.strictEqual(err, null); done(); }); diff --git a/package-lock.json b/package-lock.json index 60da9703..6d7ec1d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "onvif", - "version": "0.6.6", + "version": "1.0.0-alpha.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "onvif", - "version": "0.6.6", + "version": "1.0.0-alpha.0", "license": "MIT", "dependencies": { "lodash.get": "^4.4.2", @@ -32,7 +32,7 @@ "nimble": "^0.0.2", "nyc": "^15.1.0", "prettier": "^2.5.1", - "typedoc": "^0.23.15", + "typedoc": "^0.23.16", "typescript": "^4.8.4" }, "engines": { @@ -4816,9 +4816,9 @@ } }, "node_modules/typedoc": { - "version": "0.23.15", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.15.tgz", - "integrity": "sha512-x9Zu+tTnwxb9YdVr+zvX7LYzyBl1nieOr6lrSHbHsA22/RJK2m4Y525WIg5Mj4jWCmfL47v6f4hUzY7EIuwS5w==", + "version": "0.23.16", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.16.tgz", + "integrity": "sha512-rumYsCeNRXlyuZVzefD7050n7ptL2uudsCJg50dY0v/stKniqIlRpvx/F/6expC0/Q6Dbab+g/JpZuB7Sw90FA==", "dev": true, "dependencies": { "lunr": "^2.3.9", @@ -8642,9 +8642,9 @@ } }, "typedoc": { - "version": "0.23.15", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.15.tgz", - "integrity": "sha512-x9Zu+tTnwxb9YdVr+zvX7LYzyBl1nieOr6lrSHbHsA22/RJK2m4Y525WIg5Mj4jWCmfL47v6f4hUzY7EIuwS5w==", + "version": "0.23.16", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.16.tgz", + "integrity": "sha512-rumYsCeNRXlyuZVzefD7050n7ptL2uudsCJg50dY0v/stKniqIlRpvx/F/6expC0/Q6Dbab+g/JpZuB7Sw90FA==", "dev": true, "requires": { "lunr": "^2.3.9", diff --git a/package.json b/package.json index fd02962c..f5c5fa9e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "onvif", - "version": "0.6.6", + "version": "1.0.0-alpha.0", "author": "Andrew D.Laptev ", "description": "Client to ONVIF NVT devices Profile S: cameras", "main": "lib/onvif.js", @@ -76,7 +76,7 @@ "nimble": "^0.0.2", "nyc": "^15.1.0", "prettier": "^2.5.1", - "typedoc": "^0.23.15", + "typedoc": "^0.23.16", "typescript": "^4.8.4" } } diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index fc8f0f09..2c53400d 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -7,7 +7,14 @@ import { Onvif, OnvifRequestOptions, ReferenceToken, SetSystemDateAndTimeOptions, } from '../onvif'; import { GetSnapshotUriOptions, GetStreamUriOptions } from '../media'; -import { GetPresetsOptions, GotoPresetOptions, SetPresetOptions } from '../ptz'; +import { + GetPresetsOptions, GetStatusOptions, + GotoHomePositionOptions, + GotoPresetOptions, + RemovePresetOptions, + SetHomePositionOptions, + SetPresetOptions, +} from '../ptz'; type Callback = (error: any, result?: any) => void; @@ -171,4 +178,25 @@ export class Cam extends EventEmitter { async setPreset(options: SetPresetOptions, callback: Callback) { this.onvif.ptz.setPreset(options).then((result) => callback(null, result)).catch(callback); } + + async removePreset(options: RemovePresetOptions, callback: Callback) { + this.onvif.ptz.removePreset(options).then((result) => callback(null, result)).catch(callback); + } + + async gotoHomePosition(options: GotoHomePositionOptions, callback: Callback) { + this.onvif.ptz.gotoHomePosition(options).then((result) => callback(null, result)).catch(callback); + } + + async setHomePosition(options: SetHomePositionOptions, callback: Callback) { + this.onvif.ptz.setHomePosition(options).then((result) => callback(null, result)).catch(callback); + } + + getStatus(options: GetStatusOptions, callback: Callback): void + getStatus(callback: Callback): void + getStatus(options: GetStatusOptions | Callback, callback?: Callback) { + if (callback) { + this.onvif.ptz.getStatus(options as GetStatusOptions).then((result) => callback(null, result)).catch(callback); + } + this.onvif.ptz.getStatus().then((result) => (options as Callback)(null, result)).catch(options as Callback); + } } diff --git a/src/index.ts b/src/index.ts index af7d9004..c348f89d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,3 +2,5 @@ export * from './onvif'; export * from './device'; export * from './media'; export * from './discovery'; +export * from './ptz'; +export * from './compatibility/cam'; diff --git a/src/onvif.ts b/src/onvif.ts index 7aeacad8..ed4d70c4 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -125,7 +125,7 @@ export class Onvif extends EventEmitter { static warn: 'warn' = 'warn'; /** * Indicates any errors - * @param error Error instance from {@link Error} + * @param error Error object * @event error * @example * ```typescript diff --git a/src/ptz.ts b/src/ptz.ts index e87269d3..7e482146 100644 --- a/src/ptz.ts +++ b/src/ptz.ts @@ -4,7 +4,7 @@ import { Duration, PTZConfiguration, Space1DDescription, Space2DDescription, Vector1D, Vector2D, } from './media'; -interface PTZPresetTourSupported { +export interface PTZPresetTourSupported { /** Indicates number of preset tours that can be created. Required preset tour operations shall be available for this * PTZ Node if one or more preset tour is supported */ maximumNumberOfPresetTours: number; @@ -80,8 +80,6 @@ export interface PTZSpace { extension?: any; } -type ResponsePTZNode = PTZNode & {$?: ReferenceToken}; - export interface DurationRange { min: Duration; max: Duration; @@ -137,7 +135,7 @@ export interface PTZVector { /** * Simplified structure of PTZ vector to use as an input argument for position and speed in movement commands. * */ -interface PTZInputVector { +export interface PTZInputVector { /** Pan value */ pan?: number; /** Synonym for pan value */ @@ -173,6 +171,48 @@ export interface SetPresetResponse { presetToken: ReferenceToken; } +export interface RemovePresetOptions { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; + /** A requested preset token. */ + presetToken: ReferenceToken; +} + +export interface GotoHomePositionOptions { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; + /** A requested speed.The speed parameter can only be specified when Speed Spaces are available for the PTZ Node. */ + speed?: PTZVector | PTZInputVector; +} + +export interface SetHomePositionOptions { + /** A reference to the MediaProfile where the home position should be set. */ + profileToken?: ReferenceToken; +} + +export interface GetStatusOptions { + profileToken?: ReferenceToken; +} + +type MoveStatus = string; + +export interface PTZMoveStatus { + panTilt: MoveStatus; + zoom: MoveStatus; +} + +export interface PTZStatus { + /** Specifies the absolute position of the PTZ unit together with the Space references. The default absolute spaces + * of the corresponding PTZ configuration MUST be referenced within the Position element. */ + position?: PTZVector; + /** Indicates if the Pan/Tilt/Zoom device unit is currently moving, idle or in an unknown state. */ + moveStatus?: PTZMoveStatus; + /** States a current PTZ error. */ + error?: string; + /** Specifies the UTC time when this status was generated. */ + utcTime?: Date; +} + /** * PTZ methods */ @@ -206,7 +246,7 @@ export class PTZ { }); this.#nodes = {}; data[0].getNodesResponse.forEach((ptzNode: any) => { - const node: ResponsePTZNode = linerase(ptzNode.PTZNode[0]); + const node: PTZNode = linerase(ptzNode.PTZNode[0]); this.#nodes[node.token] = node; }); return this.#nodes; @@ -238,7 +278,8 @@ export class PTZ { * a Video Source Configuration. In that case, the options may additionally contain coordinate systems referring to * the image coordinate system described by the Video Source Configuration. If the PTZ Node supports continuous * movements, it shall return a Timeout Range within which Timeouts are accepted by the PTZ Node - * @param configurationToken Token of an existing configuration that the options are intended for + * @param options + * @param options.configurationToken Token of an existing configuration that the options are intended for */ async getConfigurationOptions({ configurationToken }: { configurationToken: ReferenceToken }): Promise { @@ -251,6 +292,11 @@ export class PTZ { return linerase(data); } + /** + * Operation to request all PTZ presets for the PTZNode in the selected profile. The operation is supported if there + * is support for at least on PTZ preset by the PTZNode. + * @param options + */ async getPresets({ profileToken }: GetPresetsOptions = {}) { const [data] = await this.onvif.request({ service : 'PTZ', @@ -293,6 +339,11 @@ export class PTZ { ); } + /** + * Operation to go to a saved preset position for the PTZNode in the selected profile. The operation is supported if + * there is support for at least on PTZ preset by the PTZNode. + * @param options + */ async gotoPreset({ profileToken, presetToken, speed }: GotoPresetOptions): Promise { await this.onvif.request({ service : 'PTZ', @@ -318,11 +369,70 @@ export class PTZ { const [data] = await this.onvif.request({ service : 'PTZ', body : '' - + `${profileToken || this.onvif.activeSource!.profileToken}` + + `${profileToken ?? this.onvif.activeSource!.profileToken}` + `${presetName}${ presetToken ? `${presetToken}` : '' }`, }); return linerase(data[0].setPresetResponse); } + + /** + * Operation to remove a PTZ preset for the Node in the selected profile. The operation is supported if the + * PresetPosition capability exists for teh Node in the selected profile. + * @param options + */ + async removePreset({ profileToken = this.onvif.activeSource?.profileToken, presetToken }: RemovePresetOptions): Promise { + await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken}` + + `${presetToken}` + + '', + }); + } + + /** + * Operation to move the PTZ device to it's "home" position. The operation is supported if the HomeSupported element + * in the PTZNode is true. + * @param options + */ + async gotoHomePosition({ profileToken = this.onvif.activeSource?.profileToken, speed }: GotoHomePositionOptions): Promise { + await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken}${ + speed ? `${PTZ.PTZVectorToXML(speed)}` : '' + }`, + }); + } + + /** + * Operation to save current position as the home position. The SetHomePosition command returns with a failure if + * the “home” position is fixed and cannot be overwritten. If the SetHomePosition is successful, it is possible + * to recall the Home Position with the GotoHomePosition command. + * @param options + */ + async setHomePosition({ profileToken = this.onvif.activeSource?.profileToken }: SetHomePositionOptions) { + await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken}` + + '', + }); + } + + /** + * Operation to request PTZ status for the Node in the selected profile. + * @param options + */ + async getStatus({ profileToken = this.onvif.activeSource?.profileToken }: GetStatusOptions = {}): Promise { + const [data] = await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken}` + + '', + }); + return linerase(data).getStatusResponse.PTZStatus; + } } diff --git a/src/test.ts b/src/test.ts index 7a6d1d40..bb353924 100644 --- a/src/test.ts +++ b/src/test.ts @@ -19,7 +19,9 @@ const serverMockup = require('../test/serverMockup'); console.log((await cam.device.getHostname())); // console.log(((await cam.media.getProfiles())[0] as Profile).PTZConfiguration); console.log(await cam.ptz.getConfigurations()); - console.log(await cam.device.systemReboot()); + console.log('-------------------------------------------'); + console.log(await cam.ptz.getStatus()); + console.log('-------------------------------------------'); // console.log(profiles); // Discovery.on('device', console.log); // const cams = await Discovery.probe({ timeout : 1000 }); From a43c19cab6c35f8384c1ca4cd043b21ef8bfbcc2 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Mon, 17 Oct 2022 11:45:19 +0300 Subject: [PATCH 063/112] Add `absoluteMove` method --- compatibilityTest/ptz.js | 12 ++++++++++++ src/compatibility/cam.ts | 31 +++++++++++++++++++++++++------ src/ptz.ts | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 7 deletions(-) diff --git a/compatibilityTest/ptz.js b/compatibilityTest/ptz.js index f7b68cc8..1d2312fc 100644 --- a/compatibilityTest/ptz.js +++ b/compatibilityTest/ptz.js @@ -126,6 +126,18 @@ describe('PTZ', () => { zoom : 1, }, done); }); + it('should works with speed parameter', (done) => { + cam.absoluteMove({ + x : 1.1, + y : 1.1, + zoom : 1.1, + speed : { + x : 2, + y : 2, + zoom : 2 + } + }, done); + }); it('should works without callback', () => { cam.absoluteMove({ x : 0, diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 2c53400d..edfb0fca 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -10,13 +10,14 @@ import { GetSnapshotUriOptions, GetStreamUriOptions } from '../media'; import { GetPresetsOptions, GetStatusOptions, GotoHomePositionOptions, - GotoPresetOptions, + GotoPresetOptions, MoveOptions, RemovePresetOptions, SetHomePositionOptions, SetPresetOptions, } from '../ptz'; type Callback = (error: any, result?: any) => void; +type CompatibilityMoveOptions = MoveOptions & { x?: number; y?: number; zoom?: number }; export class Cam extends EventEmitter { private onvif: Onvif; @@ -171,23 +172,23 @@ export class Cam extends EventEmitter { .catch(options as Callback); } - async gotoPreset(options: GotoPresetOptions, callback: Callback) { + gotoPreset(options: GotoPresetOptions, callback: Callback) { this.onvif.ptz.gotoPreset(options).then((result) => callback(null, result)).catch(callback); } - async setPreset(options: SetPresetOptions, callback: Callback) { + setPreset(options: SetPresetOptions, callback: Callback) { this.onvif.ptz.setPreset(options).then((result) => callback(null, result)).catch(callback); } - async removePreset(options: RemovePresetOptions, callback: Callback) { + removePreset(options: RemovePresetOptions, callback: Callback) { this.onvif.ptz.removePreset(options).then((result) => callback(null, result)).catch(callback); } - async gotoHomePosition(options: GotoHomePositionOptions, callback: Callback) { + gotoHomePosition(options: GotoHomePositionOptions, callback: Callback) { this.onvif.ptz.gotoHomePosition(options).then((result) => callback(null, result)).catch(callback); } - async setHomePosition(options: SetHomePositionOptions, callback: Callback) { + setHomePosition(options: SetHomePositionOptions, callback: Callback) { this.onvif.ptz.setHomePosition(options).then((result) => callback(null, result)).catch(callback); } @@ -199,4 +200,22 @@ export class Cam extends EventEmitter { } this.onvif.ptz.getStatus().then((result) => (options as Callback)(null, result)).catch(options as Callback); } + + absoluteMove(compatibilityOptions: CompatibilityMoveOptions, callback?: Callback): void { + const options: MoveOptions = { + ...compatibilityOptions, + position : { + panTilt : { + x : compatibilityOptions.x!, + y : compatibilityOptions.y!, + }, + zoom : { x : compatibilityOptions.zoom! }, + }, + }; + if (callback) { + this.onvif.ptz.absoluteMove(options).then((result) => callback(null, result)).catch(callback); + } else { + this.onvif.ptz.absoluteMove(options).catch((err) => this.emit('error', err)); + } + } } diff --git a/src/ptz.ts b/src/ptz.ts index 7e482146..69c2ff72 100644 --- a/src/ptz.ts +++ b/src/ptz.ts @@ -1,7 +1,7 @@ import { Onvif, ReferenceToken } from './onvif'; import { linerase } from './utils'; import { - Duration, PTZConfiguration, Space1DDescription, Space2DDescription, Vector1D, Vector2D, + Duration, PTZConfiguration, PTZSpeed, Space1DDescription, Space2DDescription, Vector1D, Vector2D, } from './media'; export interface PTZPresetTourSupported { @@ -213,6 +213,15 @@ export interface PTZStatus { utcTime?: Date; } +export interface MoveOptions { + /** A reference to the MediaProfile. */ + profileToken?: ReferenceToken; + /** A Position vector specifying the absolute target position. */ + position: PTZVector; + /** An optional Speed. */ + speed?: PTZSpeed; +} + /** * PTZ methods */ @@ -435,4 +444,27 @@ export class PTZ { }); return linerase(data).getStatusResponse.PTZStatus; } + + /** + * Operation to move pan,tilt or zoom to a absolute destination. + * + * The speed argument is optional. If an x/y speed value is given it is up to the device to either use the x value as + * absolute resoluting speed vector or to map x and y to the component speed. If the speed argument is omitted, the + * default speed set by the PTZConfiguration will be used. + * @param options + */ + async absoluteMove({ + profileToken = this.onvif.activeSource?.profileToken, + position, + speed, + }: MoveOptions): Promise { + await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken}` + + `${PTZ.PTZVectorToXML(position)}${ + speed ? `${PTZ.PTZVectorToXML(speed)}` : '' + }`, + }); + } } From 2b1b7daee05b185dbd231ab4434b7612c49fad85 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 18 Oct 2022 17:25:47 +0300 Subject: [PATCH 064/112] Add `relativeMove`, `continuousMove` methods --- src/compatibility/cam.ts | 60 ++++++++++++++++++++++++++++++---- src/media.ts | 12 +++---- src/ptz.ts | 70 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 128 insertions(+), 14 deletions(-) diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index edfb0fca..101d1ed6 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -10,14 +10,22 @@ import { GetSnapshotUriOptions, GetStreamUriOptions } from '../media'; import { GetPresetsOptions, GetStatusOptions, GotoHomePositionOptions, - GotoPresetOptions, MoveOptions, + GotoPresetOptions, AbsoluteMoveOptions, RemovePresetOptions, SetHomePositionOptions, - SetPresetOptions, + SetPresetOptions, RelativeMoveOptions, ContinuousMoveOptions, } from '../ptz'; -type Callback = (error: any, result?: any) => void; -type CompatibilityMoveOptions = MoveOptions & { x?: number; y?: number; zoom?: number }; +export type Callback = (error: any, result?: any) => void; +export type CompatibilityAbsoluteMoveOptions = AbsoluteMoveOptions & { x?: number; y?: number; zoom?: number }; +export type CompatibilityRelativeMoveOptions = RelativeMoveOptions & { x?: number; y?: number; zoom?: number }; +interface CompatibilityContinuousMoveOptions extends ContinuousMoveOptions { + x?: number; + y?: number; + zoom?: number; + onlySendPanTilt?: boolean; + onlySendZoom?: boolean; +} export class Cam extends EventEmitter { private onvif: Onvif; @@ -201,8 +209,8 @@ export class Cam extends EventEmitter { this.onvif.ptz.getStatus().then((result) => (options as Callback)(null, result)).catch(options as Callback); } - absoluteMove(compatibilityOptions: CompatibilityMoveOptions, callback?: Callback): void { - const options: MoveOptions = { + absoluteMove(compatibilityOptions: CompatibilityAbsoluteMoveOptions, callback?: Callback): void { + const options: AbsoluteMoveOptions = { ...compatibilityOptions, position : { panTilt : { @@ -218,4 +226,44 @@ export class Cam extends EventEmitter { this.onvif.ptz.absoluteMove(options).catch((err) => this.emit('error', err)); } } + + relativeMove(compatibilityOptions: CompatibilityRelativeMoveOptions, callback?: Callback): void { + const options: RelativeMoveOptions = { + ...compatibilityOptions, + translation : { + panTilt : { + x : compatibilityOptions.x!, + y : compatibilityOptions.y!, + }, + zoom : { x : compatibilityOptions.zoom! }, + }, + }; + if (callback) { + this.onvif.ptz.relativeMove(options).then((result) => callback(null, result)).catch(callback); + } else { + this.onvif.ptz.relativeMove(options).catch((err) => this.emit('error', err)); + } + } + + continuousMove(compatibilityOptions: CompatibilityContinuousMoveOptions, callback?: Callback): void { + const options: ContinuousMoveOptions = { + ...compatibilityOptions, + velocity : { + ...(compatibilityOptions.x && compatibilityOptions.y && !compatibilityOptions.onlySendZoom && { + panTilt : { + x : compatibilityOptions.x, + y : compatibilityOptions.y, + }, + }), + ...(compatibilityOptions.zoom && !compatibilityOptions.onlySendPanTilt && { + zoom : { x : compatibilityOptions.zoom }, + }), + }, + }; + if (callback) { + this.onvif.ptz.continuousMove(options).then((result) => callback(null, result)).catch(callback); + } else { + this.onvif.ptz.continuousMove(options).catch((err) => this.emit('error', err)); + } + } } diff --git a/src/media.ts b/src/media.ts index 248e74ef..dfd7d935 100644 --- a/src/media.ts +++ b/src/media.ts @@ -250,7 +250,7 @@ export interface ItemList { name: string; /** Item value. The type is defined in the corresponding description */ value: any; - } + }; /** Complex value structure */ elementItem?: any; extension: any; @@ -306,9 +306,9 @@ export interface PTZSpeed { * Pan and tilt speed. The x component corresponds to pan and the y component to tilt. * If omitted in a request, the current (if any) PanTilt movement should not be affected */ - panTilt: Vector2D; + panTilt?: Vector2D; /** A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected */ - zoom: Vector1D; + zoom?: Vector1D; } export interface Range { @@ -386,7 +386,7 @@ export interface PTZConfiguration { /** If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default */ defaultRelativePanTiltTranslationSpace?: string; /** If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default */ - defaultRelativeZoomTranslationSpace?: string + defaultRelativeZoomTranslationSpace?: string; /** If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default */ defaultContinuousPanTiltVelocitySpace?: string; /** If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default */ @@ -727,7 +727,7 @@ export interface ImagingSettings { /** Image brightness (unit unspecified) */ brightness?: number; /** Color saturation of the image (unit unspecified) */ - colorSaturation?: number + colorSaturation?: number; /** Contrast of the image (unit unspecified) */ contrast?: number; /** Exposure mode of the device */ @@ -1046,7 +1046,7 @@ export class Media { * - RTP over RTSP over TCP: StreamType = "RTP_unicast", TransportProtocol = "RTSP" */ async getStreamUri(options: GetStreamUriOptions = {}): - Promise<{uri: AnyURI, invalidAfterConnect?: boolean, invalidAfterReboot?: boolean, timeout?: Duration}> { + Promise<{uri: AnyURI; invalidAfterConnect?: boolean; invalidAfterReboot?: boolean; timeout?: Duration}> { const { profileToken, stream = 'RTP-Unicast', diff --git a/src/ptz.ts b/src/ptz.ts index 69c2ff72..9ba62429 100644 --- a/src/ptz.ts +++ b/src/ptz.ts @@ -1,3 +1,4 @@ +import { type } from 'os'; import { Onvif, ReferenceToken } from './onvif'; import { linerase } from './utils'; import { @@ -213,7 +214,7 @@ export interface PTZStatus { utcTime?: Date; } -export interface MoveOptions { +export interface AbsoluteMoveOptions { /** A reference to the MediaProfile. */ profileToken?: ReferenceToken; /** A Position vector specifying the absolute target position. */ @@ -222,6 +223,24 @@ export interface MoveOptions { speed?: PTZSpeed; } +export interface RelativeMoveOptions { + /** A reference to the MediaProfile. */ + profileToken?: ReferenceToken; + /** A positional Translation relative to the current position */ + translation: PTZVector; + /** An optional Speed. */ + speed?: PTZSpeed; +} + +export interface ContinuousMoveOptions { + /** A reference to the MediaProfile. */ + profileToken?: ReferenceToken; + /** A Velocity vector specifying the velocity of pan, tilt and zoom. */ + velocity: PTZSpeed; + /** An optional Timeout parameter. Milliseconds or duration string */ + timeout?: Duration | number; +} + /** * PTZ methods */ @@ -457,7 +476,7 @@ export class PTZ { profileToken = this.onvif.activeSource?.profileToken, position, speed, - }: MoveOptions): Promise { + }: AbsoluteMoveOptions): Promise { await this.onvif.request({ service : 'PTZ', body : '' @@ -467,4 +486,51 @@ export class PTZ { }`, }); } + + /** + * Operation for Relative Pan/Tilt and Zoom Move. The operation is supported if the PTZNode supports at least one + * relative Pan/Tilt or Zoom space. + * + * The speed argument is optional. If an x/y speed value is given it is up to the device to either use the x value as + * absolute resoluting speed vector or to map x and y to the component speed. If the speed argument is omitted, + * the default speed set by the PTZConfiguration will be used. + * @param options + */ + async relativeMove({ + profileToken = this.onvif.activeSource?.profileToken, + translation, + speed, + }: RelativeMoveOptions): Promise { + await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken}` + + `${ + PTZ.PTZVectorToXML(translation) + }${ + speed ? `${PTZ.PTZVectorToXML(speed)}` : '' + }`, + }); + } + + /** + * Operation for continuous Pan/Tilt and Zoom movements. The operation is supported if the PTZNode supports at least + * one continuous Pan/Tilt or Zoom space. If the space argument is omitted, the default space set by the + * PTZConfiguration will be used. + * @param options + */ + async continuousMove({ + profileToken = this.onvif.activeSource?.profileToken, + velocity, + timeout, + }: ContinuousMoveOptions): Promise { + await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken}` + + `${PTZ.PTZVectorToXML(velocity)}${ + timeout ? `${typeof timeout === 'number' ? `PT${timeout / 1000}S` : timeout}` : '' + }`, + }); + } } From caecb8d4d745b18a364a4a2aad02ce39c14d0963 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 18 Oct 2022 20:25:41 +0300 Subject: [PATCH 065/112] Add `stop` method --- src/compatibility/cam.ts | 12 ++++++++++++ src/ptz.ts | 30 +++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 101d1ed6..32b047c9 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -266,4 +266,16 @@ export class Cam extends EventEmitter { this.onvif.ptz.continuousMove(options).catch((err) => this.emit('error', err)); } } + + stop(): void + stop(options: GetStatusOptions, callback: Callback): void + stop(callback: Callback): void + stop(options?: GetStatusOptions | Callback, callback?: Callback) { + if (callback) { + this.onvif.ptz.stop(options as GetStatusOptions).then((result) => callback(null, result)).catch(callback); + } + this.onvif.ptz.stop().then((result) => { + if (typeof options === 'function') { (options as Callback)(null, result); } + }).catch(options ? options as Callback : (error) => this.emit('error', error)); + } } diff --git a/src/ptz.ts b/src/ptz.ts index 9ba62429..702facb7 100644 --- a/src/ptz.ts +++ b/src/ptz.ts @@ -237,10 +237,21 @@ export interface ContinuousMoveOptions { profileToken?: ReferenceToken; /** A Velocity vector specifying the velocity of pan, tilt and zoom. */ velocity: PTZSpeed; - /** An optional Timeout parameter. Milliseconds or duration string */ + /** An optional Timeout parameter. Milliseconds or duration string. */ timeout?: Duration | number; } +export interface StopOptions { + /** A reference to the MediaProfile that indicate what should be stopped. */ + profileToken?: ReferenceToken; + /** Set true when we want to stop ongoing pan and tilt movements.If PanTilt arguments are not present, this command + * stops these movements. */ + panTilt?: boolean; + /** Set true when we want to stop ongoing zoom movement.If Zoom arguments are not present, this command stops ongoing + * zoom movement. */ + zoom?: boolean; +} + /** * PTZ methods */ @@ -533,4 +544,21 @@ export class PTZ { }`, }); } + + /** + * Operation to stop ongoing pan, tilt and zoom movements of absolute relative and continuous type. If no stop + * argument for pan, tilt or zoom is set, the device will stop all ongoing pan, tilt and zoom movements. + * @param options + */ + async stop(options?: StopOptions) { + const profileToken = options?.profileToken || this.onvif?.activeSource?.profileToken; + const panTilt = options?.panTilt ?? true; + const zoom = options?.zoom ?? true; + await this.onvif.request({ + service : 'PTZ', + body : '' + + `${profileToken}${panTilt}${zoom}` + + '', + }); + } } From b4c2f8ec5625e4f564c1b2c92aa882fbb87453f4 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 22 Oct 2022 09:30:17 +0300 Subject: [PATCH 066/112] Device tests and `getNTP`, `getDNS` methods --- compatibilityTest/device.js | 333 ++++++++++++++++++++++++++++++++++++ src/compatibility/cam.ts | 8 + src/device.ts | 91 +++++++++- src/media.ts | 10 +- 4 files changed, 431 insertions(+), 11 deletions(-) create mode 100644 compatibilityTest/device.js diff --git a/compatibilityTest/device.js b/compatibilityTest/device.js new file mode 100644 index 00000000..c03516e8 --- /dev/null +++ b/compatibilityTest/device.js @@ -0,0 +1,333 @@ +/* eslint-disable no-return-assign, no-new, no-unused-vars, global-require, import/no-useless-path-segments */ +const synthTest = !process.env.HOSTNAME; + +const assert = require('assert'); +const onvif = require('../build/compatibility/cam'); + +let serverMockup; +if (synthTest) { + serverMockup = require('../compatibilityTest/serverMockup'); +} + +describe('Device', () => { + let cam = null; + before(done => { + serverMockup.start((err) => { + assert.equal(err, null); + const options = { + hostname : process.env.HOSTNAME || 'localhost', + username : process.env.USERNAME || 'admin', + password : process.env.PASSWORD || '9999', + port : process.env.PORT ? parseInt(process.env.PORT, 10) : 10101, + }; + cam = new onvif.Cam(options, done); + }) + }); + + after(done => { + if (synthTest) { + serverMockup.close(); + done(); + } + }); + + describe('getNTP', () => { + it('should return NTP settings', (done) => { + cam.getNTP((err) => { + assert.strictEqual(err, null); + done(); + }); + }); + }); + + describe('setNTP', () => { + if (synthTest) { + it('should set NTP with ipv4', (done) => { + cam.setNTP({ + fromDHCP : false, + type : 'IPv4', + ipv4Address : 'localhost', + }, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + it('should set NTP with ipv6', (done) => { + cam.setNTP({ + fromDHCP : false, + type : 'IPv6', + ipv6Address : '::1/128', + dnsName : '8.8.8.8', + }, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + it('should set NTP from DHCP', (done) => + cam.setNTP({ + fromDHCP : true + }, (err) => { + assert.strictEqual(err, null); + done(); + }) + ); + it('should set multiple NTPs', (done) => { + cam.setNTP({ + fromDHCP : false, + NTPManual : [ + { + type : 'IPv4', + ipv4Address : 'localhost', + }, + { + type : 'IPv6', + ipv6Address : '::1/128', + dnsName : '8.8.8.8', + }, + ] + }, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + } + }); + + describe('getNetworkInterfaces', () => { + it('should return a NetworkInterface', (done) => { + cam.getNetworkInterfaces((err, networkInterfaces) => { + assert.strictEqual(err, null); + assert.strictEqual(networkInterfaces[0].$.token, 'eth0'); // Defined in serverMockup/device.GetNetworkInterfaces.xml) + done(); + }); + }); + }); + + describe('setNetworkInterfaces', () => { + it('should set manual IPv4, update the Cam object with the new IP and return RebootNeeded', (done) => { + const currentIP = cam.hostname; + cam.setNetworkInterfaces({ + interfaceToken : 'interfaceToken', + networkInterface : { + enabled : true, + IPv4 : { + enabled : true, + DHCP : false, + manual : { + address : '127.0.0.1', + prefixLength : 24, + } + } + } + }, (err, data) => { + const newIP = cam.hostname; // Save the new IP + cam.hostname = currentIP; // Then set the original one for other tests + assert.strictEqual(newIP, '127.0.0.1'); + assert.strictEqual(err, null); + assert.strictEqual(data.rebootNeeded, false); // Defined in serverMockup/device.SetNetworkInterfaces.xml) + done(); + }); + }); + it('should set manual IPv6, update the Cam object with the new IP and return RebootNeeded', (done) => { + const currentIP = cam.hostname; + cam.setNetworkInterfaces({ + interfaceToken : 'interfaceToken', + networkInterface : { + enabled : true, + IPv6 : { + enabled : true, + DHCP : false, + manual : { + address : '::1', + prefixLength : 24, + } + } + } + }, (err, data) => { + const newIP = cam.hostname; // Save the new IP + cam.hostname = currentIP; // Then set the original one for other tests + assert.strictEqual(newIP, '::1'); + assert.strictEqual(err, null); + assert.strictEqual(data.rebootNeeded, false); // Defined in serverMockup/device.SetNetworkInterfaces.xml) + done(); + }); + }); + }); + + describe('getNetworkDefaultGateway', () => { + it('should return a NetworkGateway', (done) => + cam.getNetworkDefaultGateway((err, data) => { + assert.strictEqual(err, null); + assert.strictEqual(data.IPv4Address, '192.168.0.1'); + assert.strictEqual(data.IPv6Address, ''); + done(); + }) + ); + }); + + describe('setNetworkDefaultGateway', () => { + it('should set IPv4 address and return a NetworkGateway', (done) => { + cam.setNetworkDefaultGateway({ + IPv4Address : '192.168.0.2', + }, (err, data) => { + assert.strictEqual(err, null); + assert.strictEqual(typeof data.IPv4Address, 'string'); // Impossible to test the set values as the response is hard written in serverMockup/device.GetNetworkDefaultGateway.xml + assert.strictEqual(typeof data.IPv6Address, 'string'); + done(); + }); + }); + it('should set IPv6 address and return a NetworkGateway', (done) => { + cam.setNetworkDefaultGateway({ + IPv6Address : '::2', + }, (err, data) => { + assert.strictEqual(err, null); + assert.strictEqual(typeof data.IPv4Address, 'string'); // Impossible to test the set values as the response is hard written in serverMockup/device.GetNetworkDefaultGateway.xml + assert.strictEqual(typeof data.IPv6Address, 'string'); + done(); + }); + }); + }); + + describe('getDNS', () => { + it('should return a DNSInformation', (done) => { + cam.getDNS((err, data) => { + assert.strictEqual(err, null); + assert.strictEqual(data.fromDHCP, false); // Values defined in serverMockup/device.GetDNS.xml + assert.ok(Array.isArray(data.DNSManual)); + assert.strictEqual(data.DNSManual[0].type, 'IPv4'); + assert.strictEqual(data.DNSManual[0].IPv4Address, '4.4.4.4'); + assert.strictEqual(data.DNSManual[1].type, 'IPv4'); + assert.strictEqual(data.DNSManual[1].IPv4Address, '8.8.8.8'); + done(); + }); + }); + }); + + describe('setDNS', () => { + it('should set IPv4 address and return a DNSInformation', (done) => { + cam.setDNS({ + fromDHCP : false, + DNSManual : [ + { + type : 'IPv4', + IPv4Address : '5.5.5.5', + }, + { + type : 'IPv4', + IPv4Address : '9.9.9.9', + } + ] + }, (err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data.DNSManual)); // Impossible to test the set values as the response is hard written in serverMockup/device.GetNetworkDefaultGateway.xml + done(); + }); + }); + it('should set IPv6 address and return a DNSInformation', (done) => { + cam.setDNS({ + fromDHCP : false, + DNSManual : [ + { + type : 'IPv6', + IPv6Address : '2001:4860:4860::8888', + }, + { + type : 'IPv6', + IPv6Address : '2001:4860:4860::8844', + } + ] + }, (err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data.DNSManual)); // Impossible to test the set values as the response is hard written in serverMockup/device.GetNetworkDefaultGateway.xml + done(); + }); + }); + }); + + describe('setSystemFactoryDefault', () => { + it('should request a soft factory default', (done) => { + cam.setSystemFactoryDefault((err) => { + assert.strictEqual(err, null); + done(); + }); + }); + it('should request a hard factory default', (done) => { + cam.setSystemFactoryDefault(true, (err) => { + assert.strictEqual(err, null); + done(); + }); + }); + }); + + describe('getUsers', () => { + it('should return a list of user', (done) => { + cam.getUsers((err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data)); + assert.strictEqual(data[0].username, 'admin'); + assert.strictEqual(data[0].password, 'admin'); + assert.strictEqual(data[0].userLevel, 'Administrator'); + done(); + }); + }); + }); + + describe('createUsers', () => { + it('should create users', (done) => { + cam.createUsers([ + { + username : 'username1', + password : 'password1', + userLevel : 'User', + }, + { + username : 'username2', + password : 'password2', + userLevel : 'User', + }, + ], (err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data)); + done(); + }); + }); + }); + + describe('setUsers', () => { + it('should set users', (done) => { + cam.setUsers([ + { + username : 'username1', + password : 'password1', + userLevel : 'User', + }, + { + username : 'username2', + password : 'password2', + userLevel : 'User', + }, + ], (err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data)); + done(); + }); + }); + }); + + describe('deleteUsers', () => { + it('should delete users', (done) => { + cam.deleteUsers([ + { + username : 'username1', + password : 'password1', + userLevel : 'User', + }, + 'username2', + ], (err, data) => { + assert.strictEqual(err, null); + assert.ok(Array.isArray(data)); + done(); + }); + }); + }); +}); diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 32b047c9..a14c90fe 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -278,4 +278,12 @@ export class Cam extends EventEmitter { if (typeof options === 'function') { (options as Callback)(null, result); } }).catch(options ? options as Callback : (error) => this.emit('error', error)); } + + getNTP(callback: Callback) { + this.onvif.device.getNTP().then((result) => callback(null, result)).catch(callback); + } + + getDNS(callback: Callback) { + this.onvif.device.getDNS().then((result) => callback(null, result)).catch(callback); + } } diff --git a/src/device.ts b/src/device.ts index ba4e6613..798a0793 100644 --- a/src/device.ts +++ b/src/device.ts @@ -1,5 +1,7 @@ import url from 'url'; -import { Onvif, OnvifServices, SetSystemDateAndTimeOptions } from './onvif'; +import { + Onvif, OnvifServices, SetSystemDateAndTimeOptions, +} from './onvif'; import { linerase } from './utils'; export interface OnvifService { @@ -240,7 +242,7 @@ export interface DeviceIOCapabilities { extensions: { telexCapabilities: any; scdlCapabilities: any; - } + }; } export interface DisplayCapabilities { @@ -380,6 +382,53 @@ export interface DeviceServiceCapabilities { auxiliaryCommands?: string[]; } +type NetworkHostType = 'IPv4'| 'IPv6' | 'DNS'; +type IPv4Address = string; +type IPv6Address = string; + +export interface IPAddress { + /** Indicates if the address is an IPv4 or IPv6 address */ + type: 'IPv4' | 'IPv6'; + /** IPv4 address */ + IPv4Address?: IPv4Address; + /** IPv6 address */ + IPv6Address?: IPv6Address; +} + +export interface NetworkHost { + /* Network host type: IPv4, IPv6 or DNS. */ + type: NetworkHostType; + /* IPv4 address. */ + IPv4Address?: IPv4Address; + /* IPv6 address. */ + IPv6Address?: IPv6Address; + /* DNS name. */ + DNSname?: string; + extension?: any; +} + +export interface NTPInformation { + /* Indicates if NTP information is to be retrieved by using DHCP. */ + fromDHCP: boolean; + /* List of NTP addresses retrieved by using DHCP. */ + NTPFromDHCP?: NetworkHost[]; + /* List of manually entered NTP addresses. */ + NTPManual?: NetworkHost[]; + extension?: any; +} + +export interface DNSInformation { + /* Indicates whether or not DNS information is retrieved from DHCP. */ + fromDHCP: boolean; + /* Search domain. */ + searchDomain?: string[]; + /* List of DNS addresses received from DHCP. */ + DNSFromDHCP?: IPAddress[]; + /* List of manually entered DNS addresses. */ + DNSManual?: IPAddress[]; + extension?: any; +} + /** * Device methods */ @@ -398,6 +447,14 @@ export class Device { get serviceCapabilities() { return this.#serviceCapabilities; } + #NTP?: NTPInformation; + get NTP() { + return this.#NTP; + } + #DNS?: DNSInformation; + get DNS() { + return this.#NTP; + } constructor(onvif: Onvif) { this.onvif = onvif; @@ -564,4 +621,34 @@ export class Device { body : '', }).then(([data]) => data[0].systemRebootResponse[0].message[0]); } + + /** + * This operation gets the NTP settings from a device. If the device supports NTP, it shall be possible to get the + * NTP server settings through the GetNTP command. + */ + async getNTP(): Promise { + const [data] = await this.onvif.request({ + service : 'device', + body : '', + }); + this.#NTP = linerase(data[0].getNTPResponse[0].NTPInformation[0]); + if (this.#NTP?.NTPManual && !Array.isArray(this.#NTP.NTPManual)) { this.#NTP.NTPManual = [this.#NTP.NTPManual]; } + if (this.#NTP?.NTPFromDHCP && !Array.isArray(this.#NTP.NTPFromDHCP)) { this.#NTP.NTPFromDHCP = [this.#NTP.NTPFromDHCP]; } + return this.#NTP!; + } + + /** + * This operation gets the DNS settings from a device. The device shall return its DNS configurations through the + * GetDNS command. + */ + async getDNS(): Promise { + const [data] = await this.onvif.request({ + service : 'device', + body : '', + }); + this.#DNS = linerase(data[0].getDNSResponse[0].DNSInformation); + if (this.#DNS?.DNSManual && !Array.isArray(this.#DNS.DNSManual)) { this.#DNS.DNSManual = [this.#DNS.DNSManual]; } + if (this.#DNS?.DNSFromDHCP && !Array.isArray(this.#DNS.DNSFromDHCP)) { this.#DNS.DNSFromDHCP = [this.#DNS.DNSFromDHCP]; } + return this.#DNS!; + } } diff --git a/src/media.ts b/src/media.ts index dfd7d935..b256f744 100644 --- a/src/media.ts +++ b/src/media.ts @@ -2,6 +2,7 @@ import { AnyURI, Name, Onvif, ReferenceToken, } from './onvif'; import { linerase } from './utils'; +import { IPAddress } from './device'; export interface IntRectangle { x: number; @@ -151,15 +152,6 @@ export interface H264Configuration { H264Profile: 'Baseline' | 'Main' | 'Extended' | 'High'; } -export interface IPAddress { - /** Indicates if the address is an IPv4 or IPv6 address */ - type: 'IPv4' | 'IPv6'; - /** IPv4 address */ - IPv4Address?: string; - /** IPv6 address */ - IPv6Address?: string; -} - export interface MulticastConfiguration { /** The multicast address (if this address is set to 0 no multicast streaming is enaled) */ address: IPAddress; From d0216d1f96d91dbd137166dc10904abf3c58f56d Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 22 Oct 2022 11:08:39 +0300 Subject: [PATCH 067/112] `getNetworkInterfaces` method --- compatibilityTest/device.js | 2 +- src/compatibility/cam.ts | 4 + src/device.ts | 173 +++++++++++++++++++++++++++++++++--- 3 files changed, 165 insertions(+), 14 deletions(-) diff --git a/compatibilityTest/device.js b/compatibilityTest/device.js index c03516e8..e710664b 100644 --- a/compatibilityTest/device.js +++ b/compatibilityTest/device.js @@ -97,7 +97,7 @@ describe('Device', () => { it('should return a NetworkInterface', (done) => { cam.getNetworkInterfaces((err, networkInterfaces) => { assert.strictEqual(err, null); - assert.strictEqual(networkInterfaces[0].$.token, 'eth0'); // Defined in serverMockup/device.GetNetworkInterfaces.xml) + assert.strictEqual(networkInterfaces[0].token, 'eth0'); // Defined in serverMockup/device.GetNetworkInterfaces.xml) done(); }); }); diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index a14c90fe..9dd70636 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -286,4 +286,8 @@ export class Cam extends EventEmitter { getDNS(callback: Callback) { this.onvif.device.getDNS().then((result) => callback(null, result)).catch(callback); } + + getNetworkInterfaces(callback: Callback) { + this.onvif.device.getNetworkInterfaces().then((result) => callback(null, result)).catch(callback); + } } diff --git a/src/device.ts b/src/device.ts index 798a0793..dfd9b99a 100644 --- a/src/device.ts +++ b/src/device.ts @@ -1,6 +1,6 @@ import url from 'url'; import { - Onvif, OnvifServices, SetSystemDateAndTimeOptions, + Onvif, OnvifServices, ReferenceToken, SetSystemDateAndTimeOptions, } from './onvif'; import { linerase } from './utils'; @@ -429,6 +429,139 @@ export interface DNSInformation { extension?: any; } +export interface NetworkInterfaceInfo { + /* Network interface name, for example eth0. */ + name?: string; + /* Network interface MAC address. */ + hwAddress: string; + /* Maximum transmission unit. */ + MTU?: number; +} + +export interface NetworkInterfaceConnectionSetting { + /* Auto negotiation on/off. */ + autoNegotiation: boolean; + /* Speed. */ + speed: number; + /* Duplex type, Half or Full. */ + duplex: 'Full' | 'Half'; +} + +export interface NetworkInterfaceLink { + /* Configured link settings. */ + adminSettings: NetworkInterfaceConnectionSetting; + /* Current active link settings. */ + operSettings: NetworkInterfaceConnectionSetting; + /* Integer indicating interface type, for example: 6 is ethernet. */ + interfaceType: number; +} + +export interface PrefixedIPv4Address { + /* IPv4 address */ + address: IPv4Address; + // Prefix/submask length + prefixLength: number; +} + +export interface IPv4Configuration { + /* List of manually added IPv4 addresses. */ + manual?: PrefixedIPv4Address[]; + /* Link local address. */ + linkLocal?: PrefixedIPv4Address; + /* IPv4 address configured by using DHCP. */ + fromDHCP?: PrefixedIPv4Address; + /* Indicates whether or not DHCP is used. */ + DHCP: boolean; +} + +export interface IPv4NetworkInterface { + /* Indicates whether or not IPv4 is enabled. */ + enabled: boolean; + /* IPv4 configuration. */ + config?: IPv4Configuration; +} + +export interface PrefixedIPv6Address { + /* IPv6 address */ + address: IPv6Address; + /* Prefix/submask length */ + prefixLength: number; +} + +export interface IPv6Configuration { + /* Indicates whether router advertisment is used. */ + acceptRouterAdvert?: boolean; + /* DHCP configuration. */ + DHCP: 'Auto' | 'Stateful' | 'Stateless' | 'Off'; + /* List of manually entered IPv6 addresses. */ + manual?: PrefixedIPv6Address[]; + /* List of link local IPv6 addresses. */ + linkLocal?: PrefixedIPv6Address[]; + /* List of IPv6 addresses configured by using DHCP. */ + fromDHCP?: PrefixedIPv6Address[]; + /* List of IPv6 addresses configured by using router advertisment. */ + fromRA?: PrefixedIPv6Address[]; + extension?: any; +} + +export interface IPv6NetworkInterface { + /* Indicates whether or not IPv6 is enabled. */ + enabled: boolean; + /* IPv4 configuration. */ + config: IPv6Configuration; +} + +export interface Dot11PSKSet { + /* According to IEEE802.11-2007 H.4.1 the RSNA PSK consists of 256 bits, or 64 octets when represented in hex + Either Key or Passphrase shall be given, if both are supplied Key shall be used by the device and Passphrase ignored. */ + key?: number; + /* According to IEEE802.11-2007 H.4.1 a pass-phrase is a sequence of between 8 and 63 ASCII-encoded characters and + each character in the pass-phrase must have an encoding in the range of 32 to 126 (decimal),inclusive. + If only Passpharse is supplied the Key shall be derived using the algorithm described in IEEE802.11-2007 section H.4 */ + passphrase?: string; + extension?: any; +} + +export interface Dot11SecurityConfiguration { + mode: 'None' | 'WEP' | 'PSK' | 'Dot1X' | 'Extended'; + algorithm?: 'CCMP' | 'TKIP' | 'Any' | 'Extended'; + PSK?: Dot11PSKSet; + dot1X?: ReferenceToken; + extension?: any; +} + +export interface Dot11Configuration { + SSID: number; + mode: 'Ad-hoc' | 'Infrastructure' | 'Extended'; + alias: string; + priority: number; + security: Dot11SecurityConfiguration; +} + +export interface NetworkInterfaceExtension { + interfaceType: number; + /* Extension point prepared for future 802.3 configuration. */ + dot3?: any; + dot11?: Dot11Configuration; + extension?: any; +} + +export interface NetworkInterface { + /* Unique identifier referencing the physical entity. */ + token: ReferenceToken; + /* Indicates whether or not an interface is enabled. */ + enabled: boolean; + /* Network interface information */ + info?: NetworkInterfaceInfo; + /* Link configuration. */ + link?: NetworkInterfaceLink; + // IPv4 network interface configuration. + IPv4?: IPv4NetworkInterface; + // IPv6 network interface configuration. + IPv6?: IPv6NetworkInterface; + extension?: NetworkInterfaceExtension; +} + /** * Device methods */ @@ -440,21 +573,15 @@ export class Device { } public media2Support = false; #scopes: Scope[] = []; - get scopes() { - return this.#scopes; - } + get scopes() { return this.#scopes; } #serviceCapabilities: DeviceServiceCapabilities = {}; - get serviceCapabilities() { - return this.#serviceCapabilities; - } + get serviceCapabilities() { return this.#serviceCapabilities; } #NTP?: NTPInformation; - get NTP() { - return this.#NTP; - } + get NTP() { return this.#NTP; } #DNS?: DNSInformation; - get DNS() { - return this.#NTP; - } + get DNS() { return this.#NTP; } + #networkInterfaces?: NetworkInterface[]; + get newtworkInterfaces() { return this.#networkInterfaces; } constructor(onvif: Onvif) { this.onvif = onvif; @@ -651,4 +778,24 @@ export class Device { if (this.#DNS?.DNSFromDHCP && !Array.isArray(this.#DNS.DNSFromDHCP)) { this.#DNS.DNSFromDHCP = [this.#DNS.DNSFromDHCP]; } return this.#DNS!; } + + /** + * This operation gets the network interface configuration from a device. The device shall support return of network + * interface configuration settings as defined by the NetworkInterface type through the GetNetworkInterfaces command. + */ + async getNetworkInterfaces(): Promise { + const [data] = await this.onvif.request({ + service : 'device', + body : '', + }); + const networkInterfaces = linerase(data[0].getNetworkInterfacesResponse[0].networkInterfaces); + // networkInterfaces is an array of network interfaces, but linerase remove the array if there is only one element inside + // so we convert it back to an array + if (!Array.isArray(networkInterfaces)) { + this.#networkInterfaces = [networkInterfaces]; + } else { + this.#networkInterfaces = networkInterfaces; + } + return this.#networkInterfaces; + } } From 7e4c31df76ceadd5d19d94036e80c2153a530d84 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Mon, 24 Oct 2022 18:41:03 +0300 Subject: [PATCH 068/112] Add docs --- docs/.nojekyll | 1 + docs/assets/highlight.css | 113 ++ docs/assets/main.js | 54 + docs/assets/search.js | 1 + docs/assets/style.css | 1225 +++++++++++++++++ docs/classes/Device.html | 168 +++ docs/classes/DiscoverySingleton.html | 826 +++++++++++ docs/classes/Media.html | 127 ++ docs/classes/Onvif.html | 1110 +++++++++++++++ docs/index.html | 609 ++++++++ docs/interfaces/ActiveSource.html | 132 ++ docs/interfaces/AnalyticsCapabilities.html | 89 ++ .../AnalyticsDeviceCapabilities.html | 80 ++ .../AnalyticsEngineConfiguration.html | 73 + .../interfaces/AudioDecoderConfiguration.html | 87 ++ .../AudioEncoder2Configuration.html | 124 ++ .../interfaces/AudioEncoderConfiguration.html | 132 ++ docs/interfaces/AudioOutputConfiguration.html | 126 ++ docs/interfaces/AudioSourceConfiguration.html | 96 ++ docs/interfaces/BacklightCompensation.html | 81 ++ docs/interfaces/BacklightCompensation20.html | 81 ++ docs/interfaces/Capabilities.html | 111 ++ docs/interfaces/CapabilitiesExtension.html | 117 ++ docs/interfaces/Config.html | 87 ++ docs/interfaces/ConfigurationSet.html | 149 ++ docs/interfaces/Defogging.html | 84 ++ docs/interfaces/DeviceCapabilities.html | 106 ++ docs/interfaces/DeviceIOCapabilities.html | 117 ++ docs/interfaces/DeviceInformation.html | 104 ++ docs/interfaces/DiscoveryOptions.html | 113 ++ docs/interfaces/DisplayCapabilities.html | 75 + docs/interfaces/EventCapabilities.html | 98 ++ docs/interfaces/EventSubscription.html | 73 + docs/interfaces/Exposure.html | 171 +++ docs/interfaces/Exposure20.html | 171 +++ docs/interfaces/FocusConfiguration.html | 91 ++ docs/interfaces/FocusConfiguration20.html | 115 ++ docs/interfaces/H264Configuration.html | 80 ++ docs/interfaces/IOCapabilities.html | 84 ++ docs/interfaces/IOCapabilitiesExtension.html | 80 ++ docs/interfaces/IPAddress.html | 86 ++ docs/interfaces/ImageStabilization.html | 84 ++ docs/interfaces/ImagingCapabilities.html | 68 + docs/interfaces/ImagingSettings.html | 156 +++ docs/interfaces/ImagingSettings20.html | 156 +++ .../ImagingSettingsExtension20.html | 75 + .../ImagingSettingsExtension202.html | 75 + .../ImagingSettingsExtension203.html | 93 ++ docs/interfaces/IntRectangle.html | 87 ++ .../interfaces/IrCutFilterAutoAdjustment.html | 95 ++ docs/interfaces/ItemList.html | 95 ++ docs/interfaces/LensDescription.html | 98 ++ docs/interfaces/LensOffset.html | 77 ++ docs/interfaces/LensProjection.html | 86 ++ docs/interfaces/MediaCapabilities.html | 84 ++ .../MediaCapabilitiesExtension.html | 66 + docs/interfaces/MediaProfile.html | 95 ++ docs/interfaces/MetadataConfiguration.html | 182 +++ docs/interfaces/Mpeg4Configuration.html | 79 ++ docs/interfaces/MulticastConfiguration.html | 100 ++ docs/interfaces/NetworkCapabilities.html | 105 ++ .../NetworkCapabilitiesExtension.html | 73 + docs/interfaces/NoiseReduction.html | 69 + docs/interfaces/OnvifOptions.html | 156 +++ docs/interfaces/OnvifRequestOptions.html | 586 ++++++++ docs/interfaces/OnvifService.html | 95 ++ docs/interfaces/OnvifServices.html | 150 ++ docs/interfaces/OnvifVersion.html | 79 ++ docs/interfaces/PTControlDirection.html | 98 ++ docs/interfaces/PTZCapabilities.html | 71 + docs/interfaces/PTZConfiguration.html | 226 +++ .../interfaces/PTZConfigurationExtension.html | 75 + docs/interfaces/PTZFilter.html | 77 ++ docs/interfaces/PTZSpeed.html | 90 ++ docs/interfaces/PanTiltLimits.html | 68 + docs/interfaces/Profile.html | 158 +++ docs/interfaces/ProfileCapabilities.html | 66 + docs/interfaces/ProfileExtension.html | 84 ++ docs/interfaces/Range.html | 73 + .../RealTimeStreamingCapabilities.html | 95 ++ docs/interfaces/ReceiverCapabilities.html | 113 ++ docs/interfaces/RecordingCapabilities.html | 101 ++ docs/interfaces/Rectangle.html | 87 ++ docs/interfaces/ReplayCapabilities.html | 66 + docs/interfaces/Rotate.html | 84 ++ docs/interfaces/RuleEngineConfiguration.html | 73 + docs/interfaces/SceneOrientation.html | 79 ++ docs/interfaces/SearchCapabilities.html | 73 + docs/interfaces/SecurityCapabilities.html | 141 ++ .../SecurityCapabilitiesExtension.html | 75 + .../SecurityCapabilitiesExtension2.html | 82 ++ docs/interfaces/Space1DDescription.html | 77 ++ docs/interfaces/Space2DDescription.html | 86 ++ docs/interfaces/SystemCapabilities.html | 159 +++ .../SystemCapabilitiesExtension.html | 94 ++ docs/interfaces/ToneCompensation.html | 84 ++ .../VideoAnalyticsConfiguration.html | 101 ++ .../VideoEncoder2Configuration.html | 165 +++ .../interfaces/VideoEncoderConfiguration.html | 171 +++ docs/interfaces/VideoRateControl.html | 86 ++ docs/interfaces/VideoRateControl2.html | 86 ++ docs/interfaces/VideoResolution.html | 77 ++ docs/interfaces/VideoSource.html | 102 ++ docs/interfaces/VideoSourceConfiguration.html | 121 ++ .../VideoSourceConfigurationExtension.html | 78 ++ .../VideoSourceConfigurationExtension2.html | 77 ++ docs/interfaces/VideoSourceExtension.html | 75 + docs/interfaces/WhiteBalance.html | 88 ++ docs/interfaces/WhiteBalance20.html | 98 ++ docs/interfaces/WideDynamicRange.html | 77 ++ docs/interfaces/WideDynamicRange20.html | 77 ++ docs/interfaces/ZoomLimits.html | 66 + docs/modules.html | 275 ++++ docs/types/AnyURI.html | 155 +++ docs/types/Duration.html | 155 +++ docs/types/Name.html | 155 +++ docs/types/ReferenceToken.html | 155 +++ docs/variables/Discovery.html | 164 +++ 118 files changed, 15870 insertions(+) create mode 100644 docs/.nojekyll create mode 100644 docs/assets/highlight.css create mode 100644 docs/assets/main.js create mode 100644 docs/assets/search.js create mode 100644 docs/assets/style.css create mode 100644 docs/classes/Device.html create mode 100644 docs/classes/DiscoverySingleton.html create mode 100644 docs/classes/Media.html create mode 100644 docs/classes/Onvif.html create mode 100644 docs/index.html create mode 100644 docs/interfaces/ActiveSource.html create mode 100644 docs/interfaces/AnalyticsCapabilities.html create mode 100644 docs/interfaces/AnalyticsDeviceCapabilities.html create mode 100644 docs/interfaces/AnalyticsEngineConfiguration.html create mode 100644 docs/interfaces/AudioDecoderConfiguration.html create mode 100644 docs/interfaces/AudioEncoder2Configuration.html create mode 100644 docs/interfaces/AudioEncoderConfiguration.html create mode 100644 docs/interfaces/AudioOutputConfiguration.html create mode 100644 docs/interfaces/AudioSourceConfiguration.html create mode 100644 docs/interfaces/BacklightCompensation.html create mode 100644 docs/interfaces/BacklightCompensation20.html create mode 100644 docs/interfaces/Capabilities.html create mode 100644 docs/interfaces/CapabilitiesExtension.html create mode 100644 docs/interfaces/Config.html create mode 100644 docs/interfaces/ConfigurationSet.html create mode 100644 docs/interfaces/Defogging.html create mode 100644 docs/interfaces/DeviceCapabilities.html create mode 100644 docs/interfaces/DeviceIOCapabilities.html create mode 100644 docs/interfaces/DeviceInformation.html create mode 100644 docs/interfaces/DiscoveryOptions.html create mode 100644 docs/interfaces/DisplayCapabilities.html create mode 100644 docs/interfaces/EventCapabilities.html create mode 100644 docs/interfaces/EventSubscription.html create mode 100644 docs/interfaces/Exposure.html create mode 100644 docs/interfaces/Exposure20.html create mode 100644 docs/interfaces/FocusConfiguration.html create mode 100644 docs/interfaces/FocusConfiguration20.html create mode 100644 docs/interfaces/H264Configuration.html create mode 100644 docs/interfaces/IOCapabilities.html create mode 100644 docs/interfaces/IOCapabilitiesExtension.html create mode 100644 docs/interfaces/IPAddress.html create mode 100644 docs/interfaces/ImageStabilization.html create mode 100644 docs/interfaces/ImagingCapabilities.html create mode 100644 docs/interfaces/ImagingSettings.html create mode 100644 docs/interfaces/ImagingSettings20.html create mode 100644 docs/interfaces/ImagingSettingsExtension20.html create mode 100644 docs/interfaces/ImagingSettingsExtension202.html create mode 100644 docs/interfaces/ImagingSettingsExtension203.html create mode 100644 docs/interfaces/IntRectangle.html create mode 100644 docs/interfaces/IrCutFilterAutoAdjustment.html create mode 100644 docs/interfaces/ItemList.html create mode 100644 docs/interfaces/LensDescription.html create mode 100644 docs/interfaces/LensOffset.html create mode 100644 docs/interfaces/LensProjection.html create mode 100644 docs/interfaces/MediaCapabilities.html create mode 100644 docs/interfaces/MediaCapabilitiesExtension.html create mode 100644 docs/interfaces/MediaProfile.html create mode 100644 docs/interfaces/MetadataConfiguration.html create mode 100644 docs/interfaces/Mpeg4Configuration.html create mode 100644 docs/interfaces/MulticastConfiguration.html create mode 100644 docs/interfaces/NetworkCapabilities.html create mode 100644 docs/interfaces/NetworkCapabilitiesExtension.html create mode 100644 docs/interfaces/NoiseReduction.html create mode 100644 docs/interfaces/OnvifOptions.html create mode 100644 docs/interfaces/OnvifRequestOptions.html create mode 100644 docs/interfaces/OnvifService.html create mode 100644 docs/interfaces/OnvifServices.html create mode 100644 docs/interfaces/OnvifVersion.html create mode 100644 docs/interfaces/PTControlDirection.html create mode 100644 docs/interfaces/PTZCapabilities.html create mode 100644 docs/interfaces/PTZConfiguration.html create mode 100644 docs/interfaces/PTZConfigurationExtension.html create mode 100644 docs/interfaces/PTZFilter.html create mode 100644 docs/interfaces/PTZSpeed.html create mode 100644 docs/interfaces/PanTiltLimits.html create mode 100644 docs/interfaces/Profile.html create mode 100644 docs/interfaces/ProfileCapabilities.html create mode 100644 docs/interfaces/ProfileExtension.html create mode 100644 docs/interfaces/Range.html create mode 100644 docs/interfaces/RealTimeStreamingCapabilities.html create mode 100644 docs/interfaces/ReceiverCapabilities.html create mode 100644 docs/interfaces/RecordingCapabilities.html create mode 100644 docs/interfaces/Rectangle.html create mode 100644 docs/interfaces/ReplayCapabilities.html create mode 100644 docs/interfaces/Rotate.html create mode 100644 docs/interfaces/RuleEngineConfiguration.html create mode 100644 docs/interfaces/SceneOrientation.html create mode 100644 docs/interfaces/SearchCapabilities.html create mode 100644 docs/interfaces/SecurityCapabilities.html create mode 100644 docs/interfaces/SecurityCapabilitiesExtension.html create mode 100644 docs/interfaces/SecurityCapabilitiesExtension2.html create mode 100644 docs/interfaces/Space1DDescription.html create mode 100644 docs/interfaces/Space2DDescription.html create mode 100644 docs/interfaces/SystemCapabilities.html create mode 100644 docs/interfaces/SystemCapabilitiesExtension.html create mode 100644 docs/interfaces/ToneCompensation.html create mode 100644 docs/interfaces/VideoAnalyticsConfiguration.html create mode 100644 docs/interfaces/VideoEncoder2Configuration.html create mode 100644 docs/interfaces/VideoEncoderConfiguration.html create mode 100644 docs/interfaces/VideoRateControl.html create mode 100644 docs/interfaces/VideoRateControl2.html create mode 100644 docs/interfaces/VideoResolution.html create mode 100644 docs/interfaces/VideoSource.html create mode 100644 docs/interfaces/VideoSourceConfiguration.html create mode 100644 docs/interfaces/VideoSourceConfigurationExtension.html create mode 100644 docs/interfaces/VideoSourceConfigurationExtension2.html create mode 100644 docs/interfaces/VideoSourceExtension.html create mode 100644 docs/interfaces/WhiteBalance.html create mode 100644 docs/interfaces/WhiteBalance20.html create mode 100644 docs/interfaces/WideDynamicRange.html create mode 100644 docs/interfaces/WideDynamicRange20.html create mode 100644 docs/interfaces/ZoomLimits.html create mode 100644 docs/modules.html create mode 100644 docs/types/AnyURI.html create mode 100644 docs/types/Duration.html create mode 100644 docs/types/Name.html create mode 100644 docs/types/ReferenceToken.html create mode 100644 docs/variables/Discovery.html diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 00000000..e2ac6616 --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css new file mode 100644 index 00000000..4f75d425 --- /dev/null +++ b/docs/assets/highlight.css @@ -0,0 +1,113 @@ +:root { + --light-hl-0: #0000FF; + --dark-hl-0: #569CD6; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #001080; + --dark-hl-2: #9CDCFE; + --light-hl-3: #795E26; + --dark-hl-3: #DCDCAA; + --light-hl-4: #A31515; + --dark-hl-4: #CE9178; + --light-hl-5: #800000; + --dark-hl-5: #808080; + --light-hl-6: #267F99; + --dark-hl-6: #4EC9B0; + --light-hl-7: #000000FF; + --dark-hl-7: #D4D4D4; + --light-hl-8: #098658; + --dark-hl-8: #B5CEA8; + --light-hl-9: #008000; + --dark-hl-9: #6A9955; + --light-hl-10: #AF00DB; + --dark-hl-10: #C586C0; + --light-hl-11: #000000; + --dark-hl-11: #C8C8C8; + --light-hl-12: #0070C1; + --dark-hl-12: #4FC1FF; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } +.hl-11 { color: var(--hl-11); } +.hl-12 { color: var(--hl-12); } +pre, code { background: var(--code-background); } diff --git a/docs/assets/main.js b/docs/assets/main.js new file mode 100644 index 00000000..abd0485a --- /dev/null +++ b/docs/assets/main.js @@ -0,0 +1,54 @@ +"use strict"; +"use strict";(()=>{var Qe=Object.create;var ae=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var Oe=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var _e=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Me=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ce(e))!Re.call(t,i)&&i!==n&&ae(t,i,{get:()=>e[i],enumerable:!(r=Pe(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Qe(Oe(t)):{},Me(e||!t||!t.__esModule?ae(n,"default",{value:t,enumerable:!0}):n,t));var de=_e((ce,he)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var h=t.utils.clone(n)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(r.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ou?h+=2:a==u&&(n+=r[l+1]*i[h+1],l+=2,h+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),m=s.str.charAt(1),v;m in s.node.edges?v=s.node.edges[m]:(v=new t.TokenSet,s.node.edges[m]=v),s.str.length==1&&(v.final=!0),i.push({node:v,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ce=="object"?he.exports=n():e.lunr=n()}(this,function(){return t})})()});var le=[];function j(t,e){le.push({selector:e,constructor:t})}var Y=class{constructor(){this.createComponents(document.body)}createComponents(e){le.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r}),r.dataset.hasInstance=String(!0))})})}};var k=class{constructor(e){this.el=e.el}};var J=class{constructor(){this.listeners={}}addEventListener(e,n){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(n)}removeEventListener(e,n){if(!(e in this.listeners))return;let r=this.listeners[e];for(let i=0,s=r.length;i{let n=Date.now();return(...r)=>{n+e-Date.now()<0&&(t(...r),n=Date.now())}};var re=class extends J{constructor(){super();this.scrollTop=0;this.lastY=0;this.width=0;this.height=0;this.showToolbar=!0;this.toolbar=document.querySelector(".tsd-page-toolbar"),this.navigation=document.querySelector(".col-menu"),window.addEventListener("scroll",ne(()=>this.onScroll(),10)),window.addEventListener("resize",ne(()=>this.onResize(),10)),this.searchInput=document.querySelector("#tsd-search input"),this.searchInput&&this.searchInput.addEventListener("focus",()=>{this.hideShowToolbar()}),this.onResize(),this.onScroll()}triggerResize(){let n=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(n)}onResize(){this.width=window.innerWidth||0,this.height=window.innerHeight||0;let n=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(n)}onScroll(){this.scrollTop=window.scrollY||0;let n=new CustomEvent("scroll",{detail:{scrollTop:this.scrollTop}});this.dispatchEvent(n),this.hideShowToolbar()}hideShowToolbar(){let n=this.showToolbar;this.showToolbar=this.lastY>=this.scrollTop||this.scrollTop<=0||!!this.searchInput&&this.searchInput===document.activeElement,n!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),this.navigation?.classList.toggle("col-menu--hide")),this.lastY=this.scrollTop}},R=re;R.instance=new re;var X=class extends k{constructor(n){super(n);this.anchors=[];this.index=-1;R.instance.addEventListener("resize",()=>this.onResize()),R.instance.addEventListener("scroll",r=>this.onScroll(r)),this.createAnchors()}createAnchors(){let n=window.location.href;n.indexOf("#")!=-1&&(n=n.substring(0,n.indexOf("#"))),this.el.querySelectorAll("a").forEach(r=>{let i=r.href;if(i.indexOf("#")==-1||i.substring(0,n.length)!=n)return;let s=i.substring(i.indexOf("#")+1),o=document.querySelector("a.tsd-anchor[name="+s+"]"),a=r.parentNode;!o||!a||this.anchors.push({link:a,anchor:o,position:0})}),this.onResize()}onResize(){let n;for(let i=0,s=this.anchors.length;ii.position-s.position);let r=new CustomEvent("scroll",{detail:{scrollTop:R.instance.scrollTop}});this.onScroll(r)}onScroll(n){let r=n.detail.scrollTop+5,i=this.anchors,s=i.length-1,o=this.index;for(;o>-1&&i[o].position>r;)o-=1;for(;o-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=o,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))}};var ue=(t,e=100)=>{let n;return(...r)=>{clearTimeout(n),n=setTimeout(()=>t(r),e)}};var me=De(de());function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let n=document.querySelector("#tsd-search input"),r=document.querySelector("#tsd-search .results");if(!n||!r)throw new Error("The input field or the result list wrapper was not found");let i=!1;r.addEventListener("mousedown",()=>i=!0),r.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),n.addEventListener("focus",()=>t.classList.add("has-focus")),n.addEventListener("blur",()=>{i||(i=!1,t.classList.remove("has-focus"))});let s={base:t.dataset.base+"/"};Fe(t,r,n,s)}function Fe(t,e,n,r){n.addEventListener("input",ue(()=>{Ae(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ve(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?fe(e,-1):s.key==="ArrowDown"?fe(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function He(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=me.Index.load(window.searchData.index))}function Ae(t,e,n,r){if(He(r,t),!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s=i?r.index.search(`*${i}*`):[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o${pe(u.parent,i)}.${l}`);let h=document.createElement("li");h.classList.value=u.classes??"";let m=document.createElement("a");m.href=r.base+u.url,m.innerHTML=l,h.append(m),e.appendChild(h)}}function fe(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ve(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function pe(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ie(t.substring(s,o)),`${ie(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ie(t.substring(s))),i.join("")}var Ne={"&":"&","<":"<",">":">","'":"'",'"':"""};function ie(t){return t.replace(/[&<>"'"]/g,e=>Ne[e])}var F="mousedown",ye="mousemove",B="mouseup",Z={x:0,y:0},ge=!1,se=!1,je=!1,H=!1,xe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(xe?"is-mobile":"not-mobile");xe&&"ontouchstart"in document.documentElement&&(je=!0,F="touchstart",ye="touchmove",B="touchend");document.addEventListener(F,t=>{se=!0,H=!1;let e=F=="touchstart"?t.targetTouches[0]:t;Z.y=e.pageY||0,Z.x=e.pageX||0});document.addEventListener(ye,t=>{if(!!se&&!H){let e=F=="touchstart"?t.targetTouches[0]:t,n=Z.x-(e.pageX||0),r=Z.y-(e.pageY||0);H=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{se=!1});document.addEventListener("click",t=>{ge&&(t.preventDefault(),t.stopImmediatePropagation(),ge=!1)});var K=class extends k{constructor(n){super(n);this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,r=>this.onPointerUp(r)),this.el.addEventListener("click",r=>r.preventDefault()),document.addEventListener(F,r=>this.onDocumentPointerDown(r)),document.addEventListener(B,r=>this.onDocumentPointerUp(r))}setActive(n){if(this.active==n)return;this.active=n,document.documentElement.classList.toggle("has-"+this.className,n),this.el.classList.toggle("active",n);let r=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(r),setTimeout(()=>document.documentElement.classList.remove(r),500)}onPointerUp(n){H||(this.setActive(!0),n.preventDefault())}onDocumentPointerDown(n){if(this.active){if(n.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(n){if(!H&&this.active&&n.target.closest(".col-menu")){let r=n.target.closest("a");if(r){let i=window.location.href;i.indexOf("#")!=-1&&(i=i.substring(0,i.indexOf("#"))),r.href.substring(0,i.length)==i&&setTimeout(()=>this.setActive(!1),250)}}}};var oe;try{oe=localStorage}catch{oe={getItem(){return null},setItem(){}}}var Q=oe;var Le=document.head.appendChild(document.createElement("style"));Le.dataset.for="filters";var ee=class extends k{constructor(n){super(n);this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),Le.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.checked}setLocalStorage(n){Q.setItem(this.key,n.toString()),this.value=n,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),document.querySelectorAll(".tsd-index-section").forEach(n=>{n.style.display="block";let r=Array.from(n.querySelectorAll(".tsd-index-link")).every(i=>i.offsetParent==null);n.style.display=r?"none":"block"})}};var te=class extends k{constructor(n){super(n);this.calculateHeights(),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.textContent.replace(/\s+/g,"-").toLowerCase()}`,this.setLocalStorage(this.fromLocalStorage(),!0),this.summary.addEventListener("click",r=>this.toggleVisibility(r)),this.icon.style.transform=this.getIconRotation()}getIconRotation(n=this.el.open){return`rotate(${n?0:-90}deg)`}calculateHeights(){let n=this.el.open,{position:r,left:i}=this.el.style;this.el.style.position="fixed",this.el.style.left="-9999px",this.el.open=!0,this.expandedHeight=this.el.offsetHeight+"px",this.el.open=!1,this.collapsedHeight=this.el.offsetHeight+"px",this.el.open=n,this.el.style.height=n?this.expandedHeight:this.collapsedHeight,this.el.style.position=r,this.el.style.left=i}toggleVisibility(n){n.preventDefault(),this.el.style.overflow="hidden",this.el.open?this.collapse():this.expand()}expand(n=!0){this.el.open=!0,this.animate(this.collapsedHeight,this.expandedHeight,{opening:!0,duration:n?300:0})}collapse(n=!0){this.animate(this.expandedHeight,this.collapsedHeight,{opening:!1,duration:n?300:0})}animate(n,r,{opening:i,duration:s=300}){if(this.animation)return;let o={duration:s,easing:"ease"};this.animation=this.el.animate({height:[n,r]},o),this.icon.animate({transform:[this.icon.style.transform||this.getIconRotation(!i),this.getIconRotation(i)]},o).addEventListener("finish",()=>{this.icon.style.transform=this.getIconRotation(i)}),this.animation.addEventListener("finish",()=>this.animationEnd(i))}animationEnd(n){this.el.open=n,this.animation=void 0,this.el.style.height="auto",this.el.style.overflow="visible",this.setLocalStorage(n)}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.open}setLocalStorage(n,r=!1){this.fromLocalStorage()===n&&!r||(Q.setItem(this.key,n.toString()),this.el.open=n,this.handleValueChange(r))}handleValueChange(n=!1){this.fromLocalStorage()===this.el.open&&!n||(this.fromLocalStorage()?this.expand(!1):this.collapse(!1))}};function be(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,Ee(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),Ee(t.value)})}function Ee(t){document.documentElement.dataset.theme=t}ve();j(X,".menu-highlight");j(K,"a[data-toggle]");j(te,".tsd-index-accordion");j(ee,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("theme");Se&&be(Se);var Be=new Y;Object.defineProperty(window,"app",{value:Be});})(); +/*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ +/*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ diff --git a/docs/assets/search.js b/docs/assets/search.js new file mode 100644 index 00000000..3986a3f4 --- /dev/null +++ b/docs/assets/search.js @@ -0,0 +1 @@ +window.searchData = JSON.parse("{\"kinds\":{\"32\":\"Variable\",\"128\":\"Class\",\"256\":\"Interface\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"262144\":\"Accessor\",\"4194304\":\"Type alias\"},\"rows\":[{\"kind\":256,\"name\":\"OnvifOptions\",\"url\":\"interfaces/OnvifOptions.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"useSecure\",\"url\":\"interfaces/OnvifOptions.html#useSecure\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"secureOptions\",\"url\":\"interfaces/OnvifOptions.html#secureOptions\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"hostname\",\"url\":\"interfaces/OnvifOptions.html#hostname\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"username\",\"url\":\"interfaces/OnvifOptions.html#username\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"password\",\"url\":\"interfaces/OnvifOptions.html#password\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"port\",\"url\":\"interfaces/OnvifOptions.html#port\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/OnvifOptions.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"timeout\",\"url\":\"interfaces/OnvifOptions.html#timeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"urn\",\"url\":\"interfaces/OnvifOptions.html#urn\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"agent\",\"url\":\"interfaces/OnvifOptions.html#agent\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"preserveAddress\",\"url\":\"interfaces/OnvifOptions.html#preserveAddress\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"autoConnect\",\"url\":\"interfaces/OnvifOptions.html#autoConnect\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":256,\"name\":\"OnvifServices\",\"url\":\"interfaces/OnvifServices.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"PTZ\",\"url\":\"interfaces/OnvifServices.html#PTZ\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"analyticsDevice\",\"url\":\"interfaces/OnvifServices.html#analyticsDevice\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"device\",\"url\":\"interfaces/OnvifServices.html#device\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"deviceIO\",\"url\":\"interfaces/OnvifServices.html#deviceIO\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"display\",\"url\":\"interfaces/OnvifServices.html#display\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"events\",\"url\":\"interfaces/OnvifServices.html#events\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"imaging\",\"url\":\"interfaces/OnvifServices.html#imaging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"media2\",\"url\":\"interfaces/OnvifServices.html#media2\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"media\",\"url\":\"interfaces/OnvifServices.html#media\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"receiver\",\"url\":\"interfaces/OnvifServices.html#receiver\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"recording\",\"url\":\"interfaces/OnvifServices.html#recording\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"replay\",\"url\":\"interfaces/OnvifServices.html#replay\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"search\",\"url\":\"interfaces/OnvifServices.html#search\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":256,\"name\":\"OnvifRequestOptions\",\"url\":\"interfaces/OnvifRequestOptions.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"service\",\"url\":\"interfaces/OnvifRequestOptions.html#service\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifRequestOptions\"},{\"kind\":1024,\"name\":\"body\",\"url\":\"interfaces/OnvifRequestOptions.html#body\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifRequestOptions\"},{\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/OnvifRequestOptions.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifRequestOptions\"},{\"kind\":1024,\"name\":\"ptz\",\"url\":\"interfaces/OnvifRequestOptions.html#ptz\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifRequestOptions\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/OnvifRequestOptions.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"OnvifRequestOptions\"},{\"kind\":256,\"name\":\"ActiveSource\",\"url\":\"interfaces/ActiveSource.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"sourceToken\",\"url\":\"interfaces/ActiveSource.html#sourceToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"profileToken\",\"url\":\"interfaces/ActiveSource.html#profileToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"videoSourceConfigurationToken\",\"url\":\"interfaces/ActiveSource.html#videoSourceConfigurationToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"encoding\",\"url\":\"interfaces/ActiveSource.html#encoding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/ActiveSource.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/ActiveSource.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"fps\",\"url\":\"interfaces/ActiveSource.html#fps\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"bitrate\",\"url\":\"interfaces/ActiveSource.html#bitrate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"ptz\",\"url\":\"interfaces/ActiveSource.html#ptz\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/ActiveSource.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/ActiveSource.html#__type.name\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"ActiveSource.__type\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/ActiveSource.html#__type.token\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"ActiveSource.__type\"},{\"kind\":128,\"name\":\"Onvif\",\"url\":\"classes/Onvif.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":1024,\"name\":\"rawRequest\",\"url\":\"classes/Onvif.html#rawRequest\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"rawResponse\",\"url\":\"classes/Onvif.html#rawResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"warn\",\"url\":\"classes/Onvif.html#warn\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"error\",\"url\":\"classes/Onvif.html#error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Onvif.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"device\",\"url\":\"classes/Onvif.html#device\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"media\",\"url\":\"classes/Onvif.html#media\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"useSecure\",\"url\":\"classes/Onvif.html#useSecure\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"secureOptions\",\"url\":\"classes/Onvif.html#secureOptions\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"hostname\",\"url\":\"classes/Onvif.html#hostname\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"username\",\"url\":\"classes/Onvif.html#username\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"password\",\"url\":\"classes/Onvif.html#password\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"port\",\"url\":\"classes/Onvif.html#port\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"path\",\"url\":\"classes/Onvif.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"timeout\",\"url\":\"classes/Onvif.html#timeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"agent\",\"url\":\"classes/Onvif.html#agent\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"preserveAddress\",\"url\":\"classes/Onvif.html#preserveAddress\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"events\",\"url\":\"classes/Onvif.html#events\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"uri\",\"url\":\"classes/Onvif.html#uri\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"timeShift\",\"url\":\"classes/Onvif.html#timeShift\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"capabilities\",\"url\":\"classes/Onvif.html#capabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"defaultProfiles\",\"url\":\"classes/Onvif.html#defaultProfiles\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"defaultProfile\",\"url\":\"classes/Onvif.html#defaultProfile\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"activeSources\",\"url\":\"classes/Onvif.html#activeSources\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"activeSource\",\"url\":\"classes/Onvif.html#activeSource\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"urn\",\"url\":\"classes/Onvif.html#urn\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"deviceInformation\",\"url\":\"classes/Onvif.html#deviceInformation\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"envelopeHeader\",\"url\":\"classes/Onvif.html#envelopeHeader\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"envelopeFooter\",\"url\":\"classes/Onvif.html#envelopeFooter\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"passwordDigest\",\"url\":\"classes/Onvif.html#passwordDigest\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Onvif.html#passwordDigest.passwordDigest-1.__type\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"Onvif.passwordDigest.passwordDigest\"},{\"kind\":1024,\"name\":\"passDigest\",\"url\":\"classes/Onvif.html#passwordDigest.passwordDigest-1.__type.passDigest\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Onvif.passwordDigest.passwordDigest.__type\"},{\"kind\":1024,\"name\":\"nonce\",\"url\":\"classes/Onvif.html#passwordDigest.passwordDigest-1.__type.nonce\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Onvif.passwordDigest.passwordDigest.__type\"},{\"kind\":1024,\"name\":\"timestamp\",\"url\":\"classes/Onvif.html#passwordDigest.passwordDigest-1.__type.timestamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Onvif.passwordDigest.passwordDigest.__type\"},{\"kind\":2048,\"name\":\"setupSystemDateAndTime\",\"url\":\"classes/Onvif.html#setupSystemDateAndTime\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"rawRequest\",\"url\":\"classes/Onvif.html#rawRequest-1\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"request\",\"url\":\"classes/Onvif.html#request\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"parseUrl\",\"url\":\"classes/Onvif.html#parseUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"getSystemDateAndTime\",\"url\":\"classes/Onvif.html#getSystemDateAndTime\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"getActiveSources\",\"url\":\"classes/Onvif.html#getActiveSources\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"connect\",\"url\":\"classes/Onvif.html#connect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":256,\"name\":\"OnvifService\",\"url\":\"interfaces/OnvifService.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"namespace\",\"url\":\"interfaces/OnvifService.html#namespace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifService\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/OnvifService.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifService\"},{\"kind\":1024,\"name\":\"minor\",\"url\":\"interfaces/OnvifService.html#minor\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifService\"},{\"kind\":1024,\"name\":\"major\",\"url\":\"interfaces/OnvifService.html#major\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifService\"},{\"kind\":256,\"name\":\"OnvifVersion\",\"url\":\"interfaces/OnvifVersion.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"major\",\"url\":\"interfaces/OnvifVersion.html#major\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifVersion\"},{\"kind\":1024,\"name\":\"minor\",\"url\":\"interfaces/OnvifVersion.html#minor\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifVersion\"},{\"kind\":256,\"name\":\"NetworkCapabilitiesExtension\",\"url\":\"interfaces/NetworkCapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"dot11Configuration\",\"url\":\"interfaces/NetworkCapabilitiesExtension.html#dot11Configuration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/NetworkCapabilitiesExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilitiesExtension\"},{\"kind\":256,\"name\":\"NetworkCapabilities\",\"url\":\"interfaces/NetworkCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"IPFilter\",\"url\":\"interfaces/NetworkCapabilities.html#IPFilter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilities\"},{\"kind\":1024,\"name\":\"zeroConfiguration\",\"url\":\"interfaces/NetworkCapabilities.html#zeroConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilities\"},{\"kind\":1024,\"name\":\"IPVersion6\",\"url\":\"interfaces/NetworkCapabilities.html#IPVersion6\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilities\"},{\"kind\":1024,\"name\":\"dynDNS\",\"url\":\"interfaces/NetworkCapabilities.html#dynDNS\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/NetworkCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilities\"},{\"kind\":256,\"name\":\"SystemCapabilitiesExtension\",\"url\":\"interfaces/SystemCapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"httpFirmwareUpgrade\",\"url\":\"interfaces/SystemCapabilitiesExtension.html#httpFirmwareUpgrade\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"httpSystemBackup\",\"url\":\"interfaces/SystemCapabilitiesExtension.html#httpSystemBackup\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"httpSystemLogging\",\"url\":\"interfaces/SystemCapabilitiesExtension.html#httpSystemLogging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"httpSupportInformation\",\"url\":\"interfaces/SystemCapabilitiesExtension.html#httpSupportInformation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/SystemCapabilitiesExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilitiesExtension\"},{\"kind\":256,\"name\":\"SystemCapabilities\",\"url\":\"interfaces/SystemCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"discoveryResolve\",\"url\":\"interfaces/SystemCapabilities.html#discoveryResolve\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"discoveryBye\",\"url\":\"interfaces/SystemCapabilities.html#discoveryBye\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"remoteDiscovery\",\"url\":\"interfaces/SystemCapabilities.html#remoteDiscovery\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"systemBackup\",\"url\":\"interfaces/SystemCapabilities.html#systemBackup\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"systemLogging\",\"url\":\"interfaces/SystemCapabilities.html#systemLogging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"firmwareUpgrade\",\"url\":\"interfaces/SystemCapabilities.html#firmwareUpgrade\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"httpFirmwareUpgrade\",\"url\":\"interfaces/SystemCapabilities.html#httpFirmwareUpgrade\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"httpSystemBackup\",\"url\":\"interfaces/SystemCapabilities.html#httpSystemBackup\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"httpSystemLogging\",\"url\":\"interfaces/SystemCapabilities.html#httpSystemLogging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"supportedVersions\",\"url\":\"interfaces/SystemCapabilities.html#supportedVersions\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"extensions\",\"url\":\"interfaces/SystemCapabilities.html#extensions\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":256,\"name\":\"IOCapabilitiesExtension\",\"url\":\"interfaces/IOCapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"auxiliary\",\"url\":\"interfaces/IOCapabilitiesExtension.html#auxiliary\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"auxiliaryCommands\",\"url\":\"interfaces/IOCapabilitiesExtension.html#auxiliaryCommands\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/IOCapabilitiesExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilitiesExtension\"},{\"kind\":256,\"name\":\"IOCapabilities\",\"url\":\"interfaces/IOCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"inputConnectors\",\"url\":\"interfaces/IOCapabilities.html#inputConnectors\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilities\"},{\"kind\":1024,\"name\":\"relayOutputs\",\"url\":\"interfaces/IOCapabilities.html#relayOutputs\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/IOCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilities\"},{\"kind\":256,\"name\":\"SecurityCapabilitiesExtension2\",\"url\":\"interfaces/SecurityCapabilitiesExtension2.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"dot1X\",\"url\":\"interfaces/SecurityCapabilitiesExtension2.html#dot1X\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilitiesExtension2\"},{\"kind\":1024,\"name\":\"supportedEAPMethod\",\"url\":\"interfaces/SecurityCapabilitiesExtension2.html#supportedEAPMethod\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilitiesExtension2\"},{\"kind\":1024,\"name\":\"remoteUserHandling\",\"url\":\"interfaces/SecurityCapabilitiesExtension2.html#remoteUserHandling\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilitiesExtension2\"},{\"kind\":256,\"name\":\"SecurityCapabilitiesExtension\",\"url\":\"interfaces/SecurityCapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"TLS1.0\",\"url\":\"interfaces/SecurityCapabilitiesExtension.html#TLS1_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/SecurityCapabilitiesExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilitiesExtension\"},{\"kind\":256,\"name\":\"SecurityCapabilities\",\"url\":\"interfaces/SecurityCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"TLS1.1\",\"url\":\"interfaces/SecurityCapabilities.html#TLS1_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"TLS1.2\",\"url\":\"interfaces/SecurityCapabilities.html#TLS1_2\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"onboardKeyGeneration\",\"url\":\"interfaces/SecurityCapabilities.html#onboardKeyGeneration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"accessPolicyConfig\",\"url\":\"interfaces/SecurityCapabilities.html#accessPolicyConfig\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"X.509Token\",\"url\":\"interfaces/SecurityCapabilities.html#X_509Token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"SAMLToken\",\"url\":\"interfaces/SecurityCapabilities.html#SAMLToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"kerberosToken\",\"url\":\"interfaces/SecurityCapabilities.html#kerberosToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"RELToken\",\"url\":\"interfaces/SecurityCapabilities.html#RELToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/SecurityCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":256,\"name\":\"EventCapabilities\",\"url\":\"interfaces/EventCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/EventCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventCapabilities\"},{\"kind\":1024,\"name\":\"WSSubscriptionPolicySupport\",\"url\":\"interfaces/EventCapabilities.html#WSSubscriptionPolicySupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventCapabilities\"},{\"kind\":1024,\"name\":\"WSPullPointSupport\",\"url\":\"interfaces/EventCapabilities.html#WSPullPointSupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventCapabilities\"},{\"kind\":1024,\"name\":\"WSPausableSubscriptionManagerInterfaceSupport\",\"url\":\"interfaces/EventCapabilities.html#WSPausableSubscriptionManagerInterfaceSupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventCapabilities\"},{\"kind\":256,\"name\":\"ImagingCapabilities\",\"url\":\"interfaces/ImagingCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/ImagingCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingCapabilities\"},{\"kind\":256,\"name\":\"RealTimeStreamingCapabilities\",\"url\":\"interfaces/RealTimeStreamingCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"RTPMulticast\",\"url\":\"interfaces/RealTimeStreamingCapabilities.html#RTPMulticast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RealTimeStreamingCapabilities\"},{\"kind\":1024,\"name\":\"RTP_TCP\",\"url\":\"interfaces/RealTimeStreamingCapabilities.html#RTP_TCP\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RealTimeStreamingCapabilities\"},{\"kind\":1024,\"name\":\"RTP_RTSP_TCP\",\"url\":\"interfaces/RealTimeStreamingCapabilities.html#RTP_RTSP_TCP\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RealTimeStreamingCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/RealTimeStreamingCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RealTimeStreamingCapabilities\"},{\"kind\":256,\"name\":\"ProfileCapabilities\",\"url\":\"interfaces/ProfileCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"maximumNumberOfProfiles\",\"url\":\"interfaces/ProfileCapabilities.html#maximumNumberOfProfiles\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ProfileCapabilities\"},{\"kind\":256,\"name\":\"MediaCapabilitiesExtension\",\"url\":\"interfaces/MediaCapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"profileCapabilities\",\"url\":\"interfaces/MediaCapabilitiesExtension.html#profileCapabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaCapabilitiesExtension\"},{\"kind\":256,\"name\":\"MediaCapabilities\",\"url\":\"interfaces/MediaCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/MediaCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaCapabilities\"},{\"kind\":1024,\"name\":\"streamingCapabilities\",\"url\":\"interfaces/MediaCapabilities.html#streamingCapabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/MediaCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaCapabilities\"},{\"kind\":256,\"name\":\"PTZCapabilities\",\"url\":\"interfaces/PTZCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/PTZCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZCapabilities\"},{\"kind\":256,\"name\":\"DeviceIOCapabilities\",\"url\":\"interfaces/DeviceIOCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/DeviceIOCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"videoSources\",\"url\":\"interfaces/DeviceIOCapabilities.html#videoSources\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"videoOutputs\",\"url\":\"interfaces/DeviceIOCapabilities.html#videoOutputs\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"audioSources\",\"url\":\"interfaces/DeviceIOCapabilities.html#audioSources\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"audioOutputs\",\"url\":\"interfaces/DeviceIOCapabilities.html#audioOutputs\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"relayOutputs\",\"url\":\"interfaces/DeviceIOCapabilities.html#relayOutputs\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"extensions\",\"url\":\"interfaces/DeviceIOCapabilities.html#extensions\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/DeviceIOCapabilities.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"telexCapabilities\",\"url\":\"interfaces/DeviceIOCapabilities.html#__type.telexCapabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"DeviceIOCapabilities.__type\"},{\"kind\":1024,\"name\":\"scdlCapabilities\",\"url\":\"interfaces/DeviceIOCapabilities.html#__type.scdlCapabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"DeviceIOCapabilities.__type\"},{\"kind\":256,\"name\":\"DisplayCapabilities\",\"url\":\"interfaces/DisplayCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/DisplayCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DisplayCapabilities\"},{\"kind\":1024,\"name\":\"fixedLayout\",\"url\":\"interfaces/DisplayCapabilities.html#fixedLayout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DisplayCapabilities\"},{\"kind\":256,\"name\":\"RecordingCapabilities\",\"url\":\"interfaces/RecordingCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/RecordingCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":1024,\"name\":\"receiverSource\",\"url\":\"interfaces/RecordingCapabilities.html#receiverSource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":1024,\"name\":\"mediaProfileSource\",\"url\":\"interfaces/RecordingCapabilities.html#mediaProfileSource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":1024,\"name\":\"dynamicRecordings\",\"url\":\"interfaces/RecordingCapabilities.html#dynamicRecordings\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":1024,\"name\":\"dynamicTracks\",\"url\":\"interfaces/RecordingCapabilities.html#dynamicTracks\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":1024,\"name\":\"maxStringLength\",\"url\":\"interfaces/RecordingCapabilities.html#maxStringLength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":256,\"name\":\"SearchCapabilities\",\"url\":\"interfaces/SearchCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/SearchCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SearchCapabilities\"},{\"kind\":1024,\"name\":\"metadataSearch\",\"url\":\"interfaces/SearchCapabilities.html#metadataSearch\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SearchCapabilities\"},{\"kind\":256,\"name\":\"ReplayCapabilities\",\"url\":\"interfaces/ReplayCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/ReplayCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReplayCapabilities\"},{\"kind\":256,\"name\":\"ReceiverCapabilities\",\"url\":\"interfaces/ReceiverCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/ReceiverCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":1024,\"name\":\"RTP_Multicast\",\"url\":\"interfaces/ReceiverCapabilities.html#RTP_Multicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":1024,\"name\":\"RTP_TCP\",\"url\":\"interfaces/ReceiverCapabilities.html#RTP_TCP\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":1024,\"name\":\"RTP_RTSP_TCP\",\"url\":\"interfaces/ReceiverCapabilities.html#RTP_RTSP_TCP\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":1024,\"name\":\"supportedReceivers\",\"url\":\"interfaces/ReceiverCapabilities.html#supportedReceivers\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":1024,\"name\":\"maximumRTSPURILength\",\"url\":\"interfaces/ReceiverCapabilities.html#maximumRTSPURILength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":256,\"name\":\"AnalyticsDeviceCapabilities\",\"url\":\"interfaces/AnalyticsDeviceCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/AnalyticsDeviceCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsDeviceCapabilities\"},{\"kind\":1024,\"name\":\"ruleSupport\",\"url\":\"interfaces/AnalyticsDeviceCapabilities.html#ruleSupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsDeviceCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/AnalyticsDeviceCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsDeviceCapabilities\"},{\"kind\":256,\"name\":\"CapabilitiesExtension\",\"url\":\"interfaces/CapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/CapabilitiesExtension.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"deviceIO\",\"url\":\"interfaces/CapabilitiesExtension.html#deviceIO\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"display\",\"url\":\"interfaces/CapabilitiesExtension.html#display\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"recording\",\"url\":\"interfaces/CapabilitiesExtension.html#recording\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"search\",\"url\":\"interfaces/CapabilitiesExtension.html#search\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"replay\",\"url\":\"interfaces/CapabilitiesExtension.html#replay\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"receiver\",\"url\":\"interfaces/CapabilitiesExtension.html#receiver\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"analyticsDevice\",\"url\":\"interfaces/CapabilitiesExtension.html#analyticsDevice\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":256,\"name\":\"DeviceCapabilities\",\"url\":\"interfaces/DeviceCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/DeviceCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":1024,\"name\":\"network\",\"url\":\"interfaces/DeviceCapabilities.html#network\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":1024,\"name\":\"system\",\"url\":\"interfaces/DeviceCapabilities.html#system\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":1024,\"name\":\"IO\",\"url\":\"interfaces/DeviceCapabilities.html#IO\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":1024,\"name\":\"security\",\"url\":\"interfaces/DeviceCapabilities.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":1024,\"name\":\"extensions\",\"url\":\"interfaces/DeviceCapabilities.html#extensions\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":256,\"name\":\"AnalyticsCapabilities\",\"url\":\"interfaces/AnalyticsCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/AnalyticsCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsCapabilities\"},{\"kind\":1024,\"name\":\"ruleSupport\",\"url\":\"interfaces/AnalyticsCapabilities.html#ruleSupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsCapabilities\"},{\"kind\":1024,\"name\":\"analyticsModuleSupport\",\"url\":\"interfaces/AnalyticsCapabilities.html#analyticsModuleSupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsCapabilities\"},{\"kind\":256,\"name\":\"Capabilities\",\"url\":\"interfaces/Capabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"analytics\",\"url\":\"interfaces/Capabilities.html#analytics\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"device\",\"url\":\"interfaces/Capabilities.html#device\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"events\",\"url\":\"interfaces/Capabilities.html#events\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"imaging\",\"url\":\"interfaces/Capabilities.html#imaging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"media\",\"url\":\"interfaces/Capabilities.html#media\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"ptz\",\"url\":\"interfaces/Capabilities.html#ptz\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/Capabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":128,\"name\":\"Device\",\"url\":\"classes/Device.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Device.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":1024,\"name\":\"onvif\",\"url\":\"classes/Device.html#onvif\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Device\"},{\"kind\":1024,\"name\":\"services\",\"url\":\"classes/Device.html#services\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Device\"},{\"kind\":1024,\"name\":\"media2Support\",\"url\":\"classes/Device.html#media2Support\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":2048,\"name\":\"getSystemDateAndTime\",\"url\":\"classes/Device.html#getSystemDateAndTime\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":2048,\"name\":\"getServices\",\"url\":\"classes/Device.html#getServices\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":2048,\"name\":\"getCapabilities\",\"url\":\"classes/Device.html#getCapabilities\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":2048,\"name\":\"getDeviceInformation\",\"url\":\"classes/Device.html#getDeviceInformation\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":2048,\"name\":\"getHostname\",\"url\":\"classes/Device.html#getHostname\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":256,\"name\":\"DeviceInformation\",\"url\":\"interfaces/DeviceInformation.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"manufacturer\",\"url\":\"interfaces/DeviceInformation.html#manufacturer\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceInformation\"},{\"kind\":1024,\"name\":\"model\",\"url\":\"interfaces/DeviceInformation.html#model\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceInformation\"},{\"kind\":1024,\"name\":\"firmwareVersion\",\"url\":\"interfaces/DeviceInformation.html#firmwareVersion\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceInformation\"},{\"kind\":1024,\"name\":\"serialNumber\",\"url\":\"interfaces/DeviceInformation.html#serialNumber\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceInformation\"},{\"kind\":1024,\"name\":\"hardwareId\",\"url\":\"interfaces/DeviceInformation.html#hardwareId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceInformation\"},{\"kind\":4194304,\"name\":\"AnyURI\",\"url\":\"types/AnyURI.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"ReferenceToken\",\"url\":\"types/ReferenceToken.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"Name\",\"url\":\"types/Name.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":256,\"name\":\"IntRectangle\",\"url\":\"interfaces/IntRectangle.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"x\",\"url\":\"interfaces/IntRectangle.html#x\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IntRectangle\"},{\"kind\":1024,\"name\":\"y\",\"url\":\"interfaces/IntRectangle.html#y\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IntRectangle\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/IntRectangle.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IntRectangle\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/IntRectangle.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IntRectangle\"},{\"kind\":256,\"name\":\"Rotate\",\"url\":\"interfaces/Rotate.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/Rotate.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rotate\"},{\"kind\":1024,\"name\":\"degree\",\"url\":\"interfaces/Rotate.html#degree\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rotate\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/Rotate.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rotate\"},{\"kind\":256,\"name\":\"LensOffset\",\"url\":\"interfaces/LensOffset.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"x\",\"url\":\"interfaces/LensOffset.html#x\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensOffset\"},{\"kind\":1024,\"name\":\"y\",\"url\":\"interfaces/LensOffset.html#y\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensOffset\"},{\"kind\":256,\"name\":\"LensProjection\",\"url\":\"interfaces/LensProjection.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"angle\",\"url\":\"interfaces/LensProjection.html#angle\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensProjection\"},{\"kind\":1024,\"name\":\"radius\",\"url\":\"interfaces/LensProjection.html#radius\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensProjection\"},{\"kind\":1024,\"name\":\"transmittance\",\"url\":\"interfaces/LensProjection.html#transmittance\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensProjection\"},{\"kind\":256,\"name\":\"LensDescription\",\"url\":\"interfaces/LensDescription.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"focalLength\",\"url\":\"interfaces/LensDescription.html#focalLength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensDescription\"},{\"kind\":1024,\"name\":\"offset\",\"url\":\"interfaces/LensDescription.html#offset\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensDescription\"},{\"kind\":1024,\"name\":\"projection\",\"url\":\"interfaces/LensDescription.html#projection\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensDescription\"},{\"kind\":1024,\"name\":\"XFactor\",\"url\":\"interfaces/LensDescription.html#XFactor\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensDescription\"},{\"kind\":256,\"name\":\"SceneOrientation\",\"url\":\"interfaces/SceneOrientation.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/SceneOrientation.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SceneOrientation\"},{\"kind\":1024,\"name\":\"orientation\",\"url\":\"interfaces/SceneOrientation.html#orientation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SceneOrientation\"},{\"kind\":256,\"name\":\"VideoSourceConfigurationExtension2\",\"url\":\"interfaces/VideoSourceConfigurationExtension2.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"lensDescription\",\"url\":\"interfaces/VideoSourceConfigurationExtension2.html#lensDescription\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfigurationExtension2\"},{\"kind\":1024,\"name\":\"sceneOrientation\",\"url\":\"interfaces/VideoSourceConfigurationExtension2.html#sceneOrientation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfigurationExtension2\"},{\"kind\":256,\"name\":\"VideoSourceConfigurationExtension\",\"url\":\"interfaces/VideoSourceConfigurationExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"rotate\",\"url\":\"interfaces/VideoSourceConfigurationExtension.html#rotate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfigurationExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/VideoSourceConfigurationExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfigurationExtension\"},{\"kind\":256,\"name\":\"VideoSourceConfiguration\",\"url\":\"interfaces/VideoSourceConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/VideoSourceConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/VideoSourceConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/VideoSourceConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"viewMode\",\"url\":\"interfaces/VideoSourceConfiguration.html#viewMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"sourceToken\",\"url\":\"interfaces/VideoSourceConfiguration.html#sourceToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"bounds\",\"url\":\"interfaces/VideoSourceConfiguration.html#bounds\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/VideoSourceConfiguration.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":256,\"name\":\"AudioSourceConfiguration\",\"url\":\"interfaces/AudioSourceConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/AudioSourceConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioSourceConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/AudioSourceConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioSourceConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/AudioSourceConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioSourceConfiguration\"},{\"kind\":1024,\"name\":\"sourceToken\",\"url\":\"interfaces/AudioSourceConfiguration.html#sourceToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioSourceConfiguration\"},{\"kind\":256,\"name\":\"VideoResolution\",\"url\":\"interfaces/VideoResolution.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/VideoResolution.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoResolution\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/VideoResolution.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoResolution\"},{\"kind\":256,\"name\":\"VideoRateControl\",\"url\":\"interfaces/VideoRateControl.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"frameRateLimit\",\"url\":\"interfaces/VideoRateControl.html#frameRateLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl\"},{\"kind\":1024,\"name\":\"encodingInterval\",\"url\":\"interfaces/VideoRateControl.html#encodingInterval\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl\"},{\"kind\":1024,\"name\":\"bitrateLimit\",\"url\":\"interfaces/VideoRateControl.html#bitrateLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl\"},{\"kind\":256,\"name\":\"Mpeg4Configuration\",\"url\":\"interfaces/Mpeg4Configuration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"govLength\",\"url\":\"interfaces/Mpeg4Configuration.html#govLength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Mpeg4Configuration\"},{\"kind\":1024,\"name\":\"mpeg4Profile\",\"url\":\"interfaces/Mpeg4Configuration.html#mpeg4Profile\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Mpeg4Configuration\"},{\"kind\":256,\"name\":\"H264Configuration\",\"url\":\"interfaces/H264Configuration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"govLength\",\"url\":\"interfaces/H264Configuration.html#govLength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"H264Configuration\"},{\"kind\":1024,\"name\":\"H264Profile\",\"url\":\"interfaces/H264Configuration.html#H264Profile\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"H264Configuration\"},{\"kind\":256,\"name\":\"IPAddress\",\"url\":\"interfaces/IPAddress.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/IPAddress.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IPAddress\"},{\"kind\":1024,\"name\":\"IPv4Address\",\"url\":\"interfaces/IPAddress.html#IPv4Address\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IPAddress\"},{\"kind\":1024,\"name\":\"IPv6Address\",\"url\":\"interfaces/IPAddress.html#IPv6Address\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IPAddress\"},{\"kind\":256,\"name\":\"MulticastConfiguration\",\"url\":\"interfaces/MulticastConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"address\",\"url\":\"interfaces/MulticastConfiguration.html#address\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MulticastConfiguration\"},{\"kind\":1024,\"name\":\"port\",\"url\":\"interfaces/MulticastConfiguration.html#port\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MulticastConfiguration\"},{\"kind\":1024,\"name\":\"TTL\",\"url\":\"interfaces/MulticastConfiguration.html#TTL\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MulticastConfiguration\"},{\"kind\":1024,\"name\":\"autoStart\",\"url\":\"interfaces/MulticastConfiguration.html#autoStart\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MulticastConfiguration\"},{\"kind\":4194304,\"name\":\"Duration\",\"url\":\"types/Duration.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":256,\"name\":\"VideoEncoderConfiguration\",\"url\":\"interfaces/VideoEncoderConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/VideoEncoderConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/VideoEncoderConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/VideoEncoderConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"guaranteedFrameRate\",\"url\":\"interfaces/VideoEncoderConfiguration.html#guaranteedFrameRate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"encoding\",\"url\":\"interfaces/VideoEncoderConfiguration.html#encoding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"resolution\",\"url\":\"interfaces/VideoEncoderConfiguration.html#resolution\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"quality\",\"url\":\"interfaces/VideoEncoderConfiguration.html#quality\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"rateControl\",\"url\":\"interfaces/VideoEncoderConfiguration.html#rateControl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"MPEG4\",\"url\":\"interfaces/VideoEncoderConfiguration.html#MPEG4\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"H264\",\"url\":\"interfaces/VideoEncoderConfiguration.html#H264\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"multicast\",\"url\":\"interfaces/VideoEncoderConfiguration.html#multicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"sessionTimeout\",\"url\":\"interfaces/VideoEncoderConfiguration.html#sessionTimeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":256,\"name\":\"AudioEncoderConfiguration\",\"url\":\"interfaces/AudioEncoderConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/AudioEncoderConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/AudioEncoderConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/AudioEncoderConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"encoding\",\"url\":\"interfaces/AudioEncoderConfiguration.html#encoding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"bitrate\",\"url\":\"interfaces/AudioEncoderConfiguration.html#bitrate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"sampleRate\",\"url\":\"interfaces/AudioEncoderConfiguration.html#sampleRate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"multicast\",\"url\":\"interfaces/AudioEncoderConfiguration.html#multicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"sessionTimeout\",\"url\":\"interfaces/AudioEncoderConfiguration.html#sessionTimeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":256,\"name\":\"ItemList\",\"url\":\"interfaces/ItemList.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"simpleItem\",\"url\":\"interfaces/ItemList.html#simpleItem\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ItemList\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/ItemList.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"ItemList\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/ItemList.html#__type.name\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"ItemList.__type\"},{\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/ItemList.html#__type.value\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"ItemList.__type\"},{\"kind\":1024,\"name\":\"elementItem\",\"url\":\"interfaces/ItemList.html#elementItem\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ItemList\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ItemList.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ItemList\"},{\"kind\":256,\"name\":\"Config\",\"url\":\"interfaces/Config.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/Config.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/Config.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"parameters\",\"url\":\"interfaces/Config.html#parameters\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":256,\"name\":\"AnalyticsEngineConfiguration\",\"url\":\"interfaces/AnalyticsEngineConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"analyticsModule\",\"url\":\"interfaces/AnalyticsEngineConfiguration.html#analyticsModule\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsEngineConfiguration\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/AnalyticsEngineConfiguration.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsEngineConfiguration\"},{\"kind\":256,\"name\":\"RuleEngineConfiguration\",\"url\":\"interfaces/RuleEngineConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"rule\",\"url\":\"interfaces/RuleEngineConfiguration.html#rule\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RuleEngineConfiguration\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/RuleEngineConfiguration.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RuleEngineConfiguration\"},{\"kind\":256,\"name\":\"VideoAnalyticsConfiguration\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoAnalyticsConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoAnalyticsConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoAnalyticsConfiguration\"},{\"kind\":1024,\"name\":\"analyticsEngineConfiguration\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html#analyticsEngineConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoAnalyticsConfiguration\"},{\"kind\":1024,\"name\":\"ruleEngineConfiguration\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html#ruleEngineConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoAnalyticsConfiguration\"},{\"kind\":256,\"name\":\"PTZSpeed\",\"url\":\"interfaces/PTZSpeed.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"panTilt\",\"url\":\"interfaces/PTZSpeed.html#panTilt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZSpeed\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/PTZSpeed.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"PTZSpeed\"},{\"kind\":1024,\"name\":\"x\",\"url\":\"interfaces/PTZSpeed.html#__type.x\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PTZSpeed.__type\"},{\"kind\":1024,\"name\":\"y\",\"url\":\"interfaces/PTZSpeed.html#__type.y\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PTZSpeed.__type\"},{\"kind\":1024,\"name\":\"zoom\",\"url\":\"interfaces/PTZSpeed.html#zoom\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZSpeed\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/PTZSpeed.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"PTZSpeed\"},{\"kind\":1024,\"name\":\"x\",\"url\":\"interfaces/PTZSpeed.html#__type-1.x-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PTZSpeed.__type\"},{\"kind\":256,\"name\":\"Range\",\"url\":\"interfaces/Range.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"min\",\"url\":\"interfaces/Range.html#min\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Range\"},{\"kind\":1024,\"name\":\"max\",\"url\":\"interfaces/Range.html#max\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Range\"},{\"kind\":256,\"name\":\"Space2DDescription\",\"url\":\"interfaces/Space2DDescription.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"URI\",\"url\":\"interfaces/Space2DDescription.html#URI\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Space2DDescription\"},{\"kind\":1024,\"name\":\"XRange\",\"url\":\"interfaces/Space2DDescription.html#XRange\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Space2DDescription\"},{\"kind\":1024,\"name\":\"YRange\",\"url\":\"interfaces/Space2DDescription.html#YRange\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Space2DDescription\"},{\"kind\":256,\"name\":\"PanTiltLimits\",\"url\":\"interfaces/PanTiltLimits.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"range\",\"url\":\"interfaces/PanTiltLimits.html#range\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PanTiltLimits\"},{\"kind\":256,\"name\":\"Space1DDescription\",\"url\":\"interfaces/Space1DDescription.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"URI\",\"url\":\"interfaces/Space1DDescription.html#URI\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Space1DDescription\"},{\"kind\":1024,\"name\":\"XRange\",\"url\":\"interfaces/Space1DDescription.html#XRange\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Space1DDescription\"},{\"kind\":256,\"name\":\"ZoomLimits\",\"url\":\"interfaces/ZoomLimits.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"range\",\"url\":\"interfaces/ZoomLimits.html#range\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ZoomLimits\"},{\"kind\":256,\"name\":\"PTControlDirection\",\"url\":\"interfaces/PTControlDirection.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"EFlip\",\"url\":\"interfaces/PTControlDirection.html#EFlip\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTControlDirection\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/PTControlDirection.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"PTControlDirection\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/PTControlDirection.html#__type.mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PTControlDirection.__type\"},{\"kind\":1024,\"name\":\"reverse\",\"url\":\"interfaces/PTControlDirection.html#reverse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTControlDirection\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/PTControlDirection.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"PTControlDirection\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/PTControlDirection.html#__type-1.mode-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PTControlDirection.__type\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/PTControlDirection.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTControlDirection\"},{\"kind\":256,\"name\":\"PTZConfigurationExtension\",\"url\":\"interfaces/PTZConfigurationExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"PTControlDirection\",\"url\":\"interfaces/PTZConfigurationExtension.html#PTControlDirection\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfigurationExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/PTZConfigurationExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfigurationExtension\"},{\"kind\":256,\"name\":\"PTZConfiguration\",\"url\":\"interfaces/PTZConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/PTZConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/PTZConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/PTZConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"moveRamp\",\"url\":\"interfaces/PTZConfiguration.html#moveRamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"presetRamp\",\"url\":\"interfaces/PTZConfiguration.html#presetRamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"presetTourRamp\",\"url\":\"interfaces/PTZConfiguration.html#presetTourRamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"nodeToken\",\"url\":\"interfaces/PTZConfiguration.html#nodeToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultAbsolutePantTiltPositionSpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultAbsolutePantTiltPositionSpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultAbsoluteZoomPositionSpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultAbsoluteZoomPositionSpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultRelativePanTiltTranslationSpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultRelativePanTiltTranslationSpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultRelativeZoomTranslationSpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultRelativeZoomTranslationSpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultContinuousPanTiltVelocitySpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultContinuousPanTiltVelocitySpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultContinuousZoomVelocitySpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultContinuousZoomVelocitySpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultPTZSpeed\",\"url\":\"interfaces/PTZConfiguration.html#defaultPTZSpeed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultPTZTimeout\",\"url\":\"interfaces/PTZConfiguration.html#defaultPTZTimeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"panTiltLimits\",\"url\":\"interfaces/PTZConfiguration.html#panTiltLimits\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"zoomLimits\",\"url\":\"interfaces/PTZConfiguration.html#zoomLimits\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/PTZConfiguration.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":256,\"name\":\"PTZFilter\",\"url\":\"interfaces/PTZFilter.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"status\",\"url\":\"interfaces/PTZFilter.html#status\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZFilter\"},{\"kind\":1024,\"name\":\"position\",\"url\":\"interfaces/PTZFilter.html#position\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZFilter\"},{\"kind\":256,\"name\":\"EventSubscription\",\"url\":\"interfaces/EventSubscription.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"filter\",\"url\":\"interfaces/EventSubscription.html#filter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventSubscription\"},{\"kind\":1024,\"name\":\"subscriptionPolicy\",\"url\":\"interfaces/EventSubscription.html#subscriptionPolicy\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventSubscription\"},{\"kind\":256,\"name\":\"MetadataConfiguration\",\"url\":\"interfaces/MetadataConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/MetadataConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/MetadataConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/MetadataConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"compressionType\",\"url\":\"interfaces/MetadataConfiguration.html#compressionType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"geoLocation\",\"url\":\"interfaces/MetadataConfiguration.html#geoLocation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"shapePolygon\",\"url\":\"interfaces/MetadataConfiguration.html#shapePolygon\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"PTZStatus\",\"url\":\"interfaces/MetadataConfiguration.html#PTZStatus\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"events\",\"url\":\"interfaces/MetadataConfiguration.html#events\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"analytics\",\"url\":\"interfaces/MetadataConfiguration.html#analytics\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"multicast\",\"url\":\"interfaces/MetadataConfiguration.html#multicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"sessionTimeout\",\"url\":\"interfaces/MetadataConfiguration.html#sessionTimeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"analyticsEngineConfiguration\",\"url\":\"interfaces/MetadataConfiguration.html#analyticsEngineConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/MetadataConfiguration.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":256,\"name\":\"AudioOutputConfiguration\",\"url\":\"interfaces/AudioOutputConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/AudioOutputConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/AudioOutputConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/AudioOutputConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":1024,\"name\":\"outputToken\",\"url\":\"interfaces/AudioOutputConfiguration.html#outputToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":1024,\"name\":\"sendPrimacy\",\"url\":\"interfaces/AudioOutputConfiguration.html#sendPrimacy\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":1024,\"name\":\"outputLevel\",\"url\":\"interfaces/AudioOutputConfiguration.html#outputLevel\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":256,\"name\":\"AudioDecoderConfiguration\",\"url\":\"interfaces/AudioDecoderConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/AudioDecoderConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioDecoderConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/AudioDecoderConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioDecoderConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/AudioDecoderConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioDecoderConfiguration\"},{\"kind\":256,\"name\":\"ProfileExtension\",\"url\":\"interfaces/ProfileExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"audioOutputConfiguration\",\"url\":\"interfaces/ProfileExtension.html#audioOutputConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ProfileExtension\"},{\"kind\":1024,\"name\":\"audioDecoderConfiguration\",\"url\":\"interfaces/ProfileExtension.html#audioDecoderConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ProfileExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ProfileExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ProfileExtension\"},{\"kind\":256,\"name\":\"Profile\",\"url\":\"interfaces/Profile.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/Profile.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"fixed\",\"url\":\"interfaces/Profile.html#fixed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/Profile.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"videoSourceConfiguration\",\"url\":\"interfaces/Profile.html#videoSourceConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"audioSourceConfiguration\",\"url\":\"interfaces/Profile.html#audioSourceConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"videoEncoderConfiguration\",\"url\":\"interfaces/Profile.html#videoEncoderConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"audioEncoderConfiguration\",\"url\":\"interfaces/Profile.html#audioEncoderConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"videoAnalyticsConfiguration\",\"url\":\"interfaces/Profile.html#videoAnalyticsConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"PTZConfiguration\",\"url\":\"interfaces/Profile.html#PTZConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"metadataConfiguration\",\"url\":\"interfaces/Profile.html#metadataConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/Profile.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":256,\"name\":\"VideoRateControl2\",\"url\":\"interfaces/VideoRateControl2.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"constantBitRate\",\"url\":\"interfaces/VideoRateControl2.html#constantBitRate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl2\"},{\"kind\":1024,\"name\":\"frameRateLimit\",\"url\":\"interfaces/VideoRateControl2.html#frameRateLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl2\"},{\"kind\":1024,\"name\":\"bitrateLimit\",\"url\":\"interfaces/VideoRateControl2.html#bitrateLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl2\"},{\"kind\":256,\"name\":\"VideoEncoder2Configuration\",\"url\":\"interfaces/VideoEncoder2Configuration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/VideoEncoder2Configuration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/VideoEncoder2Configuration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/VideoEncoder2Configuration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"govLength\",\"url\":\"interfaces/VideoEncoder2Configuration.html#govLength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"profile\",\"url\":\"interfaces/VideoEncoder2Configuration.html#profile\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"guaranteedFrameRate\",\"url\":\"interfaces/VideoEncoder2Configuration.html#guaranteedFrameRate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"encoding\",\"url\":\"interfaces/VideoEncoder2Configuration.html#encoding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"resolution\",\"url\":\"interfaces/VideoEncoder2Configuration.html#resolution\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"rateControl\",\"url\":\"interfaces/VideoEncoder2Configuration.html#rateControl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"mutlicast\",\"url\":\"interfaces/VideoEncoder2Configuration.html#mutlicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"quality\",\"url\":\"interfaces/VideoEncoder2Configuration.html#quality\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":256,\"name\":\"AudioEncoder2Configuration\",\"url\":\"interfaces/AudioEncoder2Configuration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/AudioEncoder2Configuration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/AudioEncoder2Configuration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/AudioEncoder2Configuration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"encoding\",\"url\":\"interfaces/AudioEncoder2Configuration.html#encoding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"multicast\",\"url\":\"interfaces/AudioEncoder2Configuration.html#multicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"bitrate\",\"url\":\"interfaces/AudioEncoder2Configuration.html#bitrate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"sampleRate\",\"url\":\"interfaces/AudioEncoder2Configuration.html#sampleRate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":256,\"name\":\"ConfigurationSet\",\"url\":\"interfaces/ConfigurationSet.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"videoSource\",\"url\":\"interfaces/ConfigurationSet.html#videoSource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"audioSource\",\"url\":\"interfaces/ConfigurationSet.html#audioSource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"videoEncoder\",\"url\":\"interfaces/ConfigurationSet.html#videoEncoder\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"audioEncoder\",\"url\":\"interfaces/ConfigurationSet.html#audioEncoder\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"analytics\",\"url\":\"interfaces/ConfigurationSet.html#analytics\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"PTZ\",\"url\":\"interfaces/ConfigurationSet.html#PTZ\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"metadata\",\"url\":\"interfaces/ConfigurationSet.html#metadata\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"audioOutput\",\"url\":\"interfaces/ConfigurationSet.html#audioOutput\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"audioDecoder\",\"url\":\"interfaces/ConfigurationSet.html#audioDecoder\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"receiver\",\"url\":\"interfaces/ConfigurationSet.html#receiver\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":256,\"name\":\"MediaProfile\",\"url\":\"interfaces/MediaProfile.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/MediaProfile.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaProfile\"},{\"kind\":1024,\"name\":\"fixed\",\"url\":\"interfaces/MediaProfile.html#fixed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaProfile\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/MediaProfile.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaProfile\"},{\"kind\":1024,\"name\":\"configurations\",\"url\":\"interfaces/MediaProfile.html#configurations\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaProfile\"},{\"kind\":256,\"name\":\"BacklightCompensation\",\"url\":\"interfaces/BacklightCompensation.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/BacklightCompensation.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BacklightCompensation\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/BacklightCompensation.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BacklightCompensation\"},{\"kind\":256,\"name\":\"Rectangle\",\"url\":\"interfaces/Rectangle.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"x\",\"url\":\"interfaces/Rectangle.html#x\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rectangle\"},{\"kind\":1024,\"name\":\"y\",\"url\":\"interfaces/Rectangle.html#y\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rectangle\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/Rectangle.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rectangle\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/Rectangle.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rectangle\"},{\"kind\":256,\"name\":\"Exposure\",\"url\":\"interfaces/Exposure.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/Exposure.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"priority\",\"url\":\"interfaces/Exposure.html#priority\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"window\",\"url\":\"interfaces/Exposure.html#window\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"minExposureTime\",\"url\":\"interfaces/Exposure.html#minExposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"maxExposureTime\",\"url\":\"interfaces/Exposure.html#maxExposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"minGain\",\"url\":\"interfaces/Exposure.html#minGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"maxGain\",\"url\":\"interfaces/Exposure.html#maxGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"minIris\",\"url\":\"interfaces/Exposure.html#minIris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"maxIris\",\"url\":\"interfaces/Exposure.html#maxIris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"exposureTime\",\"url\":\"interfaces/Exposure.html#exposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"gain\",\"url\":\"interfaces/Exposure.html#gain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"iris\",\"url\":\"interfaces/Exposure.html#iris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":256,\"name\":\"FocusConfiguration\",\"url\":\"interfaces/FocusConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"autoFocusMode\",\"url\":\"interfaces/FocusConfiguration.html#autoFocusMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration\"},{\"kind\":1024,\"name\":\"defaultSpeed\",\"url\":\"interfaces/FocusConfiguration.html#defaultSpeed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration\"},{\"kind\":1024,\"name\":\"nearLimit\",\"url\":\"interfaces/FocusConfiguration.html#nearLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration\"},{\"kind\":1024,\"name\":\"farLimit\",\"url\":\"interfaces/FocusConfiguration.html#farLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration\"},{\"kind\":256,\"name\":\"WideDynamicRange\",\"url\":\"interfaces/WideDynamicRange.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/WideDynamicRange.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WideDynamicRange\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/WideDynamicRange.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WideDynamicRange\"},{\"kind\":256,\"name\":\"WhiteBalance\",\"url\":\"interfaces/WhiteBalance.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/WhiteBalance.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WhiteBalance\"},{\"kind\":1024,\"name\":\"crGain\",\"url\":\"interfaces/WhiteBalance.html#crGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WhiteBalance\"},{\"kind\":1024,\"name\":\"cbGain\",\"url\":\"interfaces/WhiteBalance.html#cbGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WhiteBalance\"},{\"kind\":256,\"name\":\"ImagingSettings\",\"url\":\"interfaces/ImagingSettings.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"backlightCompensation\",\"url\":\"interfaces/ImagingSettings.html#backlightCompensation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"brightness\",\"url\":\"interfaces/ImagingSettings.html#brightness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"colorSaturation\",\"url\":\"interfaces/ImagingSettings.html#colorSaturation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"contrast\",\"url\":\"interfaces/ImagingSettings.html#contrast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"exposure\",\"url\":\"interfaces/ImagingSettings.html#exposure\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"focus\",\"url\":\"interfaces/ImagingSettings.html#focus\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"irCutFilter\",\"url\":\"interfaces/ImagingSettings.html#irCutFilter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"sharpness\",\"url\":\"interfaces/ImagingSettings.html#sharpness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"wideDynamicRange\",\"url\":\"interfaces/ImagingSettings.html#wideDynamicRange\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"whiteBalance\",\"url\":\"interfaces/ImagingSettings.html#whiteBalance\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImagingSettings.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":256,\"name\":\"BacklightCompensation20\",\"url\":\"interfaces/BacklightCompensation20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/BacklightCompensation20.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BacklightCompensation20\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/BacklightCompensation20.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BacklightCompensation20\"},{\"kind\":256,\"name\":\"Exposure20\",\"url\":\"interfaces/Exposure20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/Exposure20.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"priority\",\"url\":\"interfaces/Exposure20.html#priority\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"window\",\"url\":\"interfaces/Exposure20.html#window\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"minExposureTime\",\"url\":\"interfaces/Exposure20.html#minExposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"maxExposureTime\",\"url\":\"interfaces/Exposure20.html#maxExposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"minGain\",\"url\":\"interfaces/Exposure20.html#minGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"maxGain\",\"url\":\"interfaces/Exposure20.html#maxGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"minIris\",\"url\":\"interfaces/Exposure20.html#minIris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"maxIris\",\"url\":\"interfaces/Exposure20.html#maxIris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"exposureTime\",\"url\":\"interfaces/Exposure20.html#exposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"gain\",\"url\":\"interfaces/Exposure20.html#gain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"iris\",\"url\":\"interfaces/Exposure20.html#iris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":256,\"name\":\"FocusConfiguration20\",\"url\":\"interfaces/FocusConfiguration20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"AFMode\",\"url\":\"interfaces/FocusConfiguration20.html#AFMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":1024,\"name\":\"autoFocusMode\",\"url\":\"interfaces/FocusConfiguration20.html#autoFocusMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":1024,\"name\":\"defaultSpeed\",\"url\":\"interfaces/FocusConfiguration20.html#defaultSpeed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":1024,\"name\":\"nearLimit\",\"url\":\"interfaces/FocusConfiguration20.html#nearLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":1024,\"name\":\"farLimit\",\"url\":\"interfaces/FocusConfiguration20.html#farLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/FocusConfiguration20.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":256,\"name\":\"WideDynamicRange20\",\"url\":\"interfaces/WideDynamicRange20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/WideDynamicRange20.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WideDynamicRange20\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/WideDynamicRange20.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WideDynamicRange20\"},{\"kind\":256,\"name\":\"WhiteBalance20\",\"url\":\"interfaces/WhiteBalance20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/WhiteBalance20.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WhiteBalance20\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/WhiteBalance20.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"WhiteBalance20\"},{\"kind\":1024,\"name\":\"crGain\",\"url\":\"interfaces/WhiteBalance20.html#crGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"WhiteBalance20\"},{\"kind\":1024,\"name\":\"cbGain\",\"url\":\"interfaces/WhiteBalance20.html#cbGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"WhiteBalance20\"},{\"kind\":256,\"name\":\"ImageStabilization\",\"url\":\"interfaces/ImageStabilization.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/ImageStabilization.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImageStabilization\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/ImageStabilization.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImageStabilization\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImageStabilization.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImageStabilization\"},{\"kind\":256,\"name\":\"IrCutFilterAutoAdjustment\",\"url\":\"interfaces/IrCutFilterAutoAdjustment.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"boundaryType\",\"url\":\"interfaces/IrCutFilterAutoAdjustment.html#boundaryType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IrCutFilterAutoAdjustment\"},{\"kind\":1024,\"name\":\"boundaryOffset\",\"url\":\"interfaces/IrCutFilterAutoAdjustment.html#boundaryOffset\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IrCutFilterAutoAdjustment\"},{\"kind\":1024,\"name\":\"responseTime\",\"url\":\"interfaces/IrCutFilterAutoAdjustment.html#responseTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IrCutFilterAutoAdjustment\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/IrCutFilterAutoAdjustment.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IrCutFilterAutoAdjustment\"},{\"kind\":256,\"name\":\"ToneCompensation\",\"url\":\"interfaces/ToneCompensation.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/ToneCompensation.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ToneCompensation\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/ToneCompensation.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ToneCompensation\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ToneCompensation.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ToneCompensation\"},{\"kind\":256,\"name\":\"Defogging\",\"url\":\"interfaces/Defogging.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/Defogging.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Defogging\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/Defogging.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Defogging\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/Defogging.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Defogging\"},{\"kind\":256,\"name\":\"NoiseReduction\",\"url\":\"interfaces/NoiseReduction.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/NoiseReduction.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NoiseReduction\"},{\"kind\":256,\"name\":\"ImagingSettingsExtension203\",\"url\":\"interfaces/ImagingSettingsExtension203.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"toneCompensation\",\"url\":\"interfaces/ImagingSettingsExtension203.html#toneCompensation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension203\"},{\"kind\":1024,\"name\":\"defogging\",\"url\":\"interfaces/ImagingSettingsExtension203.html#defogging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension203\"},{\"kind\":1024,\"name\":\"noiseReduction\",\"url\":\"interfaces/ImagingSettingsExtension203.html#noiseReduction\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension203\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImagingSettingsExtension203.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension203\"},{\"kind\":256,\"name\":\"ImagingSettingsExtension202\",\"url\":\"interfaces/ImagingSettingsExtension202.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"irCutFilterAutoAdjustment\",\"url\":\"interfaces/ImagingSettingsExtension202.html#irCutFilterAutoAdjustment\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension202\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImagingSettingsExtension202.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension202\"},{\"kind\":256,\"name\":\"ImagingSettingsExtension20\",\"url\":\"interfaces/ImagingSettingsExtension20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"imageStabilization\",\"url\":\"interfaces/ImagingSettingsExtension20.html#imageStabilization\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension20\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImagingSettingsExtension20.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension20\"},{\"kind\":256,\"name\":\"ImagingSettings20\",\"url\":\"interfaces/ImagingSettings20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"backlightCompensation\",\"url\":\"interfaces/ImagingSettings20.html#backlightCompensation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"brightness\",\"url\":\"interfaces/ImagingSettings20.html#brightness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"colorSaturation\",\"url\":\"interfaces/ImagingSettings20.html#colorSaturation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"contrast\",\"url\":\"interfaces/ImagingSettings20.html#contrast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"exposure\",\"url\":\"interfaces/ImagingSettings20.html#exposure\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"focus\",\"url\":\"interfaces/ImagingSettings20.html#focus\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"irCutFilter\",\"url\":\"interfaces/ImagingSettings20.html#irCutFilter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"sharpness\",\"url\":\"interfaces/ImagingSettings20.html#sharpness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"wideDynamicRange\",\"url\":\"interfaces/ImagingSettings20.html#wideDynamicRange\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"whiteBalance\",\"url\":\"interfaces/ImagingSettings20.html#whiteBalance\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImagingSettings20.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":256,\"name\":\"VideoSourceExtension\",\"url\":\"interfaces/VideoSourceExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"imaging\",\"url\":\"interfaces/VideoSourceExtension.html#imaging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/VideoSourceExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceExtension\"},{\"kind\":256,\"name\":\"VideoSource\",\"url\":\"interfaces/VideoSource.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/VideoSource.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSource\"},{\"kind\":1024,\"name\":\"framerate\",\"url\":\"interfaces/VideoSource.html#framerate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSource\"},{\"kind\":1024,\"name\":\"resolution\",\"url\":\"interfaces/VideoSource.html#resolution\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSource\"},{\"kind\":1024,\"name\":\"imaging\",\"url\":\"interfaces/VideoSource.html#imaging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSource\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/VideoSource.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSource\"},{\"kind\":128,\"name\":\"Media\",\"url\":\"classes/Media.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Media.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Media\"},{\"kind\":1024,\"name\":\"onvif\",\"url\":\"classes/Media.html#onvif\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Media\"},{\"kind\":1024,\"name\":\"profiles\",\"url\":\"classes/Media.html#profiles\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Media\"},{\"kind\":1024,\"name\":\"videoSources\",\"url\":\"classes/Media.html#videoSources\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Media\"},{\"kind\":2048,\"name\":\"getProfiles\",\"url\":\"classes/Media.html#getProfiles\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Media\"},{\"kind\":2048,\"name\":\"getVideoSources\",\"url\":\"classes/Media.html#getVideoSources\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Media\"},{\"kind\":256,\"name\":\"DiscoveryOptions\",\"url\":\"interfaces/DiscoveryOptions.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"timeout\",\"url\":\"interfaces/DiscoveryOptions.html#timeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":1024,\"name\":\"resolve\",\"url\":\"interfaces/DiscoveryOptions.html#resolve\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":1024,\"name\":\"messageId\",\"url\":\"interfaces/DiscoveryOptions.html#messageId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":1024,\"name\":\"device\",\"url\":\"interfaces/DiscoveryOptions.html#device\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":1024,\"name\":\"listeningPort\",\"url\":\"interfaces/DiscoveryOptions.html#listeningPort\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/DiscoveryOptions.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":128,\"name\":\"DiscoverySingleton\",\"url\":\"classes/DiscoverySingleton.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":1024,\"name\":\"device\",\"url\":\"classes/DiscoverySingleton.html#device\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"DiscoverySingleton\"},{\"kind\":1024,\"name\":\"error\",\"url\":\"classes/DiscoverySingleton.html#error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"DiscoverySingleton\"},{\"kind\":1024,\"name\":\"instance\",\"url\":\"classes/DiscoverySingleton.html#instance\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"DiscoverySingleton\"},{\"kind\":262144,\"name\":\"getInstance\",\"url\":\"classes/DiscoverySingleton.html#getInstance\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"DiscoverySingleton\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/DiscoverySingleton.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-is-private\",\"parent\":\"DiscoverySingleton\"},{\"kind\":2048,\"name\":\"probe\",\"url\":\"classes/DiscoverySingleton.html#probe\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"DiscoverySingleton\"},{\"kind\":32,\"name\":\"Discovery\",\"url\":\"variables/Discovery.html\",\"classes\":\"tsd-kind-variable\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"comment\"],\"fieldVectors\":[[\"name/0\",[0,60.776]],[\"comment/0\",[]],[\"name/1\",[1,55.668]],[\"comment/1\",[]],[\"name/2\",[2,55.668]],[\"comment/2\",[]],[\"name/3\",[3,55.668]],[\"comment/3\",[]],[\"name/4\",[4,55.668]],[\"comment/4\",[]],[\"name/5\",[5,55.668]],[\"comment/5\",[]],[\"name/6\",[6,52.303]],[\"comment/6\",[]],[\"name/7\",[7,55.668]],[\"comment/7\",[]],[\"name/8\",[8,52.303]],[\"comment/8\",[]],[\"name/9\",[9,55.668]],[\"comment/9\",[]],[\"name/10\",[10,55.668]],[\"comment/10\",[]],[\"name/11\",[11,55.668]],[\"comment/11\",[]],[\"name/12\",[12,60.776]],[\"comment/12\",[]],[\"name/13\",[13,60.776]],[\"comment/13\",[]],[\"name/14\",[14,47.784]],[\"comment/14\",[]],[\"name/15\",[15,55.668]],[\"comment/15\",[]],[\"name/16\",[16,46.113]],[\"comment/16\",[]],[\"name/17\",[17,55.668]],[\"comment/17\",[]],[\"name/18\",[18,55.668]],[\"comment/18\",[]],[\"name/19\",[19,49.79]],[\"comment/19\",[]],[\"name/20\",[20,49.79]],[\"comment/20\",[]],[\"name/21\",[21,60.776]],[\"comment/21\",[]],[\"name/22\",[22,49.79]],[\"comment/22\",[]],[\"name/23\",[23,52.303]],[\"comment/23\",[]],[\"name/24\",[24,55.668]],[\"comment/24\",[]],[\"name/25\",[25,55.668]],[\"comment/25\",[]],[\"name/26\",[26,55.668]],[\"comment/26\",[]],[\"name/27\",[27,60.776]],[\"comment/27\",[]],[\"name/28\",[28,60.776]],[\"comment/28\",[]],[\"name/29\",[29,60.776]],[\"comment/29\",[]],[\"name/30\",[30,60.776]],[\"comment/30\",[]],[\"name/31\",[14,47.784]],[\"comment/31\",[]],[\"name/32\",[31,42.318]],[\"comment/32\",[]],[\"name/33\",[32,55.668]],[\"comment/33\",[]],[\"name/34\",[33,52.303]],[\"comment/34\",[]],[\"name/35\",[34,60.776]],[\"comment/35\",[]],[\"name/36\",[35,60.776]],[\"comment/36\",[]],[\"name/37\",[36,47.784]],[\"comment/37\",[]],[\"name/38\",[37,49.79]],[\"comment/38\",[]],[\"name/39\",[38,49.79]],[\"comment/39\",[]],[\"name/40\",[39,60.776]],[\"comment/40\",[]],[\"name/41\",[40,52.303]],[\"comment/41\",[]],[\"name/42\",[14,47.784]],[\"comment/42\",[]],[\"name/43\",[31,42.318]],[\"comment/43\",[]],[\"name/44\",[41,36.209]],[\"comment/44\",[]],[\"name/45\",[42,37.423]],[\"comment/45\",[]],[\"name/46\",[43,52.303]],[\"comment/46\",[]],[\"name/47\",[44,55.668]],[\"comment/47\",[]],[\"name/48\",[45,60.776]],[\"comment/48\",[]],[\"name/49\",[46,60.776]],[\"comment/49\",[]],[\"name/50\",[47,55.668]],[\"comment/50\",[]],[\"name/51\",[48,49.79]],[\"comment/51\",[]],[\"name/52\",[16,46.113]],[\"comment/52\",[]],[\"name/53\",[22,49.79]],[\"comment/53\",[]],[\"name/54\",[1,55.668]],[\"comment/54\",[]],[\"name/55\",[2,55.668]],[\"comment/55\",[]],[\"name/56\",[3,55.668]],[\"comment/56\",[]],[\"name/57\",[4,55.668]],[\"comment/57\",[]],[\"name/58\",[5,55.668]],[\"comment/58\",[]],[\"name/59\",[6,52.303]],[\"comment/59\",[]],[\"name/60\",[7,55.668]],[\"comment/60\",[]],[\"name/61\",[8,52.303]],[\"comment/61\",[]],[\"name/62\",[10,55.668]],[\"comment/62\",[]],[\"name/63\",[11,55.668]],[\"comment/63\",[]],[\"name/64\",[19,49.79]],[\"comment/64\",[]],[\"name/65\",[49,52.303]],[\"comment/65\",[]],[\"name/66\",[50,60.776]],[\"comment/66\",[]],[\"name/67\",[51,55.668]],[\"comment/67\",[]],[\"name/68\",[52,60.776]],[\"comment/68\",[]],[\"name/69\",[53,60.776]],[\"comment/69\",[]],[\"name/70\",[54,60.776]],[\"comment/70\",[]],[\"name/71\",[32,55.668]],[\"comment/71\",[]],[\"name/72\",[9,55.668]],[\"comment/72\",[]],[\"name/73\",[55,55.668]],[\"comment/73\",[]],[\"name/74\",[56,60.776]],[\"comment/74\",[]],[\"name/75\",[57,60.776]],[\"comment/75\",[]],[\"name/76\",[58,60.776]],[\"comment/76\",[]],[\"name/77\",[31,42.318]],[\"comment/77\",[]],[\"name/78\",[59,60.776]],[\"comment/78\",[]],[\"name/79\",[60,60.776]],[\"comment/79\",[]],[\"name/80\",[61,60.776]],[\"comment/80\",[]],[\"name/81\",[62,60.776]],[\"comment/81\",[]],[\"name/82\",[44,55.668]],[\"comment/82\",[]],[\"name/83\",[63,60.776]],[\"comment/83\",[]],[\"name/84\",[64,60.776]],[\"comment/84\",[]],[\"name/85\",[65,55.668]],[\"comment/85\",[]],[\"name/86\",[66,60.776]],[\"comment/86\",[]],[\"name/87\",[67,60.776]],[\"comment/87\",[]],[\"name/88\",[68,60.776]],[\"comment/88\",[]],[\"name/89\",[69,60.776]],[\"comment/89\",[]],[\"name/90\",[70,37.423]],[\"comment/90\",[]],[\"name/91\",[71,55.668]],[\"comment/91\",[]],[\"name/92\",[72,55.668]],[\"comment/92\",[]],[\"name/93\",[73,60.776]],[\"comment/93\",[]],[\"name/94\",[72,55.668]],[\"comment/94\",[]],[\"name/95\",[71,55.668]],[\"comment/95\",[]],[\"name/96\",[74,60.776]],[\"comment/96\",[]],[\"name/97\",[75,60.776]],[\"comment/97\",[]],[\"name/98\",[76,28.858]],[\"comment/98\",[]],[\"name/99\",[77,60.776]],[\"comment/99\",[]],[\"name/100\",[78,60.776]],[\"comment/100\",[]],[\"name/101\",[79,60.776]],[\"comment/101\",[]],[\"name/102\",[80,60.776]],[\"comment/102\",[]],[\"name/103\",[81,60.776]],[\"comment/103\",[]],[\"name/104\",[76,28.858]],[\"comment/104\",[]],[\"name/105\",[82,60.776]],[\"comment/105\",[]],[\"name/106\",[83,55.668]],[\"comment/106\",[]],[\"name/107\",[84,55.668]],[\"comment/107\",[]],[\"name/108\",[85,55.668]],[\"comment/108\",[]],[\"name/109\",[86,60.776]],[\"comment/109\",[]],[\"name/110\",[76,28.858]],[\"comment/110\",[]],[\"name/111\",[87,60.776]],[\"comment/111\",[]],[\"name/112\",[88,60.776]],[\"comment/112\",[]],[\"name/113\",[89,60.776]],[\"comment/113\",[]],[\"name/114\",[90,60.776]],[\"comment/114\",[]],[\"name/115\",[91,60.776]],[\"comment/115\",[]],[\"name/116\",[92,60.776]],[\"comment/116\",[]],[\"name/117\",[93,60.776]],[\"comment/117\",[]],[\"name/118\",[83,55.668]],[\"comment/118\",[]],[\"name/119\",[84,55.668]],[\"comment/119\",[]],[\"name/120\",[85,55.668]],[\"comment/120\",[]],[\"name/121\",[94,60.776]],[\"comment/121\",[]],[\"name/122\",[95,52.303]],[\"comment/122\",[]],[\"name/123\",[96,60.776]],[\"comment/123\",[]],[\"name/124\",[97,60.776]],[\"comment/124\",[]],[\"name/125\",[98,60.776]],[\"comment/125\",[]],[\"name/126\",[76,28.858]],[\"comment/126\",[]],[\"name/127\",[99,60.776]],[\"comment/127\",[]],[\"name/128\",[100,60.776]],[\"comment/128\",[]],[\"name/129\",[101,55.668]],[\"comment/129\",[]],[\"name/130\",[76,28.858]],[\"comment/130\",[]],[\"name/131\",[102,60.776]],[\"comment/131\",[]],[\"name/132\",[103,60.776]],[\"comment/132\",[]],[\"name/133\",[104,60.776]],[\"comment/133\",[]],[\"name/134\",[105,60.776]],[\"comment/134\",[]],[\"name/135\",[106,60.776]],[\"comment/135\",[]],[\"name/136\",[107,60.776]],[\"comment/136\",[]],[\"name/137\",[76,28.858]],[\"comment/137\",[]],[\"name/138\",[108,60.776]],[\"comment/138\",[]],[\"name/139\",[109,60.776]],[\"comment/139\",[]],[\"name/140\",[110,60.776]],[\"comment/140\",[]],[\"name/141\",[111,60.776]],[\"comment/141\",[]],[\"name/142\",[112,60.776]],[\"comment/142\",[]],[\"name/143\",[113,60.776]],[\"comment/143\",[]],[\"name/144\",[114,60.776]],[\"comment/144\",[]],[\"name/145\",[115,60.776]],[\"comment/145\",[]],[\"name/146\",[116,60.776]],[\"comment/146\",[]],[\"name/147\",[76,28.858]],[\"comment/147\",[]],[\"name/148\",[117,60.776]],[\"comment/148\",[]],[\"name/149\",[70,37.423]],[\"comment/149\",[]],[\"name/150\",[118,60.776]],[\"comment/150\",[]],[\"name/151\",[119,60.776]],[\"comment/151\",[]],[\"name/152\",[120,60.776]],[\"comment/152\",[]],[\"name/153\",[121,60.776]],[\"comment/153\",[]],[\"name/154\",[70,37.423]],[\"comment/154\",[]],[\"name/155\",[122,60.776]],[\"comment/155\",[]],[\"name/156\",[123,60.776]],[\"comment/156\",[]],[\"name/157\",[124,55.668]],[\"comment/157\",[]],[\"name/158\",[125,55.668]],[\"comment/158\",[]],[\"name/159\",[76,28.858]],[\"comment/159\",[]],[\"name/160\",[126,55.668]],[\"comment/160\",[]],[\"name/161\",[127,60.776]],[\"comment/161\",[]],[\"name/162\",[128,60.776]],[\"comment/162\",[]],[\"name/163\",[126,55.668]],[\"comment/163\",[]],[\"name/164\",[129,60.776]],[\"comment/164\",[]],[\"name/165\",[70,37.423]],[\"comment/165\",[]],[\"name/166\",[130,60.776]],[\"comment/166\",[]],[\"name/167\",[76,28.858]],[\"comment/167\",[]],[\"name/168\",[131,60.776]],[\"comment/168\",[]],[\"name/169\",[70,37.423]],[\"comment/169\",[]],[\"name/170\",[132,60.776]],[\"comment/170\",[]],[\"name/171\",[70,37.423]],[\"comment/171\",[]],[\"name/172\",[133,55.668]],[\"comment/172\",[]],[\"name/173\",[134,60.776]],[\"comment/173\",[]],[\"name/174\",[135,60.776]],[\"comment/174\",[]],[\"name/175\",[136,60.776]],[\"comment/175\",[]],[\"name/176\",[101,55.668]],[\"comment/176\",[]],[\"name/177\",[95,52.303]],[\"comment/177\",[]],[\"name/178\",[31,42.318]],[\"comment/178\",[]],[\"name/179\",[137,60.776]],[\"comment/179\",[]],[\"name/180\",[138,60.776]],[\"comment/180\",[]],[\"name/181\",[139,60.776]],[\"comment/181\",[]],[\"name/182\",[70,37.423]],[\"comment/182\",[]],[\"name/183\",[140,60.776]],[\"comment/183\",[]],[\"name/184\",[141,60.776]],[\"comment/184\",[]],[\"name/185\",[70,37.423]],[\"comment/185\",[]],[\"name/186\",[142,60.776]],[\"comment/186\",[]],[\"name/187\",[143,60.776]],[\"comment/187\",[]],[\"name/188\",[144,60.776]],[\"comment/188\",[]],[\"name/189\",[145,60.776]],[\"comment/189\",[]],[\"name/190\",[146,60.776]],[\"comment/190\",[]],[\"name/191\",[147,60.776]],[\"comment/191\",[]],[\"name/192\",[70,37.423]],[\"comment/192\",[]],[\"name/193\",[148,60.776]],[\"comment/193\",[]],[\"name/194\",[149,60.776]],[\"comment/194\",[]],[\"name/195\",[70,37.423]],[\"comment/195\",[]],[\"name/196\",[150,60.776]],[\"comment/196\",[]],[\"name/197\",[70,37.423]],[\"comment/197\",[]],[\"name/198\",[151,60.776]],[\"comment/198\",[]],[\"name/199\",[124,55.668]],[\"comment/199\",[]],[\"name/200\",[125,55.668]],[\"comment/200\",[]],[\"name/201\",[152,60.776]],[\"comment/201\",[]],[\"name/202\",[153,60.776]],[\"comment/202\",[]],[\"name/203\",[154,60.776]],[\"comment/203\",[]],[\"name/204\",[70,37.423]],[\"comment/204\",[]],[\"name/205\",[155,55.668]],[\"comment/205\",[]],[\"name/206\",[76,28.858]],[\"comment/206\",[]],[\"name/207\",[156,60.776]],[\"comment/207\",[]],[\"name/208\",[70,37.423]],[\"comment/208\",[]],[\"name/209\",[17,55.668]],[\"comment/209\",[]],[\"name/210\",[18,55.668]],[\"comment/210\",[]],[\"name/211\",[24,55.668]],[\"comment/211\",[]],[\"name/212\",[26,55.668]],[\"comment/212\",[]],[\"name/213\",[25,55.668]],[\"comment/213\",[]],[\"name/214\",[23,52.303]],[\"comment/214\",[]],[\"name/215\",[15,55.668]],[\"comment/215\",[]],[\"name/216\",[157,60.776]],[\"comment/216\",[]],[\"name/217\",[70,37.423]],[\"comment/217\",[]],[\"name/218\",[158,60.776]],[\"comment/218\",[]],[\"name/219\",[159,60.776]],[\"comment/219\",[]],[\"name/220\",[160,60.776]],[\"comment/220\",[]],[\"name/221\",[161,60.776]],[\"comment/221\",[]],[\"name/222\",[95,52.303]],[\"comment/222\",[]],[\"name/223\",[162,60.776]],[\"comment/223\",[]],[\"name/224\",[70,37.423]],[\"comment/224\",[]],[\"name/225\",[155,55.668]],[\"comment/225\",[]],[\"name/226\",[163,60.776]],[\"comment/226\",[]],[\"name/227\",[51,55.668]],[\"comment/227\",[]],[\"name/228\",[164,52.303]],[\"comment/228\",[]],[\"name/229\",[16,46.113]],[\"comment/229\",[]],[\"name/230\",[19,49.79]],[\"comment/230\",[]],[\"name/231\",[20,49.79]],[\"comment/231\",[]],[\"name/232\",[22,49.79]],[\"comment/232\",[]],[\"name/233\",[14,47.784]],[\"comment/233\",[]],[\"name/234\",[76,28.858]],[\"comment/234\",[]],[\"name/235\",[16,46.113]],[\"comment/235\",[]],[\"name/236\",[48,49.79]],[\"comment/236\",[]],[\"name/237\",[43,52.303]],[\"comment/237\",[]],[\"name/238\",[165,60.776]],[\"comment/238\",[]],[\"name/239\",[166,60.776]],[\"comment/239\",[]],[\"name/240\",[65,55.668]],[\"comment/240\",[]],[\"name/241\",[167,60.776]],[\"comment/241\",[]],[\"name/242\",[168,60.776]],[\"comment/242\",[]],[\"name/243\",[169,60.776]],[\"comment/243\",[]],[\"name/244\",[170,60.776]],[\"comment/244\",[]],[\"name/245\",[55,55.668]],[\"comment/245\",[]],[\"name/246\",[171,60.776]],[\"comment/246\",[]],[\"name/247\",[172,60.776]],[\"comment/247\",[]],[\"name/248\",[173,60.776]],[\"comment/248\",[]],[\"name/249\",[174,60.776]],[\"comment/249\",[]],[\"name/250\",[175,60.776]],[\"comment/250\",[]],[\"name/251\",[176,60.776]],[\"comment/251\",[]],[\"name/252\",[177,60.776]],[\"comment/252\",[]],[\"name/253\",[41,36.209]],[\"comment/253\",[]],[\"name/254\",[178,60.776]],[\"comment/254\",[]],[\"name/255\",[179,47.784]],[\"comment/255\",[]],[\"name/256\",[180,49.79]],[\"comment/256\",[]],[\"name/257\",[37,49.79]],[\"comment/257\",[]],[\"name/258\",[38,49.79]],[\"comment/258\",[]],[\"name/259\",[181,55.668]],[\"comment/259\",[]],[\"name/260\",[182,37.423]],[\"comment/260\",[]],[\"name/261\",[183,60.776]],[\"comment/261\",[]],[\"name/262\",[76,28.858]],[\"comment/262\",[]],[\"name/263\",[184,60.776]],[\"comment/263\",[]],[\"name/264\",[179,47.784]],[\"comment/264\",[]],[\"name/265\",[180,49.79]],[\"comment/265\",[]],[\"name/266\",[185,60.776]],[\"comment/266\",[]],[\"name/267\",[186,60.776]],[\"comment/267\",[]],[\"name/268\",[187,60.776]],[\"comment/268\",[]],[\"name/269\",[188,60.776]],[\"comment/269\",[]],[\"name/270\",[189,55.668]],[\"comment/270\",[]],[\"name/271\",[190,60.776]],[\"comment/271\",[]],[\"name/272\",[191,60.776]],[\"comment/272\",[]],[\"name/273\",[192,60.776]],[\"comment/273\",[]],[\"name/274\",[193,60.776]],[\"comment/274\",[]],[\"name/275\",[194,55.668]],[\"comment/275\",[]],[\"name/276\",[182,37.423]],[\"comment/276\",[]],[\"name/277\",[195,60.776]],[\"comment/277\",[]],[\"name/278\",[196,60.776]],[\"comment/278\",[]],[\"name/279\",[189,55.668]],[\"comment/279\",[]],[\"name/280\",[194,55.668]],[\"comment/280\",[]],[\"name/281\",[197,60.776]],[\"comment/281\",[]],[\"name/282\",[181,55.668]],[\"comment/282\",[]],[\"name/283\",[76,28.858]],[\"comment/283\",[]],[\"name/284\",[198,55.668]],[\"comment/284\",[]],[\"name/285\",[42,37.423]],[\"comment/285\",[]],[\"name/286\",[41,36.209]],[\"comment/286\",[]],[\"name/287\",[199,40.408]],[\"comment/287\",[]],[\"name/288\",[200,60.776]],[\"comment/288\",[]],[\"name/289\",[33,52.303]],[\"comment/289\",[]],[\"name/290\",[201,60.776]],[\"comment/290\",[]],[\"name/291\",[76,28.858]],[\"comment/291\",[]],[\"name/292\",[202,55.668]],[\"comment/292\",[]],[\"name/293\",[42,37.423]],[\"comment/293\",[]],[\"name/294\",[41,36.209]],[\"comment/294\",[]],[\"name/295\",[199,40.408]],[\"comment/295\",[]],[\"name/296\",[33,52.303]],[\"comment/296\",[]],[\"name/297\",[203,60.776]],[\"comment/297\",[]],[\"name/298\",[37,49.79]],[\"comment/298\",[]],[\"name/299\",[38,49.79]],[\"comment/299\",[]],[\"name/300\",[204,60.776]],[\"comment/300\",[]],[\"name/301\",[205,55.668]],[\"comment/301\",[]],[\"name/302\",[206,60.776]],[\"comment/302\",[]],[\"name/303\",[207,55.668]],[\"comment/303\",[]],[\"name/304\",[208,60.776]],[\"comment/304\",[]],[\"name/305\",[209,52.303]],[\"comment/305\",[]],[\"name/306\",[210,60.776]],[\"comment/306\",[]],[\"name/307\",[211,60.776]],[\"comment/307\",[]],[\"name/308\",[209,52.303]],[\"comment/308\",[]],[\"name/309\",[212,60.776]],[\"comment/309\",[]],[\"name/310\",[213,60.776]],[\"comment/310\",[]],[\"name/311\",[214,52.303]],[\"comment/311\",[]],[\"name/312\",[215,60.776]],[\"comment/312\",[]],[\"name/313\",[216,60.776]],[\"comment/313\",[]],[\"name/314\",[217,60.776]],[\"comment/314\",[]],[\"name/315\",[218,60.776]],[\"comment/315\",[]],[\"name/316\",[6,52.303]],[\"comment/316\",[]],[\"name/317\",[219,60.776]],[\"comment/317\",[]],[\"name/318\",[220,60.776]],[\"comment/318\",[]],[\"name/319\",[221,60.776]],[\"comment/319\",[]],[\"name/320\",[222,55.668]],[\"comment/320\",[]],[\"name/321\",[42,37.423]],[\"comment/321\",[]],[\"name/322\",[41,36.209]],[\"comment/322\",[]],[\"name/323\",[199,40.408]],[\"comment/323\",[]],[\"name/324\",[223,55.668]],[\"comment/324\",[]],[\"name/325\",[36,47.784]],[\"comment/325\",[]],[\"name/326\",[224,52.303]],[\"comment/326\",[]],[\"name/327\",[225,55.668]],[\"comment/327\",[]],[\"name/328\",[226,55.668]],[\"comment/328\",[]],[\"name/329\",[227,60.776]],[\"comment/329\",[]],[\"name/330\",[228,60.776]],[\"comment/330\",[]],[\"name/331\",[229,49.79]],[\"comment/331\",[]],[\"name/332\",[230,52.303]],[\"comment/332\",[]],[\"name/333\",[231,55.668]],[\"comment/333\",[]],[\"name/334\",[42,37.423]],[\"comment/334\",[]],[\"name/335\",[41,36.209]],[\"comment/335\",[]],[\"name/336\",[199,40.408]],[\"comment/336\",[]],[\"name/337\",[36,47.784]],[\"comment/337\",[]],[\"name/338\",[40,52.303]],[\"comment/338\",[]],[\"name/339\",[232,55.668]],[\"comment/339\",[]],[\"name/340\",[229,49.79]],[\"comment/340\",[]],[\"name/341\",[230,52.303]],[\"comment/341\",[]],[\"name/342\",[233,60.776]],[\"comment/342\",[]],[\"name/343\",[234,60.776]],[\"comment/343\",[]],[\"name/344\",[31,42.318]],[\"comment/344\",[]],[\"name/345\",[41,36.209]],[\"comment/345\",[]],[\"name/346\",[235,60.776]],[\"comment/346\",[]],[\"name/347\",[236,60.776]],[\"comment/347\",[]],[\"name/348\",[76,28.858]],[\"comment/348\",[]],[\"name/349\",[237,60.776]],[\"comment/349\",[]],[\"name/350\",[41,36.209]],[\"comment/350\",[]],[\"name/351\",[214,52.303]],[\"comment/351\",[]],[\"name/352\",[238,60.776]],[\"comment/352\",[]],[\"name/353\",[239,52.303]],[\"comment/353\",[]],[\"name/354\",[240,60.776]],[\"comment/354\",[]],[\"name/355\",[76,28.858]],[\"comment/355\",[]],[\"name/356\",[241,55.668]],[\"comment/356\",[]],[\"name/357\",[242,60.776]],[\"comment/357\",[]],[\"name/358\",[76,28.858]],[\"comment/358\",[]],[\"name/359\",[243,55.668]],[\"comment/359\",[]],[\"name/360\",[42,37.423]],[\"comment/360\",[]],[\"name/361\",[41,36.209]],[\"comment/361\",[]],[\"name/362\",[199,40.408]],[\"comment/362\",[]],[\"name/363\",[239,52.303]],[\"comment/363\",[]],[\"name/364\",[241,55.668]],[\"comment/364\",[]],[\"name/365\",[244,60.776]],[\"comment/365\",[]],[\"name/366\",[245,60.776]],[\"comment/366\",[]],[\"name/367\",[31,42.318]],[\"comment/367\",[]],[\"name/368\",[179,47.784]],[\"comment/368\",[]],[\"name/369\",[180,49.79]],[\"comment/369\",[]],[\"name/370\",[246,60.776]],[\"comment/370\",[]],[\"name/371\",[31,42.318]],[\"comment/371\",[]],[\"name/372\",[179,47.784]],[\"comment/372\",[]],[\"name/373\",[247,52.303]],[\"comment/373\",[]],[\"name/374\",[248,60.776]],[\"comment/374\",[]],[\"name/375\",[249,60.776]],[\"comment/375\",[]],[\"name/376\",[250,60.776]],[\"comment/376\",[]],[\"name/377\",[49,52.303]],[\"comment/377\",[]],[\"name/378\",[251,55.668]],[\"comment/378\",[]],[\"name/379\",[252,60.776]],[\"comment/379\",[]],[\"name/380\",[253,55.668]],[\"comment/380\",[]],[\"name/381\",[247,52.303]],[\"comment/381\",[]],[\"name/382\",[254,60.776]],[\"comment/382\",[]],[\"name/383\",[49,52.303]],[\"comment/383\",[]],[\"name/384\",[251,55.668]],[\"comment/384\",[]],[\"name/385\",[255,55.668]],[\"comment/385\",[]],[\"name/386\",[247,52.303]],[\"comment/386\",[]],[\"name/387\",[256,55.668]],[\"comment/387\",[]],[\"name/388\",[257,60.776]],[\"comment/388\",[]],[\"name/389\",[31,42.318]],[\"comment/389\",[]],[\"name/390\",[182,37.423]],[\"comment/390\",[]],[\"name/391\",[258,60.776]],[\"comment/391\",[]],[\"name/392\",[31,42.318]],[\"comment/392\",[]],[\"name/393\",[182,37.423]],[\"comment/393\",[]],[\"name/394\",[76,28.858]],[\"comment/394\",[]],[\"name/395\",[259,60.776]],[\"comment/395\",[]],[\"name/396\",[256,55.668]],[\"comment/396\",[]],[\"name/397\",[76,28.858]],[\"comment/397\",[]],[\"name/398\",[260,55.668]],[\"comment/398\",[]],[\"name/399\",[42,37.423]],[\"comment/399\",[]],[\"name/400\",[41,36.209]],[\"comment/400\",[]],[\"name/401\",[199,40.408]],[\"comment/401\",[]],[\"name/402\",[261,60.776]],[\"comment/402\",[]],[\"name/403\",[262,60.776]],[\"comment/403\",[]],[\"name/404\",[263,60.776]],[\"comment/404\",[]],[\"name/405\",[264,60.776]],[\"comment/405\",[]],[\"name/406\",[265,60.776]],[\"comment/406\",[]],[\"name/407\",[266,60.776]],[\"comment/407\",[]],[\"name/408\",[267,60.776]],[\"comment/408\",[]],[\"name/409\",[268,60.776]],[\"comment/409\",[]],[\"name/410\",[269,60.776]],[\"comment/410\",[]],[\"name/411\",[270,60.776]],[\"comment/411\",[]],[\"name/412\",[271,60.776]],[\"comment/412\",[]],[\"name/413\",[272,60.776]],[\"comment/413\",[]],[\"name/414\",[253,55.668]],[\"comment/414\",[]],[\"name/415\",[255,55.668]],[\"comment/415\",[]],[\"name/416\",[76,28.858]],[\"comment/416\",[]],[\"name/417\",[273,60.776]],[\"comment/417\",[]],[\"name/418\",[274,60.776]],[\"comment/418\",[]],[\"name/419\",[275,60.776]],[\"comment/419\",[]],[\"name/420\",[276,60.776]],[\"comment/420\",[]],[\"name/421\",[277,60.776]],[\"comment/421\",[]],[\"name/422\",[278,60.776]],[\"comment/422\",[]],[\"name/423\",[279,55.668]],[\"comment/423\",[]],[\"name/424\",[42,37.423]],[\"comment/424\",[]],[\"name/425\",[41,36.209]],[\"comment/425\",[]],[\"name/426\",[199,40.408]],[\"comment/426\",[]],[\"name/427\",[280,60.776]],[\"comment/427\",[]],[\"name/428\",[281,60.776]],[\"comment/428\",[]],[\"name/429\",[282,60.776]],[\"comment/429\",[]],[\"name/430\",[283,60.776]],[\"comment/430\",[]],[\"name/431\",[19,49.79]],[\"comment/431\",[]],[\"name/432\",[164,52.303]],[\"comment/432\",[]],[\"name/433\",[229,49.79]],[\"comment/433\",[]],[\"name/434\",[230,52.303]],[\"comment/434\",[]],[\"name/435\",[239,52.303]],[\"comment/435\",[]],[\"name/436\",[76,28.858]],[\"comment/436\",[]],[\"name/437\",[284,55.668]],[\"comment/437\",[]],[\"name/438\",[42,37.423]],[\"comment/438\",[]],[\"name/439\",[41,36.209]],[\"comment/439\",[]],[\"name/440\",[199,40.408]],[\"comment/440\",[]],[\"name/441\",[285,60.776]],[\"comment/441\",[]],[\"name/442\",[286,60.776]],[\"comment/442\",[]],[\"name/443\",[287,60.776]],[\"comment/443\",[]],[\"name/444\",[288,55.668]],[\"comment/444\",[]],[\"name/445\",[42,37.423]],[\"comment/445\",[]],[\"name/446\",[41,36.209]],[\"comment/446\",[]],[\"name/447\",[199,40.408]],[\"comment/447\",[]],[\"name/448\",[289,60.776]],[\"comment/448\",[]],[\"name/449\",[284,55.668]],[\"comment/449\",[]],[\"name/450\",[288,55.668]],[\"comment/450\",[]],[\"name/451\",[76,28.858]],[\"comment/451\",[]],[\"name/452\",[290,55.668]],[\"comment/452\",[]],[\"name/453\",[42,37.423]],[\"comment/453\",[]],[\"name/454\",[291,55.668]],[\"comment/454\",[]],[\"name/455\",[41,36.209]],[\"comment/455\",[]],[\"name/456\",[198,55.668]],[\"comment/456\",[]],[\"name/457\",[202,55.668]],[\"comment/457\",[]],[\"name/458\",[222,55.668]],[\"comment/458\",[]],[\"name/459\",[231,55.668]],[\"comment/459\",[]],[\"name/460\",[243,55.668]],[\"comment/460\",[]],[\"name/461\",[260,55.668]],[\"comment/461\",[]],[\"name/462\",[279,55.668]],[\"comment/462\",[]],[\"name/463\",[76,28.858]],[\"comment/463\",[]],[\"name/464\",[292,60.776]],[\"comment/464\",[]],[\"name/465\",[293,60.776]],[\"comment/465\",[]],[\"name/466\",[205,55.668]],[\"comment/466\",[]],[\"name/467\",[207,55.668]],[\"comment/467\",[]],[\"name/468\",[294,60.776]],[\"comment/468\",[]],[\"name/469\",[42,37.423]],[\"comment/469\",[]],[\"name/470\",[41,36.209]],[\"comment/470\",[]],[\"name/471\",[199,40.408]],[\"comment/471\",[]],[\"name/472\",[209,52.303]],[\"comment/472\",[]],[\"name/473\",[290,55.668]],[\"comment/473\",[]],[\"name/474\",[223,55.668]],[\"comment/474\",[]],[\"name/475\",[36,47.784]],[\"comment/475\",[]],[\"name/476\",[224,52.303]],[\"comment/476\",[]],[\"name/477\",[226,55.668]],[\"comment/477\",[]],[\"name/478\",[295,60.776]],[\"comment/478\",[]],[\"name/479\",[225,55.668]],[\"comment/479\",[]],[\"name/480\",[296,60.776]],[\"comment/480\",[]],[\"name/481\",[42,37.423]],[\"comment/481\",[]],[\"name/482\",[41,36.209]],[\"comment/482\",[]],[\"name/483\",[199,40.408]],[\"comment/483\",[]],[\"name/484\",[36,47.784]],[\"comment/484\",[]],[\"name/485\",[229,49.79]],[\"comment/485\",[]],[\"name/486\",[40,52.303]],[\"comment/486\",[]],[\"name/487\",[232,55.668]],[\"comment/487\",[]],[\"name/488\",[297,60.776]],[\"comment/488\",[]],[\"name/489\",[298,55.668]],[\"comment/489\",[]],[\"name/490\",[299,60.776]],[\"comment/490\",[]],[\"name/491\",[300,60.776]],[\"comment/491\",[]],[\"name/492\",[301,60.776]],[\"comment/492\",[]],[\"name/493\",[164,52.303]],[\"comment/493\",[]],[\"name/494\",[14,47.784]],[\"comment/494\",[]],[\"name/495\",[302,60.776]],[\"comment/495\",[]],[\"name/496\",[303,60.776]],[\"comment/496\",[]],[\"name/497\",[304,60.776]],[\"comment/497\",[]],[\"name/498\",[23,52.303]],[\"comment/498\",[]],[\"name/499\",[305,60.776]],[\"comment/499\",[]],[\"name/500\",[42,37.423]],[\"comment/500\",[]],[\"name/501\",[291,55.668]],[\"comment/501\",[]],[\"name/502\",[41,36.209]],[\"comment/502\",[]],[\"name/503\",[306,60.776]],[\"comment/503\",[]],[\"name/504\",[307,52.303]],[\"comment/504\",[]],[\"name/505\",[182,37.423]],[\"comment/505\",[]],[\"name/506\",[308,43.43]],[\"comment/506\",[]],[\"name/507\",[309,60.776]],[\"comment/507\",[]],[\"name/508\",[179,47.784]],[\"comment/508\",[]],[\"name/509\",[180,49.79]],[\"comment/509\",[]],[\"name/510\",[37,49.79]],[\"comment/510\",[]],[\"name/511\",[38,49.79]],[\"comment/511\",[]],[\"name/512\",[310,52.303]],[\"comment/512\",[]],[\"name/513\",[182,37.423]],[\"comment/513\",[]],[\"name/514\",[311,55.668]],[\"comment/514\",[]],[\"name/515\",[312,55.668]],[\"comment/515\",[]],[\"name/516\",[313,55.668]],[\"comment/516\",[]],[\"name/517\",[314,55.668]],[\"comment/517\",[]],[\"name/518\",[315,55.668]],[\"comment/518\",[]],[\"name/519\",[316,55.668]],[\"comment/519\",[]],[\"name/520\",[317,55.668]],[\"comment/520\",[]],[\"name/521\",[318,55.668]],[\"comment/521\",[]],[\"name/522\",[319,55.668]],[\"comment/522\",[]],[\"name/523\",[320,55.668]],[\"comment/523\",[]],[\"name/524\",[321,55.668]],[\"comment/524\",[]],[\"name/525\",[322,60.776]],[\"comment/525\",[]],[\"name/526\",[323,55.668]],[\"comment/526\",[]],[\"name/527\",[324,55.668]],[\"comment/527\",[]],[\"name/528\",[325,55.668]],[\"comment/528\",[]],[\"name/529\",[326,55.668]],[\"comment/529\",[]],[\"name/530\",[327,52.303]],[\"comment/530\",[]],[\"name/531\",[182,37.423]],[\"comment/531\",[]],[\"name/532\",[308,43.43]],[\"comment/532\",[]],[\"name/533\",[328,52.303]],[\"comment/533\",[]],[\"name/534\",[182,37.423]],[\"comment/534\",[]],[\"name/535\",[329,55.668]],[\"comment/535\",[]],[\"name/536\",[330,55.668]],[\"comment/536\",[]],[\"name/537\",[331,60.776]],[\"comment/537\",[]],[\"name/538\",[307,52.303]],[\"comment/538\",[]],[\"name/539\",[332,55.668]],[\"comment/539\",[]],[\"name/540\",[333,55.668]],[\"comment/540\",[]],[\"name/541\",[334,55.668]],[\"comment/541\",[]],[\"name/542\",[310,52.303]],[\"comment/542\",[]],[\"name/543\",[335,55.668]],[\"comment/543\",[]],[\"name/544\",[336,55.668]],[\"comment/544\",[]],[\"name/545\",[337,55.668]],[\"comment/545\",[]],[\"name/546\",[327,52.303]],[\"comment/546\",[]],[\"name/547\",[328,52.303]],[\"comment/547\",[]],[\"name/548\",[76,28.858]],[\"comment/548\",[]],[\"name/549\",[338,60.776]],[\"comment/549\",[]],[\"name/550\",[182,37.423]],[\"comment/550\",[]],[\"name/551\",[308,43.43]],[\"comment/551\",[]],[\"name/552\",[339,60.776]],[\"comment/552\",[]],[\"name/553\",[182,37.423]],[\"comment/553\",[]],[\"name/554\",[311,55.668]],[\"comment/554\",[]],[\"name/555\",[312,55.668]],[\"comment/555\",[]],[\"name/556\",[313,55.668]],[\"comment/556\",[]],[\"name/557\",[314,55.668]],[\"comment/557\",[]],[\"name/558\",[315,55.668]],[\"comment/558\",[]],[\"name/559\",[316,55.668]],[\"comment/559\",[]],[\"name/560\",[317,55.668]],[\"comment/560\",[]],[\"name/561\",[318,55.668]],[\"comment/561\",[]],[\"name/562\",[319,55.668]],[\"comment/562\",[]],[\"name/563\",[320,55.668]],[\"comment/563\",[]],[\"name/564\",[321,55.668]],[\"comment/564\",[]],[\"name/565\",[340,60.776]],[\"comment/565\",[]],[\"name/566\",[341,60.776]],[\"comment/566\",[]],[\"name/567\",[323,55.668]],[\"comment/567\",[]],[\"name/568\",[324,55.668]],[\"comment/568\",[]],[\"name/569\",[325,55.668]],[\"comment/569\",[]],[\"name/570\",[326,55.668]],[\"comment/570\",[]],[\"name/571\",[76,28.858]],[\"comment/571\",[]],[\"name/572\",[342,60.776]],[\"comment/572\",[]],[\"name/573\",[182,37.423]],[\"comment/573\",[]],[\"name/574\",[308,43.43]],[\"comment/574\",[]],[\"name/575\",[343,60.776]],[\"comment/575\",[]],[\"name/576\",[76,28.858]],[\"comment/576\",[]],[\"name/577\",[182,37.423]],[\"comment/577\",[]],[\"name/578\",[329,55.668]],[\"comment/578\",[]],[\"name/579\",[330,55.668]],[\"comment/579\",[]],[\"name/580\",[344,55.668]],[\"comment/580\",[]],[\"name/581\",[182,37.423]],[\"comment/581\",[]],[\"name/582\",[308,43.43]],[\"comment/582\",[]],[\"name/583\",[76,28.858]],[\"comment/583\",[]],[\"name/584\",[345,55.668]],[\"comment/584\",[]],[\"name/585\",[346,60.776]],[\"comment/585\",[]],[\"name/586\",[347,60.776]],[\"comment/586\",[]],[\"name/587\",[348,60.776]],[\"comment/587\",[]],[\"name/588\",[76,28.858]],[\"comment/588\",[]],[\"name/589\",[349,55.668]],[\"comment/589\",[]],[\"name/590\",[182,37.423]],[\"comment/590\",[]],[\"name/591\",[308,43.43]],[\"comment/591\",[]],[\"name/592\",[76,28.858]],[\"comment/592\",[]],[\"name/593\",[350,55.668]],[\"comment/593\",[]],[\"name/594\",[182,37.423]],[\"comment/594\",[]],[\"name/595\",[308,43.43]],[\"comment/595\",[]],[\"name/596\",[76,28.858]],[\"comment/596\",[]],[\"name/597\",[351,55.668]],[\"comment/597\",[]],[\"name/598\",[308,43.43]],[\"comment/598\",[]],[\"name/599\",[352,60.776]],[\"comment/599\",[]],[\"name/600\",[349,55.668]],[\"comment/600\",[]],[\"name/601\",[350,55.668]],[\"comment/601\",[]],[\"name/602\",[351,55.668]],[\"comment/602\",[]],[\"name/603\",[76,28.858]],[\"comment/603\",[]],[\"name/604\",[353,60.776]],[\"comment/604\",[]],[\"name/605\",[345,55.668]],[\"comment/605\",[]],[\"name/606\",[76,28.858]],[\"comment/606\",[]],[\"name/607\",[354,60.776]],[\"comment/607\",[]],[\"name/608\",[344,55.668]],[\"comment/608\",[]],[\"name/609\",[76,28.858]],[\"comment/609\",[]],[\"name/610\",[355,60.776]],[\"comment/610\",[]],[\"name/611\",[307,52.303]],[\"comment/611\",[]],[\"name/612\",[332,55.668]],[\"comment/612\",[]],[\"name/613\",[333,55.668]],[\"comment/613\",[]],[\"name/614\",[334,55.668]],[\"comment/614\",[]],[\"name/615\",[310,52.303]],[\"comment/615\",[]],[\"name/616\",[335,55.668]],[\"comment/616\",[]],[\"name/617\",[336,55.668]],[\"comment/617\",[]],[\"name/618\",[337,55.668]],[\"comment/618\",[]],[\"name/619\",[327,52.303]],[\"comment/619\",[]],[\"name/620\",[328,52.303]],[\"comment/620\",[]],[\"name/621\",[76,28.858]],[\"comment/621\",[]],[\"name/622\",[356,60.776]],[\"comment/622\",[]],[\"name/623\",[20,49.79]],[\"comment/623\",[]],[\"name/624\",[76,28.858]],[\"comment/624\",[]],[\"name/625\",[298,55.668]],[\"comment/625\",[]],[\"name/626\",[42,37.423]],[\"comment/626\",[]],[\"name/627\",[357,60.776]],[\"comment/627\",[]],[\"name/628\",[224,52.303]],[\"comment/628\",[]],[\"name/629\",[20,49.79]],[\"comment/629\",[]],[\"name/630\",[76,28.858]],[\"comment/630\",[]],[\"name/631\",[22,49.79]],[\"comment/631\",[]],[\"name/632\",[48,49.79]],[\"comment/632\",[]],[\"name/633\",[43,52.303]],[\"comment/633\",[]],[\"name/634\",[358,60.776]],[\"comment/634\",[]],[\"name/635\",[133,55.668]],[\"comment/635\",[]],[\"name/636\",[359,60.776]],[\"comment/636\",[]],[\"name/637\",[360,60.776]],[\"comment/637\",[]],[\"name/638\",[361,60.776]],[\"comment/638\",[]],[\"name/639\",[8,52.303]],[\"comment/639\",[]],[\"name/640\",[362,60.776]],[\"comment/640\",[]],[\"name/641\",[363,60.776]],[\"comment/641\",[]],[\"name/642\",[16,46.113]],[\"comment/642\",[]],[\"name/643\",[364,60.776]],[\"comment/643\",[]],[\"name/644\",[214,52.303]],[\"comment/644\",[]],[\"name/645\",[365,60.776]],[\"comment/645\",[]],[\"name/646\",[16,46.113]],[\"comment/646\",[]],[\"name/647\",[47,55.668]],[\"comment/647\",[]],[\"name/648\",[366,60.776]],[\"comment/648\",[]],[\"name/649\",[367,60.776]],[\"comment/649\",[]],[\"name/650\",[48,49.79]],[\"comment/650\",[]],[\"name/651\",[368,60.776]],[\"comment/651\",[]],[\"name/652\",[369,60.776]],[\"comment/652\",[]]],\"invertedIndex\":[[\"__type\",{\"_index\":31,\"name\":{\"32\":{},\"43\":{},\"77\":{},\"178\":{},\"344\":{},\"367\":{},\"371\":{},\"389\":{},\"392\":{}},\"comment\":{}}],[\"accesspolicyconfig\",{\"_index\":112,\"name\":{\"142\":{}},\"comment\":{}}],[\"activesource\",{\"_index\":32,\"name\":{\"33\":{},\"71\":{}},\"comment\":{}}],[\"activesources\",{\"_index\":54,\"name\":{\"70\":{}},\"comment\":{}}],[\"address\",{\"_index\":218,\"name\":{\"315\":{}},\"comment\":{}}],[\"afmode\",{\"_index\":341,\"name\":{\"566\":{}},\"comment\":{}}],[\"agent\",{\"_index\":10,\"name\":{\"10\":{},\"62\":{}},\"comment\":{}}],[\"analytics\",{\"_index\":164,\"name\":{\"228\":{},\"432\":{},\"493\":{}},\"comment\":{}}],[\"analyticscapabilities\",{\"_index\":162,\"name\":{\"223\":{}},\"comment\":{}}],[\"analyticsdevice\",{\"_index\":15,\"name\":{\"15\":{},\"215\":{}},\"comment\":{}}],[\"analyticsdevicecapabilities\",{\"_index\":154,\"name\":{\"203\":{}},\"comment\":{}}],[\"analyticsengineconfiguration\",{\"_index\":239,\"name\":{\"353\":{},\"363\":{},\"435\":{}},\"comment\":{}}],[\"analyticsmodule\",{\"_index\":240,\"name\":{\"354\":{}},\"comment\":{}}],[\"analyticsmodulesupport\",{\"_index\":163,\"name\":{\"226\":{}},\"comment\":{}}],[\"angle\",{\"_index\":186,\"name\":{\"267\":{}},\"comment\":{}}],[\"anyuri\",{\"_index\":176,\"name\":{\"251\":{}},\"comment\":{}}],[\"audiodecoder\",{\"_index\":304,\"name\":{\"497\":{}},\"comment\":{}}],[\"audiodecoderconfiguration\",{\"_index\":288,\"name\":{\"444\":{},\"450\":{}},\"comment\":{}}],[\"audioencoder\",{\"_index\":301,\"name\":{\"492\":{}},\"comment\":{}}],[\"audioencoder2configuration\",{\"_index\":296,\"name\":{\"480\":{}},\"comment\":{}}],[\"audioencoderconfiguration\",{\"_index\":231,\"name\":{\"333\":{},\"459\":{}},\"comment\":{}}],[\"audiooutput\",{\"_index\":303,\"name\":{\"496\":{}},\"comment\":{}}],[\"audiooutputconfiguration\",{\"_index\":284,\"name\":{\"437\":{},\"449\":{}},\"comment\":{}}],[\"audiooutputs\",{\"_index\":136,\"name\":{\"175\":{}},\"comment\":{}}],[\"audiosource\",{\"_index\":299,\"name\":{\"490\":{}},\"comment\":{}}],[\"audiosourceconfiguration\",{\"_index\":202,\"name\":{\"292\":{},\"457\":{}},\"comment\":{}}],[\"audiosources\",{\"_index\":135,\"name\":{\"174\":{}},\"comment\":{}}],[\"autoconnect\",{\"_index\":12,\"name\":{\"12\":{}},\"comment\":{}}],[\"autofocusmode\",{\"_index\":323,\"name\":{\"526\":{},\"567\":{}},\"comment\":{}}],[\"autostart\",{\"_index\":220,\"name\":{\"318\":{}},\"comment\":{}}],[\"auxiliary\",{\"_index\":97,\"name\":{\"124\":{}},\"comment\":{}}],[\"auxiliarycommands\",{\"_index\":98,\"name\":{\"125\":{}},\"comment\":{}}],[\"backlightcompensation\",{\"_index\":307,\"name\":{\"504\":{},\"538\":{},\"611\":{}},\"comment\":{}}],[\"backlightcompensation20\",{\"_index\":338,\"name\":{\"549\":{}},\"comment\":{}}],[\"bitrate\",{\"_index\":40,\"name\":{\"41\":{},\"338\":{},\"486\":{}},\"comment\":{}}],[\"bitratelimit\",{\"_index\":207,\"name\":{\"303\":{},\"467\":{}},\"comment\":{}}],[\"body\",{\"_index\":29,\"name\":{\"29\":{}},\"comment\":{}}],[\"boundaryoffset\",{\"_index\":347,\"name\":{\"586\":{}},\"comment\":{}}],[\"boundarytype\",{\"_index\":346,\"name\":{\"585\":{}},\"comment\":{}}],[\"bounds\",{\"_index\":201,\"name\":{\"290\":{}},\"comment\":{}}],[\"brightness\",{\"_index\":332,\"name\":{\"539\":{},\"612\":{}},\"comment\":{}}],[\"capabilities\",{\"_index\":51,\"name\":{\"67\":{},\"227\":{}},\"comment\":{}}],[\"capabilitiesextension\",{\"_index\":156,\"name\":{\"207\":{}},\"comment\":{}}],[\"cbgain\",{\"_index\":330,\"name\":{\"536\":{},\"579\":{}},\"comment\":{}}],[\"colorsaturation\",{\"_index\":333,\"name\":{\"540\":{},\"613\":{}},\"comment\":{}}],[\"compressiontype\",{\"_index\":280,\"name\":{\"427\":{}},\"comment\":{}}],[\"config\",{\"_index\":237,\"name\":{\"349\":{}},\"comment\":{}}],[\"configurations\",{\"_index\":306,\"name\":{\"503\":{}},\"comment\":{}}],[\"configurationset\",{\"_index\":297,\"name\":{\"488\":{}},\"comment\":{}}],[\"connect\",{\"_index\":67,\"name\":{\"87\":{}},\"comment\":{}}],[\"constantbitrate\",{\"_index\":293,\"name\":{\"465\":{}},\"comment\":{}}],[\"constructor\",{\"_index\":48,\"name\":{\"51\":{},\"236\":{},\"632\":{},\"650\":{}},\"comment\":{}}],[\"contrast\",{\"_index\":334,\"name\":{\"541\":{},\"614\":{}},\"comment\":{}}],[\"crgain\",{\"_index\":329,\"name\":{\"535\":{},\"578\":{}},\"comment\":{}}],[\"defaultabsolutepanttiltpositionspace\",{\"_index\":265,\"name\":{\"406\":{}},\"comment\":{}}],[\"defaultabsolutezoompositionspace\",{\"_index\":266,\"name\":{\"407\":{}},\"comment\":{}}],[\"defaultcontinuouspantiltvelocityspace\",{\"_index\":269,\"name\":{\"410\":{}},\"comment\":{}}],[\"defaultcontinuouszoomvelocityspace\",{\"_index\":270,\"name\":{\"411\":{}},\"comment\":{}}],[\"defaultprofile\",{\"_index\":53,\"name\":{\"69\":{}},\"comment\":{}}],[\"defaultprofiles\",{\"_index\":52,\"name\":{\"68\":{}},\"comment\":{}}],[\"defaultptzspeed\",{\"_index\":271,\"name\":{\"412\":{}},\"comment\":{}}],[\"defaultptztimeout\",{\"_index\":272,\"name\":{\"413\":{}},\"comment\":{}}],[\"defaultrelativepantilttranslationspace\",{\"_index\":267,\"name\":{\"408\":{}},\"comment\":{}}],[\"defaultrelativezoomtranslationspace\",{\"_index\":268,\"name\":{\"409\":{}},\"comment\":{}}],[\"defaultspeed\",{\"_index\":324,\"name\":{\"527\":{},\"568\":{}},\"comment\":{}}],[\"defogging\",{\"_index\":350,\"name\":{\"593\":{},\"601\":{}},\"comment\":{}}],[\"degree\",{\"_index\":183,\"name\":{\"261\":{}},\"comment\":{}}],[\"device\",{\"_index\":16,\"name\":{\"16\":{},\"52\":{},\"229\":{},\"235\":{},\"642\":{},\"646\":{}},\"comment\":{}}],[\"devicecapabilities\",{\"_index\":157,\"name\":{\"216\":{}},\"comment\":{}}],[\"deviceinformation\",{\"_index\":55,\"name\":{\"73\":{},\"245\":{}},\"comment\":{}}],[\"deviceio\",{\"_index\":17,\"name\":{\"17\":{},\"209\":{}},\"comment\":{}}],[\"deviceiocapabilities\",{\"_index\":132,\"name\":{\"170\":{}},\"comment\":{}}],[\"discovery\",{\"_index\":369,\"name\":{\"652\":{}},\"comment\":{}}],[\"discoverybye\",{\"_index\":89,\"name\":{\"113\":{}},\"comment\":{}}],[\"discoveryoptions\",{\"_index\":361,\"name\":{\"638\":{}},\"comment\":{}}],[\"discoveryresolve\",{\"_index\":88,\"name\":{\"112\":{}},\"comment\":{}}],[\"discoverysingleton\",{\"_index\":365,\"name\":{\"645\":{}},\"comment\":{}}],[\"display\",{\"_index\":18,\"name\":{\"18\":{},\"210\":{}},\"comment\":{}}],[\"displaycapabilities\",{\"_index\":139,\"name\":{\"181\":{}},\"comment\":{}}],[\"dot11configuration\",{\"_index\":75,\"name\":{\"97\":{}},\"comment\":{}}],[\"dot1x\",{\"_index\":103,\"name\":{\"132\":{}},\"comment\":{}}],[\"duration\",{\"_index\":221,\"name\":{\"319\":{}},\"comment\":{}}],[\"dynamicrecordings\",{\"_index\":144,\"name\":{\"188\":{}},\"comment\":{}}],[\"dynamictracks\",{\"_index\":145,\"name\":{\"189\":{}},\"comment\":{}}],[\"dyndns\",{\"_index\":81,\"name\":{\"103\":{}},\"comment\":{}}],[\"eflip\",{\"_index\":257,\"name\":{\"388\":{}},\"comment\":{}}],[\"elementitem\",{\"_index\":236,\"name\":{\"347\":{}},\"comment\":{}}],[\"encoding\",{\"_index\":36,\"name\":{\"37\":{},\"325\":{},\"337\":{},\"475\":{},\"484\":{}},\"comment\":{}}],[\"encodinginterval\",{\"_index\":206,\"name\":{\"302\":{}},\"comment\":{}}],[\"envelopefooter\",{\"_index\":57,\"name\":{\"75\":{}},\"comment\":{}}],[\"envelopeheader\",{\"_index\":56,\"name\":{\"74\":{}},\"comment\":{}}],[\"error\",{\"_index\":47,\"name\":{\"50\":{},\"647\":{}},\"comment\":{}}],[\"eventcapabilities\",{\"_index\":117,\"name\":{\"148\":{}},\"comment\":{}}],[\"events\",{\"_index\":19,\"name\":{\"19\":{},\"64\":{},\"230\":{},\"431\":{}},\"comment\":{}}],[\"eventsubscription\",{\"_index\":276,\"name\":{\"420\":{}},\"comment\":{}}],[\"exposure\",{\"_index\":310,\"name\":{\"512\":{},\"542\":{},\"615\":{}},\"comment\":{}}],[\"exposure20\",{\"_index\":339,\"name\":{\"552\":{}},\"comment\":{}}],[\"exposuretime\",{\"_index\":319,\"name\":{\"522\":{},\"562\":{}},\"comment\":{}}],[\"extension\",{\"_index\":76,\"name\":{\"98\":{},\"104\":{},\"110\":{},\"126\":{},\"130\":{},\"137\":{},\"147\":{},\"159\":{},\"167\":{},\"206\":{},\"234\":{},\"262\":{},\"283\":{},\"291\":{},\"348\":{},\"355\":{},\"358\":{},\"394\":{},\"397\":{},\"416\":{},\"436\":{},\"451\":{},\"463\":{},\"548\":{},\"571\":{},\"576\":{},\"583\":{},\"588\":{},\"592\":{},\"596\":{},\"603\":{},\"606\":{},\"609\":{},\"621\":{},\"624\":{},\"630\":{}},\"comment\":{}}],[\"extensions\",{\"_index\":95,\"name\":{\"122\":{},\"177\":{},\"222\":{}},\"comment\":{}}],[\"farlimit\",{\"_index\":326,\"name\":{\"529\":{},\"570\":{}},\"comment\":{}}],[\"filter\",{\"_index\":277,\"name\":{\"421\":{}},\"comment\":{}}],[\"firmwareupgrade\",{\"_index\":93,\"name\":{\"117\":{}},\"comment\":{}}],[\"firmwareversion\",{\"_index\":173,\"name\":{\"248\":{}},\"comment\":{}}],[\"fixed\",{\"_index\":291,\"name\":{\"454\":{},\"501\":{}},\"comment\":{}}],[\"fixedlayout\",{\"_index\":140,\"name\":{\"183\":{}},\"comment\":{}}],[\"focallength\",{\"_index\":190,\"name\":{\"271\":{}},\"comment\":{}}],[\"focus\",{\"_index\":335,\"name\":{\"543\":{},\"616\":{}},\"comment\":{}}],[\"focusconfiguration\",{\"_index\":322,\"name\":{\"525\":{}},\"comment\":{}}],[\"focusconfiguration20\",{\"_index\":340,\"name\":{\"565\":{}},\"comment\":{}}],[\"fps\",{\"_index\":39,\"name\":{\"40\":{}},\"comment\":{}}],[\"framerate\",{\"_index\":357,\"name\":{\"627\":{}},\"comment\":{}}],[\"frameratelimit\",{\"_index\":205,\"name\":{\"301\":{},\"466\":{}},\"comment\":{}}],[\"gain\",{\"_index\":320,\"name\":{\"523\":{},\"563\":{}},\"comment\":{}}],[\"geolocation\",{\"_index\":281,\"name\":{\"428\":{}},\"comment\":{}}],[\"getactivesources\",{\"_index\":66,\"name\":{\"86\":{}},\"comment\":{}}],[\"getcapabilities\",{\"_index\":168,\"name\":{\"242\":{}},\"comment\":{}}],[\"getdeviceinformation\",{\"_index\":169,\"name\":{\"243\":{}},\"comment\":{}}],[\"gethostname\",{\"_index\":170,\"name\":{\"244\":{}},\"comment\":{}}],[\"getinstance\",{\"_index\":367,\"name\":{\"649\":{}},\"comment\":{}}],[\"getprofiles\",{\"_index\":359,\"name\":{\"636\":{}},\"comment\":{}}],[\"getservices\",{\"_index\":167,\"name\":{\"241\":{}},\"comment\":{}}],[\"getsystemdateandtime\",{\"_index\":65,\"name\":{\"85\":{},\"240\":{}},\"comment\":{}}],[\"getvideosources\",{\"_index\":360,\"name\":{\"637\":{}},\"comment\":{}}],[\"govlength\",{\"_index\":209,\"name\":{\"305\":{},\"308\":{},\"472\":{}},\"comment\":{}}],[\"guaranteedframerate\",{\"_index\":223,\"name\":{\"324\":{},\"474\":{}},\"comment\":{}}],[\"h264\",{\"_index\":228,\"name\":{\"330\":{}},\"comment\":{}}],[\"h264configuration\",{\"_index\":211,\"name\":{\"307\":{}},\"comment\":{}}],[\"h264profile\",{\"_index\":212,\"name\":{\"309\":{}},\"comment\":{}}],[\"hardwareid\",{\"_index\":175,\"name\":{\"250\":{}},\"comment\":{}}],[\"height\",{\"_index\":38,\"name\":{\"39\":{},\"258\":{},\"299\":{},\"511\":{}},\"comment\":{}}],[\"hostname\",{\"_index\":3,\"name\":{\"3\":{},\"56\":{}},\"comment\":{}}],[\"httpfirmwareupgrade\",{\"_index\":83,\"name\":{\"106\":{},\"118\":{}},\"comment\":{}}],[\"httpsupportinformation\",{\"_index\":86,\"name\":{\"109\":{}},\"comment\":{}}],[\"httpsystembackup\",{\"_index\":84,\"name\":{\"107\":{},\"119\":{}},\"comment\":{}}],[\"httpsystemlogging\",{\"_index\":85,\"name\":{\"108\":{},\"120\":{}},\"comment\":{}}],[\"imagestabilization\",{\"_index\":344,\"name\":{\"580\":{},\"608\":{}},\"comment\":{}}],[\"imaging\",{\"_index\":20,\"name\":{\"20\":{},\"231\":{},\"623\":{},\"629\":{}},\"comment\":{}}],[\"imagingcapabilities\",{\"_index\":121,\"name\":{\"153\":{}},\"comment\":{}}],[\"imagingsettings\",{\"_index\":331,\"name\":{\"537\":{}},\"comment\":{}}],[\"imagingsettings20\",{\"_index\":355,\"name\":{\"610\":{}},\"comment\":{}}],[\"imagingsettingsextension20\",{\"_index\":354,\"name\":{\"607\":{}},\"comment\":{}}],[\"imagingsettingsextension202\",{\"_index\":353,\"name\":{\"604\":{}},\"comment\":{}}],[\"imagingsettingsextension203\",{\"_index\":352,\"name\":{\"599\":{}},\"comment\":{}}],[\"inputconnectors\",{\"_index\":100,\"name\":{\"128\":{}},\"comment\":{}}],[\"instance\",{\"_index\":366,\"name\":{\"648\":{}},\"comment\":{}}],[\"intrectangle\",{\"_index\":178,\"name\":{\"254\":{}},\"comment\":{}}],[\"io\",{\"_index\":160,\"name\":{\"220\":{}},\"comment\":{}}],[\"iocapabilities\",{\"_index\":99,\"name\":{\"127\":{}},\"comment\":{}}],[\"iocapabilitiesextension\",{\"_index\":96,\"name\":{\"123\":{}},\"comment\":{}}],[\"ipaddress\",{\"_index\":213,\"name\":{\"310\":{}},\"comment\":{}}],[\"ipfilter\",{\"_index\":78,\"name\":{\"100\":{}},\"comment\":{}}],[\"ipv4address\",{\"_index\":215,\"name\":{\"312\":{}},\"comment\":{}}],[\"ipv6address\",{\"_index\":216,\"name\":{\"313\":{}},\"comment\":{}}],[\"ipversion6\",{\"_index\":80,\"name\":{\"102\":{}},\"comment\":{}}],[\"ircutfilter\",{\"_index\":336,\"name\":{\"544\":{},\"617\":{}},\"comment\":{}}],[\"ircutfilterautoadjustment\",{\"_index\":345,\"name\":{\"584\":{},\"605\":{}},\"comment\":{}}],[\"iris\",{\"_index\":321,\"name\":{\"524\":{},\"564\":{}},\"comment\":{}}],[\"itemlist\",{\"_index\":233,\"name\":{\"342\":{}},\"comment\":{}}],[\"kerberostoken\",{\"_index\":115,\"name\":{\"145\":{}},\"comment\":{}}],[\"lensdescription\",{\"_index\":189,\"name\":{\"270\":{},\"279\":{}},\"comment\":{}}],[\"lensoffset\",{\"_index\":184,\"name\":{\"263\":{}},\"comment\":{}}],[\"lensprojection\",{\"_index\":185,\"name\":{\"266\":{}},\"comment\":{}}],[\"level\",{\"_index\":308,\"name\":{\"506\":{},\"532\":{},\"551\":{},\"574\":{},\"582\":{},\"591\":{},\"595\":{},\"598\":{}},\"comment\":{}}],[\"listeningport\",{\"_index\":364,\"name\":{\"643\":{}},\"comment\":{}}],[\"major\",{\"_index\":72,\"name\":{\"92\":{},\"94\":{}},\"comment\":{}}],[\"manufacturer\",{\"_index\":171,\"name\":{\"246\":{}},\"comment\":{}}],[\"max\",{\"_index\":249,\"name\":{\"375\":{}},\"comment\":{}}],[\"maxexposuretime\",{\"_index\":314,\"name\":{\"517\":{},\"557\":{}},\"comment\":{}}],[\"maxgain\",{\"_index\":316,\"name\":{\"519\":{},\"559\":{}},\"comment\":{}}],[\"maximumnumberofprofiles\",{\"_index\":127,\"name\":{\"161\":{}},\"comment\":{}}],[\"maximumrtspurilength\",{\"_index\":153,\"name\":{\"202\":{}},\"comment\":{}}],[\"maxiris\",{\"_index\":318,\"name\":{\"521\":{},\"561\":{}},\"comment\":{}}],[\"maxstringlength\",{\"_index\":146,\"name\":{\"190\":{}},\"comment\":{}}],[\"media\",{\"_index\":22,\"name\":{\"22\":{},\"53\":{},\"232\":{},\"631\":{}},\"comment\":{}}],[\"media2\",{\"_index\":21,\"name\":{\"21\":{}},\"comment\":{}}],[\"media2support\",{\"_index\":166,\"name\":{\"239\":{}},\"comment\":{}}],[\"mediacapabilities\",{\"_index\":129,\"name\":{\"164\":{}},\"comment\":{}}],[\"mediacapabilitiesextension\",{\"_index\":128,\"name\":{\"162\":{}},\"comment\":{}}],[\"mediaprofile\",{\"_index\":305,\"name\":{\"499\":{}},\"comment\":{}}],[\"mediaprofilesource\",{\"_index\":143,\"name\":{\"187\":{}},\"comment\":{}}],[\"messageid\",{\"_index\":363,\"name\":{\"641\":{}},\"comment\":{}}],[\"metadata\",{\"_index\":302,\"name\":{\"495\":{}},\"comment\":{}}],[\"metadataconfiguration\",{\"_index\":279,\"name\":{\"423\":{},\"462\":{}},\"comment\":{}}],[\"metadatasearch\",{\"_index\":148,\"name\":{\"193\":{}},\"comment\":{}}],[\"min\",{\"_index\":248,\"name\":{\"374\":{}},\"comment\":{}}],[\"minexposuretime\",{\"_index\":313,\"name\":{\"516\":{},\"556\":{}},\"comment\":{}}],[\"mingain\",{\"_index\":315,\"name\":{\"518\":{},\"558\":{}},\"comment\":{}}],[\"miniris\",{\"_index\":317,\"name\":{\"520\":{},\"560\":{}},\"comment\":{}}],[\"minor\",{\"_index\":71,\"name\":{\"91\":{},\"95\":{}},\"comment\":{}}],[\"mode\",{\"_index\":182,\"name\":{\"260\":{},\"276\":{},\"390\":{},\"393\":{},\"505\":{},\"513\":{},\"531\":{},\"534\":{},\"550\":{},\"553\":{},\"573\":{},\"577\":{},\"581\":{},\"590\":{},\"594\":{}},\"comment\":{}}],[\"model\",{\"_index\":172,\"name\":{\"247\":{}},\"comment\":{}}],[\"moveramp\",{\"_index\":261,\"name\":{\"402\":{}},\"comment\":{}}],[\"mpeg4\",{\"_index\":227,\"name\":{\"329\":{}},\"comment\":{}}],[\"mpeg4configuration\",{\"_index\":208,\"name\":{\"304\":{}},\"comment\":{}}],[\"mpeg4profile\",{\"_index\":210,\"name\":{\"306\":{}},\"comment\":{}}],[\"multicast\",{\"_index\":229,\"name\":{\"331\":{},\"340\":{},\"433\":{},\"485\":{}},\"comment\":{}}],[\"multicastconfiguration\",{\"_index\":217,\"name\":{\"314\":{}},\"comment\":{}}],[\"mutlicast\",{\"_index\":295,\"name\":{\"478\":{}},\"comment\":{}}],[\"name\",{\"_index\":41,\"name\":{\"44\":{},\"253\":{},\"286\":{},\"294\":{},\"322\":{},\"335\":{},\"345\":{},\"350\":{},\"361\":{},\"400\":{},\"425\":{},\"439\":{},\"446\":{},\"455\":{},\"470\":{},\"482\":{},\"502\":{}},\"comment\":{}}],[\"namespace\",{\"_index\":69,\"name\":{\"89\":{}},\"comment\":{}}],[\"nearlimit\",{\"_index\":325,\"name\":{\"528\":{},\"569\":{}},\"comment\":{}}],[\"network\",{\"_index\":158,\"name\":{\"218\":{}},\"comment\":{}}],[\"networkcapabilities\",{\"_index\":77,\"name\":{\"99\":{}},\"comment\":{}}],[\"networkcapabilitiesextension\",{\"_index\":74,\"name\":{\"96\":{}},\"comment\":{}}],[\"nodetoken\",{\"_index\":264,\"name\":{\"405\":{}},\"comment\":{}}],[\"noisereduction\",{\"_index\":351,\"name\":{\"597\":{},\"602\":{}},\"comment\":{}}],[\"nonce\",{\"_index\":60,\"name\":{\"79\":{}},\"comment\":{}}],[\"offset\",{\"_index\":191,\"name\":{\"272\":{}},\"comment\":{}}],[\"onboardkeygeneration\",{\"_index\":111,\"name\":{\"141\":{}},\"comment\":{}}],[\"onvif\",{\"_index\":43,\"name\":{\"46\":{},\"237\":{},\"633\":{}},\"comment\":{}}],[\"onvifoptions\",{\"_index\":0,\"name\":{\"0\":{}},\"comment\":{}}],[\"onvifrequestoptions\",{\"_index\":27,\"name\":{\"27\":{}},\"comment\":{}}],[\"onvifservice\",{\"_index\":68,\"name\":{\"88\":{}},\"comment\":{}}],[\"onvifservices\",{\"_index\":13,\"name\":{\"13\":{}},\"comment\":{}}],[\"onvifversion\",{\"_index\":73,\"name\":{\"93\":{}},\"comment\":{}}],[\"orientation\",{\"_index\":195,\"name\":{\"277\":{}},\"comment\":{}}],[\"outputlevel\",{\"_index\":287,\"name\":{\"443\":{}},\"comment\":{}}],[\"outputtoken\",{\"_index\":285,\"name\":{\"441\":{}},\"comment\":{}}],[\"pantilt\",{\"_index\":245,\"name\":{\"366\":{}},\"comment\":{}}],[\"pantiltlimits\",{\"_index\":253,\"name\":{\"380\":{},\"414\":{}},\"comment\":{}}],[\"parameters\",{\"_index\":238,\"name\":{\"352\":{}},\"comment\":{}}],[\"parseurl\",{\"_index\":64,\"name\":{\"84\":{}},\"comment\":{}}],[\"passdigest\",{\"_index\":59,\"name\":{\"78\":{}},\"comment\":{}}],[\"password\",{\"_index\":5,\"name\":{\"5\":{},\"58\":{}},\"comment\":{}}],[\"passworddigest\",{\"_index\":58,\"name\":{\"76\":{}},\"comment\":{}}],[\"path\",{\"_index\":7,\"name\":{\"7\":{},\"60\":{}},\"comment\":{}}],[\"port\",{\"_index\":6,\"name\":{\"6\":{},\"59\":{},\"316\":{}},\"comment\":{}}],[\"position\",{\"_index\":275,\"name\":{\"419\":{}},\"comment\":{}}],[\"preserveaddress\",{\"_index\":11,\"name\":{\"11\":{},\"63\":{}},\"comment\":{}}],[\"presetramp\",{\"_index\":262,\"name\":{\"403\":{}},\"comment\":{}}],[\"presettourramp\",{\"_index\":263,\"name\":{\"404\":{}},\"comment\":{}}],[\"priority\",{\"_index\":311,\"name\":{\"514\":{},\"554\":{}},\"comment\":{}}],[\"probe\",{\"_index\":368,\"name\":{\"651\":{}},\"comment\":{}}],[\"profile\",{\"_index\":290,\"name\":{\"452\":{},\"473\":{}},\"comment\":{}}],[\"profilecapabilities\",{\"_index\":126,\"name\":{\"160\":{},\"163\":{}},\"comment\":{}}],[\"profileextension\",{\"_index\":289,\"name\":{\"448\":{}},\"comment\":{}}],[\"profiles\",{\"_index\":358,\"name\":{\"634\":{}},\"comment\":{}}],[\"profiletoken\",{\"_index\":34,\"name\":{\"35\":{}},\"comment\":{}}],[\"projection\",{\"_index\":192,\"name\":{\"273\":{}},\"comment\":{}}],[\"ptcontroldirection\",{\"_index\":256,\"name\":{\"387\":{},\"396\":{}},\"comment\":{}}],[\"ptz\",{\"_index\":14,\"name\":{\"14\":{},\"31\":{},\"42\":{},\"233\":{},\"494\":{}},\"comment\":{}}],[\"ptzcapabilities\",{\"_index\":131,\"name\":{\"168\":{}},\"comment\":{}}],[\"ptzconfiguration\",{\"_index\":260,\"name\":{\"398\":{},\"461\":{}},\"comment\":{}}],[\"ptzconfigurationextension\",{\"_index\":259,\"name\":{\"395\":{}},\"comment\":{}}],[\"ptzfilter\",{\"_index\":273,\"name\":{\"417\":{}},\"comment\":{}}],[\"ptzspeed\",{\"_index\":244,\"name\":{\"365\":{}},\"comment\":{}}],[\"ptzstatus\",{\"_index\":283,\"name\":{\"430\":{}},\"comment\":{}}],[\"quality\",{\"_index\":225,\"name\":{\"327\":{},\"479\":{}},\"comment\":{}}],[\"radius\",{\"_index\":187,\"name\":{\"268\":{}},\"comment\":{}}],[\"range\",{\"_index\":247,\"name\":{\"373\":{},\"381\":{},\"386\":{}},\"comment\":{}}],[\"ratecontrol\",{\"_index\":226,\"name\":{\"328\":{},\"477\":{}},\"comment\":{}}],[\"rawrequest\",{\"_index\":44,\"name\":{\"47\":{},\"82\":{}},\"comment\":{}}],[\"rawresponse\",{\"_index\":45,\"name\":{\"48\":{}},\"comment\":{}}],[\"realtimestreamingcapabilities\",{\"_index\":122,\"name\":{\"155\":{}},\"comment\":{}}],[\"receiver\",{\"_index\":23,\"name\":{\"23\":{},\"214\":{},\"498\":{}},\"comment\":{}}],[\"receivercapabilities\",{\"_index\":150,\"name\":{\"196\":{}},\"comment\":{}}],[\"receiversource\",{\"_index\":142,\"name\":{\"186\":{}},\"comment\":{}}],[\"recording\",{\"_index\":24,\"name\":{\"24\":{},\"211\":{}},\"comment\":{}}],[\"recordingcapabilities\",{\"_index\":141,\"name\":{\"184\":{}},\"comment\":{}}],[\"rectangle\",{\"_index\":309,\"name\":{\"507\":{}},\"comment\":{}}],[\"referencetoken\",{\"_index\":177,\"name\":{\"252\":{}},\"comment\":{}}],[\"relayoutputs\",{\"_index\":101,\"name\":{\"129\":{},\"176\":{}},\"comment\":{}}],[\"reltoken\",{\"_index\":116,\"name\":{\"146\":{}},\"comment\":{}}],[\"remotediscovery\",{\"_index\":90,\"name\":{\"114\":{}},\"comment\":{}}],[\"remoteuserhandling\",{\"_index\":105,\"name\":{\"134\":{}},\"comment\":{}}],[\"replay\",{\"_index\":25,\"name\":{\"25\":{},\"213\":{}},\"comment\":{}}],[\"replaycapabilities\",{\"_index\":149,\"name\":{\"194\":{}},\"comment\":{}}],[\"request\",{\"_index\":63,\"name\":{\"83\":{}},\"comment\":{}}],[\"resolution\",{\"_index\":224,\"name\":{\"326\":{},\"476\":{},\"628\":{}},\"comment\":{}}],[\"resolve\",{\"_index\":362,\"name\":{\"640\":{}},\"comment\":{}}],[\"responsetime\",{\"_index\":348,\"name\":{\"587\":{}},\"comment\":{}}],[\"reverse\",{\"_index\":258,\"name\":{\"391\":{}},\"comment\":{}}],[\"rotate\",{\"_index\":181,\"name\":{\"259\":{},\"282\":{}},\"comment\":{}}],[\"rtp_multicast\",{\"_index\":151,\"name\":{\"198\":{}},\"comment\":{}}],[\"rtp_rtsp_tcp\",{\"_index\":125,\"name\":{\"158\":{},\"200\":{}},\"comment\":{}}],[\"rtp_tcp\",{\"_index\":124,\"name\":{\"157\":{},\"199\":{}},\"comment\":{}}],[\"rtpmulticast\",{\"_index\":123,\"name\":{\"156\":{}},\"comment\":{}}],[\"rule\",{\"_index\":242,\"name\":{\"357\":{}},\"comment\":{}}],[\"ruleengineconfiguration\",{\"_index\":241,\"name\":{\"356\":{},\"364\":{}},\"comment\":{}}],[\"rulesupport\",{\"_index\":155,\"name\":{\"205\":{},\"225\":{}},\"comment\":{}}],[\"samltoken\",{\"_index\":114,\"name\":{\"144\":{}},\"comment\":{}}],[\"samplerate\",{\"_index\":232,\"name\":{\"339\":{},\"487\":{}},\"comment\":{}}],[\"scdlcapabilities\",{\"_index\":138,\"name\":{\"180\":{}},\"comment\":{}}],[\"sceneorientation\",{\"_index\":194,\"name\":{\"275\":{},\"280\":{}},\"comment\":{}}],[\"search\",{\"_index\":26,\"name\":{\"26\":{},\"212\":{}},\"comment\":{}}],[\"searchcapabilities\",{\"_index\":147,\"name\":{\"191\":{}},\"comment\":{}}],[\"secureoptions\",{\"_index\":2,\"name\":{\"2\":{},\"55\":{}},\"comment\":{}}],[\"security\",{\"_index\":161,\"name\":{\"221\":{}},\"comment\":{}}],[\"securitycapabilities\",{\"_index\":108,\"name\":{\"138\":{}},\"comment\":{}}],[\"securitycapabilitiesextension\",{\"_index\":106,\"name\":{\"135\":{}},\"comment\":{}}],[\"securitycapabilitiesextension2\",{\"_index\":102,\"name\":{\"131\":{}},\"comment\":{}}],[\"sendprimacy\",{\"_index\":286,\"name\":{\"442\":{}},\"comment\":{}}],[\"serialnumber\",{\"_index\":174,\"name\":{\"249\":{}},\"comment\":{}}],[\"service\",{\"_index\":28,\"name\":{\"28\":{}},\"comment\":{}}],[\"services\",{\"_index\":165,\"name\":{\"238\":{}},\"comment\":{}}],[\"sessiontimeout\",{\"_index\":230,\"name\":{\"332\":{},\"341\":{},\"434\":{}},\"comment\":{}}],[\"setupsystemdateandtime\",{\"_index\":62,\"name\":{\"81\":{}},\"comment\":{}}],[\"shapepolygon\",{\"_index\":282,\"name\":{\"429\":{}},\"comment\":{}}],[\"sharpness\",{\"_index\":337,\"name\":{\"545\":{},\"618\":{}},\"comment\":{}}],[\"simpleitem\",{\"_index\":234,\"name\":{\"343\":{}},\"comment\":{}}],[\"sourcetoken\",{\"_index\":33,\"name\":{\"34\":{},\"289\":{},\"296\":{}},\"comment\":{}}],[\"space1ddescription\",{\"_index\":254,\"name\":{\"382\":{}},\"comment\":{}}],[\"space2ddescription\",{\"_index\":250,\"name\":{\"376\":{}},\"comment\":{}}],[\"status\",{\"_index\":274,\"name\":{\"418\":{}},\"comment\":{}}],[\"streamingcapabilities\",{\"_index\":130,\"name\":{\"166\":{}},\"comment\":{}}],[\"subscriptionpolicy\",{\"_index\":278,\"name\":{\"422\":{}},\"comment\":{}}],[\"supportedeapmethod\",{\"_index\":104,\"name\":{\"133\":{}},\"comment\":{}}],[\"supportedreceivers\",{\"_index\":152,\"name\":{\"201\":{}},\"comment\":{}}],[\"supportedversions\",{\"_index\":94,\"name\":{\"121\":{}},\"comment\":{}}],[\"system\",{\"_index\":159,\"name\":{\"219\":{}},\"comment\":{}}],[\"systembackup\",{\"_index\":91,\"name\":{\"115\":{}},\"comment\":{}}],[\"systemcapabilities\",{\"_index\":87,\"name\":{\"111\":{}},\"comment\":{}}],[\"systemcapabilitiesextension\",{\"_index\":82,\"name\":{\"105\":{}},\"comment\":{}}],[\"systemlogging\",{\"_index\":92,\"name\":{\"116\":{}},\"comment\":{}}],[\"telexcapabilities\",{\"_index\":137,\"name\":{\"179\":{}},\"comment\":{}}],[\"timeout\",{\"_index\":8,\"name\":{\"8\":{},\"61\":{},\"639\":{}},\"comment\":{}}],[\"timeshift\",{\"_index\":50,\"name\":{\"66\":{}},\"comment\":{}}],[\"timestamp\",{\"_index\":61,\"name\":{\"80\":{}},\"comment\":{}}],[\"tls1.0\",{\"_index\":107,\"name\":{\"136\":{}},\"comment\":{}}],[\"tls1.1\",{\"_index\":109,\"name\":{\"139\":{}},\"comment\":{}}],[\"tls1.2\",{\"_index\":110,\"name\":{\"140\":{}},\"comment\":{}}],[\"token\",{\"_index\":42,\"name\":{\"45\":{},\"285\":{},\"293\":{},\"321\":{},\"334\":{},\"360\":{},\"399\":{},\"424\":{},\"438\":{},\"445\":{},\"453\":{},\"469\":{},\"481\":{},\"500\":{},\"626\":{}},\"comment\":{}}],[\"tonecompensation\",{\"_index\":349,\"name\":{\"589\":{},\"600\":{}},\"comment\":{}}],[\"transmittance\",{\"_index\":188,\"name\":{\"269\":{}},\"comment\":{}}],[\"ttl\",{\"_index\":219,\"name\":{\"317\":{}},\"comment\":{}}],[\"type\",{\"_index\":214,\"name\":{\"311\":{},\"351\":{},\"644\":{}},\"comment\":{}}],[\"uri\",{\"_index\":49,\"name\":{\"65\":{},\"377\":{},\"383\":{}},\"comment\":{}}],[\"url\",{\"_index\":30,\"name\":{\"30\":{}},\"comment\":{}}],[\"urn\",{\"_index\":9,\"name\":{\"9\":{},\"72\":{}},\"comment\":{}}],[\"usecount\",{\"_index\":199,\"name\":{\"287\":{},\"295\":{},\"323\":{},\"336\":{},\"362\":{},\"401\":{},\"426\":{},\"440\":{},\"447\":{},\"471\":{},\"483\":{}},\"comment\":{}}],[\"username\",{\"_index\":4,\"name\":{\"4\":{},\"57\":{}},\"comment\":{}}],[\"usesecure\",{\"_index\":1,\"name\":{\"1\":{},\"54\":{}},\"comment\":{}}],[\"value\",{\"_index\":235,\"name\":{\"346\":{}},\"comment\":{}}],[\"videoanalyticsconfiguration\",{\"_index\":243,\"name\":{\"359\":{},\"460\":{}},\"comment\":{}}],[\"videoencoder\",{\"_index\":300,\"name\":{\"491\":{}},\"comment\":{}}],[\"videoencoder2configuration\",{\"_index\":294,\"name\":{\"468\":{}},\"comment\":{}}],[\"videoencoderconfiguration\",{\"_index\":222,\"name\":{\"320\":{},\"458\":{}},\"comment\":{}}],[\"videooutputs\",{\"_index\":134,\"name\":{\"173\":{}},\"comment\":{}}],[\"videoratecontrol\",{\"_index\":204,\"name\":{\"300\":{}},\"comment\":{}}],[\"videoratecontrol2\",{\"_index\":292,\"name\":{\"464\":{}},\"comment\":{}}],[\"videoresolution\",{\"_index\":203,\"name\":{\"297\":{}},\"comment\":{}}],[\"videosource\",{\"_index\":298,\"name\":{\"489\":{},\"625\":{}},\"comment\":{}}],[\"videosourceconfiguration\",{\"_index\":198,\"name\":{\"284\":{},\"456\":{}},\"comment\":{}}],[\"videosourceconfigurationextension\",{\"_index\":197,\"name\":{\"281\":{}},\"comment\":{}}],[\"videosourceconfigurationextension2\",{\"_index\":196,\"name\":{\"278\":{}},\"comment\":{}}],[\"videosourceconfigurationtoken\",{\"_index\":35,\"name\":{\"36\":{}},\"comment\":{}}],[\"videosourceextension\",{\"_index\":356,\"name\":{\"622\":{}},\"comment\":{}}],[\"videosources\",{\"_index\":133,\"name\":{\"172\":{},\"635\":{}},\"comment\":{}}],[\"viewmode\",{\"_index\":200,\"name\":{\"288\":{}},\"comment\":{}}],[\"warn\",{\"_index\":46,\"name\":{\"49\":{}},\"comment\":{}}],[\"whitebalance\",{\"_index\":328,\"name\":{\"533\":{},\"547\":{},\"620\":{}},\"comment\":{}}],[\"whitebalance20\",{\"_index\":343,\"name\":{\"575\":{}},\"comment\":{}}],[\"widedynamicrange\",{\"_index\":327,\"name\":{\"530\":{},\"546\":{},\"619\":{}},\"comment\":{}}],[\"widedynamicrange20\",{\"_index\":342,\"name\":{\"572\":{}},\"comment\":{}}],[\"width\",{\"_index\":37,\"name\":{\"38\":{},\"257\":{},\"298\":{},\"510\":{}},\"comment\":{}}],[\"window\",{\"_index\":312,\"name\":{\"515\":{},\"555\":{}},\"comment\":{}}],[\"wspausablesubscriptionmanagerinterfacesupport\",{\"_index\":120,\"name\":{\"152\":{}},\"comment\":{}}],[\"wspullpointsupport\",{\"_index\":119,\"name\":{\"151\":{}},\"comment\":{}}],[\"wssubscriptionpolicysupport\",{\"_index\":118,\"name\":{\"150\":{}},\"comment\":{}}],[\"x\",{\"_index\":179,\"name\":{\"255\":{},\"264\":{},\"368\":{},\"372\":{},\"508\":{}},\"comment\":{}}],[\"x.509token\",{\"_index\":113,\"name\":{\"143\":{}},\"comment\":{}}],[\"xaddr\",{\"_index\":70,\"name\":{\"90\":{},\"149\":{},\"154\":{},\"165\":{},\"169\":{},\"171\":{},\"182\":{},\"185\":{},\"192\":{},\"195\":{},\"197\":{},\"204\":{},\"208\":{},\"217\":{},\"224\":{}},\"comment\":{}}],[\"xfactor\",{\"_index\":193,\"name\":{\"274\":{}},\"comment\":{}}],[\"xrange\",{\"_index\":251,\"name\":{\"378\":{},\"384\":{}},\"comment\":{}}],[\"y\",{\"_index\":180,\"name\":{\"256\":{},\"265\":{},\"369\":{},\"509\":{}},\"comment\":{}}],[\"yrange\",{\"_index\":252,\"name\":{\"379\":{}},\"comment\":{}}],[\"zeroconfiguration\",{\"_index\":79,\"name\":{\"101\":{}},\"comment\":{}}],[\"zoom\",{\"_index\":246,\"name\":{\"370\":{}},\"comment\":{}}],[\"zoomlimits\",{\"_index\":255,\"name\":{\"385\":{},\"415\":{}},\"comment\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css new file mode 100644 index 00000000..958d2c26 --- /dev/null +++ b/docs/assets/style.css @@ -0,0 +1,1225 @@ +:root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-icon-background: var(--light-color-background); + --light-color-accent: #c5c7c9; + --light-color-text: #222; + --light-color-text-aside: #707070; + --light-color-link: #4da6ff; + --light-color-ts: #db1373; + --light-color-ts-interface: #139d2c; + --light-color-ts-enum: #9c891a; + --light-color-ts-class: #2484e5; + --light-color-ts-function: #572be7; + --light-color-ts-namespace: #b111c9; + --light-color-ts-private: #707070; + --light-color-ts-variable: #4d68ff; + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-accent: #9096a2; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + --dark-color-link: #00aff4; + --dark-color-ts: #ff6492; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-class: #61b0ff; + --dark-color-ts-function: #9772ff; + --dark-color-ts-namespace: #e14dff; + --dark-color-ts-private: #e2e2e2; + --dark-color-ts-variable: #4d68ff; + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-function: var(--light-color-ts-function); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-private: var(--light-color-ts-private); + --color-ts-variable: var(--light-color-ts-variable); + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-private: var(--dark-color-ts-private); + --color-ts-variable: var(--dark-color-ts-variable); + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } +} + +html { + color-scheme: var(--color-scheme); +} + +body { + margin: 0; +} + +:root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-function: var(--light-color-ts-function); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-private: var(--light-color-ts-private); + --color-ts-variable: var(--light-color-ts-variable); + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); +} + +:root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-private: var(--dark-color-ts-private); + --color-ts-variable: var(--dark-color-ts-variable); + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1 { + font-size: 1.875rem; + margin: 0.67rem 0; +} + +h2 { + font-size: 1.5rem; + margin: 0.83rem 0; +} + +h3 { + font-size: 1.25rem; + margin: 1rem 0; +} + +h4 { + font-size: 1.05rem; + margin: 1.33rem 0; +} + +h5 { + font-size: 1rem; + margin: 1.5rem 0; +} + +h6 { + font-size: 0.875rem; + margin: 2.33rem 0; +} + +.uppercase { + text-transform: uppercase; +} + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1600px; + padding: 0 2rem; +} + +@media (min-width: 640px) { + .container { + padding: 0 4rem; + } +} +@media (min-width: 1200px) { + .container { + padding: 0 8rem; + } +} +@media (min-width: 1600px) { + .container { + padding: 0 12rem; + } +} + +/* Footer */ +.tsd-generator { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; +} + +.tsd-generator > p { + margin-top: 0; + margin-bottom: 0; + padding: 0 1rem; +} + +.container-main { + display: flex; + justify-content: space-between; + position: relative; + margin: 0 auto; +} + +.col-4, +.col-8 { + box-sizing: border-box; + float: left; + padding: 2rem 1rem; +} + +.col-4 { + flex: 0 0 25%; +} +.col-8 { + flex: 1 0; + flex-wrap: wrap; + padding-left: 0; +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes shift-to-left { + from { + transform: translate(0, 0); + } + to { + transform: translate(-25%, 0); + } +} +@keyframes unshift-to-left { + from { + transform: translate(-25%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: "Segoe UI", sans-serif; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; +} + +pre { + padding: 10px; + border: 0.1em solid var(--color-accent); +} +pre code { + padding: 0; + font-size: 100%; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography h4, +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; + margin: 0; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} + +@media (max-width: 1024px) { + html .col-content { + float: none; + max-width: 100%; + width: 100%; + padding-top: 3rem; + } + html .col-menu { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + max-width: 25rem; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-menu > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu :is(header, footer, .col-content) { + animation: shift-to-left 0.4s; + } + + .to-has-menu .col-menu { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu :is(header, footer, .col-content) { + animation: unshift-to-left 0.4s; + } + + .from-has-menu .col-menu { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu :is(header, footer, .col-content) { + transform: translate(-25%, 0); + } + .has-menu .col-menu { + visibility: visible; + transform: translate(0, 0); + display: grid; + align-items: center; + grid-template-rows: auto 1fr; + grid-gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +.tsd-comment-tags { + display: flex; + flex-direction: column; +} +dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; +} +dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; +} +dl.tsd-comment-tag-group dd { + margin: 0; +} +code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; +} +h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; +} + +dl.tsd-comment-tag-group dd:before, +dl.tsd-comment-tag-group dd:after { + content: " "; +} +dl.tsd-comment-tag-group dd pre, +dl.tsd-comment-tag-group dd:after { + clear: both; +} +dl.tsd-comment-tag-group p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; +} +.tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; +} +.tsd-filter-input { + display: flex; + width: fit-content; + width: -moz-fit-content; + align-items: center; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + cursor: pointer; +} +.tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; +} +.tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; +} +.tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; +} +.tsd-filter-input input[type="checkbox"]:focus + svg { + transform: scale(0.95); +} +.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { + transform: scale(1); +} +.tsd-checkbox-background { + fill: var(--color-accent); +} +input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); +} + +.tsd-theme-toggle { + padding-top: 0.75rem; +} +.tsd-theme-toggle > h4 { + display: inline; + vertical-align: middle; + margin-right: 0.75rem; +} + +.tsd-hierarchy { + list-style: square; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-panel-group.tsd-index-group { + margin-bottom: 0; +} +.tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; +} +@media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } +} +@media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } +} +.tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} +.tsd-index-panel a, +.tsd-index-panel a.tsd-parent-kind-module { + color: var(--color-ts); +} +.tsd-index-panel a.tsd-parent-kind-interface { + color: var(--color-ts-interface); +} +.tsd-index-panel a.tsd-parent-kind-enum { + color: var(--color-ts-enum); +} +.tsd-index-panel a.tsd-parent-kind-class { + color: var(--color-ts-class); +} +.tsd-index-panel a.tsd-kind-module { + color: var(--color-ts-namespace); +} +.tsd-index-panel a.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-index-panel a.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-index-panel a.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-index-panel a.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-index-panel a.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-index-panel a.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-index-panel a.tsd-is-private { + color: var(--color-ts-private); +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: absolute; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} +.tsd-member [data-tsd-kind] { + color: var(--color-ts); +} +.tsd-member [data-tsd-kind="Interface"] { + color: var(--color-ts-interface); +} +.tsd-member [data-tsd-kind="Enum"] { + color: var(--color-ts-enum); +} +.tsd-member [data-tsd-kind="Class"] { + color: var(--color-ts-class); +} +.tsd-member [data-tsd-kind="Private"] { + color: var(--color-ts-private); +} + +.tsd-navigation a { + display: block; + margin: 0.4rem 0; + border-left: 2px solid transparent; + color: var(--color-text); + text-decoration: none; + transition: border-left-color 0.1s; +} +.tsd-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul { + margin: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li { + padding: 0; +} + +.tsd-navigation.primary .tsd-accordion-details > ul { + margin-top: 0.75rem; +} +.tsd-navigation.primary a { + padding: 0.75rem 0.5rem; + margin: 0; +} +.tsd-navigation.primary ul li a { + margin-left: 0.5rem; +} +.tsd-navigation.primary ul li li a { + margin-left: 1.5rem; +} +.tsd-navigation.primary ul li li li a { + margin-left: 2.5rem; +} +.tsd-navigation.primary ul li li li li a { + margin-left: 3.5rem; +} +.tsd-navigation.primary ul li li li li li a { + margin-left: 4.5rem; +} +.tsd-navigation.primary ul li li li li li li a { + margin-left: 5.5rem; +} +.tsd-navigation.primary li.current > a { + border-left: 0.15rem var(--color-text) solid; +} +.tsd-navigation.primary li.selected > a { + font-weight: bold; + border-left: 0.2rem var(--color-text) solid; +} +.tsd-navigation.primary ul li a:hover { + border-left: 0.2rem var(--color-text-aside) solid; +} +.tsd-navigation.primary li.globals + li > span, +.tsd-navigation.primary li.globals + li > a { + padding-top: 20px; +} + +.tsd-navigation.secondary.tsd-navigation--toolbar-hide { + max-height: calc(100vh - 1rem); + top: 0.5rem; +} +.tsd-navigation.secondary > ul { + display: inline; + padding-right: 0.5rem; + transition: opacity 0.2s; +} +.tsd-navigation.secondary ul li a { + padding-left: 0; +} +.tsd-navigation.secondary ul li li a { + padding-left: 1.1rem; +} +.tsd-navigation.secondary ul li li li a { + padding-left: 2.2rem; +} +.tsd-navigation.secondary ul li li li li a { + padding-left: 3.3rem; +} +.tsd-navigation.secondary ul li li li li li a { + padding-left: 4.4rem; +} +.tsd-navigation.secondary ul li li li li li li a { + padding-left: 5.5rem; +} + +a.tsd-index-link { + margin: 0.25rem 0; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; +} +.tsd-accordion-summary > h1, +.tsd-accordion-summary > h2, +.tsd-accordion-summary > h3, +.tsd-accordion-summary > h4, +.tsd-accordion-summary > h5 { + display: inline-flex; + align-items: center; + vertical-align: middle; + margin-bottom: 0; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} +.tsd-accordion-summary { + display: block; + cursor: pointer; +} +.tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} +.tsd-accordion-summary::-webkit-details-marker { + display: none; +} +.tsd-index-accordion .tsd-accordion-summary svg { + margin-right: 0.25rem; +} +.tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; +} +.tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; +} + +.tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; +} +.tsd-kind-icon path { + transform-origin: center; + transform: scale(1.1); +} +.tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; +} + +@media (min-width: 1024px) { + .col-content { + margin: 2rem auto; + } + + .menu-sticky-wrap { + position: sticky; + height: calc(100vh - 2rem); + top: 4rem; + right: 0; + padding: 0 1.5rem; + padding-top: 1rem; + margin-top: 3rem; + transition: 0.3s ease-in-out; + transition-property: top, padding-top, padding, height; + overflow-y: auto; + } + .col-menu { + border-left: 1px solid var(--color-accent); + } + .col-menu--hide { + top: 1rem; + } + .col-menu .tsd-navigation:not(:last-child) { + padding-bottom: 1.75rem; + } +} + +.tsd-panel { + margin-bottom: 2.5rem; +} +.tsd-panel.tsd-member { + margin-bottom: 4rem; +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; +} + +.tsd-panel-group { + margin: 4rem 0; +} +.tsd-panel-group.tsd-index-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group details { + margin: 2rem 0; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + padding: 0 10px; + background-color: var(--color-background); +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current, +#tsd-search .results li:hover { + background-color: var(--color-accent); +} +#tsd-search .results a { + display: block; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-accent); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +.tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; +} +.tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; +} +.tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; +} + +ul.tsd-parameter-list, +ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameter-list > li.tsd-parameter-signature, +ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameter-list h5, +ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +.tsd-sources { + margin-top: 1rem; + font-size: 0.875em; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: fixed; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; +} +.tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; +} +.tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} + +.tsd-page-toolbar--hide { + transform: translateY(-100%); +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} + +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +@media (max-width: 1024px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + vertical-align: middle; + color: var(--color-text); +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} + +.deprecated { + text-decoration: line-through; +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); +} + +*::-webkit-scrollbar { + width: 0.75rem; +} + +*::-webkit-scrollbar-track { + background: var(--color-icon-background); +} + +*::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); +} diff --git a/docs/classes/Device.html b/docs/classes/Device.html new file mode 100644 index 00000000..38c3b031 --- /dev/null +++ b/docs/classes/Device.html @@ -0,0 +1,168 @@ +Device | onvif
+
+ +
+
+
+
+ +

Class Device

+
+

Device methods

+
+
+

Hierarchy

+
    +
  • Device
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
media2Support: boolean = false
+
+ +
onvif: Onvif
+
+ +
services: OnvifService[] = []
+
+

Methods

+
+ +
    + +
  • +

    This method has been replaced by the more generic GetServices method. +For capabilities of individual services refer to the GetServiceCapabilities methods.

    +
    +

    Returns Promise<Capabilities>

+
+ +
+
+ +
    + +
  • +

    Returns Promise<HostnameInformation>

+
+ +
    + +
  • +

    Returns information about services of the device.

    +
    +
    +

    Parameters

    +
      +
    • +
      includeCapability: boolean = true
    +

    Returns Promise<OnvifService[]>

+
+ +
    + +
  • +

    Returns Promise<Date>

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/DiscoverySingleton.html b/docs/classes/DiscoverySingleton.html new file mode 100644 index 00000000..46bee484 --- /dev/null +++ b/docs/classes/DiscoverySingleton.html @@ -0,0 +1,826 @@ +DiscoverySingleton | onvif
+
+ +
+
+
+
+ +

Class DiscoverySingleton

+
+

Class for Discovery singleton

+
+
+

Hierarchy

+
    +
  • EventEmitter +
      +
    • DiscoverySingleton
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
captureRejectionSymbol: typeof captureRejectionSymbol
+
+ +
captureRejections: boolean
+

Sets or gets the default captureRejection value for all emitters.

+
+
+ +
defaultMaxListeners: number
+
+ +
errorMonitor: typeof errorMonitor
+

This symbol shall be used to install a listener for only monitoring 'error' +events. Listeners installed using this symbol are called before the regular +'error' listeners are called.

+

Installing a listener using this symbol does not change the behavior once an +'error' event is emitted, therefore the process will still crash if no +regular 'error' listener is installed.

+
+
+ +
+
+

Events

+
+ +
device: "device" = 'device'
+

Fires when device found

+ +

Param

Onvif instance Onvif or just information object about found device + device

+ +

Example

discovery.on('device', console.log);
+
+
+
+ +
error: "error" = 'error'
+

Indicates any errors

+ +

Param

Error instance or array of error instances from Error + error

+ +

Example

discovery.on('error', console.error);
+
+
+
+

Accessors

+
+ +
+
+

Methods

+
+ +
    + +
  • +

    Alias for emitter.on(eventName, listener).

    + +

    Since

    v0.1.26

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    • +
    • +
      listener: ((...args: any[]) => void)
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns DiscoverySingleton

+
+ +
    + +
  • +

    Synchronously calls each of the listeners registered for the event namedeventName, in the order they were registered, passing the supplied arguments +to each.

    +

    Returns true if the event had listeners, false otherwise.

    +
    const EventEmitter = require('events');
    const myEmitter = new EventEmitter();

    // First listener
    myEmitter.on('event', function firstListener() {
    console.log('Helloooo! first listener');
    });
    // Second listener
    myEmitter.on('event', function secondListener(arg1, arg2) {
    console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
    });
    // Third listener
    myEmitter.on('event', function thirdListener(...args) {
    const parameters = args.join(', ');
    console.log(`event with parameters ${parameters} in third listener`);
    });

    console.log(myEmitter.listeners('event'));

    myEmitter.emit('event', 1, 2, 3, 4, 5);

    // Prints:
    // [
    // [Function: firstListener],
    // [Function: secondListener],
    // [Function: thirdListener]
    // ]
    // Helloooo! first listener
    // event with parameters 1, 2 in second listener
    // event with parameters 1, 2, 3, 4, 5 in third listener +
    + +

    Since

    v0.1.26

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    • +
    • +
      Rest ...args: any[]
    +

    Returns boolean

+
+ +
    + +
  • +

    Returns an array listing the events for which the emitter has registered +listeners. The values in the array are strings or Symbols.

    +
    const EventEmitter = require('events');
    const myEE = new EventEmitter();
    myEE.on('foo', () => {});
    myEE.on('bar', () => {});

    const sym = Symbol('symbol');
    myEE.on(sym, () => {});

    console.log(myEE.eventNames());
    // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
    + +

    Since

    v6.0.0

    +
    +

    Returns (string | symbol)[]

+
+ +
    + +
  • +

    Returns the current max listener value for the EventEmitter which is either +set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

    + +

    Since

    v1.0.0

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the number of listeners listening to the event named eventName.

    + +

    Since

    v3.2.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
      +

      The name of the event being listened for

      +
    +

    Returns number

+
+ +
    + +
  • +

    Returns a copy of the array of listeners for the event named eventName.

    +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    + +

    Since

    v0.1.26

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    +

    Returns Function[]

+
+ +
    + +
  • +

    Alias for emitter.removeListener().

    + +

    Since

    v10.0.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    • +
    • +
      listener: ((...args: any[]) => void)
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns DiscoverySingleton

+
+ +
    + +
  • +

    Adds the listener function to the end of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

    +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    By default, event listeners are invoked in the order they are added. Theemitter.prependListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

    +
    const myEE = new EventEmitter();
    myEE.on('foo', () => console.log('a'));
    myEE.prependListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a +
    + +

    Since

    v0.1.101

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
      +

      The name of the event.

      +
    • +
    • +
      listener: ((...args: any[]) => void)
      +

      The callback function

      +
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns DiscoverySingleton

+
+ +
    + +
  • +

    Adds a one-timelistener function for the event named eventName. The +next time eventName is triggered, this listener is removed and then invoked.

    +
    server.once('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    By default, event listeners are invoked in the order they are added. Theemitter.prependOnceListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

    +
    const myEE = new EventEmitter();
    myEE.once('foo', () => console.log('a'));
    myEE.prependOnceListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a +
    + +

    Since

    v0.3.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
      +

      The name of the event.

      +
    • +
    • +
      listener: ((...args: any[]) => void)
      +

      The callback function

      +
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns DiscoverySingleton

+
+ +
    + +
  • +

    Adds the listener function to the beginning of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

    +
    server.prependListener('connection', (stream) => {
    console.log('someone connected!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    + +

    Since

    v6.0.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
      +

      The name of the event.

      +
    • +
    • +
      listener: ((...args: any[]) => void)
      +

      The callback function

      +
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns DiscoverySingleton

+
+ +
    + +
  • +

    Adds a one-timelistener function for the event named eventName to the_beginning_ of the listeners array. The next time eventName is triggered, this +listener is removed, and then invoked.

    +
    server.prependOnceListener('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    + +

    Since

    v6.0.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
      +

      The name of the event.

      +
    • +
    • +
      listener: ((...args: any[]) => void)
      +

      The callback function

      +
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns DiscoverySingleton

+
+ +
    + +
  • +

    Discover NVT devices in the subnetwork

    + +

    Example

    import { Discovery } from 'onvif';
    Discovery.on('device', async (cam) => {
    // function would be called as soon as NVT responses
    cam.username = <USERNAME>;
    cam.password = <PASSWORD>;
    await cam.connect();
    })
    Discovery.probe(); +
    + +

    Example

    import { Discovery } from 'onvif';
    (async () => {
    const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect());
    console.log(await cams[0]?.getSystemDateAndTime());
    })(); +
    +
    +
    +

    Parameters

    +
    +

    Returns Promise<(Record<string, unknown> | Onvif)[]>

+
+ +
    + +
  • +

    Returns a copy of the array of listeners for the event named eventName, +including any wrappers (such as those created by .once()).

    +
    const emitter = new EventEmitter();
    emitter.once('log', () => console.log('log once'));

    // Returns a new Array with a function `onceWrapper` which has a property
    // `listener` which contains the original listener bound above
    const listeners = emitter.rawListeners('log');
    const logFnWrapper = listeners[0];

    // Logs "log once" to the console and does not unbind the `once` event
    logFnWrapper.listener();

    // Logs "log once" to the console and removes the listener
    logFnWrapper();

    emitter.on('log', () => console.log('log persistently'));
    // Will return a new Array with a single function bound by `.on()` above
    const newListeners = emitter.rawListeners('log');

    // Logs "log persistently" twice
    newListeners[0]();
    emitter.emit('log'); +
    + +

    Since

    v9.4.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    +

    Returns Function[]

+
+ +
    + +
  • +

    Removes all listeners, or those of the specified eventName.

    +

    It is bad practice to remove listeners added elsewhere in the code, +particularly when the EventEmitter instance was created by some other +component or module (e.g. sockets or file streams).

    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    + +

    Since

    v0.1.26

    +
    +
    +

    Parameters

    +
      +
    • +
      Optional event: string | symbol
    +

    Returns DiscoverySingleton

+
+ +
    + +
  • +

    Removes the specified listener from the listener array for the event namedeventName.

    +
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    +

    removeListener() will remove, at most, one instance of a listener from the +listener array. If any single listener has been added multiple times to the +listener array for the specified eventName, then removeListener() must be +called multiple times to remove each instance.

    +

    Once an event is emitted, all listeners attached to it at the +time of emitting are called in order. This implies that anyremoveListener() or removeAllListeners() calls after emitting and_before_ the last listener finishes execution will +not remove them fromemit() in progress. Subsequent events behave as expected.

    +
    const myEmitter = new MyEmitter();

    const callbackA = () => {
    console.log('A');
    myEmitter.removeListener('event', callbackB);
    };

    const callbackB = () => {
    console.log('B');
    };

    myEmitter.on('event', callbackA);

    myEmitter.on('event', callbackB);

    // callbackA removes listener callbackB but it will still be called.
    // Internal listener array at time of emit [callbackA, callbackB]
    myEmitter.emit('event');
    // Prints:
    // A
    // B

    // callbackB is now removed.
    // Internal listener array [callbackA]
    myEmitter.emit('event');
    // Prints:
    // A +
    +

    Because listeners are managed using an internal array, calling this will +change the position indices of any listener registered after the listener +being removed. This will not impact the order in which listeners are called, +but it means that any copies of the listener array as returned by +the emitter.listeners() method will need to be recreated.

    +

    When a single function has been added as a handler multiple times for a single +event (as in the example below), removeListener() will remove the most +recently added instance. In the example the once('ping')listener is removed:

    +
    const ee = new EventEmitter();

    function pong() {
    console.log('pong');
    }

    ee.on('ping', pong);
    ee.once('ping', pong);
    ee.removeListener('ping', pong);

    ee.emit('ping');
    ee.emit('ping'); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    + +

    Since

    v0.1.26

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    • +
    • +
      listener: ((...args: any[]) => void)
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns DiscoverySingleton

+
+ +
    + +
  • +

    By default EventEmitters will print a warning if more than 10 listeners are +added for a particular event. This is a useful default that helps finding +memory leaks. The emitter.setMaxListeners() method allows the limit to be +modified for this specific EventEmitter instance. The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    + +

    Since

    v0.3.5

    +
    +
    +

    Parameters

    +
      +
    • +
      n: number
    +

    Returns DiscoverySingleton

+
+ +
    + +
  • +

    Returns a copy of the array of listeners for the event named eventName.

    +

    For EventEmitters this behaves exactly the same as calling .listeners on +the emitter.

    +

    For EventTargets this is the only way to get the event listeners for the +event target. This is useful for debugging and diagnostic purposes.

    +
    const { getEventListeners, EventEmitter } = require('events');

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    getEventListeners(ee, 'foo'); // [listener]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    getEventListeners(et, 'foo'); // [listener]
    } +
    + +

    Since

    v15.2.0, v14.17.0

    +
    +
    +

    Parameters

    +
      +
    • +
      emitter: EventEmitter | DOMEventTarget
    • +
    • +
      name: string | symbol
    +

    Returns Function[]

+
+ +
    + +
  • +

    A class method that returns the number of listeners for the given eventNameregistered on the given emitter.

    +
    const { EventEmitter, listenerCount } = require('events');
    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    + +

    Since

    v0.9.12

    + +

    Deprecated

    Since v3.2.0 - Use listenerCount instead.

    +
    +
    +

    Parameters

    +
      +
    • +
      emitter: EventEmitter
      +

      The emitter to query

      +
    • +
    • +
      eventName: string | symbol
      +

      The event name

      +
    +

    Returns number

+
+ +
    + +
  • +
    const { on, EventEmitter } = require('events');

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo')) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })(); +
    +

    Returns an AsyncIterator that iterates eventName events. It will throw +if the EventEmitter emits 'error'. It removes all listeners when +exiting the loop. The value returned by each iteration is an array +composed of the emitted event arguments.

    +

    An AbortSignal can be used to cancel waiting on events:

    +
    const { on, EventEmitter } = require('events');
    const ac = new AbortController();

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo', { signal: ac.signal })) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })();

    process.nextTick(() => ac.abort()); +
    + +

    Since

    v13.6.0, v12.16.0

    + +

    Returns

    that iterates eventName events emitted by the emitter

    +
    +
    +

    Parameters

    +
      +
    • +
      emitter: EventEmitter
    • +
    • +
      eventName: string
      +

      The name of the event being listened for

      +
    • +
    • +
      Optional options: StaticEventEmitterOptions
    +

    Returns AsyncIterableIterator<any>

+
+ +
    + +
  • +

    Creates a Promise that is fulfilled when the EventEmitter emits the given +event or that is rejected if the EventEmitter emits 'error' while waiting. +The Promise will resolve with an array of all the arguments emitted to the +given event.

    +

    This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event +semantics and does not listen to the 'error' event.

    +
    const { once, EventEmitter } = require('events');

    async function run() {
    const ee = new EventEmitter();

    process.nextTick(() => {
    ee.emit('myevent', 42);
    });

    const [value] = await once(ee, 'myevent');
    console.log(value);

    const err = new Error('kaboom');
    process.nextTick(() => {
    ee.emit('error', err);
    });

    try {
    await once(ee, 'myevent');
    } catch (err) {
    console.log('error happened', err);
    }
    }

    run(); +
    +

    The special handling of the 'error' event is only used when events.once()is used to wait for another event. If events.once() is used to wait for the +'error' event itself, then it is treated as any other kind of event without +special handling:

    +
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();

    once(ee, 'error')
    .then(([err]) => console.log('ok', err.message))
    .catch((err) => console.log('error', err.message));

    ee.emit('error', new Error('boom'));

    // Prints: ok boom +
    +

    An AbortSignal can be used to cancel waiting for the event:

    +
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();
    const ac = new AbortController();

    async function foo(emitter, event, signal) {
    try {
    await once(emitter, event, { signal });
    console.log('event emitted!');
    } catch (error) {
    if (error.name === 'AbortError') {
    console.error('Waiting for the event was canceled!');
    } else {
    console.error('There was an error', error.message);
    }
    }
    }

    foo(ee, 'foo', ac.signal);
    ac.abort(); // Abort waiting for the event
    ee.emit('foo'); // Prints: Waiting for the event was canceled! +
    + +

    Since

    v11.13.0, v10.16.0

    +
    +
    +

    Parameters

    +
      +
    • +
      emitter: NodeEventTarget
    • +
    • +
      eventName: string | symbol
    • +
    • +
      Optional options: StaticEventEmitterOptions
    +

    Returns Promise<any[]>

  • + +
  • +
    +

    Parameters

    +
      +
    • +
      emitter: DOMEventTarget
    • +
    • +
      eventName: string
    • +
    • +
      Optional options: StaticEventEmitterOptions
    +

    Returns Promise<any[]>

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/Media.html b/docs/classes/Media.html new file mode 100644 index 00000000..3ca9231b --- /dev/null +++ b/docs/classes/Media.html @@ -0,0 +1,127 @@ +Media | onvif
+
+ +
+
+
+
+ +

Class Media

+
+

Hierarchy

+
    +
  • Media
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Methods

+
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
onvif: Onvif
+
+ +
profiles: Profile[] = []
+
+ +
videoSources: VideoSource[] = []
+
+

Methods

+
+ +
+
+ +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/Onvif.html b/docs/classes/Onvif.html new file mode 100644 index 00000000..84e1b9ba --- /dev/null +++ b/docs/classes/Onvif.html @@ -0,0 +1,1110 @@ +Onvif | onvif
+
+ +
+
+
+
+ +

Class Onvif

+
+

Hierarchy

+
    +
  • EventEmitter +
      +
    • Onvif
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
activeSource?: ActiveSource
+
+ +
activeSources: ActiveSource[] = []
+
+ +
agent: boolean | Agent
+
+ +
capabilities: Capabilities
+
+ +
defaultProfile?: Profile
+
+ +
defaultProfiles: Profile[] = []
+
+ +
device: Device
+

Core device namespace for device v1.0 methods

+ +

Example

const date = await onvif.device.getSystemDateAndTime();
console.log(date.toLocaleString()); +
+
+
+ +
deviceInformation?: DeviceInformation
+
+ +
events: Record<string, unknown>
+
+ +
hostname: string
+
+ +
media: Media
+
+ +
password?: string
+
+ +
path: string
+
+ +
port: number
+
+ +
preserveAddress: boolean = false
+
+ +
secureOptions: SecureContextOptions
+
+ +
timeShift?: number
+
+ +
timeout: number
+
+ +
+
+ +
urn?: string
+
+ +
useSecure: boolean
+
+ +
username?: string
+
+ +
captureRejectionSymbol: typeof captureRejectionSymbol
+
+ +
captureRejections: boolean
+

Sets or gets the default captureRejection value for all emitters.

+
+
+ +
defaultMaxListeners: number
+
+ +
errorMonitor: typeof errorMonitor
+

This symbol shall be used to install a listener for only monitoring 'error' +events. Listeners installed using this symbol are called before the regular +'error' listeners are called.

+

Installing a listener using this symbol does not change the behavior once an +'error' event is emitted, therefore the process will still crash if no +regular 'error' listener is installed.

+
+
+

Events

+
+ +
error: "error" = 'error'
+

Indicates any errors

+ +

Param

Error instance from Error + error

+ +

Example

onvif.on('error', console.error);
+
+
+
+ +
rawRequest: "rawRequest" = 'rawRequest'
+

Indicates raw xml request to device. + rawRequest

+ +

Example

onvif.on('rawRequest', (xml) => { console.log('-> request was', xml); });
+
+
+
+ +
rawResponse: "rawResponse" = 'rawResponse'
+

Indicates raw xml response from device. + rawResponse

+ +

Example

onvif.on('rawResponse', (xml) => { console.log('<- response was', xml); });
+
+
+
+ +
warn: "warn" = 'warn'
+

Indicates any warnings + warn

+ +

Example

onvif.on('warn', console.warn);
+
+
+
+

Methods

+
+ +
    + +
  • +

    Alias for emitter.on(eventName, listener).

    + +

    Since

    v0.1.26

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    • +
    • +
      listener: ((...args: any[]) => void)
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns Onvif

+
+ +
    + +
  • +

    Connect to the camera and fill device information properties

    +
    +

    Returns Promise<Onvif>

+
+ +
    + +
  • +

    Synchronously calls each of the listeners registered for the event namedeventName, in the order they were registered, passing the supplied arguments +to each.

    +

    Returns true if the event had listeners, false otherwise.

    +
    const EventEmitter = require('events');
    const myEmitter = new EventEmitter();

    // First listener
    myEmitter.on('event', function firstListener() {
    console.log('Helloooo! first listener');
    });
    // Second listener
    myEmitter.on('event', function secondListener(arg1, arg2) {
    console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
    });
    // Third listener
    myEmitter.on('event', function thirdListener(...args) {
    const parameters = args.join(', ');
    console.log(`event with parameters ${parameters} in third listener`);
    });

    console.log(myEmitter.listeners('event'));

    myEmitter.emit('event', 1, 2, 3, 4, 5);

    // Prints:
    // [
    // [Function: firstListener],
    // [Function: secondListener],
    // [Function: thirdListener]
    // ]
    // Helloooo! first listener
    // event with parameters 1, 2 in second listener
    // event with parameters 1, 2, 3, 4, 5 in third listener +
    + +

    Since

    v0.1.26

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    • +
    • +
      Rest ...args: any[]
    +

    Returns boolean

+
+ +
    + +
  • Private +

    Envelope footer for all SOAP messages

    +
    +

    Returns string

+
+ +
    + +
  • Private +

    Envelope header for all SOAP messages

    +
    +
    +

    Parameters

    +
      +
    • +
      openHeader: boolean = false
    +

    Returns string

+
+ +
    + +
  • +

    Returns an array listing the events for which the emitter has registered +listeners. The values in the array are strings or Symbols.

    +
    const EventEmitter = require('events');
    const myEE = new EventEmitter();
    myEE.on('foo', () => {});
    myEE.on('bar', () => {});

    const sym = Symbol('symbol');
    myEE.on(sym, () => {});

    console.log(myEE.eventNames());
    // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
    + +

    Since

    v6.0.0

    +
    +

    Returns (string | symbol)[]

+
+ +
    + +
  • Private +

    Check and find out video configuration for device

    +
    +

    Returns Promise<void>

+
+ +
    + +
  • +

    Returns the current max listener value for the EventEmitter which is either +set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

    + +

    Since

    v1.0.0

    +
    +

    Returns number

+
+ +
    + +
  • +

    Receive date and time from cam

    +
    +

    Returns Promise<Date>

+
+ +
    + +
  • +

    Returns the number of listeners listening to the event named eventName.

    + +

    Since

    v3.2.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
      +

      The name of the event being listened for

      +
    +

    Returns number

+
+ +
    + +
  • +

    Returns a copy of the array of listeners for the event named eventName.

    +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    + +

    Since

    v0.1.26

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    +

    Returns Function[]

+
+ +
    + +
  • +

    Alias for emitter.removeListener().

    + +

    Since

    v10.0.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    • +
    • +
      listener: ((...args: any[]) => void)
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns Onvif

+
+ +
    + +
  • +

    Adds the listener function to the end of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

    +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    By default, event listeners are invoked in the order they are added. Theemitter.prependListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

    +
    const myEE = new EventEmitter();
    myEE.on('foo', () => console.log('a'));
    myEE.prependListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a +
    + +

    Since

    v0.1.101

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
      +

      The name of the event.

      +
    • +
    • +
      listener: ((...args: any[]) => void)
      +

      The callback function

      +
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns Onvif

+
+ +
    + +
  • +

    Adds a one-timelistener function for the event named eventName. The +next time eventName is triggered, this listener is removed and then invoked.

    +
    server.once('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    By default, event listeners are invoked in the order they are added. Theemitter.prependOnceListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

    +
    const myEE = new EventEmitter();
    myEE.once('foo', () => console.log('a'));
    myEE.prependOnceListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a +
    + +

    Since

    v0.3.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
      +

      The name of the event.

      +
    • +
    • +
      listener: ((...args: any[]) => void)
      +

      The callback function

      +
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns Onvif

+
+ +
    + +
  • Private +

    Parse url with an eye on preserveAddress property

    +
    +
    +

    Parameters

    +
      +
    • +
      address: string
    +

    Returns URL

+
+ +
    + +
  • +

    Returns { nonce: string; passDigest: string; timestamp: string }

    +
      +
    • +
      nonce: string
    • +
    • +
      passDigest: string
    • +
    • +
      timestamp: string
+
+ +
    + +
  • +

    Adds the listener function to the beginning of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

    +
    server.prependListener('connection', (stream) => {
    console.log('someone connected!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    + +

    Since

    v6.0.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
      +

      The name of the event.

      +
    • +
    • +
      listener: ((...args: any[]) => void)
      +

      The callback function

      +
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns Onvif

+
+ +
    + +
  • +

    Adds a one-timelistener function for the event named eventName to the_beginning_ of the listeners array. The next time eventName is triggered, this +listener is removed, and then invoked.

    +
    server.prependOnceListener('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    + +

    Since

    v6.0.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
      +

      The name of the event.

      +
    • +
    • +
      listener: ((...args: any[]) => void)
      +

      The callback function

      +
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns Onvif

+
+ +
    + +
  • +

    Returns a copy of the array of listeners for the event named eventName, +including any wrappers (such as those created by .once()).

    +
    const emitter = new EventEmitter();
    emitter.once('log', () => console.log('log once'));

    // Returns a new Array with a function `onceWrapper` which has a property
    // `listener` which contains the original listener bound above
    const listeners = emitter.rawListeners('log');
    const logFnWrapper = listeners[0];

    // Logs "log once" to the console and does not unbind the `once` event
    logFnWrapper.listener();

    // Logs "log once" to the console and removes the listener
    logFnWrapper();

    emitter.on('log', () => console.log('log persistently'));
    // Will return a new Array with a single function bound by `.on()` above
    const newListeners = emitter.rawListeners('log');

    // Logs "log persistently" twice
    newListeners[0]();
    emitter.emit('log'); +
    + +

    Since

    v9.4.0

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    +

    Returns Function[]

+
+ +
+
+ +
    + +
  • +

    Removes all listeners, or those of the specified eventName.

    +

    It is bad practice to remove listeners added elsewhere in the code, +particularly when the EventEmitter instance was created by some other +component or module (e.g. sockets or file streams).

    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    + +

    Since

    v0.1.26

    +
    +
    +

    Parameters

    +
      +
    • +
      Optional event: string | symbol
    +

    Returns Onvif

+
+ +
    + +
  • +

    Removes the specified listener from the listener array for the event namedeventName.

    +
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    +

    removeListener() will remove, at most, one instance of a listener from the +listener array. If any single listener has been added multiple times to the +listener array for the specified eventName, then removeListener() must be +called multiple times to remove each instance.

    +

    Once an event is emitted, all listeners attached to it at the +time of emitting are called in order. This implies that anyremoveListener() or removeAllListeners() calls after emitting and_before_ the last listener finishes execution will +not remove them fromemit() in progress. Subsequent events behave as expected.

    +
    const myEmitter = new MyEmitter();

    const callbackA = () => {
    console.log('A');
    myEmitter.removeListener('event', callbackB);
    };

    const callbackB = () => {
    console.log('B');
    };

    myEmitter.on('event', callbackA);

    myEmitter.on('event', callbackB);

    // callbackA removes listener callbackB but it will still be called.
    // Internal listener array at time of emit [callbackA, callbackB]
    myEmitter.emit('event');
    // Prints:
    // A
    // B

    // callbackB is now removed.
    // Internal listener array [callbackA]
    myEmitter.emit('event');
    // Prints:
    // A +
    +

    Because listeners are managed using an internal array, calling this will +change the position indices of any listener registered after the listener +being removed. This will not impact the order in which listeners are called, +but it means that any copies of the listener array as returned by +the emitter.listeners() method will need to be recreated.

    +

    When a single function has been added as a handler multiple times for a single +event (as in the example below), removeListener() will remove the most +recently added instance. In the example the once('ping')listener is removed:

    +
    const ee = new EventEmitter();

    function pong() {
    console.log('pong');
    }

    ee.on('ping', pong);
    ee.once('ping', pong);
    ee.removeListener('ping', pong);

    ee.emit('ping');
    ee.emit('ping'); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    + +

    Since

    v0.1.26

    +
    +
    +

    Parameters

    +
      +
    • +
      eventName: string | symbol
    • +
    • +
      listener: ((...args: any[]) => void)
      +
        +
      • +
          +
        • (...args: any[]): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Rest ...args: any[]
          +

          Returns void

    +

    Returns Onvif

+
+ +
+
+ +
    + +
  • +

    By default EventEmitters will print a warning if more than 10 listeners are +added for a particular event. This is a useful default that helps finding +memory leaks. The emitter.setMaxListeners() method allows the limit to be +modified for this specific EventEmitter instance. The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    + +

    Since

    v0.3.5

    +
    +
    +

    Parameters

    +
      +
    • +
      n: number
    +

    Returns Onvif

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      data: any
    +

    Returns Date

+
+ +
    + +
  • +

    Returns a copy of the array of listeners for the event named eventName.

    +

    For EventEmitters this behaves exactly the same as calling .listeners on +the emitter.

    +

    For EventTargets this is the only way to get the event listeners for the +event target. This is useful for debugging and diagnostic purposes.

    +
    const { getEventListeners, EventEmitter } = require('events');

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    getEventListeners(ee, 'foo'); // [listener]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    getEventListeners(et, 'foo'); // [listener]
    } +
    + +

    Since

    v15.2.0, v14.17.0

    +
    +
    +

    Parameters

    +
      +
    • +
      emitter: EventEmitter | DOMEventTarget
    • +
    • +
      name: string | symbol
    +

    Returns Function[]

+
+ +
    + +
  • +

    A class method that returns the number of listeners for the given eventNameregistered on the given emitter.

    +
    const { EventEmitter, listenerCount } = require('events');
    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    + +

    Since

    v0.9.12

    + +

    Deprecated

    Since v3.2.0 - Use listenerCount instead.

    +
    +
    +

    Parameters

    +
      +
    • +
      emitter: EventEmitter
      +

      The emitter to query

      +
    • +
    • +
      eventName: string | symbol
      +

      The event name

      +
    +

    Returns number

+
+ +
    + +
  • +
    const { on, EventEmitter } = require('events');

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo')) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })(); +
    +

    Returns an AsyncIterator that iterates eventName events. It will throw +if the EventEmitter emits 'error'. It removes all listeners when +exiting the loop. The value returned by each iteration is an array +composed of the emitted event arguments.

    +

    An AbortSignal can be used to cancel waiting on events:

    +
    const { on, EventEmitter } = require('events');
    const ac = new AbortController();

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo', { signal: ac.signal })) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })();

    process.nextTick(() => ac.abort()); +
    + +

    Since

    v13.6.0, v12.16.0

    + +

    Returns

    that iterates eventName events emitted by the emitter

    +
    +
    +

    Parameters

    +
      +
    • +
      emitter: EventEmitter
    • +
    • +
      eventName: string
      +

      The name of the event being listened for

      +
    • +
    • +
      Optional options: StaticEventEmitterOptions
    +

    Returns AsyncIterableIterator<any>

+
+ +
    + +
  • +

    Creates a Promise that is fulfilled when the EventEmitter emits the given +event or that is rejected if the EventEmitter emits 'error' while waiting. +The Promise will resolve with an array of all the arguments emitted to the +given event.

    +

    This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event +semantics and does not listen to the 'error' event.

    +
    const { once, EventEmitter } = require('events');

    async function run() {
    const ee = new EventEmitter();

    process.nextTick(() => {
    ee.emit('myevent', 42);
    });

    const [value] = await once(ee, 'myevent');
    console.log(value);

    const err = new Error('kaboom');
    process.nextTick(() => {
    ee.emit('error', err);
    });

    try {
    await once(ee, 'myevent');
    } catch (err) {
    console.log('error happened', err);
    }
    }

    run(); +
    +

    The special handling of the 'error' event is only used when events.once()is used to wait for another event. If events.once() is used to wait for the +'error' event itself, then it is treated as any other kind of event without +special handling:

    +
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();

    once(ee, 'error')
    .then(([err]) => console.log('ok', err.message))
    .catch((err) => console.log('error', err.message));

    ee.emit('error', new Error('boom'));

    // Prints: ok boom +
    +

    An AbortSignal can be used to cancel waiting for the event:

    +
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();
    const ac = new AbortController();

    async function foo(emitter, event, signal) {
    try {
    await once(emitter, event, { signal });
    console.log('event emitted!');
    } catch (error) {
    if (error.name === 'AbortError') {
    console.error('Waiting for the event was canceled!');
    } else {
    console.error('There was an error', error.message);
    }
    }
    }

    foo(ee, 'foo', ac.signal);
    ac.abort(); // Abort waiting for the event
    ee.emit('foo'); // Prints: Waiting for the event was canceled! +
    + +

    Since

    v11.13.0, v10.16.0

    +
    +
    +

    Parameters

    +
      +
    • +
      emitter: NodeEventTarget
    • +
    • +
      eventName: string | symbol
    • +
    • +
      Optional options: StaticEventEmitterOptions
    +

    Returns Promise<any[]>

  • + +
  • +
    +

    Parameters

    +
      +
    • +
      emitter: DOMEventTarget
    • +
    • +
      eventName: string
    • +
    • +
      Optional options: StaticEventEmitterOptions
    +

    Returns Promise<any[]>

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..544bbffb --- /dev/null +++ b/docs/index.html @@ -0,0 +1,609 @@ +onvif
+
+ +
+
+
+
+

onvif

+
+ +

ONVIF

+
+

Build Status +Coverage Status +NPM version

+

ONVIF Client protocol Profile S (Live Streaming) and Profile G (Replay) Node.js implementation.

+

This is a wrapper to ONVIF protocol which allows you to get information about your NVT (network video transmitter) +device, its media sources, control PTZ (pan-tilt-zoom) movements and manage presets, detect devices in your network and control its events. +It will also allow you to get information about your NVR (network video recorder) Profile G device and obtain a list of recordings.

+

The library uses NodeJS.

+

ONVIF

+ + +

Installation

+
+ + +

NPM

+
+

npm install onvif - install latest stable version

+

npm install agsh/onvif - install latest version from GitHub

+

npm install agsh/onvif#dev - install latest development version

+ + +

Clone the latest version from github

+
+

git clone https://github.com/agsh/onvif.git

+ + +

Tests

+
+

In the library directory run npm test

+

By default the tests use a mockup server to generate ONVIF replies.

+

To test with the real device, set appropriate environment variables HOSTNAME, USERNAME, PASSWORD, PORT and run +tests.

+ + +

Documentation

+
+

To build jsdoc for the library with default theme run npm run jsdoc. Otherwise use jsdoc with sources from +./lib/*.js

+ + +

Quick example

+
+

This example asks your camera to look up and starts a web server at port 3030 that distributes a web page with vlc-plugin +container which translates video from the camera.

+
var
http = require('http'),
Cam = require('onvif').Cam;

new Cam({
hostname: <CAMERA_HOST>,
username: <USERNAME>,
password: <PASSWORD>
}, function(err) {
this.absoluteMove({x: 1, y: 1, zoom: 1});
this.getStreamUri({protocol:'RTSP'}, function(err, stream) {
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('<html><body>' +
'<embed type="application/x-vlc-plugin" target="' + stream.uri + '"></embed>' +
'</body></html>');
}).listen(3030);
});
}); +
+ + +

Other examples (located in the Examples Folder on the Github)

+
+
    +
  • example.js - Move camera to a pre-defined position then server the RTSP URL up via a HTTP Server. Click on the RTSP address in a browser to open the video (if you have the VLC plugin installed)
  • +
  • example2.js - takes an IP address range, scans the range for ONVIF devices (brute force scan) and displays information about each device found including make and model and RTSP URLs +For Profile S Cameras and Encoders it displays the default RTSP address +For Profile G Recorders it displays the RTSP address of the first recording
  • +
  • example3.js - reads the command line cursor keys and sends PTZ commands to the Camera
  • +
  • example4.js - uses Discovery to find cameras on the local network
  • +
  • example5.js - connect to a camera via SOCKS proxy. Note SSH includes a SOCKS proxy so you can use this example to connect to remote cameras via SSH
  • +
  • example6.js - ONVIF Events. Example can be switched btween using Pull Point Subscriptions and using Base Subscribe with a built in mini HTTP Server
  • +
  • example7.js - example using a Promise API. It uses 'promisify' to convert the ONVIF Library to return promises and uses Await to wait for responses
  • +
  • example8.js - example setting OSD On Screen Display. (also uses Promises API)
  • +
+ + +

Troubleshooting

+
+

Different cameras have different ONVIF implementation. I've tested this module only with a couple of devices. So if you got different problems with this library, please let me know via e-mail. Else please just send the model of your +camera to me.

+ + +

API

+
+

This page and API class documentation you can found here: http://agsh.github.io/onvif/

+

Short description of library possibilities is below.

+ + +

Discovery

+
+

Since 0.2.7 version library supports WS-Discovery of NVT devices. Currently it uses only Probe SOAP method that just works well. +You can find devices in your subnetwork using probe method of the Discovery singleton. +Discovery is an EventEmitter inheritor, so you can wait until discovery timeout, or subscribe on device event. +You must subscribe to the error event as a device on your network could reply with bad XML +Here some examples:

+
var onvif = require('onvif');
onvif.Discovery.on('device', function(cam){
// function will be called as soon as NVT responds
cam.username = <USERNAME>;
cam.password = <PASSWORD>;
cam.connect(console.log);
})
// Must have an error handler to catch bad replies from the network
onvif.Discovery.on('error', function (err,xml) {
// function called as soon as NVT responds, but this library could not parse the response
console.log('Discovery error ' + err);
});
onvif.Discovery.probe(); +
+
var onvif = require('onvif');
// Must have an error handler to catch bad replies from the network
onvif.Discovery.on('error', function (err,xml) {
console.log('Discovery error ' + err);
});
onvif.Discovery.probe(function(err, cams) {
// function will be called only after timeout (5 sec by default)
if (err) {
// There is a device on the network returning bad discovery data
// Probe results will be incomplete
throw err;
}
cams.forEach(function(cam) {
cam.username = <USERNAME>;
cam.password = <PASSWORD>;
cam.connect(console.log);
});
}); +
+

In all of that cases you've got disconnected cameras. To access each camera (and issue ONVIF commands) you normally need +the tuple username:password. So, as shown in the examples, you can assign these properties and call connect method to +get full functionality.

+ + +

Discovery.probe(options, callback)

+
+

Options

+
    +
  • timeout, number. Time the probe method will wait NVT responses in ms
  • +
  • resolve, boolean. If this argument is false, all discovered NVTs would be presented as data object instead of Cam instance
  • +
+ + +

Discovery events

+
+
    +
  • device(cam, remoteInfo, responseXML) fires on device discover. cam is a Cam instance, remoteInfo is an object with network information + and responseXML is a body of SOAP response
  • +
  • error(error) fires on some UDP error or on bad SOAP response from NVT
  • +
+ + +

Cam class

+
+
var Cam = require('onvif').Cam;
+
+ + +

new Cam(options, callback)

+
+

Options are:

+
    +
  • hostname
  • +
  • username, password (optional, to deal with majority of functions)
  • +
  • port (optional)
  • +
+

The library calls connect() automatically which executes the getSystemDateAndTime, getCapabilities and other methods. +Note on username and password:

+
    +
  • Some cameras do not require username:password credentials.
  • +
  • If a camera does require a username:password but you do not provide them, you will be limited to executing a few ONVIF methods that can operate without credentials, for example you can execute only getSystemDateAndTime method.
  • +
+

Callback (optional) executes when the cam is initialised. Single argument for this function is possible error.

+ + +

Technical description

+
+

When the cam object is created it automatically sends a getCapabilities command to the ONVIF device. If the device is a camera or encoder (NVT) it sends two commands to the ONVIF device: +getVideoSources and getProfiles. It fills corresponding properties of an object:

+
    +
  • capabilities
      +
    • device
    • +
    • events
    • +
    • imaging
    • +
    • media
    • +
    • PTZ
    • +
    • extension
    • +
    +
  • +
  • uri (this is a links to different NVT services)
  • +
  • videoSources
      +
    • $.token
    • +
    • framerate
    • +
    • resolution
    • +
    +
  • +
  • profiles, array of profile object
      +
    • name
    • +
    • videoSourceConfiguration
    • +
    • videoEncoderConfiguration
    • +
    • PTZConfiguration
    • +
    +
  • +
+

After that it runs getActiveSources method. It iterates over all video sources and tries to find out proper configuration +for profile and videosource. First matching profile becomes a member of defaultProfiles array and video source configuration +with ptz configuration becomes a member of activeSources array.

+

Configuration for the first or the only one video source becomes defaultProfile and activeSource properties. All methods +without passing options object use it. You can change it manually at any time.

+
    +
  • defaultProfile (link to the first profile in profiles)
  • +
  • activeSource (based on the default profile)
      +
    • sourceToken
    • +
    • profileToken
    • +
    • encoding
    • +
    • width
    • +
    • height
    • +
    • fps
    • +
    • bitrate
    • +
    • ptz
    • +
    +
  • +
+ + +

connect(callback)

+
+

Connect to the camera and fill device information properties with getSystemDateAndTime, getCapabilities, getVideoSources, getProfiles methods

+

See more detailed information at http://www.onvif.org/ver10/media/wsdl/media.wsdl +After cam initialisation we can run several ONVIF commands. +There are several common methods that work without credentials. Here are they: getSystemDateAndTime.

+ + +

getSystemDateAndTime(callback)

+
+

Returns a Date object with current camera datetime in the callback. +The ONVIF Standard says this would work without credentials (passed username and password arguments) so that the timeShift difference between the local clock and the NVT's onboard clock can be calculated for SOAP Authentication. However some devices claiming ONVIF support require a password and the library will re-try the connection if a username and password are available.

+ + +

getDeviceInformation(callback)

+
+

Device. Returns a device information, such as manufacturer, model and firmware version in the callback

+ + +

getServices(callback)

+
+

Device. Returns in callback and assigns to #services property an array consists of objects with properties: namespace, XAddr, version

+ + +

getServiceCapabilities(callback)

+
+

Device. Returns in callback and assigns to #serviceCapabilities property the capabilities of the device service (not media): +network, security and system. If your device supports some auxiliary capabilities they will be there too.

+ + +

getStreamUri(options, callback)

+
+

Media. Returns a URI that can be used to initiate a live media stream using RTSP as the control protocol +The options are:

+
    +
  • stream (optional) - defines if a multicast or unicast stream is requested. Possible values are: 'RTP-Unicast' (default), 'RTP-Multicast'
  • +
  • protocol (optional) - defines the network protocol for streaming. Possible values are: 'UDP', 'TCP', 'RTSP' (default), 'HTTP'
  • +
  • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
  • +
+ + +

getSnapshotUri(options, callback)

+
+

Media. Obtain a JPEG snapshot URI from the device.

+ + +

getPresets(options, callback)

+
+

Returns the saved presets as an a key-value object where the key is the name of a preset and a value is a preset token. +This method also stores the presets information in a #presets property of an object.

+

The options are:

+
    +
  • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
  • +
+ + +

gotoPreset(options, callback)

+
+

PTZ. Operation to go to a saved preset position for the PTZ node in the selected profile.

+

The options are:

+
    +
  • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
  • +
  • preset - the name of preset. List of presets you can get by #getPresets method or in #presets property.
  • +
+ + +

setPreset(options, callback)

+
+

PTZ. Operation to set the current position as a preset for the PTZ node in the selected profile. If presetToken is passed as an option, then the preset for which that token is attached will be replaced. After success, you should re-fetch the presets with #getPresets method.

+

The options are:

+
    +
  • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
  • +
  • presetName - the name to give to the preset. (optional) is this is a preset update.
  • +
+ + +

removePreset(options, callback)

+
+

PTZ. Operation to remove a preset specified by the preset token. After success, you should re-fetch the presets with #getPresets method.

+

The options are:

+
    +
  • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
  • +
  • presetToken - the preset token to use for preset removal (this will be the value of a preset object found in #presets after calling the #getPresets method.
  • +
+ + +

gotoHomePosition(options, callback)

+
+

PTZ. Operation to go to the saved home position for the PTZ node in the selected profile. If no home position has been saved, the ONVIF camera will do nothing.

+

The options are:

+
    +
  • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken

    +
  • +
  • speed An object with properties

    +
      +
    • x Pan speed
    • +
    • y Tilt speed
    • +
    • zoom Zoom speed
    • +
    +

    If the speed option is omitted, the default speed set by the PTZConfiguration will be used.

    +
  • +
+ + +

setHomePosition(options, callback)

+
+

PTZ. Operation to set the current position as the home position for the PTZ node in the selected profile.

+

The options are:

+
    +
  • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
  • +
+ + +

getNodes(callback)

+
+

PTZ. Returns the properties of the current PTZ node, if it exists. +Use this function to get maximum number of presets, ranges of admitted values for x, y, zoom, iris, focus. +Sets all information into #nodes property.

+ + +

relativeMove(options, callback)

+
+

PTZ. This is a relative pan-tilt-zoom method. Options for this method is a delta between desired and current position of the camera.

+

The options are:

+
    +
  • x Pan, number or a string within -1 to 1, optional

    +
  • +
  • y Tilt, number or a string within -1 to 1, optional

    +
  • +
  • zoom Zoom, number or a string within -1 to 1, optional

    +
  • +
  • speed An object with properties

    +
      +
    • x Pan speed
    • +
    • y Tilt speed
    • +
    • zoom Zoom speed
    • +
    +

    If the speed option is omitted, the default speed set by the PTZConfiguration will be used.

    +
  • +
+

Callback is optional and means essentially nothing

+ + +

absoluteMove(options, callback)

+
+

PTZ. This is an absolute pan-tilt-zoom method. Options for this method is an absolute position of the camera.

+

The options are:

+
    +
  • x Pan, number or a string within -1 to 1, optional

    +
  • +
  • y Tilt, number or a string within -1 to 1, optional

    +
  • +
  • zoom Zoom, number or a string within -1 to 1, optional

    +
  • +
  • speed An object with properties

    +
      +
    • x Pan speed
    • +
    • y Tilt speed
    • +
    • zoom Zoom speed
    • +
    +

    If the speed option is omitted, the default speed set by the PTZConfiguration will be used.

    +
  • +
+

Callback is optional and means essentially nothing

+ + +

continuousMove(options, callback)

+
+

PTZ. Operation for continuous Pan/Tilt and Zoom movements

+

The options are:

+
    +
  • x Pan velocity, number or a string within -1 to 1, optional
  • +
  • y Tilt velocity, number or a string within -1 to 1, optional
  • +
  • zoom Zoom velocity, number or a string within -1 to 1, optional
  • +
  • timeout Timeout in milliseconds, number. If timeout is omitted, movement will continue until stop command
  • +
+ + +

stop(options, callback)

+
+

PTZ. Stop ongoing pan, tilt and zoom movements of absolute, relative and continuous type

+

Options and callback are optional. The options properties are:

+
    +
  • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
  • +
  • panTilt (optional) - set true when we want to stop ongoing pan and tilt movements. If panTilt arguments are not present, this command stops these movements.
  • +
  • zoom (optional) - set true when we want to stop ongoing zoom movement. If zoom arguments are not present, this command stops ongoing zoom movement.
  • +
+ + +

getStatus(options, callback)

+
+

PTZ. Returns an object with the current PTZ values.

+
{
position: {
x: 'pan position'
, y: 'tilt position'
, zoom: 'zoom'
}
, moveStatus: {} // camera moving
, utcTime: 'current camera datetime'
} +
+ + +

getConfigurations(callback)

+
+

PTZ. Get all the existing PTZConfigurations from the device. Configurations saved into #configurations property

+ + +

getConfigurationOptions(configurationToken, callback)

+
+

PTZ. Get supported coordinate systems including their range limitations for selected configuration. Extends corresponding +configuration object

+ + +

Supported methods

+
+
    +
  • GetSystemDateAndTime
  • +
  • GetCapabilities
  • +
  • GetVideoSources
  • +
  • GetProfiles
  • +
  • GetServices
  • +
  • GetDeviceInformation
  • +
  • GetStreamUri
  • +
  • GetSnapshotUri
  • +
  • GetPresets
  • +
  • GotoPreset
  • +
  • RelativeMove
  • +
  • AbsoluteMove
  • +
  • ContinuousMove
  • +
  • Stop
  • +
  • GetStatus
  • +
  • SystemReboot
  • +
  • GetImagingSettings
  • +
  • SetImagingSettings
  • +
  • GetHostname
  • +
  • GetScopes
  • +
  • SetScopes
  • +
  • GetRecordings
  • +
  • GetReplayUri
  • +
+ + +

Changelog

+
+
    +
  • 0.6.5 Add MEDIA2 support, Profile T and GetServices XAddrs support for H265 cameras. Add support for HTTPS. Add Discovery.on('error') to examples. Add flag to only send Zoom, or only send Pan/Tilt for some broken cameras (Sony XP1 Xiongmai). Fix bug in GetServices. Improve setNTP command. API changed on getNetworkInterfaces and other methods that could return an Array or a Single Item. We now return an Array in all cases. Add example converting library so it uses Promises with Promisify. Enable 3702 Discovery on Windows for MockServer. Add MockServer test cases)
  • +
  • 0.6.1 Workaround for cams that don't send date-time
  • +
  • 0.6.0 Refactor modules for proper import in electron-based environment
  • +
  • 0.5.5 Added ptz.gotoHomePosition, ptz.setHomePosition. Fixed exceptions in ptz.getConfigurations and utils.parseSOAPString. Added tests for ptz.setPreset, ptz.removePreset, ptz.gotoHomePosition, and ptz.setHomePosition.
  • +
  • 0.5.4 Bumped for NPM.
  • +
  • 0.5.3 Some fixes. Tests
  • +
  • 0.5.2 preserveAddress property for NAT devices, discovery with multiple network interfaces (@Climax777)
  • +
  • 0.5.1 Critical bugfix in SOAP-auth for some cams
  • +
  • 0.5.0 Profile G support (@RogerHardiman), proper SOAP auth, nodejs support >= 0.12
  • +
  • 0.4.2 Bugfixes
  • +
  • 0.4.1 Improved discovery (@sousandrei, @RogerHardiman)
  • +
  • 0.4.0 Encoder support (@chriswiggins), Imaging service (@EastL)
  • +
  • 0.3.1 EventEmitter-based events
  • +
  • 0.3.0 Refactoring, documentation, event service basics
  • +
  • 0.2.7 WS-Discovery
  • +
+ + +

Links

+
+

WSDL schemes and docs:

+ +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ActiveSource.html b/docs/interfaces/ActiveSource.html new file mode 100644 index 00000000..80ef5f21 --- /dev/null +++ b/docs/interfaces/ActiveSource.html @@ -0,0 +1,132 @@ +ActiveSource | onvif
+
+ +
+
+
+
+ +

Interface ActiveSource

+
+

Information about active video source

+
+
+

Hierarchy

+
    +
  • ActiveSource
+
+
+
+ +
+
+

Properties

+
+ +
bitrate?: number
+
+ +
encoding?: string
+
+ +
fps?: number
+
+ +
height?: number
+
+ +
profileToken: string
+
+ +
ptz?: { name: string; token: string }
+
+

Type declaration

+
    +
  • +
    name: string
  • +
  • +
    token: string
+
+ +
sourceToken: string
+
+ +
videoSourceConfigurationToken: string
+
+ +
width?: number
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/AnalyticsCapabilities.html b/docs/interfaces/AnalyticsCapabilities.html new file mode 100644 index 00000000..6b6c37c8 --- /dev/null +++ b/docs/interfaces/AnalyticsCapabilities.html @@ -0,0 +1,89 @@ +AnalyticsCapabilities | onvif
+
+ +
+
+
+
+ +

Interface AnalyticsCapabilities

+
+

Analytics capabilities

+
+
+

Hierarchy

+
    +
  • AnalyticsCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
XAddr: string
+

Analytics service URI

+
+
+ +
analyticsModuleSupport: boolean
+

Indicates whether modules are supported

+
+
+ +
ruleSupport: boolean
+

Indicates whether rules are supported

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/AnalyticsDeviceCapabilities.html b/docs/interfaces/AnalyticsDeviceCapabilities.html new file mode 100644 index 00000000..2a242bdf --- /dev/null +++ b/docs/interfaces/AnalyticsDeviceCapabilities.html @@ -0,0 +1,80 @@ +AnalyticsDeviceCapabilities | onvif
+
+ +
+
+
+
+ +

Interface AnalyticsDeviceCapabilities

+
+

Hierarchy

+
    +
  • AnalyticsDeviceCapabilities
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
XAddr: string
+
+ +
extension?: any
+
+ +
ruleSupport?: boolean
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/AnalyticsEngineConfiguration.html b/docs/interfaces/AnalyticsEngineConfiguration.html new file mode 100644 index 00000000..62352390 --- /dev/null +++ b/docs/interfaces/AnalyticsEngineConfiguration.html @@ -0,0 +1,73 @@ +AnalyticsEngineConfiguration | onvif
+
+ +
+
+
+
+ +

Interface AnalyticsEngineConfiguration

+
+

Hierarchy

+
    +
  • AnalyticsEngineConfiguration
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
analyticsModule?: Config
+
+ +
extension?: any
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/AudioDecoderConfiguration.html b/docs/interfaces/AudioDecoderConfiguration.html new file mode 100644 index 00000000..e40badeb --- /dev/null +++ b/docs/interfaces/AudioDecoderConfiguration.html @@ -0,0 +1,87 @@ +AudioDecoderConfiguration | onvif
+
+ +
+
+
+
+ +

Interface AudioDecoderConfiguration

+
+

Hierarchy

+
    +
  • AudioDecoderConfiguration
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount: number
+

Number of internal references currently using this configuration. +This informational parameter is read-only. Deprecated for Media2 Service.

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/AudioEncoder2Configuration.html b/docs/interfaces/AudioEncoder2Configuration.html new file mode 100644 index 00000000..ed3a1b13 --- /dev/null +++ b/docs/interfaces/AudioEncoder2Configuration.html @@ -0,0 +1,124 @@ +AudioEncoder2Configuration | onvif
+
+ +
+
+
+
+ +

Interface AudioEncoder2Configuration

+
+

Hierarchy

+
    +
  • AudioEncoder2Configuration
+
+
+
+ +
+
+

Properties

+
+ +
bitrate: number
+

The output bitrate in kbps

+
+
+ +
encoding: string
+

Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and IANA Media Types +https://www.iana.org/assignments/media-types/media-types.xhtml#audio

+
+
+ + +

Optional multicast configuration of the audio stream

+
+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
sampleRate: number
+

The output sample rate in kHz

+
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount: number
+

Number of internal references currently using this configuration. +This informational parameter is read-only. Deprecated for Media2 Service.

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/AudioEncoderConfiguration.html b/docs/interfaces/AudioEncoderConfiguration.html new file mode 100644 index 00000000..8fd83137 --- /dev/null +++ b/docs/interfaces/AudioEncoderConfiguration.html @@ -0,0 +1,132 @@ +AudioEncoderConfiguration | onvif
+
+ +
+
+
+
+ +

Interface AudioEncoderConfiguration

+
+

Hierarchy

+
    +
  • AudioEncoderConfiguration
+
+
+
+ +
+
+

Properties

+
+ +
bitrate: number
+

The output bitrate in kbps

+
+
+ +
encoding: "G711" | "G726" | "AAC"
+

Audio codec used for encoding the audio input (either G.711, G.726 or AAC)

+
+
+ + +

Defines the multicast settings that could be used for video streaming

+
+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
sampleRate: number
+

The output sample rate in kHz

+
+
+ +
sessionTimeout: string
+

The rtsp session timeout for the related audio stream

+
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount: number
+

Number of internal references currently using this configuration. +This informational parameter is read-only. Deprecated for Media2 Service.

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/AudioOutputConfiguration.html b/docs/interfaces/AudioOutputConfiguration.html new file mode 100644 index 00000000..756b01f6 --- /dev/null +++ b/docs/interfaces/AudioOutputConfiguration.html @@ -0,0 +1,126 @@ +AudioOutputConfiguration | onvif
+
+ +
+
+
+
+ +

Interface AudioOutputConfiguration

+
+

Hierarchy

+
    +
  • AudioOutputConfiguration
+
+
+
+ +
+
+

Properties

+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
outputLevel: number
+

Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRang

+
+
+ +
outputToken: string
+

Token of the phsycial Audio output

+
+
+ +
sendPrimacy?: string
+

An audio channel MAY support different types of audio transmission. +While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. +The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which direction is currently active. +An NVC can switch between different modes by setting the AudioOutputConfiguration. +The following modes for the Send-Primacy are defined:

+ +
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount: number
+

Number of internal references currently using this configuration. +This informational parameter is read-only. Deprecated for Media2 Service.

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/AudioSourceConfiguration.html b/docs/interfaces/AudioSourceConfiguration.html new file mode 100644 index 00000000..fef07771 --- /dev/null +++ b/docs/interfaces/AudioSourceConfiguration.html @@ -0,0 +1,96 @@ +AudioSourceConfiguration | onvif
+
+ +
+
+
+
+ +

Interface AudioSourceConfiguration

+
+

Hierarchy

+
    +
  • AudioSourceConfiguration
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
sourceToken: string
+

Token of the Audio Source the configuration applies to

+
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount: number
+

Number of internal references currently using this configuration +This informational parameter is read-only. Deprecated for Media2 Service

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/BacklightCompensation.html b/docs/interfaces/BacklightCompensation.html new file mode 100644 index 00000000..9f19d754 --- /dev/null +++ b/docs/interfaces/BacklightCompensation.html @@ -0,0 +1,81 @@ +BacklightCompensation | onvif
+
+ +
+
+
+
+ +

Interface BacklightCompensation

+
+

Hierarchy

+
    +
  • BacklightCompensation
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
level: number
+

Optional level parameter (unit unspecified)

+
+
+ +
mode: "OFF" | "ON"
+

Backlight compensation mode (on/off).

+
    +
  • OFF: Backlight compensation is disabled
  • +
  • ON: Backlight compensation is enabled
  • +
+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/BacklightCompensation20.html b/docs/interfaces/BacklightCompensation20.html new file mode 100644 index 00000000..9cd331a0 --- /dev/null +++ b/docs/interfaces/BacklightCompensation20.html @@ -0,0 +1,81 @@ +BacklightCompensation20 | onvif
+
+ +
+
+
+
+ +

Interface BacklightCompensation20

+
+

Hierarchy

+
    +
  • BacklightCompensation20
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
level?: number
+

Optional level parameter (unit unspecified)

+
+
+ +
mode: "OFF" | "ON"
+

Backlight compensation mode (on/off)

+
    +
  • OFF: Backlight compensation is disabled
  • +
  • ON: Backlight compensation is enabled
  • +
+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Capabilities.html b/docs/interfaces/Capabilities.html new file mode 100644 index 00000000..3e83d8ab --- /dev/null +++ b/docs/interfaces/Capabilities.html @@ -0,0 +1,111 @@ +Capabilities | onvif
+
+ +
+
+
+
+ +

Interface Capabilities

+
+

Capability list

+
+
+

Hierarchy

+
    +
  • Capabilities
+
+
+
+ +
+
+

Properties

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/CapabilitiesExtension.html b/docs/interfaces/CapabilitiesExtension.html new file mode 100644 index 00000000..5fb69f3c --- /dev/null +++ b/docs/interfaces/CapabilitiesExtension.html @@ -0,0 +1,117 @@ +CapabilitiesExtension | onvif
+
+ +
+
+
+
+ +

Interface CapabilitiesExtension

+
+

Hierarchy

+
    +
  • CapabilitiesExtension
+
+
+
+ +
+
+

Properties

+
+ +
XAddr: string
+
+ +
analyticsDevice?: AnalyticsDeviceCapabilities
+
+ + +

DeviceIO capabilities

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Config.html b/docs/interfaces/Config.html new file mode 100644 index 00000000..4a8a0d39 --- /dev/null +++ b/docs/interfaces/Config.html @@ -0,0 +1,87 @@ +Config | onvif
+
+ +
+
+
+
+ +

Interface Config

+
+

Hierarchy

+
    +
  • Config
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
name: string
+

Name of the configuration

+
+
+ +
parameters: ItemList[]
+

List of configuration parameters as defined in the corresponding description

+
+
+ +
type: string
+

The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements +returned by GetSupportedRules and GetSupportedAnalyticsModules command.

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ConfigurationSet.html b/docs/interfaces/ConfigurationSet.html new file mode 100644 index 00000000..d144d2ef --- /dev/null +++ b/docs/interfaces/ConfigurationSet.html @@ -0,0 +1,149 @@ +ConfigurationSet | onvif
+
+ +
+
+
+
+ +

Interface ConfigurationSet

+
+

Hierarchy

+
    +
  • ConfigurationSet
+
+
+
+ +
+
+

Properties

+
+ + +

Optional configuration of the pan tilt zoom unit

+
+
+ + +

Optional configuration of the analytics module and rule engine

+
+
+ + +

Optional configuration of the Audio decoder

+
+
+ + +

Optional configuration of the Audio encoder

+
+
+ + +

Optional configuration of the Audio output

+
+
+ + +

Optional configuration of the Audio input

+
+
+ + +

Optional configuration of the metadata stream

+
+
+ +
receiver?: any
+

Optional configuration of the Receiver

+
+
+ + +

Optional configuration of the Video encoder

+
+
+ + +

Optional configuration of the Video input

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Defogging.html b/docs/interfaces/Defogging.html new file mode 100644 index 00000000..d46b39cf --- /dev/null +++ b/docs/interfaces/Defogging.html @@ -0,0 +1,84 @@ +Defogging | onvif
+
+ +
+
+
+
+ +

Interface Defogging

+
+

Hierarchy

+
    +
  • Defogging
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
extension?: any
+
+ +
level?: number
+

Optional level parameter specified with unitless normalized value from 0.0 to +1.0

+
+
+ +
mode: string
+

Parameter to enable/disable or automatic Defogging feature. Its options shall be chosen from tt:DefoggingMode Type

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/DeviceCapabilities.html b/docs/interfaces/DeviceCapabilities.html new file mode 100644 index 00000000..2dd7b11e --- /dev/null +++ b/docs/interfaces/DeviceCapabilities.html @@ -0,0 +1,106 @@ +DeviceCapabilities | onvif
+
+ +
+
+
+
+ +

Interface DeviceCapabilities

+
+

Device capabilities

+
+
+

Hierarchy

+
    +
  • DeviceCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
+
+ +
XAddr: string
+

Device service URI

+
+
+ +
extensions?: any
+
+ +
+
+ +
+
+ +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/DeviceIOCapabilities.html b/docs/interfaces/DeviceIOCapabilities.html new file mode 100644 index 00000000..ff17ab95 --- /dev/null +++ b/docs/interfaces/DeviceIOCapabilities.html @@ -0,0 +1,117 @@ +DeviceIOCapabilities | onvif
+
+ +
+
+
+
+ +

Interface DeviceIOCapabilities

+
+

Hierarchy

+
    +
  • DeviceIOCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
XAddr: string
+

DeviceIO service URI

+
+
+ +
audioOutputs: number
+
+ +
audioSources: number
+
+ +
extensions: { scdlCapabilities: any; telexCapabilities: any }
+
+

Type declaration

+
    +
  • +
    scdlCapabilities: any
  • +
  • +
    telexCapabilities: any
+
+ +
relayOutputs: number
+
+ +
videoOutputs: number
+
+ +
videoSources: number
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/DeviceInformation.html b/docs/interfaces/DeviceInformation.html new file mode 100644 index 00000000..62bcd7b5 --- /dev/null +++ b/docs/interfaces/DeviceInformation.html @@ -0,0 +1,104 @@ +DeviceInformation | onvif
+
+ +
+
+
+
+ +

Interface DeviceInformation

+
+

Hierarchy

+
    +
  • DeviceInformation
+
+
+
+ +
+
+

Properties

+
+ +
firmwareVersion: string
+

The firmware version in the device

+
+
+ +
hardwareId: string
+

The hardware ID of the device

+
+
+ +
manufacturer: string
+

The manufactor of the device

+
+
+ +
model: string
+

The device model

+
+
+ +
serialNumber: string
+

The serial number of the device

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/DiscoveryOptions.html b/docs/interfaces/DiscoveryOptions.html new file mode 100644 index 00000000..60c8768f --- /dev/null +++ b/docs/interfaces/DiscoveryOptions.html @@ -0,0 +1,113 @@ +DiscoveryOptions | onvif
+
+ +
+
+
+
+ +

Interface DiscoveryOptions

+
+

Hierarchy

+
    +
  • DiscoveryOptions
+
+
+
+ +
+
+

Properties

+
+ +
device?: string
+

Interface to bind on for discovery ex. eth0

+
+
+ +
listeningPort?: number
+

Client will listen to discovery data device sent

+
+
+ +
messageId?: string
+

WS-Discovery message id

+
+
+ +
resolve?: boolean
+

Set to false if you want to omit creating of Cam objects. Default true

+
+
+ +
timeout?: number
+

Timeout in milliseconds for discovery responses, Default 5000

+
+
+ +
type?: "udp4" | "udp6"
+

Socket type

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/DisplayCapabilities.html b/docs/interfaces/DisplayCapabilities.html new file mode 100644 index 00000000..f75537ce --- /dev/null +++ b/docs/interfaces/DisplayCapabilities.html @@ -0,0 +1,75 @@ +DisplayCapabilities | onvif
+
+ +
+
+
+
+ +

Interface DisplayCapabilities

+
+

Hierarchy

+
    +
  • DisplayCapabilities
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
XAddr: string
+
+ +
fixedLayout: boolean
+

Indication that the SetLayout command supports only predefined layouts

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/EventCapabilities.html b/docs/interfaces/EventCapabilities.html new file mode 100644 index 00000000..ed739b2e --- /dev/null +++ b/docs/interfaces/EventCapabilities.html @@ -0,0 +1,98 @@ +EventCapabilities | onvif
+
+ +
+
+
+
+ +

Interface EventCapabilities

+
+

Event capabilities

+
+
+

Hierarchy

+
    +
  • EventCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
WSPausableSubscriptionManagerInterfaceSupport: boolean
+

Indicates whether or not WS Pausable Subscription Manager Interface is supported

+
+
+ +
WSPullPointSupport: boolean
+

Indicates whether or not WS Pull Point is supported

+
+
+ +
WSSubscriptionPolicySupport: boolean
+

Indicates whether or not WS Subscription policy is supported

+
+
+ +
XAddr: string
+

Event service URI

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/EventSubscription.html b/docs/interfaces/EventSubscription.html new file mode 100644 index 00000000..17ba3c9a --- /dev/null +++ b/docs/interfaces/EventSubscription.html @@ -0,0 +1,73 @@ +EventSubscription | onvif
+
+ +
+
+
+
+ +

Interface EventSubscription

+
+

Hierarchy

+
    +
  • EventSubscription
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
filter?: string
+
+ +
subscriptionPolicy?: any
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Exposure.html b/docs/interfaces/Exposure.html new file mode 100644 index 00000000..9bc7b9e3 --- /dev/null +++ b/docs/interfaces/Exposure.html @@ -0,0 +1,171 @@ +Exposure | onvif
+
+ +
+
+
+
+ +

Interface Exposure

+
+

Hierarchy

+
    +
  • Exposure
+
+
+
+ +
+
+

Properties

+
+ +
exposureTime: number
+

The fixed exposure time used by the image sensor (μs)

+
+
+ +
gain: number
+

The fixed gain used by the image sensor (dB)

+
+
+ +
iris: number
+

The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris

+
+
+ +
maxExposureTime: number
+

Maximum value of exposure time range allowed to be used by the algorithm

+
+
+ +
maxGain: number
+

Maximum value of the sensor gain range that is allowed to be used by the algorithm

+
+
+ +
maxIris: number
+

Maximum value of the iris range allowed to be used by the algorithm

+
+
+ +
minExposureTime: number
+

Minimum value of exposure time range allowed to be used by the algorithm

+
+
+ +
minGain: number
+

Minimum value of the sensor gain range that is allowed to be used by the algorithm

+
+
+ +
minIris: number
+

Minimum value of the iris range allowed to be used by the algorithm

+
+
+ +
mode: "AUTO" | "MANUAL"
+

Exposure Mode

+
    +
  • Auto – Enabled the exposure algorithm on the NVT
  • +
  • Manual – Disabled exposure algorithm on the NVT
  • +
+
+
+ +
priority: "LowNoise" | "FrameRate"
+

The exposure priority mode (low noise/framerate)

+
+
+ +
window: Rectangle
+

Rectangular exposure mask

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Exposure20.html b/docs/interfaces/Exposure20.html new file mode 100644 index 00000000..50146705 --- /dev/null +++ b/docs/interfaces/Exposure20.html @@ -0,0 +1,171 @@ +Exposure20 | onvif
+
+ +
+
+
+
+ +

Interface Exposure20

+
+

Hierarchy

+
    +
  • Exposure20
+
+
+
+ +
+
+

Properties

+
+ +
exposureTime?: number
+

The fixed exposure time used by the image sensor (μs)

+
+
+ +
gain?: number
+

The fixed gain used by the image sensor (dB)

+
+
+ +
iris?: number
+

The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris and positive values map to higher attenuation

+
+
+ +
maxExposureTime?: number
+

Maximum value of exposure time range allowed to be used by the algorithm

+
+
+ +
maxGain?: number
+

Maximum value of the sensor gain range that is allowed to be used by the algorithm

+
+
+ +
maxIris?: number
+

Maximum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation

+
+
+ +
minExposureTime?: number
+

Minimum value of exposure time range allowed to be used by the algorithm

+
+
+ +
minGain?: number
+

Minimum value of the sensor gain range that is allowed to be used by the algorithm

+
+
+ +
minIris?: number
+

Minimum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation

+
+
+ +
mode: "AUTO" | "MANUAL"
+

Exposure Mode

+
    +
  • Auto – Enabled the exposure algorithm on the device
  • +
  • Manual – Disabled exposure algorithm on the device
  • +
+
+
+ +
priority?: "LowNoise" | "FrameRate"
+

The exposure priority mode (low noise/framerate)

+
+
+ +
window?: Rectangle
+

Rectangular exposure mask

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/FocusConfiguration.html b/docs/interfaces/FocusConfiguration.html new file mode 100644 index 00000000..3ce6c655 --- /dev/null +++ b/docs/interfaces/FocusConfiguration.html @@ -0,0 +1,91 @@ +FocusConfiguration | onvif
+
+ +
+
+
+
+ +

Interface FocusConfiguration

+
+

Hierarchy

+
    +
  • FocusConfiguration
+
+
+
+ +
+
+

Properties

+
+ +
autoFocusMode: "AUTO" | "MANUAL"
+
+ +
defaultSpeed: number
+
+ +
farLimit: number
+

Parameter to set autofocus far limit (unit: meter). If set to 0.0, infinity will be used

+
+
+ +
nearLimit: number
+

Parameter to set autofocus near limit (unit: meter)

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/FocusConfiguration20.html b/docs/interfaces/FocusConfiguration20.html new file mode 100644 index 00000000..40b01bb0 --- /dev/null +++ b/docs/interfaces/FocusConfiguration20.html @@ -0,0 +1,115 @@ +FocusConfiguration20 | onvif
+
+ +
+
+
+
+ +

Interface FocusConfiguration20

+
+

Hierarchy

+
    +
  • FocusConfiguration20
+
+
+
+ +
+
+

Properties

+
+ +
AFMode: string[]
+

Zero or more modes as defined in enumeration tt:AFModes

+
+
+ +
autoFocusMode: "AUTO" | "MANUAL"
+

Mode of auto focus

+
    +
  • AUTO - The device automatically adjusts focus
  • +
  • MANUAL - The device does not automatically adjust focus +Note: for devices supporting both manual and auto operation at the same time manual operation may be supported +even if the Mode parameter is set to Auto.
  • +
+
+
+ +
defaultSpeed?: number
+
+ +
extension?: any
+
+ +
farLimit?: number
+

Parameter to set autofocus far limit (unit: meter)

+
+
+ +
nearLimit?: number
+

Parameter to set autofocus near limit (unit: meter)

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/H264Configuration.html b/docs/interfaces/H264Configuration.html new file mode 100644 index 00000000..37f00859 --- /dev/null +++ b/docs/interfaces/H264Configuration.html @@ -0,0 +1,80 @@ +H264Configuration | onvif
+
+ +
+
+
+
+ +

Interface H264Configuration

+
+

Hierarchy

+
    +
  • H264Configuration
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
H264Profile: "Baseline" | "Main" | "Extended" | "High"
+

The H.264 profile, either baseline, main, extended or high

+
+
+ +
govLength: number
+

Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. +An entry of 1 indicates I-Frames are continuously generated. +An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. +The frames in between are coded as P or B Frames

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/IOCapabilities.html b/docs/interfaces/IOCapabilities.html new file mode 100644 index 00000000..e3ae2b9d --- /dev/null +++ b/docs/interfaces/IOCapabilities.html @@ -0,0 +1,84 @@ +IOCapabilities | onvif
+
+ +
+
+
+
+ +

Interface IOCapabilities

+
+

Hierarchy

+
    +
  • IOCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
+
+ +
inputConnectors?: number
+

Number of input connectors

+
+
+ +
relayOutputs?: number
+

Number of relay outputs

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/IOCapabilitiesExtension.html b/docs/interfaces/IOCapabilitiesExtension.html new file mode 100644 index 00000000..d8f76a01 --- /dev/null +++ b/docs/interfaces/IOCapabilitiesExtension.html @@ -0,0 +1,80 @@ +IOCapabilitiesExtension | onvif
+
+ +
+
+
+
+ +

Interface IOCapabilitiesExtension

+
+

Hierarchy

+
    +
  • IOCapabilitiesExtension
+
+
+
+ +
+
+

Properties

+
+ +
auxiliary?: boolean
+
+ +
auxiliaryCommands?: Record<string, unknown>
+
+ +
extension?: any
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/IPAddress.html b/docs/interfaces/IPAddress.html new file mode 100644 index 00000000..2921ca66 --- /dev/null +++ b/docs/interfaces/IPAddress.html @@ -0,0 +1,86 @@ +IPAddress | onvif
+
+ +
+
+
+
+ +

Interface IPAddress

+
+

Hierarchy

+
    +
  • IPAddress
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
IPv4Address?: string
+

IPv4 address

+
+
+ +
IPv6Address?: string
+

IPv6 address

+
+
+ +
type: "IPv4" | "IPv6"
+

Indicates if the address is an IPv4 or IPv6 address

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ImageStabilization.html b/docs/interfaces/ImageStabilization.html new file mode 100644 index 00000000..7893ef09 --- /dev/null +++ b/docs/interfaces/ImageStabilization.html @@ -0,0 +1,84 @@ +ImageStabilization | onvif
+
+ +
+
+
+
+ +

Interface ImageStabilization

+
+

Hierarchy

+
    +
  • ImageStabilization
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
extension?: any
+
+ +
level?: number
+

Optional level parameter (unit unspecified)

+
+
+ +
mode: "OFF" | "ON" | "AUTO" | "Extended"
+

Parameter to enable/disable Image Stabilization feature

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ImagingCapabilities.html b/docs/interfaces/ImagingCapabilities.html new file mode 100644 index 00000000..f21961f2 --- /dev/null +++ b/docs/interfaces/ImagingCapabilities.html @@ -0,0 +1,68 @@ +ImagingCapabilities | onvif
+
+ +
+
+
+
+ +

Interface ImagingCapabilities

+
+

Hierarchy

+
    +
  • ImagingCapabilities
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
XAddr: string
+

Imaging service URI

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ImagingSettings.html b/docs/interfaces/ImagingSettings.html new file mode 100644 index 00000000..9a5b844f --- /dev/null +++ b/docs/interfaces/ImagingSettings.html @@ -0,0 +1,156 @@ +ImagingSettings | onvif
+
+ +
+
+
+
+ +

Interface ImagingSettings

+
+

Hierarchy

+
    +
  • ImagingSettings
+
+
+
+ +
+
+

Properties

+
+ +
backlightCompensation?: BacklightCompensation
+

Enabled/disabled BLC mode (on/off)

+
+
+ +
brightness?: number
+

Image brightness (unit unspecified)

+
+
+ +
colorSaturation?: number
+

Color saturation of the image (unit unspecified)

+
+
+ +
contrast?: number
+

Contrast of the image (unit unspecified)

+
+
+ +
exposure?: Exposure
+

Exposure mode of the device

+
+
+ +
extension?: any
+
+ + +

Focus configuration

+
+
+ +
irCutFilter?: "OFF" | "ON" | "AUTO"
+

Infrared Cutoff Filter settings

+
+
+ +
sharpness?: number
+

Sharpness of the Video image

+
+
+ +
whiteBalance?: WhiteBalance
+

White balance settings

+
+
+ +
wideDynamicRange?: WideDynamicRange
+

WDR settings

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ImagingSettings20.html b/docs/interfaces/ImagingSettings20.html new file mode 100644 index 00000000..a84ce59b --- /dev/null +++ b/docs/interfaces/ImagingSettings20.html @@ -0,0 +1,156 @@ +ImagingSettings20 | onvif
+
+ +
+
+
+
+ +

Interface ImagingSettings20

+
+

Hierarchy

+
    +
  • ImagingSettings20
+
+
+
+ +
+
+

Properties

+
+ +
backlightCompensation?: BacklightCompensation20
+

Enabled/disabled BLC mode (on/off)

+
+
+ +
brightness?: number
+

Image brightness (unit unspecified)

+
+
+ +
colorSaturation?: number
+

Color saturation of the image (unit unspecified)

+
+
+ +
contrast?: number
+

Contrast of the image (unit unspecified)

+
+
+ +
exposure?: Exposure20
+

Exposure mode of the device

+
+
+ +
+
+ + +

Focus configuration

+
+
+ +
irCutFilter?: "OFF" | "ON" | "AUTO"
+

Infrared Cutoff Filter settings

+
+
+ +
sharpness?: number
+

Sharpness of the Video image

+
+
+ +
whiteBalance?: WhiteBalance20
+

White balance settings

+
+
+ +
wideDynamicRange?: WideDynamicRange20
+

WDR settings

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ImagingSettingsExtension20.html b/docs/interfaces/ImagingSettingsExtension20.html new file mode 100644 index 00000000..18092f48 --- /dev/null +++ b/docs/interfaces/ImagingSettingsExtension20.html @@ -0,0 +1,75 @@ +ImagingSettingsExtension20 | onvif
+
+ +
+
+
+
+ +

Interface ImagingSettingsExtension20

+
+

Hierarchy

+
    +
  • ImagingSettingsExtension20
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
+
+ +
imageStabilization?: ImageStabilization
+

Optional element to configure Image Stabilization feature

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ImagingSettingsExtension202.html b/docs/interfaces/ImagingSettingsExtension202.html new file mode 100644 index 00000000..e41bba52 --- /dev/null +++ b/docs/interfaces/ImagingSettingsExtension202.html @@ -0,0 +1,75 @@ +ImagingSettingsExtension202 | onvif
+
+ +
+
+
+
+ +

Interface ImagingSettingsExtension202

+
+

Hierarchy

+
    +
  • ImagingSettingsExtension202
+
+
+
+ +
+
+

Properties

+
+ +
+
+ +
irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment
+

An optional parameter applied to only auto mode to adjust timing of toggling Ir cut filter

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ImagingSettingsExtension203.html b/docs/interfaces/ImagingSettingsExtension203.html new file mode 100644 index 00000000..37bc6cb1 --- /dev/null +++ b/docs/interfaces/ImagingSettingsExtension203.html @@ -0,0 +1,93 @@ +ImagingSettingsExtension203 | onvif
+
+ +
+
+
+
+ +

Interface ImagingSettingsExtension203

+
+

Hierarchy

+
    +
  • ImagingSettingsExtension203
+
+
+
+ +
+
+

Properties

+
+ +
defogging?: Defogging
+

Optional element to configure Image Defogging

+
+
+ +
extension?: any
+
+ +
noiseReduction?: NoiseReduction
+

Optional element to configure Image Noise Reduction

+
+
+ +
toneCompensation?: ToneCompensation
+

Optional element to configure Image Contrast Compensation

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/IntRectangle.html b/docs/interfaces/IntRectangle.html new file mode 100644 index 00000000..7c22d9d2 --- /dev/null +++ b/docs/interfaces/IntRectangle.html @@ -0,0 +1,87 @@ +IntRectangle | onvif
+
+ +
+
+
+
+ +

Interface IntRectangle

+
+

Hierarchy

+
    +
  • IntRectangle
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
height: number
+
+ +
width: number
+
+ +
x: number
+
+ +
y: number
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/IrCutFilterAutoAdjustment.html b/docs/interfaces/IrCutFilterAutoAdjustment.html new file mode 100644 index 00000000..9480e38c --- /dev/null +++ b/docs/interfaces/IrCutFilterAutoAdjustment.html @@ -0,0 +1,95 @@ +IrCutFilterAutoAdjustment | onvif
+
+ +
+
+
+
+ +

Interface IrCutFilterAutoAdjustment

+
+

Hierarchy

+
    +
  • IrCutFilterAutoAdjustment
+
+
+
+ +
+
+

Properties

+
+ +
boundaryOffset?: number
+

Adjusts boundary exposure level for toggling Ir cut filter to on/off specified with unitless normalized value +from +1.0 to -1.0. Zero is default and -1.0 is the darkest adjustment (Unitless).

+
+
+ +
boundaryType: string
+

Specifies which boundaries to automatically toggle Ir cut filter following parameters are applied to. +Its options shall be chosen from tt:IrCutFilterAutoBoundaryType

+
+
+ +
extension?: any
+
+ +
responseTime?: string
+

Delay time of toggling Ir cut filter to on/off after crossing of the boundary exposure levels

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ItemList.html b/docs/interfaces/ItemList.html new file mode 100644 index 00000000..e19f2d0c --- /dev/null +++ b/docs/interfaces/ItemList.html @@ -0,0 +1,95 @@ +ItemList | onvif
+
+ +
+
+
+
+ +

Interface ItemList

+
+

Hierarchy

+
    +
  • ItemList
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
elementItem?: any
+

Complex value structure

+
+
+ +
extension: any
+
+ +
simpleItem?: { name: string; value: any }
+

Value name pair as defined by the corresponding description

+
+
+

Type declaration

+
    +
  • +
    name: string
    +

    Item name

    +
  • +
  • +
    value: any
    +

    Item value. The type is defined in the corresponding description

    +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/LensDescription.html b/docs/interfaces/LensDescription.html new file mode 100644 index 00000000..8b5c4e30 --- /dev/null +++ b/docs/interfaces/LensDescription.html @@ -0,0 +1,98 @@ +LensDescription | onvif
+
+ +
+
+
+
+ +

Interface LensDescription

+
+

Hierarchy

+
    +
  • LensDescription
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
XFactor: number
+

Compensation of the x coordinate needed for the ONVIF normalized coordinate system

+
+
+ +
focalLength: number
+

Optional focal length of the optical system

+
+
+ +
offset: LensOffset
+

Offset of the lens center to the imager center in normalized coordinates

+
+
+ +
projection: LensProjection
+

Radial description of the projection characteristics. +The resulting curve is defined by the B-Spline interpolation over the given elements. +The element for Radius zero shall not be provided. The projection points shall be ordered with ascending Radius. +Items outside the last projection Radius shall be assumed to be invisible (black)

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/LensOffset.html b/docs/interfaces/LensOffset.html new file mode 100644 index 00000000..3e3fbdec --- /dev/null +++ b/docs/interfaces/LensOffset.html @@ -0,0 +1,77 @@ +LensOffset | onvif
+
+ +
+
+
+
+ +

Interface LensOffset

+
+

Hierarchy

+
    +
  • LensOffset
+
+
+
+ +
+
+

Properties

+
x +y +
+
+

Properties

+
+ +
x: number
+

Optional horizontal offset of the lens center in normalized coordinates

+
+
+ +
y: number
+

Optional vertical offset of the lens center in normalized coordinates

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/LensProjection.html b/docs/interfaces/LensProjection.html new file mode 100644 index 00000000..a3714662 --- /dev/null +++ b/docs/interfaces/LensProjection.html @@ -0,0 +1,86 @@ +LensProjection | onvif
+
+ +
+
+
+
+ +

Interface LensProjection

+
+

Hierarchy

+
    +
  • LensProjection
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
angle: number
+

Angle of incidence

+
+
+ +
radius: number
+

Mapping radius as a consequence of the emergent angle

+
+
+ +
transmittance?: number
+

Optional ray absorption at the given angle due to vignetting. A value of one means no absorption

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/MediaCapabilities.html b/docs/interfaces/MediaCapabilities.html new file mode 100644 index 00000000..40559add --- /dev/null +++ b/docs/interfaces/MediaCapabilities.html @@ -0,0 +1,84 @@ +MediaCapabilities | onvif
+
+ +
+
+
+
+ +

Interface MediaCapabilities

+
+

Hierarchy

+
    +
  • MediaCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
XAddr: string
+

Media service URI

+
+
+ +
+
+ +
streamingCapabilities: RealTimeStreamingCapabilities
+

Streaming capabilities

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/MediaCapabilitiesExtension.html b/docs/interfaces/MediaCapabilitiesExtension.html new file mode 100644 index 00000000..4b9215c7 --- /dev/null +++ b/docs/interfaces/MediaCapabilitiesExtension.html @@ -0,0 +1,66 @@ +MediaCapabilitiesExtension | onvif
+
+ +
+
+
+
+ +

Interface MediaCapabilitiesExtension

+
+

Hierarchy

+
    +
  • MediaCapabilitiesExtension
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
profileCapabilities: ProfileCapabilities
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/MediaProfile.html b/docs/interfaces/MediaProfile.html new file mode 100644 index 00000000..5fbccfb9 --- /dev/null +++ b/docs/interfaces/MediaProfile.html @@ -0,0 +1,95 @@ +MediaProfile | onvif
+
+ +
+
+
+
+ +

Interface MediaProfile

+
+

Hierarchy

+
    +
  • MediaProfile
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
configurations: ConfigurationSet
+

The configurations assigned to the profile

+
+
+ +
fixed: boolean
+

A value of true signals that the profile cannot be deleted. Default is false

+
+
+ +
name: string
+

User readable name of the profile

+
+
+ +
token: string
+

Unique identifier of the profile

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/MetadataConfiguration.html b/docs/interfaces/MetadataConfiguration.html new file mode 100644 index 00000000..e59f38d4 --- /dev/null +++ b/docs/interfaces/MetadataConfiguration.html @@ -0,0 +1,182 @@ +MetadataConfiguration | onvif
+
+ +
+
+
+
+ +

Interface MetadataConfiguration

+
+

Hierarchy

+
    +
  • MetadataConfiguration
+
+
+
+ +
+
+

Properties

+
+ +
PTZStatus?: PTZFilter
+

Optional element to configure which PTZ related data is to include in the metadata stream

+
+
+ +
analytics?: boolean
+

Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.)

+
+
+ +
analyticsEngineConfiguration?: AnalyticsEngineConfiguration
+

Indication which AnalyticsModules shall output metadata. +Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration

+
+
+ +
compressionType: string
+

Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType

+
+
+ + +

Optional element to configure the streaming of events. +A client might be interested in receiving all, none or some of the events produced by the device:

+
    +
  • To get all events: Include the Events element but do not include a filter
  • +
  • To get no events: Do not include the Events element
  • +
  • To get only some events: Include the Events element and include a filter in the element
  • +
+
+
+ +
extension?: any
+
+ +
geoLocation: boolean
+

Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target

+
+
+ + +

Defines the multicast settings that could be used for video streaming

+
+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
sessionTimeout: string
+

The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored)

+
+
+ +
shapePolygon: boolean
+

Optional parameter to configure if the generated metadata stream should contain shape information as polygon

+
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount: number
+

Number of internal references currently using this configuration. +This informational parameter is read-only. Deprecated for Media2 Service.

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Mpeg4Configuration.html b/docs/interfaces/Mpeg4Configuration.html new file mode 100644 index 00000000..78dde031 --- /dev/null +++ b/docs/interfaces/Mpeg4Configuration.html @@ -0,0 +1,79 @@ +Mpeg4Configuration | onvif
+
+ +
+
+
+
+ +

Interface Mpeg4Configuration

+
+

Hierarchy

+
    +
  • Mpeg4Configuration
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
govLength: number
+

Determines the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. +An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. +The frames in between are coded as P or B Frames

+
+
+ +
mpeg4Profile: "SP" | "ASP"
+

The Mpeg4 profile, either simple profile (SP) or advanced simple profile (ASP)

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/MulticastConfiguration.html b/docs/interfaces/MulticastConfiguration.html new file mode 100644 index 00000000..bb2ec3db --- /dev/null +++ b/docs/interfaces/MulticastConfiguration.html @@ -0,0 +1,100 @@ +MulticastConfiguration | onvif
+
+ +
+
+
+
+ +

Interface MulticastConfiguration

+
+

Hierarchy

+
    +
  • MulticastConfiguration
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
TTL: number
+

In case of IPv6 the TTL value is assumed as the hop limit. +Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets +from (endlessly) circulating and not limiting scope. In these cases the address contains the scope

+
+
+ +
address: IPAddress
+

The multicast address (if this address is set to 0 no multicast streaming is enaled)

+
+
+ +
autoStart: boolean
+

Read only property signalling that streaming is persistant. +Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state.

+
+
+ +
port: number
+

The RTP mutlicast destination port. A device may support RTCP. +In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) +destination port number as defined in the RTSP specification

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/NetworkCapabilities.html b/docs/interfaces/NetworkCapabilities.html new file mode 100644 index 00000000..3977ebe6 --- /dev/null +++ b/docs/interfaces/NetworkCapabilities.html @@ -0,0 +1,105 @@ +NetworkCapabilities | onvif
+
+ +
+
+
+
+ +

Interface NetworkCapabilities

+
+

Network capabilities

+
+
+

Hierarchy

+
    +
  • NetworkCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
IPFilter?: boolean
+

Indicates support for IP filtering

+
+
+ +
IPVersion6?: boolean
+

Indicates support for IPv6

+
+
+ +
dynDNS?: boolean
+

Indicates support for dynamic DNS configuration

+
+
+ +
+
+ +
zeroConfiguration?: boolean
+

Indicates support for zeroconf

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/NetworkCapabilitiesExtension.html b/docs/interfaces/NetworkCapabilitiesExtension.html new file mode 100644 index 00000000..1601cbf4 --- /dev/null +++ b/docs/interfaces/NetworkCapabilitiesExtension.html @@ -0,0 +1,73 @@ +NetworkCapabilitiesExtension | onvif
+
+ +
+
+
+
+ +

Interface NetworkCapabilitiesExtension

+
+

Hierarchy

+
    +
  • NetworkCapabilitiesExtension
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
dot11Configuration?: boolean
+
+ +
extension?: any
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/NoiseReduction.html b/docs/interfaces/NoiseReduction.html new file mode 100644 index 00000000..cb5c0fdb --- /dev/null +++ b/docs/interfaces/NoiseReduction.html @@ -0,0 +1,69 @@ +NoiseReduction | onvif
+
+ +
+
+
+
+ +

Interface NoiseReduction

+
+

Hierarchy

+
    +
  • NoiseReduction
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
level: number
+

Level parameter specified with unitless normalized value from 0.0 to +1.0. +Level=0 means no noise reduction or minimal noise reduction

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/OnvifOptions.html b/docs/interfaces/OnvifOptions.html new file mode 100644 index 00000000..ffd49c4e --- /dev/null +++ b/docs/interfaces/OnvifOptions.html @@ -0,0 +1,156 @@ +OnvifOptions | onvif
+
+ +
+
+
+
+ +

Interface OnvifOptions

+
+

Cam constructor options

+
+
+

Hierarchy

+
    +
  • OnvifOptions
+
+
+
+ +
+
+

Properties

+
+ +
agent?: boolean | Agent
+

Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections.

+
+
+ +
autoConnect?: boolean
+

Set false if the camera should not connect automatically, defaults false.

+
+
+ +
hostname: string
+
+ +
password?: string
+
+ +
path?: string
+
+ +
port?: number
+
+ +
preserveAddress?: boolean
+

Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false.

+
+
+ +
secureOptions?: SecureContextOptions
+

Set options for https like ca, cert, ciphers, rejectUnauthorized, secureOptions, secureProtocol, etc.

+
+
+ +
timeout?: number
+
+ +
urn?: string
+
+ +
useSecure?: boolean
+

Set true if using https protocol, defaults to false.

+
+
+ +
username?: string
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/OnvifRequestOptions.html b/docs/interfaces/OnvifRequestOptions.html new file mode 100644 index 00000000..5a174118 --- /dev/null +++ b/docs/interfaces/OnvifRequestOptions.html @@ -0,0 +1,586 @@ +OnvifRequestOptions | onvif
+
+ +
+
+
+
+ +

Interface OnvifRequestOptions

+
+

Hierarchy

+
    +
  • RequestOptions +
      +
    • OnvifRequestOptions
+
+
+
+ +
+
+

Properties

+
+ +
_defaultAgent?: Agent
+
+ +
agent?: boolean | Agent
+
+ +
auth?: null | string
+
+ +
body: string
+

SOAP body

+
+
+ +
ca?: string | Buffer | (string | Buffer)[]
+

Optionally override the trusted CA certificates. Default is to trust +the well-known CAs curated by Mozilla. Mozilla's CAs are completely +replaced when CAs are explicitly specified using this option.

+
+
+ +
cert?: string | Buffer | (string | Buffer)[]
+

Cert chains in PEM format. One cert chain should be provided per + private key. Each cert chain should consist of the PEM formatted + certificate for a provided private key, followed by the PEM + formatted intermediate certificates (if any), in order, and not + including the root CA (the root CA must be pre-known to the peer, + see ca). When providing multiple cert chains, they do not have to + be in the same order as their private keys in key. If the + intermediate certificates are not provided, the peer will not be + able to validate the certificate, and the handshake will fail.

+
+
+ +
ciphers?: string
+

Cipher suite specification, replacing the default. For more +information, see modifying the default cipher suite. Permitted +ciphers can be obtained via tls.getCiphers(). Cipher names must be +uppercased in order for OpenSSL to accept them.

+
+
+ +
clientCertEngine?: string
+

Name of an OpenSSL engine which can provide the client certificate.

+
+
+ +
createConnection?: ((options: ClientRequestArgs, oncreate: ((err: Error, socket: Socket) => void)) => Socket)
+
+

Type declaration

+
    +
  • +
      +
    • (options: ClientRequestArgs, oncreate: ((err: Error, socket: Socket) => void)): Socket
    • +
    • +
      +

      Parameters

      +
        +
      • +
        options: ClientRequestArgs
      • +
      • +
        oncreate: ((err: Error, socket: Socket) => void)
        +
          +
        • +
            +
          • (err: Error, socket: Socket): void
          • +
          • +
            +

            Parameters

            +
              +
            • +
              err: Error
            • +
            • +
              socket: Socket
            +

            Returns void

      +

      Returns Socket

+
+ +
crl?: string | Buffer | (string | Buffer)[]
+

PEM formatted CRLs (Certificate Revocation Lists).

+
+
+ +
defaultPort?: string | number
+
+ +
dhparam?: string | Buffer
+

Diffie Hellman parameters, required for Perfect Forward Secrecy. Use +openssl dhparam to create the parameters. The key length must be +greater than or equal to 1024 bits or else an error will be thrown. +Although 1024 bits is permissible, use 2048 bits or larger for +stronger security. If omitted or invalid, the parameters are +silently discarded and DHE ciphers will not be available.

+
+
+ +
ecdhCurve?: string
+

A string describing a named curve or a colon separated list of curve +NIDs or names, for example P-521:P-384:P-256, to use for ECDH key +agreement. Set to auto to select the curve automatically. Use +crypto.getCurves() to obtain a list of available curve names. On +recent releases, openssl ecparam -list_curves will also display the +name and description of each available elliptic curve. Default: +tls.DEFAULT_ECDH_CURVE.

+
+
+ +
family?: number
+
+ +
headers?: OutgoingHttpHeaders
+
+ +
honorCipherOrder?: boolean
+

Attempt to use the server's cipher suite preferences instead of the +client's. When true, causes SSL_OP_CIPHER_SERVER_PREFERENCE to be +set in secureOptions

+
+
+ +
host?: null | string
+
+ +
hostname?: null | string
+
+ +
key?: string | Buffer | (Buffer | KeyObject)[]
+

Private keys in PEM format. PEM allows the option of private keys +being encrypted. Encrypted keys will be decrypted with +options.passphrase. Multiple keys using different algorithms can be +provided either as an array of unencrypted key strings or buffers, +or an array of objects in the form {pem: <string|buffer>[, +passphrase: ]}. The object form can only occur in an array. +object.passphrase is optional. Encrypted keys will be decrypted with +object.passphrase if provided, or options.passphrase if it is not.

+
+
+ +
localAddress?: string
+
+ +
lookup?: LookupFunction
+
+ +
maxHeaderSize?: number
+
+

Default

8192

+
+
+ +
maxVersion?: SecureVersion
+

Optionally set the maximum TLS version to allow. One +of 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Cannot be specified along with the +secureProtocol option, use one or the other. +Default: 'TLSv1.3', unless changed using CLI options. Using +--tls-max-v1.2 sets the default to 'TLSv1.2'. Using --tls-max-v1.3 sets the default to +'TLSv1.3'. If multiple of the options are provided, the highest maximum is used.

+
+
+ +
method?: string
+
+ +
minVersion?: SecureVersion
+

Optionally set the minimum TLS version to allow. One +of 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Cannot be specified along with the +secureProtocol option, use one or the other. It is not recommended to use +less than TLSv1.2, but it may be required for interoperability. +Default: 'TLSv1.2', unless changed using CLI options. Using +--tls-v1.0 sets the default to 'TLSv1'. Using --tls-v1.1 sets the default to +'TLSv1.1'. Using --tls-min-v1.3 sets the default to +'TLSv1.3'. If multiple of the options are provided, the lowest minimum is used.

+
+
+ +
passphrase?: string
+

Shared passphrase used for a single private key and/or a PFX.

+
+
+ +
path?: null | string
+
+ +
pfx?: string | Buffer | (string | Buffer | PxfObject)[]
+

PFX or PKCS12 encoded private key and certificate chain. pfx is an +alternative to providing key and cert individually. PFX is usually +encrypted, if it is, passphrase will be used to decrypt it. Multiple +PFX can be provided either as an array of unencrypted PFX buffers, +or an array of objects in the form {buf: <string|buffer>[, +passphrase: ]}. The object form can only occur in an array. +object.passphrase is optional. Encrypted PFX will be decrypted with +object.passphrase if provided, or options.passphrase if it is not.

+
+
+ +
port?: null | string | number
+
+ +
privateKeyEngine?: string
+

Name of an OpenSSL engine to get private key from. Should be used +together with privateKeyIdentifier.

+
+
+ +
privateKeyIdentifier?: string
+

Identifier of a private key managed by an OpenSSL engine. Should be +used together with privateKeyEngine. Should not be set together with +key, because both options define a private key in different ways.

+
+
+ +
protocol?: null | string
+
+ +
ptz?: boolean
+

Make request to PTZ uri or not

+
+
+ +
rejectUnauthorized?: boolean
+
+ +
secureOptions?: number
+

Optionally affect the OpenSSL protocol behavior, which is not +usually necessary. This should be used carefully if at all! Value is +a numeric bitmask of the SSL_OP_* options from OpenSSL Options

+
+
+ +
secureProtocol?: string
+

Legacy mechanism to select the TLS protocol version to use, it does +not support independent control of the minimum and maximum version, +and does not support limiting the protocol to TLSv1.3. Use +minVersion and maxVersion instead. The possible values are listed as +SSL_METHODS, use the function names as strings. For example, use +'TLSv1_1_method' to force TLS version 1.1, or 'TLS_method' to allow +any TLS protocol version up to TLSv1.3. It is not recommended to use +TLS versions less than 1.2, but it may be required for +interoperability. Default: none, see minVersion.

+
+
+ +
servername?: string
+
+ +
service?: keyof OnvifServices
+

Name of service (ptz, media, etc)

+
+
+ +
sessionIdContext?: string
+

Opaque identifier used by servers to ensure session state is not +shared between applications. Unused by clients.

+
+
+ +
sessionTimeout?: number
+

The number of seconds after which a TLS session created by the +server will no longer be resumable. See Session Resumption for more +information. Default: 300.

+
+
+ +
setHost?: boolean
+
+ +
sigalgs?: string
+

Colon-separated list of supported signature algorithms. The list + can contain digest algorithms (SHA256, MD5 etc.), public key + algorithms (RSA-PSS, ECDSA etc.), combination of both (e.g + 'RSA+SHA384') or TLS v1.3 scheme names (e.g. rsa_pss_pss_sha512).

+
+
+ +
signal?: AbortSignal
+
+ +
socketPath?: string
+
+ +
ticketKeys?: Buffer
+

48-bytes of cryptographically strong pseudo-random data. +See Session Resumption for more information.

+
+
+ +
timeout?: number
+
+ +
url?: string
+

Defines another url to request

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/OnvifService.html b/docs/interfaces/OnvifService.html new file mode 100644 index 00000000..0946b3cf --- /dev/null +++ b/docs/interfaces/OnvifService.html @@ -0,0 +1,95 @@ +OnvifService | onvif
+
+ +
+
+
+
+ +

Interface OnvifService

+
+

Hierarchy

+
    +
  • OnvifService
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
XAddr: string
+

Uri for requests

+
+
+ +
major: number
+

Major version

+
+
+ +
minor: number
+

Minor version

+
+
+ +
namespace: string
+

Namespace uri

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/OnvifServices.html b/docs/interfaces/OnvifServices.html new file mode 100644 index 00000000..15a1b3c2 --- /dev/null +++ b/docs/interfaces/OnvifServices.html @@ -0,0 +1,150 @@ +OnvifServices | onvif
+
+ +
+
+
+
+ +

Interface OnvifServices

+
+

Hierarchy

+
    +
  • OnvifServices
+
+
+
+ +
+
+

Properties

+
+ +
PTZ?: URL
+
+ +
analyticsDevice?: URL
+
+ +
device?: URL
+
+ +
deviceIO?: URL
+
+ +
display?: URL
+
+ +
events?: URL
+
+ +
imaging?: URL
+
+ +
media?: URL
+
+ +
media2?: URL
+
+ +
receiver?: URL
+
+ +
recording?: URL
+
+ +
replay?: URL
+
+ +
search?: URL
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/OnvifVersion.html b/docs/interfaces/OnvifVersion.html new file mode 100644 index 00000000..bbc57256 --- /dev/null +++ b/docs/interfaces/OnvifVersion.html @@ -0,0 +1,79 @@ +OnvifVersion | onvif
+
+ +
+
+
+
+ +

Interface OnvifVersion

+
+

Hierarchy

+
    +
  • OnvifVersion
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
major: number
+

Major version number

+
+
+ +
minor: number
+

Two digit minor version number. +If major version number is less than "16", X.0.1 maps to "01" and X.2.1 maps to "21" where X stands for Major version number. +Otherwise, minor number is month of release, such as "06" for June

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/PTControlDirection.html b/docs/interfaces/PTControlDirection.html new file mode 100644 index 00000000..5cb9c726 --- /dev/null +++ b/docs/interfaces/PTControlDirection.html @@ -0,0 +1,98 @@ +PTControlDirection | onvif
+
+ +
+
+
+
+ +

Interface PTControlDirection

+
+

Hierarchy

+
    +
  • PTControlDirection
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
EFlip?: { mode: "OFF" | "ON" | "Extended" }
+

Optional element to configure related parameters for E-Flip

+
+
+

Type declaration

+
    +
  • +
    mode: "OFF" | "ON" | "Extended"
    +

    Parameter to enable/disable E-Flip feature

    +
+
+ +
extension: any
+
+ +
reverse: { mode: "OFF" | "ON" | "AUTO" | "Extended" }
+

Optional element to configure related parameters for reversing of PT Control Direction

+
+
+

Type declaration

+
    +
  • +
    mode: "OFF" | "ON" | "AUTO" | "Extended"
    +

    Parameter to enable/disable Reverse feature

    +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/PTZCapabilities.html b/docs/interfaces/PTZCapabilities.html new file mode 100644 index 00000000..e6467bb0 --- /dev/null +++ b/docs/interfaces/PTZCapabilities.html @@ -0,0 +1,71 @@ +PTZCapabilities | onvif
+
+ +
+
+
+
+ +

Interface PTZCapabilities

+
+

PTZ capabilities

+
+
+

Hierarchy

+
    +
  • PTZCapabilities
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
XAddr: string
+

PTZ service URI

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/PTZConfiguration.html b/docs/interfaces/PTZConfiguration.html new file mode 100644 index 00000000..f943d5ca --- /dev/null +++ b/docs/interfaces/PTZConfiguration.html @@ -0,0 +1,226 @@ +PTZConfiguration | onvif
+
+ +
+
+
+
+ +

Interface PTZConfiguration

+
+

Hierarchy

+
    +
  • PTZConfiguration
+
+
+
+ +
+
+

Properties

+
+ +
defaultAbsolutePantTiltPositionSpace?: string
+

If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default

+
+
+ +
defaultAbsoluteZoomPositionSpace?: string
+

If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default

+
+
+ +
defaultContinuousPanTiltVelocitySpace?: string
+

If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default

+
+
+ +
defaultContinuousZoomVelocitySpace?: string
+

If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default

+
+
+ +
defaultPTZSpeed?: PTZSpeed
+

If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds

+
+
+ +
defaultPTZTimeout?: string
+

If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops

+
+
+ +
defaultRelativePanTiltTranslationSpace?: string
+

If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default

+
+
+ +
defaultRelativeZoomTranslationSpace?: string
+

If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default

+
+
+ +
+
+ +
moveRamp: number
+

The optional acceleration ramp used by the device when moving

+
+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
nodeToken: string
+

A mandatory reference to the PTZ Node that the PTZ Configuration belongs to

+
+
+ +
panTiltLimits?: PanTiltLimits
+

The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. +If the element is present it signals the support for configurable Pan/Tilt limits. +If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. +The Pan/Tilt limits are disabled by setting the limits to –INF or +INF

+
+
+ +
presetRamp: number
+

The optional acceleration ramp used by the device when recalling presets

+
+
+ +
presetTourRamp: number
+

The optional acceleration ramp used by the device when executing PresetTours

+
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount: number
+

Number of internal references currently using this configuration. +This informational parameter is read-only. Deprecated for Media2 Service.

+
+
+ +
zoomLimits?: ZoomLimits
+

The Zoom limits element should be present for a PTZ Node that supports absolute zoom. +If the element is present it signals the supports for configurable Zoom limits. +If limits are enabled the zoom movements shall always stay within the specified range. +The Zoom limits are disabled by settings the limits to -INF and +INF

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/PTZConfigurationExtension.html b/docs/interfaces/PTZConfigurationExtension.html new file mode 100644 index 00000000..9f43f054 --- /dev/null +++ b/docs/interfaces/PTZConfigurationExtension.html @@ -0,0 +1,75 @@ +PTZConfigurationExtension | onvif
+
+ +
+
+
+
+ +

Interface PTZConfigurationExtension

+
+

Hierarchy

+
    +
  • PTZConfigurationExtension
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
PTControlDirection: PTControlDirection
+

Optional element to configure PT Control Direction related features

+
+
+ +
extension: any
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/PTZFilter.html b/docs/interfaces/PTZFilter.html new file mode 100644 index 00000000..9e0713ab --- /dev/null +++ b/docs/interfaces/PTZFilter.html @@ -0,0 +1,77 @@ +PTZFilter | onvif
+
+ +
+
+
+
+ +

Interface PTZFilter

+
+

Hierarchy

+
    +
  • PTZFilter
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
position: boolean
+

true if the metadata stream shall contain the PTZ position

+
+
+ +
status: boolean
+

true if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN)

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/PTZSpeed.html b/docs/interfaces/PTZSpeed.html new file mode 100644 index 00000000..71c057e2 --- /dev/null +++ b/docs/interfaces/PTZSpeed.html @@ -0,0 +1,90 @@ +PTZSpeed | onvif
+
+ +
+
+
+
+ +

Interface PTZSpeed

+
+

Hierarchy

+
    +
  • PTZSpeed
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
panTilt: { x: number; y: number }
+

Pan and tilt speed. The x component corresponds to pan and the y component to tilt. +If omitted in a request, the current (if any) PanTilt movement should not be affected

+
+
+

Type declaration

+
    +
  • +
    x: number
  • +
  • +
    y: number
+
+ +
zoom: { x: number }
+

A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected

+
+
+

Type declaration

+
    +
  • +
    x: number
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/PanTiltLimits.html b/docs/interfaces/PanTiltLimits.html new file mode 100644 index 00000000..b66f53f3 --- /dev/null +++ b/docs/interfaces/PanTiltLimits.html @@ -0,0 +1,68 @@ +PanTiltLimits | onvif
+
+ +
+
+
+
+ +

Interface PanTiltLimits

+
+

Hierarchy

+
    +
  • PanTiltLimits
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ + +

A range of pan tilt limits

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Profile.html b/docs/interfaces/Profile.html new file mode 100644 index 00000000..ef6e856a --- /dev/null +++ b/docs/interfaces/Profile.html @@ -0,0 +1,158 @@ +Profile | onvif
+
+ +
+
+
+
+ +

Interface Profile

+
+

Hierarchy

+
    +
  • Profile
+
+
+
+ +
+
+

Properties

+
+ +
PTZConfiguration?: PTZConfiguration
+

Optional configuration of the pan tilt zoom unit

+
+
+ +
audioEncoderConfiguration?: AudioEncoderConfiguration
+

Optional configuration of the Audio encoder

+
+
+ +
audioSourceConfiguration?: AudioSourceConfiguration
+

Optional configuration of the Audio input

+
+
+ +
extension?: ProfileExtension
+

Extensions defined in ONVIF 2.0

+
+
+ +
fixed: boolean
+

A value of true signals that the profile cannot be deleted. Default is false

+
+
+ +
metadataConfiguration?: MetadataConfiguration
+

Optional configuration of the metadata stream

+
+
+ +
name: string
+

User readable name of the profile

+
+
+ +
token: string
+

Unique identifier of the profile

+
+
+ +
videoAnalyticsConfiguration?: VideoAnalyticsConfiguration
+

Optional configuration of the video analytics module and rule engine

+
+
+ +
videoEncoderConfiguration?: VideoEncoderConfiguration
+

Optional configuration of the Video encoder

+
+
+ +
videoSourceConfiguration?: VideoSourceConfiguration
+

Optional configuration of the Video input

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ProfileCapabilities.html b/docs/interfaces/ProfileCapabilities.html new file mode 100644 index 00000000..93cdd4d1 --- /dev/null +++ b/docs/interfaces/ProfileCapabilities.html @@ -0,0 +1,66 @@ +ProfileCapabilities | onvif
+
+ +
+
+
+
+ +

Interface ProfileCapabilities

+
+

Hierarchy

+
    +
  • ProfileCapabilities
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
maximumNumberOfProfiles: number
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ProfileExtension.html b/docs/interfaces/ProfileExtension.html new file mode 100644 index 00000000..e6d01d59 --- /dev/null +++ b/docs/interfaces/ProfileExtension.html @@ -0,0 +1,84 @@ +ProfileExtension | onvif
+
+ +
+
+
+
+ +

Interface ProfileExtension

+
+

Hierarchy

+
    +
  • ProfileExtension
+
+
+
+ +
+
+

Properties

+
+ +
audioDecoderConfiguration: AudioDecoderConfiguration
+

Optional configuration of the Audio decoder

+
+
+ +
audioOutputConfiguration: AudioOutputConfiguration
+

Optional configuration of the Audio output

+
+
+ +
extension?: any
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Range.html b/docs/interfaces/Range.html new file mode 100644 index 00000000..380d422d --- /dev/null +++ b/docs/interfaces/Range.html @@ -0,0 +1,73 @@ +Range | onvif
+
+ +
+
+
+
+ +

Interface Range

+
+

Hierarchy

+
    +
  • Range
+
+
+
+ +
+
+

Properties

+
max +min +
+
+

Properties

+
+ +
max: number
+
+ +
min: number
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/RealTimeStreamingCapabilities.html b/docs/interfaces/RealTimeStreamingCapabilities.html new file mode 100644 index 00000000..907b81dd --- /dev/null +++ b/docs/interfaces/RealTimeStreamingCapabilities.html @@ -0,0 +1,95 @@ +RealTimeStreamingCapabilities | onvif
+
+ +
+
+
+
+ +

Interface RealTimeStreamingCapabilities

+
+

Hierarchy

+
    +
  • RealTimeStreamingCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
RTPMulticast: boolean
+

Indicates whether or not RTP multicast is supported

+
+
+ +
RTP_RTSP_TCP: boolean
+

Indicates whether or not RTP/RTSP/TCP is supported

+
+
+ +
RTP_TCP: boolean
+

Indicates whether or not RTP over TCP is supported

+
+
+ +
extension: any
+

Extensions

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ReceiverCapabilities.html b/docs/interfaces/ReceiverCapabilities.html new file mode 100644 index 00000000..6c167b7f --- /dev/null +++ b/docs/interfaces/ReceiverCapabilities.html @@ -0,0 +1,113 @@ +ReceiverCapabilities | onvif
+
+ +
+
+
+
+ +

Interface ReceiverCapabilities

+
+

Hierarchy

+
    +
  • ReceiverCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
RTP_Multicast: boolean
+

Indicates whether the device can receive RTP multicast streams

+
+
+ +
RTP_RTSP_TCP: boolean
+

Indicates whether the device can receive RTP/RTSP/TCP streams

+
+
+ +
RTP_TCP: boolean
+

Indicates whether the device can receive RTP/TCP streams

+
+
+ +
XAddr: string
+

The address of the receiver service

+
+
+ +
maximumRTSPURILength: number
+

The maximum allowed length for RTSP URIs

+
+
+ +
supportedReceivers: number
+

The maximum number of receivers supported by the device

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/RecordingCapabilities.html b/docs/interfaces/RecordingCapabilities.html new file mode 100644 index 00000000..2f1836bb --- /dev/null +++ b/docs/interfaces/RecordingCapabilities.html @@ -0,0 +1,101 @@ +RecordingCapabilities | onvif
+
+ +
+
+
+
+ +

Interface RecordingCapabilities

+
+

Hierarchy

+
    +
  • RecordingCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
XAddr: string
+
+ +
dynamicRecordings: boolean
+
+ +
dynamicTracks: boolean
+
+ +
maxStringLength: number
+
+ +
mediaProfileSource: boolean
+
+ +
receiverSource: boolean
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Rectangle.html b/docs/interfaces/Rectangle.html new file mode 100644 index 00000000..0cfc45dd --- /dev/null +++ b/docs/interfaces/Rectangle.html @@ -0,0 +1,87 @@ +Rectangle | onvif
+
+ +
+
+
+
+ +

Interface Rectangle

+
+

Hierarchy

+
    +
  • Rectangle
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
height: number
+
+ +
width: number
+
+ +
x: number
+
+ +
y: number
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ReplayCapabilities.html b/docs/interfaces/ReplayCapabilities.html new file mode 100644 index 00000000..cf64a92d --- /dev/null +++ b/docs/interfaces/ReplayCapabilities.html @@ -0,0 +1,66 @@ +ReplayCapabilities | onvif
+
+ +
+
+
+
+ +

Interface ReplayCapabilities

+
+

Hierarchy

+
    +
  • ReplayCapabilities
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
XAddr: string
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Rotate.html b/docs/interfaces/Rotate.html new file mode 100644 index 00000000..38d49350 --- /dev/null +++ b/docs/interfaces/Rotate.html @@ -0,0 +1,84 @@ +Rotate | onvif
+
+ +
+
+
+
+ +

Interface Rotate

+
+

Hierarchy

+
    +
  • Rotate
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
degree?: number
+

Optional parameter to configure how much degree of clockwise rotation of image for On mode. Omitting this parameter for On mode means 180 degree rotation.

+
+
+ +
extension: any
+
+ +
mode: "OFF" | "ON" | "AUTO"
+

Parameter to enable/disable Rotation feature

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/RuleEngineConfiguration.html b/docs/interfaces/RuleEngineConfiguration.html new file mode 100644 index 00000000..847ada21 --- /dev/null +++ b/docs/interfaces/RuleEngineConfiguration.html @@ -0,0 +1,73 @@ +RuleEngineConfiguration | onvif
+
+ +
+
+
+
+ +

Interface RuleEngineConfiguration

+
+

Hierarchy

+
    +
  • RuleEngineConfiguration
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
extension?: any
+
+ +
rule?: Config
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/SceneOrientation.html b/docs/interfaces/SceneOrientation.html new file mode 100644 index 00000000..f94a8313 --- /dev/null +++ b/docs/interfaces/SceneOrientation.html @@ -0,0 +1,79 @@ +SceneOrientation | onvif
+
+ +
+
+
+
+ +

Interface SceneOrientation

+
+

Hierarchy

+
    +
  • SceneOrientation
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
mode: "AUTO" | "MANUAL"
+

Parameter to assign the way the camera determines the scene orientation

+
+
+ +
orientation?: string
+

Assigned or determined scene orientation based on the Mode. +When assigning the Mode to AUTO, this field is optional and will be ignored by the device. +When assigning the Mode to MANUAL, this field is required and the device will return an InvalidArgs fault if missing

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/SearchCapabilities.html b/docs/interfaces/SearchCapabilities.html new file mode 100644 index 00000000..2e1f733b --- /dev/null +++ b/docs/interfaces/SearchCapabilities.html @@ -0,0 +1,73 @@ +SearchCapabilities | onvif
+
+ +
+
+
+
+ +

Interface SearchCapabilities

+
+

Hierarchy

+
    +
  • SearchCapabilities
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
XAddr: string
+
+ +
metadataSearch: boolean
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/SecurityCapabilities.html b/docs/interfaces/SecurityCapabilities.html new file mode 100644 index 00000000..b4efc1d2 --- /dev/null +++ b/docs/interfaces/SecurityCapabilities.html @@ -0,0 +1,141 @@ +SecurityCapabilities | onvif
+
+ +
+
+
+
+ +

Interface SecurityCapabilities

+
+

Security capabilities

+
+
+

Hierarchy

+
    +
  • SecurityCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
RELToken: boolean
+

Indicates support for WS-Security REL token

+
+
+ +
SAMLToken: boolean
+

Indicates support for WS-Security SAML token

+
+
+ +
TLS1.1: boolean
+

Indicates support for TLS 1.1

+
+
+ +
TLS1.2: boolean
+

Indicates support for TLS 1.2

+
+
+ +
X.509Token: boolean
+

Indicates support for WS-Security X.509 token

+
+
+ +
accessPolicyConfig: boolean
+

Indicates support for access policy configuration

+
+
+ +
+
+ +
kerberosToken: boolean
+

Indicates support for WS-Security Kerberos token

+
+
+ +
onboardKeyGeneration: boolean
+

Indicates support for onboard key generation

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/SecurityCapabilitiesExtension.html b/docs/interfaces/SecurityCapabilitiesExtension.html new file mode 100644 index 00000000..3e62df71 --- /dev/null +++ b/docs/interfaces/SecurityCapabilitiesExtension.html @@ -0,0 +1,75 @@ +SecurityCapabilitiesExtension | onvif
+
+ +
+
+
+
+ +

Interface SecurityCapabilitiesExtension

+
+

Hierarchy

+
    +
  • SecurityCapabilitiesExtension
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
TLS1.0: boolean
+

Indicates support for TLS 1.0

+
+
+ +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/SecurityCapabilitiesExtension2.html b/docs/interfaces/SecurityCapabilitiesExtension2.html new file mode 100644 index 00000000..614b9f8e --- /dev/null +++ b/docs/interfaces/SecurityCapabilitiesExtension2.html @@ -0,0 +1,82 @@ +SecurityCapabilitiesExtension2 | onvif
+
+ +
+
+
+
+ +

Interface SecurityCapabilitiesExtension2

+
+

Hierarchy

+
    +
  • SecurityCapabilitiesExtension2
+
+
+
+ +
+
+

Properties

+
+ +
dot1X: boolean
+
+ +
remoteUserHandling: boolean
+
+ +
supportedEAPMethod?: number
+

EAP Methods supported by the device. The int values refer to the IANA EAP Registry

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Space1DDescription.html b/docs/interfaces/Space1DDescription.html new file mode 100644 index 00000000..0cc6c525 --- /dev/null +++ b/docs/interfaces/Space1DDescription.html @@ -0,0 +1,77 @@ +Space1DDescription | onvif
+
+ +
+
+
+
+ +

Interface Space1DDescription

+
+

Hierarchy

+
    +
  • Space1DDescription
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
URI: string
+

A URI of coordinate systems

+
+
+ +
XRange: Range
+

A range of x-axis

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/Space2DDescription.html b/docs/interfaces/Space2DDescription.html new file mode 100644 index 00000000..1cff834a --- /dev/null +++ b/docs/interfaces/Space2DDescription.html @@ -0,0 +1,86 @@ +Space2DDescription | onvif
+
+ +
+
+
+
+ +

Interface Space2DDescription

+
+

Hierarchy

+
    +
  • Space2DDescription
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
URI: string
+

A URI of coordinate systems

+
+
+ +
XRange: Range
+

A range of x-axis

+
+
+ +
YRange: Range
+

A range of y-axis

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/SystemCapabilities.html b/docs/interfaces/SystemCapabilities.html new file mode 100644 index 00000000..1c687d26 --- /dev/null +++ b/docs/interfaces/SystemCapabilities.html @@ -0,0 +1,159 @@ +SystemCapabilities | onvif
+
+ +
+
+
+
+ +

Interface SystemCapabilities

+
+

System capabilities

+
+
+

Hierarchy

+
    +
  • SystemCapabilities
+
+
+
+ +
+
+

Properties

+
+ +
discoveryBye: boolean
+

Indicates support for WS Discovery resolve requests

+
+
+ +
discoveryResolve: boolean
+

Indicates whether or not WS Discovery resolve requests are supported

+
+
+ +
+
+ +
firmwareUpgrade: boolean
+

Indicates support for firmware upgrade through MTOM

+
+
+ +
httpFirmwareUpgrade?: boolean
+

Indicates support for firmware upgrade through HTTP

+
+
+ +
httpSystemBackup?: boolean
+

Indicates support for system backup through HTTP

+
+
+ +
httpSystemLogging?: boolean
+

Indicates support for retrieval of system logging through HTTP

+
+
+ +
remoteDiscovery: boolean
+

Indicates support for remote discovery

+
+
+ +
supportedVersions: OnvifVersion
+

Indicates supported ONVIF version(s)

+
+
+ +
systemBackup: boolean
+

Indicates support for system backup through MTOM

+
+
+ +
systemLogging: boolean
+

Indicates support for retrieval of system logging through MTOM

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/SystemCapabilitiesExtension.html b/docs/interfaces/SystemCapabilitiesExtension.html new file mode 100644 index 00000000..c8e06456 --- /dev/null +++ b/docs/interfaces/SystemCapabilitiesExtension.html @@ -0,0 +1,94 @@ +SystemCapabilitiesExtension | onvif
+
+ +
+
+
+
+ +

Interface SystemCapabilitiesExtension

+
+

Hierarchy

+
    +
  • SystemCapabilitiesExtension
+
+
+
+ +
+
+

Properties

+
+ +
extension?: any
+
+ +
httpFirmwareUpgrade?: boolean
+
+ +
httpSupportInformation?: boolean
+
+ +
httpSystemBackup?: boolean
+
+ +
httpSystemLogging?: boolean
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ToneCompensation.html b/docs/interfaces/ToneCompensation.html new file mode 100644 index 00000000..aed0f93a --- /dev/null +++ b/docs/interfaces/ToneCompensation.html @@ -0,0 +1,84 @@ +ToneCompensation | onvif
+
+ +
+
+
+
+ +

Interface ToneCompensation

+
+

Hierarchy

+
    +
  • ToneCompensation
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
extension?: any
+
+ +
level?: number
+

Optional level parameter specified with unitless normalized value from 0.0 to +1.0

+
+
+ +
mode: string
+

Parameter to enable/disable or automatic ToneCompensation feature. Its options shall be chosen from tt:ToneCompensationMode Type

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoAnalyticsConfiguration.html b/docs/interfaces/VideoAnalyticsConfiguration.html new file mode 100644 index 00000000..c95daf4d --- /dev/null +++ b/docs/interfaces/VideoAnalyticsConfiguration.html @@ -0,0 +1,101 @@ +VideoAnalyticsConfiguration | onvif
+
+ +
+
+
+
+ +

Interface VideoAnalyticsConfiguration

+
+

Hierarchy

+
    +
  • VideoAnalyticsConfiguration
+
+
+
+ +
+
+

Properties

+
+ +
analyticsEngineConfiguration: AnalyticsEngineConfiguration
+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
ruleEngineConfiguration: RuleEngineConfiguration
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount: number
+

Number of internal references currently using this configuration. +This informational parameter is read-only. Deprecated for Media2 Service.

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoEncoder2Configuration.html b/docs/interfaces/VideoEncoder2Configuration.html new file mode 100644 index 00000000..d0a83804 --- /dev/null +++ b/docs/interfaces/VideoEncoder2Configuration.html @@ -0,0 +1,165 @@ +VideoEncoder2Configuration | onvif
+
+ +
+
+
+
+ +

Interface VideoEncoder2Configuration

+
+

Hierarchy

+
    +
  • VideoEncoder2Configuration
+
+
+
+ +
+
+

Properties

+
+ +
encoding: string
+

Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types +https://www.iana.org/assignments/media-types/media-types.xhtml#video

+
+
+ +
govLength: number
+

Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. +An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, +and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames

+
+
+ +
guaranteedFrameRate: boolean
+

A value of true indicates that frame rate is a fixed value rather than an upper limit, +and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. +Default is false.

+
+
+ + +

Defines the multicast settings that could be used for video streaming

+
+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
profile: string
+

The encoder profile as defined in tt:VideoEncodingProfiles

+
+
+ +
quality: number
+

Relative value for the video quantizers and the quality of the video. +A high value within supported quality range means higher quality

+
+
+ +
rateControl?: VideoRateControl2
+

Optional element to configure rate control related parameters.

+
+
+ +
resolution: VideoResolution
+

Configured video resolution

+
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount?: number
+

Number of internal references currently using this configuration. +This informational parameter is read-only. Deprecated for Media2 Service.

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoEncoderConfiguration.html b/docs/interfaces/VideoEncoderConfiguration.html new file mode 100644 index 00000000..0fb439b7 --- /dev/null +++ b/docs/interfaces/VideoEncoderConfiguration.html @@ -0,0 +1,171 @@ +VideoEncoderConfiguration | onvif
+
+ +
+
+
+
+ +

Interface VideoEncoderConfiguration

+
+

Hierarchy

+
    +
  • VideoEncoderConfiguration
+
+
+
+ +
+
+

Properties

+
+ + +

Optional element to configure H.264 related parameters.

+
+
+ + +

Optional element to configure Mpeg4 related parameters

+
+
+ +
encoding: "JPEG" | "MPEG4" | "H264"
+

Used video codec, either Jpeg, H.264 or Mpeg4

+
+
+ +
guaranteedFrameRate: boolean
+

A value of true indicates that frame rate is a fixed value rather than an upper limit, +and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. +Default is false.

+
+
+ + +

Defines the multicast settings that could be used for video streaming

+
+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
quality: number
+

Relative value for the video quantizers and the quality of the video. +A high value within supported quality range means higher quality

+
+
+ +
rateControl?: VideoRateControl
+

Optional element to configure rate control related parameters.

+
+
+ +
resolution: VideoResolution
+

Configured video resolution

+
+
+ +
sessionTimeout: string
+

The rtsp session timeout for the related video stream

+
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount: number
+

Number of internal references currently using this configuration. +This informational parameter is read-only. Deprecated for Media2 Service.

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoRateControl.html b/docs/interfaces/VideoRateControl.html new file mode 100644 index 00000000..3485a805 --- /dev/null +++ b/docs/interfaces/VideoRateControl.html @@ -0,0 +1,86 @@ +VideoRateControl | onvif
+
+ +
+
+
+
+ +

Interface VideoRateControl

+
+

Hierarchy

+
    +
  • VideoRateControl
+
+
+
+ +
+
+

Properties

+
+ +
bitrateLimit: number
+

the maximum output bitrate in kbps

+
+
+ +
encodingInterval: number
+

Interval at which images are encoded and transmitted. (A value of 1 means that every frame is encoded, a value of 2 means that every 2nd frame is encoded ...)

+
+
+ +
frameRateLimit: number
+

Maximum output framerate in fps. If an EncodingInterval is provided the resulting encoded framerate will be reduced by the given factor

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoRateControl2.html b/docs/interfaces/VideoRateControl2.html new file mode 100644 index 00000000..c373a2a8 --- /dev/null +++ b/docs/interfaces/VideoRateControl2.html @@ -0,0 +1,86 @@ +VideoRateControl2 | onvif
+
+ +
+
+
+
+ +

Interface VideoRateControl2

+
+

Hierarchy

+
    +
  • VideoRateControl2
+
+
+
+ +
+
+

Properties

+
+ +
bitrateLimit: number
+

the maximum output bitrate in kbps

+
+
+ +
constantBitRate: boolean
+

Enforce constant bitrate

+
+
+ +
frameRateLimit: number
+

Desired frame rate in fps. The actual rate may be lower due to e.g. performance limitations

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoResolution.html b/docs/interfaces/VideoResolution.html new file mode 100644 index 00000000..6abf65c9 --- /dev/null +++ b/docs/interfaces/VideoResolution.html @@ -0,0 +1,77 @@ +VideoResolution | onvif
+
+ +
+
+
+
+ +

Interface VideoResolution

+
+

Hierarchy

+
    +
  • VideoResolution
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
height: number
+

Number of the lines of the Video image

+
+
+ +
width: number
+

Number of the columns of the Video image

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoSource.html b/docs/interfaces/VideoSource.html new file mode 100644 index 00000000..c0bc2795 --- /dev/null +++ b/docs/interfaces/VideoSource.html @@ -0,0 +1,102 @@ +VideoSource | onvif
+
+ +
+
+
+
+ +

Interface VideoSource

+
+

Hierarchy

+
    +
  • VideoSource
+
+
+
+ +
+
+

Properties

+
+ +
+
+ +
framerate: number
+

Frame rate in frames per second

+
+
+ +
imaging?: ImagingSettings
+

Optional configuration of the image sensor

+
+
+ +
resolution: VideoResolution
+

Horizontal and vertical resolution

+
+
+ +
token: string
+

Unique identifier referencing the physical entity

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoSourceConfiguration.html b/docs/interfaces/VideoSourceConfiguration.html new file mode 100644 index 00000000..dc37115f --- /dev/null +++ b/docs/interfaces/VideoSourceConfiguration.html @@ -0,0 +1,121 @@ +VideoSourceConfiguration | onvif
+
+ +
+
+
+
+ +

Interface VideoSourceConfiguration

+
+

Hierarchy

+
    +
  • VideoSourceConfiguration
+
+
+
+ +
+
+

Properties

+
+ +
bounds: IntRectangle
+

Rectangle specifying the Video capturing area. The capturing area shall not be larger than the whole Video source area

+
+
+ +
+
+ +
name: string
+

User readable name. Length up to 64 characters

+
+
+ +
sourceToken: string
+

Reference to the physical input

+
+
+ +
token: string
+

Token that uniquely references this configuration. Length up to 64 characters

+
+
+ +
useCount: number
+

Number of internal references currently using this configuration +This informational parameter is read-only. Deprecated for Media2 Service

+
+
+ +
viewMode: string
+

Readonly parameter signalling Source configuration's view mode, for devices supporting different view modes as defined in tt:viewModes

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoSourceConfigurationExtension.html b/docs/interfaces/VideoSourceConfigurationExtension.html new file mode 100644 index 00000000..5b4acd31 --- /dev/null +++ b/docs/interfaces/VideoSourceConfigurationExtension.html @@ -0,0 +1,78 @@ +VideoSourceConfigurationExtension | onvif
+
+ +
+
+
+
+ +

Interface VideoSourceConfigurationExtension

+
+

Hierarchy

+
    +
  • VideoSourceConfigurationExtension
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
+
+ +
rotate: Rotate
+

Optional element to configure rotation of captured image. What resolutions a device supports shall be unaffected by the Rotate parameters. +If a device is configured with Rotate=AUTO, the device shall take control over the Degree parameter and automatically update it so that a client can query current rotation. +The device shall automatically apply the same rotation to its pan/tilt control direction depending on the following condition: +if Reverse=AUTO in PTControlDirection or if the device doesn’t support Reverse in PTControlDirection

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoSourceConfigurationExtension2.html b/docs/interfaces/VideoSourceConfigurationExtension2.html new file mode 100644 index 00000000..aed7c0e6 --- /dev/null +++ b/docs/interfaces/VideoSourceConfigurationExtension2.html @@ -0,0 +1,77 @@ +VideoSourceConfigurationExtension2 | onvif
+
+ +
+
+
+
+ +

Interface VideoSourceConfigurationExtension2

+
+

Hierarchy

+
    +
  • VideoSourceConfigurationExtension2
+
+
+
+ +
+
+

Properties

+
+ +
lensDescription?: LensDescription
+

Optional element describing the geometric lens distortion. Multiple instances for future variable lens support

+
+
+ +
sceneOrientation: SceneOrientation
+

Optional element describing the scene orientation in the camera’s field of view

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/VideoSourceExtension.html b/docs/interfaces/VideoSourceExtension.html new file mode 100644 index 00000000..533eec98 --- /dev/null +++ b/docs/interfaces/VideoSourceExtension.html @@ -0,0 +1,75 @@ +VideoSourceExtension | onvif
+
+ +
+
+
+
+ +

Interface VideoSourceExtension

+
+

Hierarchy

+
    +
  • VideoSourceExtension
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
extension?: any
+
+ + +

Optional configuration of the image sensor. To be used if imaging service 2.00 is supported

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/WhiteBalance.html b/docs/interfaces/WhiteBalance.html new file mode 100644 index 00000000..385bd209 --- /dev/null +++ b/docs/interfaces/WhiteBalance.html @@ -0,0 +1,88 @@ +WhiteBalance | onvif
+
+ +
+
+
+
+ +

Interface WhiteBalance

+
+

Hierarchy

+
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
cbGain: number
+

Bgain (unitless)

+
+
+ +
crGain: number
+

Rgain (unitless)

+
+
+ +
mode: "AUTO" | "MANUAL"
+

Auto whitebalancing mode (auto/manual)

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/WhiteBalance20.html b/docs/interfaces/WhiteBalance20.html new file mode 100644 index 00000000..6ee9a9c3 --- /dev/null +++ b/docs/interfaces/WhiteBalance20.html @@ -0,0 +1,98 @@ +WhiteBalance20 | onvif
+
+ +
+
+
+
+ +

Interface WhiteBalance20

+
+

Hierarchy

+
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
cbGain: number
+

Bgain (unitless)

+
+
+ +
crGain: number
+

Rgain (unitless)

+
+
+ +
extension: any
+
+ +
mode: "AUTO" | "MANUAL"
+

Auto whitebalancing mode (auto/manual)

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/WideDynamicRange.html b/docs/interfaces/WideDynamicRange.html new file mode 100644 index 00000000..b9b6f84e --- /dev/null +++ b/docs/interfaces/WideDynamicRange.html @@ -0,0 +1,77 @@ +WideDynamicRange | onvif
+
+ +
+
+
+
+ +

Interface WideDynamicRange

+
+

Hierarchy

+
    +
  • WideDynamicRange
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
level: number
+

Optional level parameter (unitless)

+
+
+ +
mode: "OFF" | "ON"
+

White dynamic range (on/off)

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/WideDynamicRange20.html b/docs/interfaces/WideDynamicRange20.html new file mode 100644 index 00000000..e67c0a4c --- /dev/null +++ b/docs/interfaces/WideDynamicRange20.html @@ -0,0 +1,77 @@ +WideDynamicRange20 | onvif
+
+ +
+
+
+
+ +

Interface WideDynamicRange20

+
+

Hierarchy

+
    +
  • WideDynamicRange20
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
level?: number
+

Optional level parameter (unit unspecified)

+
+
+ +
mode?: "OFF" | "ON"
+

Wide dynamic range mode (on/off)

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/ZoomLimits.html b/docs/interfaces/ZoomLimits.html new file mode 100644 index 00000000..768c3538 --- /dev/null +++ b/docs/interfaces/ZoomLimits.html @@ -0,0 +1,66 @@ +ZoomLimits | onvif
+
+ +
+
+
+
+ +

Interface ZoomLimits

+
+

Hierarchy

+
    +
  • ZoomLimits
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html new file mode 100644 index 00000000..08872581 --- /dev/null +++ b/docs/modules.html @@ -0,0 +1,275 @@ +onvif
+
+ +
+
+
+
+

onvif

+
+
+

Index

+
+

Classes

+
+
+

Interfaces

+
ActiveSource +AnalyticsCapabilities +AnalyticsDeviceCapabilities +AnalyticsEngineConfiguration +AudioDecoderConfiguration +AudioEncoder2Configuration +AudioEncoderConfiguration +AudioOutputConfiguration +AudioSourceConfiguration +BacklightCompensation +BacklightCompensation20 +Capabilities +CapabilitiesExtension +Config +ConfigurationSet +Defogging +DeviceCapabilities +DeviceIOCapabilities +DeviceInformation +DiscoveryOptions +DisplayCapabilities +EventCapabilities +EventSubscription +Exposure +Exposure20 +FocusConfiguration +FocusConfiguration20 +H264Configuration +IOCapabilities +IOCapabilitiesExtension +IPAddress +ImageStabilization +ImagingCapabilities +ImagingSettings +ImagingSettings20 +ImagingSettingsExtension20 +ImagingSettingsExtension202 +ImagingSettingsExtension203 +IntRectangle +IrCutFilterAutoAdjustment +ItemList +LensDescription +LensOffset +LensProjection +MediaCapabilities +MediaCapabilitiesExtension +MediaProfile +MetadataConfiguration +Mpeg4Configuration +MulticastConfiguration +NetworkCapabilities +NetworkCapabilitiesExtension +NoiseReduction +OnvifOptions +OnvifRequestOptions +OnvifService +OnvifServices +OnvifVersion +PTControlDirection +PTZCapabilities +PTZConfiguration +PTZConfigurationExtension +PTZFilter +PTZSpeed +PanTiltLimits +Profile +ProfileCapabilities +ProfileExtension +Range +RealTimeStreamingCapabilities +ReceiverCapabilities +RecordingCapabilities +Rectangle +ReplayCapabilities +Rotate +RuleEngineConfiguration +SceneOrientation +SearchCapabilities +SecurityCapabilities +SecurityCapabilitiesExtension +SecurityCapabilitiesExtension2 +Space1DDescription +Space2DDescription +SystemCapabilities +SystemCapabilitiesExtension +ToneCompensation +VideoAnalyticsConfiguration +VideoEncoder2Configuration +VideoEncoderConfiguration +VideoRateControl +VideoRateControl2 +VideoResolution +VideoSource +VideoSourceConfiguration +VideoSourceConfigurationExtension +VideoSourceConfigurationExtension2 +VideoSourceExtension +WhiteBalance +WhiteBalance20 +WideDynamicRange +WideDynamicRange20 +ZoomLimits +
+
+

Type Aliases

+
+
+

Variables

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/AnyURI.html b/docs/types/AnyURI.html new file mode 100644 index 00000000..73a337fb --- /dev/null +++ b/docs/types/AnyURI.html @@ -0,0 +1,155 @@ +AnyURI | onvif
+
+ +
+
+
+
+ +

Type alias AnyURI

+
AnyURI: string
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/Duration.html b/docs/types/Duration.html new file mode 100644 index 00000000..b0e51eca --- /dev/null +++ b/docs/types/Duration.html @@ -0,0 +1,155 @@ +Duration | onvif
+
+ +
+
+
+
+ +

Type alias Duration

+
Duration: string
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/Name.html b/docs/types/Name.html new file mode 100644 index 00000000..68390a9c --- /dev/null +++ b/docs/types/Name.html @@ -0,0 +1,155 @@ +Name | onvif
+
+ +
+
+
+
+ +

Type alias Name

+
Name: string
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/ReferenceToken.html b/docs/types/ReferenceToken.html new file mode 100644 index 00000000..2cc9b1b0 --- /dev/null +++ b/docs/types/ReferenceToken.html @@ -0,0 +1,155 @@ +ReferenceToken | onvif
+
+ +
+
+
+
+ +

Type alias ReferenceToken

+
ReferenceToken: string
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/Discovery.html b/docs/variables/Discovery.html new file mode 100644 index 00000000..aa8def18 --- /dev/null +++ b/docs/variables/Discovery.html @@ -0,0 +1,164 @@ +Discovery | onvif
+
+ +
+
+
+
+ +

Variable DiscoveryConst

+
Discovery: DiscoverySingleton = DiscoverySingleton.getInstance
+

Singleton for the discovery to provide probe method +Discovery.probe

+ +

Example

import { Discovery } from 'onvif';
Discovery.on('device', async (cam) => {
// function would be called as soon as NVT responses
cam.username = <USERNAME>;
cam.password = <PASSWORD>;
await cam.connect();
})
Discovery.probe(); +
+ +

Example

import { Discovery } from 'onvif';
(async () => {
const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect());
console.log(await cams[0]?.getSystemDateAndTime());
})(); +
+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file From 7b1f3afb47735323213e645666eb515db09ae1ed Mon Sep 17 00:00:00 2001 From: silqa <115152647+silqa@users.noreply.github.com> Date: Mon, 24 Oct 2022 20:40:49 +0300 Subject: [PATCH 069/112] Update README.md --- README.md | 413 +----------------------------------------------------- 1 file changed, 7 insertions(+), 406 deletions(-) diff --git a/README.md b/README.md index cba37d4c..ef2ffda5 100644 --- a/README.md +++ b/README.md @@ -1,424 +1,25 @@ # ONVIF -[![Build Status](https://travis-ci.org/agsh/onvif.png)](https://travis-ci.org/agsh/onvif) -[![Coverage Status](https://img.shields.io/coveralls/agsh/onvif.svg)](https://coveralls.io/r/agsh/onvif?branch=master) -[![NPM version](https://img.shields.io/npm/v/onvif.svg)](https://www.npmjs.com/package/onvif) - ONVIF Client protocol Profile S (Live Streaming) and Profile G (Replay) Node.js implementation. This is a wrapper to ONVIF protocol which allows you to get information about your NVT (network video transmitter) device, its media sources, control PTZ (pan-tilt-zoom) movements and manage presets, detect devices in your network and control its events. It will also allow you to get information about your NVR (network video recorder) Profile G device and obtain a list of recordings. -The library uses NodeJS. And works on the server-side. +The library uses NodeJS. [![ONVIF](https://www.onvif.org/wp-content/themes/onvif-public/images/logo.png)](http://onvif.org) -## Installation - -### NPM - -`npm install onvif` - install latest stable version - -`npm install agsh/onvif` - install latest version from GitHub - -`npm install agsh/onvif#dev` - install latest development version - -### Clone the latest version from github -`git clone https://github.com/agsh/onvif.git` - -### Tests -In the library directory run `npm test` - -By default the tests use a mockup server to generate ONVIF replies. - -To test with the real device, set appropriate environment variables `HOSTNAME`, `USERNAME`, `PASSWORD`, `PORT` and run -tests. - -### Documentation -To build jsdoc for the library with default theme run `npm run jsdoc`. Otherwise use `jsdoc` with sources from -`./lib/*.js` - -## Quick example -This example asks your camera to look up and starts a web server at port 3030 that distributes a web page with vlc-plugin -container which translates video from the camera. -```javascript -var - http = require('http'), - Cam = require('onvif').Cam; - -new Cam({ - hostname: , - username: , - password: -}, function(err) { - this.absoluteMove({x: 1, y: 1, zoom: 1}); - this.getStreamUri({protocol:'RTSP'}, function(err, stream) { - http.createServer(function (req, res) { - res.writeHead(200, {'Content-Type': 'text/html'}); - res.end('' + - '' + - ''); - }).listen(3030); - }); -}); -``` - -## Other examples (located in the Examples Folder on the Github) -* example.js - Move camera to a pre-defined position then server the RTSP URL up via a HTTP Server. Click on the RTSP address in a browser to open the video (if you have the VLC plugin installed) -* example2.js - takes an IP address range, scans the range for ONVIF devices (brute force scan) and displays information about each device found including make and model and RTSP URLs -For Profile S Cameras and Encoders it displays the default RTSP address -For Profile G Recorders it displays the RTSP address of the first recording -* example3.js - reads the command line cursor keys and sends PTZ commands to the Camera -* example4.js - uses Discovery to find cameras on the local network -* example5.js - connect to a camera via SOCKS proxy. Note SSH includes a SOCKS proxy so you can use this example to connect to remote cameras via SSH -* example6.js - ONVIF Events. Example can be switched btween using Pull Point Subscriptions and using Base Subscribe with a built in mini HTTP Server -* example7.js - example using a Promise API. It uses 'promisify' to convert the ONVIF Library to return promises and uses Await to wait for responses -* example8.js - example setting OSD On Screen Display. (also uses Promises API) - -## Troubleshooting -Different cameras have different ONVIF implementation. I've tested this module only with a couple of devices. So if you got different problems with this library, please let me know via e-mail. Else please just send the model of your -camera to me. - -# API - -## You can find this page and full API class documentation here: [http://agsh.github.io/onvif/](http://agsh.github.io/onvif/) ## - -Short description of library possibilities is below. - -## Discovery -Since 0.2.7 version library supports WS-Discovery of NVT devices. Currently it uses only `Probe` SOAP method that just works well. -You can find devices in your subnetwork using `probe` method of the Discovery singleton. -Discovery is an EventEmitter inheritor, so you can wait until discovery timeout, or subscribe on `device` event. -You must subscribe to the `error` event as a device on your network could reply with bad XML -Here some examples: - -```js -var onvif = require('onvif'); -onvif.Discovery.on('device', function(cam){ -// function will be called as soon as NVT responds - cam.username = ; - cam.password = ; - cam.connect(console.log); -}) -// Must have an error handler to catch bad replies from the network -onvif.Discovery.on('error', function (err,xml) { - // function called as soon as NVT responds, but this library could not parse the response - console.log('Discovery error ' + err); -}); -onvif.Discovery.probe(); -``` - -```js -var onvif = require('onvif'); -// Must have an error handler to catch bad replies from the network -onvif.Discovery.on('error', function (err,xml) { - console.log('Discovery error ' + err); -}); -onvif.Discovery.probe(function(err, cams) { -// function will be called only after timeout (5 sec by default) - if (err) { - // There is a device on the network returning bad discovery data - // Probe results will be incomplete - throw err; - } - cams.forEach(function(cam) { - cam.username = ; - cam.password = ; - cam.connect(console.log); - }); -}); -``` - -In all of that cases you've got disconnected cameras. To access each camera (and issue ONVIF commands) you normally need -the tuple `username:password`. So, as shown in the examples, you can assign these properties and call `connect` method to -get full functionality. - -### Discovery.probe(options, callback) -Options - -- `timeout`, number. Time the probe method will wait NVT responses in ms -- `resolve`, boolean. If this argument is false, all discovered NVTs would be presented as data object instead of Cam instance - -### Discovery events -- `device(cam, remoteInfo, responseXML)` fires on device discover. `cam` is a Cam instance, remoteInfo is an object with network information - and responseXML is a body of SOAP response -- `error(error)` fires on some UDP error or on bad SOAP response from NVT - -## Cam class - -```javascript -var Cam = require('onvif').Cam; -``` - -## new Cam(options, callback) - -Options are: -- hostname -- username, password (optional, to deal with majority of functions) -- port (optional) - -The library calls connect() automatically which executes the `getSystemDateAndTime`, `getCapabilities` and other methods. -Note on username and password: -- Some cameras do not require username:password credentials. -- If a camera does require a username:password but you do not provide them, you will be limited to executing a few ONVIF methods that can operate without credentials, for example you can execute only `getSystemDateAndTime` method. - -Callback (optional) executes when the cam is initialised. Single argument for this function is possible error. - -#### Technical description - -When the cam object is created it automatically sends a `getCapabilities` command to the ONVIF device. If the device is a camera or encoder (NVT) it sends two commands to the ONVIF device: -`getVideoSources` and `getProfiles`. It fills corresponding properties of an object: - -+ capabilities - - device - - events - - imaging - - media - - PTZ - - extension -+ uri (this is a links to different NVT services) -+ videoSources - - $.token - - framerate - - resolution -+ profiles, array of profile object - - name - - videoSourceConfiguration - - videoEncoderConfiguration - - PTZConfiguration - -After that it runs `getActiveSources` method. It iterates over all video sources and tries to find out proper configuration -for profile and videosource. First matching profile becomes a member of defaultProfiles array and video source configuration -with ptz configuration becomes a member of activeSources array. - -Configuration for the first or the only one video source becomes defaultProfile and activeSource properties. All methods -without passing options object use it. You can change it manually at any time. - -+ defaultProfile (link to the first profile in profiles) -+ activeSource (based on the default profile) - - sourceToken - - profileToken - - encoding - - width - - height - - fps - - bitrate - - ptz - -### connect(callback) -Connect to the camera and fill device information properties with `getSystemDateAndTime`, `getCapabilities`, `getVideoSources`, `getProfiles` methods - -See more detailed information at http://www.onvif.org/ver10/media/wsdl/media.wsdl -After cam initialisation we can run several ONVIF commands. -There are several common methods that work without credentials. Here are they: `getSystemDateAndTime`. - -### getSystemDateAndTime(callback) -Returns a Date object with current camera datetime in the callback. -The ONVIF Standard says this would work without credentials (passed `username` and `password` arguments) so that the timeShift difference between the local clock and the NVT's onboard clock can be calculated for SOAP Authentication. However some devices claiming ONVIF support require a password and the library will re-try the connection if a username and password are available. - -### getDeviceInformation(callback) -*Device.* Returns a device information, such as manufacturer, model and firmware version in the callback - -### getServices(callback) -*Device.* Returns in callback and assigns to `#services` property an array consists of objects with properties: `namespace`, `XAddr`, `version` - -### getServiceCapabilities(callback) -*Device.* Returns in callback and assigns to `#serviceCapabilities` property the capabilities of the device service (not media): -network, security and system. If your device supports some auxiliary capabilities they will be there too. - -### getStreamUri(options, callback) -*Media.* Returns a URI that can be used to initiate a live media stream using RTSP as the control protocol -The options are: - -- `stream` (optional) - defines if a multicast or unicast stream is requested. Possible values are: 'RTP-Unicast' (default), 'RTP-Multicast' -- `protocol` (optional) - defines the network protocol for streaming. Possible values are: 'UDP', 'TCP', 'RTSP' (default), 'HTTP' -- `profileToken` (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is `#activeSource.profileToken` - -### getSnapshotUri(options, callback) -*Media.* Obtain a JPEG snapshot URI from the device. - -### getPresets(options, callback) -Returns the saved presets as an a key-value object where the key is the name of a preset and a value is a preset token. -This method also stores the presets information in a `#presets` property of an object. - -The options are: - -* `profileToken` (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is `#activeSource.profileToken` - -### gotoPreset(options, callback) -*PTZ.* Operation to go to a saved preset position for the PTZ node in the selected profile. - -The options are: - -* `profileToken` (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is `#activeSource.profileToken` -* `preset` - the name of preset. List of presets you can get by `#getPresets` method or in `#presets` property. - -### setPreset(options, callback) -*PTZ.* Operation to set the current position as a preset for the PTZ node in the selected profile. If `presetToken` is passed as an option, then the preset for which that token is attached will be replaced. After success, you should re-fetch the presets with `#getPresets` method. - -The options are: - -* `profileToken` (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is `#activeSource.profileToken` -* `presetName` - the name to give to the preset. (optional) is this is a preset update. - -### removePreset(options, callback) -*PTZ.* Operation to remove a preset specified by the preset token. After success, you should re-fetch the presets with `#getPresets` method. - -The options are: - -* `profileToken` (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is `#activeSource.profileToken` -* `presetToken` - the preset token to use for preset removal (this will be the `value` of a preset object found in `#presets` after calling the `#getPresets` method. - -### gotoHomePosition(options, callback) -*PTZ.* Operation to go to the saved `home` position for the PTZ node in the selected profile. If no `home` position has been saved, the ONVIF camera will do nothing. - -The options are: - -* `profileToken` (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is `#activeSource.profileToken` -* `speed` An object with properties - - `x` Pan speed, float within 0 to 1 - - `y` Tilt speed, float within 0 to 1 - - `zoom` Zoom speed, float within 0 to 1 - - If the speed option is omitted, the default speed set by the PTZConfiguration will be used. - -### setHomePosition(options, callback) -*PTZ.* Operation to set the current position as the `home` position for the PTZ node in the selected profile. - -The options are: - -* `profileToken` (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is `#activeSource.profileToken` - -### getNodes(callback) -*PTZ.* Returns the properties of the current PTZ node, if it exists. -Use this function to get maximum number of presets, ranges of admitted values for x, y, zoom, iris, focus. -Sets all information into `#nodes` property. - -### relativeMove(options, callback) -*PTZ.* This is a relative pan-tilt-zoom method. Options for this method is a delta between desired and current position of the camera. - -The options are: - -- `x` Pan, number or a string within -1 to 1, optional -- `y` Tilt, number or a string within -1 to 1, optional -- `zoom` Zoom, number or a string within 0 to 1, optional -- `speed` An object with properties - * `x` Pan speed, float within 0 to 1 - * `y` Tilt speed, float within 0 to 1 - * `zoom` Zoom speed, float within 0 to 1 - - If the speed option is omitted, the default speed set by the PTZConfiguration will be used. - -Callback is optional and means essentially nothing - -### absoluteMove(options, callback) -*PTZ.* This is an absolute pan-tilt-zoom method. Options for this method is an absolute position of the camera. - -The options are: - -- `x` Pan, number or a string within -1 to 1, optional -- `y` Tilt, number or a string within -1 to 1, optional -- `zoom` Zoom, number or a string within 0 to 1, optional -- `speed` An object with properties - * `x` Pan speed, float within 0 to 1 - * `y` Tilt speed, float within 0 to 1 - * `zoom` Zoom speed, float within 0 to 1 - - If the speed option is omitted, the default speed set by the PTZConfiguration will be used. - -Callback is optional and means essentially nothing - -### continuousMove(options, callback) -*PTZ.* Operation for continuous Pan/Tilt and Zoom movements - -The options are: - -- `x` Pan velocity, number or a string within -1 to 1, optional -- `y` Tilt velocity, number or a string within -1 to 1, optional -- `zoom` Zoom velocity, number or a string within -1 to 1, optional -- `timeout` Timeout in milliseconds, number. If timeout is omitted, movement will continue until `stop` command - -### stop(options, callback) -*PTZ.* Stop ongoing pan, tilt and zoom movements of absolute, relative and continuous type - -Options and callback are optional. The options properties are: -- `profileToken` (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is `#activeSource.profileToken` -- `panTilt` (optional) - set true when we want to stop ongoing pan and tilt movements. If `panTilt` arguments are not present, this command stops these movements. -- `zoom` (optional) - set true when we want to stop ongoing zoom movement. If `zoom` arguments are not present, this command stops ongoing zoom movement. +This is a new version of the ONVIF library. Previous version was written in JS, and this the typescript library with interfaces desbring ONVIF data structures. Right now some of the methods from the v.0.6.x were implemented, the list of supportrted ONVIF commands you can find here: https://github.com/agsh/onvif/blob/v1/IMPLEMENTED.md -### getStatus(options, callback) -*PTZ.* Returns an object with the current PTZ values. -```javascript -{ - position: { - x: 'pan position' - , y: 'tilt position' - , zoom: 'zoom' - } - , moveStatus: {} // camera moving - , utcTime: 'current camera datetime' -} -``` +The library will be updated because other methods are currently under development. -### getConfigurations(callback) -*PTZ.* Get all the existing PTZConfigurations from the device. Configurations saved into `#configurations` property +The documentation for the new library was generated by typedoc and you can find it here: https://htmlpreview.github.io/?https://github.com/agsh/onvif/blob/v1/docs/index.html -### getConfigurationOptions(configurationToken, callback) -*PTZ.* Get supported coordinate systems including their range limitations for selected configuration. Extends corresponding -configuration object +The code, which use the old version of the library (0.6.x), should work using the compatibility class: https://github.com/agsh/onvif/blob/v1/src/compatibility/cam.ts where all methods are located. -## Supported methods -* GetSystemDateAndTime -* GetCapabilities -* GetVideoSources -* GetProfiles -* GetServices -* GetDeviceInformation -* GetStreamUri -* GetSnapshotUri -* GetPresets -* GotoPreset -* RelativeMove -* AbsoluteMove -* ContinuousMove -* Stop -* GetStatus -* SystemReboot -* GetImagingSettings -* SetImagingSettings -* GetHostname -* GetScopes -* SetScopes -* GetRecordings -* GetReplayUri +Thanks a lot for your interest and I will be glad to any questions and comments! -## Changelog -- 0.6.5 Add MEDIA2 support, Profile T and GetServices XAddrs support for H265 cameras. Add support for HTTPS. Add Discovery.on('error') to examples. Add flag to only send Zoom, or only send Pan/Tilt for some broken cameras (Sony XP1 Xiongmai). Fix bug in GetServices. Improve setNTP command. API changed on getNetworkInterfaces and other methods that could return an Array or a Single Item. We now return an Array in all cases. Add example converting library so it uses Promises with Promisify. Enable 3702 Discovery on Windows for MockServer. Add MockServer test cases) -- 0.6.1 Workaround for cams that don't send date-time -- 0.6.0 Refactor modules for proper import in electron-based environment -- 0.5.5 Added ptz.`gotoHomePosition`, ptz.`setHomePosition`. Fixed exceptions in ptz.`getConfigurations` and utils.`parseSOAPString`. Added tests for ptz.`setPreset`, ptz.`removePreset`, ptz.`gotoHomePosition`, and ptz.`setHomePosition`. -- 0.5.4 Bumped for NPM. -- 0.5.3 Some fixes. Tests -- 0.5.2 `preserveAddress` property for NAT devices, discovery with multiple network interfaces (@Climax777) -- 0.5.1 Critical bugfix in SOAP-auth for some cams -- 0.5.0 Profile G support (@RogerHardiman), proper SOAP auth, nodejs support >= 0.12 -- 0.4.2 Bugfixes -- 0.4.1 Improved discovery (@sousandrei, @RogerHardiman) -- 0.4.0 Encoder support (@chriswiggins), Imaging service (@EastL) -- 0.3.1 EventEmitter-based events -- 0.3.0 Refactoring, documentation, event service basics -- 0.2.7 WS-Discovery +P.S. I still need device access to test the code, any help would be greatly appreciated. -## Links -WSDL schemes and docs: -- https://www.onvif.org/profiles/specifications/ -- [Operations index](http://www.onvif.org/onvif/ver20/util/operationIndex.html) -- http://www.onvif.org/onvif/ver10/tc/onvif_core_ver10.pdf -- http://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl -- http://www.onvif.org/ver10/media/wsdl/media.wsdl -- http://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl -- http://www.onvif.org/onvif/ver10/recording.wsdl -- http://www.onvif.org/onvif/ver10/replay.wsdl -- [ONVIF Application Programmer's Guide](http://www.onvif.org/Portals/0/documents/WhitePapers/ONVIF_WG-APG-Application_Programmer's_Guide.pdf) From ffd1ca0fa6d935739dffe4e7873d61d2c16f9d5c Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 20 Dec 2022 08:25:26 +0300 Subject: [PATCH 070/112] Add some tests --- compatibilityTest/ptz.js | 5 +++++ src/utils.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/compatibilityTest/ptz.js b/compatibilityTest/ptz.js index 1d2312fc..386add4d 100644 --- a/compatibilityTest/ptz.js +++ b/compatibilityTest/ptz.js @@ -186,6 +186,11 @@ describe('PTZ', () => { zoom : 0, }, done); }); + it('should work with only one parameter', (done) => { + cam.continuousMove({ + zoom : 0.1, + }, done); + }); }); describe('stop', () => { diff --git a/src/utils.ts b/src/utils.ts index e328d7ff..10426386 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -103,7 +103,7 @@ export async function parseSOAPString(rawXml: string): CamResponse { } // console.error('Fault:', reason, detail); - throw new Error(`ONVIF SOAP Fault: ${reason}${detail}`); + throw new Error(`ONVIF SOAP Fault: ${reason}${detail} ${rawXml}`); } return [result.envelope.body, xml]; } From 02b8fddee4c23d030f79fd120e44f85d9eeb4c04 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 3 Mar 2024 23:38:03 +0300 Subject: [PATCH 071/112] feat: onvif.device.setNTP method --- src/compatibility/cam.ts | 5 +++ src/device.ts | 66 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 9dd70636..62f73595 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -15,6 +15,7 @@ import { SetHomePositionOptions, SetPresetOptions, RelativeMoveOptions, ContinuousMoveOptions, } from '../ptz'; +import { SetNTPOptions } from '../device'; export type Callback = (error: any, result?: any) => void; export type CompatibilityAbsoluteMoveOptions = AbsoluteMoveOptions & { x?: number; y?: number; zoom?: number }; @@ -283,6 +284,10 @@ export class Cam extends EventEmitter { this.onvif.device.getNTP().then((result) => callback(null, result)).catch(callback); } + setNTP(options: SetNTPOptions, callback: Callback) { + this.onvif.device.setNTP(options).then((result) => callback(null, result)).catch(callback); + } + getDNS(callback: Callback) { this.onvif.device.getDNS().then((result) => callback(null, result)).catch(callback); } diff --git a/src/device.ts b/src/device.ts index dfd9b99a..d5e5f36a 100644 --- a/src/device.ts +++ b/src/device.ts @@ -417,6 +417,36 @@ export interface NTPInformation { extension?: any; } +export enum NetworkType { + IPv4 = 'IPv4', + IPv6 = 'IPv6', + DNS = 'DNS', +} + +export interface SetNTPOptions { + /* Indicates if NTP information is to be retrieved by using DHCP. */ + fromDHCP?: boolean; + NTPManual?: NTPManual[]; + // For backward compatibility + type?: NetworkType; + ipv4Address?: string; + ipv6Address?: string; + dnsName?: string; + extension?: string; +} + +export interface NTPManual { + /* Network host type. */ + type?: NetworkType; + /* IPv4 address. */ + IPv4Address?: string; // IPv4 address + /* IPv6 address. */ + IPv6Address?: string; + /* DNS name. */ + DNSname?: string; + extension?: any; +} + export interface DNSInformation { /* Indicates whether or not DNS information is retrieved from DHCP. */ fromDHCP: boolean; @@ -764,6 +794,42 @@ export class Device { return this.#NTP!; } + async setNTP(options: SetNTPOptions) { + if (!Array.isArray(options.NTPManual)) { + options.NTPManual = []; + } + // For backward compatibility + if (options.type || options.ipv4Address || options.ipv6Address || options.dnsName || options.extension) { + // Note the case changes to follow the xml parser rules + options.NTPManual.push({ + type : options.type, + IPv4Address : options.ipv4Address, + IPv6Address : options.ipv6Address, + DNSname : options.dnsName, + extension : options.extension, + }); + } + let body = '' + + `${options.fromDHCP}`; + if (options.NTPManual && Array.isArray(options.NTPManual)) { + options.NTPManual.forEach((NTPManual) => { + body += (NTPManual.type ? '' + + `${NTPManual.type}${ + NTPManual.IPv4Address ? `${NTPManual.IPv4Address}` : '' + }${NTPManual.IPv6Address ? `${NTPManual.IPv6Address}` : '' + }${NTPManual.DNSname ? `${NTPManual.DNSname}` : '' + }${NTPManual.extension ? `${NTPManual.extension}` : '' + }` : ''); + }); + } + body += ''; + const [data] = await this.onvif.request({ + service : 'device', + body, + }); + return linerase(data); + } + /** * This operation gets the DNS settings from a device. The device shall return its DNS configurations through the * GetDNS command. From 79e7a6d67c307a5fc6271b4a66127b473fc25110 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Mon, 4 Mar 2024 11:06:37 +0300 Subject: [PATCH 072/112] feat: update libraries --- package-lock.json | 3531 +++++++++++++++++++++++++++++---------------- package.json | 26 +- tsconfig.json | 2 +- 3 files changed, 2324 insertions(+), 1235 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d7ec1d6..807d3c6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,35 +10,44 @@ "license": "MIT", "dependencies": { "lodash.get": "^4.4.2", - "xml2js": "^0.4.23" + "xml2js": "^0.6.2" }, "devDependencies": { - "@types/node": "^17.0.8", - "@types/xml2js": "^0.4.9", - "@typescript-eslint/eslint-plugin": "^5.9.0", - "@typescript-eslint/parser": "^5.9.0", + "@types/node": "^20.11.24", + "@types/xml2js": "^0.4.14", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "@typescript-eslint/parser": "^7.1.0", "coveralls": "^3.1.1", "dot": "^1.1.3", - "eslint": "^8.6.0", + "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-import": "^2.25.4", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.0.0", - "ip": "^1.1.5", + "eslint-plugin-prettier": "^5.1.3", + "ip": "^2.0.1", "keypress": "^0.2.1", - "mocha": "^10.0.0", + "mocha": "^10.3.0", "mocha-lcov-reporter": "^1.3.0", "nimble": "^0.0.2", "nyc": "^15.1.0", - "prettier": "^2.5.1", - "typedoc": "^0.23.16", - "typescript": "^4.8.4" + "prettier": "^3.2.5", + "typedoc": "^0.25.10", + "typescript": "^5.3.3" }, "engines": { "node": ">=6.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", @@ -457,24 +466,51 @@ "node": ">=6.9.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/argparse": { @@ -495,24 +531,70 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@eslint/eslintrc/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/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -645,59 +727,82 @@ "node": ">= 8" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/node": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", - "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==", + "version": "20.11.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", + "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/xml2js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", - "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", + "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", - "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "5.9.0", - "@typescript-eslint/scope-manager": "5.9.0", - "@typescript-eslint/type-utils": "5.9.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz", + "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/type-utils": "7.1.0", + "@typescript-eslint/utils": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.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" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -705,81 +810,71 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/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/@typescript-eslint/experimental-utils": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", - "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", + "node_modules/@typescript-eslint/parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", + "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.9.0", - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/typescript-estree": "5.9.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/experimental-utils/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==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", + "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/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": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", - "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", + "node_modules/@typescript-eslint/type-utils": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz", + "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.9.0", - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/typescript-estree": "5.9.0", - "debug": "^4.3.2" + "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/utils": "7.1.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -787,116 +882,123 @@ } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", - "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "node_modules/@typescript-eslint/types": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", + "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/visitor-keys": "5.9.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", - "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", + "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.9.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "*" - }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/types": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", - "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", - "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "node_modules/@typescript-eslint/utils": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", + "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/visitor-keys": "5.9.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", - "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", + "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.9.0", - "eslint-visitor-keys": "^3.0.0" + "@typescript-eslint/types": "7.1.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -961,6 +1063,12 @@ "node": ">=8" } }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1016,16 +1124,32 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -1044,15 +1168,94 @@ "node": ">=8" } }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1085,6 +1288,21 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1191,13 +1409,19 @@ } }, "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==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1476,16 +1700,38 @@ "node": ">=8" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/delayed-stream": { @@ -1564,44 +1810,53 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -1610,6 +1865,56 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -1655,49 +1960,49 @@ } }, "node_modules/eslint": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", - "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.3.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.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.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" @@ -1738,9 +2043,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -1750,13 +2055,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -1769,16 +2075,20 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", - "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/eslint-module-utils/node_modules/debug": { @@ -1790,73 +2100,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-module-utils/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", @@ -1901,24 +2144,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", - "has": "^1.0.3", - "is-core-module": "^2.8.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -1928,12 +2175,12 @@ } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -1948,11 +2195,26 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-plugin-node": { "version": "11.1.0", @@ -1998,15 +2260,6 @@ "node": ">=4" } }, - "node_modules/eslint-plugin-node/node_modules/ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/eslint-plugin-node/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2017,30 +2270,39 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" }, "engines": { - "node": ">=6.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" }, "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, "eslint-config-prettier": { "optional": true } } }, "node_modules/eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -2048,42 +2310,21 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.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" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/argparse": { @@ -2104,18 +2345,33 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/eslint/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/espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -2132,9 +2388,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -2201,9 +2457,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz", - "integrity": "sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2237,13 +2493,13 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "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==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -2334,6 +2590,15 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -2411,16 +2676,40 @@ } }, "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 + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "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": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/gensync": { "version": "1.0.0-beta.2", @@ -2441,14 +2730,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2464,13 +2758,14 @@ } }, "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -2521,9 +2816,9 @@ } }, "node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2535,6 +2830,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -2555,13 +2865,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "engines": { - "node": ">= 4" + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { @@ -2570,6 +2883,12 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2593,22 +2912,10 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "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" @@ -2623,10 +2930,34 @@ "node": ">=8" } }, - "node_modules/has-symbols": { + "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "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" @@ -2636,12 +2967,12 @@ } }, "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -2675,6 +3006,18 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2706,9 +3049,9 @@ } }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -2765,25 +3108,41 @@ "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==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, + "node_modules/ip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", + "dev": true + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -2825,9 +3184,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "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" @@ -2837,12 +3196,12 @@ } }, "node_modules/is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2894,9 +3253,9 @@ } }, "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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -2915,9 +3274,9 @@ } }, "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "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" @@ -2929,6 +3288,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -2955,10 +3323,16 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3005,6 +3379,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "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", @@ -3044,6 +3433,12 @@ "node": ">=0.10.0" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3246,9 +3641,9 @@ } }, "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==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true }, "node_modules/jsprim": { @@ -3394,9 +3789,9 @@ } }, "node_modules/marked": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", - "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", + "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" @@ -3415,13 +3810,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "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.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -3467,12 +3862,11 @@ "dev": true }, "node_modules/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", "dev": true, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -3480,13 +3874,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -3501,10 +3894,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha-lcov-reporter": { @@ -3531,6 +3920,25 @@ "balanced-match": "^1.0.0" } }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mocha/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3582,18 +3990,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "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", @@ -3832,9 +4228,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3850,14 +4246,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -3881,15 +4277,45 @@ "node": ">= 0.4" } }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "dependencies": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -3908,17 +4334,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "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" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -4057,9 +4483,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "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" @@ -4132,6 +4558,15 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4142,15 +4577,18 @@ } }, "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { @@ -4177,15 +4615,6 @@ "node": ">=8" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -4251,6 +4680,24 @@ "node": ">=8.10.0" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "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", @@ -4323,13 +4770,17 @@ "dev": true }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4392,6 +4843,24 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4412,6 +4881,23 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4424,9 +4910,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4453,6 +4939,38 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4475,25 +4993,30 @@ } }, "node_modules/shiki": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", - "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", + "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", "dev": true, "dependencies": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "^6.0.0" + "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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4585,27 +5108,46 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4656,6 +5198,34 @@ "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/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -4710,22 +5280,34 @@ "node": ">=0.8" } }, + "node_modules/ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", + "json5": "^1.0.2", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -4737,73 +5319,131 @@ "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "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==", + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "dependencies": { - "tslib": "^1.8.1" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">= 6" + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-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" }, - "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" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "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/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "safe-buffer": "^5.0.1" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { - "node": "*" + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typedarray-to-buffer": { @@ -4816,24 +5456,24 @@ } }, "node_modules/typedoc": { - "version": "0.23.16", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.16.tgz", - "integrity": "sha512-rumYsCeNRXlyuZVzefD7050n7ptL2uudsCJg50dY0v/stKniqIlRpvx/F/6expC0/Q6Dbab+g/JpZuB7Sw90FA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.10.tgz", + "integrity": "sha512-v10rtOFojrjW9og3T+6wAKeJaGMuojU87DXGZ33sfs+554wgPTRG+s07Ag1BjPZI85Y5QPVouPI63JQ6fcQM5w==", "dev": true, "dependencies": { "lunr": "^2.3.9", - "marked": "^4.0.19", - "minimatch": "^5.1.0", - "shiki": "^0.11.1" + "marked": "^4.3.0", + "minimatch": "^9.0.3", + "shiki": "^0.14.7" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { - "node": ">= 14.14" + "node": ">= 16" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x" + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x" } }, "node_modules/typedoc/node_modules/brace-expansion": { @@ -4846,45 +5486,54 @@ } }, "node_modules/typedoc/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "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": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "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/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4904,12 +5553,6 @@ "uuid": "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/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -4925,15 +5568,15 @@ } }, "node_modules/vscode-oniguruma": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", - "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", + "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": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", - "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", + "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/which": { @@ -4973,13 +5616,23 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "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==", + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/workerpool": { @@ -5024,9 +5677,9 @@ } }, "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -5114,6 +5767,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@babel/code-frame": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", @@ -5437,20 +6096,35 @@ "to-fast-properties": "^2.0.0" } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { @@ -5468,24 +6142,56 @@ "requires": { "argparse": "^2.0.1" } + }, + "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" + } } } }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "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" + } + } } }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "@istanbuljs/load-nyc-config": { @@ -5584,164 +6290,179 @@ "fastq": "^1.6.0" } }, + "@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true + }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/node": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", - "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==", + "version": "20.11.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", + "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "@types/xml2js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", - "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", + "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", "dev": true, "requires": { "@types/node": "*" } }, "@typescript-eslint/eslint-plugin": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", - "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "5.9.0", - "@typescript-eslint/scope-manager": "5.9.0", - "@typescript-eslint/type-utils": "5.9.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", - "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.9.0", - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/typescript-estree": "5.9.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "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" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz", + "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/type-utils": "7.1.0", + "@typescript-eslint/utils": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/parser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", - "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", + "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.9.0", - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/typescript-estree": "5.9.0", - "debug": "^4.3.2" + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", - "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", + "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", "dev": true, "requires": { - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/visitor-keys": "5.9.0" + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0" } }, "@typescript-eslint/type-utils": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", - "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz", + "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.9.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" + "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/utils": "7.1.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", - "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", + "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", - "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", + "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/visitor-keys": "5.9.0", - "debug": "^4.3.2", - "globby": "^11.0.4", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.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": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", + "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.0", + "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", - "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", + "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.9.0", - "eslint-visitor-keys": "^3.0.0" + "@typescript-eslint/types": "7.1.0", + "eslint-visitor-keys": "^3.4.1" } }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "acorn-jsx": { @@ -5785,6 +6506,12 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, + "ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -5828,16 +6555,26 @@ "sprintf-js": "~1.0.2" } }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" } }, @@ -5847,15 +6584,70 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + } + }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" } }, "asn1": { @@ -5879,6 +6671,15 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -5963,13 +6764,16 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -6178,13 +6982,26 @@ "strip-bom": "^4.0.0" } }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "delayed-stream": { @@ -6245,41 +7062,94 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "es-abstract": { + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "requires": { - "ansi-colors": "^4.1.1" + "get-intrinsic": "^1.2.4" } }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" } }, "es-to-primitive": { @@ -6312,49 +7182,49 @@ "dev": true }, "eslint": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", - "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.3.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.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.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { "argparse": { @@ -6371,6 +7241,15 @@ "requires": { "argparse": "^2.0.1" } + }, + "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" + } } } }, @@ -6395,20 +7274,21 @@ } }, "eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "requires": {} }, "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" }, "dependencies": { "debug": { @@ -6423,72 +7303,22 @@ } }, "eslint-module-utils": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", - "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "ms": "^2.1.1" } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true } } }, @@ -6520,33 +7350,37 @@ } }, "eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", - "has": "^1.0.3", - "is-core-module": "^2.8.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "doctrine": { @@ -6558,10 +7392,19 @@ "esutils": "^2.0.2" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -6595,12 +7438,6 @@ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, - "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -6610,56 +7447,40 @@ } }, "eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", "dev": true, "requires": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" } }, "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, - "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.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -6669,9 +7490,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -6723,9 +7544,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz", - "integrity": "sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -6755,13 +7576,13 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "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==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -6828,6 +7649,15 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -6875,15 +7705,27 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "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 }, "gensync": { @@ -6899,14 +7741,16 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-package-type": { @@ -6916,13 +7760,14 @@ "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "getpass": { @@ -6958,14 +7803,23 @@ } }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -6978,14 +7832,15 @@ "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - } + } + }, + "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": { @@ -6994,6 +7849,12 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -7010,19 +7871,10 @@ "har-schema": "^2.0.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "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": { @@ -7031,19 +7883,34 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "has-symbols": { + "has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, + "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "hasha": { @@ -7064,6 +7931,15 @@ } } }, + "hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -7088,9 +7964,9 @@ } }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true }, "import-fresh": { @@ -7132,22 +8008,32 @@ "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==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", "dev": true }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -7177,18 +8063,18 @@ } }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "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.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "is-date-object": { @@ -7222,9 +8108,9 @@ } }, "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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, "is-number": { @@ -7234,14 +8120,20 @@ "dev": true }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "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-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-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -7259,10 +8151,13 @@ } }, "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } }, "is-stream": { "version": "2.0.1", @@ -7288,6 +8183,15 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -7315,6 +8219,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -7479,9 +8389,9 @@ } }, "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==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true }, "jsprim": { @@ -7593,9 +8503,9 @@ } }, "marked": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", - "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true }, "merge2": { @@ -7605,13 +8515,13 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "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.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime-db": { @@ -7645,12 +8555,11 @@ "dev": true }, "mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", "dev": true, "requires": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -7658,13 +8567,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -7689,6 +8597,19 @@ "balanced-match": "^1.0.0" } }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -7736,12 +8657,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -7931,9 +8846,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true }, "object-keys": { @@ -7943,14 +8858,14 @@ "dev": true }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, @@ -7965,15 +8880,39 @@ "es-abstract": "^1.19.1" } }, + "object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "requires": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "once": { @@ -7986,17 +8925,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "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" + "type-check": "^0.4.0" } }, "p-limit": { @@ -8096,9 +9035,9 @@ "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pkg-dir": { @@ -8149,6 +9088,12 @@ } } }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -8156,9 +9101,9 @@ "dev": true }, "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true }, "prettier-linter-helpers": { @@ -8179,12 +9124,6 @@ "fromentries": "^1.2.0" } }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -8227,6 +9166,18 @@ "picomatch": "^2.2.1" } }, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -8283,13 +9234,14 @@ "dev": true }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { @@ -8322,12 +9274,35 @@ "queue-microtask": "^1.2.2" } }, + "safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -8340,9 +9315,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -8363,6 +9338,32 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "requires": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8379,25 +9380,27 @@ "dev": true }, "shiki": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", - "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", + "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", "dev": true, "requires": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "^6.0.0" + "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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "signal-exit": { @@ -8466,24 +9469,37 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "strip-ansi": { @@ -8516,6 +9532,22 @@ "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 + }, + "synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "requires": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -8558,22 +9590,29 @@ "punycode": "^2.1.1" } }, + "ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "dev": true, + "requires": {} + }, "tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", + "json5": "^1.0.2", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -8582,26 +9621,17 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true } } }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "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" - } - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -8632,6 +9662,58 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -8642,15 +9724,15 @@ } }, "typedoc": { - "version": "0.23.16", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.16.tgz", - "integrity": "sha512-rumYsCeNRXlyuZVzefD7050n7ptL2uudsCJg50dY0v/stKniqIlRpvx/F/6expC0/Q6Dbab+g/JpZuB7Sw90FA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.10.tgz", + "integrity": "sha512-v10rtOFojrjW9og3T+6wAKeJaGMuojU87DXGZ33sfs+554wgPTRG+s07Ag1BjPZI85Y5QPVouPI63JQ6fcQM5w==", "dev": true, "requires": { "lunr": "^2.3.9", - "marked": "^4.0.19", - "minimatch": "^5.1.0", - "shiki": "^0.11.1" + "marked": "^4.3.0", + "minimatch": "^9.0.3", + "shiki": "^0.14.7" }, "dependencies": { "brace-expansion": { @@ -8663,9 +9745,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -8674,23 +9756,29 @@ } }, "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "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": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8706,12 +9794,6 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "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 - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -8724,15 +9806,15 @@ } }, "vscode-oniguruma": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", - "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", + "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": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", - "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", "dev": true }, "which": { @@ -8763,11 +9845,18 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "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 + "which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + } }, "workerpool": { "version": "6.2.1", @@ -8805,9 +9894,9 @@ } }, "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" diff --git a/package.json b/package.json index b9bff097..5e17300b 100644 --- a/package.json +++ b/package.json @@ -58,26 +58,26 @@ "node": ">=6.0" }, "devDependencies": { - "@types/node": "^17.0.8", - "@types/xml2js": "^0.4.9", - "@typescript-eslint/eslint-plugin": "^5.9.0", - "@typescript-eslint/parser": "^5.9.0", + "@types/node": "^20.11.24", + "@types/xml2js": "^0.4.14", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "@typescript-eslint/parser": "^7.1.0", "coveralls": "^3.1.1", "dot": "^1.1.3", - "eslint": "^8.6.0", + "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-import": "^2.25.4", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.0.0", - "ip": "^1.1.5", + "eslint-plugin-prettier": "^5.1.3", + "ip": "^2.0.1", "keypress": "^0.2.1", - "mocha": "^10.0.0", + "mocha": "^10.3.0", "mocha-lcov-reporter": "^1.3.0", "nimble": "^0.0.2", "nyc": "^15.1.0", - "prettier": "^2.5.1", - "typedoc": "^0.23.16", - "typescript": "^4.8.4" + "prettier": "^3.2.5", + "typedoc": "^0.25.10", + "typescript": "^5.3.3" } } diff --git a/tsconfig.json b/tsconfig.json index f5496e7c..940b6384 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,7 @@ "noUnusedLocals": false, "noUnusedParameters": true, "skipLibCheck": true, - "watch": true, + // "watch": true, "declaration": true, }, "exclude": [ From 1a192fd4a6efca874dcb37fd00ec0cbfa7bf354f Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 9 Mar 2024 01:09:15 +0300 Subject: [PATCH 073/112] feat: first step to generate ts interfaces from WSDL --- generateInterfaces.ts | 216 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 generateInterfaces.ts diff --git a/generateInterfaces.ts b/generateInterfaces.ts new file mode 100644 index 00000000..ce74f796 --- /dev/null +++ b/generateInterfaces.ts @@ -0,0 +1,216 @@ +import { readFileSync, writeFileSync } from 'fs'; +// eslint-disable-next-line import/no-extraneous-dependencies +// import { glob } from 'glob'; +import { Parser } from 'xml2js'; +// eslint-disable-next-line import/no-extraneous-dependencies +import ts from 'typescript'; + +const sourceFile = ts.createSourceFile( + 'soap-types.ts', // the output file name + '', // the text of the source code, not needed for our purposes + ts.ScriptTarget.Latest, // the target language version for the output file + false, + ts.ScriptKind.TS, // output script kind. options include JS, TS, JSX, TSX and others +); + +// used for adding `export` directive to generated type +const exportModifier = ts.factory.createModifiersFromModifierFlags( + ts.ModifierFlags.Export, +); + +const anyURI = ts.factory.createTypeAliasDeclaration( + exportModifier, + 'AnyURI', + undefined, + ts.factory.createTypeReferenceNode('string'), +); + +// Primitive datatypes defined by SOAP (there are more) +type SoapPrimitive = + | 'xs:boolean' + | 'xs:double' + | 'xs:float' + | 'xs:int' + | 'xs:short' + | 'xs:signedInt' + | 'xs:string' + | 'xs:unsignedInt' + | 'xs:unsignedShort' + | 'xs:dateTime' + | 'xs:anyURI' +; + +const dataTypes: Record = { + 'xs:boolean' : 'boolean', + 'xs:double' : 'number', + 'xs:float' : 'number', + 'xs:int' : 'number', + 'xs:string' : 'string', + 'xs:short' : 'number', + 'xs:signedInt' : 'number', + 'xs:unsignedInt' : 'number', + 'xs:dateTime' : 'date', + 'xs:unsignedShort' : 'number', + 'xs:anyURI' : 'AnyURI', +}; + +interface ISimpleType { + meta: { + name: string; + }; + 'xs:annotation': { + 'xs:documentation': string[]; + }[]; + 'xs:restriction': { + meta: { + base: SoapPrimitive; + }; + 'xs:enumeration'?: { + meta: { + value: string; + }; + }[]; + }[]; +} + +interface IComplexType { + meta: { + name: string; + }; + 'xs:attribute'?: { + meta : { + name: string; + type: SoapPrimitive; + use: 'required' | 'optional'; + }; + 'xs:annotation': { + 'xs:documentation': string[]; + }[]; + }[]; +} + +interface ISchemaDefinition { + 'xs:simpleType': ISimpleType[]; + 'xs:complexType': IComplexType[]; +} + +async function processXSD(filePath: string) { + const wsdlData = readFileSync(filePath, { encoding : 'utf-8' }) + .replace(/([\s\S]*?)<\/xs:documentation>/g, (_, b) => ``); + + const xmlParser = new Parser({ + attrkey : 'meta', + }); + + const serviceDefinition = await xmlParser.parseStringPromise(wsdlData); + return serviceDefinition['xs:schema'] as ISchemaDefinition; +} + +function generateSimpleTypeInterface(simpleType: ISimpleType): ts.Node[] { + const cl: ts.Node[] = []; + const interfaceSymbol = ts.factory.createIdentifier(simpleType.meta.name); + if (simpleType['xs:annotation']) { + cl.push(ts.factory.createJSDocComment(simpleType['xs:annotation']?.[0]['xs:documentation'][0])); + } + if (simpleType['xs:restriction'][0]['xs:enumeration']) { + cl.push( + // ts.factory.createEnumDeclaration( + // exportModifier, + // interfaceSymbol, // interface name + // simpleType['xs:restriction'][0]['xs:enumeration'].map((enumValue) => ts.factory.createEnumMember(enumValue.meta.value, ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value)))), + // ), + ts.factory.createTypeAliasDeclaration( + exportModifier, + interfaceSymbol, // interface name + undefined, + ts.factory.createUnionTypeNode(simpleType['xs:restriction'][0]['xs:enumeration'].map((enumValue) => ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value)))), + ), + ); + } else { + cl.push(ts.factory.createTypeAliasDeclaration( + exportModifier, + interfaceSymbol, + undefined, + ts.factory.createTypeReferenceNode(dataTypes[simpleType['xs:restriction'][0].meta.base]), + )); + } + return cl; +} + +function createDocComment(node: any) { + if (node['xs:annotation']) { + return ts.addSyntheticLeadingComment( + ts.factory.createPropertySignature( + undefined, + node.meta.name, + undefined, + ts.factory.createTypeReferenceNode(dataTypes[node.meta.type as SoapPrimitive]), + ), + ts.SyntaxKind.MultiLineCommentTrivia, + `* ${node['xs:annotation']?.[0]['xs:documentation'][0]}`, + true, + ); + } + return ts.factory.createPropertySignature( + undefined, + node.meta.name, + undefined, + ts.factory.createTypeReferenceNode(dataTypes[node.meta.type as SoapPrimitive]), + ); +} + +function generateComplexTypeInterface(complexType: IComplexType) : ts.Node[] { + const interfaceSymbol = ts.factory.createIdentifier(complexType.meta.name); + + let members: ts.TypeElement[] = []; + // attribute.use === 'required'; // optional + if (complexType['xs:attribute']) { + members = complexType['xs:attribute'].map((attribute) => { + const cl = createDocComment(attribute); + return cl; + }); + } + + const cl = ts.factory.createInterfaceDeclaration( + exportModifier, // modifiers + interfaceSymbol, // interface name + undefined, // no generic type parameters + undefined, // no heritage clauses (extends, implements) + members, + ); + + return [cl]; +} + +async function main() { + // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); + // console.log(wsdls); + // const serviceDefinition = await processWSDL('../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl'); + const serviceDefinition = await processXSD('../specs/wsdl/ver10/schema/common.xsd'); + + const simpleTypeInterfaces = serviceDefinition['xs:simpleType'].map( + generateSimpleTypeInterface, + ).flat(); + + const complexTypeInterfaces = serviceDefinition['xs:complexType'].map( + generateComplexTypeInterface, + ).flat(); + + const nodes: ts.Node[] = [anyURI, ...simpleTypeInterfaces, ...complexTypeInterfaces]; + + const nodeArr = ts.factory.createNodeArray(nodes); + + // printer for writing the AST to a file as code + const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); + const result = printer.printList( + ts.ListFormat.MultiLine, + nodeArr, + sourceFile, + ); + + // write the code to file + writeFileSync('soap-types.ts', result, { encoding : 'utf-8' }); +} + +// eslint-disable-next-line no-console +main().then(console.log).catch(console.error); From fac59e4a87ccc85dbb0a8de0209173971fd40b8d Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 10 Mar 2024 20:54:16 +0300 Subject: [PATCH 074/112] feat: first step to generate ts interfaces from WSDL --- onvif/processor.ts | 262 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 onvif/processor.ts diff --git a/onvif/processor.ts b/onvif/processor.ts new file mode 100644 index 00000000..5c4c0ba3 --- /dev/null +++ b/onvif/processor.ts @@ -0,0 +1,262 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { readFileSync, writeFileSync } from 'fs'; +// eslint-disable-next-line import/no-extraneous-dependencies +// import { glob } from 'glob'; +import { Parser } from 'xml2js'; +// eslint-disable-next-line import/no-extraneous-dependencies +import ts, { TypeNode } from 'typescript'; + +const sourceFile = ts.createSourceFile( + 'soap-types.ts', // the output file name + '', // the text of the source code, not needed for our purposes + ts.ScriptTarget.Latest, // the target language version for the output file + false, + ts.ScriptKind.TS, // output script kind. options include JS, TS, JSX, TSX and others +); + +// used for adding `export` directive to generated type +const exportModifier = ts.factory.createModifiersFromModifierFlags( + ts.ModifierFlags.Export, +); + +const anyURI = ts.factory.createTypeAliasDeclaration( + exportModifier, + 'AnyURI', + undefined, + ts.factory.createTypeReferenceNode('string'), +); + +function dataTypes(xsdType?: string): string { + if (!xsdType) { + return 'any'; + } + const type = xsdType.slice(3); + switch (type) { + case 'double': return 'number'; + case 'float': return 'number'; + case 'int': return 'number'; + case 'short': return 'number'; + case 'signedInt': return 'number'; + case 'unsignedInt': return 'number'; + case 'unsignedShort': return 'number'; + case 'dateTime': return 'Date'; + case 'anyURI': return 'AnyURI'; + default: return type; + } +} + +interface ISimpleType { + meta: { + name: string; + }; + 'xs:annotation': { + 'xs:documentation': string[]; + }[]; + 'xs:restriction': { + meta: { + base: string; + }; + 'xs:enumeration'?: { + meta: { + value: string; + }; + }[]; + }[]; +} + +interface IComplexType { + meta: { + name: string; + }; + 'xs:attribute'?: { + meta : { + name: string; + type: string; + use: 'required' | 'optional'; + }; + }[]; + 'xs:sequence'?: { + 'xs:element': { + meta: { + name: string; + type: string; + use: 'required' | 'optional'; + }; + 'xs:annotation': { + 'xs:documentation': string[]; + }[]; + }[]; + }[]; + 'xs:annotation'?: { + 'xs:documentation': string[]; + }[]; +} + +interface IXSDSchemaDefinition { + 'xs:simpleType': ISimpleType[]; + 'xs:complexType': IComplexType[]; +} + +/** + * Common class to process xml-files + */ +export class Processor { + private filePath: string; + private nodes: ts.Node[] = []; + private schema?: IXSDSchemaDefinition; + constructor(filePath: string, nodes: ts.Node[]) { + this.filePath = filePath; + this.nodes = nodes; + } + + async main(): Promise { + // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); + // console.log(wsdls); + // const serviceDefinition = await processWSDL('../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl'); + await this.processXSD(); + this.schema!['xs:simpleType'].forEach((simpleType) => this.generateSimpleTypeInterface(simpleType)); + this.schema!['xs:complexType'].forEach((complexType) => this.generateComplexTypeInterface(complexType)); + // const complexTypeInterfaces = serviceDefinition['xs:complexType'].map( + // generateComplexTypeInterface, + // ); + + // const nodes: ts.Node[] = [anyURI, ...simpleTypeInterfaces, ...complexTypeInterfaces]; + + return this.nodes; + } + + async processXSD() { + const xsdData = readFileSync(this.filePath, { encoding : 'utf-8' }) + .replace(/([\s\S]*?)<\/xs:documentation>/g, (_, b) => ``); + + const xmlParser = new Parser({ + attrkey : 'meta', + }); + + const serviceDefinition = await xmlParser.parseStringPromise(xsdData); + this.schema = serviceDefinition['xs:schema'] as IXSDSchemaDefinition; + } + + createAnnotationIfExists(attribute: any, node: any) { + if (attribute['xs:annotation']) { + return ts.addSyntheticLeadingComment( + node, + ts.SyntaxKind.MultiLineCommentTrivia, + `* ${attribute['xs:annotation']?.[0]['xs:documentation'][0]} `, + true, + ); + } + return node; + } + + generateSimpleTypeInterface(simpleType: ISimpleType) { + const interfaceSymbol = ts.factory.createIdentifier(simpleType.meta.name); + if (simpleType['xs:restriction'][0]['xs:enumeration']) { + this.nodes.push( + this.createAnnotationIfExists( + simpleType, + ts.factory.createTypeAliasDeclaration( + exportModifier, + interfaceSymbol, // interface name + undefined, + ts.factory.createUnionTypeNode(simpleType['xs:restriction'][0]['xs:enumeration'] + .map((enumValue) => ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value)))), + ), + ), + ); + } else { + this.nodes.push( + this.createAnnotationIfExists( + simpleType, + ts.factory.createTypeAliasDeclaration( + exportModifier, + interfaceSymbol, + undefined, + ts.factory.createTypeReferenceNode(dataTypes(simpleType['xs:restriction'][0].meta.base)), + ), + ), + ); + } + } + + createProperty(attribute: any) { + let type: TypeNode = ts.factory.createTypeReferenceNode(dataTypes(attribute.meta.type)); + if (attribute.meta.maxOccurs === 'unbounded') { + type = ts.factory.createArrayTypeNode(type); + } + const property = ts.factory.createPropertySignature( + undefined, + this.camelCase(attribute.meta.name), + attribute.meta.use !== 'required' ? ts.factory.createToken(ts.SyntaxKind.QuestionToken) : undefined, + type, + ); + return this.createAnnotationIfExists(attribute, property); + } + + generateComplexTypeInterface(complexType: IComplexType) { + const interfaceSymbol = ts.factory.createIdentifier(complexType.meta.name); + + let members: ts.TypeElement[] = []; + // attribute.use === 'required'; // optional + if (complexType['xs:attribute']) { + members = members.concat( + complexType['xs:attribute'].map((attribute) => this.createProperty(attribute)), + ); + } + if (complexType['xs:sequence']) { + if (!Array.isArray(complexType['xs:sequence'][0]['xs:element'])) { + console.log(complexType); + console.log('--------------'); + // return ts.factory.createPropertySignature( + // undefined, + // complexType.meta.name, + // ts.factory.createToken(ts.SyntaxKind.QuestionToken), + // ts.factory.createTypeReferenceNode('any'), + // ); + } else { + // console.log(complexType); + members = members.concat( + members = complexType['xs:sequence'][0]['xs:element'].map((attribute) => { + // console.log(attribute.meta.name); + const cl = this.createProperty(attribute); + return cl; + }), + ); + // console.log('------------'); + } + } + + const node = ts.factory.createInterfaceDeclaration( + exportModifier, // modifiers + interfaceSymbol, // interface name + undefined, // no generic type parameters + undefined, // no heritage clauses (extends, implements) + members, + ); + + this.nodes.push( + this.createAnnotationIfExists(complexType, node), + ); + } + + camelCase(name: string): string { + return name.charAt(0).toLowerCase() + name.slice(1); + } +} + +const proc = new Processor('../specs/wsdl/ver10/schema/common.xsd', []); +proc.main().then((nodes) => { + nodes = [anyURI, ...nodes]; + const nodeArr = ts.factory.createNodeArray(nodes); + + // printer for writing the AST to a file as code + const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); + const result = printer.printList( + ts.ListFormat.MultiLine, + nodeArr, + sourceFile, + ); + + // write the code to file + writeFileSync('soap-types.ts', result, { encoding : 'utf-8' }); +}).catch(console.log); From aed627699595c9e6c9fe6885ddf6878179d5861c Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 10 Mar 2024 21:31:06 +0300 Subject: [PATCH 075/112] feat: first step to generate ts interfaces from WSDL --- onvif/processor.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/onvif/processor.ts b/onvif/processor.ts index 5c4c0ba3..83a8740b 100644 --- a/onvif/processor.ts +++ b/onvif/processor.ts @@ -41,6 +41,7 @@ function dataTypes(xsdType?: string): string { case 'unsignedShort': return 'number'; case 'dateTime': return 'Date'; case 'anyURI': return 'AnyURI'; + case 'anyType': return 'any'; default: return type; } } @@ -82,6 +83,7 @@ interface IComplexType { type: string; use: 'required' | 'optional'; }; + 'xs:complexType'?: IComplexType[]; 'xs:annotation': { 'xs:documentation': string[]; }[]; @@ -205,8 +207,9 @@ export class Processor { } if (complexType['xs:sequence']) { if (!Array.isArray(complexType['xs:sequence'][0]['xs:element'])) { - console.log(complexType); - console.log('--------------'); + /** TODO Any and so on */ + // console.log(complexType); + // console.log('--------------'); // return ts.factory.createPropertySignature( // undefined, // complexType.meta.name, @@ -218,6 +221,12 @@ export class Processor { members = members.concat( members = complexType['xs:sequence'][0]['xs:element'].map((attribute) => { // console.log(attribute.meta.name); + /** TODO complex type inside complex type */ + if (attribute['xs:complexType']) { + attribute['xs:complexType'][0].meta = { name : attribute.meta.name }; + this.generateComplexTypeInterface(attribute['xs:complexType'][0]); + attribute.meta.type = `tt:${attribute.meta.name}`; + } const cl = this.createProperty(attribute); return cl; }), From 6df0294cf4afee941e7ee46792b6b9ec3a21169a Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 10 Mar 2024 22:16:04 +0300 Subject: [PATCH 076/112] feat: first step to generate ts interfaces from WSDL --- onvif/processor.ts | 73 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/onvif/processor.ts b/onvif/processor.ts index 83a8740b..38e732f6 100644 --- a/onvif/processor.ts +++ b/onvif/processor.ts @@ -63,6 +63,11 @@ interface ISimpleType { }; }[]; }[]; + 'xs:list': { + meta: { + itemType: string; + }; + }[]; } interface IComplexType { @@ -152,21 +157,37 @@ export class Processor { } generateSimpleTypeInterface(simpleType: ISimpleType) { - const interfaceSymbol = ts.factory.createIdentifier(simpleType.meta.name); - if (simpleType['xs:restriction'][0]['xs:enumeration']) { - this.nodes.push( - this.createAnnotationIfExists( - simpleType, - ts.factory.createTypeAliasDeclaration( - exportModifier, - interfaceSymbol, // interface name - undefined, - ts.factory.createUnionTypeNode(simpleType['xs:restriction'][0]['xs:enumeration'] - .map((enumValue) => ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value)))), + const interfaceSymbol = ts.factory.createIdentifier(this.cleanName(simpleType.meta.name)); + if (simpleType['xs:restriction']) { + /** RESTRICTIONS */ + if (simpleType['xs:restriction'][0]['xs:enumeration']) { + this.nodes.push( + this.createAnnotationIfExists( + simpleType, + ts.factory.createTypeAliasDeclaration( + exportModifier, + interfaceSymbol, // interface name + undefined, + ts.factory.createUnionTypeNode(simpleType['xs:restriction'][0]['xs:enumeration'] + .map((enumValue) => ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value)))), + ), ), - ), - ); - } else { + ); + } else { + this.nodes.push( + this.createAnnotationIfExists( + simpleType, + ts.factory.createTypeAliasDeclaration( + exportModifier, + interfaceSymbol, + undefined, + ts.factory.createTypeReferenceNode(dataTypes(simpleType['xs:restriction'][0].meta.base)), + ), + ), + ); + } + } else if (simpleType['xs:list']) { + /** LISTS */ this.nodes.push( this.createAnnotationIfExists( simpleType, @@ -174,7 +195,7 @@ export class Processor { exportModifier, interfaceSymbol, undefined, - ts.factory.createTypeReferenceNode(dataTypes(simpleType['xs:restriction'][0].meta.base)), + ts.factory.createArrayTypeNode(ts.factory.createTypeReferenceNode(dataTypes(simpleType['xs:list'][0].meta.itemType))), ), ), ); @@ -182,7 +203,12 @@ export class Processor { } createProperty(attribute: any) { - let type: TypeNode = ts.factory.createTypeReferenceNode(dataTypes(attribute.meta.type)); + let type: TypeNode = ts.factory.createTypeReferenceNode(this.cleanName(dataTypes(attribute.meta.type))); + /** REFS FOR XMIME */ + if (!attribute.meta.name && attribute.meta.ref) { + attribute.meta.name = attribute.meta.ref.slice(6); + } + /** ARRAYS */ if (attribute.meta.maxOccurs === 'unbounded') { type = ts.factory.createArrayTypeNode(type); } @@ -249,11 +275,20 @@ export class Processor { } camelCase(name: string): string { - return name.charAt(0).toLowerCase() + name.slice(1); + const secondLetter = name.charAt(1); + if (secondLetter && secondLetter.toUpperCase() !== secondLetter) { + return name.charAt(0).toLowerCase() + name.slice(1); + } + return name; + } + + cleanName(name: string): string { + return name.replace(/[-.]/g, ''); } } -const proc = new Processor('../specs/wsdl/ver10/schema/common.xsd', []); +const name = 'onvif'; +const proc = new Processor(`../specs/wsdl/ver10/schema/${name}.xsd`, []); proc.main().then((nodes) => { nodes = [anyURI, ...nodes]; const nodeArr = ts.factory.createNodeArray(nodes); @@ -267,5 +302,5 @@ proc.main().then((nodes) => { ); // write the code to file - writeFileSync('soap-types.ts', result, { encoding : 'utf-8' }); + writeFileSync(`./onvif/interfaces/${name}.ts`, result, { encoding : 'utf-8' }); }).catch(console.log); From 5c17944fcf2bbb7ab76c5fbba80a6c875cf2e40a Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Mon, 11 Mar 2024 00:07:13 +0300 Subject: [PATCH 077/112] feat(onvif-interface-generator): fix all errors in common.xsd, onvif.xsd --- onvif/processor.ts | 93 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 65 insertions(+), 28 deletions(-) diff --git a/onvif/processor.ts b/onvif/processor.ts index 38e732f6..765d8c8a 100644 --- a/onvif/processor.ts +++ b/onvif/processor.ts @@ -5,6 +5,8 @@ import { readFileSync, writeFileSync } from 'fs'; import { Parser } from 'xml2js'; // eslint-disable-next-line import/no-extraneous-dependencies import ts, { TypeNode } from 'typescript'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { glob } from 'glob'; const sourceFile = ts.createSourceFile( 'soap-types.ts', // the output file name @@ -30,19 +32,30 @@ function dataTypes(xsdType?: string): string { if (!xsdType) { return 'any'; } - const type = xsdType.slice(3); - switch (type) { - case 'double': return 'number'; - case 'float': return 'number'; - case 'int': return 'number'; - case 'short': return 'number'; - case 'signedInt': return 'number'; - case 'unsignedInt': return 'number'; - case 'unsignedShort': return 'number'; - case 'dateTime': return 'Date'; - case 'anyURI': return 'AnyURI'; - case 'anyType': return 'any'; - default: return type; + // const type = xsdType.slice(3); + switch (xsdType) { + case 'xs:double': return 'number'; + case 'xs:float': return 'number'; + case 'xs:int': return 'number'; + case 'xs:integer': return 'number'; + case 'xs:short': return 'number'; + case 'xs:signedInt': return 'number'; + case 'xs:unsignedInt': return 'number'; + case 'xs:unsignedShort': return 'number'; + case 'xs:dateTime': return 'Date'; + case 'xs:token': return 'string'; + case 'xs:anyURI': return 'AnyURI'; + case 'xs:anyType': return 'any'; + case 'xs:hexBinary': return 'any'; + case 'xs:base64Binary': return 'any'; + case 'xs:duration': return 'any'; + case 'wsnt:FilterType': return 'any'; + case 'wsnt:NotificationMessageHolderType': return 'any'; + case 'soapenv:Envelope': return 'any'; + case 'soapenv:Fault': return 'any'; + case 'xs:anySimpleType': return 'any'; + case 'xs:QName': return 'any'; + default: return xsdType.slice(xsdType.indexOf(':') + 1); } } @@ -123,18 +136,12 @@ export class Processor { await this.processXSD(); this.schema!['xs:simpleType'].forEach((simpleType) => this.generateSimpleTypeInterface(simpleType)); this.schema!['xs:complexType'].forEach((complexType) => this.generateComplexTypeInterface(complexType)); - // const complexTypeInterfaces = serviceDefinition['xs:complexType'].map( - // generateComplexTypeInterface, - // ); - - // const nodes: ts.Node[] = [anyURI, ...simpleTypeInterfaces, ...complexTypeInterfaces]; - return this.nodes; } async processXSD() { const xsdData = readFileSync(this.filePath, { encoding : 'utf-8' }) - .replace(/([\s\S]*?)<\/xs:documentation>/g, (_, b) => ``); + .replace(/([\s\S]*?)<\/xs:documentation>/g, (_, b) => ``); const xmlParser = new Parser({ attrkey : 'meta', @@ -169,7 +176,7 @@ export class Processor { interfaceSymbol, // interface name undefined, ts.factory.createUnionTypeNode(simpleType['xs:restriction'][0]['xs:enumeration'] - .map((enumValue) => ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value)))), + .map((enumValue) => ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value, true)))), ), ), ); @@ -277,7 +284,10 @@ export class Processor { camelCase(name: string): string { const secondLetter = name.charAt(1); if (secondLetter && secondLetter.toUpperCase() !== secondLetter) { - return name.charAt(0).toLowerCase() + name.slice(1); + name = name.charAt(0).toLowerCase() + name.slice(1); + } + if (/[-.]/g.test(name)) { + name = `'${name}'`; } return name; } @@ -286,11 +296,19 @@ export class Processor { return name.replace(/[-.]/g, ''); } } +async function start() { + let xsds = await glob('../specs/wsdl/**/*.xsd'); + console.log(xsds); + xsds = [xsds[6], xsds[4]]; + console.log(xsds); + const nodes: ts.Node[] = [anyURI]; + + for (const xsd of xsds) { + console.log(`processing ${xsd}`); + const proc = new Processor(xsd, nodes); + await proc.main(); + } -const name = 'onvif'; -const proc = new Processor(`../specs/wsdl/ver10/schema/${name}.xsd`, []); -proc.main().then((nodes) => { - nodes = [anyURI, ...nodes]; const nodeArr = ts.factory.createNodeArray(nodes); // printer for writing the AST to a file as code @@ -302,5 +320,24 @@ proc.main().then((nodes) => { ); // write the code to file - writeFileSync(`./onvif/interfaces/${name}.ts`, result, { encoding : 'utf-8' }); -}).catch(console.log); + writeFileSync('./onvif/interfaces/interface.ts', result, { encoding : 'utf-8' }); + + // const name = 'onvif'; + // const proc = new Processor(`../specs/wsdl/ver10/schema/${name}.xsd`, []); + // proc.main().then((nodes) => { + // nodes = [anyURI, ...nodes]; + // const nodeArr = ts.factory.createNodeArray(nodes); + // + // // printer for writing the AST to a file as code + // const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); + // const result = printer.printList( + // ts.ListFormat.MultiLine, + // nodeArr, + // sourceFile, + // ); + // + // // write the code to file + // writeFileSync(`./onvif/interfaces/${name}.ts`, result, { encoding : 'utf-8' }); + // }).catch(console.log); +} +start().catch(console.error); From 26d4bee063388cdbf1edb62951b7a8f8f1276fcd Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Tue, 12 Mar 2024 21:01:00 +0300 Subject: [PATCH 078/112] feat(onvif-interface-generator): eslint suppress multiple interface export --- .eslintrc.js | 1 + onvif/processor.ts | 147 ++++++++++++++++++++++++++++++--------------- 2 files changed, 98 insertions(+), 50 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 6a4884c8..8613acda 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -28,6 +28,7 @@ const commonRules = { }], '@typescript-eslint/member-delimiter-style' : 1, 'import/no-cycle' : 0, // IMPORTANT + 'import/export' : 0 }; module.exports = { diff --git a/onvif/processor.ts b/onvif/processor.ts index 765d8c8a..f419d027 100644 --- a/onvif/processor.ts +++ b/onvif/processor.ts @@ -21,12 +21,15 @@ const exportModifier = ts.factory.createModifiersFromModifierFlags( ts.ModifierFlags.Export, ); -const anyURI = ts.factory.createTypeAliasDeclaration( +const builtInTypes = Object.entries({ + AnyURI : 'string', + FilterType : 'any', +}).map(([name, typeName]) => ts.factory.createTypeAliasDeclaration( exportModifier, - 'AnyURI', + name, undefined, - ts.factory.createTypeReferenceNode('string'), -); + ts.factory.createTypeReferenceNode(typeName), +)); function dataTypes(xsdType?: string): string { if (!xsdType) { @@ -59,6 +62,21 @@ function dataTypes(xsdType?: string): string { } } +function cleanName(name: string): string { + return name.replace(/[-.]/g, ''); +} + +function camelCase(name: string): string { + const secondLetter = name.charAt(1); + if (secondLetter && secondLetter.toUpperCase() !== secondLetter) { + name = name.charAt(0).toLowerCase() + name.slice(1); + } + if (/[-.]/g.test(name)) { + name = `'${name}'`; + } + return name; +} + interface ISimpleType { meta: { name: string; @@ -87,6 +105,14 @@ interface IComplexType { meta: { name: string; }; + 'xs:complexContent': { + 'xs:extension': { + meta: { + base: string; + }; + 'xs:sequence': any[]; + }[]; + }[]; 'xs:attribute'?: { meta : { name: string; @@ -117,6 +143,11 @@ interface IXSDSchemaDefinition { 'xs:complexType': IComplexType[]; } +interface IWDSLSchemaDefinition { + 'xs:simpleType': ISimpleType[]; + 'xs:complexType': IComplexType[]; +} + /** * Common class to process xml-files */ @@ -130,12 +161,17 @@ export class Processor { } async main(): Promise { - // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); - // console.log(wsdls); - // const serviceDefinition = await processWSDL('../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl'); - await this.processXSD(); - this.schema!['xs:simpleType'].forEach((simpleType) => this.generateSimpleTypeInterface(simpleType)); - this.schema!['xs:complexType'].forEach((complexType) => this.generateComplexTypeInterface(complexType)); + if (this.filePath.endsWith('.wsdl')) { + await this.processWSDL(); + } else { + await this.processXSD(); + } + if (this.schema?.['xs:simpleType']) { + this.schema['xs:simpleType'].forEach((simpleType) => this.generateSimpleTypeInterface(simpleType)); + } + if (this.schema?.['xs:complexType']) { + this.schema['xs:complexType'].forEach((complexType) => this.generateComplexTypeInterface(complexType)); + } return this.nodes; } @@ -151,6 +187,19 @@ export class Processor { this.schema = serviceDefinition['xs:schema'] as IXSDSchemaDefinition; } + async processWSDL() { + const xsdData = readFileSync(this.filePath, { encoding : 'utf-8' }) + .replace(/([\s\S]*?)<\/xs:documentation>/g, (_, b) => ``); + + const xmlParser = new Parser({ + attrkey : 'meta', + }); + + const serviceDefinition = await xmlParser.parseStringPromise(xsdData); + this.schema = serviceDefinition['wsdl:definitions']['wsdl:types'][0]['xs:schema'][0] as IXSDSchemaDefinition; + console.log('m?'); + } + createAnnotationIfExists(attribute: any, node: any) { if (attribute['xs:annotation']) { return ts.addSyntheticLeadingComment( @@ -164,7 +213,7 @@ export class Processor { } generateSimpleTypeInterface(simpleType: ISimpleType) { - const interfaceSymbol = ts.factory.createIdentifier(this.cleanName(simpleType.meta.name)); + const interfaceSymbol = ts.factory.createIdentifier(cleanName(simpleType.meta.name)); if (simpleType['xs:restriction']) { /** RESTRICTIONS */ if (simpleType['xs:restriction'][0]['xs:enumeration']) { @@ -210,7 +259,7 @@ export class Processor { } createProperty(attribute: any) { - let type: TypeNode = ts.factory.createTypeReferenceNode(this.cleanName(dataTypes(attribute.meta.type))); + let type: TypeNode = ts.factory.createTypeReferenceNode(cleanName(dataTypes(attribute.meta.type))); /** REFS FOR XMIME */ if (!attribute.meta.name && attribute.meta.ref) { attribute.meta.name = attribute.meta.ref.slice(6); @@ -221,7 +270,7 @@ export class Processor { } const property = ts.factory.createPropertySignature( undefined, - this.camelCase(attribute.meta.name), + camelCase(attribute.meta.name), attribute.meta.use !== 'required' ? ts.factory.createToken(ts.SyntaxKind.QuestionToken) : undefined, type, ); @@ -232,6 +281,19 @@ export class Processor { const interfaceSymbol = ts.factory.createIdentifier(complexType.meta.name); let members: ts.TypeElement[] = []; + let heritage; + + /** Complex Content */ + if (Array.isArray(complexType['xs:complexContent'])) { + const name = complexType['xs:complexContent'][0]['xs:extension'][0].meta.base; + const heritageName = name.slice(name.indexOf(':') + 1); + heritage = extendInterface(heritageName); + if (complexType['xs:sequence']) { + throw new Error('complexType[\'xs:sequence\'] in complexContent: complexType.meta.name'); + } + complexType['xs:sequence'] = complexType['xs:complexContent'][0]['xs:extension'][0]['xs:sequence']; + } + // attribute.use === 'required'; // optional if (complexType['xs:attribute']) { members = members.concat( @@ -240,7 +302,8 @@ export class Processor { } if (complexType['xs:sequence']) { if (!Array.isArray(complexType['xs:sequence'][0]['xs:element'])) { - /** TODO Any and so on */ + /** TODO Any */ + // console.log(complexType); // console.log('--------------'); // return ts.factory.createPropertySignature( @@ -272,7 +335,7 @@ export class Processor { exportModifier, // modifiers interfaceSymbol, // interface name undefined, // no generic type parameters - undefined, // no heritage clauses (extends, implements) + heritage, members, ); @@ -280,28 +343,24 @@ export class Processor { this.createAnnotationIfExists(complexType, node), ); } +} - camelCase(name: string): string { - const secondLetter = name.charAt(1); - if (secondLetter && secondLetter.toUpperCase() !== secondLetter) { - name = name.charAt(0).toLowerCase() + name.slice(1); - } - if (/[-.]/g.test(name)) { - name = `'${name}'`; - } - return name; - } - - cleanName(name: string): string { - return name.replace(/[-.]/g, ''); +function extendInterface(interfaceName?: string) { + if (interfaceName) { + return [ts.factory.createHeritageClause( + ts.SyntaxKind.ExtendsKeyword, + [ts.factory.createExpressionWithTypeArguments(ts.factory.createIdentifier(interfaceName), [])], + )]; } + return undefined; } + async function start() { - let xsds = await glob('../specs/wsdl/**/*.xsd'); - console.log(xsds); - xsds = [xsds[6], xsds[4]]; + const xsds = await glob('../specs/wsdl/**/*.xsd'); console.log(xsds); - const nodes: ts.Node[] = [anyURI]; + // xsds = ['../specs/wsdl/ver10/schema/common.xsd', '../specs/wsdl/ver10/schema/onvif.xsd']; + // console.log(xsds); + const nodes: ts.Node[] = builtInTypes; for (const xsd of xsds) { console.log(`processing ${xsd}`); @@ -309,6 +368,12 @@ async function start() { await proc.main(); } + // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); + // console.log(wsdls); + // console.log(wsdls[24]); + // const proc = new Processor('../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl', nodes); + // await proc.main(); + const nodeArr = ts.factory.createNodeArray(nodes); // printer for writing the AST to a file as code @@ -321,23 +386,5 @@ async function start() { // write the code to file writeFileSync('./onvif/interfaces/interface.ts', result, { encoding : 'utf-8' }); - - // const name = 'onvif'; - // const proc = new Processor(`../specs/wsdl/ver10/schema/${name}.xsd`, []); - // proc.main().then((nodes) => { - // nodes = [anyURI, ...nodes]; - // const nodeArr = ts.factory.createNodeArray(nodes); - // - // // printer for writing the AST to a file as code - // const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); - // const result = printer.printList( - // ts.ListFormat.MultiLine, - // nodeArr, - // sourceFile, - // ); - // - // // write the code to file - // writeFileSync(`./onvif/interfaces/${name}.ts`, result, { encoding : 'utf-8' }); - // }).catch(console.log); } start().catch(console.error); From a8c79e08bb10110f8fdcb80a59e03d7d8848848b Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 15 Mar 2024 23:00:03 +0300 Subject: [PATCH 079/112] feat(onvif-interface-generator): Refactor, some fixes --- onvif/processor.ts | 60 ++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/onvif/processor.ts b/onvif/processor.ts index f419d027..550aaf72 100644 --- a/onvif/processor.ts +++ b/onvif/processor.ts @@ -58,11 +58,15 @@ function dataTypes(xsdType?: string): string { case 'soapenv:Fault': return 'any'; case 'xs:anySimpleType': return 'any'; case 'xs:QName': return 'any'; + case 'tt:Object': return 'OnvifObject'; default: return xsdType.slice(xsdType.indexOf(':') + 1); } } function cleanName(name: string): string { + if (name === 'Object') { + return 'OnvifObject'; + } return name.replace(/[-.]/g, ''); } @@ -138,14 +142,15 @@ interface IComplexType { }[]; } -interface IXSDSchemaDefinition { +interface ISchemaDefinition { 'xs:simpleType': ISimpleType[]; 'xs:complexType': IComplexType[]; } -interface IWDSLSchemaDefinition { - 'xs:simpleType': ISimpleType[]; - 'xs:complexType': IComplexType[]; +interface ProcessorConstructor { + filePath: string; + nodes: ts.Node[]; + types?: Set; } /** @@ -154,8 +159,11 @@ interface IWDSLSchemaDefinition { export class Processor { private filePath: string; private nodes: ts.Node[] = []; - private schema?: IXSDSchemaDefinition; - constructor(filePath: string, nodes: ts.Node[]) { + private schema?: ISchemaDefinition; + constructor({ + filePath, + nodes, + }: ProcessorConstructor) { this.filePath = filePath; this.nodes = nodes; } @@ -175,7 +183,7 @@ export class Processor { return this.nodes; } - async processXSD() { + async processXML() { const xsdData = readFileSync(this.filePath, { encoding : 'utf-8' }) .replace(/([\s\S]*?)<\/xs:documentation>/g, (_, b) => ``); @@ -183,21 +191,15 @@ export class Processor { attrkey : 'meta', }); - const serviceDefinition = await xmlParser.parseStringPromise(xsdData); - this.schema = serviceDefinition['xs:schema'] as IXSDSchemaDefinition; + return xmlParser.parseStringPromise(xsdData); } - async processWSDL() { - const xsdData = readFileSync(this.filePath, { encoding : 'utf-8' }) - .replace(/([\s\S]*?)<\/xs:documentation>/g, (_, b) => ``); - - const xmlParser = new Parser({ - attrkey : 'meta', - }); + async processXSD() { + this.schema = (await this.processXML())['xs:schema'] as ISchemaDefinition; + } - const serviceDefinition = await xmlParser.parseStringPromise(xsdData); - this.schema = serviceDefinition['wsdl:definitions']['wsdl:types'][0]['xs:schema'][0] as IXSDSchemaDefinition; - console.log('m?'); + async processWSDL() { + this.schema = (await this.processXML())['wsdl:definitions']['wsdl:types'][0]['xs:schema'][0] as ISchemaDefinition; } createAnnotationIfExists(attribute: any, node: any) { @@ -278,7 +280,7 @@ export class Processor { } generateComplexTypeInterface(complexType: IComplexType) { - const interfaceSymbol = ts.factory.createIdentifier(complexType.meta.name); + const interfaceSymbol = ts.factory.createIdentifier(cleanName(complexType.meta.name)); let members: ts.TypeElement[] = []; let heritage; @@ -355,6 +357,12 @@ function extendInterface(interfaceName?: string) { return undefined; } +// class ProcessorXSD extends Processor { +// constructor(options) { +// super(options); +// } +// } + async function start() { const xsds = await glob('../specs/wsdl/**/*.xsd'); console.log(xsds); @@ -364,15 +372,21 @@ async function start() { for (const xsd of xsds) { console.log(`processing ${xsd}`); - const proc = new Processor(xsd, nodes); + const proc = new Processor({ + filePath : xsd, + nodes, + }); await proc.main(); } // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); // console.log(wsdls); // console.log(wsdls[24]); - // const proc = new Processor('../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl', nodes); - // await proc.main(); + const proc = new Processor({ + filePath : '../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl', + nodes, + }); + await proc.main(); const nodeArr = ts.factory.createNodeArray(nodes); From 85b5b92ffd4cb087e138f64bc8dc54adf8667601 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 15 Mar 2024 23:24:59 +0300 Subject: [PATCH 080/112] feat(onvif-interface-generator): No duplicates in types, classes --- onvif/processor.ts | 133 +++++++++++++++++++++++++++------------------ 1 file changed, 79 insertions(+), 54 deletions(-) diff --git a/onvif/processor.ts b/onvif/processor.ts index 550aaf72..613992e1 100644 --- a/onvif/processor.ts +++ b/onvif/processor.ts @@ -150,7 +150,7 @@ interface ISchemaDefinition { interface ProcessorConstructor { filePath: string; nodes: ts.Node[]; - types?: Set; + types: Set; } /** @@ -158,22 +158,21 @@ interface ProcessorConstructor { */ export class Processor { private filePath: string; - private nodes: ts.Node[] = []; - private schema?: ISchemaDefinition; + private readonly nodes: ts.Node[] = []; + protected schema?: ISchemaDefinition; + private readonly types: Set; constructor({ filePath, nodes, + types, }: ProcessorConstructor) { this.filePath = filePath; this.nodes = nodes; + this.types = types; } async main(): Promise { - if (this.filePath.endsWith('.wsdl')) { - await this.processWSDL(); - } else { - await this.processXSD(); - } + await this.process(); if (this.schema?.['xs:simpleType']) { this.schema['xs:simpleType'].forEach((simpleType) => this.generateSimpleTypeInterface(simpleType)); } @@ -194,12 +193,8 @@ export class Processor { return xmlParser.parseStringPromise(xsdData); } - async processXSD() { - this.schema = (await this.processXML())['xs:schema'] as ISchemaDefinition; - } - - async processWSDL() { - this.schema = (await this.processXML())['wsdl:definitions']['wsdl:types'][0]['xs:schema'][0] as ISchemaDefinition; + async process() { + throw new Error('Not implemented'); } createAnnotationIfExists(attribute: any, node: any) { @@ -215,7 +210,12 @@ export class Processor { } generateSimpleTypeInterface(simpleType: ISimpleType) { - const interfaceSymbol = ts.factory.createIdentifier(cleanName(simpleType.meta.name)); + const name = cleanName(simpleType.meta.name); + if (this.types.has(name)) { + return; + } + this.types.add(name); + const interfaceSymbol = ts.factory.createIdentifier(name); if (simpleType['xs:restriction']) { /** RESTRICTIONS */ if (simpleType['xs:restriction'][0]['xs:enumeration']) { @@ -357,48 +357,73 @@ function extendInterface(interfaceName?: string) { return undefined; } -// class ProcessorXSD extends Processor { -// constructor(options) { -// super(options); -// } -// } - -async function start() { - const xsds = await glob('../specs/wsdl/**/*.xsd'); - console.log(xsds); - // xsds = ['../specs/wsdl/ver10/schema/common.xsd', '../specs/wsdl/ver10/schema/onvif.xsd']; - // console.log(xsds); - const nodes: ts.Node[] = builtInTypes; - - for (const xsd of xsds) { - console.log(`processing ${xsd}`); - const proc = new Processor({ - filePath : xsd, - nodes, - }); - await proc.main(); +class ProcessorXSD extends Processor { + constructor(options: ProcessorConstructor) { + super(options); } - // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); - // console.log(wsdls); - // console.log(wsdls[24]); - const proc = new Processor({ - filePath : '../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl', - nodes, - }); - await proc.main(); + async process() { + this.schema = (await this.processXML())['xs:schema'] as ISchemaDefinition; + } +} - const nodeArr = ts.factory.createNodeArray(nodes); +class ProcessorWSDL extends Processor { + constructor(options: ProcessorConstructor) { + super(options); + } - // printer for writing the AST to a file as code - const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); - const result = printer.printList( - ts.ListFormat.MultiLine, - nodeArr, - sourceFile, - ); + async process() { + this.schema = (await this.processXML())['wsdl:definitions']['wsdl:types'][0]['xs:schema'][0] as ISchemaDefinition; + } +} - // write the code to file - writeFileSync('./onvif/interfaces/interface.ts', result, { encoding : 'utf-8' }); +class InterfaceProcessor { + private nodes: ts.Node[]; + private types: Set; + constructor() { + this.nodes = []; + this.types = new Set(); + } + async start() { + const xsds = await glob('../specs/wsdl/**/*.xsd'); + console.log(xsds); + // xsds = ['../specs/wsdl/ver10/schema/common.xsd', '../specs/wsdl/ver10/schema/onvif.xsd']; + // console.log(xsds); + this.nodes = builtInTypes; + + for (const xsd of xsds) { + console.log(`processing ${xsd}`); + const proc = new ProcessorXSD({ + filePath : xsd, + nodes : this.nodes, + types : this.types, + }); + await proc.main(); + } + + // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); + // console.log(wsdls); + // console.log(wsdls[24]); + const proc = new ProcessorWSDL({ + filePath : '../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl', + nodes : this.nodes, + types : this.types, + }); + await proc.main(); + + const nodeArr = ts.factory.createNodeArray(this.nodes); + + // printer for writing the AST to a file as code + const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); + const result = printer.printList( + ts.ListFormat.MultiLine, + nodeArr, + sourceFile, + ); + + // write the code to file + writeFileSync('./onvif/interfaces/interface.ts', result, { encoding : 'utf-8' }); + } } -start().catch(console.error); + +(new InterfaceProcessor()).start().catch(console.error); From e336660045335fc2a28318ba159ff2458bc11102 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 22 Mar 2024 22:34:27 +0300 Subject: [PATCH 081/112] feat(onvif-interface-generator): No duplicates in types, classes --- onvif/processor.ts | 96 +++++++++++++++++++++++++++++++++------------- 1 file changed, 69 insertions(+), 27 deletions(-) diff --git a/onvif/processor.ts b/onvif/processor.ts index 613992e1..eb10bcaf 100644 --- a/onvif/processor.ts +++ b/onvif/processor.ts @@ -7,6 +7,7 @@ import { Parser } from 'xml2js'; import ts, { TypeNode } from 'typescript'; // eslint-disable-next-line import/no-extraneous-dependencies import { glob } from 'glob'; +import * as path from 'node:path'; const sourceFile = ts.createSourceFile( 'soap-types.ts', // the output file name @@ -21,15 +22,19 @@ const exportModifier = ts.factory.createModifiersFromModifierFlags( ts.ModifierFlags.Export, ); -const builtInTypes = Object.entries({ - AnyURI : 'string', - FilterType : 'any', -}).map(([name, typeName]) => ts.factory.createTypeAliasDeclaration( - exportModifier, - name, - undefined, - ts.factory.createTypeReferenceNode(typeName), -)); +const builtInTypes = [ + ts.factory.createIdentifier('/* eslint-disable import/export, no-tabs */'), + ...Object.entries({ + AnyURI : 'string', + FilterType : 'any', + NCName : 'string', + }).map(([name, typeName]) => ts.factory.createTypeAliasDeclaration( + exportModifier, + name, + undefined, + ts.factory.createTypeReferenceNode(typeName), + )), +]; function dataTypes(xsdType?: string): string { if (!xsdType) { @@ -58,7 +63,12 @@ function dataTypes(xsdType?: string): string { case 'soapenv:Fault': return 'any'; case 'xs:anySimpleType': return 'any'; case 'xs:QName': return 'any'; + case 'wsnt:TopicExpressionType': return 'any'; + case 'wsnt:QueryExpressionType': return 'any'; + case 'xs:positiveInteger': return 'PositiveInteger'; + case 'xs:nonNegativeInteger': return 'number'; case 'tt:Object': return 'OnvifObject'; + case 'xs:time': return 'Time'; default: return xsdType.slice(xsdType.indexOf(':') + 1); } } @@ -136,6 +146,7 @@ interface IComplexType { 'xs:documentation': string[]; }[]; }[]; + 'xs:any'?: any; }[]; 'xs:annotation'?: { 'xs:documentation': string[]; @@ -161,13 +172,14 @@ export class Processor { private readonly nodes: ts.Node[] = []; protected schema?: ISchemaDefinition; private readonly types: Set; + private exportNodes: ts.Node[]; constructor({ filePath, nodes, types, }: ProcessorConstructor) { this.filePath = filePath; - this.nodes = nodes; + this.exportNodes = nodes; this.types = types; } @@ -179,9 +191,26 @@ export class Processor { if (this.schema?.['xs:complexType']) { this.schema['xs:complexType'].forEach((complexType) => this.generateComplexTypeInterface(complexType)); } + this.writeInterface(); + this.exportNodes = this.exportNodes.concat(this.nodes); return this.nodes; } + writeInterface() { + const nodeArr = ts.factory.createNodeArray(this.nodes); + + // printer for writing the AST to a file as code + const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); + const result = printer.printList( + ts.ListFormat.MultiLine, + nodeArr, + sourceFile, + ); + + // write the code to file + writeFileSync(`./onvif/interfaces/${path.parse(this.filePath).name}.ts`, result, { encoding : 'utf-8' }); + } + async processXML() { const xsdData = readFileSync(this.filePath, { encoding : 'utf-8' }) .replace(/([\s\S]*?)<\/xs:documentation>/g, (_, b) => ``); @@ -305,6 +334,16 @@ export class Processor { if (complexType['xs:sequence']) { if (!Array.isArray(complexType['xs:sequence'][0]['xs:element'])) { /** TODO Any */ + // if (complexType['xs:sequence'][0]['xs:any']) { + // members.push( + // ts.factory.createPropertySignature( + // undefined, + // '[key: string]', + // undefined, + // ts.factory.createTypeReferenceNode('any'), + // ), + // ); + // } // console.log(complexType); // console.log('--------------'); @@ -358,22 +397,16 @@ function extendInterface(interfaceName?: string) { } class ProcessorXSD extends Processor { - constructor(options: ProcessorConstructor) { - super(options); - } - async process() { this.schema = (await this.processXML())['xs:schema'] as ISchemaDefinition; } } class ProcessorWSDL extends Processor { - constructor(options: ProcessorConstructor) { - super(options); - } - async process() { - this.schema = (await this.processXML())['wsdl:definitions']['wsdl:types'][0]['xs:schema'][0] as ISchemaDefinition; + const xml = await this.processXML(); + const schemaDefinition = xml['wsdl:definitions']['wsdl:types']?.[0]['xs:schema']?.[0]; + this.schema = schemaDefinition as ISchemaDefinition; } } @@ -386,7 +419,7 @@ class InterfaceProcessor { } async start() { const xsds = await glob('../specs/wsdl/**/*.xsd'); - console.log(xsds); + // console.log(xsds); // xsds = ['../specs/wsdl/ver10/schema/common.xsd', '../specs/wsdl/ver10/schema/onvif.xsd']; // console.log(xsds); this.nodes = builtInTypes; @@ -401,15 +434,24 @@ class InterfaceProcessor { await proc.main(); } - // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); + const wsdls = await glob('../specs/wsdl/**/*.wsdl'); // console.log(wsdls); // console.log(wsdls[24]); - const proc = new ProcessorWSDL({ - filePath : '../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl', - nodes : this.nodes, - types : this.types, - }); - await proc.main(); + // const proc = new ProcessorWSDL({ + // filePath : '../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl', + // nodes : this.nodes, + // types : this.types, + // }); + // await proc.main(); + for (const wdsl of wsdls) { + console.log(`processing ${wdsl}`); + const proc = new ProcessorWSDL({ + filePath : wdsl, + nodes : this.nodes, + types : this.types, + }); + await proc.main(); + } const nodeArr = ts.factory.createNodeArray(this.nodes); From 78e51010cb61d10a53c2568952d4e2e9330700c3 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 24 Mar 2024 19:56:21 +0300 Subject: [PATCH 082/112] feat(onvif-interface-generator): Method interface generation --- onvif/processor.ts | 89 ++++++++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/onvif/processor.ts b/onvif/processor.ts index eb10bcaf..dcda517f 100644 --- a/onvif/processor.ts +++ b/onvif/processor.ts @@ -153,9 +153,17 @@ interface IComplexType { }[]; } +interface IElement { + meta: { + name: string; + }; + 'xs:complexType': IComplexType[]; +} + interface ISchemaDefinition { 'xs:simpleType': ISimpleType[]; 'xs:complexType': IComplexType[]; + 'xs:element': IElement[]; } interface ProcessorConstructor { @@ -191,6 +199,9 @@ export class Processor { if (this.schema?.['xs:complexType']) { this.schema['xs:complexType'].forEach((complexType) => this.generateComplexTypeInterface(complexType)); } + if (this.schema?.['xs:element']) { + this.schema['xs:element'].forEach((element) => this.generateElementType(element)); + } this.writeInterface(); this.exportNodes = this.exportNodes.concat(this.nodes); return this.nodes; @@ -240,10 +251,13 @@ export class Processor { generateSimpleTypeInterface(simpleType: ISimpleType) { const name = cleanName(simpleType.meta.name); + if (this.types.has(name)) { + console.error(name); return; } this.types.add(name); + const interfaceSymbol = ts.factory.createIdentifier(name); if (simpleType['xs:restriction']) { /** RESTRICTIONS */ @@ -308,6 +322,18 @@ export class Processor { return this.createAnnotationIfExists(attribute, property); } + generateElementType(element: IElement) { + if (element['xs:complexType'] && typeof element['xs:complexType'][0] === 'object') { + element['xs:complexType'][0].meta = { + name : element.meta.name, + }; + this.generateComplexTypeInterface(element['xs:complexType'][0]); + } + // TODO method descriptions? + // element.meta + console.log(`> ${element.meta.name}`); + } + generateComplexTypeInterface(complexType: IComplexType) { const interfaceSymbol = ts.factory.createIdentifier(cleanName(complexType.meta.name)); @@ -325,7 +351,6 @@ export class Processor { complexType['xs:sequence'] = complexType['xs:complexContent'][0]['xs:extension'][0]['xs:sequence']; } - // attribute.use === 'required'; // optional if (complexType['xs:attribute']) { members = members.concat( complexType['xs:attribute'].map((attribute) => this.createProperty(attribute)), @@ -418,44 +443,38 @@ class InterfaceProcessor { this.types = new Set(); } async start() { - const xsds = await glob('../specs/wsdl/**/*.xsd'); - // console.log(xsds); - // xsds = ['../specs/wsdl/ver10/schema/common.xsd', '../specs/wsdl/ver10/schema/onvif.xsd']; - // console.log(xsds); this.nodes = builtInTypes; - for (const xsd of xsds) { - console.log(`processing ${xsd}`); - const proc = new ProcessorXSD({ - filePath : xsd, - nodes : this.nodes, - types : this.types, - }); - await proc.main(); - } - - const wsdls = await glob('../specs/wsdl/**/*.wsdl'); - // console.log(wsdls); - // console.log(wsdls[24]); - // const proc = new ProcessorWSDL({ - // filePath : '../specs/wsdl/ver10/device/wsdl/devicemgmt.wsdl', - // nodes : this.nodes, - // types : this.types, - // }); - // await proc.main(); - for (const wdsl of wsdls) { - console.log(`processing ${wdsl}`); - const proc = new ProcessorWSDL({ - filePath : wdsl, - nodes : this.nodes, - types : this.types, - }); - await proc.main(); - } + // const xsds = await glob('../specs/wsdl/**/*.xsd'); + // for (const xsd of xsds) { + // console.log(`processing ${xsd}`); + // const proc = new ProcessorXSD({ + // filePath : xsd, + // nodes : this.nodes, + // types : this.types, + // }); + // await proc.main(); + // } + + // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); + // for (const wdsl of wsdls) { + // console.log(`processing ${wdsl}`); + // const proc = new ProcessorWSDL({ + // filePath : wdsl, + // nodes : this.nodes, + // types : this.types, + // }); + // await proc.main(); + // } + + const proc = new ProcessorWSDL({ + filePath : '../specs/wsdl/ver20/ptz/wsdl/ptz.wsdl', + nodes : this.nodes, + types : this.types, + }); + await proc.main(); const nodeArr = ts.factory.createNodeArray(this.nodes); - - // printer for writing the AST to a file as code const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); const result = printer.printList( ts.ListFormat.MultiLine, From b8c00eb5cef4e6bb4b850d8d080ae6eaf5e87d6e Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 18 May 2024 00:05:54 +0300 Subject: [PATCH 083/112] feat(onvif-interface-generator): Part of XSD and WSDL interfaces work --- .eslintrc.js | 2 +- generateInterfaces.ts | 170 +++---- lib/device.js | 381 ++++++++-------- onvif/files.json | 6 + onvif/processor.ts | 70 ++- package-lock.json | 997 ++++++++++++++++++++++++++++++++++++------ package.json | 6 +- src/device.ts | 55 ++- src/discovery.ts | 6 - src/test.ts | 8 +- tsconfig.json | 5 +- 11 files changed, 1258 insertions(+), 448 deletions(-) create mode 100644 onvif/files.json diff --git a/.eslintrc.js b/.eslintrc.js index 8613acda..37e8c86a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -28,7 +28,7 @@ const commonRules = { }], '@typescript-eslint/member-delimiter-style' : 1, 'import/no-cycle' : 0, // IMPORTANT - 'import/export' : 0 + // 'import/export' : 0 }; module.exports = { diff --git a/generateInterfaces.ts b/generateInterfaces.ts index ce74f796..4cea013e 100644 --- a/generateInterfaces.ts +++ b/generateInterfaces.ts @@ -1,3 +1,8 @@ +/** + * Read: + * https://shadeglare.medium.com/typescript-code-generation-using-its-compiler-api-4c50ad9f7884 + */ + import { readFileSync, writeFileSync } from 'fs'; // eslint-disable-next-line import/no-extraneous-dependencies // import { glob } from 'glob'; @@ -25,34 +30,24 @@ const anyURI = ts.factory.createTypeAliasDeclaration( ts.factory.createTypeReferenceNode('string'), ); -// Primitive datatypes defined by SOAP (there are more) -type SoapPrimitive = - | 'xs:boolean' - | 'xs:double' - | 'xs:float' - | 'xs:int' - | 'xs:short' - | 'xs:signedInt' - | 'xs:string' - | 'xs:unsignedInt' - | 'xs:unsignedShort' - | 'xs:dateTime' - | 'xs:anyURI' -; - -const dataTypes: Record = { - 'xs:boolean' : 'boolean', - 'xs:double' : 'number', - 'xs:float' : 'number', - 'xs:int' : 'number', - 'xs:string' : 'string', - 'xs:short' : 'number', - 'xs:signedInt' : 'number', - 'xs:unsignedInt' : 'number', - 'xs:dateTime' : 'date', - 'xs:unsignedShort' : 'number', - 'xs:anyURI' : 'AnyURI', -}; +function dataTypes(xsdType?: string): string { + if (!xsdType) { + return 'any'; + } + const type = xsdType.slice(3); + switch (type) { + case 'double': return 'number'; + case 'float': return 'number'; + case 'int': return 'number'; + case 'short': return 'number'; + case 'signedInt': return 'number'; + case 'unsignedInt': return 'number'; + case 'unsignedShort': return 'number'; + case 'dateTime': return 'Date'; + case 'anyURI': return 'AnyURI'; + default: return type; + } +} interface ISimpleType { meta: { @@ -63,7 +58,7 @@ interface ISimpleType { }[]; 'xs:restriction': { meta: { - base: SoapPrimitive; + base: string; }; 'xs:enumeration'?: { meta: { @@ -80,16 +75,28 @@ interface IComplexType { 'xs:attribute'?: { meta : { name: string; - type: SoapPrimitive; + type: string; use: 'required' | 'optional'; }; - 'xs:annotation': { - 'xs:documentation': string[]; + }[]; + 'xs:sequence'?: { + 'xs:element': { + meta: { + name: string; + type: string; + use: 'required' | 'optional'; + }; + 'xs:annotation': { + 'xs:documentation': string[]; + }[]; }[]; }[]; + 'xs:annotation'?: { + 'xs:documentation': string[]; + }[]; } -interface ISchemaDefinition { +interface IXSDSchemaDefinition { 'xs:simpleType': ISimpleType[]; 'xs:complexType': IComplexType[]; } @@ -103,22 +110,19 @@ async function processXSD(filePath: string) { }); const serviceDefinition = await xmlParser.parseStringPromise(wsdlData); - return serviceDefinition['xs:schema'] as ISchemaDefinition; + return serviceDefinition['xs:schema'] as IXSDSchemaDefinition; } -function generateSimpleTypeInterface(simpleType: ISimpleType): ts.Node[] { - const cl: ts.Node[] = []; +function generateSimpleTypeInterface(simpleType: ISimpleType): ts.Node { const interfaceSymbol = ts.factory.createIdentifier(simpleType.meta.name); - if (simpleType['xs:annotation']) { - cl.push(ts.factory.createJSDocComment(simpleType['xs:annotation']?.[0]['xs:documentation'][0])); - } if (simpleType['xs:restriction'][0]['xs:enumeration']) { - cl.push( - // ts.factory.createEnumDeclaration( - // exportModifier, - // interfaceSymbol, // interface name - // simpleType['xs:restriction'][0]['xs:enumeration'].map((enumValue) => ts.factory.createEnumMember(enumValue.meta.value, ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value)))), - // ), + // ts.factory.createEnumDeclaration( + // exportModifier, + // interfaceSymbol, // interface name + // simpleType['xs:restriction'][0]['xs:enumeration'].map((enumValue) => ts.factory.createEnumMember(enumValue.meta.value, ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value)))), + // ), + return createAnnotationIfExists( + simpleType, ts.factory.createTypeAliasDeclaration( exportModifier, interfaceSymbol, // interface name @@ -126,52 +130,72 @@ function generateSimpleTypeInterface(simpleType: ISimpleType): ts.Node[] { ts.factory.createUnionTypeNode(simpleType['xs:restriction'][0]['xs:enumeration'].map((enumValue) => ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value)))), ), ); - } else { - cl.push(ts.factory.createTypeAliasDeclaration( + } + return createAnnotationIfExists( + simpleType, + ts.factory.createTypeAliasDeclaration( exportModifier, interfaceSymbol, undefined, - ts.factory.createTypeReferenceNode(dataTypes[simpleType['xs:restriction'][0].meta.base]), - )); - } - return cl; + ts.factory.createTypeReferenceNode(dataTypes(simpleType['xs:restriction'][0].meta.base)), + ), + ); } -function createDocComment(node: any) { - if (node['xs:annotation']) { +function createAnnotationIfExists(attribute: any, node: any) { + if (attribute['xs:annotation']) { return ts.addSyntheticLeadingComment( - ts.factory.createPropertySignature( - undefined, - node.meta.name, - undefined, - ts.factory.createTypeReferenceNode(dataTypes[node.meta.type as SoapPrimitive]), - ), + node, ts.SyntaxKind.MultiLineCommentTrivia, - `* ${node['xs:annotation']?.[0]['xs:documentation'][0]}`, + `* ${attribute['xs:annotation']?.[0]['xs:documentation'][0]} `, true, ); } - return ts.factory.createPropertySignature( - undefined, - node.meta.name, + return node; +} + +function createProperty(attribute: any) { + const property = ts.factory.createPropertySignature( undefined, - ts.factory.createTypeReferenceNode(dataTypes[node.meta.type as SoapPrimitive]), + attribute.meta.name, + attribute.meta.use !== 'required' ? ts.factory.createToken(ts.SyntaxKind.QuestionToken) : undefined, + ts.factory.createTypeReferenceNode(dataTypes(attribute.meta.type)), ); + return createAnnotationIfExists(attribute, property); } -function generateComplexTypeInterface(complexType: IComplexType) : ts.Node[] { +function generateComplexTypeInterface(complexType: IComplexType) : ts.Node { const interfaceSymbol = ts.factory.createIdentifier(complexType.meta.name); let members: ts.TypeElement[] = []; // attribute.use === 'required'; // optional if (complexType['xs:attribute']) { - members = complexType['xs:attribute'].map((attribute) => { - const cl = createDocComment(attribute); - return cl; - }); + members = members.concat( + complexType['xs:attribute'].map((attribute) => { + const cl = createProperty(attribute); + return cl; + }), + ); + } + if (complexType['xs:sequence']) { + if (!Array.isArray(complexType['xs:sequence'][0]['xs:element'])) { + // return ts.factory.createPropertySignature( + // undefined, + // complexType.meta.name, + // ts.factory.createToken(ts.SyntaxKind.QuestionToken), + // ts.factory.createTypeReferenceNode('any'), + // ); + } else { + members = members.concat( + members = complexType['xs:sequence'][0]['xs:element'].map((attribute) => { + const cl = createProperty(attribute); + return cl; + }), + ); + } } - const cl = ts.factory.createInterfaceDeclaration( + const node = ts.factory.createInterfaceDeclaration( exportModifier, // modifiers interfaceSymbol, // interface name undefined, // no generic type parameters @@ -179,7 +203,7 @@ function generateComplexTypeInterface(complexType: IComplexType) : ts.Node[] { members, ); - return [cl]; + return createAnnotationIfExists(complexType, node); } async function main() { @@ -190,11 +214,11 @@ async function main() { const simpleTypeInterfaces = serviceDefinition['xs:simpleType'].map( generateSimpleTypeInterface, - ).flat(); + ); const complexTypeInterfaces = serviceDefinition['xs:complexType'].map( generateComplexTypeInterface, - ).flat(); + ); const nodes: ts.Node[] = [anyURI, ...simpleTypeInterfaces, ...complexTypeInterfaces]; diff --git a/lib/device.js b/lib/device.js index c5bafc13..d4bcfc8d 100644 --- a/lib/device.js +++ b/lib/device.js @@ -5,7 +5,7 @@ * @licence MIT */ module.exports = function(Cam) { - const linerase = require('./utils').linerase; + const {linerase} = require('./utils'); /** * @typedef {object} Cam~NTPManual @@ -45,14 +45,14 @@ module.exports = function(Cam) { */ Cam.prototype.getNTP = function(callback) { this._request({ - service: 'device' - , body: this._envelopeHeader() + - '' + - '' + - '
' + service : 'device' + , body : `${this._envelopeHeader() + }` + + `` + + `
` }, function(err, data, xml) { if (!err) { - this.NTP = linerase(data[0]['getNTPResponse'][0]['NTPInformation'][0]); + this.NTP = linerase(data[0].getNTPResponse[0].NTPInformation[0]); } callback.call(this, err, err ? null : this.NTP, xml); }); @@ -73,32 +73,32 @@ module.exports = function(Cam) { if (options.type || options.ipv4Address || options.ipv6Address || options.dnsName || options.extension) { // Note the case changes to follow the xml parser rules options.NTPManual.push({ - type: options.type, - IPv4Address: options.ipv4Address, - IPv6Address: options.ipv6Address, - DNSname: options.dnsName, - extension: options.extension, + type : options.type, + IPv4Address : options.ipv4Address, + IPv6Address : options.ipv6Address, + DNSname : options.dnsName, + extension : options.extension, }); } - let body = this._envelopeHeader() + - '' + - '' + options.fromDHCP + ''; + let body = `${this._envelopeHeader() + }` + + `${ options.fromDHCP }`; if (options.NTPManual && Array.isArray(options.NTPManual)) { options.NTPManual.forEach((NTPManual)=>{ - body += ( NTPManual.type ? '' + - '' + NTPManual.type + '' + - ( NTPManual.IPv4Address ? '' + NTPManual.IPv4Address + '' : '' ) + - ( NTPManual.IPv6Address ? '' + NTPManual.IPv6Address + '' : '' ) + - ( NTPManual.DNSname ? '' + NTPManual.DNSname + '' : '' ) + - ( NTPManual.extension ? '' + NTPManual.extension + '' : '' ) + - '' : ''); + body += ( NTPManual.type ? `` + + `${ NTPManual.type }${ + NTPManual.IPv4Address ? `${ NTPManual.IPv4Address }` : '' + }${NTPManual.IPv6Address ? `${ NTPManual.IPv6Address }` : '' + }${NTPManual.DNSname ? `${ NTPManual.DNSname }` : '' + }${NTPManual.extension ? `${ NTPManual.extension }` : '' + }` : ''); }); } - body += '' + - this._envelopeFooter(); + body += `${ + this._envelopeFooter()}`; this._request({ - service: 'device' - , body: body + service : 'device' + , body }, callback.bind(this)); }; @@ -229,11 +229,11 @@ module.exports = function(Cam) { */ Cam.prototype.getNetworkInterfaces = function(callback) { this._request({ - service: 'device' - , body: this._envelopeHeader() + - '' + - this._envelopeFooter() - }, function(err, data, xml) { + service : 'device' + , body : `${this._envelopeHeader() + }${ + this._envelopeFooter()}` + }, (err, data, xml) => { if (!err) { this.networkInterfaces = linerase(data).getNetworkInterfacesResponse.networkInterfaces; // networkInterfaces is an array of network interfaces, but linerase remove the array if there is only one element inside @@ -243,7 +243,7 @@ module.exports = function(Cam) { if (callback) { callback.call(this, err, this.networkInterfaces, xml); } - }.bind(this)); + }); }; /** @@ -257,11 +257,11 @@ module.exports = function(Cam) { * Set network interfaces information * @param {object} options * @param {string} options.interfaceToken Network interface token - * @param {Cam~NetworkInterfaceSetConfiguration} options.networkInteface Network interface + * @param {Cam~NetworkInterfaceSetConfiguration} options.networkInterface Network interface * @param {Cam~SetNetworkInterfacesCallback} [callback] */ Cam.prototype.setNetworkInterfaces = function(options,callback) { - let ni = options.networkInterface; + const ni = options.networkInterface; let modifyIpv4 = false; let modifyIpv6 = false; if (ni.IPv4) { @@ -277,50 +277,47 @@ module.exports = function(Cam) { modifyIpv6 = false; } } - let body = this._envelopeHeader() + - '' + - '' + options.interfaceToken + '' + - '' + - '' + ni.enabled + '' + - (ni.link ? - '' + - '' + ni.link.autoNegotiation + '' + - '' + ni.link.speed + '' + - '' + ni.link.duplex + '' + - '' - : '' - ) + - (!isNaN(ni.MTU) ? '' + ni.MTU + '' : '') + - (ni.IPv4 ? - '' + - '' + ni.IPv4.enabled + '' + - '' + - '
' + ni.IPv4.manual.address + '
' + - '' + ni.IPv4.manual.prefixLength + '' + - '
' + - '' + ni.IPv4.DHCP + '' + - '
' - : '' - ) + - (ni.IPv6 ? - '' + - '' + ni.IPv6.enabled + '' + - '' + ni.IPv6.acceptRouterAdvert + '' + - '' + - '
' + ni.IPv6.manual.address + '
' + - '' + ni.IPv6.manual.prefixLength + '' + - '
' + - '' + ni.IPv6.DHCP + '' + - '
' - : '' - ) + - '
' + - '
' + - this._envelopeFooter(); + const body = `${this._envelopeHeader() + }` + + `${ options.interfaceToken }` + + `` + + `${ ni.enabled }${ + ni.link ? + `` + + `${ ni.link.autoNegotiation }` + + `${ ni.link.speed }` + + `${ ni.link.duplex }` + + `` + : '' + }${!isNaN(ni.MTU) ? `${ ni.MTU }` : '' + }${ni.IPv4 ? + `` + + `${ ni.IPv4.enabled }` + + `` + + `
${ ni.IPv4.manual.address }
` + + `${ ni.IPv4.manual.prefixLength }` + + `
` + + `${ ni.IPv4.DHCP }` + + `
` + : '' + }${ni.IPv6 ? + `` + + `${ ni.IPv6.enabled }` + + `${ ni.IPv6.acceptRouterAdvert }` + + `` + + `
${ ni.IPv6.manual.address }
` + + `${ ni.IPv6.manual.prefixLength }` + + `
` + + `${ ni.IPv6.DHCP }` + + `
` + : '' + }
` + + `
${ + this._envelopeFooter()}`; this._request({ - service: 'device' - , body: body, - }, function(err, data, xml) { + service : 'device' + , body, + }, (err, data, xml) => { if (callback) { if (!err) { if (modifyIpv4) {this.hostname = ni.IPv4.manual.address;} @@ -329,7 +326,7 @@ module.exports = function(Cam) { } callback.call(this, err, data, xml); } - }.bind(this)); + }); }; /** @@ -351,18 +348,18 @@ module.exports = function(Cam) { */ Cam.prototype.getNetworkDefaultGateway = function(callback) { this._request({ - service: 'device' - , body: this._envelopeHeader() + - '' + - this._envelopeFooter() - }, function(err, data, xml) { + service : 'device' + , body : `${this._envelopeHeader() + }${ + this._envelopeFooter()}` + }, (err, data, xml) => { if (callback) { if (!err) { this.networkDefaultGateway = linerase(data[0].getNetworkDefaultGatewayResponse[0].networkGateway); } callback.call(this, err, this.networkDefaultGateway, xml); } - }.bind(this)); + }); }; /** @@ -372,21 +369,21 @@ module.exports = function(Cam) { */ Cam.prototype.setNetworkDefaultGateway = function(options,callback) { this._request({ - service: 'device' - , body: this._envelopeHeader() + - '' + - (options.IPv4Address ? '' + options.IPv4Address + '' : '') + - (options.IPv6Address ? '' + options.IPv6Address + '' : '') + - '' + - this._envelopeFooter() - }, function(err, data, xml) { + service : 'device' + , body : `${this._envelopeHeader() + }${ + options.IPv4Address ? `${ options.IPv4Address }` : '' + }${options.IPv6Address ? `${ options.IPv6Address }` : '' + }${ + this._envelopeFooter()}` + }, (err, data, xml) => { if (callback) { if (err) { return callback.call(this,err,data,xml); } this.getNetworkDefaultGateway(callback.bind(this)); } - }.bind(this)); + }); }; /** @@ -417,11 +414,11 @@ module.exports = function(Cam) { */ Cam.prototype.getDNS = function(callback) { this._request({ - service: 'device' - , body: this._envelopeHeader() + - '' + - this._envelopeFooter() - }, function(err, data, xml) { + service : 'device' + , body : `${this._envelopeHeader() + }${ + this._envelopeFooter()}` + }, (err, data, xml) => { if (callback) { if (!err) { this.DNS = linerase(data[0].getDNSResponse[0].DNSInformation); @@ -430,7 +427,7 @@ module.exports = function(Cam) { } callback.call(this, err, this.DNS, xml); } - }.bind(this)); + }); }; /** @@ -439,32 +436,32 @@ module.exports = function(Cam) { * @param {Cam~GetDNSCallback} [callback] */ Cam.prototype.setDNS = function(options,callback) { - let body = this._envelopeHeader() + - '' + - '' + (!!options.fromDHCP) + '' + - (options.searchDomain ? '' + options.searchDomain + '' : ''); - options.DNSManual.forEach(function(dns) { - body += '' + - '' + - ((dns.type === "IPv6") ? "IPv6" : 'IPv4') + - '' + - (dns.IPv4Address ? '' + dns.IPv4Address + '' : '') + - (dns.IPv6Address ? '' + dns.IPv6Address + '' : '') + - ''; + let body = `${this._envelopeHeader() + }` + + `${ !!options.fromDHCP }${ + options.searchDomain ? `${ options.searchDomain }` : ''}`; + options.DNSManual.forEach((dns) => { + body += `` + + `${ + (dns.type === "IPv6") ? "IPv6" : 'IPv4' + }${ + dns.IPv4Address ? `${ dns.IPv4Address }` : '' + }${dns.IPv6Address ? `${ dns.IPv6Address }` : '' + }`; }); - body += '' + - this._envelopeFooter(); + body += `${ + this._envelopeFooter()}`; this._request({ - service: 'device' - , body: body, - }, function(err, data, xml) { + service : 'device' + , body, + }, (err, data, xml) => { if (callback) { if (err) { return callback.call(this, err, null, xml); } this.getDNS(callback); } - }.bind(this)); + }); }; /** @@ -489,18 +486,18 @@ module.exports = function(Cam) { Cam.prototype.getNetworkProtocols = function(callback) { this._request({ - service: 'device' - , body: this._envelopeHeader() + - '' + - this._envelopeFooter() - }, function(err, data, xml) { + service : 'device' + , body : `${this._envelopeHeader() + }${ + this._envelopeFooter()}` + }, (err, data, xml) => { if (!err) { this.networkProtocols = linerase(data).getNetworkProtocolsResponse; } if (callback) { callback.call(this, err, this.networkProtocols, xml); } - }.bind(this)); + }); }; /** @@ -524,23 +521,21 @@ module.exports = function(Cam) { */ Cam.prototype.getUsers = function(callback) { this._request({ - service: 'device' - , body: this._envelopeHeader() + - '' + - this._envelopeFooter() - }, function(err, data, xml) { + service : 'device' + , body : `${this._envelopeHeader() + }${ + this._envelopeFooter()}` + }, (err, data, xml) => { if (callback) { if (!err) { - var users = data[0].getUsersResponse[0].user; - users = users.map(function(user) { - return linerase(user); - }); + let users = data[0].getUsersResponse[0].user; + users = users.map((user) => linerase(user)); this.users = users; data = users; } callback.call(this, err, data, xml); } - }.bind(this)); + }); }; /** @@ -549,7 +544,7 @@ module.exports = function(Cam) { * @param {Cam~GetUsersCallback} [callback] */ Cam.prototype.createUsers = function(users,callback) { - const usersOk = users.every(function(user) { + const usersOk = users.every((user) => { if (!user.username || !user.password || !user.userLevel) { return false; } @@ -559,23 +554,23 @@ module.exports = function(Cam) { callback.call(this,new Error('Missing username, password or user level'),null,null); return; } - var usersXml = ''; - users.forEach(function(user) { - usersXml += '' + - '' + user.username + '' + - '' + user.password + '' + - '' + user.userLevel + '' + - ''; + let usersXml = ''; + users.forEach((user) => { + usersXml += `` + + `${ user.username }` + + `${ user.password }` + + `${ user.userLevel }` + + ``; }); - var body = this._envelopeHeader() + - '' + - usersXml + - '' + - this._envelopeFooter(); + const body = `${this._envelopeHeader() + }${ + usersXml + }${ + this._envelopeFooter()}`; this._request({ - service: 'device' - , body: body, - }, function(err, data, xml) { + service : 'device' + , body, + }, (err, data, xml) => { if (callback) { if (err) { callback.call(this, err, data, xml); @@ -583,7 +578,7 @@ module.exports = function(Cam) { this.getUsers(callback); } } - }.bind(this)); + }); }; /** @@ -592,7 +587,7 @@ module.exports = function(Cam) { * @param {Cam~GetUsersCallback} [callback] */ Cam.prototype.setUsers = function(users,callback) { - const usersOk = users.every(function(user) { + const usersOk = users.every((user) => { if (!user.username || !user.password || !user.userLevel) { return false; } @@ -602,28 +597,28 @@ module.exports = function(Cam) { callback.call(this,new Error('Missing username, password or user level'),null,null); return; } - var usersXml = ''; - users.forEach(function(user) { - usersXml += '' + - '' + user.username + '' + - '' + user.password + '' + - '' + user.userLevel + '' + - ''; + let usersXml = ''; + users.forEach((user) => { + usersXml += `` + + `${ user.username }` + + `${ user.password }` + + `${ user.userLevel }` + + ``; }); - var body = this._envelopeHeader() + - '' + // Although SetUser is not plural, we can set multiple users at a time - usersXml + - '' + - this._envelopeFooter(); + const body = `${this._envelopeHeader() + }${ // Although SetUser is not plural, we can set multiple users at a time + usersXml + }${ + this._envelopeFooter()}`; this._request({ - service: 'device' - , body: body, - }, function(err, data, xml) { + service : 'device' + , body, + }, (err, data, xml) => { if (callback) { if (err) { callback.call(this, err, data, xml); } else { - var delayGet = false; + let delayGet = false; users.some(function(usr) { if (usr.username === this.username) { delayGet = true; @@ -632,13 +627,13 @@ module.exports = function(Cam) { } }); if (delayGet) { // On some cameras, changing the user password we currently use is not effective right away - setTimeout((function() {this.getUsers(callback);}).bind(this),2000); + setTimeout((() => {this.getUsers(callback);}),2000); } else { this.getUsers(callback); } } } - }.bind(this)); + }); }; /** @@ -647,30 +642,30 @@ module.exports = function(Cam) { * @param {Cam~GetUsersCallback} [callback] */ Cam.prototype.deleteUsers = function(users,callback) { - var usernames = []; - users.forEach(function(user) { - if (typeof user == 'string' && user.length > 0) { + const usernames = []; + users.forEach((user) => { + if (typeof user === 'string' && user.length > 0) { usernames.push(user); - } else if (typeof user == 'object' && user.username) { + } else if (typeof user === 'object' && user.username) { usernames.push(user.username); } }); if (!usernames.length) { return callback.call(this,new Error('No username'),null,null); } - var usersXml = ''; - usernames.forEach(function(username) { - usersXml += '' + username + ''; + let usersXml = ''; + usernames.forEach((username) => { + usersXml += `${ username }`; }); - var body = this._envelopeHeader() + - '' + - usersXml + - '' + - this._envelopeFooter(); + const body = `${this._envelopeHeader() + }${ + usersXml + }${ + this._envelopeFooter()}`; this._request({ - service: 'device' - , body: body, - }, function(err, data, xml) { + service : 'device' + , body, + }, (err, data, xml) => { if (callback) { if (err) { callback.call(this, err, data, xml); @@ -678,7 +673,7 @@ module.exports = function(Cam) { this.getUsers(callback); } } - }.bind(this)); + }); }; /** @@ -688,17 +683,17 @@ module.exports = function(Cam) { * @param {function} callback */ Cam.prototype.sendAuxiliaryCommand = function(options, callback) { - let body = this._envelopeHeader() + - '' - + '' + options.data + '' - + '' + this._envelopeFooter(); + const body = `${this._envelopeHeader() + }` + + `${ options.data }` + + `${ this._envelopeFooter()}`; this._request({ - service: 'device', - body: body, - }, function(err, data, xml) { + service : 'device', + body, + }, (err, data, xml) => { if (callback) { callback.call(this, err, data, xml); } - }.bind(this)); + }); }; }; diff --git a/onvif/files.json b/onvif/files.json new file mode 100644 index 00000000..1d109297 --- /dev/null +++ b/onvif/files.json @@ -0,0 +1,6 @@ +{ + "modules": { + "ptz.wsdl": "ptz", + "devicemgmt.wsdl": "device" + } +} diff --git a/onvif/processor.ts b/onvif/processor.ts index dcda517f..1cebd779 100644 --- a/onvif/processor.ts +++ b/onvif/processor.ts @@ -170,25 +170,33 @@ interface ProcessorConstructor { filePath: string; nodes: ts.Node[]; types: Set; + links: Links; } +type Links = Map + /** * Common class to process xml-files */ export class Processor { - private filePath: string; + private readonly filePath: string; private readonly nodes: ts.Node[] = []; protected schema?: ISchemaDefinition; private readonly types: Set; private exportNodes: ts.Node[]; + private links: Links; + private readonly fileName: string; constructor({ filePath, nodes, types, + links, }: ProcessorConstructor) { this.filePath = filePath; this.exportNodes = nodes; this.types = types; + this.links = links; + this.fileName = path.parse(this.filePath).name; } async main(): Promise { @@ -219,7 +227,7 @@ export class Processor { ); // write the code to file - writeFileSync(`./onvif/interfaces/${path.parse(this.filePath).name}.ts`, result, { encoding : 'utf-8' }); + writeFileSync(`./onvif/interfaces/${this.fileName}.d.ts`, result, { encoding : 'utf-8' }); } async processXML() { @@ -249,6 +257,17 @@ export class Processor { return node; } + addNode(name: string, node: ts.Node) { + if (this.links.has(name)) { + console.log(`>>> ${name}`); + } + this.links.set(name, { + node, + name : this.fileName, + }); + this.nodes.push(node); + } + generateSimpleTypeInterface(simpleType: ISimpleType) { const name = cleanName(simpleType.meta.name); @@ -262,7 +281,8 @@ export class Processor { if (simpleType['xs:restriction']) { /** RESTRICTIONS */ if (simpleType['xs:restriction'][0]['xs:enumeration']) { - this.nodes.push( + this.addNode( + name, this.createAnnotationIfExists( simpleType, ts.factory.createTypeAliasDeclaration( @@ -275,7 +295,8 @@ export class Processor { ), ); } else { - this.nodes.push( + this.addNode( + name, this.createAnnotationIfExists( simpleType, ts.factory.createTypeAliasDeclaration( @@ -289,7 +310,8 @@ export class Processor { } } else if (simpleType['xs:list']) { /** LISTS */ - this.nodes.push( + this.addNode( + name, this.createAnnotationIfExists( simpleType, ts.factory.createTypeAliasDeclaration( @@ -335,7 +357,8 @@ export class Processor { } generateComplexTypeInterface(complexType: IComplexType) { - const interfaceSymbol = ts.factory.createIdentifier(cleanName(complexType.meta.name)); + const { name } = complexType.meta; + const interfaceSymbol = ts.factory.createIdentifier(cleanName(name)); let members: ts.TypeElement[] = []; let heritage; @@ -379,7 +402,6 @@ export class Processor { // ts.factory.createTypeReferenceNode('any'), // ); } else { - // console.log(complexType); members = members.concat( members = complexType['xs:sequence'][0]['xs:element'].map((attribute) => { // console.log(attribute.meta.name); @@ -393,7 +415,6 @@ export class Processor { return cl; }), ); - // console.log('------------'); } } @@ -404,8 +425,8 @@ export class Processor { heritage, members, ); - - this.nodes.push( + this.addNode( + name, this.createAnnotationIfExists(complexType, node), ); } @@ -435,9 +456,15 @@ class ProcessorWSDL extends Processor { } } +interface IType { + name?: string; + node: ts.Node; +} + class InterfaceProcessor { private nodes: ts.Node[]; private types: Set; + private links: Links = new Map(); constructor() { this.nodes = []; this.types = new Set(); @@ -445,16 +472,17 @@ class InterfaceProcessor { async start() { this.nodes = builtInTypes; - // const xsds = await glob('../specs/wsdl/**/*.xsd'); - // for (const xsd of xsds) { - // console.log(`processing ${xsd}`); - // const proc = new ProcessorXSD({ - // filePath : xsd, - // nodes : this.nodes, - // types : this.types, - // }); - // await proc.main(); - // } + const xsds = await glob('../specs/wsdl/**/*.xsd'); + for (const xsd of xsds) { + console.log(`processing ${xsd}`); + const proc = new ProcessorXSD({ + filePath : xsd, + nodes : this.nodes, + types : this.types, + links : this.links, + }); + await proc.main(); + } // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); // for (const wdsl of wsdls) { @@ -463,6 +491,7 @@ class InterfaceProcessor { // filePath : wdsl, // nodes : this.nodes, // types : this.types, + // links : this.links, // }); // await proc.main(); // } @@ -471,6 +500,7 @@ class InterfaceProcessor { filePath : '../specs/wsdl/ver20/ptz/wsdl/ptz.wsdl', nodes : this.nodes, types : this.types, + links : this.links, }); await proc.main(); diff --git a/package-lock.json b/package-lock.json index 807d3c6e..6a414211 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^5.1.3", + "glob": "^10.3.10", "ip": "^2.0.1", "keypress": "^0.2.1", "mocha": "^10.3.0", @@ -32,8 +33,9 @@ "nimble": "^0.0.2", "nyc": "^15.1.0", "prettier": "^3.2.5", - "typedoc": "^0.25.10", - "typescript": "^5.3.3" + "ts-node": "^10.9.2", + "typedoc": "^0.25.12", + "typescript": "^5.4.3" }, "engines": { "node": ">=6.0" @@ -466,6 +468,18 @@ "node": ">=6.9.0" } }, + "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/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -531,18 +545,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@eslint/eslintrc/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/@eslint/js": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", @@ -566,18 +568,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -597,6 +587,102 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "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", @@ -692,6 +778,31 @@ "node": ">=8" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "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/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -727,6 +838,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -739,6 +860,30 @@ "url": "https://opencollective.com/unts" } }, + "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.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1016,6 +1161,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -1115,6 +1269,12 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "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": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1627,6 +1787,12 @@ "node": ">=6" } }, + "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-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1788,6 +1954,12 @@ "dottojs": "bin/dot-packer" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -2195,18 +2367,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2345,18 +2505,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/eslint/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/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -2784,20 +2932,22 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2815,6 +2965,58 @@ "node": ">=10.13.0" } }, + "node_modules/glob/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/glob/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -3564,6 +3766,24 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3788,6 +4008,12 @@ "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/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -3844,9 +4070,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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" @@ -3861,6 +4087,15 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mocha": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", @@ -4115,6 +4350,26 @@ "node": ">=8" } }, + "node_modules/nyc/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/nyc/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -4440,7 +4695,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4461,6 +4716,31 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -4820,6 +5100,26 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/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/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5108,6 +5408,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "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.trim": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", @@ -5165,6 +5480,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "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", @@ -5237,7 +5565,27 @@ "minimatch": "^3.0.4" }, "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/test-exclude/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/text-table": { @@ -5292,6 +5640,58 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "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/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/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -5456,9 +5856,9 @@ } }, "node_modules/typedoc": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.10.tgz", - "integrity": "sha512-v10rtOFojrjW9og3T+6wAKeJaGMuojU87DXGZ33sfs+554wgPTRG+s07Ag1BjPZI85Y5QPVouPI63JQ6fcQM5w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.12.tgz", + "integrity": "sha512-F+qhkK2VoTweDXd1c42GS/By2DvI2uDF4/EpG424dTexSHdtCH52C6IcAvMA6jR3DzAWZjHpUOW+E02kyPNUNw==", "dev": true, "dependencies": { "lunr": "^2.3.9", @@ -5473,7 +5873,7 @@ "node": ">= 16" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x" + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x" } }, "node_modules/typedoc/node_modules/brace-expansion": { @@ -5501,9 +5901,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5553,6 +5953,12 @@ "uuid": "bin/uuid" } }, + "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/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -5658,6 +6064,24 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "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", @@ -5753,6 +6177,15 @@ "node": ">=10" } }, + "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", @@ -6096,6 +6529,15 @@ "to-fast-properties": "^2.0.0" } }, + "@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" + } + }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -6142,15 +6584,6 @@ "requires": { "argparse": "^2.0.1" } - }, - "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" - } } } }, @@ -6169,17 +6602,6 @@ "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" - }, - "dependencies": { - "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" - } - } } }, "@humanwhocodes/module-importer": { @@ -6194,6 +6616,71 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -6264,6 +6751,28 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.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" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -6290,12 +6799,43 @@ "fastq": "^1.6.0" } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "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.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -6472,6 +7012,12 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -6546,6 +7092,12 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "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": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -6932,6 +7484,12 @@ "request": "^2.88.2" } }, + "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-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -7040,6 +7598,12 @@ "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==", "dev": true }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -7241,15 +7805,6 @@ "requires": { "argparse": "^2.0.1" } - }, - "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" - } } } }, @@ -7392,15 +7947,6 @@ "esutils": "^2.0.2" } }, - "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" - } - }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -7780,17 +8326,52 @@ } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.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" + } + }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + } } }, "glob-parent": { @@ -8327,6 +8908,16 @@ "istanbul-lib-report": "^3.0.0" } }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8502,6 +9093,12 @@ } } }, + "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 + }, "marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -8540,9 +9137,9 @@ } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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" @@ -8554,6 +9151,12 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + }, "mocha": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", @@ -8758,6 +9361,20 @@ "path-exists": "^4.0.0" } }, + "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" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -9001,7 +9618,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { @@ -9016,6 +9633,24 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true + } + } + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -9263,6 +9898,22 @@ "dev": true, "requires": { "glob": "^7.1.3" + }, + "dependencies": { + "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" + } + } } }, "run-parallel": { @@ -9469,6 +10120,17 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@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.trim": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", @@ -9511,6 +10173,15 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@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", @@ -9557,6 +10228,22 @@ "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "dependencies": { + "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" + } + } } }, "text-table": { @@ -9597,6 +10284,35 @@ "dev": true, "requires": {} }, + "ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "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": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, "tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -9724,9 +10440,9 @@ } }, "typedoc": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.10.tgz", - "integrity": "sha512-v10rtOFojrjW9og3T+6wAKeJaGMuojU87DXGZ33sfs+554wgPTRG+s07Ag1BjPZI85Y5QPVouPI63JQ6fcQM5w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.12.tgz", + "integrity": "sha512-F+qhkK2VoTweDXd1c42GS/By2DvI2uDF4/EpG424dTexSHdtCH52C6IcAvMA6jR3DzAWZjHpUOW+E02kyPNUNw==", "dev": true, "requires": { "lunr": "^2.3.9", @@ -9756,9 +10472,9 @@ } }, "typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", "dev": true }, "unbox-primitive": { @@ -9794,6 +10510,12 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "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 + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -9875,6 +10597,17 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@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", @@ -9952,6 +10685,12 @@ "is-plain-obj": "^2.1.0" } }, + "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", diff --git a/package.json b/package.json index 5e17300b..4a1ac467 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^5.1.3", + "glob": "^10.3.10", "ip": "^2.0.1", "keypress": "^0.2.1", "mocha": "^10.3.0", @@ -77,7 +78,8 @@ "nimble": "^0.0.2", "nyc": "^15.1.0", "prettier": "^3.2.5", - "typedoc": "^0.25.10", - "typescript": "^5.3.3" + "ts-node": "^10.9.2", + "typedoc": "^0.25.12", + "typescript": "^5.4.3" } } diff --git a/src/device.ts b/src/device.ts index d5e5f36a..1004837b 100644 --- a/src/device.ts +++ b/src/device.ts @@ -382,13 +382,12 @@ export interface DeviceServiceCapabilities { auxiliaryCommands?: string[]; } -type NetworkHostType = 'IPv4'| 'IPv6' | 'DNS'; type IPv4Address = string; type IPv6Address = string; export interface IPAddress { /** Indicates if the address is an IPv4 or IPv6 address */ - type: 'IPv4' | 'IPv6'; + type: NetworkType; /** IPv4 address */ IPv4Address?: IPv4Address; /** IPv6 address */ @@ -397,7 +396,7 @@ export interface IPAddress { export interface NetworkHost { /* Network host type: IPv4, IPv6 or DNS. */ - type: NetworkHostType; + type: NetworkType; /* IPv4 address. */ IPv4Address?: IPv4Address; /* IPv6 address. */ @@ -487,49 +486,53 @@ export interface NetworkInterfaceLink { } export interface PrefixedIPv4Address { - /* IPv4 address */ + /** IPv4 address */ address: IPv4Address; // Prefix/submask length prefixLength: number; } export interface IPv4Configuration { - /* List of manually added IPv4 addresses. */ + /** List of manually added IPv4 addresses. */ manual?: PrefixedIPv4Address[]; - /* Link local address. */ + /** Link local address. */ linkLocal?: PrefixedIPv4Address; - /* IPv4 address configured by using DHCP. */ + /** IPv4 address configured by using DHCP. */ fromDHCP?: PrefixedIPv4Address; - /* Indicates whether or not DHCP is used. */ - DHCP: boolean; + /** Indicates whether or not DHCP is used. */ + DHCP?: boolean; + /** Indicates whether or not IPv4 is enabled. */ + enabled?: boolean; } export interface IPv4NetworkInterface { - /* Indicates whether or not IPv4 is enabled. */ + /** Indicates whether or not IPv4 is enabled. */ enabled: boolean; - /* IPv4 configuration. */ + /** IPv4 configuration. */ config?: IPv4Configuration; } export interface PrefixedIPv6Address { - /* IPv6 address */ + /** IPv6 address */ address: IPv6Address; - /* Prefix/submask length */ + /** Prefix/submask length */ prefixLength: number; } export interface IPv6Configuration { - /* Indicates whether router advertisment is used. */ + /** Indicates whether router advertisment is used. */ acceptRouterAdvert?: boolean; - /* DHCP configuration. */ + /** Indicates whether or not IPv6 is enabled. */ + enabled?: boolean; + /** DHCP configuration. */ DHCP: 'Auto' | 'Stateful' | 'Stateless' | 'Off'; - /* List of manually entered IPv6 addresses. */ + /** List of manually entered IPv6 addresses. */ manual?: PrefixedIPv6Address[]; - /* List of link local IPv6 addresses. */ + /** List of link local IPv6 addresses. */ linkLocal?: PrefixedIPv6Address[]; - /* List of IPv6 addresses configured by using DHCP. */ + /** List of IPv6 addresses configured by using DHCP. */ fromDHCP?: PrefixedIPv6Address[]; - /* List of IPv6 addresses configured by using router advertisment. */ + /** List of IPv6 addresses configured by using router advertisment. */ fromRA?: PrefixedIPv6Address[]; extension?: any; } @@ -794,7 +797,10 @@ export class Device { return this.#NTP!; } - async setNTP(options: SetNTPOptions) { + /** + * Set the NTP settings on a device + */ + async setNTP(options: SetNTPOptions): Promise { if (!Array.isArray(options.NTPManual)) { options.NTPManual = []; } @@ -827,7 +833,7 @@ export class Device { service : 'device', body, }); - return linerase(data); + return linerase(data[0].setNTPResponse); } /** @@ -864,4 +870,11 @@ export class Device { } return this.#networkInterfaces; } + + /** + * Set network interfaces information + */ + // async setNetworkInterfaces(options: SetNetworkInterfacesOptions) { + // + // } } diff --git a/src/discovery.ts b/src/discovery.ts index 67abf8db..acc48724 100644 --- a/src/discovery.ts +++ b/src/discovery.ts @@ -70,12 +70,6 @@ export class DiscoverySingleton extends EventEmitter { /** * Discover NVT devices in the subnetwork - * @param {object} [options] - * @param {number} [options.timeout=5000] timeout in milliseconds for discovery responses - * @param {boolean} [options.resolve=true] set to `false` if you want omit creating of Cam objects - * @param {string} [options.messageId=GUID] WS-Discovery message id - * @param {string} [options.device=defaultroute] Interface to bind on for discovery ex. `eth0` - * @param {number} [options.listeningPort=null] client will listen to discovery data device sent * @example * ```typescript * import { Discovery } from 'onvif'; diff --git a/src/test.ts b/src/test.ts index bb353924..2ea5160a 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,4 +1,4 @@ -import { Onvif, Discovery, Profile } from './index'; +import { NetworkType, Onvif } from './index'; // eslint-disable-next-line @typescript-eslint/no-var-requires const serverMockup = require('../test/serverMockup'); @@ -22,6 +22,12 @@ const serverMockup = require('../test/serverMockup'); console.log('-------------------------------------------'); console.log(await cam.ptz.getStatus()); console.log('-------------------------------------------'); + console.log(await cam.device.setNTP({ + NTPManual : [{ + type : NetworkType.DNS, + }], + })); + console.log(4); // console.log(profiles); // Discovery.on('device', console.log); // const cams = await Discovery.probe({ timeout : 1000 }); diff --git a/tsconfig.json b/tsconfig.json index 940b6384..4c07e7f6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "CommonJS", - "target": "ES2020", + "target": "ES2022", "sourceMap": true, "strict": true, "outDir": "build", @@ -19,6 +19,7 @@ "node_modules" ], "include": [ - "src/**/*" + "src/**/*", + "soap-types1.ts" ] } From 48d5f431caa0769a02fa69c42018aeeedcafea35 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 02:19:03 +0300 Subject: [PATCH 084/112] chore: update paths and packages --- .eslintrc.js | 6 +- compatibilityTest/common.js | 15 +- compatibilityTest/device.js | 28 +- compatibilityTest/serverMockup.js | 46 +- package-lock.json | 3428 +++++++++++++++++++++++++---- package.json | 13 +- tsconfig.json | 2 +- 7 files changed, 3091 insertions(+), 447 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 37e8c86a..1db3349e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,8 @@ const commonRules = { 'no-console' : 'warn', + 'comma-dangle' : [ 'error', 'always-multiline' ], 'import/extensions' : 0, + 'import/no-cycle' : 0, 'quote-props' : 0, 'import/prefer-default-export' : 0, 'no-await-in-loop' : 0, @@ -9,6 +11,7 @@ const commonRules = { 'no-underscore-dangle' : 0, 'no-param-reassign' : 0, 'no-unused-expressions' : 0, + 'no-unused-vars' : 'warn', 'no-case-declarations' : 0, 'no-shadow' : 0, 'brace-style' : ["error", "1tbs", { "allowSingleLine" : true }], @@ -27,8 +30,9 @@ const commonRules = { }, }], '@typescript-eslint/member-delimiter-style' : 1, - 'import/no-cycle' : 0, // IMPORTANT + 'import/no-extraneous-dependencies' : 0, // 'import/export' : 0 + 'object-curly-newline' : ['error', {multiline : true, consistent : true}], }; module.exports = { diff --git a/compatibilityTest/common.js b/compatibilityTest/common.js index b9d164e2..5180f361 100644 --- a/compatibilityTest/common.js +++ b/compatibilityTest/common.js @@ -2,7 +2,7 @@ const synthTest = !process.env.HOSTNAME; const assert = require('assert'); -const onvif = require('../build/legacy/cam'); +const onvif = require('../build/compatibility/cam'); let serverMockup; if (synthTest) { @@ -51,7 +51,7 @@ describe('Common functions', () => { it('should not connect automatically', (done) => { const options = { autoconnect : false, - timeout : 0 + timeout : 0, }; new onvif.Cam(options, assert.fail); setTimeout(done, 100); @@ -93,19 +93,20 @@ describe('Common functions', () => { }); }); it('should work nice with the proper request body', (done) => { - cam._request({ - body : ''} + cam._request({body : ''} , (err) => { assert.strictEqual(err, null); done(); }); }); it('should handle SOAP Fault as an error (http://www.onvif.org/onvif/ver10/tc/onvif_core_ver10.pdf, pp.45-46)', (done) => { - cam._request({body : '' + + cam._request({ +body : '' + '' + '' + '' + - ''} + '', +} , (err) => { assert.notStrictEqual(err, null); assert.ok(err instanceof Error); @@ -153,7 +154,7 @@ describe('Common functions', () => { describe('setSystemDateAndTime', () => { it('should throws an error when `dateTimeType` is wrong', (done) => { cam.setSystemDateAndTime({ - dateTimeType : 'blah' + dateTimeType : 'blah', }, (err) => { assert.notStrictEqual(err, null); done(); diff --git a/compatibilityTest/device.js b/compatibilityTest/device.js index e710664b..c42fd365 100644 --- a/compatibilityTest/device.js +++ b/compatibilityTest/device.js @@ -65,11 +65,11 @@ describe('Device', () => { }); it('should set NTP from DHCP', (done) => cam.setNTP({ - fromDHCP : true + fromDHCP : true, }, (err) => { assert.strictEqual(err, null); done(); - }) + }), ); it('should set multiple NTPs', (done) => { cam.setNTP({ @@ -84,7 +84,7 @@ describe('Device', () => { ipv6Address : '::1/128', dnsName : '8.8.8.8', }, - ] + ], }, (err) => { assert.strictEqual(err, null); done(); @@ -116,9 +116,9 @@ describe('Device', () => { manual : { address : '127.0.0.1', prefixLength : 24, - } - } - } + }, + }, + }, }, (err, data) => { const newIP = cam.hostname; // Save the new IP cam.hostname = currentIP; // Then set the original one for other tests @@ -140,9 +140,9 @@ describe('Device', () => { manual : { address : '::1', prefixLength : 24, - } - } - } + }, + }, + }, }, (err, data) => { const newIP = cam.hostname; // Save the new IP cam.hostname = currentIP; // Then set the original one for other tests @@ -161,7 +161,7 @@ describe('Device', () => { assert.strictEqual(data.IPv4Address, '192.168.0.1'); assert.strictEqual(data.IPv6Address, ''); done(); - }) + }), ); }); @@ -215,8 +215,8 @@ describe('Device', () => { { type : 'IPv4', IPv4Address : '9.9.9.9', - } - ] + }, + ], }, (err, data) => { assert.strictEqual(err, null); assert.ok(Array.isArray(data.DNSManual)); // Impossible to test the set values as the response is hard written in serverMockup/device.GetNetworkDefaultGateway.xml @@ -234,8 +234,8 @@ describe('Device', () => { { type : 'IPv6', IPv6Address : '2001:4860:4860::8844', - } - ] + }, + ], }, (err, data) => { assert.strictEqual(err, null); assert.ok(Array.isArray(data.DNSManual)); // Impossible to test the set values as the response is hard written in serverMockup/device.GetNetworkDefaultGateway.xml diff --git a/compatibilityTest/serverMockup.js b/compatibilityTest/serverMockup.js index a27f4d23..a444c8b2 100644 --- a/compatibilityTest/serverMockup.js +++ b/compatibilityTest/serverMockup.js @@ -2,17 +2,17 @@ const http = require('http'); const dgram = require('dgram'); const xml2js = require('xml2js'); const fs = require('fs'); -const Buffer = require('buffer').Buffer; -// eslint-disable-next-line node/no-unpublished-require -const template = require('dot').template; +const {Buffer} = require('buffer'); +const {template} = require('dot'); + const reBody = /(.*)<\/s:Body>/; const reCommand = /<(\S*) /; const reNS = /xmlns="http:\/\/www.onvif.org\/\S*\/(\S*)\/wsdl"/; -const __xmldir = __dirname + '/serverMockup/'; +const __xmldir = `${__dirname }/serverMockup/`; const conf = { - port: parseInt(process.env.PORT) || 10101, // server port - hostname: process.env.HOSTNAME || 'localhost', - pullPointUrl: '/onvif/subscription?Idx=6', + port : parseInt(process.env.PORT) || 10101, // server port + hostname : process.env.HOSTNAME || 'localhost', + pullPointUrl : '/onvif/subscription?Idx=6', }; const verbose = process.env.VERBOSE || false; @@ -47,13 +47,13 @@ const listener = (req, res) => { if (verbose) { console.log('received', ns, command); } - if (fs.existsSync(__xmldir + ns + '.' + command + '.xml')) { - command = ns + '.' + command; + if (fs.existsSync(`${__xmldir + ns }.${ command }.xml`)) { + command = `${ns }.${ command}`; } - if (!fs.existsSync(__xmldir + command + '.xml')) { + if (!fs.existsSync(`${__xmldir + command }.xml`)) { command = 'Error'; } - const fileName = __xmldir + command + '.xml'; + const fileName = `${__xmldir + command }.xml`; if (verbose) { console.log('serving', fileName); } @@ -64,20 +64,20 @@ const listener = (req, res) => { // Discovery service const discoverReply = dgram.createSocket('udp4'); -const discover = dgram.createSocket({ type: 'udp4', reuseAddr: true }); +const discover = dgram.createSocket({ type : 'udp4', reuseAddr : true }); discover.on('error', (err) => { throw err; }); discover.on('message', (msg, rinfo) => { if (verbose) { console.log('Discovery received'); } // Extract MessageTo from the XML. xml2ns options remove the namespace tags and ensure element character content is accessed with '_' - xml2js.parseString(msg.toString(), { explicitCharkey: true, tagNameProcessors: [xml2js.processors.stripPrefix]}, (err, result) => { + xml2js.parseString(msg.toString(), { explicitCharkey : true, tagNameProcessors : [xml2js.processors.stripPrefix]}, (err, result) => { const msgId = result.Envelope.Header[0].MessageID[0]._; const discoverMsg = Buffer.from(fs - .readFileSync(__xmldir + 'Probe.xml') + .readFileSync(`${__xmldir }Probe.xml`) .toString() .replace('RELATES_TO', msgId) - .replace('SERVICE_URI', 'http://' + conf.hostname + ':' + conf.port + '/onvif/device_service') + .replace('SERVICE_URI', `http://${ conf.hostname }:${ conf.port }/onvif/device_service`), ); switch (msgId) { // Wrong message test @@ -101,15 +101,15 @@ discover.bind(3702, () => discover.addMembership('239.255.255.250')); let server = null; const start = (callback) => { if (server !== null) { - return server + return callback(null, server); // return server; } server = http.createServer(listener).listen(conf.port, (err) => { if (verbose) { console.log('Listening on port', conf.port); } - callback(err); + return callback(err); }); - return server; + return callback(null, server); // return server; } const close = () => { @@ -122,9 +122,9 @@ const close = () => { }; module.exports = { - start: start, - server: server, - conf: conf, - discover: discover, - close: close, + start, + server, + conf, + discover, + close, }; diff --git a/package-lock.json b/package-lock.json index 70a2e9e9..773c7fc0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,26 +1,39 @@ { "name": "onvif", - "version": "0.7.4", + "version": "1.0.0-alpha.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "onvif", - "version": "0.7.4", + "version": "1.0.0-alpha.0", "license": "MIT", "dependencies": { "lodash.get": "^4.4.2", "xml2js": "^0.6.2" }, "devDependencies": { + "@types/node": "^20.11.24", + "@types/xml2js": "^0.4.14", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "@typescript-eslint/parser": "^7.1.0", + "chalk": "^4.1.2", "dot": "^1.1.3", - "eslint": "^8.3.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-node": "^11.1.0", - "jsdoc": "^4.0.2", + "eslint-plugin-prettier": "^5.1.3", + "glob": "^10.3.10", "keypress": "^0.2.1", - "mocha": "^10.0.0", + "mocha": "^10.3.0", "nimble": "^0.0.2", - "nyc": "^15.1.0" + "nyc": "^15.1.0", + "prettier": "^3.2.5", + "tsx": "^4.15.8", + "typedoc": "^0.26.2", + "typescript": "^5.5.2" }, "engines": { "node": ">=10.0" @@ -612,24 +625,419 @@ "node": ">=6.9.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/argparse": { @@ -650,26 +1058,146 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "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", @@ -813,44 +1341,312 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsdoc/salty": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", - "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", + "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": { - "lodash": "^4.17.21" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=v12.0.0" + "node": ">= 8" } }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "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/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@shikijs/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.9.1.tgz", + "integrity": "sha512-EmUful2MQtY8KgCF1OkBtOuMcvaZEvmdubhW0UHCGXi21O9dRLeADVCj+k6ZS+de7Mz9d2qixOXJ+GLhcK3pXg==", "dev": true }, - "node_modules/@types/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", "dev": true, "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" + "undici-types": "~5.26.4" } }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "node_modules/@types/xml2js": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", + "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz", + "integrity": "sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/type-utils": "7.14.1", + "@typescript-eslint/utils": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", + "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", + "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz", + "integrity": "sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/utils": "7.14.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", + "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", + "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz", + "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", + "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.14.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, "node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -943,31 +1739,169 @@ "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==", + "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": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "default-require-extensions": "^3.0.0" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/balanced-match": { @@ -985,12 +1919,6 @@ "node": ">=8" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1057,6 +1985,25 @@ "node": ">=8" } }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1088,18 +2035,6 @@ "url": "https://opencollective.com/browserslist" } }, - "node_modules/catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1205,6 +2140,12 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -1234,6 +2175,57 @@ "node": ">= 8" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1281,6 +2273,40 @@ "node": ">=8" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -1290,6 +2316,18 @@ "node": ">=0.3.1" } }, + "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", @@ -1314,6 +2352,12 @@ "dottojs": "bin/dot-packer" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/electron-to-chromium": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.3.tgz", @@ -1326,18 +2370,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -1350,12 +2382,183 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "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/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1378,49 +2581,49 @@ } }, "node_modules/eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", - "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", - "ajv": "^6.10.0", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.1.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.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.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" @@ -1432,6 +2635,92 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", @@ -1457,22 +2746,83 @@ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=4" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-node": { @@ -1519,15 +2869,6 @@ "node": ">=4" } }, - "node_modules/eslint-plugin-node/node_modules/ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/eslint-plugin-node/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1537,53 +2878,62 @@ "semver": "bin/semver.js" } }, - "node_modules/eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "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-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { - "eslint": ">=5" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "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==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/argparse": { @@ -1605,17 +2955,20 @@ } }, "node_modules/espree": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", - "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.6.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -1632,9 +2985,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -1679,6 +3032,40 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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", @@ -1688,9 +3075,18 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1776,6 +3172,15 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -1812,13 +3217,13 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -1830,16 +3235,40 @@ } }, "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 + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "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": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/gensync": { "version": "1.0.0-beta.2", @@ -1859,6 +3288,25 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -1868,21 +3316,53 @@ "node": ">=8.0.0" } }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -1900,46 +3380,200 @@ "node": ">=10.13.0" } }, + "node_modules/glob/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/glob/node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" }, "engines": { - "node": ">=8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/has": { + "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" + }, + "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==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/hasha": { @@ -1967,6 +3601,18 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -1983,9 +3629,9 @@ "dev": true }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -2028,7 +3674,8 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -2041,6 +3688,48 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", @@ -2053,13 +3742,74 @@ "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-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.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "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": "^1.0.3" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2095,6 +3845,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "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", @@ -2104,6 +3866,30 @@ "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-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-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -2113,6 +3899,37 @@ "node": ">=8" } }, + "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.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "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", @@ -2125,6 +3942,51 @@ "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-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "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", @@ -2143,6 +4005,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -2152,6 +4026,12 @@ "node": ">=0.10.0" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2271,6 +4151,24 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2290,53 +4188,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/js2xmlparser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", - "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", - "dev": true, - "dependencies": { - "xmlcreate": "^2.0.4" - } - }, - "node_modules/jsdoc": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", - "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.15", - "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^14.1.1", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^14.1.0", - "markdown-it-anchor": "^8.6.7", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "underscore": "~1.13.2" - }, - "bin": { - "jsdoc": "jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdoc/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/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -2379,15 +4230,6 @@ "integrity": "sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc=", "dev": true }, - "node_modules/klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.9" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2425,12 +4267,6 @@ "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.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -2464,6 +4300,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "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/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2505,40 +4356,40 @@ "markdown-it": "bin/markdown-it.mjs" } }, - "node_modules/markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "dev": true, - "peerDependencies": { - "@types/markdown-it": "*", - "markdown-it": "*" - } - }, "node_modules/markdown-it/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/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/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "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.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2551,38 +4402,43 @@ "node": "*" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" } }, "node_modules/mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.5.1.tgz", + "integrity": "sha512-eq5tEnaz2kM9ade8cuGJBMh5fBb9Ih/TB+ddlmPR+wLQmwLhUwa0ovqDlg7OTfKquW0BI7NUcNWX7DH8sC+3gw==", "dev": true, "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.3", + "chokidar": "^3.5.3", "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -2597,10 +4453,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/argparse": { @@ -2618,6 +4470,26 @@ "balanced-match": "^1.0.0" } }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mocha/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2669,18 +4541,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "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", @@ -2806,6 +4666,27 @@ "node": ">=8" } }, + "node_modules/nyc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/nyc/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -2909,19 +4790,121 @@ "node": ">=6" } }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "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.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "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": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { "deep-is": "^0.1.3", @@ -2929,7 +4912,7 @@ "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -3001,6 +4984,12 @@ "node": ">=8" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3025,7 +5014,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3046,6 +5035,31 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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", @@ -3128,6 +5142,15 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3137,6 +5160,33 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -3149,19 +5199,10 @@ "node": ">=8" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -3176,6 +5217,26 @@ "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", @@ -3197,6 +5258,24 @@ "node": ">=8.10.0" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "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", @@ -3236,23 +5315,18 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/requizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", - "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3267,6 +5341,25 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "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", @@ -3282,6 +5375,68 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/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/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3302,6 +5457,23 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -3334,6 +5506,38 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3352,7 +5556,34 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.9.1.tgz", + "integrity": "sha512-8PDkgb5ja3nfujTjvC4VytL6wGOGCtFAClUb2r3QROevYXxcq+/shVJK5s6gy0HZnjaJgFxd6BpPqpRfqne5rA==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.9.1" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { @@ -3361,6 +5592,15 @@ "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "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.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -3407,6 +5647,70 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "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.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.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", @@ -3419,6 +5723,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "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", @@ -3452,6 +5769,34 @@ "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/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -3466,6 +5811,27 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -3493,6 +5859,76 @@ "node": ">=8.0" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/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/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/tsx": { + "version": "4.15.8", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.8.tgz", + "integrity": "sha512-B8dMlbbkZPW0GQ7wafyy2TGXyoGYW0IURfWkM1h/WzgG5lxxRoeDU2VbMURmmjwGaCsoKROVTLmQQPe/s2TnLw==", + "dev": true, + "dependencies": { + "esbuild": "~0.21.4", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3517,6 +5953,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -3526,16 +6035,90 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typedoc": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.2.tgz", + "integrity": "sha512-q/t+M+PZqhN9gPWLBZ3CCvP+KT8O1tyYkSzEYbcQ6mo89avdIrMlBEl3vfo5BgSzwC6Lbmq0W64E8RkY+eVsLA==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.4", + "shiki": "^1.9.0", + "yaml": "^2.4.5" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.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": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "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/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, "node_modules/uri-js": { @@ -3557,12 +6140,6 @@ "uuid": "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/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3578,12 +6155,47 @@ "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": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -3616,10 +6228,28 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "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": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/write-file-atomic": { @@ -3654,12 +6284,6 @@ "node": ">=4.0" } }, - "node_modules/xmlcreate": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", - "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "dev": true - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -3669,6 +6293,18 @@ "node": ">=10" } }, + "node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/package.json b/package.json index 71d53d08..c7c755eb 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,12 @@ "typedoc": "typedoc src", "jsdoc": "jsdoc ./lib/*.js --readme ./README.md --destination ./docs", "gh-pages": "jsdoc ./lib/*.js --readme ./README.md --destination ./", - "lint": "eslint lib/*.js", + "lint-js": "eslint lib/*.js", + "lint": "", "pretest": "npm run lint", "test": "nyc mocha", - "mockserver": "node startServerMockup.js" + "mockserver": "node startServerMockup.js", + "fun": "tsx src/test.ts" }, "contributors": [ { @@ -61,6 +63,7 @@ "@types/xml2js": "^0.4.14", "@typescript-eslint/eslint-plugin": "^7.1.0", "@typescript-eslint/parser": "^7.1.0", + "chalk": "^4.1.2", "dot": "^1.1.3", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", @@ -74,8 +77,8 @@ "nimble": "^0.0.2", "nyc": "^15.1.0", "prettier": "^3.2.5", - "ts-node": "^10.9.2", - "typedoc": "^0.25.12", - "typescript": "^5.4.3" + "tsx": "^4.15.8", + "typedoc": "^0.26.2", + "typescript": "^5.5.2" } } diff --git a/tsconfig.json b/tsconfig.json index 4c07e7f6..f0f9cdeb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,7 @@ "moduleResolution": "node", "noFallthroughCasesInSwitch": true, "noUnusedLocals": false, - "noUnusedParameters": true, + "noUnusedParameters": false, "skipLibCheck": true, // "watch": true, "declaration": true, From dc44d51cb8fb772c62c9a212a9398e907665cd84 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 02:19:47 +0300 Subject: [PATCH 085/112] feat: add interfaces --- src/discovery.ts | 6 +- src/interfaces/accesscontrol.ts | 474 ++++ src/interfaces/accessrules.ts | 173 ++ src/interfaces/actionengine.ts | 336 +++ src/interfaces/advancedsecurity.ts | 788 ++++++ src/interfaces/analytics.2.ts | 142 + src/interfaces/analyticsdevice.ts | 127 + src/interfaces/appmgmt.ts | 102 + src/interfaces/authenticationbehavior.ts | 383 +++ src/interfaces/basics.ts | 4 + src/interfaces/bw-2-vs-mod.ts | 0 src/interfaces/common.ts | 192 ++ src/interfaces/credential.ts | 517 ++++ src/interfaces/deviceio.ts | 277 ++ src/interfaces/devicemgmt.ts | 779 ++++++ src/interfaces/display.ts | 77 + src/interfaces/doorcontrol.ts | 440 +++ src/interfaces/event-vs.ts | 149 + src/interfaces/event.ts | 149 + src/interfaces/federatedsearch.ts | 82 + src/interfaces/humanbody.2.ts | 134 + src/interfaces/humanface.2.ts | 151 + src/interfaces/imaging.2.ts | 131 + src/interfaces/media.2.ts | 494 ++++ src/interfaces/media.ts | 663 +++++ src/interfaces/metadatastream.ts | 206 ++ src/interfaces/onvif.ts | 3264 ++++++++++++++++++++++ src/interfaces/provisioning.ts | 115 + src/interfaces/ptz.2.ts | 250 ++ src/interfaces/radiometry.2.ts | 141 + src/interfaces/receiver.ts | 68 + src/interfaces/recording.ts | 272 ++ src/interfaces/replay.ts | 39 + src/interfaces/rules.2.ts | 58 + src/interfaces/schedule.ts | 372 +++ src/interfaces/search.ts | 173 ++ src/interfaces/thermal.ts | 194 ++ src/interfaces/types.ts | 48 + src/interfaces/uplink.ts | 49 + src/onvif.ts | 20 +- src/test.ts | 14 +- src/utils.ts | 2 +- 42 files changed, 12042 insertions(+), 13 deletions(-) create mode 100644 src/interfaces/accesscontrol.ts create mode 100644 src/interfaces/accessrules.ts create mode 100644 src/interfaces/actionengine.ts create mode 100644 src/interfaces/advancedsecurity.ts create mode 100644 src/interfaces/analytics.2.ts create mode 100644 src/interfaces/analyticsdevice.ts create mode 100644 src/interfaces/appmgmt.ts create mode 100644 src/interfaces/authenticationbehavior.ts create mode 100644 src/interfaces/basics.ts create mode 100644 src/interfaces/bw-2-vs-mod.ts create mode 100644 src/interfaces/common.ts create mode 100644 src/interfaces/credential.ts create mode 100644 src/interfaces/deviceio.ts create mode 100644 src/interfaces/devicemgmt.ts create mode 100644 src/interfaces/display.ts create mode 100644 src/interfaces/doorcontrol.ts create mode 100644 src/interfaces/event-vs.ts create mode 100644 src/interfaces/event.ts create mode 100644 src/interfaces/federatedsearch.ts create mode 100644 src/interfaces/humanbody.2.ts create mode 100644 src/interfaces/humanface.2.ts create mode 100644 src/interfaces/imaging.2.ts create mode 100644 src/interfaces/media.2.ts create mode 100644 src/interfaces/media.ts create mode 100644 src/interfaces/metadatastream.ts create mode 100644 src/interfaces/onvif.ts create mode 100644 src/interfaces/provisioning.ts create mode 100644 src/interfaces/ptz.2.ts create mode 100644 src/interfaces/radiometry.2.ts create mode 100644 src/interfaces/receiver.ts create mode 100644 src/interfaces/recording.ts create mode 100644 src/interfaces/replay.ts create mode 100644 src/interfaces/rules.2.ts create mode 100644 src/interfaces/schedule.ts create mode 100644 src/interfaces/search.ts create mode 100644 src/interfaces/thermal.ts create mode 100644 src/interfaces/types.ts create mode 100644 src/interfaces/uplink.ts diff --git a/src/discovery.ts b/src/discovery.ts index acc48724..0c1a73fb 100644 --- a/src/discovery.ts +++ b/src/discovery.ts @@ -42,7 +42,7 @@ export class DiscoverySingleton extends EventEmitter { * discovery.on('device', console.log); * ``` */ - static device: 'device' = 'device'; + static device = 'device' as const; /** * Indicates any errors * @param error Error instance or array of error instances from {@link Error} @@ -52,7 +52,7 @@ export class DiscoverySingleton extends EventEmitter { * discovery.on('error', console.error); * ``` */ - static error: 'error' = 'error'; + static error = 'error' as const; private static instance?: DiscoverySingleton; @@ -88,7 +88,7 @@ export class DiscoverySingleton extends EventEmitter { * console.log(await cams[0]?.getSystemDateAndTime()); * })(); */ - probe(options: DiscoveryOptions): Promise<(Onvif | Record)[]> { + probe(options: DiscoveryOptions = {}): Promise<(Onvif | Record)[]> { return new Promise((resolve, reject) => { const cams: Map> = new Map(); const errors: Error[] = []; diff --git a/src/interfaces/accesscontrol.ts b/src/interfaces/accesscontrol.ts new file mode 100644 index 00000000..bd181bb2 --- /dev/null +++ b/src/interfaces/accesscontrol.ts @@ -0,0 +1,474 @@ +import { DataEntity } from './types'; +import { Name, Description, StringList } from './onvif'; +import { ReferenceToken } from './common'; + +/** The Decision enumeration represents a choice of two available options for an access request: */ +export type Decision = 'Granted' | 'Denied'; +/** + * Non-normative enum that describes the various reasons for denying access. + * The following strings shall be used for the reason field: + */ +export type DenyReason = + | 'CredentialNotEnabled' + | 'CredentialNotActive' + | 'CredentialExpired' + | 'InvalidPIN' + | 'NotPermittedAtThisTime' + | 'Unauthorized' + | 'Other'; +/** + * Non-normative enumeration that describes the ONVIF defined feedback types. + * These types are used in string fields where extendibility is desired. + * Strings starting with the prefix pt: are reserved to define ONVIF-specific types. + * For custom defined feedback types, free text can be used. + * The following types are defined by ONVIF: + */ +export type FeedbackType = + | 'pt:Disabled' + | 'pt:Idle' + | 'pt:DoorLocked' + | 'pt:DoorUnlocked' + | 'pt:DoorOpenTooLong' + | 'pt:DoorPreAlarmWarning' + | 'pt:RequireIdentifier' + | 'pt:TextMessage' + | 'pt:Processing' + | 'pt:RetryIdentifier' + | 'pt:AccessGranted' + | 'pt:AccessDenied' + | 'pt:Ok' + | 'pt:Fault' + | 'pt:Warning' + | 'pt:Alarm'; +/** + * The service capabilities reflect optional functionality of a service. + * The information is static and does not change during device operation. + * The following capabilities are available: + */ +export interface ServiceCapabilities { + /** + * The maximum number of entries returned by a single Get<Entity>List or + * Get<Entity> request. + * The device shall never return more than this number of entities in a single response. + */ + maxLimit: number; + /** Indicates the maximum number of access points supported by the device. */ + maxAccessPoints?: number; + /** Indicates the maximum number of areas supported by the device. */ + maxAreas?: number; + /** + * Indicates that the client is allowed to supply the token when creating access + * points and areas. + * To enable the use of the commands SetAccessPoint and SetArea, the value must be set to true. + */ + clientSuppliedTokenSupported?: boolean; + /** + * Indicates that the client can perform CRUD operations (create, read, update and delete) + * on access points. To enable the use of the commands GetAccessPoints, GetAccessPointList, + * CreateAccessPoint, ModifyAccessPoint, DeleteAccessPoint, SetAccessPointAuthenticationProfile + * and DeleteAccessPointAuthenticationProfile, the value must be set to true. + */ + accessPointManagementSupported?: boolean; + /** + * Indicates that the client can perform CRUD operations (create, read, update and delete) + * on areas. To enable the use of the commands GetAreas, GetAreaList, CreateArea, ModifyArea + * and DeleteArea, the value must be set to true. + */ + areaManagementSupported?: boolean; +} +/** Used as extension base for AccessPointInfo. */ +export interface AccessPointInfoBase extends DataEntity { + /** A user readable name. It shall be up to 64 characters. */ + name?: Name; + /** + * Optional user readable description for the AccessPoint. It shall + * be up to 1024 characters. + */ + description?: Description; + /** Optional reference to the Area from which access is requested. */ + areaFrom?: ReferenceToken; + /** Optional reference to the Area to which access is requested. */ + areaTo?: ReferenceToken; + /** + * Optional entity type; if missing, a Door type as defined by [ONVIF Door Control + * Service Specification] should be assumed. This can also be represented by the + * QName value "tdc:Door" – where tdc is the namespace of the door control service: + * "http://www.onvif.org/ver10/doorcontrol/wsdl". This field is provided for future + * extensions; it will allow an access point being extended to cover entity types + * other than doors as well. + */ + entityType?: any; + /** + * Reference to the entity used to control access; the entity type + * may be specified by the optional EntityType field explained below but is + * typically a Door. + */ + entity?: ReferenceToken; +} +/** + * The AccessPointInfo structure contains basic information about an access point instance. + * An access point defines an entity a credential can be granted or denied access to. + * The AccessPointInfo structure provides basic information on how access is controlled + * in one direction for a door (from which area to which area). + * Multiple access points may cover the same door. A typical case is one access point for + * entry and another for exit, both referencing the same door. + */ +export interface AccessPointInfo extends AccessPointInfoBase { + /** The capabilities for the AccessPoint. */ + capabilities?: AccessPointCapabilities; +} +/** + * The AccessPoint structure shall include all properties of the AccessPointInfo structure, + * a reference to an authentication profile instance, and optionally a number of input and output devices. + */ +export interface AccessPoint extends AccessPointInfo { + /** + * A reference to an authentication profile which defines the authentication + * behavior of the access point. + */ + authenticationProfileToken?: ReferenceToken; + extension?: AccessPointExtension; +} +export interface AccessPointExtension {} +/** + * The AccessPoint capabilities reflect optional functionality of a particular physical entity. + * Different AccessPoint instances may have different set of capabilities. This information may + * change during device operation, e.g. if hardware settings are changed. + * The following capabilities are available: + */ +export interface AccessPointCapabilities { + /** + * Indicates whether or not this AccessPoint instance supports EnableAccessPoint + * and DisableAccessPoint commands. + */ + disableAccessPoint: boolean; + /** Indicates whether or not this AccessPoint instance supports generation of duress events. */ + duress?: boolean; + /** + * Indicates whether or not this AccessPoint has a REX switch or other input that + * allows anonymous access. + */ + anonymousAccess?: boolean; + /** + * Indicates whether or not this AccessPoint instance supports generation of + * AccessTaken and AccessNotTaken events. If AnonymousAccess and AccessTaken are both true, it + * indicates that the Anonymous versions of AccessTaken and AccessNotTaken are supported. + */ + accessTaken?: boolean; + /** + * Indicates whether or not this AccessPoint instance supports the + * ExternalAuthorization operation and the generation of Request events. If AnonymousAccess and + * ExternalAuthorization are both true, it indicates that the Anonymous version is supported as + * well. + */ + externalAuthorization?: boolean; + /** + * A list of recognition types that the device supports. This field is only relevant for devices + * that are not aware of security levels (see [ONVIF Authentication Behavior Service Specification]). + * Please note that when an access point is updated, then any previously supported recognition types + * are replaced with the new list. + * Recognition types starting with the prefix pt: are reserved to define ONVIF-specific + * types as defined in pt:RecognitionType. For custom defined identifier types, free text + * can be used. + */ + supportedRecognitionTypes?: StringList; + /** + * Indicates whether or not this access point supports the AccessControl/Request/Identifier + * event to request external authorization. + * Identfier access requires that ExternalAuthorization is set to true. + * The IdentifierAccess capability is typically enabled for devices that do not have any + * knowledge of credential tokens. When IdentifierAccess is set to true then the device + * must support the identifier events. + */ + identifierAccess?: boolean; + /** + * List of supported feedback types. Feedback types starting with the prefix pt: + * are reserved to define ONVIF-specific types as defined in tac:FeedbackType. + * For custom defined feedback types, free text can be used. + */ + supportedFeedbackTypes?: StringList; + /** + * A list of security level tokens that this access point supports. + * See [Authentication Behavior Service Specification]. + * This field is optional, and if omitted, the device cannot support multi-factor + * authentication for this access point. + * Please note that when an access point is updated, then any previously supported + * security levels are replaced with the new list. + */ + supportedSecurityLevels?: ReferenceToken[]; + extension?: SupportedSecurityLevelsExtension; +} +export interface SupportedSecurityLevelsExtension {} +/** Basic information about an Area. Used as extension base. */ +export interface AreaInfoBase extends DataEntity { + /** User readable name. It shall be up to 64 characters. */ + name?: Name; + /** + * User readable description for the Area. It shall be up to 1024 + * characters. + */ + description?: Description; +} +/** + * The AreaInfo structure contains basic information about an Area. + * An ONVIF compliant device shall provide the following fields for each Area: + */ +export interface AreaInfo extends AreaInfoBase {} +/** + * The Area structure shall include all properties of the AreaInfo structure and optionally + * a parent area token, an OccupancyControl structure and/or an Antipassback structure. + */ +export interface Area extends AreaInfo { + extension?: AreaExtension; +} +export interface AreaExtension {} +/** + * The AccessPointState contains state information for an AccessPoint. + * An ONVIF compliant device shall provide the following fields for each AccessPoint instance: + */ +export interface AccessPointState { + /** + * Indicates that the AccessPoint is enabled. By default this field value + * shall be True, if the DisableAccessPoint capabilities is not supported. + */ + enabled?: boolean; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** + * The capability response message contains the requested Access Control + * service capabilities using a hierarchical XML capability structure. + */ + capabilities?: ServiceCapabilities; +} +export interface GetAccessPointInfoList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetAccessPointInfoListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of AccessPointInfo items. */ + accessPointInfo?: AccessPointInfo[]; +} +export interface GetAccessPointInfo { + /** Tokens of AccessPointInfo items to get. */ + token?: ReferenceToken[]; +} +export interface GetAccessPointInfoResponse { + /** List of AccessPointInfo items. */ + accessPointInfo?: AccessPointInfo[]; +} +export interface GetAccessPointList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetAccessPointListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of AccessPoint items. */ + accessPoint?: AccessPoint[]; +} +export interface GetAccessPoints { + /** Tokens of AccessPoint items to get. */ + token?: ReferenceToken[]; +} +export interface GetAccessPointsResponse { + /** List of AccessPoint items. */ + accessPoint?: AccessPoint[]; +} +export interface CreateAccessPoint { + /** AccessPoint item to create */ + accessPoint?: AccessPoint; +} +export interface CreateAccessPointResponse { + /** Token of created AccessPoint item */ + token?: ReferenceToken; +} +export interface SetAccessPoint { + /** AccessPoint item to create or modify */ + accessPoint?: AccessPoint; +} +export interface SetAccessPointResponse {} +export interface ModifyAccessPoint { + /** AccessPoint item to modify */ + accessPoint?: AccessPoint; +} +export interface ModifyAccessPointResponse {} +export interface DeleteAccessPoint { + /** Token of AccessPoint item to delete. */ + token?: ReferenceToken; +} +export interface DeleteAccessPointResponse {} +export interface SetAccessPointAuthenticationProfile { + /** Token of the AccessPoint. */ + token?: ReferenceToken; + /** Token of the AuthenticationProfile. */ + authenticationProfileToken?: ReferenceToken; +} +export interface SetAccessPointAuthenticationProfileResponse {} +export interface DeleteAccessPointAuthenticationProfile { + /** Token of the AccessPoint. */ + token?: ReferenceToken; +} +export interface DeleteAccessPointAuthenticationProfileResponse {} +export interface GetAreaInfoList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetAreaInfoListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of AreaInfo items. */ + areaInfo?: AreaInfo[]; +} +export interface GetAreaInfo { + /** Tokens of AreaInfo items to get. */ + token?: ReferenceToken[]; +} +export interface GetAreaInfoResponse { + /** List of AreaInfo items. */ + areaInfo?: AreaInfo[]; +} +export interface GetAreaList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetAreaListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of Area items. */ + area?: Area[]; +} +export interface GetAreas { + /** Tokens of Area items to get. */ + token?: ReferenceToken[]; +} +export interface GetAreasResponse { + /** List of Area items. */ + area?: Area[]; +} +export interface CreateArea { + /** Area item to create */ + area?: Area; +} +export interface CreateAreaResponse { + /** Token of created Area item */ + token?: ReferenceToken; +} +export interface SetArea { + /** Area item to create or modify */ + area?: Area; +} +export interface SetAreaResponse {} +export interface ModifyArea { + /** Area item to modify */ + area?: Area; +} +export interface ModifyAreaResponse {} +export interface DeleteArea { + /** Token of Area item to delete. */ + token?: ReferenceToken; +} +export interface DeleteAreaResponse {} +export interface GetAccessPointState { + /** Token of AccessPoint instance to get AccessPointState for. */ + token?: ReferenceToken; +} +export interface GetAccessPointStateResponse { + /** AccessPointState item. */ + accessPointState?: AccessPointState; +} +export interface EnableAccessPoint { + /** Token of the AccessPoint instance to enable. */ + token?: ReferenceToken; +} +export interface EnableAccessPointResponse {} +export interface DisableAccessPoint { + /** Token of the AccessPoint instance to disable. */ + token?: ReferenceToken; +} +export interface DisableAccessPointResponse {} +export interface ExternalAuthorization { + /** Token of the Access Point instance. */ + accessPointToken?: ReferenceToken; + /** Optional token of the Credential involved. */ + credentialToken?: ReferenceToken; + /** Optional reason for decision. */ + reason?: string; + /** Decision - Granted or Denied. */ + decision?: Decision; +} +export interface ExternalAuthorizationResponse {} +export interface Feedback { + /** Token of the access point to control. */ + accessPointToken?: ReferenceToken; + /** + * The feedback type to use. Feedback types starting with the prefix pt: + * are reserved to define ONVIF-specific types as defined in tac:FeedbackType. + * For custom defined feedback types, free text can be used. + * If feedback type is set to pt:RequireIdentifier, the RecognitionType field shall provide the required type(s). + * If the feedback type is not supported, it shall be ignored. + */ + feedbackType?: string; + /** + * Optional list of recognition types requested by a client to get closer to making a decision. + * Used if FeedbackType is set to pt:RequireIdentifier. + * If a recognition type is not supported, it shall be ignored. + */ + recognitionType?: string[]; + /** + * Optional textual feedback message. + * If not supported by the access point it shall be ignored. + */ + textMessage?: string; +} +export interface FeedbackResponse {} diff --git a/src/interfaces/accessrules.ts b/src/interfaces/accessrules.ts new file mode 100644 index 00000000..bfb03990 --- /dev/null +++ b/src/interfaces/accessrules.ts @@ -0,0 +1,173 @@ +import { ReferenceToken } from './common'; +import { DataEntity } from './types'; +import { Name, Description } from './onvif'; + +/** + * The service capabilities reflect optional functionality of a service. The information is static + * and does not change during device operation. The following capabilities are available: + */ +export interface ServiceCapabilities { + /** + * The maximum number of entries returned by a single Get<Entity>List or Get<Entity> + * request. The device shall never return more than this number of entities in a single + * response. + */ + maxLimit: any; + /** Indicates the maximum number of access profiles supported by the device. */ + maxAccessProfiles: any; + /** Indicates the maximum number of access policies per access profile supported by the device. */ + maxAccessPoliciesPerAccessProfile: any; + /** + * Indicates whether or not several access policies can refer to the same access point in an + * access profile. + */ + multipleSchedulesPerAccessPointSupported: boolean; + /** + * Indicates that the client is allowed to supply the token when creating access profiles. To + * enable the use of the command SetAccessProfile, the value must be set to true. + */ + clientSuppliedTokenSupported?: boolean; +} +/** + * The access policy is an association of an access point and a schedule. It defines when an access + * point can be accessed using an access profile which contains this access policy. If an access + * profile contains several access policies specifying different schedules for the same access + * point will result in a union of the schedules. + */ +export interface AccessPolicy { + /** Reference to the schedule used by the access policy. */ + scheduleToken?: ReferenceToken; + /** + * Reference to the entity used by the rule engine, the entity type may be specified by the + * optional EntityType field explained below but is typically an access point. + */ + entity?: ReferenceToken; + /** + * Optional entity type; if missing, an access point type as defined by the ONVIF Access + * Control Service Specification should be assumed. This can also be represented by the + * QName value “tac:AccessPoint” where tac is the namespace of ONVIF Access Control + * Service Specification. This field is provided for future extensions; it will allow an + * access policy being extended to cover entity types other than access points as well. + */ + entityType?: any; + extension?: AccessPolicyExtension; +} +export interface AccessPolicyExtension {} +/** + * The AccessProfileInfo structure contains basic information about an access profile. The device + * shall provide the following fields for each access profile instance. + */ +export interface AccessProfileInfo extends DataEntity { + /** A user readable name. It shall be up to 64 characters. */ + name?: Name; + /** + * User readable description for the access profile. It shall be up + * to 1024 characters. + */ + description?: Description; +} +/** + * The access profile structure contains information about the collection of access policies. The + * device shall include all properties of the AccessProfileInfo structure and also a list of access + * policies. + */ +export interface AccessProfile extends AccessProfileInfo { + /** + * A list of access policy structures, where each access policy + * defines during which schedule an access point can be accessed. + */ + accessPolicy?: AccessPolicy[]; + extension?: AccessProfileExtension; +} +export interface AccessProfileExtension {} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** + * The capability response message contains the requested access rules + * service capabilities using a hierarchical XML capability structure. + */ + capabilities?: ServiceCapabilities; +} +export interface GetAccessProfileInfo { + /** Tokens of AccessProfileInfo items to get. */ + token?: ReferenceToken[]; +} +export interface GetAccessProfileInfoResponse { + /** List of AccessProfileInfo items. */ + accessProfileInfo?: AccessProfileInfo[]; +} +export interface GetAccessProfileInfoList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetAccessProfileInfoListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of AccessProfileInfo items. */ + accessProfileInfo?: AccessProfileInfo[]; +} +export interface GetAccessProfiles { + /** Tokens of AccessProfile items to get. */ + token?: ReferenceToken[]; +} +export interface GetAccessProfilesResponse { + /** List of Access Profile items. */ + accessProfile?: AccessProfile[]; +} +export interface GetAccessProfileList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetAccessProfileListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of Access Profile items. */ + accessProfile?: AccessProfile[]; +} +export interface CreateAccessProfile { + /** The AccessProfile to create. */ + accessProfile?: AccessProfile; +} +export interface CreateAccessProfileResponse { + /** The Token of created AccessProfile. */ + token?: ReferenceToken; +} +export interface ModifyAccessProfile { + /** The details of Access Profile */ + accessProfile?: AccessProfile; +} +export interface ModifyAccessProfileResponse {} +export interface SetAccessProfile { + /** The AccessProfile item to create or modify */ + accessProfile?: AccessProfile; +} +export interface SetAccessProfileResponse {} +export interface DeleteAccessProfile { + /** The token of the access profile to delete. */ + token?: ReferenceToken; +} +export interface DeleteAccessProfileResponse {} diff --git a/src/interfaces/actionengine.ts b/src/interfaces/actionengine.ts new file mode 100644 index 00000000..334c05e4 --- /dev/null +++ b/src/interfaces/actionengine.ts @@ -0,0 +1,336 @@ +import { ItemListDescription, ItemList } from './onvif'; +import { AnyURI } from './basics'; +import { PositiveInteger } from './types'; +import { ReferenceToken } from './common'; + +export type AddressFormatType = 'hostname' | 'ipv4' | 'ipv6' | 'Extended'; +export type EMailAuthenticationMode = 'none' | 'SMTP' | 'POPSMTP' | 'Extended'; +export type HttpProtocolType = 'http' | 'https' | 'Extended'; +export type HttpAuthenticationMethodType = 'none' | 'MD5Digest' | 'Extended'; +export type FileSuffixType = 'none' | 'sequence' | 'dateTime' | 'Extended'; +/** Describes the configuration parameters of an action. */ +export interface ActionConfigDescription { + /** Action type name */ + name: any; + /** Action configuration parameter descriptions */ + parameterDescription?: ItemListDescription; +} +/** SupportedActions data structure lists the available action types that service provider supports. For each action type, data structure contains the action configuration parameters. */ +export interface SupportedActions { + /** Lists the location of all schemas that are referenced in the supported actions. If the action descriptions reference data types in the ONVIF schema file,the ONVIF schema file MUST be explicitly listed. */ + actionContentSchemaLocation?: AnyURI[]; + /** List of actions supported by Action Engine Service provider. */ + actionDescription?: ActionConfigDescription[]; + extension?: SupportedActionsExtension; +} +export interface SupportedActionsExtension {} +/** Action Engine Capabilities data structure contains the maximum number of supported actions and number of actions in use for generic as well as specific action types */ +export interface ActionEngineCapabilities { + /** The maximum number of trigger configurations that the service provider can concurrently support */ + maximumTriggers?: PositiveInteger; + /** The maximum number of actions that the service provider can concurrently support */ + maximumActions?: PositiveInteger; + /** Limits for each action type */ + actionCapabilities?: ActionTypeLimits[]; + extension?: ActionEngineCapabilitiesExtension; +} +export interface ActionEngineCapabilitiesExtension {} +/** ActionTypeLimits data structure contains maximum and current usage information for a specific action type in the service provider */ +export interface ActionTypeLimits { + /** Action Type */ + type: any; + /** For the specific action type, the maximum number of actions that could be concurrently supported by the service provider */ + maximum: PositiveInteger; + /** For the specific action type, the number of actions in use by the service provider */ + inUse?: number; +} +/** Action Configuration data type contains the configuration settings of action configuration parameters, service requester given action Name, and service provider supported action type value */ +export interface ActionConfiguration { + /** User given name. */ + name: string; + /** Denotes the action type. */ + type: any; + /** Action configuration parameter settings. */ + parameters?: ItemList; +} +/** Action data type contains the configuration settings of one action instance and service provider assigned unique identifier for this action configuration. */ +export interface Action { + /** Unique Action identifier that service provider assigned to the action configuration. */ + token: ReferenceToken; + /** Action configuration contains action type, user given action name, and configuratin parameter settings. */ + configuration?: ActionConfiguration; +} +/** Action Trigger configuration data type contains mandatory Topic Expression (Section Topic Filter in [Core Specification]), optional Message content expression (Section Message Content Filter in [Core Specification]), and set of actions to be triggered. */ +export interface ActionTriggerConfiguration { + /** Topic expression, for example, to trigger only for relays. Trigger based on event topic. */ + topicExpression?: any; + /** Content expression, for example, to trigger only when the relay value is on. Trigger based on content data in event. */ + contentExpression?: any; + /** Reference to actions to be triggered when the conditions are satisfied. */ + actionToken?: ReferenceToken[]; + extension?: ActionTriggerConfigurationExtension; +} +export interface ActionTriggerConfigurationExtension {} +/** Action Trigger data type contains the service provider assigned unique identifier for the configuration and action trigger configuration data. */ +export interface ActionTrigger { + /** Unique Action Trigger identifier that service provider assigned to the action trigger configuration. */ + token: ReferenceToken; + /** Action Trigger Configuration */ + configuration?: ActionTriggerConfiguration; +} +export interface onvif_action { + actionDescription?: ActionConfigDescription[]; +} +export interface EMailServerConfiguration { + /** SMTP EMail Server configuration */ + SMTPConfig?: SMTPConfig; + /** POP EMail Server configuration */ + POPConfig?: POPConfig; + /** Credentials configuration */ + authenticationConfig?: AuthenticationConfig; +} +export interface SMTPConfig { + /**/ + portNo?: PositiveInteger; + /** Destination SMTP Address configuration */ + hostAddress?: HostAddress; +} +export interface POPConfig { + /** Destination POP Server Address configuration */ + hostAddress?: HostAddress; +} +export interface HostAddress { + /** IP Address format type such as IPv4 or IPv6 */ + formatType: AddressFormatType; + /** IP Address */ + value?: string; +} +export interface UserCredentials { + /** Username */ + username?: string; + /** Password */ + password?: any; + extension?: UserCredentialsExtension; +} +export interface UserCredentialsExtension {} +export interface AuthenticationConfig { + /** Email server authentication mode */ + mode: EMailAuthenticationMode; + /** Username-password */ + user?: UserCredentials; +} +export interface EMailReceiverConfiguration { + /** Configuration for E-mail TO */ + TO?: string[]; + /** Configuration for E-mail CC */ + CC?: string[]; + /**/ + extension?: EMailReceiverConfigurationExtension; +} +export interface EMailReceiverConfigurationExtension {} +export interface EMailAttachmentConfiguration { + /**/ + fileName?: string; + /**/ + doSuffix?: FileSuffixType; + /**/ + extension?: EMailAttachmentConfigurationExtension; +} +export interface EMailAttachmentConfigurationExtension {} +export interface EMailBodyTextConfiguration { + /** Whether content of E-mail message contains event data */ + includeEvent?: boolean; + /**/ + type?: string; +} +export interface MediaSource { + /** MediaSource profile reference token */ + profileToken?: ReferenceToken; +} +export interface HttpHostConfigurations { + /** Destination HTTP Server configuration */ + httpDestination?: HttpDestinationConfiguration[]; + /**/ + extension?: HttpHostConfigurationsExtension; +} +export interface HttpHostConfigurationsExtension {} +export interface HttpDestinationConfiguration { + /** URI for POST Message destination */ + uri?: string; + /** HTTP/HTTPS protocol selection (default is http) */ + protocol?: HttpProtocolType; + /** Destination HTTP Server address configuration */ + hostAddress?: HttpHostAddress; + /** User Credentials configuration for destination HTTP Server */ + httpAuthentication?: HttpAuthenticationConfiguration; + /**/ + extension?: HttpDestinationConfigurationExtension; +} +export interface HttpDestinationConfigurationExtension {} +export interface HttpAuthenticationConfiguration { + /** HTTP Authentication Method */ + method?: HttpAuthenticationMethodType; + /** User credentials */ + user?: UserCredentials; + /**/ + extension?: HttpAuthenticationConfigurationExtension; +} +export interface HttpAuthenticationConfigurationExtension {} +export interface HttpHostAddress { + /** IPv4 or IPv6 */ + formatType: AddressFormatType; + /** Port Number if different from 80 */ + portNo?: number; + /** Destination HTTP Server IP Address */ + value?: string; +} +export interface PostContentConfiguration { + /** MediaSource reference when the media is attached to POST message */ + mediaReference?: MediaSource; + /** Configuration for POST Message content */ + postBody?: PostBodyConfiguration; +} +export interface PostBodyConfiguration { + /**/ + formData?: string; + /** Whether include event into POST message */ + includeEvent?: boolean; + /** Whether attach media into POST message */ + includeMedia?: boolean; +} +export interface FtpHostConfigurations { + /** FTP Action destination configuration */ + ftpDestination?: FtpDestinationConfiguration[]; + /**/ + extension?: FtpHostConfigurationsExtension; +} +export interface FtpHostConfigurationsExtension {} +export interface FtpDestinationConfiguration { + /** FTP Server IP Address */ + hostAddress?: FtpHostAddress; + /** Upload Directory Path */ + uploadPath?: string; + /** User credentials confguration for target FTP Server */ + ftpAuthentication?: FtpAuthenticationConfiguration; + extension?: FtpDestinationConfigurationExtension; +} +export interface FtpDestinationConfigurationExtension {} +export interface FtpAuthenticationConfiguration { + /** User Credentials */ + user?: UserCredentials; + extension?: FtpAuthenticationConfigurationExtension; +} +export interface FtpAuthenticationConfigurationExtension {} +export interface FtpHostAddress { + /** IPv4 or IPv6 */ + formatType: AddressFormatType; + /** Port Number */ + portNo?: number; + /** FTP Server IP Address */ + value?: string; +} +export interface FtpContent { + /**/ + ftpContentConfig?: FtpContentConfiguration; +} +export interface FtpFileNameConfigurations { + /** Name of file */ + file_name?: string; + /** Suffix of file */ + suffix?: FileSuffixType; +} +export interface FtpContentConfiguration { + /** Type of FTP Upload action */ + type: string; +} +export interface FtpContentConfigurationUploadImages { + /** Upload Image action; how long? */ + howLong?: any; + /** Upload Image action; sample interval? */ + sampleInterval?: any; + /** Upload Image action; name of destination file */ + fileName?: FtpFileNameConfigurations; +} +export interface FtpContentConfigurationUploadFile { + /** Name of source file */ + sourceFileName?: string; + /** Name of destination file */ + destinationFileName?: string; +} +export interface SMSProviderConfiguration { + /** SMS Provider's URL */ + providerURL?: AnyURI; + /** Username and password */ + user?: UserCredentials; +} +export interface SMSSenderConfiguration { + /** Sender's e-mail address */ + EMail?: string; +} +export interface SMSMessage { + /** Text Message */ + text?: string; +} +export interface TriggeredRecordingConfiguration { + /** Length of recording time before the triggering event */ + preRecordDuration?: any; + /** Recording after alarm recording duration */ + postRecordDuration?: any; + /** Record duration */ + recordDuration?: any; + /** Recording frame rate */ + recordFrameRate?: PositiveInteger; + /** Whether Audio recording on/off */ + doRecordAudio?: boolean; +} +export interface RecordingActionConfiguration { + /** Recording configuration */ + recordConfig?: TriggeredRecordingConfiguration; +} +export interface GetSupportedActionsResponse { + /** Array of supported Action types */ + supportedActions?: SupportedActions; +} +export interface GetActionsResponse { + /** Array of current Action configurations */ + action?: Action[]; +} +export interface CreateActions { + /** Array of Actions to be configured on service provider */ + action?: ActionConfiguration[]; +} +export interface CreateActionsResponse { + /** Array of configured Actions with service provider assigned unique identifiers */ + action?: Action[]; +} +export interface DeleteActions { + /** Array of tokens referencing existing Action configurations to be removed */ + token?: ReferenceToken[]; +} +export interface ModifyActions { + /** Array of Action configurations to update the existing action configurations */ + action?: Action[]; +} +export interface GetServiceCapabilitiesResponse { + capabilities?: ActionEngineCapabilities; +} +export interface GetActionTriggersResponse { + /** Array of current Action Trigger configurations */ + actionTrigger?: ActionTrigger[]; +} +export interface CreateActionTriggers { + /** Action Triggers to be configured */ + actionTrigger?: ActionTriggerConfiguration[]; +} +export interface CreateActionTriggersResponse { + /** Returns configured Action Triggers with service provider assigned unique identifers */ + actionTrigger?: ActionTrigger[]; +} +export interface ModifyActionTriggers { + /** Array of Action Trigger configurations to be updated. */ + actionTrigger?: ActionTrigger[]; +} +export interface DeleteActionTriggers { + /** Array of tokens referencing existing Action Trigger configurations to be removed */ + token?: ReferenceToken[]; +} diff --git a/src/interfaces/advancedsecurity.ts b/src/interfaces/advancedsecurity.ts new file mode 100644 index 00000000..edd6aff3 --- /dev/null +++ b/src/interfaces/advancedsecurity.ts @@ -0,0 +1,788 @@ +import { NCName, AnyURI } from './basics'; +import { PositiveInteger } from './types'; +import { DeviceEntity, StringList, Date } from './onvif'; +import { ReferenceToken } from './common'; + +/** Unique identifier for keys in the keystore. */ +export type KeyID = NCName; +/** Unique identifier for certificates in the keystore. */ +export type CertificateID = NCName; +/** Unique identifier for certification paths in the keystore. */ +export type CertificationPathID = NCName; +/** Unique identifier for passphrases in the keystore. */ +export type PassphraseID = NCName; +/** Unique identifier for 802.1X configurations in the keystore. */ +export type Dot1XID = NCName; +/** The status of a key in the keystore. */ +export type KeyStatus = 'ok' | 'generating' | 'corrupt'; +/** An object identifier (OID) in dot-decimal form as specified in RFC4512. */ +export type DotDecimalOID = string; +/** The distinguished name attribute type encoded as specified in RFC 4514. */ +export type DNAttributeType = string; +export type DNAttributeValue = string; +/** A base64-encoded ASN.1 value. */ +export type Base64DERencodedASN1Value = any; +/** A list of supported 802.1X authentication methods, such as "EAP-PEAP/MSCHAPv2" and "EAP-MD5". The '/' character is used as a separator between the outer and inner methods. */ +export type Dot1XMethods = string[]; +export type CRLID = NCName; +export type CertPathValidationPolicyID = NCName; +/** A list of RSA key lenghts in bits. */ +export type RSAKeyLengths = number[]; +/** A list of elliptic curves. */ +export type EllipticCurves = string[]; +/** A list of X.509 versions. */ +export type X509Versions = number[]; +/** A list of TLS versions. */ +export type TLSVersions = string[]; +/** A list of password based encryption algorithms. */ +export type PasswordBasedEncryptionAlgorithms = string[]; +/** A list of password based MAC algorithms. */ +export type PasswordBasedMACAlgorithms = string[]; +export type AuthorizationServerConfigurationType = 'OAuthAuthorizationCode' | 'OAuthClientCredentials'; +export type ClientAuthenticationMethod = + | 'client_secret_basic' + | 'client_secret_post' + | 'client_secret_jwt' + | 'private_key_jwt' + | 'tls_client_auth' + | 'self_signed_tls_client_auth'; +export interface Extension {} +/** The attributes of a key in the keystore. */ +export interface KeyAttribute { + /** The ID of the key. */ + keyID?: KeyID; + /** The client-defined alias of the key. */ + alias?: string; + /** Absent if the key is not a key pair. True if and only if the key is a key pair and contains a private key. False if and only if the key is a key pair and does not contain a private key. */ + hasPrivateKey?: boolean; + /** The status of the key. The value should be one of the values in the tas:KeyStatus enumeration. */ + keyStatus?: string; + /** True if and only if the key was generated outside the device. */ + externallyGenerated?: boolean; + /** True if and only if the key is stored in a specially protected hardware component inside the device. */ + securelyStored?: boolean; + extension?: Extension; +} +/** A distinguished name attribute type and value pair. */ +export interface DNAttributeTypeAndValue { + /** The attribute type. */ + type?: DNAttributeType; + /** The value of the attribute. */ + value?: DNAttributeValue; +} +/** A multi-valued RDN */ +export interface MultiValuedRDN { + /** A list of types and values defining a multi-valued RDN */ + attribute?: DNAttributeTypeAndValue[]; +} +export interface anyAttribute { + /** Domain Component as specified in RFC3739 */ + domainComponent?: DNAttributeValue[]; +} +export interface DistinguishedName { + /** + * A country name as specified in + * X.500. + */ + country?: DNAttributeValue[]; + /** + * An organization name as specified in + * X.500. + */ + organization?: DNAttributeValue[]; + /** + * An organizational unit name as specified in + * X.500. + */ + organizationalUnit?: DNAttributeValue[]; + /** + * A distinguished name qualifier as specified in + * X.500. + */ + distinguishedNameQualifier?: DNAttributeValue[]; + /** + * A state or province name as specified in + * X.500. + */ + stateOrProvinceName?: DNAttributeValue[]; + /** + * A common name as specified in + * X.500. + */ + commonName?: DNAttributeValue[]; + /** + * A serial number as specified in + * X.500. + */ + serialNumber?: DNAttributeValue[]; + /** A locality as specified in X.500. */ + locality?: DNAttributeValue[]; + /** A title as specified in X.500. */ + title?: DNAttributeValue[]; + /** A surname as specified in X.500. */ + surname?: DNAttributeValue[]; + /** A given name as specified in X.500. */ + givenName?: DNAttributeValue[]; + /** Initials as specified in X.500. */ + initials?: DNAttributeValue[]; + /** A pseudonym as specified in X.500. */ + pseudonym?: DNAttributeValue[]; + /** + * A generation qualifier as specified in + * X.500. + */ + generationQualifier?: DNAttributeValue[]; + /** + * A generic type-value pair + * attribute. + */ + genericAttribute?: DNAttributeTypeAndValue[]; + /** A multi-valued RDN */ + multiValuedRDN?: MultiValuedRDN[]; + /** Required extension point. It is recommended to not use this element, and instead use GenericAttribute and the numeric Distinguished Name Attribute Type. */ + anyAttribute?: anyAttribute; +} +export interface anyParameters {} +/** An identifier of an algorithm. */ +export interface AlgorithmIdentifier { + /** The OID of the algorithm in dot-decimal form. */ + algorithm?: DotDecimalOID; + /** Optional parameters of the algorithm (depending on the algorithm). */ + parameters?: Base64DERencodedASN1Value; + anyParameters?: anyParameters; +} +/** A CSR attribute as specified in RFC 2986. */ +export interface BasicRequestAttribute { + /** The OID of the attribute. */ + OID?: DotDecimalOID; + /** The value of the attribute as a base64-encoded DER representation of an ASN.1 value. */ + value?: Base64DERencodedASN1Value; +} +/** A CSR attribute as specified in PKCS#10. */ +export interface CSRAttribute {} +/** An X.509v3 extension field as specified in RFC 5280 */ +export interface X509v3Extension { + /** The OID of the extension field. */ + extnOID?: DotDecimalOID; + /** True if and only if the extension is critical. */ + critical?: boolean; + /** The value of the extension field as a base64-encoded DER representation of an ASN.1 value. */ + extnValue?: Base64DERencodedASN1Value; +} +/** An X.509 cerficiate as specified in RFC 5280. */ +export interface X509Certificate { + /** The ID of the certificate. */ + certificateID?: CertificateID; + /** The ID of the key that this certificate associates to the certificate subject. */ + keyID?: KeyID; + /** The client-defined alias of the certificate. */ + alias?: string; + /** The base64-encoded DER representation of the X.509 certificate. */ + certificateContent?: Base64DERencodedASN1Value; +} +/** A sequence of certificate IDs. */ +export interface CertificateIDs { + /** A certificate ID. */ + certificateID?: CertificateID[]; +} +export interface anyElement {} +/** An X.509 certification path as defined in RFC 5280. */ +export interface CertificationPath { + /** A certificate in the certification path. */ + certificateID?: CertificateID[]; + /** The client-defined alias of the certification path. */ + alias?: string; + anyElement?: anyElement; +} +export interface PassphraseAttribute { + /** The ID of the passphrase. */ + passphraseID?: PassphraseID; + /** The alias of the passphrase. */ + alias?: string; +} +/** The capabilities of the 802.1X implementation on a device. */ +export interface Dot1XCapabilities { + /** The maximum number of 802.1X configurations that may be defined simultaneously. */ + maximumNumberOfDot1XConfigurations?: PositiveInteger; + /** The authentication methods supported by the 802.1X implementation. */ + dot1XMethods?: Dot1XMethods; +} +/** The configuration parameters required for a particular authentication method. */ +export interface Dot1XStage { + /** The authentication method for this stage (e.g., "EAP-PEAP"). */ + method: string; + /** The identity used in this authentication method, if required. */ + identity?: string; + /** The unique identifier of the certification path used in this authentication method, if required. */ + certificationPathID?: CertificationPathID; + /** The identifier for the password used in this authentication method, if required. If Identity is used as an anonymous identity for this authentication method, PassphraseID is ignored. */ + passphraseID?: PassphraseID; + /** The configuration of the next stage of authentication, if required. */ + inner?: Dot1XStage; + extension?: Dot1XStageExtension; +} +export interface Dot1XStageExtension {} +export interface Dot1XConfiguration { + /** The unique identifier of the IEEE 802.1X configuration. */ + dot1XID?: Dot1XID; + /** The client-defined alias of the 802.1X configuration. */ + alias?: string; + /** The outer level authentication method used in this 802.1X configuration. */ + outer?: Dot1XStage; +} +export interface CRL { + CRLID?: CRLID; + alias?: string; + CRLContent?: Base64DERencodedASN1Value; +} +export interface CertPathValidationParameters { + /** True if and only if the TLS server shall not authenticate client certificates that do not contain the TLS WWW client authentication key usage extension as specified in RFC 5280, Sect. 4.2.1.12. */ + requireTLSWWWClientAuthExtendedKeyUsage?: boolean; + /** True if and only if delta CRLs, if available, shall be applied to CRLs. */ + useDeltaCRLs?: boolean; + anyParameters?: anyParameters; +} +export interface TrustAnchor { + /** The certificate ID of the certificate to be used as trust anchor. */ + certificateID?: CertificateID; +} +export interface CertPathValidationPolicy { + certPathValidationPolicyID?: CertPathValidationPolicyID; + alias?: string; + parameters?: CertPathValidationParameters; + trustAnchor?: TrustAnchor[]; + anyParameters?: anyParameters; +} +/** The capabilities of a keystore implementation on a device. */ +export interface KeystoreCapabilities { + /** Indicates the maximum number of keys that the device can store simultaneously. */ + maximumNumberOfKeys?: PositiveInteger; + /** Indicates the maximum number of certificates that the device can store simultaneously. */ + maximumNumberOfCertificates?: PositiveInteger; + /** Indicates the maximum number of certification paths that the device can store simultaneously. */ + maximumNumberOfCertificationPaths?: PositiveInteger; + /** Indication that the device supports on-board RSA key pair generation. */ + RSAKeyPairGeneration?: boolean; + /** Indication that the device supports on-board ECC key pair generation. */ + ECCKeyPairGeneration?: boolean; + /** Indicates which RSA key lengths are supported by the device. */ + RSAKeyLengths?: RSAKeyLengths; + /** Indicates which elliptic curves are supported by the device. */ + ellipticCurves?: EllipticCurves; + /** Indicates support for creating PKCS#10 requests for RSA keys and uploading the certificate obtained from a CA.. */ + PKCS10ExternalCertificationWithRSA?: boolean; + /** Indicates support for creating PKCS#10 requests for keypairs and uploading the certificate obtained from a CA. */ + PKCS10?: boolean; + /** Indicates support for creating self-signed certificates for RSA keys. */ + selfSignedCertificateCreationWithRSA?: boolean; + /** Indicates support for creating self-signed certificates. */ + selfSignedCertificateCreation?: boolean; + /** Indicates which X.509 versions are supported by the device. */ + X509Versions?: X509Versions; + /** Indicates the maximum number of passphrases that the device is able to store simultaneously. */ + maximumNumberOfPassphrases?: number; + /** Indicates support for uploading an RSA key pair in a PKCS#8 data structure. */ + PKCS8RSAKeyPairUpload?: boolean; + /** Indicates support for uploading a key pair in a PKCS#8 data structure. */ + PKCS8?: boolean; + /** Indicates support for uploading a certificate along with an RSA private key in a PKCS#12 data structure. */ + PKCS12CertificateWithRSAPrivateKeyUpload?: boolean; + /** Indicates support for uploading a certificate along with a private key in a PKCS#12 data structure. */ + PKCS12?: boolean; + /** Indicates which password-based encryption algorithms are supported by the device. */ + passwordBasedEncryptionAlgorithms?: PasswordBasedEncryptionAlgorithms; + /** Indicates which password-based MAC algorithms are supported by the device. */ + passwordBasedMACAlgorithms?: PasswordBasedMACAlgorithms; + /** Indicates the maximum number of CRLs that the device is able to store simultaneously. */ + maximumNumberOfCRLs?: number; + /** Indicates the maximum number of certification path validation policies that the device is able to store simultaneously. */ + maximumNumberOfCertificationPathValidationPolicies?: number; + /** Indicates whether a device supports checking for the TLS WWW client auth extended key usage extension while validating certification paths. */ + enforceTLSWebClientAuthExtKeyUsage?: boolean; + /** Indicates the device requires that each certificate with private key has its own unique key. */ + noPrivateKeySharing?: boolean; + /** The signature algorithms supported by the keystore implementation. */ + signatureAlgorithms?: AlgorithmIdentifier[]; + anyElement?: anyElement; +} +/** The capabilities of a TLS server implementation on a device. */ +export interface TLSServerCapabilities { + /** Indicates which TLS versions are supported by the device. */ + TLSServerSupported?: TLSVersions; + /** Indicates whether the device supports enabling and disabling specific TLS versions. */ + enabledVersionsSupported?: boolean; + /** Indicates the maximum number of certification paths that may be assigned to the TLS server simultaneously. */ + maximumNumberOfTLSCertificationPaths?: PositiveInteger; + /** Indicates whether the device supports TLS client authentication. */ + TLSClientAuthSupported?: boolean; + /** Indicates whether the device supports TLS client authorization using common name to local user mapping. */ + cnMapsToUserSupported?: boolean; + /** Indicates the maximum number of certification path validation policies that may be assigned to the TLS server simultaneously. */ + maximumNumberOfTLSCertificationPathValidationPolicies?: number; +} +export interface AuthorizationServerConfigurationData { + /** The type of configuration, tas:AuthorizationServerConfigurationType lists the acceptable values */ + type: string; + /** How to authenticate with the server, tas:ClientAuthenticationMethod lists the acceptable values */ + clientAuth?: string; + /** Authorization server address */ + serverUri?: AnyURI; + /** Client identifier issued by the authorization server */ + clientID?: string; + /** Client secret used to authenticate with the authorization server */ + clientSecret?: string; + /** The requested access scope(s) */ + scope?: string; + /** Key identifier for the private_key_jwt authentication method */ + keyID?: KeyID; + /** Certificate identifier for the self_signed_tls_client_auth authentication method */ + certificateID?: CertificateID; +} +export interface AuthorizationServerConfiguration extends DeviceEntity { + data?: AuthorizationServerConfigurationData; +} +export interface AuthorizationServerConfigurationCapabilities { + /** Indicates maximum number of authorization server configurations supported. */ + maxConfigurations?: number; + /** Enumerates the supported authorization server configuration types, see tas:AuthorizationServerConfigurationType. */ + configurationTypesSupported?: StringList; + /** Enumerates the supported client authentication methods, see tas:ClientAuthenticationMethod. */ + clientAuthenticationMethodsSupported?: StringList; +} +/** The capabilities of a Security Configuration Service implementation on a device. */ +export interface Capabilities { + /** The capabilities of the keystore implementation. */ + keystoreCapabilities?: KeystoreCapabilities; + /** The capabilities of the TLS server implementation. */ + TLSServerCapabilities?: TLSServerCapabilities; + /** The capabilities of the 802.1X implementation. */ + dot1XCapabilities?: Dot1XCapabilities; + /** The capabilities for external authorization server capabilities. */ + authorizationServer?: AuthorizationServerConfigurationCapabilities; +} +export interface JWTConfiguration { + /** The list of all the aud claims, which the recipient identifies with. */ + audiences?: StringList; + /** If present, this is the list to URIs pointing to the metadata file conforming to RFC8414, such as "https://your.domain/.well-known/openid-configuration" , of the trusted Open ID Connect servers issuing JWT tokens. Using metadata, the device can reach the information about the JWKS and implement the rotation of the keys accordingly. */ + trustedIssuers?: AnyURI[]; + /** If present, this is the list of keys provided out of band to verify the origin and integrity of the JWT. */ + keyID?: KeyID[]; + /** If present, the device will validate the certification path of the Open ID Connect servers. The OIDC server iso considered to be valid if its certificate is validated by one of the provided certification path validation policies. */ + validationPolicy?: CertPathValidationPolicyID[]; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the security configuration service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetJWTConfiguration {} +export interface GetJWTConfigurationResponse { + configuration?: JWTConfiguration; +} +export interface SetJWTConfiguration { + configuration?: JWTConfiguration; +} +export interface SetJWTConfigurationResponse {} +export interface CreateRSAKeyPair { + /** The length of the key to be created. */ + keyLength?: number; + /** The client-defined alias of the key. */ + alias?: string; +} +export interface CreateRSAKeyPairResponse { + /** The key ID of the key pair being generated. */ + keyID?: KeyID; + /** Best-effort estimate of how long the key generation will take. */ + estimatedCreationTime?: any; +} +export interface CreateECCKeyPair { + /** The name of the elliptic curve to be used for generating the ECC keypair. */ + ellipticCurve?: string; + /** The client-defined alias of the key. */ + alias?: string; +} +export interface CreateECCKeyPairResponse { + /** The key ID of the key pair being generated. */ + keyID?: KeyID; + /** Best-effort estimate of how long the key generation will take. */ + estimatedCreationTime?: any; +} +export interface UploadKeyPairInPKCS8 { + /** The key pair to be uploaded in a PKCS#8 data structure. */ + keyPair?: Base64DERencodedASN1Value; + /** The client-defined alias of the key pair. */ + alias?: string; + /** The ID of the passphrase to use for decrypting the uploaded key pair. */ + encryptionPassphraseID?: PassphraseID; + /** The passphrase to use for decrypting the uploaded key pair. */ + encryptionPassphrase?: string; +} +export interface UploadKeyPairInPKCS8Response { + /** The key ID of the uploaded key pair. */ + keyID?: KeyID; +} +export interface UploadCertificateWithPrivateKeyInPKCS12 { + /** The certificates and key pair to be uploaded in a PKCS#12 data structure. */ + certWithPrivateKey?: Base64DERencodedASN1Value; + /** The client-defined alias of the certification path. */ + certificationPathAlias?: string; + /** The client-defined alias of the key pair. */ + keyAlias?: string; + /** True if and only if the device shall behave as if the client had only supplied the first certificate in the sequence of certificates. */ + ignoreAdditionalCertificates?: boolean; + /** The ID of the passphrase to use for integrity checking of the uploaded PKCS#12 data structure. */ + integrityPassphraseID?: PassphraseID; + /** The ID of the passphrase to use for decrypting the uploaded PKCS#12 data structure. */ + encryptionPassphraseID?: PassphraseID; + /** The passphrase to use for integrity checking and decrypting the uploaded PKCS#12 data structure. */ + passphrase?: string; +} +export interface UploadCertificateWithPrivateKeyInPKCS12Response { + /** The certification path ID of the uploaded certification path. */ + certificationPathID?: CertificationPathID; + /** The key ID of the uploaded key pair. */ + keyID?: KeyID; +} +export interface GetKeyStatus { + /** The ID of the key for which to return the status. */ + keyID?: KeyID; +} +export interface GetKeyStatusResponse { + /** Status of the requested key. The value should be one of the values in the tas:KeyStatus enumeration. */ + keyStatus?: string; +} +export interface GetPrivateKeyStatus { + /** The ID of the key pair for which to return whether it contains a private key. */ + keyID?: KeyID; +} +export interface GetPrivateKeyStatusResponse { + /** True if and only if the key pair contains a private key. */ + hasPrivateKey?: boolean; +} +export interface GetAllKeys {} +export interface GetAllKeysResponse { + /** Information about a key in the keystore. */ + keyAttribute?: KeyAttribute[]; +} +export interface DeleteKey { + /** The ID of the key that is to be deleted from the keystore. */ + keyID?: KeyID; +} +export interface DeleteKeyResponse {} +export interface CreatePKCS10CSR { + /** The subject to be included in the CSR. */ + subject?: DistinguishedName; + /** The ID of the key for which the CSR shall be created. */ + keyID?: KeyID; + /** An attribute to be included in the CSR. */ + CSRAttribute?: CSRAttribute[]; + /** The signature algorithm to be used to sign the CSR. */ + signatureAlgorithm?: AlgorithmIdentifier; +} +export interface CreatePKCS10CSRResponse { + /** The DER encoded PKCS#10 certification request. */ + PKCS10CSR?: Base64DERencodedASN1Value; +} +export interface CreateSelfSignedCertificate { + /** The X.509 version that the generated certificate shall comply to. */ + X509Version?: PositiveInteger; + /** Distinguished name of the entity that the certificate shall belong to. */ + subject?: DistinguishedName; + /** The ID of the key for which the certificate shall be created. */ + keyID?: KeyID; + /** The client-defined alias of the certificate to be created. */ + alias?: string; + /** The X.509 not valid before information to be included in the certificate. Defaults to the device's current time or a time before the device's current time. */ + notValidBefore?: Date; + /** The X.509 not valid after information to be included in the certificate. Defaults to the time 99991231235959Z as specified in RFC 5280. */ + notValidAfter?: Date; + /** The signature algorithm to be used for signing the certificate. */ + signatureAlgorithm?: AlgorithmIdentifier; + /** An X.509v3 extension to be included in the certificate. */ + extension?: X509v3Extension[]; +} +export interface CreateSelfSignedCertificateResponse { + /** The ID of the generated certificate. */ + certificateID?: CertificateID; +} +export interface UploadCertificate { + /** The base64-encoded DER representation of the X.509 certificate to be uploaded. */ + certificate?: Base64DERencodedASN1Value; + /** The client-defined alias of the certificate. */ + alias?: string; + /** The client-defined alias of the key pair. */ + keyAlias?: string; + /** Indicates if the device shall verify that a matching key pair with a private key exists in the keystore. */ + privateKeyRequired?: boolean; +} +export interface UploadCertificateResponse { + /** The ID of the uploaded certificate. */ + certificateID?: CertificateID; + /** The ID of the key that the uploaded certificate certifies. */ + keyID?: KeyID; +} +export interface GetCertificate { + /** The ID of the certificate to retrieve. */ + certificateID?: CertificateID; +} +export interface GetCertificateResponse { + /** The DER representation of the certificate. */ + certificate?: X509Certificate; +} +export interface GetAllCertificates {} +/** A list with all certificates stored in the keystore. */ +export interface GetAllCertificatesResponse { + /** A certificate stored in the keystore. */ + certificate?: X509Certificate[]; +} +export interface DeleteCertificate { + /** The ID of the certificate to delete. */ + certificateID?: CertificateID; +} +export interface DeleteCertificateResponse {} +export interface CreateCertificationPath { + /** The IDs of the certificates to include in the certification path, where each certificate signature except for the last one in the path must be verifiable with the public key certified by the next certificate in the path. */ + certificateIDs?: CertificateIDs; + /** The client-defined alias of the certification path. */ + alias?: string; +} +export interface CreateCertificationPathResponse { + /** The ID of the generated certification path. */ + certificationPathID?: CertificationPathID; +} +export interface GetCertificationPath { + /** The ID of the certification path to retrieve. */ + certificationPathID?: CertificationPathID; +} +export interface GetCertificationPathResponse { + /** The certification path that is stored under the given ID in the keystore. */ + certificationPath?: CertificationPath; +} +export interface GetAllCertificationPaths {} +export interface GetAllCertificationPathsResponse { + /** An ID of a certification path in the keystore. */ + certificationPathID?: CertificationPathID[]; +} +export interface DeleteCertificationPath { + /** The ID of the certification path to delete. */ + certificationPathID?: CertificationPathID; +} +export interface DeleteCertificationPathResponse {} +export interface UploadPassphrase { + /** The passphrase to upload. */ + passphrase?: string; + /** The alias for the passphrase to upload. */ + passphraseAlias?: string; +} +export interface UploadPassphraseResponse { + /** The PassphraseID of the uploaded passphrase. */ + passphraseID?: PassphraseID; +} +export interface GetAllPassphrases {} +export interface GetAllPassphrasesResponse { + /** Information about a passphrase in the keystore. */ + passphraseAttribute?: PassphraseAttribute[]; +} +export interface DeletePassphrase { + /** The ID of the passphrase that is to be deleted from the keystore. */ + passphraseID?: PassphraseID; +} +export interface DeletePassphraseResponse {} +export interface AddServerCertificateAssignment { + certificationPathID?: CertificationPathID; +} +export interface AddServerCertificateAssignmentResponse {} +export interface RemoveServerCertificateAssignment { + certificationPathID?: CertificationPathID; +} +export interface RemoveServerCertificateAssignmentResponse {} +export interface ReplaceServerCertificateAssignment { + oldCertificationPathID?: CertificationPathID; + newCertificationPathID?: CertificationPathID; +} +export interface ReplaceServerCertificateAssignmentResponse {} +export interface GetAssignedServerCertificates {} +export interface GetAssignedServerCertificatesResponse { + /** The IDs of all certification paths that are assigned to the TLS server on the device. */ + certificationPathID?: CertificationPathID[]; +} +export interface SetEnabledTLSVersions { + /** List of TLS versions to allow. */ + versions?: TLSVersions; +} +export interface SetEnabledTLSVersionsResponse {} +export interface GetEnabledTLSVersions {} +export interface GetEnabledTLSVersionsResponse { + /** List of allowed TLS versions. */ + versions?: TLSVersions; +} +export interface UploadCRL { + /** The CRL to be uploaded to the device. */ + crl?: Base64DERencodedASN1Value; + /** The alias to assign to the uploaded CRL. */ + alias?: string; + anyParameters?: anyParameters; +} +export interface UploadCRLResponse { + /** The ID of the uploaded CRL. */ + crlID?: CRLID; +} +export interface GetCRL { + /** The ID of the CRL to be returned. */ + crlID?: CRLID; +} +export interface GetCRLResponse { + /** The CRL with the requested ID. */ + crl?: CRL; +} +export interface GetAllCRLs {} +export interface GetAllCRLsResponse { + /** A list of all CRLs that are stored in the keystore on the device. */ + crl?: CRL[]; +} +export interface DeleteCRL { + /** The ID of the CRL to be deleted. */ + crlID?: CRLID; +} +export interface DeleteCRLResponse {} +export interface CreateCertPathValidationPolicy { + /** The alias to assign to the created certification path validation policy. */ + alias?: string; + /** The parameters of the certification path validation policy to be created. */ + parameters?: CertPathValidationParameters; + /** The trust anchors of the certification path validation policy to be created. */ + trustAnchor?: TrustAnchor[]; + anyParameters?: anyParameters; +} +export interface CreateCertPathValidationPolicyResponse { + /** The ID of the created certification path validation policy. */ + certPathValidationPolicyID?: CertPathValidationPolicyID; +} +export interface GetCertPathValidationPolicy { + /** The ID of the certification path validation policy to be created. */ + certPathValidationPolicyID?: CertPathValidationPolicyID; +} +export interface GetCertPathValidationPolicyResponse { + /** The certification path validation policy that is stored under the requested ID. */ + certPathValidationPolicy?: CertPathValidationPolicy; +} +export interface GetAllCertPathValidationPolicies {} +export interface GetAllCertPathValidationPoliciesResponse { + /** A list of all certification path validation policies that are stored in the keystore on the device. */ + certPathValidationPolicy?: CertPathValidationPolicy[]; +} +export interface DeleteCertPathValidationPolicy { + /** The ID of the certification path validation policy to be deleted. */ + certPathValidationPolicyID?: CertPathValidationPolicyID; +} +export interface DeleteCertPathValidationPolicyResponse {} +export interface SetClientAuthenticationRequired { + clientAuthenticationRequired?: boolean; +} +export interface SetClientAuthenticationRequiredResponse {} +export interface GetClientAuthenticationRequired {} +export interface GetClientAuthenticationRequiredResponse { + clientAuthenticationRequired?: boolean; +} +export interface SetCnMapsToUser { + cnMapsToUser?: boolean; +} +export interface SetCnMapsToUserResponse {} +export interface GetCnMapsToUser {} +export interface GetCnMapsToUserResponse { + cnMapsToUser?: boolean; +} +export interface AddCertPathValidationPolicyAssignment { + /** The ID of the certification path validation policy to assign to the TLS server. */ + certPathValidationPolicyID?: CertPathValidationPolicyID; +} +export interface AddCertPathValidationPolicyAssignmentResponse {} +export interface RemoveCertPathValidationPolicyAssignment { + /** The ID of the certification path validation policy to de-assign from the TLS server. */ + certPathValidationPolicyID?: CertPathValidationPolicyID; +} +export interface RemoveCertPathValidationPolicyAssignmentResponse {} +export interface ReplaceCertPathValidationPolicyAssignment { + /** The ID of the certification path validation policy to be de-assigned from the TLS server. */ + oldCertPathValidationPolicyID?: CertPathValidationPolicyID; + /** The ID of the certification path validation policy to assign to the TLS server. */ + newCertPathValidationPolicyID?: CertPathValidationPolicyID; +} +export interface ReplaceCertPathValidationPolicyAssignmentResponse {} +export interface GetAssignedCertPathValidationPolicies {} +export interface GetAssignedCertPathValidationPoliciesResponse { + /** A list of IDs of the certification path validation policies that are assigned to the TLS server. */ + certPathValidationPolicyID?: CertPathValidationPolicyID[]; +} +export interface AddDot1XConfiguration { + /** The desired 802.1X configuration. */ + dot1XConfiguration?: Dot1XConfiguration; +} +export interface AddDot1XConfigurationResponse { + /** The unique identifier of the created 802.1X configuration. */ + dot1XID?: Dot1XID; +} +export interface GetAllDot1XConfigurations {} +export interface GetAllDot1XConfigurationsResponse { + /** The list of unique identifiers of 802.1X configurations on the device. */ + configuration?: Dot1XConfiguration[]; +} +export interface GetDot1XConfiguration { + /** The unique identifier of the desired 802.1X configuration. */ + dot1XID?: Dot1XID; +} +export interface GetDot1XConfigurationResponse { + /** The 802.1X configuration, without password information. */ + dot1XConfiguration?: Dot1XConfiguration; +} +export interface DeleteDot1XConfiguration { + /** The unique identifier of the 802.1X configuration to be deleted. */ + dot1XID?: Dot1XID; +} +export interface DeleteDot1XConfigurationResponse {} +export interface SetNetworkInterfaceDot1XConfiguration { + /** The unique identifier of the Network Interface on which the 802.1X configuration is to be set. (NOTE: the network interface token is defined in devicemgmt.wsdl as tt:ReferenceToken, which is a derived type of xs:string. To avoid importing all of common.xsd for this single type, the base type is used here.) */ + token?: string; + /** The unique identifier of the 802.1X configuration to be set. */ + dot1XID?: Dot1XID; +} +export interface SetNetworkInterfaceDot1XConfigurationResponse { + /** Indicates whether or not a reboot is required after configuration updates. */ + rebootNeeded?: boolean; +} +export interface GetNetworkInterfaceDot1XConfiguration { + /** The unique identifier of the Network Interface for which the 802.1X configuration is to be retrieved. (NOTE: the network interface token is defined in devicemgmt.wsdl as tt:ReferenceToken, which is a derived type of xs:string. To avoid importing all of common.xsd for this single type, the base type is used here.) */ + token?: string; +} +export interface GetNetworkInterfaceDot1XConfigurationResponse { + /** The unique identifier of 802.1X configuration assigned to the Network Interface. */ + dot1XID?: Dot1XID; +} +export interface DeleteNetworkInterfaceDot1XConfiguration { + /** The unique identifier of the Network Interface for which the 802.1X configuration is to be deleted. (NOTE: the network interface token is defined in devicemgmt.wsdl as tt:ReferenceToken, which is a derived type of xs:string. To avoid importing all of common.xsd for this single type, the base type is used here.) */ + token?: string; +} +export interface DeleteNetworkInterfaceDot1XConfigurationResponse { + /** Indicates whether or not a reboot is required after configuration updates. */ + rebootNeeded?: boolean; +} +export interface GetAuthorizationServerConfigurations { + token?: ReferenceToken; +} +export interface GetAuthorizationServerConfigurationsResponse { + configuration?: AuthorizationServerConfiguration[]; +} +export interface CreateAuthorizationServerConfiguration { + configuration?: AuthorizationServerConfigurationData; +} +export interface CreateAuthorizationServerConfigurationResponse { + token?: ReferenceToken; +} +export interface SetAuthorizationServerConfiguration { + configuration?: AuthorizationServerConfiguration; +} +export interface SetAuthorizationServerConfigurationResponse {} +export interface DeleteAuthorizationServerConfiguration { + token?: ReferenceToken; +} +export interface DeleteAuthorizationServerConfigurationResponse {} diff --git a/src/interfaces/analytics.2.ts b/src/interfaces/analytics.2.ts new file mode 100644 index 00000000..5fe7694a --- /dev/null +++ b/src/interfaces/analytics.2.ts @@ -0,0 +1,142 @@ +import { StringList, SupportedRules, Config, SupportedAnalyticsModules } from './onvif'; +import { Frame } from './metadatastream'; +import { ReferenceToken } from './common'; + +export interface Capabilities { + /** Indication that the device supports the rules interface and the rules syntax. */ + ruleSupport?: boolean; + /** Indication that the device supports the scene analytics module interface. */ + analyticsModuleSupport?: boolean; + /** Indication that the device produces the cell based scene description */ + cellBasedSceneDescriptionSupported?: boolean; + /** Indication that the device supports the GetRuleOptions operation on the rules interface */ + ruleOptionsSupported?: boolean; + /** Indication that the device supports the GetAnalyticsModuleOptions operation on the analytics interface */ + analyticsModuleOptionsSupported?: boolean; + /** Indication that the device supports the GetSupportedMetadata operation. */ + supportedMetadata?: boolean; + /** Indication what kinds of method that the device support for sending image, acceptable values are defined in tt:ImageSendingType. */ + imageSendingType?: StringList; +} +export interface ConfigOptions { + /** The RuleType the ConfigOptions applies to if the Name attribute is ambiguous. */ + ruleType?: any; + /** + * The Name of the SimpleItemDescription/ElementItemDescription + * the ConfigOptions applies to. + */ + name: string; + /** + * Type of the Rule Options represented by a unique QName. + * The Type defines the element contained in this structure. + * This attribute is deprecated since its value must be identical to the embedded element. + */ + type?: any; + /** Optional name of the analytics module this constraint applies to. This option is only necessary in cases where different constraints for elements with the same Name exist. */ + analyticsModule?: any; + /** Minimal number of occurrences. Defaults to one. */ + minOccurs?: number; + /** Maximum number of occurrences. Defaults to one. */ + maxOccurs?: number; +} +export interface MetadataInfo { + /** Reference to an AnalyticsModule Type. */ + type: any; + /** Sample frame content starting with the tt:Frame node. */ + sampleFrame?: Frame; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the analytics service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetSupportedRules { + /** + * References an existing Video Analytics configuration. The list of available tokens can be obtained + * via the Media service GetVideoAnalyticsConfigurations method. + */ + configurationToken?: ReferenceToken; +} +export interface GetSupportedRulesResponse { + supportedRules?: SupportedRules; +} +export interface CreateRules { + /** Reference to an existing VideoAnalyticsConfiguration. */ + configurationToken?: ReferenceToken; + rule?: Config[]; +} +export interface DeleteRules { + /** Reference to an existing VideoAnalyticsConfiguration. */ + configurationToken?: ReferenceToken; + /** References the specific rule to be deleted (e.g. "MyLineDetector"). */ + ruleName?: string[]; +} +export interface ModifyRules { + /** Reference to an existing VideoAnalyticsConfiguration. */ + configurationToken?: ReferenceToken; + rule?: Config[]; +} +export interface GetRules { + /** Reference to an existing VideoAnalyticsConfiguration. */ + configurationToken?: ReferenceToken; +} +export interface GetRulesResponse { + rule?: Config[]; +} +export interface GetRuleOptions { + /** Reference to an SupportedRule Type returned from GetSupportedRules. */ + ruleType?: any; + /** Reference to an existing analytics configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetRuleOptionsResponse { + /** A device shall provide respective ConfigOptions.RuleType for each RuleOption if the request does not specify RuleType. The response Options shall not contain any AnalyticsModule attribute. */ + ruleOptions?: ConfigOptions[]; +} +export interface GetSupportedAnalyticsModules { + /** Reference to an existing VideoAnalyticsConfiguration. */ + configurationToken?: ReferenceToken; +} +export interface GetSupportedAnalyticsModulesResponse { + supportedAnalyticsModules?: SupportedAnalyticsModules; +} +export interface CreateAnalyticsModules { + /** Reference to an existing VideoAnalyticsConfiguration. */ + configurationToken?: ReferenceToken; + analyticsModule?: Config[]; +} +export interface DeleteAnalyticsModules { + /** Reference to an existing Video Analytics configuration. */ + configurationToken?: ReferenceToken; + /** Name of the AnalyticsModule to be deleted. */ + analyticsModuleName?: string[]; +} +export interface ModifyAnalyticsModules { + /** Reference to an existing VideoAnalyticsConfiguration. */ + configurationToken?: ReferenceToken; + analyticsModule?: Config[]; +} +export interface GetAnalyticsModules { + /** Reference to an existing VideoAnalyticsConfiguration. */ + configurationToken?: ReferenceToken; +} +export interface GetAnalyticsModulesResponse { + analyticsModule?: Config[]; +} +export interface GetAnalyticsModuleOptions { + /** Reference to an SupportedAnalyticsModule Type returned from GetSupportedAnalyticsModules. */ + type?: any; + /** Reference to an existing AnalyticsConfiguration. */ + configurationToken?: ReferenceToken; +} +export interface GetAnalyticsModuleOptionsResponse { + /** List of options for the specified analytics module. The response Options shall not contain any RuleType attribute. */ + options?: ConfigOptions[]; +} +export interface GetSupportedMetadata { + /** Optional reference to an AnalyticsModule Type returned from GetSupportedAnalyticsModules. */ + type?: any; +} +export interface GetSupportedMetadataResponse { + analyticsModule?: MetadataInfo[]; +} diff --git a/src/interfaces/analyticsdevice.ts b/src/interfaces/analyticsdevice.ts new file mode 100644 index 00000000..ace4a32b --- /dev/null +++ b/src/interfaces/analyticsdevice.ts @@ -0,0 +1,127 @@ +import { ReferenceToken } from './common'; +import { + AnalyticsEngineInput, + AnalyticsEngineControl, + AnalyticsEngine, + VideoAnalyticsConfiguration, + StreamSetup, + AnalyticsStateInformation, +} from './onvif'; +import { AnyURI } from './basics'; + +export interface Capabilities {} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the analytics device service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface DeleteAnalyticsEngineControl { + /** Token of the Analytics Engine Control configuration to be deleted. */ + configurationToken?: ReferenceToken; +} +export interface DeleteAnalyticsEngineControlResponse {} +export interface CreateAnalyticsEngineInputs { + /** Settings of the configurations to be created. */ + configuration?: AnalyticsEngineInput[]; + forcePersistence?: boolean[]; +} +export interface CreateAnalyticsEngineInputsResponse { + /** Configurations containing token generated. */ + configuration?: AnalyticsEngineInput[]; +} +export interface CreateAnalyticsEngineControl { + /** Settings of the Analytics Engine Control configuration to be created. Mode shall be set to "idle". */ + configuration?: AnalyticsEngineControl; +} +export interface CreateAnalyticsEngineControlResponse { + /** Configuration containing token generated. */ + configuration?: AnalyticsEngineInput[]; +} +export interface SetAnalyticsEngineControl { + /** Contains the modified Analytics Engine Control configuration. */ + configuration?: AnalyticsEngineControl; + forcePersistence?: boolean; +} +export interface SetAnalyticsEngineControlResponse {} +export interface GetAnalyticsEngineControl { + /** Token of the requested AnalyticsEngineControl configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetAnalyticsEngineControlResponse { + /** Configuration of the AnalyticsEngineControl. */ + configuration?: AnalyticsEngineControl; +} +export interface GetAnalyticsEngineControls {} +export interface GetAnalyticsEngineControlsResponse { + /** List of available AnalyticsEngineControl configurations. */ + analyticsEngineControls?: AnalyticsEngineControl[]; +} +export interface GetAnalyticsEngine { + /** Token of the requested AnalyticsEngine configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetAnalyticsEngineResponse { + /** Configuration of the AnalyticsEngine. */ + configuration?: AnalyticsEngine; +} +export interface GetAnalyticsEngines {} +export interface GetAnalyticsEnginesResponse { + /** List of available AnalyticsEngine configurations. */ + configuration?: AnalyticsEngine[]; +} +export interface SetVideoAnalyticsConfiguration { + /** Contains the modified video analytics configuration. The configuration shall exist in the device. */ + configuration?: VideoAnalyticsConfiguration; + forcePersistence?: boolean; +} +export interface SetVideoAnalyticsConfigurationResponse {} +export interface SetAnalyticsEngineInput { + /** Contains the modified Analytics Engine Input configuration. The configuration shall exist in the device. */ + configuration?: AnalyticsEngineInput; + forcePersistence?: boolean; +} +export interface SetAnalyticsEngineInputResponse {} +export interface GetAnalyticsEngineInput { + /** Token of the requested AnalyticsEngineInput configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetAnalyticsEngineInputResponse { + /** Configuration of the AnalyticsEngineInput. */ + configuration?: AnalyticsEngineInput; +} +export interface GetAnalyticsEngineInputs {} +export interface GetAnalyticsEngineInputsResponse { + /** List of available AnalyticsEngineInput configurations. */ + configuration?: AnalyticsEngineInput[]; +} +export interface GetAnalyticsDeviceStreamUri { + /** Configuration of the URI requested. */ + streamSetup?: StreamSetup; + /** Token of the AnalyticsEngineControl whose URI is requested. */ + analyticsEngineControlToken?: ReferenceToken; +} +export interface GetAnalyticsDeviceStreamUriResponse { + /** Streaming URI. */ + uri?: AnyURI; +} +export interface GetVideoAnalyticsConfiguration { + /** Token of the VideoAnalyticsConfiguration requested. */ + configurationToken?: ReferenceToken; +} +export interface GetVideoAnalyticsConfigurationResponse { + /** Settings of the VideoAnalyticsConfiguration. */ + configuration?: VideoAnalyticsConfiguration; +} +export interface DeleteAnalyticsEngineInputs { + /** LIst of tokens of Analytics Engine Input configurations to be deleted. */ + configurationToken?: ReferenceToken[]; +} +export interface DeleteAnalyticsEngineInputsResponse {} +export interface GetAnalyticsState { + /** Token of the AnalyticsEngineControl whose state information is requested. */ + analyticsEngineControlToken?: ReferenceToken; +} +export interface GetAnalyticsStateResponse { + /** Current status information. */ + state?: AnalyticsStateInformation; +} diff --git a/src/interfaces/appmgmt.ts b/src/interfaces/appmgmt.ts new file mode 100644 index 00000000..4babbae4 --- /dev/null +++ b/src/interfaces/appmgmt.ts @@ -0,0 +1,102 @@ +import { Date, StringAttrList } from './onvif'; +import { AnyURI } from './basics'; + +export type AppState = 'Active' | 'Inactive' | 'Installing' | 'Uninstalling' | 'Removed' | 'InstallationFailed'; +export interface AppInfo { + /** Unique app identifier of the application instance. */ + appID?: string; + /** User readable application name */ + name?: string; + /** Version of the installed application. The details of the format are outside of the scope of this specificaton. */ + version?: string; + /** Licenses associated with the application. */ + licenses?: LicenseInfo[]; + /** List of privileges granted to the application. */ + privileges?: string[]; + /** Date and time when the application has been installed. */ + installationDate?: Date; + /** Time of last update to this app, i.e. the time when this particular version was installed. */ + lastUpdate?: Date; + /** InstallationFailed state shall not be used here. */ + state?: AppState; + /** Supplemental information why the application is in the current state. In error cases this field contains the error reason. */ + status?: string; + /** If set the application will start automatically after booting of the device. */ + autostart?: boolean; + /** Link to supplementary information about the application or its vendor. */ + website?: AnyURI; + /** Link to a list of open source licenses used by the application. */ + openSource?: AnyURI; + /** Optional Uri for backup and restore of the application configuration. */ + configuration?: AnyURI; + /** Optional reference to the interface definition of the application. */ + interfaceDescription?: AnyURI[]; +} +export interface LicenseInfo { + /** Textual name of the license */ + name?: string; + /** Start time of validity */ + validFrom?: Date; + /** End time of validity */ + validUntil?: Date; +} +export interface Capabilities { + /** List of supported app container formats that can be uploaded via this service. */ + formatsSupported?: StringAttrList; + /** Signals support for licensing of applications. */ + licensing?: boolean; + /** + * Path part of the URI to which applications can be uploaded via http POST. + * Clients shall use protocol, hostname and port of the service address since the device may e.g. reside behind NAT translation firewall. + */ + uploadPath?: AnyURI; + /** Optional Event Topic prefix used when delivering app events in eventservice. */ + eventTopicPrefix?: string; +} +export interface Uninstall { + /** App to be uninstalled. Possible failures during deinstallation will be delivered via an event. */ + appID?: string; +} +export interface UninstallResponse {} +export interface GetAppsInfo { + /** Optional ID to only retrieve information for a single application. */ + appID?: string; +} +export interface GetAppsInfoResponse { + info?: AppInfo[]; +} +export interface GetInstalledApps {} +export interface App { + name?: string; + appID?: string; +} +export interface GetInstalledAppsResponse { + /** List of installed apps providing both user readable name and token. */ + app?: App[]; +} +export interface Activate { + /** App identifier. */ + appID?: string; +} +export interface ActivateResponse {} +export interface Deactivate { + /** App identifier. */ + appID?: string; +} +export interface DeactivateResponse {} +export interface InstallLicense { + /** Application the license shall be associated to. */ + appID?: string; + /** Opaque machine readable license string. */ + license?: string; +} +export interface InstallLicenseResponse {} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities of the service. */ + capabilities?: Capabilities; +} +export interface GetDeviceId {} +export interface GetDeviceIdResponse { + deviceId?: string; +} diff --git a/src/interfaces/authenticationbehavior.ts b/src/interfaces/authenticationbehavior.ts new file mode 100644 index 00000000..87d824c4 --- /dev/null +++ b/src/interfaces/authenticationbehavior.ts @@ -0,0 +1,383 @@ +import { PositiveInteger, DataEntity } from './types'; +import { StringList, Name, Description } from './onvif'; +import { ReferenceToken } from './common'; + +/** + * The service capabilities reflect optional functionality of a service. The information is static + * and does not change during device operation. The following capabilities are available: + */ +export interface ServiceCapabilities { + /** + * The maximum number of entries returned by a single Get<Entity>List or Get<Entity> + * request. + * The device shall never return more than this number of entities in a single response. + */ + maxLimit: PositiveInteger; + /** + * Indicates the maximum number of authentication profiles the device supports. The device + * shall + * support at least one authentication profile. + */ + maxAuthenticationProfiles: PositiveInteger; + /** + * Indicates the maximum number of authentication policies per authentication profile supported + * by the device. + */ + maxPoliciesPerAuthenticationProfile: PositiveInteger; + /** + * Indicates the maximum number of security levels the device supports. The device shall + * support at least one + * security level. + */ + maxSecurityLevels: PositiveInteger; + /** + * Indicates the maximum number of recognition groups per security level supported by the + * device. + */ + maxRecognitionGroupsPerSecurityLevel: PositiveInteger; + /** + * Indicates the maximum number of recognition methods per recognition group supported by the + * device. + */ + maxRecognitionMethodsPerRecognitionGroup: PositiveInteger; + /** + * Indicates that the client is allowed to supply the token when creating authentication + * profiles and + * security levels. To enable the use of the commands SetAuthenticationProfile and + * SetSecurityLevel, the + * value must be set to true. + */ + clientSuppliedTokenSupported?: boolean; + /** + * A list of supported authentication modes (including custom modes). + * This field is optional, and when omitted, the client shall assume that the + * device supports "pt:SingleCredential" only. + */ + supportedAuthenticationModes?: StringList; +} +/** + * The AuthenticationProfileInfo structure contains information of a specific authentication + * profile instance. + */ +export interface AuthenticationProfileInfo extends DataEntity { + /** A user readable name. It shall be up to 64 characters. */ + name?: Name; + /** + * User readable description for the access profile. It shall be up + * to 1024 characters. + */ + description?: Description; +} +/** + * The AuthenticationProfile structure shall include all properties of the + * AuthenticationProfileInfo structure + * and also a default security level, an authentication mode, and a list of AuthenticationProfile + * instances. + */ +export interface AuthenticationProfile extends AuthenticationProfileInfo { + /** + * The default security level is used if none of the authentication policies + * has a schedule covering the time of access (or if no authentication policies + * are defined). + */ + defaultSecurityLevelToken?: ReferenceToken; + /** + * Each authentication policy associates a security level with a schedule (during + * which the specified security level will be required at the access point). + */ + authenticationPolicy?: AuthenticationPolicy[]; + extension?: AuthenticationProfileExtension; +} +export interface AuthenticationProfileExtension {} +/** + * The authentication policy is an association of a security level and a schedule. It defines when + * a certain security level is required to grant access to a credential holder. Each security + * level is given a unique priority. If authentication policies have overlapping schedules, + * the security level with the highest priority is used. + */ +export interface AuthenticationPolicy { + /** Reference to the schedule used by the authentication policy. */ + scheduleToken?: ReferenceToken; + /** + * A list of security level constraint structures defining the conditions + * for what security level to use. + * Minimum one security level constraint must be specified. + */ + securityLevelConstraint?: SecurityLevelConstraint[]; + extension?: AuthenticationPolicyExtension; +} +export interface AuthenticationPolicyExtension {} +/** + * This structure defines what security level should be active depending on the state of the + * schedule. + */ +export interface SecurityLevelConstraint { + /** + * Corresponds to the Active field in the ScheduleState structure in + * [ONVIF Schedule Service Specification]. + */ + activeRegularSchedule?: boolean; + /** + * Corresponds to the SpecialDay field in the ScheduleState structure in + * [ONVIF Schedule Service Specification]. + * This field will be ignored if the device do not support special days. + */ + activeSpecialDaySchedule?: boolean; + /** + * Defines the mode of authentication. Authentication modes starting with the prefix + * pt: are reserved to define ONVIF-specific authentication modes. For custom defined + * authentication modes, free text can be used. + * The following authentication modes are defined by ONVIF: + * pt:SingleCredential - Normal mode where only one credential holder is required to be granted access. + * pt:DualCredential - Two credential holders are required to be granted access + */ + authenticationMode?: Name; + /** Reference to the security level used by the authentication policy. */ + securityLevelToken?: ReferenceToken; + extension?: SecurityLevelConstraintExtension; +} +export interface SecurityLevelConstraintExtension {} +/** + * Recognition is the action of identifying authorized users requesting access by the comparison of + * presented + * credential data with recorded credential data. A recognition method is either memorized, + * biometric or held + * within a physical credential. A recognition type is either a recognition method or a physical + * input such as + * a request-to-exit button. + */ +export interface RecognitionMethod { + /** + * The requested type of recognition. Is of type text. + * Recognition types starting with the prefix pt: are reserved to define + * ONVIF-specific types as defined in pt:RecognitionType. For custom defined + * identifier types, free text can be used. + */ + recognitionType?: string; + /** + * The order value defines when this recognition method will be requested in relation + * to the other recognition methods in the same security level. A lower number indicates + * that the recognition method will be requested before recognition methods with a higher number. + */ + order?: number; + extension?: RecognitionMethodExtension; +} +export interface RecognitionMethodExtension {} +/**/ +export interface RecognitionGroup { + /** A list of recognition methods to request for at the access point. */ + recognitionMethod?: RecognitionMethod[]; + extension?: RecognitionGroupExtension; +} +export interface RecognitionGroupExtension {} +/** The SecurityLevelInfo structure contains information of a specific security level instance. */ +export interface SecurityLevelInfo extends DataEntity { + /** A user readable name. It shall be up to 64 characters. */ + name?: Name; + /** + * A higher number indicates that the security level is considered more secure + * than security levels with lower priorities. The priority is used when an + * authentication profile have overlapping schedules with different security + * levels. When an access point is accessed, the authentication policies are + * walked through in priority order (highest priority first). When a schedule is + * found covering the time of access, the associated security level is used and + * processing stops. Two security levels cannot have the same priority. + */ + priority?: number; + /** + * User readable description for the access profile. It shall be up + * to 1024 characters. + */ + description?: Description; +} +/** + * The SecurityLevel structure shall include all properties of the SecurityLevelInfo structure and + * also a set + * of recognition groups. + * The recognition groups are used to define a logical OR between the groups. Each recognition + * group consists + * of one or more recognition methods. + */ +export interface SecurityLevel extends SecurityLevelInfo { + /** + * The recognition groups are used to define a logical OR between the groups. Each + * recognition group consists of one or more recognition methods. + */ + recognitionGroup?: RecognitionGroup[]; + extension?: SecurityLevelExtension; +} +export interface SecurityLevelExtension {} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** + * The capability response message contains the requested access rules + * service capabilities using a hierarchical XML capability structure. + */ + capabilities?: ServiceCapabilities; +} +export interface GetAuthenticationProfileInfo { + /** Tokens of AuthenticationProfileInfo items to get. */ + token?: ReferenceToken[]; +} +export interface GetAuthenticationProfileInfoResponse { + /** List of AuthenticationProfileInfo items. */ + authenticationProfileInfo?: AuthenticationProfileInfo[]; +} +export interface GetAuthenticationProfileInfoList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetAuthenticationProfileInfoListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of AuthenticationProfileInfo items. */ + authenticationProfileInfo?: AuthenticationProfileInfo[]; +} +export interface GetAuthenticationProfiles { + /** Tokens of AuthenticationProfile items to get. */ + token?: ReferenceToken[]; +} +export interface GetAuthenticationProfilesResponse { + /** List of AuthenticationProfile items. */ + authenticationProfile?: AuthenticationProfile[]; +} +export interface GetAuthenticationProfileList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetAuthenticationProfileListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of AuthenticationProfile items. */ + authenticationProfile?: AuthenticationProfile[]; +} +export interface CreateAuthenticationProfile { + /** The AuthenticationProfile to create. */ + authenticationProfile?: AuthenticationProfile; +} +export interface CreateAuthenticationProfileResponse { + /** The Token of created AuthenticationProfile. */ + token?: ReferenceToken; +} +export interface SetAuthenticationProfile { + /** The AuthenticationProfile to create or modify. */ + authenticationProfile?: AuthenticationProfile; +} +export interface SetAuthenticationProfileResponse {} +export interface ModifyAuthenticationProfile { + /** The AuthenticationProfile to modify. */ + authenticationProfile?: AuthenticationProfile; +} +export interface ModifyAuthenticationProfileResponse {} +export interface DeleteAuthenticationProfile { + /** The token of the AuthenticationProfile to delete. */ + token?: ReferenceToken; +} +export interface DeleteAuthenticationProfileResponse {} +export interface GetSecurityLevelInfo { + /** Tokens of SecurityLevelInfo items to get. */ + token?: ReferenceToken[]; +} +export interface GetSecurityLevelInfoResponse { + /** List of SecurityLevelInfo items. */ + securityLevelInfo?: SecurityLevelInfo[]; +} +export interface GetSecurityLevelInfoList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetSecurityLevelInfoListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of SecurityLevelInfo items. */ + securityLevelInfo?: SecurityLevelInfo[]; +} +export interface GetSecurityLevels { + /** Tokens of SecurityLevel items to get. */ + token?: ReferenceToken[]; +} +export interface GetSecurityLevelsResponse { + /** List of SecurityLevel items. */ + securityLevel?: SecurityLevel[]; +} +export interface GetSecurityLevelList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetSecurityLevelListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of SecurityLevel items. */ + securityLevel?: SecurityLevel[]; +} +export interface CreateSecurityLevel { + /** The SecurityLevel to create. */ + securityLevel?: SecurityLevel; +} +export interface CreateSecurityLevelResponse { + /** The Token of created SecurityLevel. */ + token?: ReferenceToken; +} +export interface SetSecurityLevel { + /** The SecurityLevel to create or modify. */ + securityLevel?: SecurityLevel; +} +export interface SetSecurityLevelResponse {} +export interface ModifySecurityLevel { + /** The SecurityLevel to modify. */ + securityLevel?: SecurityLevel; +} +export interface ModifySecurityLevelResponse {} +export interface DeleteSecurityLevel { + /** The token of the SecurityLevel to delete. */ + token?: ReferenceToken; +} +export interface DeleteSecurityLevelResponse {} diff --git a/src/interfaces/basics.ts b/src/interfaces/basics.ts new file mode 100644 index 00000000..3788d385 --- /dev/null +++ b/src/interfaces/basics.ts @@ -0,0 +1,4 @@ +/* eslint-disable import/export, no-tabs */ +export type AnyURI = string; +export type FilterType = any; +export type NCName = string; diff --git a/src/interfaces/bw-2-vs-mod.ts b/src/interfaces/bw-2-vs-mod.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/interfaces/common.ts b/src/interfaces/common.ts new file mode 100644 index 00000000..d5073f5c --- /dev/null +++ b/src/interfaces/common.ts @@ -0,0 +1,192 @@ +import { AnyURI } from './basics'; +import { Date } from './onvif'; + +/** + * Unique identifier for a physical or logical resource. + * Tokens should be assigned such that they are unique within a device. Tokens must be at least unique within its class. + * Length up to 64 characters. Token may be extended by intermediate terminal with adding prefix to make it global unique. + * The length should be within 36 characters for generating at local device. See "Remote Token" section in Resource Query specification. + */ +export type ReferenceToken = string; +export type MoveStatus = 'IDLE' | 'MOVING' | 'UNKNOWN'; +export type Entity = 'Device' | 'VideoSource' | 'AudioSource'; +/** Range of values greater equal Min value and less equal Max value. */ +export interface IntRange { + min?: number; + max?: number; +} +export interface Vector2D { + x: number; + y: number; + /** + * Pan/tilt coordinate space selector. The following options are defined: + * http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace + * http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace + * http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace + * http://www.onvif.org/ver10/tptz/PanTiltSpaces/GenericSpeedSpace + * + */ + space?: AnyURI; +} +export interface Vector1D { + x: number; + /** + * Zoom coordinate space selector. The following options are defined: + * http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace + * http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace + * http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace + * http://www.onvif.org/ver10/tptz/ZoomSpaces/ZoomGenericSpeedSpace + * + */ + space?: AnyURI; +} +export interface PTZVector { + /** Pan and tilt position. The x component corresponds to pan and the y component to tilt. */ + panTilt?: Vector2D; + /** A zoom position. */ + zoom?: Vector1D; +} +export interface PTZStatus { + /** Specifies the absolute position of the PTZ unit together with the Space references. The default absolute spaces of the corresponding PTZ configuration MUST be referenced within the Position element. */ + position?: PTZVector; + /** Indicates if the Pan/Tilt/Zoom device unit is currently moving, idle or in an unknown state. */ + moveStatus?: PTZMoveStatus; + /** States a current PTZ error. */ + error?: string; + /** Specifies the UTC time when this status was generated. */ + utcTime?: Date; +} +export interface PTZMoveStatus { + /**/ + panTilt?: MoveStatus; + /**/ + zoom?: MoveStatus; +} +export interface Vector { + x?: number; + y?: number; +} +export interface Rectangle { + bottom?: number; + top?: number; + right?: number; + left?: number; +} +export interface Polygon { + point?: Vector[]; +} +export interface Color { + X: number; + Y: number; + Z: number; + /** + * Acceptable values: + * + * http://www.onvif.org/ver10/colorspace/YCbCr - YCbCr + * X attribute = Y value + * Y attribute = Cb value + * Z attribute = Cr value + * + * http://www.onvif.org/ver10/colorspace/RGB - RGB + * X attribute = R value + * Y attribute = G value + * Z attribute = B value + * + * + * If the Colorspace attribute is absent and not defined on higher level, YCbCr is implied. + * Deprecated values: + * + * http://www.onvif.org/ver10/colorspace/CIELUV - CIE LUV + * http://www.onvif.org/ver10/colorspace/CIELAB - CIE 1976 (L*a*b*) + * http://www.onvif.org/ver10/colorspace/HSV - HSV + * + */ + colorspace?: AnyURI; + /** Likelihood that the color is correct. */ + likelihood?: number; +} +export interface ColorCovariance { + XX: number; + YY: number; + ZZ: number; + XY?: number; + XZ?: number; + YZ?: number; + /** Acceptable values are the same as in tt:Color. */ + colorspace?: AnyURI; +} +export interface ColorCluster { + color?: Color; + weight?: number; + covariance?: ColorCovariance; +} +export interface ColorDescriptor { + colorCluster?: ColorCluster[]; + extension?: any; +} +export interface Transformation { + translate?: Vector; + scale?: Vector; + extension?: TransformationExtension; +} +export interface TransformationExtension {} +export interface GeoLocation { + /** East west location as angle. */ + lon?: number; + /** North south location as angle. */ + lat?: number; + /** Hight in meters above sea level. */ + elevation?: number; +} +export interface GeoOrientation { + /** Rotation around the x axis. */ + roll?: number; + /** Rotation around the y axis. */ + pitch?: number; + /** Rotation around the z axis. */ + yaw?: number; +} +export interface LocalLocation { + /** East west location as angle. */ + x?: number; + /** North south location as angle. */ + y?: number; + /** Offset in meters from the sea level. */ + z?: number; +} +export interface LocalOrientation { + /** Rotation around the y axis. */ + pan?: number; + /** Rotation around the z axis. */ + tilt?: number; + /** Rotation around the x axis. */ + roll?: number; +} +export interface SphericalCoordinate { + /** Distance in meters to the object. */ + distance?: number; + /** Elevation angle in the range -90 to 90 degrees, where 0 is in level with the x-y plane. */ + elevationAngle?: number; + /** Azimuth angle in the range -180 to 180 degrees counter clockwise, where 0 is rightwards. */ + azimuthAngle?: number; +} +export interface LocationEntity { + /** Entity type the entry refers to, use a value from the tt:Entity enumeration. */ + entity?: string; + /** Optional entity token. */ + token?: ReferenceToken; + /** If this value is true the entity cannot be deleted. */ + fixed?: boolean; + /** Optional reference to the XAddr of another devices DeviceManagement service. */ + geoSource?: AnyURI; + /** If set the geo location is obtained internally. */ + autoGeo?: boolean; + /** Location on earth. */ + geoLocation?: GeoLocation; + /** Orientation relative to earth. */ + geoOrientation?: GeoOrientation; + /** Indoor location offset. */ + localLocation?: LocalLocation; + /** Indoor orientation offset. */ + localOrientation?: LocalOrientation; +} diff --git a/src/interfaces/credential.ts b/src/interfaces/credential.ts new file mode 100644 index 00000000..b40ed758 --- /dev/null +++ b/src/interfaces/credential.ts @@ -0,0 +1,517 @@ +import { PositiveInteger, DataEntity, Attribute } from './types'; +import { Name, Description, Date } from './onvif'; +import { ReferenceToken } from './common'; + +/** + * The service capabilities reflect optional functionality of a service. The information is static + * and does not change during device operation. The following capabilities are available: + */ +export interface ServiceCapabilities { + /** + * The maximum number of entries returned by a single Get<Entity>List or Get<Entity> + * request. The device shall never return more than this number of entities in a single response. + */ + maxLimit: PositiveInteger; + /** Indicates that the device supports credential validity. */ + credentialValiditySupported: boolean; + /** + * Indicates that the device supports validity on the association between a credential and an + * access profile. + */ + credentialAccessProfileValiditySupported: boolean; + /** + * Indicates that the device supports both date and time value for validity. If set to false, + * then the time value is ignored. + */ + validitySupportsTimeValue: boolean; + /** + * The maximum number of credential supported by the device. + * If set to 0, then operations using credential token are not supported. + */ + maxCredentials: number; + /** The maximum number of access profiles for a credential. */ + maxAccessProfilesPerCredential: PositiveInteger; + /** + * Indicates the device supports resetting of anti-passback violations and notifying on + * anti-passback violations. + */ + resetAntipassbackSupported: boolean; + /** + * Indicates that the client is allowed to supply the token when creating credentials. + * To enable the use of the command SetCredential, the value must be set to true. + */ + clientSuppliedTokenSupported?: boolean; + /** + * The default time period that the credential will temporary be suspended (e.g. by using + * the wrong PIN a predetermined number of times). + * The time period is defined as an [ISO 8601] duration string (e.g. “PT5M”). + */ + defaultCredentialSuspensionDuration?: any; + /** The maximum number of whitelisted credential identifiers supported by the device. */ + maxWhitelistedItems?: number; + /** The maximum number of blacklisted credential identifiers supported by the device. */ + maxBlacklistedItems?: number; + /** + * A list of identifier types that the device supports. Is of type text. + * Identifier types starting with the prefix pt: are reserved to define ONVIF-specific + * types as defined in pt:RecognitionType. Please note that pt:REX is not an identifier + * type. For custom defined identifier types, free text can be used. + */ + supportedIdentifierType?: Name[]; + extension?: ServiceCapabilitiesExtension; +} +export interface ServiceCapabilitiesExtension { + /** + * A list of exemptions that the device supports. Supported exemptions starting with the + * prefix pt: are reserved to define ONVIF specific exemption types and these reserved + * exemption types shall all share "pt:<Name>" syntax. + */ + supportedExemptionType?: Name[]; +} +/** + * The CredentialInfo type represents the credential as a logical object. The structure contains + * the basic information of a specific credential instance. The device shall provide the following + * fields for each credential. + */ +export interface CredentialInfo extends DataEntity { + /** User readable description for the credential. It shall be up to 1024 characters. */ + description?: Description; + /** + * An external reference to a person holding this credential. The + * reference is a username or used ID in an external system, such as a directory + * service. + */ + credentialHolderReference?: any; + /** + * The start date/time validity of the credential. If the + * ValiditySupportsTimeValue capability is set to false, then only date is + * supported (time is ignored). + */ + validFrom?: Date; + /** + * The expiration date/time validity of the credential. If the + * ValiditySupportsTimeValue capability is set to false, then only date is + * supported (time is ignored). + */ + validTo?: Date; +} +/** + * A Credential is a physical/tangible object, a piece of knowledge, or a facet of a person's + * physical being, that enables an individual access to a given physical facility or computer-based + * information system. A credential holds one or more credential identifiers. To gain access one or + * more identifiers may be required. + */ +export interface Credential extends CredentialInfo { + /** + * A list of credential identifier structures. At least one + * credential identifier is required. Maximum one credential identifier structure + * per type is allowed. + */ + credentialIdentifier?: CredentialIdentifier[]; + /** A list of credential access profile structures. */ + credentialAccessProfile?: CredentialAccessProfile[]; + /** + * A boolean indicating that the credential holder needs extra time to get through the door. + * ExtendedReleaseTime will be added to ReleaseTime, and ExtendedOpenTime will be added to OpenTime + */ + extendedGrantTime?: boolean; + /** + * A list of credential attributes as name value pairs. Key names + * starting with the prefix pt: are reserved to define PACS specific attributes + * following the "pt:<Name>" syntax. + */ + attribute?: Attribute[]; + extension?: CredentialExtension; +} +export interface CredentialExtension {} +/** + * A credential identifier is a card number, unique card information, PIN or + * biometric information such as fingerprint, iris, vein, face recognition, that can be validated + * in an access point. + */ +export interface CredentialIdentifier { + /** + * Contains the details of the credential identifier type. Is of type + * CredentialIdentifierType. + */ + type?: CredentialIdentifierType; + /** + * If set to true, this credential identifier is not considered for + * authentication. For example if the access point requests Card plus PIN, and the credential + * identifier of type PIN is exempted from authentication, then the access point will not prompt + * for the PIN. + */ + exemptedFromAuthentication?: boolean; + /** The value of the identifier in hexadecimal representation. */ + value?: any; +} +/** + * Specifies the name of credential identifier type and its format for the credential + * value. + */ +export interface CredentialIdentifierType { + /** + * The name of the credential identifier type, such as pt:Card, pt:PIN, + * etc. + */ + name?: Name; + /** + * Specifies the format of the credential value for the specified identifier + * type name. + */ + formatType?: string; +} +/** The association between a credential and an access profile. */ +export interface CredentialAccessProfile { + /** The reference token of the associated access profile. */ + accessProfileToken?: ReferenceToken; + /** + * The start date/time of the validity for the association between the + * credential and the access profile. If the ValiditySupportsTimeValue capability is set to + * false, then only date is supported (time is ignored). + */ + validFrom?: Date; + /** + * The end date/time of the validity for the association between the + * credential and the access profile. If the ValiditySupportsTimeValue capability is set to + * false, then only date is supported (time is ignored). + */ + validTo?: Date; +} +/** + * The CredentialState structure contains information about the state of the credential and + * optionally the reason of why the credential was disabled. + */ +export interface CredentialState { + /** + * True if the credential is enabled or false if the credential is + * disabled. + */ + enabled?: boolean; + /** + * Predefined ONVIF reasons as mentioned in the section 5.4.2.7 + * of credential service specification document. For any other reason, free + * text can be used. + */ + reason?: Name; + /** + * A structure indicating the anti-passback state. This field shall be + * supported if the ResetAntipassbackSupported capability is set to true. + */ + antipassbackState?: AntipassbackState; + extension?: CredentialStateExtension; +} +export interface CredentialStateExtension {} +/** A structure containing anti-passback related state information. */ +export interface AntipassbackState { + /** Indicates if anti-passback is violated for the credential. */ + antipassbackViolated?: boolean; +} +/** Contains information about a format type. */ +export interface CredentialIdentifierFormatTypeInfo { + /** + * A format type supported by the device. A list of supported format types is + * provided in [ISO 16484-5:2014-09 Annex P]. The BACnet type "CUSTOM" is not used in this + * specification. Instead device manufacturers can define their own format types. + */ + formatType?: string; + /** + * User readable description of the credential identifier format type. It + * shall be up to 1024 characters. For custom types, it is recommended to describe how the + * octet string is encoded (following the structure in column Authentication Factor Value + * Encoding of [ISO 16484-5:2014-09 Annex P]). + */ + description?: Description; + extension?: CredentialIdentifierFormatTypeInfoExtension; +} +export interface CredentialIdentifierFormatTypeInfoExtension {} +/** Contains information about a format type. */ +export interface CredentialData { + /** + * A format type supported by the device. A list of supported format types is + * provided in [ISO 16484-5:2014-09 Annex P]. The BACnet type "CUSTOM" is not used in this + * specification. Instead device manufacturers can define their own format types. + */ + credential?: Credential; + /** + * User readable description of the credential identifier format type. It + * shall be up to 1024 characters. For custom types, it is recommended to describe how the + * octet string is encoded (following the structure in column Authentication Factor Value + * Encoding of [ISO 16484-5:2014-09 Annex P]). + */ + credentialState?: CredentialState; + extension?: CredentialDataExtension; +} +export interface CredentialDataExtension {} +/** + * A credential identifier is a card number, unique card information, PIN or biometric information + * such as fingerprint, iris, vein, face recognition, that can be validated in an access point. + */ +export interface CredentialIdentifierItem { + /** Contains the details of the credential identifier type. */ + type?: CredentialIdentifierType; + /** The value of the identifier in hexadecimal representation. */ + value?: any; +} +/** Contains information about a format type. */ +export interface FaultResponse { + /** + * A format type supported by the device. A list of supported format types is + * provided in [ISO 16484-5:2014-09 Annex P]. The BACnet type "CUSTOM" is not used in this + * specification. Instead device manufacturers can define their own format types. + */ + token?: ReferenceToken; + /** + * User readable description of the credential identifier format type. It + * shall be up to 1024 characters. For custom types, it is recommended to describe how the + * octet string is encoded (following the structure in column Authentication Factor Value + * Encoding of [ISO 16484-5:2014-09 Annex P]). + */ + fault?: string; + extension?: FaultResponseExtension; +} +export interface FaultResponseExtension {} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** + * The capability response message contains the requested credential + * service capabilities using a hierarchical XML capability structure. + */ + capabilities?: ServiceCapabilities; +} +export interface GetSupportedFormatTypes { + /** Name of the credential identifier type */ + credentialIdentifierTypeName?: string; +} +export interface GetSupportedFormatTypesResponse { + /** Identifier format type */ + formatTypeInfo?: CredentialIdentifierFormatTypeInfo[]; +} +export interface GetCredentialInfo { + /** Tokens of CredentialInfo items to get. */ + token?: ReferenceToken[]; +} +export interface GetCredentialInfoResponse { + /** List of CredentialInfo items. */ + credentialInfo?: CredentialInfo[]; +} +export interface GetCredentialInfoList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetCredentialInfoListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of CredentialInfo items. */ + credentialInfo?: CredentialInfo[]; +} +export interface GetCredentials { + /** Token of Credentials to get */ + token?: ReferenceToken[]; +} +export interface GetCredentialsResponse { + /** List of Credential items. */ + credential?: Credential[]; +} +export interface GetCredentialList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetCredentialListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of Credential items. */ + credential?: Credential[]; +} +export interface CreateCredential { + /** The credential to create. */ + credential?: Credential; + /** The state of the credential. */ + state?: CredentialState; +} +export interface CreateCredentialResponse { + /** The token of the created credential */ + token?: ReferenceToken; +} +export interface ModifyCredential { + /** Details of the credential. */ + credential?: Credential; +} +export interface ModifyCredentialResponse {} +export interface SetCredential { + /** Details of the credential. */ + credentialData?: CredentialData; +} +export interface SetCredentialResponse {} +export interface DeleteCredential { + /** The token of the credential to delete. */ + token?: ReferenceToken; +} +export interface DeleteCredentialResponse {} +export interface GetCredentialState { + /** Token of Credential */ + token?: ReferenceToken; +} +export interface GetCredentialStateResponse { + /** State of the credential. */ + state?: CredentialState; +} +export interface EnableCredential { + /** The token of the credential */ + token?: ReferenceToken; + /** Reason for enabling the credential. */ + reason?: Name; +} +export interface EnableCredentialResponse {} +export interface DisableCredential { + /** Token of the Credential */ + token?: ReferenceToken; + /** Reason for disabling the credential */ + reason?: Name; +} +export interface DisableCredentialResponse {} +export interface ResetAntipassbackViolation { + /** Token of the Credential */ + credentialToken?: ReferenceToken; +} +export interface ResetAntipassbackViolationResponse {} +export interface GetCredentialIdentifiers { + /** Token of the Credential */ + credentialToken?: ReferenceToken; +} +export interface GetCredentialIdentifiersResponse { + /** Identifier of the credential */ + credentialIdentifier?: CredentialIdentifier[]; +} +export interface SetCredentialIdentifier { + /** Token of the Credential */ + credentialToken?: ReferenceToken; + /** Identifier of the credential */ + credentialIdentifier?: CredentialIdentifier; +} +export interface SetCredentialIdentifierResponse {} +export interface DeleteCredentialIdentifier { + /** Token of the Credential */ + credentialToken?: ReferenceToken; + /** Identifier type name of a credential */ + credentialIdentifierTypeName?: Name; +} +export interface DeleteCredentialIdentifierResponse {} +export interface GetCredentialAccessProfiles { + /** Token of the Credential */ + credentialToken?: ReferenceToken; +} +export interface GetCredentialAccessProfilesResponse { + /** Access Profiles of the credential */ + credentialAccessProfile?: CredentialAccessProfile[]; +} +export interface SetCredentialAccessProfiles { + /** Token of the Credential */ + credentialToken?: ReferenceToken; + /** Access Profiles of the credential */ + credentialAccessProfile?: CredentialAccessProfile[]; +} +export interface SetCredentialAccessProfilesResponse {} +export interface DeleteCredentialAccessProfiles { + /** Token of the Credential */ + credentialToken?: ReferenceToken; + /** Tokens of Access Profiles */ + accessProfileToken?: ReferenceToken[]; +} +export interface DeleteCredentialAccessProfilesResponse {} +export interface GetWhitelist { + /** + * Maximum number of entries to return. If not specified, less than one or higher than what the device + * supports, the number of items is determined by the device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, entries shall start from the + * beginning of the dataset. + */ + startReference?: string; + /** Get only whitelisted credential identifiers with the specified identifier type. */ + identifierType?: string; + /** Get only whitelisted credential identifiers with the specified identifier format type. */ + formatType?: string; + /** Get only whitelisted credential identifiers with the specified identifier value. */ + value?: any; +} +export interface GetWhitelistResponse { + /** StartReference to use in next call to get the following items. If absent, no more items to get. */ + nextStartReference?: string; + /** The whitelisted credential identifiers matching the request criteria. */ + identifier?: CredentialIdentifierItem[]; +} +export interface AddToWhitelist { + /** The credential identifiers to be added to the whitelist. */ + identifier?: CredentialIdentifierItem[]; +} +export interface AddToWhitelistResponse {} +export interface RemoveFromWhitelist { + /** The credential identifiers to be removed from the whitelist. */ + identifier?: CredentialIdentifierItem[]; +} +export interface RemoveFromWhitelistResponse {} +export interface DeleteWhitelist {} +export interface DeleteWhitelistResponse {} +export interface GetBlacklist { + /** + * Maximum number of entries to return. If not specified, less than one or higher than what the device + * supports, the number of items is determined by the device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, entries shall start from the + * beginning of the dataset. + */ + startReference?: string; + /** Get only blacklisted credential identifiers with the specified identifier type. */ + identifierType?: string; + /** Get only blacklisted credential identifiers with the specified identifier format type. */ + formatType?: string; + /** Get only blacklisted credential identifiers with the specified identifier value. */ + value?: any; +} +export interface GetBlacklistResponse { + /** StartReference to use in next call to get the following items. If absent, no more items to get. */ + nextStartReference?: string; + /** The blacklisted credential identifiers matching the request criteria. */ + identifier?: CredentialIdentifierItem[]; +} +export interface AddToBlacklist { + /** The credential identifiers to be added to the blacklist. */ + identifier?: CredentialIdentifierItem[]; +} +export interface AddToBlacklistResponse {} +export interface RemoveFromBlacklist { + /** The credential identifiers to be removed from the blacklist. */ + identifier?: CredentialIdentifierItem[]; +} +export interface RemoveFromBlacklistResponse {} +export interface DeleteBlacklist {} +export interface DeleteBlacklistResponse {} diff --git a/src/interfaces/deviceio.ts b/src/interfaces/deviceio.ts new file mode 100644 index 00000000..daa33f03 --- /dev/null +++ b/src/interfaces/deviceio.ts @@ -0,0 +1,277 @@ +import { ReferenceToken } from './common'; +import { + RelayMode, + FloatList, + DigitalIdleState, + DeviceEntity, + IntItems, + FloatItems, + VideoOutput, + AudioSourceConfiguration, + AudioOutputConfiguration, + VideoSourceConfiguration, + VideoOutputConfiguration, + VideoSourceConfigurationOptions, + VideoOutputConfigurationOptions, + AudioSourceConfigurationOptions, + AudioOutputConfigurationOptions, + RelayOutput, + DigitalInput, +} from './onvif'; + +/** The type of serial port.Generic can be signaled as a vendor specific serial port type. */ +export type SerialPortType = + | 'RS232' + | 'RS422HalfDuplex' + | 'RS422FullDuplex' + | 'RS485HalfDuplex' + | 'RS485FullDuplex' + | 'Generic'; +/** The parity for the data error detection. */ +export type ParityBit = 'None' | 'Even' | 'Odd' | 'Mark' | 'Space' | 'Extended'; +export interface Capabilities { + /** Number of video sources (defaults to none). */ + videoSources?: number; + /** Number of video outputs (defaults to none). */ + videoOutputs?: number; + /** Number of audio sources (defaults to none). */ + audioSources?: number; + /** Number of audio outputs (defaults to none). */ + audioOutputs?: number; + /** Number of relay outputs (defaults to none). */ + relayOutputs?: number; + /** Number of serial ports (defaults to none). */ + serialPorts?: number; + /** Number of digital inputs (defaults to none). */ + digitalInputs?: number; + /** Indicates support for DigitalInput configuration of the idle state (defaults to false). */ + digitalInputOptions?: boolean; +} +export interface RelayOutputOptions { + /** Token of the relay output. */ + token: ReferenceToken; + /** Supported Modes. */ + mode?: RelayMode[]; + /** Supported delay time range or discrete values in seconds. This element must be present if MonoStable mode is supported. */ + delayTimes?: FloatList; + /** True if the relay only supports the exact values for the DelayTimes listed. Default is false. */ + discrete?: boolean; + extension?: RelayOutputOptionsExtension; +} +export interface RelayOutputOptionsExtension {} +export interface Get {} +export interface GetResponse { + /** List tokens of a physical IO of a device. */ + token?: ReferenceToken[]; +} +export interface DigitalInputConfigurationOptions { + /** Configuration Options for a digital input. */ + idleState?: DigitalIdleState[]; +} +/** The serial port data. */ +export interface SerialData {} +/** Lists all available serial ports of a device */ +export interface SerialPort extends DeviceEntity {} +/** The parameters for configuring the serial port. */ +export interface SerialPortConfiguration { + token: ReferenceToken; + type: SerialPortType; + /** The transfer bitrate. */ + baudRate?: number; + /** The parity for the data error detection. */ + parityBit?: ParityBit; + /** The bit length for each character. */ + characterLength?: number; + /** The number of stop bits used to terminate each character. */ + stopBit?: number; +} +/** The configuration options that relates to serial port. */ +export interface SerialPortConfigurationOptions { + token: ReferenceToken; + /** The list of configurable transfer bitrate. */ + baudRateList?: IntItems; + /** The list of configurable parity for the data error detection. */ + parityBitList?: ParityBitList; + /** The list of configurable bit length for each character. */ + characterLengthList?: IntItems; + /** The list of configurable number of stop bits used to terminate each character. */ + stopBitList?: FloatItems; +} +/** The list of configurable parity for the data error detection. */ +export interface ParityBitList { + items?: ParityBit[]; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the device IO service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetRelayOutputOptions { + /** Optional reference token to the relay for which the options are requested. */ + relayOutputToken?: ReferenceToken; +} +export interface GetRelayOutputOptionsResponse { + /** Valid values and ranges for the configuration of a relay output. */ + relayOutputOptions?: RelayOutputOptions[]; +} +export interface GetVideoOutputs {} +export interface GetVideoOutputsResponse { + /** List containing all physical Video output connections of a device. */ + videoOutputs?: VideoOutput[]; +} +export interface GetAudioSourceConfiguration { + /** Token of the requested AudioSource. */ + audioSourceToken?: ReferenceToken; +} +export interface GetAudioSourceConfigurationResponse { + /** Current configuration of the Audio input. */ + audioSourceConfiguration?: AudioSourceConfiguration; +} +export interface GetAudioOutputConfiguration { + /** Token of the physical Audio output. */ + audioOutputToken?: ReferenceToken; +} +export interface GetAudioOutputConfigurationResponse { + /** Current configuration of the Audio output. */ + audioOutputConfiguration?: AudioOutputConfiguration; +} +export interface GetVideoSourceConfiguration { + /** Token of the requested VideoSource. */ + videoSourceToken?: ReferenceToken; +} +export interface GetVideoSourceConfigurationResponse { + /** Current configuration of the Video input. */ + videoSourceConfiguration?: VideoSourceConfiguration; +} +export interface GetVideoOutputConfiguration { + /** Token of the requested VideoOutput. */ + videoOutputToken?: ReferenceToken; +} +export interface GetVideoOutputConfigurationResponse { + /** Current configuration of the Video output. */ + videoOutputConfiguration?: VideoOutputConfiguration; +} +export interface SetAudioSourceConfiguration { + configuration?: AudioSourceConfiguration; + /** + * The ForcePersistence element determines how configuration + * changes shall be stored. If true, changes shall be persistent. If false, changes MAY revert to previous values + * after reboot. + */ + forcePersistence?: boolean; +} +export interface SetAudioSourceConfigurationResponse {} +export interface SetAudioOutputConfiguration { + configuration?: AudioOutputConfiguration; + /** + * The ForcePersistence element determines how configuration + * changes shall be stored. If true, changes shall be persistent. If false, changes MAY revert to previous values + * after reboot. + */ + forcePersistence?: boolean; +} +export interface SetAudioOutputConfigurationResponse {} +export interface SetVideoSourceConfiguration { + configuration?: VideoSourceConfiguration; + /** + * The ForcePersistence element determines how configuration + * changes shall be stored. If true, changes shall be persistent. If false, changes MAY revert to previous values + * after reboot. + */ + forcePersistence?: boolean; +} +export interface SetVideoSourceConfigurationResponse {} +export interface SetVideoOutputConfiguration { + configuration?: VideoOutputConfiguration; + /** + * The ForcePersistence element determines how configuration + * changes shall be stored. If true, changes shall be persistent. If false, changes MAY revert to previous values + * after reboot. + */ + forcePersistence?: boolean; +} +export interface SetVideoOutputConfigurationResponse {} +export interface GetVideoSourceConfigurationOptions { + /** Token of the Video input whose options are requested.. */ + videoSourceToken?: ReferenceToken; +} +export interface GetVideoSourceConfigurationOptionsResponse { + videoSourceConfigurationOptions?: VideoSourceConfigurationOptions; +} +export interface GetVideoOutputConfigurationOptions { + /** Token of the Video Output whose options are requested.. */ + videoOutputToken?: ReferenceToken; +} +export interface GetVideoOutputConfigurationOptionsResponse { + videoOutputConfigurationOptions?: VideoOutputConfigurationOptions; +} +export interface GetAudioSourceConfigurationOptions { + /** Token of the physical Audio input whose options are requested.. */ + audioSourceToken?: ReferenceToken; +} +export interface GetAudioSourceConfigurationOptionsResponse { + /** Returns the AudioSourceToken available. */ + audioSourceOptions?: AudioSourceConfigurationOptions; +} +export interface GetAudioOutputConfigurationOptions { + /** Token of the physical Audio Output whose options are requested.. */ + audioOutputToken?: ReferenceToken; +} +export interface GetAudioOutputConfigurationOptionsResponse { + /** Available settings and ranges for the requested Audio output. */ + audioOutputOptions?: AudioOutputConfigurationOptions; +} +export interface SetRelayOutputSettings { + relayOutput?: RelayOutput; +} +export interface SetRelayOutputSettingsResponse {} +export interface GetDigitalInputs {} +export interface GetDigitalInputsResponse { + digitalInputs?: DigitalInput[]; +} +export interface GetDigitalInputConfigurationOptions { + token?: ReferenceToken; +} +export interface GetDigitalInputConfigurationOptionsResponse { + digitalInputOptions?: DigitalInputConfigurationOptions; +} +export interface SetDigitalInputConfigurations { + digitalInputs?: DigitalInput[]; +} +export interface SetDigitalInputConfigurationsResponse {} +export interface GetSerialPorts {} +export interface GetSerialPortsResponse { + serialPort?: SerialPort[]; +} +export interface GetSerialPortConfiguration { + serialPortToken?: ReferenceToken; +} +export interface GetSerialPortConfigurationResponse { + serialPortConfiguration?: SerialPortConfiguration; +} +export interface SetSerialPortConfiguration { + serialPortConfiguration?: SerialPortConfiguration; + forcePersistance?: boolean; +} +export interface SetSerialPortConfigurationResponse {} +export interface GetSerialPortConfigurationOptions { + serialPortToken?: ReferenceToken; +} +export interface GetSerialPortConfigurationOptionsResponse { + serialPortOptions?: SerialPortConfigurationOptions; +} +export interface SendReceiveSerialCommand { + /** The physical serial port reference to be used when this request is invoked. */ + token?: ReferenceToken; + /** The serial port data. */ + serialData?: SerialData; + /** Indicates that the command should be responded back within the specified period of time. */ + timeOut?: any; + /** This element may be put in the case that data length returned from the connected serial device is already determined as some fixed bytes length. It indicates the length of received data which can be regarded as available. */ + dataLength?: number; + /** This element may be put in the case that the delimiter codes returned from the connected serial device is already known. It indicates the termination data sequence of the responded data. In case the string has more than one character a device shall interpret the whole string as a single delimiter. Furthermore a device shall return the delimiter character(s) to the client. */ + delimiter?: string; +} +export interface SendReceiveSerialCommandResponse { + serialData?: SerialData; +} diff --git a/src/interfaces/devicemgmt.ts b/src/interfaces/devicemgmt.ts new file mode 100644 index 00000000..96e3715e --- /dev/null +++ b/src/interfaces/devicemgmt.ts @@ -0,0 +1,779 @@ +import { AnyURI } from './basics'; +import { + OnvifVersion, + IntList, + StringList, + StringAttrList, + DeviceEntity, + SetDateTimeType, + TimeZone, + DateTime, + SystemDateTime, + FactoryDefaultType, + AttachmentData, + BackupFile, + SupportInformation, + SystemLogType, + SystemLog, + Scope, + DiscoveryMode, + NetworkHost, + RemoteUser, + User, + CapabilityCategory, + HostnameInformation, + DNSInformation, + IPAddress, + NTPInformation, + DynamicDNSInformation, + DynamicDNSType, + DNSName, + NetworkInterface, + NetworkInterfaceSetConfiguration, + NetworkProtocol, + NetworkGateway, + IPv4Address, + IPv6Address, + NetworkZeroConfiguration, + IPAddressFilter, + BinaryData, + Date, + Certificate, + CertificateStatus, + CertificateWithPrivateKey, + CertificateInformation, + Dot1XConfiguration, + RelayOutput, + RelayOutputSettings, + RelayLogicalState, + AuxiliaryData, + Dot11Capabilities, + Dot11Status, + Dot11AvailableNetworks, + SystemLogUriList, +} from './onvif'; +import { IntRange, ReferenceToken, LocationEntity } from './common'; + +export type AutoGeoModes = 'Location' | 'Heading' | 'Leveling'; +export type StorageType = 'NFS' | 'CIFS' | 'CDMI' | 'FTP' | 'ObjectStorageS3' | 'ObjectStorageAzure'; +export interface Capabilities {} +export interface Service { + /** Namespace of the service being described. This parameter allows to match the service capabilities to the service. Note that only one set of capabilities is supported per namespace. */ + namespace?: AnyURI; + /** The transport addresses where the service can be reached. The scheme and IP part shall match the one used in the request (i.e. the GetServices request). */ + XAddr?: AnyURI; + capabilities?: Capabilities; + /** The version of the service (not the ONVIF core spec version). */ + version?: OnvifVersion; +} +export interface DeviceServiceCapabilities { + /** Network capabilities. */ + network?: NetworkCapabilities; + /** Security capabilities. */ + security?: SecurityCapabilities; + /** System capabilities. */ + system?: SystemCapabilities; + /** Capabilities that do not fit in any of the other categories. */ + misc?: MiscCapabilities; +} +export interface NetworkCapabilities { + /** Indicates support for IP filtering. */ + IPFilter?: boolean; + /** Indicates support for zeroconf. */ + zeroConfiguration?: boolean; + /** Indicates support for IPv6. */ + IPVersion6?: boolean; + /** Indicates support for dynamic DNS configuration. */ + dynDNS?: boolean; + /** Indicates support for IEEE 802.11 configuration. */ + dot11Configuration?: boolean; + /** Indicates the maximum number of Dot1X configurations supported by the device */ + dot1XConfigurations?: number; + /** Indicates support for retrieval of hostname from DHCP. */ + hostnameFromDHCP?: boolean; + /** Maximum number of NTP servers supported by the devices SetNTP command. */ + NTP?: number; + /** Indicates support for Stateful IPv6 DHCP. */ + DHCPv6?: boolean; +} +export interface SecurityCapabilities { + /** Indicates support for TLS 1.0. */ + 'TLS1.0'?: boolean; + /** Indicates support for TLS 1.1. */ + 'TLS1.1'?: boolean; + /** Indicates support for TLS 1.2. */ + 'TLS1.2'?: boolean; + /** Indicates support for onboard key generation. */ + onboardKeyGeneration?: boolean; + /** Indicates support for access policy configuration. */ + accessPolicyConfig?: boolean; + /** Indicates support for the ONVIF default access policy. */ + defaultAccessPolicy?: boolean; + /** Indicates support for IEEE 802.1X configuration. */ + dot1X?: boolean; + /** Indicates support for remote user configuration. Used when accessing another device. */ + remoteUserHandling?: boolean; + /** Indicates support for WS-Security X.509 token. */ + 'X.509Token'?: boolean; + /** Indicates support for WS-Security SAML token. */ + SAMLToken?: boolean; + /** Indicates support for WS-Security Kerberos token. */ + kerberosToken?: boolean; + /** Indicates support for WS-Security Username token. */ + usernameToken?: boolean; + /** Indicates support for WS over HTTP digest authenticated communication layer. */ + httpDigest?: boolean; + /** Indicates support for WS-Security REL token. */ + RELToken?: boolean; + /** Indicates support for JWT-based authentication with WS-Security Binary Security token. */ + jsonWebToken?: boolean; + /** EAP Methods supported by the device. The int values refer to the IANA EAP Registry. */ + supportedEAPMethods?: IntList; + /** The maximum number of users that the device supports. */ + maxUsers?: number; + /** Maximum number of characters supported for the username by CreateUsers. */ + maxUserNameLength?: number; + /** Maximum number of characters supported for the password by CreateUsers and SetUser. */ + maxPasswordLength?: number; + /** Indicates which security policies are supported. Options are: ModifyPassword, PasswordComplexity, AuthFailureWarnings */ + securityPolicies?: StringList; + /** Maximum number of passwords that the device can remember for each user */ + maxPasswordHistory?: number; + /** Supported hashing algorithms as part of HTTP and RTSP Digest authentication.Example: MD5,SHA-256 */ + hashingAlgorithms?: StringList; +} +export interface SystemCapabilities { + /** Indicates support for WS Discovery resolve requests. */ + discoveryResolve?: boolean; + /** Indicates support for WS-Discovery Bye. */ + discoveryBye?: boolean; + /** Indicates support for remote discovery. */ + remoteDiscovery?: boolean; + /** Indicates support for system backup through MTOM. */ + systemBackup?: boolean; + /** Indicates support for retrieval of system logging through MTOM. */ + systemLogging?: boolean; + /** Indicates support for firmware upgrade through MTOM. */ + firmwareUpgrade?: boolean; + /** Indicates support for firmware upgrade through HTTP. */ + httpFirmwareUpgrade?: boolean; + /** Indicates support for system backup through HTTP. */ + httpSystemBackup?: boolean; + /** Indicates support for retrieval of system logging through HTTP. */ + httpSystemLogging?: boolean; + /** Indicates support for retrieving support information through HTTP. */ + httpSupportInformation?: boolean; + /** Indicates support for storage configuration interfaces. */ + storageConfiguration?: boolean; + /** Indicates maximum number of storage configurations supported. */ + maxStorageConfigurations?: number; + /** If present signals support for geo location. The value signals the supported number of entries. */ + geoLocationEntries?: number; + /** List of supported automatic GeoLocation adjustment supported by the device. Valid items are defined by tds:AutoGeoMode. */ + autoGeo?: StringAttrList; + /** Enumerates the supported StorageTypes, see tds:StorageType. */ + storageTypesSupported?: StringAttrList; + /** Indicates no support for network discovery. */ + discoveryNotSupported?: boolean; + /** Indicates no support for network configuration. */ + networkConfigNotSupported?: boolean; + /** Indicates no support for user configuration. */ + userConfigNotSupported?: boolean; + /** List of supported Addons by the device. */ + addons?: StringAttrList; +} +export interface MiscCapabilities { + /** Lists of commands supported by SendAuxiliaryCommand. */ + auxiliaryCommands?: StringAttrList; +} +export interface Extension {} +export interface UserCredential { + /** User name */ + userName?: string; + /** optional password */ + password?: string; + extension?: Extension; +} +export interface StorageConfigurationData { + /** tds:StorageType lists the acceptable values for type attribute */ + type: string; + /** Optional region of the storage server */ + region?: string; + /** Local path */ + localPath?: AnyURI; + /** Storage server address */ + storageUri?: AnyURI; + /** User credential for the storage server */ + user?: UserCredential; + extension?: Extension; +} +export interface StorageConfiguration extends DeviceEntity { + data?: StorageConfigurationData; +} +export interface GetServices { + /** Indicates if the service capabilities (untyped) should be included in the response. */ + includeCapability?: boolean; +} +export interface GetServicesResponse { + /** Each Service element contains information about one service. */ + service?: Service[]; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the device service is returned in the Capabilities element. */ + capabilities?: DeviceServiceCapabilities; +} +export interface GetDeviceInformation {} +export interface GetDeviceInformationResponse { + /** The manufactor of the device. */ + manufacturer?: string; + /** The device model. */ + model?: string; + /** The firmware version in the device. */ + firmwareVersion?: string; + /** The serial number of the device. */ + serialNumber?: string; + /** The hardware ID of the device. */ + hardwareId?: string; +} +export interface SetSystemDateAndTime { + /** Defines if the date and time is set via NTP or manually. */ + dateTimeType?: SetDateTimeType; + /** Automatically adjust Daylight savings if defined in TimeZone. */ + daylightSavings?: boolean; + /** The time zone in POSIX 1003.1 format */ + timeZone?: TimeZone; + /** Date and time in UTC. If time is obtained via NTP, UTCDateTime has no meaning */ + UTCDateTime?: DateTime; +} +export interface SetSystemDateAndTimeResponse {} +export interface GetSystemDateAndTime {} +export interface GetSystemDateAndTimeResponse { + /** Contains information whether system date and time are set manually or by NTP, daylight savings is on or off, time zone in POSIX 1003.1 format and system date and time in UTC and also local system date and time. */ + systemDateAndTime?: SystemDateTime; +} +export interface SetSystemFactoryDefault { + /** Specifies the factory default action type. */ + factoryDefault?: FactoryDefaultType; +} +export interface SetSystemFactoryDefaultResponse {} +export interface UpgradeSystemFirmware { + firmware?: AttachmentData; +} +export interface UpgradeSystemFirmwareResponse { + message?: string; +} +export interface SystemReboot {} +export interface SystemRebootResponse { + /** Contains the reboot message sent by the device. */ + message?: string; +} +export interface RestoreSystem { + backupFiles?: BackupFile[]; +} +export interface RestoreSystemResponse {} +export interface GetSystemBackup {} +export interface GetSystemBackupResponse { + backupFiles?: BackupFile[]; +} +export interface GetSystemSupportInformation {} +export interface GetSystemSupportInformationResponse { + /** Contains the arbitary device diagnostics information. */ + supportInformation?: SupportInformation; +} +export interface GetSystemLog { + /** Specifies the type of system log to get. */ + logType?: SystemLogType; +} +export interface GetSystemLogResponse { + /** Contains the system log information. */ + systemLog?: SystemLog; +} +export interface GetScopes {} +export interface GetScopesResponse { + /** Contains a list of URI definining the device scopes. Scope parameters can be of two types: fixed and configurable. Fixed parameters can not be altered. */ + scopes?: Scope[]; +} +export interface SetScopes { + /** Contains a list of scope parameters that will replace all existing configurable scope parameters. */ + scopes?: AnyURI[]; +} +export interface SetScopesResponse {} +export interface AddScopes { + /** Contains a list of new configurable scope parameters that will be added to the existing configurable scope. */ + scopeItem?: AnyURI[]; +} +export interface AddScopesResponse {} +export interface RemoveScopes { + /** + * Contains a list of URIs that should be removed from the device scope. + * Note that the response message always will match the request or an error will be returned. The use of the response is for that reason deprecated. + */ + scopeItem?: AnyURI[]; +} +export interface RemoveScopesResponse { + /** Contains a list of URIs that has been removed from the device scope */ + scopeItem?: AnyURI[]; +} +export interface GetDiscoveryMode {} +export interface GetDiscoveryModeResponse { + /** Indicator of discovery mode: Discoverable, NonDiscoverable. */ + discoveryMode?: DiscoveryMode; +} +export interface SetDiscoveryMode { + /** Indicator of discovery mode: Discoverable, NonDiscoverable. */ + discoveryMode?: DiscoveryMode; +} +export interface SetDiscoveryModeResponse {} +export interface GetRemoteDiscoveryMode {} +export interface GetRemoteDiscoveryModeResponse { + /** Indicator of discovery mode: Discoverable, NonDiscoverable. */ + remoteDiscoveryMode?: DiscoveryMode; +} +export interface SetRemoteDiscoveryMode { + /** Indicator of discovery mode: Discoverable, NonDiscoverable. */ + remoteDiscoveryMode?: DiscoveryMode; +} +export interface SetRemoteDiscoveryModeResponse {} +export interface GetDPAddresses {} +export interface GetDPAddressesResponse { + DPAddress?: NetworkHost[]; +} +export interface SetDPAddresses { + DPAddress?: NetworkHost[]; +} +export interface SetDPAddressesResponse {} +export interface GetEndpointReference {} +export interface GetEndpointReferenceResponse { + GUID?: string; +} +export interface GetRemoteUser {} +export interface GetRemoteUserResponse { + remoteUser?: RemoteUser; +} +export interface SetRemoteUser { + remoteUser?: RemoteUser; +} +export interface SetRemoteUserResponse {} +export interface GetUsers {} +export interface GetUsersResponse { + /** Contains a list of the onvif users and following information is included in each entry: username and user level. */ + user?: User[]; +} +export interface CreateUsers { + /** Creates new device users and corresponding credentials. Each user entry includes: username, password and user level. Either all users are created successfully or a fault message MUST be returned without creating any user. If trying to create several users with exactly the same username the request is rejected and no users are created. If password is missing, then fault message Too weak password is returned. */ + user?: User[]; +} +export interface CreateUsersResponse {} +export interface DeleteUsers { + /** Deletes users on an device and there may exist users that cannot be deleted to ensure access to the unit. Either all users are deleted successfully or a fault message MUST be returned and no users be deleted. If a username exists multiple times in the request, then a fault message is returned. */ + username?: string[]; +} +export interface DeleteUsersResponse {} +export interface SetUser { + /** Updates the credentials for one or several users on an device. Either all change requests are processed successfully or a fault message MUST be returned. If the request contains the same username multiple times, a fault message is returned. */ + user?: User[]; +} +export interface SetUserResponse {} +export interface GetWsdlUrl {} +export interface GetWsdlUrlResponse { + wsdlUrl?: AnyURI; +} +export interface GetPasswordComplexityOptions {} +export interface GetPasswordComplexityOptionsResponse { + minLenRange?: IntRange; + uppercaseRange?: IntRange; + numberRange?: IntRange; + specialCharsRange?: IntRange; + blockUsernameOccurrenceSupported?: boolean; + policyConfigurationLockSupported?: boolean; +} +export interface GetPasswordComplexityConfiguration {} +export interface GetPasswordComplexityConfigurationResponse { + minLen?: number; + uppercase?: number; + number?: number; + specialChars?: number; + blockUsernameOccurrence?: boolean; + policyConfigurationLocked?: boolean; +} +export interface SetPasswordComplexityConfiguration { + minLen?: number; + uppercase?: number; + number?: number; + specialChars?: number; + blockUsernameOccurrence?: boolean; + policyConfigurationLocked?: boolean; +} +export interface SetPasswordComplexityConfigurationResponse {} +export interface GetPasswordHistoryConfiguration {} +export interface GetPasswordHistoryConfigurationResponse { + enabled?: boolean; + length?: number; +} +export interface SetPasswordHistoryConfiguration { + enabled?: boolean; + length?: number; +} +export interface SetPasswordHistoryConfigurationResponse {} +export interface GetAuthFailureWarningOptions {} +export interface GetAuthFailureWarningOptionsResponse { + monitorPeriodRange?: IntRange; + authFailureRange?: IntRange; +} +export interface GetAuthFailureWarningConfiguration {} +export interface GetAuthFailureWarningConfigurationResponse { + enabled?: boolean; + monitorPeriod?: number; + maxAuthFailures?: number; +} +export interface SetAuthFailureWarningConfiguration { + enabled?: boolean; + monitorPeriod?: number; + maxAuthFailures?: number; +} +export interface SetAuthFailureWarningConfigurationResponse {} +export interface GetCapabilities { + /** List of categories to retrieve capability information on. */ + category?: CapabilityCategory[]; +} +export interface GetCapabilitiesResponse { + /** Capability information. */ + capabilities?: Capabilities; +} +export interface GetHostname {} +export interface GetHostnameResponse { + /** Contains the hostname information. */ + hostnameInformation?: HostnameInformation; +} +export interface SetHostname { + /** The hostname to set. */ + name?: string; +} +export interface SetHostnameResponse {} +export interface SetHostnameFromDHCP { + /** True if the hostname shall be obtained via DHCP. */ + fromDHCP?: boolean; +} +export interface SetHostnameFromDHCPResponse { + /** Indicates whether or not a reboot is required after configuration updates. */ + rebootNeeded?: boolean; +} +export interface GetDNS {} +export interface GetDNSResponse { + /** DNS information. */ + DNSInformation?: DNSInformation; +} +export interface SetDNS { + /** Indicate if the DNS address is to be retrieved using DHCP. */ + fromDHCP?: boolean; + /** DNS search domain. */ + searchDomain?: string[]; + /** DNS address(es) set manually. */ + DNSManual?: IPAddress[]; +} +export interface SetDNSResponse {} +export interface GetNTP {} +export interface GetNTPResponse { + /** NTP information. */ + NTPInformation?: NTPInformation; +} +export interface SetNTP { + /** Indicate if NTP address information is to be retrieved using DHCP. */ + fromDHCP?: boolean; + /** Manual NTP settings. */ + NTPManual?: NetworkHost[]; +} +export interface SetNTPResponse {} +export interface GetDynamicDNS {} +export interface GetDynamicDNSResponse { + /** Dynamic DNS information. */ + dynamicDNSInformation?: DynamicDNSInformation; +} +export interface SetDynamicDNS { + /** Dynamic DNS type. */ + type?: DynamicDNSType; + /** DNS name. */ + name?: DNSName; + /** DNS record time to live. */ + TTL?: any; +} +export interface SetDynamicDNSResponse {} +export interface GetNetworkInterfaces {} +export interface GetNetworkInterfacesResponse { + /** List of network interfaces. */ + networkInterfaces?: NetworkInterface[]; +} +export interface SetNetworkInterfaces { + /** Symbolic network interface name. */ + interfaceToken?: ReferenceToken; + /** Network interface name. */ + networkInterface?: NetworkInterfaceSetConfiguration; +} +export interface SetNetworkInterfacesResponse { + /** + * Indicates whether or not a reboot is required after configuration updates. + * If a device responds with RebootNeeded set to false, the device can be reached + * via the new IP address without further action. A client should be aware that a device + * may not be responsive for a short period of time until it signals availability at + * the new address via the discovery Hello messages. + * If a device responds with RebootNeeded set to true, it will be further available under + * its previous IP address. The settings will only be activated when the device is + * rebooted via the SystemReboot command. + */ + rebootNeeded?: boolean; +} +export interface GetNetworkProtocols {} +export interface GetNetworkProtocolsResponse { + /** Contains an array of defined protocols supported by the device. There are three protocols defined; HTTP, HTTPS and RTSP. The following parameters can be retrieved for each protocol: port and enable/disable. */ + networkProtocols?: NetworkProtocol[]; +} +export interface SetNetworkProtocols { + /** Configures one or more defined network protocols supported by the device. There are currently three protocols defined; HTTP, HTTPS and RTSP. The following parameters can be set for each protocol: port and enable/disable. */ + networkProtocols?: NetworkProtocol[]; +} +export interface SetNetworkProtocolsResponse {} +export interface GetNetworkDefaultGateway {} +export interface GetNetworkDefaultGatewayResponse { + /** Gets the default IPv4 and IPv6 gateway settings from the device. */ + networkGateway?: NetworkGateway; +} +export interface SetNetworkDefaultGateway { + /** Sets IPv4 gateway address used as default setting. */ + IPv4Address?: IPv4Address[]; + /** Sets IPv6 gateway address used as default setting. */ + IPv6Address?: IPv6Address[]; +} +export interface SetNetworkDefaultGatewayResponse {} +export interface GetZeroConfiguration {} +export interface GetZeroConfigurationResponse { + /** Contains the zero-configuration. */ + zeroConfiguration?: NetworkZeroConfiguration; +} +export interface SetZeroConfiguration { + /** Unique identifier referencing the physical interface. */ + interfaceToken?: ReferenceToken; + /** Specifies if the zero-configuration should be enabled or not. */ + enabled?: boolean; +} +export interface SetZeroConfigurationResponse {} +export interface GetIPAddressFilter {} +export interface GetIPAddressFilterResponse { + IPAddressFilter?: IPAddressFilter; +} +export interface SetIPAddressFilter { + IPAddressFilter?: IPAddressFilter; +} +export interface SetIPAddressFilterResponse {} +export interface AddIPAddressFilter { + IPAddressFilter?: IPAddressFilter; +} +export interface AddIPAddressFilterResponse {} +export interface RemoveIPAddressFilter { + IPAddressFilter?: IPAddressFilter; +} +export interface RemoveIPAddressFilterResponse {} +export interface GetAccessPolicy {} +export interface GetAccessPolicyResponse { + policyFile?: BinaryData; +} +export interface SetAccessPolicy { + policyFile?: BinaryData; +} +export interface SetAccessPolicyResponse {} +export interface CreateCertificate { + /** Certificate id. */ + certificateID?: string; + /** Identification of the entity associated with the public-key. */ + subject?: string; + /** Certificate validity start date. */ + validNotBefore?: Date; + /** Certificate expiry start date. */ + validNotAfter?: Date; +} +export interface CreateCertificateResponse { + /** base64 encoded DER representation of certificate. */ + nvtCertificate?: Certificate; +} +export interface GetCertificates {} +export interface GetCertificatesResponse { + /** Id and base64 encoded DER representation of all available certificates. */ + nvtCertificate?: Certificate[]; +} +export interface GetCertificatesStatus {} +export interface GetCertificatesStatusResponse { + /** Indicates if a certificate is used in an optional HTTPS configuration of the device. */ + certificateStatus?: CertificateStatus[]; +} +export interface SetCertificatesStatus { + /** Indicates if a certificate is to be used in an optional HTTPS configuration of the device. */ + certificateStatus?: CertificateStatus[]; +} +export interface SetCertificatesStatusResponse {} +export interface DeleteCertificates { + /** List of ids of certificates to delete. */ + certificateID?: string[]; +} +export interface DeleteCertificatesResponse {} +export interface GetPkcs10Request { + /** List of ids of certificates to delete. */ + certificateID?: string; + /** Relative Dinstinguished Name(RDN) CommonName(CN). */ + subject?: string; + /** Optional base64 encoded DER attributes. */ + attributes?: BinaryData; +} +export interface GetPkcs10RequestResponse { + /** base64 encoded DER representation of certificate. */ + pkcs10Request?: BinaryData; +} +export interface LoadCertificates { + /** Optional id and base64 encoded DER representation of certificate. */ + NVTCertificate?: Certificate[]; +} +export interface LoadCertificatesResponse {} +export interface GetClientCertificateMode {} +export interface GetClientCertificateModeResponse { + /** Indicates whether or not client certificates are required by device. */ + enabled?: boolean; +} +export interface SetClientCertificateMode { + /** Indicates whether or not client certificates are required by device. */ + enabled?: boolean; +} +export interface SetClientCertificateModeResponse {} +export interface GetCACertificates {} +export interface GetCACertificatesResponse { + CACertificate?: Certificate[]; +} +export interface LoadCertificateWithPrivateKey { + certificateWithPrivateKey?: CertificateWithPrivateKey[]; +} +export interface LoadCertificateWithPrivateKeyResponse {} +export interface GetCertificateInformation { + certificateID?: string; +} +export interface GetCertificateInformationResponse { + certificateInformation?: CertificateInformation; +} +export interface LoadCACertificates { + CACertificate?: Certificate[]; +} +export interface LoadCACertificatesResponse {} +export interface CreateDot1XConfiguration { + dot1XConfiguration?: Dot1XConfiguration; +} +export interface CreateDot1XConfigurationResponse {} +export interface SetDot1XConfiguration { + dot1XConfiguration?: Dot1XConfiguration; +} +export interface SetDot1XConfigurationResponse {} +export interface GetDot1XConfiguration { + dot1XConfigurationToken?: ReferenceToken; +} +export interface GetDot1XConfigurationResponse { + dot1XConfiguration?: Dot1XConfiguration; +} +export interface GetDot1XConfigurations {} +export interface GetDot1XConfigurationsResponse { + dot1XConfiguration?: Dot1XConfiguration[]; +} +export interface DeleteDot1XConfiguration { + dot1XConfigurationToken?: ReferenceToken[]; +} +export interface DeleteDot1XConfigurationResponse {} +export interface GetRelayOutputs {} +export interface GetRelayOutputsResponse { + relayOutputs?: RelayOutput[]; +} +export interface SetRelayOutputSettings { + relayOutputToken?: ReferenceToken; + properties?: RelayOutputSettings; +} +export interface SetRelayOutputSettingsResponse {} +export interface SetRelayOutputState { + relayOutputToken?: ReferenceToken; + logicalState?: RelayLogicalState; +} +export interface SetRelayOutputStateResponse {} +export interface SendAuxiliaryCommand { + auxiliaryCommand?: AuxiliaryData; +} +export interface SendAuxiliaryCommandResponse { + auxiliaryCommandResponse?: AuxiliaryData; +} +export interface GetDot11Capabilities {} +export interface GetDot11CapabilitiesResponse { + capabilities?: Dot11Capabilities; +} +export interface GetDot11Status { + interfaceToken?: ReferenceToken; +} +export interface GetDot11StatusResponse { + status?: Dot11Status; +} +export interface ScanAvailableDot11Networks { + interfaceToken?: ReferenceToken; +} +export interface ScanAvailableDot11NetworksResponse { + networks?: Dot11AvailableNetworks[]; +} +export interface GetSystemUris {} +export interface GetSystemUrisResponse { + systemLogUris?: SystemLogUriList; + supportInfoUri?: AnyURI; + systemBackupUri?: AnyURI; + extension?: Extension; +} +export interface StartFirmwareUpgrade {} +export interface StartFirmwareUpgradeResponse { + uploadUri?: AnyURI; + uploadDelay?: any; + expectedDownTime?: any; +} +export interface StartSystemRestore {} +export interface StartSystemRestoreResponse { + uploadUri?: AnyURI; + expectedDownTime?: any; +} +export interface SetHashingAlgorithm { + /** Hashing algorithm(s) used in HTTP and RTSP Digest Authentication. */ + algorithm?: StringList; +} +export interface SetHashingAlgorithmResponse {} +export interface GetStorageConfigurations {} +export interface GetStorageConfigurationsResponse { + storageConfigurations?: StorageConfiguration[]; +} +export interface CreateStorageConfiguration { + storageConfiguration?: StorageConfigurationData; +} +export interface CreateStorageConfigurationResponse { + token?: ReferenceToken; +} +export interface GetStorageConfiguration { + token?: ReferenceToken; +} +export interface GetStorageConfigurationResponse { + storageConfiguration?: StorageConfiguration; +} +export interface SetStorageConfiguration { + storageConfiguration?: StorageConfiguration; +} +export interface SetStorageConfigurationResponse {} +export interface DeleteStorageConfiguration { + token?: ReferenceToken; +} +export interface DeleteStorageConfigurationResponse {} +export interface GetGeoLocation {} +export interface GetGeoLocationResponse { + location?: LocationEntity[]; +} +export interface SetGeoLocation { + location?: LocationEntity[]; +} +export interface SetGeoLocationResponse {} +export interface DeleteGeoLocation { + location?: LocationEntity[]; +} +export interface DeleteGeoLocationResponse {} diff --git a/src/interfaces/display.ts b/src/interfaces/display.ts new file mode 100644 index 00000000..30a6823c --- /dev/null +++ b/src/interfaces/display.ts @@ -0,0 +1,77 @@ +import { ReferenceToken } from './common'; +import { Layout, LayoutOptions, CodingCapabilities, PaneConfiguration } from './onvif'; + +export interface GetLayout { + /** Token of the Video Output whose Layout is requested */ + videoOutput?: ReferenceToken; +} +export interface GetLayoutResponse { + /** Current layout of the video output. */ + layout?: Layout; +} +export interface SetLayout { + /** Token of the Video Output whose Layout shall be changed */ + videoOutput?: ReferenceToken; + /** Layout to be set */ + layout?: Layout; +} +export interface SetLayoutResponse {} +export interface GetDisplayOptions { + /** Token of the Video Output whose options are requested */ + videoOutput?: ReferenceToken; +} +export interface GetDisplayOptionsResponse { + /** + * The LayoutOptions describe the fixed and predefined layouts of a device. If the device does + * not offer fixed layouts and allows setting the layout free this element is empty. + */ + layoutOptions?: LayoutOptions; + /** decoding and encoding capabilities of the device */ + codingCapabilities?: CodingCapabilities; +} +export interface GetPaneConfigurations { + /** Reference Token of the Video Output whose Pane Configurations are requested */ + videoOutput?: ReferenceToken; +} +export interface GetPaneConfigurationsResponse { + /** Contains a list of defined Panes of the specified VideoOutput. Each VideoOutput has at least one PaneConfiguration. */ + paneConfiguration?: PaneConfiguration[]; +} +export interface GetPaneConfiguration { + /** Reference Token of the Video Output the requested pane belongs to */ + videoOutput?: ReferenceToken; + /** Reference Token of the Pane whose Configuration is requested */ + pane?: ReferenceToken; +} +export interface GetPaneConfigurationResponse { + /** returns the configuration of the requested pane. */ + paneConfiguration?: PaneConfiguration; +} +export interface SetPaneConfigurations { + /** Token of the video output whose panes to set. */ + videoOutput?: ReferenceToken; + /** Pane Configuration to be set. */ + paneConfiguration?: PaneConfiguration[]; +} +export interface SetPaneConfigurationsResponse {} +export interface SetPaneConfiguration { + /** Token of the video output whose panes to set. */ + videoOutput?: ReferenceToken; + /** Pane Configuration to be set. */ + paneConfiguration?: PaneConfiguration; +} +export interface SetPaneConfigurationResponse {} +export interface CreatePaneConfiguration { + /** Token of the video output where the pane shall be created. */ + videoOutput?: ReferenceToken; + /** Configuration of the pane to be created. */ + paneConfiguration?: PaneConfiguration; +} +export interface CreatePaneConfigurationResponse {} +export interface DeletePaneConfiguration { + /** Token of the video output where the pane shall be deleted. */ + videoOutput?: ReferenceToken; + /** Token of the pane to be deleted. */ + paneToken?: ReferenceToken; +} +export interface DeletePaneConfigurationResponse {} diff --git a/src/interfaces/doorcontrol.ts b/src/interfaces/doorcontrol.ts new file mode 100644 index 00000000..aa023446 --- /dev/null +++ b/src/interfaces/doorcontrol.ts @@ -0,0 +1,440 @@ +import { DataEntity } from './types'; +import { Name, Description } from './onvif'; +import { ReferenceToken } from './common'; + +/** The physical state of a Door. */ +export type DoorPhysicalState = 'Unknown' | 'Open' | 'Closed' | 'Fault'; +/** The physical state of a Lock (including Double Lock). */ +export type LockPhysicalState = 'Unknown' | 'Locked' | 'Unlocked' | 'Fault'; +/** Describes the state of a Door with regard to alarms. */ +export type DoorAlarmState = 'Normal' | 'DoorForcedOpen' | 'DoorOpenTooLong'; +/** Describes the state of a Tamper detector. */ +export type DoorTamperState = 'Unknown' | 'NotInTamper' | 'TamperDetected'; +/** Describes the state of a Door fault. */ +export type DoorFaultState = 'Unknown' | 'NotInFault' | 'FaultDetected'; +/** + * The DoorMode describe the mode of operation from a logical perspective. + * Setting a door mode reflects the intent to set a door in a physical state. + */ +export type DoorMode = + | 'Unknown' + | 'Locked' + | 'Unlocked' + | 'Accessed' + | 'Blocked' + | 'LockedDown' + | 'LockedOpen' + | 'DoubleLocked'; +/** + * ServiceCapabilities structure reflects optional functionality of a service. + * The information is static and does not change during device operation. + * The following capabilities are available: + */ +export interface ServiceCapabilities { + /** + * The maximum number of entries returned by a single Get<Entity>List or + * Get<Entity> request. The device shall never return more than this number of entities + * in a single response. + */ + maxLimit: number; + /** Indicates the maximum number of doors supported by the device. */ + maxDoors?: number; + /** + * Indicates that the client is allowed to supply the token when creating doors. + * To enable the use of the command SetDoor, the value must be set to true. + */ + clientSuppliedTokenSupported?: boolean; + /** + * Indicates that the client can perform CRUD operations (create, read, update and delete) + * on doors. To enable the use of the commands GetDoors, GetDoorList, CreateDoor, ModifyDoor + * and DeleteDoor, the value must be set to true. + */ + doorManagementSupported?: boolean; +} +/** Used as extension base. */ +export interface DoorInfoBase extends DataEntity { + /** A user readable name. It shall be up to 64 characters. */ + name?: Name; + /** A user readable description. It shall be up to 1024 characters. */ + description?: Description; +} +/** + * The DoorInfo type represents the Door as a physical object. + * The structure contains information and capabilities of a specific door instance. + * An ONVIF compliant device shall provide the following fields for each Door instance: + */ +export interface DoorInfo extends DoorInfoBase { + /** The capabilities of the Door. */ + capabilities?: DoorCapabilities; +} +/** + * The door structure shall include all properties of the DoorInfo structure and also a timings + * structure. + */ +export interface Door extends DoorInfoBase { + /** The capabilities of the Door. */ + capabilities?: DoorCapabilities; + /** + * The type of door. Is of type text. Can be either one of the following reserved + * ONVIF types: "pt:Door", "pt:ManTrap", "pt:Turnstile", "pt:RevolvingDoor", + * "pt:Barrier", or a custom defined type. + */ + doorType?: Name; + /** + * A structure defining times such as how long the door is unlocked when + * accessed, extended grant time, etc. + */ + timings?: Timings; + extension?: DoorExtension; +} +export interface DoorExtension {} +/** + * A structure defining times such as how long the door is unlocked when accessed, + * extended grant time, etc. + */ +export interface Timings { + /** + * When access is granted (door mode becomes Accessed), the latch is unlocked. + * ReleaseTime is the time from when the latch is unlocked until it is + * relocked again (unless the door is physically opened). + */ + releaseTime?: any; + /** + * The time from when the door is physically opened until the door is set in the + * DoorOpenTooLong alarm state. + */ + openTime?: any; + /** + * Some individuals need extra time to open the door before the latch relocks. + * If supported, ExtendedReleaseTime shall be added to ReleaseTime if UseExtendedTime + * is set to true in the AccessDoor command. + */ + extendedReleaseTime?: any; + /** + * If the door is physically opened after access is granted, + * then DelayTimeBeforeRelock is the time from when the door is physically + * opened until the latch goes back to locked state. + */ + delayTimeBeforeRelock?: any; + /** + * Some individuals need extra time to pass through the door. If supported, + * ExtendedOpenTime shall be added to OpenTime if UseExtendedTime is set to true + * in the AccessDoor command. + */ + extendedOpenTime?: any; + /** + * Before a DoorOpenTooLong alarm state is generated, a signal will sound to indicate + * that the door must be closed. PreAlarmTime defines how long before DoorOpenTooLong + * the warning signal shall sound. + */ + preAlarmTime?: any; + extension?: TimingsExtension; +} +export interface TimingsExtension {} +/** + * DoorCapabilities reflect optional functionality of a particular physical entity. + * Different door instances may have different set of capabilities. + * This information may change during device operation, e.g. if hardware settings are changed. + * The following capabilities are available: + */ +export interface DoorCapabilities { + /** + * Indicates whether or not this Door instance supports AccessDoor command to + * perform momentary access. + */ + access?: boolean; + /** + * Indicates that this Door instance supports overriding configured timing in the + * AccessDoor command. + */ + accessTimingOverride?: boolean; + /** + * Indicates that this Door instance supports LockDoor command to lock the + * door. + */ + lock?: boolean; + /** + * Indicates that this Door instance supports UnlockDoor command to unlock the + * door. + */ + unlock?: boolean; + /** + * Indicates that this Door instance supports BlockDoor command to block the + * door. + */ + block?: boolean; + /** + * Indicates that this Door instance supports DoubleLockDoor command to lock + * multiple locks on the door. + */ + doubleLock?: boolean; + /** + * Indicates that this Door instance supports LockDown (and LockDownRelease) + * commands to lock the door and put it in LockedDown mode. + */ + lockDown?: boolean; + /** + * Indicates that this Door instance supports LockOpen (and LockOpenRelease) + * commands to unlock the door and put it in LockedOpen mode. + */ + lockOpen?: boolean; + /** + * Indicates that this Door instance has a DoorMonitor and supports the + * DoorPhysicalState event. + */ + doorMonitor?: boolean; + /** + * Indicates that this Door instance has a LockMonitor and supports the + * LockPhysicalState event. + */ + lockMonitor?: boolean; + /** + * Indicates that this Door instance has a DoubleLockMonitor and supports the + * DoubleLockPhysicalState event. + */ + doubleLockMonitor?: boolean; + /** + * Indicates that this Door instance supports door alarm and the DoorAlarm + * event. + */ + alarm?: boolean; + /** + * Indicates that this Door instance has a Tamper detector and supports the + * DoorTamper event. + */ + tamper?: boolean; + /** + * Indicates that this Door instance supports door fault and the DoorFault + * event. + */ + fault?: boolean; +} +/** The DoorState structure contains current aggregate runtime status of Door. */ +export interface DoorState { + /** + * Physical state of the Door; it is of type DoorPhysicalState. A device that + * signals support for DoorMonitor capability for a particular door instance shall provide + * this field. + */ + doorPhysicalState?: DoorPhysicalState; + /** + * Physical state of the Lock; it is of type LockPhysicalState. A device that + * signals support for LockMonitor capability for a particular door instance shall provide + * this field. + */ + lockPhysicalState?: LockPhysicalState; + /** + * Physical state of the DoubleLock; it is of type LockPhysicalState. A + * device that signals support for DoubleLockMonitor capability for a particular door + * instance shall provide this field. + */ + doubleLockPhysicalState?: LockPhysicalState; + /** + * Alarm state of the door; it is of type DoorAlarmState. A device that + * signals support for Alarm capability for a particular door instance shall provide this + * field. + */ + alarm?: DoorAlarmState; + /** + * Tampering state of the door; it is of type DoorTamper. A device that + * signals support for Tamper capability for a particular door instance shall provide this + * field. + */ + tamper?: DoorTamper; + /** + * Fault information for door; it is of type DoorFault. A device that signals + * support for Fault capability for a particular door instance shall provide this field. + */ + fault?: DoorFault; + /** + * The logical operating mode of the door; it is of type DoorMode. An ONVIF + * compatible device shall report current operating mode in this field. + */ + doorMode?: DoorMode; +} +/** Tampering information for a Door. */ +export interface DoorTamper { + /** + * Optional field; Details describing tampering state change (e.g., reason, + * place and time). + * NOTE: All fields (including this one) which are designed to give + * end-user prompts can be localized to the customer's native language. + */ + reason?: string; + /** State of the tamper detector; it is of type DoorTamperState. */ + state?: DoorTamperState; +} +/** + * Fault information for a Door. + * This can be extended with optional attributes in the future. + */ +export interface DoorFault { + /** Optional reason for fault. */ + reason?: string; + /** + * Overall fault state for the door; it is of type DoorFaultState. If there + * are any faults, the value shall be: FaultDetected. Details of the detected fault shall + * be found in the Reason field, and/or the various DoorState fields and/or in extensions + * to this structure. + */ + state?: DoorFaultState; +} +/** Extension for the AccessDoor command. */ +export interface AccessDoorExtension {} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** + * The capability response message contains the requested DoorControl + * service capabilities using a hierarchical XML capability structure. + */ + capabilities?: ServiceCapabilities; +} +export interface GetDoorInfoList { + /** + * Maximum number of entries to return. If Limit is omitted or if the + * value of Limit is higher than what the device supports, then the device shall + * return its maximum amount of entries. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetDoorInfoListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of DoorInfo items. */ + doorInfo?: DoorInfo[]; +} +export interface GetDoorInfo { + /** Tokens of DoorInfo items to get. */ + token?: ReferenceToken[]; +} +export interface GetDoorInfoResponse { + /** List of DoorInfo items. */ + doorInfo?: DoorInfo[]; +} +export interface GetDoorList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is determined by the + * device. + */ + limit?: number; + /** + * Start returning entries from this start reference. If not specified, + * entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetDoorListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of Door items. */ + door?: Door[]; +} +export interface GetDoors { + /** Tokens of Door items to get. */ + token?: ReferenceToken[]; +} +export interface GetDoorsResponse { + /** List of Door items. */ + door?: Door[]; +} +export interface CreateDoor { + /** Door item to create */ + door?: Door; +} +export interface CreateDoorResponse { + /** Token of created Door item */ + token?: ReferenceToken; +} +export interface SetDoor { + /** The Door item to create or modify */ + door?: Door; +} +export interface SetDoorResponse {} +export interface ModifyDoor { + /** The details of the door */ + door?: Door; +} +export interface ModifyDoorResponse {} +export interface DeleteDoor { + /** The Token of the door to delete. */ + token?: ReferenceToken; +} +export interface DeleteDoorResponse {} +export interface GetDoorState { + /** Token of the Door instance to get the state for. */ + token?: ReferenceToken; +} +export interface GetDoorStateResponse { + /** The state of the door. */ + doorState?: DoorState; +} +export interface AccessDoor { + /** Token of the Door instance to control. */ + token?: ReferenceToken; + /** + * Optional - Indicates that the configured extended time should be + * used. + */ + useExtendedTime?: boolean; + /** Optional - overrides ReleaseTime if specified. */ + accessTime?: any; + /** Optional - overrides OpenTime if specified. */ + openTooLongTime?: any; + /** Optional - overrides PreAlarmTime if specified. */ + preAlarmTime?: any; + /** Future extension. */ + extension?: AccessDoorExtension; +} +export interface AccessDoorResponse {} +export interface LockDoor { + /** Token of the Door instance to control. */ + token?: ReferenceToken; +} +export interface LockDoorResponse {} +export interface UnlockDoor { + /** Token of the Door instance to control. */ + token?: ReferenceToken; +} +export interface UnlockDoorResponse {} +export interface BlockDoor { + /** Token of the Door instance to control. */ + token?: ReferenceToken; +} +export interface BlockDoorResponse {} +export interface LockDownDoor { + /** Token of the Door instance to control. */ + token?: ReferenceToken; +} +export interface LockDownDoorResponse {} +export interface LockDownReleaseDoor { + /** Token of the Door instance to control. */ + token?: ReferenceToken; +} +export interface LockDownReleaseDoorResponse {} +export interface LockOpenDoor { + /** Token of the Door instance to control. */ + token?: ReferenceToken; +} +export interface LockOpenDoorResponse {} +export interface LockOpenReleaseDoor { + /** Token of the Door instance to control. */ + token?: ReferenceToken; +} +export interface LockOpenReleaseDoorResponse {} +export interface DoubleLockDoor { + /** Token of the Door instance to control. */ + token?: ReferenceToken; +} +export interface DoubleLockDoorResponse {} diff --git a/src/interfaces/event-vs.ts b/src/interfaces/event-vs.ts new file mode 100644 index 00000000..24506fc9 --- /dev/null +++ b/src/interfaces/event-vs.ts @@ -0,0 +1,149 @@ +import { AnyURI } from './basics'; +import { Date } from './onvif'; + +export type EventBrokerProtocol = 'mqtt' | 'mqtts' | 'ws' | 'wss'; +export type ConnectionStatus = 'Offline' | 'Connecting' | 'Connected'; +export interface Capabilities { + /** Indicates that the WS Subscription policy is supported. */ + WSSubscriptionPolicySupport?: boolean; + /** Indicates that the WS Pull Point is supported. */ + WSPullPointSupport?: boolean; + /** Indicates that the WS Pausable Subscription Manager Interface is supported. */ + WSPausableSubscriptionManagerInterfaceSupport?: boolean; + /** Maximum number of supported notification producers as defined by WS-BaseNotification. */ + maxNotificationProducers?: number; + /** Maximum supported number of notification pull points. */ + maxPullPoints?: number; + /** Indication if the device supports persistent notification storage. */ + persistentNotificationStorage?: boolean; + /** A space separated list of supported event broker protocols as defined by the tev:EventBrokerProtocol datatype. */ + eventBrokerProtocols?: string; + /** Maxiumum number of event broker configurations that can be added to the device. */ + maxEventBrokers?: number; + /** Indicates that metadata streaming over MQTT is supported */ + metadataOverMQTT?: boolean; +} +export interface EventBrokerConfig { + /** Event broker address in the format "scheme://host:port[/resource]". The supported schemes shall be returned by the EventBrokerProtocols capability. The resource part of the URL is only valid when using websocket. The Address must be unique. */ + address?: AnyURI; + /** Prefix that will be prepended to all topics before they are published. This is used to make published topics unique for each device. TopicPrefix is not allowed to be empty. */ + topicPrefix?: string; + /** User name for the event broker. */ + userName?: string; + /** Password for the event broker. Password shall not be included when returned with GetEventBrokers. */ + password?: string; + /** Optional certificate ID in the key store pointing to a client certificate to be used for authenticating the device at the message broker. */ + certificateID?: string; + /** Concrete Topic Expression to select specific event topics to publish. */ + publishFilter?: any; + /** Quality of service level to use when publishing. This defines the guarantee of delivery for a specific message: 0 = At most once, 1 = At least once, 2 = Exactly once. */ + qoS?: number; + /** Current connection status (see tev:ConnectionStatus for possible values). */ + status?: string; + /** The ID of the certification path validation policy used to validate the broker certificate. In case encryption is used but no validation policy is specified, the device shall not validate the broker certificate. */ + certPathValidationPolicyID?: string; + /** Concrete Topic Expression to select specific metadata topics to publish. */ + metadataFilter?: any; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the event service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface SubscriptionPolicy {} +export interface CreatePullPointSubscription { + /** Optional XPATH expression to select specific topics. */ + filter?: any; + /** Initial termination time. */ + initialTerminationTime?: any; + /** Refer to Web Services Base Notification 1.3 (WS-BaseNotification). */ + subscriptionPolicy?: SubscriptionPolicy; +} +export interface CreatePullPointSubscriptionResponse { + /** Endpoint reference of the subscription to be used for pulling the messages. */ + subscriptionReference?: any; + /** Current time of the server for synchronization purposes. */ + urrentTime?: any; + /** Date time when the PullPoint will be shut down without further pull requests. */ + erminationTime?: any; +} +export interface PullMessages { + /** Maximum time to block until this method returns. */ + timeout?: any; + /** Upper limit for the number of messages to return at once. A server implementation may decide to return less messages. */ + messageLimit?: number; +} +export interface PullMessagesResponse { + /** The date and time when the messages have been delivered by the web server to the client. */ + currentTime?: Date; + /** Date time when the PullPoint will be shut down without further pull requests. */ + terminationTime?: Date; + /** List of messages. This list shall be empty in case of a timeout. */ + otificationMessage?: any[]; +} +export interface PullMessagesFaultResponse { + /** Maximum timeout supported by the device. */ + maxTimeout?: any; + /** Maximum message limit supported by the device. */ + maxMessageLimit?: number; +} +export interface Seek { + /** The date and time to match against stored messages. */ + utcTime?: Date; + /** Reverse the pull direction of PullMessages. */ + reverse?: boolean; +} +export interface SeekResponse {} +export interface SetSynchronizationPoint {} +export interface SetSynchronizationPointResponse {} +export interface GetEventProperties {} +export interface GetEventPropertiesResponse { + /** List of topic namespaces supported. */ + topicNamespaceLocation?: AnyURI[]; + /** True when topicset is fixed for all times. */ + ixedTopicSet?: any; + /** Set of topics supported. */ + topicSet?: any; + /** + * Defines the XPath expression syntax supported for matching topic expressions. + * The following TopicExpressionDialects are mandatory for an ONVIF compliant device : + * + * http://docs.oasis-open.org/wsn/t-1/TopicExpression/Concrete + * http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet. + * + */ + opicExpressionDialect?: any[]; + /** + * Defines the XPath function set supported for message content filtering. + * The following MessageContentFilterDialects should be returned if a device supports the message content filtering: + * + * http://www.onvif.org/ver10/tev/messageContentFilter/ItemFilter. + * + * A device that does not support any MessageContentFilterDialect returns a single empty url. + */ + messageContentFilterDialect?: AnyURI[]; + /** Optional ProducerPropertiesDialects. Refer to Web Services Base Notification 1.3 (WS-BaseNotification) for advanced filtering. */ + producerPropertiesFilterDialect?: AnyURI[]; + /** + * The Message Content Description Language allows referencing + * of vendor-specific types. In order to ease the integration of such types into a client application, + * the GetEventPropertiesResponse shall list all URI locations to schema files whose types are + * used in the description of notifications, with MessageContentSchemaLocation elements. + * This list shall at least contain the URI of the ONVIF schema file. + */ + messageContentSchemaLocation?: AnyURI[]; +} +export interface AddEventBroker { + eventBroker?: EventBrokerConfig; +} +export interface AddEventBrokerResponse {} +export interface DeleteEventBroker { + address?: AnyURI; +} +export interface DeleteEventBrokerResponse {} +export interface GetEventBrokers { + address?: AnyURI; +} +export interface GetEventBrokersResponse { + eventBroker?: EventBrokerConfig[]; +} diff --git a/src/interfaces/event.ts b/src/interfaces/event.ts new file mode 100644 index 00000000..24506fc9 --- /dev/null +++ b/src/interfaces/event.ts @@ -0,0 +1,149 @@ +import { AnyURI } from './basics'; +import { Date } from './onvif'; + +export type EventBrokerProtocol = 'mqtt' | 'mqtts' | 'ws' | 'wss'; +export type ConnectionStatus = 'Offline' | 'Connecting' | 'Connected'; +export interface Capabilities { + /** Indicates that the WS Subscription policy is supported. */ + WSSubscriptionPolicySupport?: boolean; + /** Indicates that the WS Pull Point is supported. */ + WSPullPointSupport?: boolean; + /** Indicates that the WS Pausable Subscription Manager Interface is supported. */ + WSPausableSubscriptionManagerInterfaceSupport?: boolean; + /** Maximum number of supported notification producers as defined by WS-BaseNotification. */ + maxNotificationProducers?: number; + /** Maximum supported number of notification pull points. */ + maxPullPoints?: number; + /** Indication if the device supports persistent notification storage. */ + persistentNotificationStorage?: boolean; + /** A space separated list of supported event broker protocols as defined by the tev:EventBrokerProtocol datatype. */ + eventBrokerProtocols?: string; + /** Maxiumum number of event broker configurations that can be added to the device. */ + maxEventBrokers?: number; + /** Indicates that metadata streaming over MQTT is supported */ + metadataOverMQTT?: boolean; +} +export interface EventBrokerConfig { + /** Event broker address in the format "scheme://host:port[/resource]". The supported schemes shall be returned by the EventBrokerProtocols capability. The resource part of the URL is only valid when using websocket. The Address must be unique. */ + address?: AnyURI; + /** Prefix that will be prepended to all topics before they are published. This is used to make published topics unique for each device. TopicPrefix is not allowed to be empty. */ + topicPrefix?: string; + /** User name for the event broker. */ + userName?: string; + /** Password for the event broker. Password shall not be included when returned with GetEventBrokers. */ + password?: string; + /** Optional certificate ID in the key store pointing to a client certificate to be used for authenticating the device at the message broker. */ + certificateID?: string; + /** Concrete Topic Expression to select specific event topics to publish. */ + publishFilter?: any; + /** Quality of service level to use when publishing. This defines the guarantee of delivery for a specific message: 0 = At most once, 1 = At least once, 2 = Exactly once. */ + qoS?: number; + /** Current connection status (see tev:ConnectionStatus for possible values). */ + status?: string; + /** The ID of the certification path validation policy used to validate the broker certificate. In case encryption is used but no validation policy is specified, the device shall not validate the broker certificate. */ + certPathValidationPolicyID?: string; + /** Concrete Topic Expression to select specific metadata topics to publish. */ + metadataFilter?: any; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the event service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface SubscriptionPolicy {} +export interface CreatePullPointSubscription { + /** Optional XPATH expression to select specific topics. */ + filter?: any; + /** Initial termination time. */ + initialTerminationTime?: any; + /** Refer to Web Services Base Notification 1.3 (WS-BaseNotification). */ + subscriptionPolicy?: SubscriptionPolicy; +} +export interface CreatePullPointSubscriptionResponse { + /** Endpoint reference of the subscription to be used for pulling the messages. */ + subscriptionReference?: any; + /** Current time of the server for synchronization purposes. */ + urrentTime?: any; + /** Date time when the PullPoint will be shut down without further pull requests. */ + erminationTime?: any; +} +export interface PullMessages { + /** Maximum time to block until this method returns. */ + timeout?: any; + /** Upper limit for the number of messages to return at once. A server implementation may decide to return less messages. */ + messageLimit?: number; +} +export interface PullMessagesResponse { + /** The date and time when the messages have been delivered by the web server to the client. */ + currentTime?: Date; + /** Date time when the PullPoint will be shut down without further pull requests. */ + terminationTime?: Date; + /** List of messages. This list shall be empty in case of a timeout. */ + otificationMessage?: any[]; +} +export interface PullMessagesFaultResponse { + /** Maximum timeout supported by the device. */ + maxTimeout?: any; + /** Maximum message limit supported by the device. */ + maxMessageLimit?: number; +} +export interface Seek { + /** The date and time to match against stored messages. */ + utcTime?: Date; + /** Reverse the pull direction of PullMessages. */ + reverse?: boolean; +} +export interface SeekResponse {} +export interface SetSynchronizationPoint {} +export interface SetSynchronizationPointResponse {} +export interface GetEventProperties {} +export interface GetEventPropertiesResponse { + /** List of topic namespaces supported. */ + topicNamespaceLocation?: AnyURI[]; + /** True when topicset is fixed for all times. */ + ixedTopicSet?: any; + /** Set of topics supported. */ + topicSet?: any; + /** + * Defines the XPath expression syntax supported for matching topic expressions. + * The following TopicExpressionDialects are mandatory for an ONVIF compliant device : + * + * http://docs.oasis-open.org/wsn/t-1/TopicExpression/Concrete + * http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet. + * + */ + opicExpressionDialect?: any[]; + /** + * Defines the XPath function set supported for message content filtering. + * The following MessageContentFilterDialects should be returned if a device supports the message content filtering: + * + * http://www.onvif.org/ver10/tev/messageContentFilter/ItemFilter. + * + * A device that does not support any MessageContentFilterDialect returns a single empty url. + */ + messageContentFilterDialect?: AnyURI[]; + /** Optional ProducerPropertiesDialects. Refer to Web Services Base Notification 1.3 (WS-BaseNotification) for advanced filtering. */ + producerPropertiesFilterDialect?: AnyURI[]; + /** + * The Message Content Description Language allows referencing + * of vendor-specific types. In order to ease the integration of such types into a client application, + * the GetEventPropertiesResponse shall list all URI locations to schema files whose types are + * used in the description of notifications, with MessageContentSchemaLocation elements. + * This list shall at least contain the URI of the ONVIF schema file. + */ + messageContentSchemaLocation?: AnyURI[]; +} +export interface AddEventBroker { + eventBroker?: EventBrokerConfig; +} +export interface AddEventBrokerResponse {} +export interface DeleteEventBroker { + address?: AnyURI; +} +export interface DeleteEventBrokerResponse {} +export interface GetEventBrokers { + address?: AnyURI; +} +export interface GetEventBrokersResponse { + eventBroker?: EventBrokerConfig[]; +} diff --git a/src/interfaces/federatedsearch.ts b/src/interfaces/federatedsearch.ts new file mode 100644 index 00000000..4ce62749 --- /dev/null +++ b/src/interfaces/federatedsearch.ts @@ -0,0 +1,82 @@ +import { AnyURI } from './basics'; + +/** Corresponds to SimpleTermType definition in ISO/IEC 15938-12 */ +export type SimpleTermType = AnyURI; +/** Corresponds to mimeType definition in ISO/IEC 15938-12 */ +export type mimeType = string; +export interface Capabilities {} +/** + * Contains features provided by a database, formatted according to + * presets defined in ISO/IEC 15938-12 + */ +export interface RegisterDatabase extends CapabilityType { + extension?: RegisterDatabaseExtension; +} +export interface RegisterDatabaseExtension {} +export interface CapabilityType { + supportedQFProfile?: TermType; + supportedMetadata?: AnyURI[]; + supportedExampleMediaTypes?: any; + supportedResultMediaTypes?: any; + supportedQueryTypes?: TermType[]; + supportedExpressions?: TermType[]; +} +/** Corresponds to TermType definition in ISO/IEC 15938-12 */ +export interface TermType { + href: SimpleTermType; + name?: string; + description?: string; + term?: TermType[]; +} +export interface GetServiceCapabilitiesResponse { + capabilities?: Capabilities; +} +export interface GetServiceFeatures { + /** + * Contains descriptions of desired services + * capabilities and may contain the ID for a particular service to + * be addressed. + */ + inputCapabilities?: any; +} +export interface GetServiceFeaturesResponse { + /** + * Contains a list of available service capability + * descriptions or a system message in case of an error. If no + * service is available or matches the given capabilities, then an + * empty Output element is returned. + */ + outputCapabilities?: any; +} +export interface Search { + /** + * Container for describing a query request + * containing a set of conditions and/or the specification of the + * structure and content of the output query format and a + * declaration part. + */ + inputQuery?: any; +} +export interface SearchResponse { + /** + * Container for all the results from a responder to + * a requester. It may contain in addition messages such as error + * and exception. + */ + outputQuery?: any; +} +export interface GetSearchResults { + /** + * Allows to request the results of a previous query + * issued. + */ + results?: any; +} +export interface GetSearchResultsResponse { + /** + * Describes a single result returned from a + * responder. + */ + resultItem?: any[]; +} +export interface RegisterDatabaseResponse {} diff --git a/src/interfaces/humanbody.2.ts b/src/interfaces/humanbody.2.ts new file mode 100644 index 00000000..7e64d398 --- /dev/null +++ b/src/interfaces/humanbody.2.ts @@ -0,0 +1,134 @@ +import { ColorDescriptor } from './common'; + +export type BodyShape = 'Fat' | 'Thin' | 'Other'; +export type TopsCategory = 'LongSleeve' | 'ShortSleeve' | 'Other'; +export type Grain = 'Stria' | 'Plaid' | 'PureColour' | 'Decal' | 'Other'; +export type TopsStyle = 'Tailor' | 'Jacket' | 'Sweater' | 'Overcoat' | 'Dress' | 'Other'; +export type BottomsCategory = 'Trousers' | 'Shorts' | 'Skirt' | 'Other'; +export type BottomsStyle = 'FornalPants' | 'Jeans' | 'Other'; +export type ShoesCategory = 'LeatherShoes' | 'Sneakers' | 'Sandal' | 'Slipper' | 'Other'; +export type KnapsackCategory = 'SingleShoulderBag' | 'Backpack' | 'Other'; +export type CartCategory = 'BabyCarriage' | 'TwoWheelVehicle' | 'Tricyle' | 'Other'; +export type Smoking = 'NoSmoking' | 'Cigar' | 'ElectronicCigarettes' | 'Other'; +export type UsingMobile = 'ByLeftHand' | 'ByRightHand' | 'Other'; +export type HumanActivity = + | 'Walking' + | 'Running' + | 'Fallen' + | 'Squatting' + | 'Sitting' + | 'Standing' + | 'Driving' + | 'Other'; +export interface BodyMetric { + /** Describe the Stature of the body, the unit is centimeter. */ + height?: number; + /** Describle the Shape of the body, acceptable values are defined in bd:BodyShape. */ + bodyShape?: string; +} +export interface Scarf { + /** Describe the Color of the Scarf, acceptable values are defined in ColorDescriptor. */ + color?: ColorDescriptor; + /** Describe if the body wears the Scarf. */ + wear?: boolean; +} +export interface Gloves { + /** Describe the Color of Gloves, acceptable values are defined in tt:ColorDescriptor. */ + color?: ColorDescriptor; + /** Describe if the body wears Gloves. */ + wear?: boolean; +} +export interface Tops { + /** Describe the Category of the Tops, acceptable values are defined in bd:TopsCategory. */ + category?: string; + /** Describe the Color of the Tops, acceptable values are defined in tt:ColorDescriptor. */ + color?: ColorDescriptor; + /** Describe the Grain of the Tops, acceptable values are defined in bd:Grain. */ + grain?: string; + /** Describe the Style of the Tops, acceptable values are defined in bd:TopsStyle. */ + style?: string; +} +export interface Bottoms { + /** Describe the Category of the Bottoms, acceptable values are defined in bd:BottomsCategory. */ + category?: string; + /** Describe the Color of the Bottoms, acceptable values are defined in tt:ColorDescriptor. */ + color?: ColorDescriptor; + /** Describe the Grain of the Bottoms, acceptable values are defined in bd:Grain. */ + grain?: string; + /** Describe the Style of the Bottoms, acceptable values are defined in bd:BottomsStyle. */ + style?: string; +} +export interface Shoes { + /** Describe the Category of the Shoes, acceptable values are defined in bd:ShoesCategory. */ + category?: string; + /** Describe the Color of the Shoes, acceptable values are defined in tt:ColorDescriptor. */ + color?: ColorDescriptor; +} +export interface Clothing { + /** Describe the Scarf of the body,acceptable values are defined in bd:Scarf. */ + scarf?: Scarf; + /** Describe Gloves of the body,acceptable values are defined in bd:Gloves. */ + gloves?: Gloves; + /** Describe the Tops of the body,acceptable values are defined in bd:Tops. */ + tops?: Tops; + /** Describe the Bottoms of the body,acceptable values are defined in bd:Bottoms. */ + bottoms?: Bottoms; + /** Describe the Shoes of the body,acceptable values are defined in bd:Shoes. */ + shoes?: Shoes; +} +export interface Bag { + /** Describe the Category of the Bag, acceptable values are defined in bd:KnapsackCategory. */ + category?: string; + /** Describe the Colour of the Bag, acceptable values are defined in tt:ColorDescriptor. */ + color?: ColorDescriptor; +} +export interface Umbrella { + /** Describe the Color of the Bag, acceptable values are defined in tt:ColorDescriptor. */ + color?: ColorDescriptor; + /** Describe if the body Opens the Umbrella. */ + open?: boolean; +} +export interface Box { + /** Describe the Color of the Box, acceptable values are defined in tt:ColorDescriptor. */ + color?: ColorDescriptor; + /** Describe if the body Lugs the Box. */ + lug?: boolean; +} +export interface Cart { + /** Describe the Category of the Cart, acceptable values are defined in bd:CartCategory. */ + category?: string; + /** Describe the Color of the Cart, acceptable values are defined in tt:ColorDescriptor. */ + color?: ColorDescriptor; +} +export interface Belonging { + /** Describe the Bag of the body,acceptable values are defined in bd:Bag */ + bag?: Bag; + /** Describe the Umbrella carried by the body,acceptable values are defined in bd:Umbrella. */ + umbrella?: Umbrella; + /** Describe if the body Lifts something. */ + liftSomething?: boolean; + /** Describe the Box luffed by the body,acceptable values are defined in bd:Box. */ + box?: Box; + /** Describe the Cart pushed by the body,acceptable values are defined in bd:Cart. */ + cart?: Cart; + /** Describe if the body carries the Weapon. */ + weapon?: boolean; +} +export interface Behaviour { + /** Acceptable values are defined in bd:Smoking. */ + smoking?: string; + /** Acceptable values are defined in bd:UsingMobile. */ + usingMobile?: string; + /** Describe the activity of the body, Acceptable values are defined in bd:HumanActivity. */ + activity?: string; +} +export interface HumanBody { + /** Describe the body metric of the body. */ + bodyMetric?: BodyMetric; + /** Describe the Clothing of the body. */ + clothing?: Clothing; + /** Describe the Belonging of the body. */ + belonging?: Belonging; + /** Describe the Behaviour of the body. */ + behaviour?: Behaviour; +} diff --git a/src/interfaces/humanface.2.ts b/src/interfaces/humanface.2.ts new file mode 100644 index 00000000..e2e557a9 --- /dev/null +++ b/src/interfaces/humanface.2.ts @@ -0,0 +1,151 @@ +import { ColorDescriptor, GeoOrientation, IntRange } from './common'; + +export type Gender = 'Male' | 'Female'; +export type Complexion = 'White' | 'Black' | 'Asian' | 'Other'; +export type FacialShape = 'Long' | 'Round' | 'Square' | 'Oval' | 'Other'; +export type Length = 'Long' | 'Medium' | 'Short'; +export type HairStyle = 'Straight' | 'Wave' | 'Curly' | 'CrewCut' | 'Bald' | 'Ponytail' | 'Pigtail' | 'Other'; +export type EyebrowWidth = 'Long' | 'Short'; +export type EyebrowSpace = 'Joint' | 'Separate'; +export type EyeShape = 'Almond' | 'Round' | 'Other'; +export type Eyelid = 'Single' | 'Double' | 'Other'; +export type Eyeball = 'Black' | 'Blue' | 'Brown' | 'Gray' | 'Green' | 'Pink' | 'Other'; +export type Ear = 'Round' | 'Pointed' | 'Narrow' | 'BroadLobe' | 'Other'; +export type NoseLength = 'Short' | 'Long'; +export type NoseBridge = 'Straight' | 'Arch'; +export type NoseWing = 'Narrow' | 'Broad'; +export type NoseEnd = 'Snub' | 'Turnedup' | 'Flat' | 'Hooked' | 'Other'; +export type Lip = 'Full' | 'Medium' | 'Thin'; +export type Chin = 'Double' | 'Pointed' | 'Round'; +export type Expression = 'Natural' | 'Smile' | 'RaisedEyebrows' | 'Squint' | 'Frown' | 'Other'; +export type FrecklesType = 'AroundCheek' | 'Nose' | 'forehead' | 'Other'; +export interface Hair { + /** + * Describe the length of the Hair, acceptable values are defined in fc:Length. Short usually means that the end of the hair doesn’t exceed the shoulder. + * Medium usually means that the end of the hair is parallel with the shoulder. Long usually means that the end of the hair exceeds the chest. + */ + length?: string; + /** Describe the style of the Hair, acceptable values are defined in fc:HairStyle. */ + style?: string; + /** Describe the color of the Hair. */ + color?: ColorDescriptor; + /** Describe the bangs of the Hair */ + bangs?: boolean; +} +export interface Eyebrow { + /** + * Describe the shape of the eyebrow, Short usually means that the width of eye brow is shorter than the length of eye. + * Long usually means that the width of eye brow is equal to or longer than the length of eye.acceptable values are defined in fc:EyebrowWidth. + */ + width?: string; + /** Describe the Color of the eyebrow. */ + color?: ColorDescriptor; + /** Describe the space of two eyebrows, acceptable values are defined in fc:EyebrowSpace. */ + space?: string; +} +export interface Eye { + /** Describe the shape of the eye, acceptable values are defined in fc:EyeShape. */ + shape?: string; + /** Describe the eyelid of the eye, acceptable values are defined in fc:Eyelid. */ + eyelid?: string; + /** Describe the eyeball of the eye, acceptable values are defined in fc:Eyeball. */ + eyeball?: string; +} +export interface Nose { + /** + * Describe the length of the nose, acceptable values are defined in fc:NoseLength. + * Long usually means that the length of the nose is longer than 1/3 of the length of the face. + * short usually means that the length of the nose is shorter than 1/3 of the length of the face. + */ + length?: string; + /** Describe the bridge of the nose, acceptable values are defined in fc:NoseBridge. */ + noseBridge?: string; + /** Describe the wing of the nose, acceptable values are defined in fc:NoseWing. */ + noseWing?: string; + /** Describe the end of the nose, acceptable values are defined in fc:NoseEnd. */ + noseEnd?: string; +} +export interface FacialHair { + /** Describe if there is mustache on the face. */ + mustache?: boolean; + /** Describe if there are Beard on the face. */ + beard?: boolean; + /** Describe if there are sideburns on the face. */ + sideburn?: boolean; +} +export interface PoseAngle { + /** Describe the pose angle of the face. */ + poseAngles?: GeoOrientation; + /** Describe the expected degree of uncertainty of the pose angle yaw, pitch, and roll. */ + uncertainty?: GeoOrientation; +} +export interface AccessoryDescription { + /** Describe if the object wear a accessory . */ + wear?: boolean; + /** Describe the Color of the accessory. */ + color?: ColorDescriptor; +} +export interface Accessory { + /** Describe if the object wear opticals. */ + opticals?: AccessoryDescription; + /** Describe if the object wear hat. */ + hat?: AccessoryDescription; + /** Describe if the object wear mask. */ + mask?: AccessoryDescription; + /** Describe if the object wear hijab. */ + hijab?: AccessoryDescription; + /** Describe if the object wear Helmet. */ + helmet?: AccessoryDescription; + /** Describe if the object wear Kerchief. */ + kerchief?: AccessoryDescription; + /** Describe if there is a patch on the right eye. */ + rightEyePatch?: AccessoryDescription; + /** Describe if there is a patch on the left eye. */ + leftEyePatch?: AccessoryDescription; +} +export interface AdditionalFeatures { + /** Is there scar on the face. */ + scar?: boolean; + /** Is there mole on the face. */ + mole?: boolean; + /** Is there Tattoo on the face. */ + tattoo?: boolean; + /** Describe freckles on the face, acceptable values are defined in fc:FrecklesType. */ + freckles?: string; +} +export interface HumanFace { + /** Describe the age of the face. */ + age?: IntRange; + /** Describe the gender of the face, acceptable values are defined in fc:Gender. */ + gender?: string; + /** Describe the temperature of the face, in Kelvin. */ + temperature?: number; + /** Describe the complexion of the face, acceptable values are defined in fc:Complexion. */ + complexion?: string; + /** Describe the FacialShape, acceptable values are defined fc:FacialShape. */ + facialShape?: string; + /** Describe the hair of the face. */ + hair?: Hair; + /** Describe the eyebrow of the face. */ + eyebrow?: Eyebrow; + /** Describe the eye of the face. */ + eye?: Eye; + /** Describe the Ear of the face. */ + ear?: Ear; + /** Describe the nose of the face. */ + nose?: Nose; + /** Describe the facial hair of the face. */ + facialHair?: FacialHair; + /** Describe the lip of the face, acceptable values are defined in fc:Lip. */ + lip?: string; + /** Describe the Chin of the face, acceptable values are defined in fc:Chin. */ + chin?: string; + /** Describe the expression on the face, acceptable values are defined in fc:Expression. */ + expression?: string; + /** Describe the pose angle of the face. */ + poseAngle?: PoseAngle; + /** Describe the Accessory of the face. */ + accessory?: Accessory; + /** Describe the other features, eg scar, mole etc of the face. */ + additionalFeatures?: AdditionalFeatures; +} diff --git a/src/interfaces/imaging.2.ts b/src/interfaces/imaging.2.ts new file mode 100644 index 00000000..8da99657 --- /dev/null +++ b/src/interfaces/imaging.2.ts @@ -0,0 +1,131 @@ +import { ReferenceToken } from './common'; +import { Name, ImagingSettings20, ImagingOptions20, FocusMove, MoveOptions20, ImagingStatus20 } from './onvif'; + +/** + * Describes standard Imaging Preset types, used to facilitate Multi-language support and client display. + * "Custom" Type shall be used when Imaging Preset Name does not match any of the types included in the standard classification. + */ +export type ImagingPresetType = + | 'Custom' + | 'ClearWeather' + | 'Cloudy' + | 'Fog' + | 'Rain' + | 'Snowing' + | 'Snow' + | 'WDR' + | 'Shade' + | 'Night' + | 'Indoor' + | 'Fluorescent' + | 'Incandescent' + | 'Sodium(Natrium)' + | 'Sunrise(Horizon)' + | 'Sunset(Rear)' + | 'ExtremeHot' + | 'ExtremeCold' + | 'Underwater' + | 'CloseUp' + | 'Motion' + | 'FlickerFree50' + | 'FlickerFree60'; +export interface Capabilities { + /** + * Indicates whether or not Image Stabilization feature is supported. + * The use of this capability is deprecated, a client should use GetOption to find out if image stabilization is supported. + */ + imageStabilization?: boolean; + /** Indicates whether or not Imaging Presets feature is supported. */ + presets?: boolean; + /** Indicates whether or not imaging preset settings can be updated. */ + adaptablePreset?: boolean; +} +/** Type describing the Imaging Preset settings. */ +export interface ImagingPreset { + /** Unique identifier of this Imaging Preset. */ + token: ReferenceToken; + /** + * Indicates Imaging Preset Type. Use timg:ImagingPresetType. + * Used for multi-language support and display. + */ + type: string; + /** Human readable name of the Imaging Preset. */ + name?: Name; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the imaging service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetImagingSettings { + /** Reference token to the VideoSource for which the ImagingSettings. */ + videoSourceToken?: ReferenceToken; +} +export interface GetImagingSettingsResponse { + /** ImagingSettings for the VideoSource that was requested. */ + imagingSettings?: ImagingSettings20; +} +export interface SetImagingSettings { + videoSourceToken?: ReferenceToken; + imagingSettings?: ImagingSettings20; + forcePersistence?: boolean; +} +export interface GetOptions { + /** Reference token to the VideoSource for which the imaging parameter options are requested. */ + videoSourceToken?: ReferenceToken; +} +export interface GetOptionsResponse { + /** Valid ranges for the imaging parameters that are categorized as device specific. */ + imagingOptions?: ImagingOptions20; +} +export interface Move { + /** Reference to the VideoSource for the requested move (focus) operation. */ + videoSourceToken?: ReferenceToken; + /** Content of the requested move (focus) operation. */ + focus?: FocusMove; +} +export interface MoveResponse {} +export interface GetMoveOptions { + /** Reference token to the VideoSource for the requested move options. */ + videoSourceToken?: ReferenceToken; +} +export interface GetMoveOptionsResponse { + /** Valid ranges for the focus lens move options. */ + moveOptions?: MoveOptions20; +} +export interface Stop { + /** Reference token to the VideoSource where the focus movement should be stopped. */ + videoSourceToken?: ReferenceToken; +} +export interface StopResponse {} +export interface GetStatus { + /** Reference token to the VideoSource where the imaging status should be requested. */ + videoSourceToken?: ReferenceToken; +} +export interface GetStatusResponse { + /** Requested imaging status. */ + status?: ImagingStatus20; +} +export interface GetPresets { + /** A reference to the VideoSource where the operation should take place. */ + videoSourceToken?: ReferenceToken; +} +export interface GetPresetsResponse { + /** List of Imaging Presets which are available for the requested VideoSource. */ + preset?: ImagingPreset[]; +} +export interface GetCurrentPreset { + /** Reference token to the VideoSource where the current Imaging Preset should be requested. */ + videoSourceToken?: ReferenceToken; +} +export interface GetCurrentPresetResponse { + /** Current Imaging Preset in use for the specified Video Source. */ + preset?: ImagingPreset; +} +export interface SetCurrentPreset { + /** Reference token to the VideoSource to which the specified Imaging Preset should be applied. */ + videoSourceToken?: ReferenceToken; + /** Reference token to the Imaging Preset to be applied to the specified Video Source. */ + presetToken?: ReferenceToken; +} +export interface SetCurrentPresetResponse {} diff --git a/src/interfaces/media.2.ts b/src/interfaces/media.2.ts new file mode 100644 index 00000000..7a0f3df6 --- /dev/null +++ b/src/interfaces/media.2.ts @@ -0,0 +1,494 @@ +import { + StringAttrList, + VideoSourceConfiguration, + AudioSourceConfiguration, + VideoEncoder2Configuration, + AudioEncoder2Configuration, + VideoAnalyticsConfiguration, + PTZConfiguration, + MetadataConfiguration, + AudioOutputConfiguration, + AudioDecoderConfiguration, + ReceiverConfiguration, + Name, + VideoResolution, + StringList, + Description, + ColorOptions, + VideoSourceConfigurationOptions, + VideoEncoder2ConfigurationOptions, + AudioSourceConfigurationOptions, + AudioEncoder2ConfigurationOptions, + MetadataConfigurationOptions, + AudioOutputConfigurationOptions, + OSDConfiguration, + OSDConfigurationOptions, +} from './onvif'; +import { AnyURI } from './basics'; +import { ReferenceToken, Polygon, Color } from './common'; + +export type ConfigurationEnumeration = + | 'All' + | 'VideoSource' + | 'VideoEncoder' + | 'AudioSource' + | 'AudioEncoder' + | 'AudioOutput' + | 'AudioDecoder' + | 'Metadata' + | 'Analytics' + | 'PTZ' + | 'Receiver'; +export type TransportProtocol = + | 'RtspUnicast' + | 'RtspMulticast' + | 'RtspsUnicast' + | 'RtspsMulticast' + | 'RTSP' + | 'RtspOverHttp'; +export type MaskType = 'Color' | 'Pixelated' | 'Blurred'; +export interface Capabilities2 { + /** Indicates if GetSnapshotUri is supported. */ + snapshotUri?: boolean; + /** Indicates whether or not Rotation feature is supported. */ + rotation?: boolean; + /** Indicates the support for changing video source mode. */ + videoSourceMode?: boolean; + /** Indicates if OSD is supported. */ + OSD?: boolean; + /** Indicates the support for temporary osd text configuration. */ + temporaryOSDText?: boolean; + /** Indicates if Masking is supported. */ + mask?: boolean; + /** + * Indicates that privacy masks are only supported at the video source level and not the video source configuration level. + * If this is true any addition, deletion or change of a privacy mask done for one video source configuration will automatically be + * applied by the device to a corresponding privacy mask for all other video source configuration associated with the same video source. + */ + sourceMask?: boolean; + /** Indicates number of supported WebRTC configurations. */ + webRTC?: number; + /** Media profile capabilities. */ + profileCapabilities?: ProfileCapabilities; + /** Streaming capabilities. */ + streamingCapabilities?: StreamingCapabilities; +} +export interface ProfileCapabilities { + /** Maximum number of profiles supported. */ + maximumNumberOfProfiles?: number; + /** The configurations supported by the device as defined by tr2:ConfigurationEnumeration. The enumeration value "All" shall not be included in this list. */ + configurationsSupported?: StringAttrList; +} +export interface StreamingCapabilities { + /** Indicates support for live media streaming via RTSP. */ + RTSPStreaming?: boolean; + /** Indicates support for RTP multicast. */ + RTPMulticast?: boolean; + /** Indicates support for RTP/RTSP/TCP. */ + RTP_RTSP_TCP?: boolean; + /** Indicates support for non aggregate RTSP control. */ + nonAggregateControl?: boolean; + /** If streaming over WebSocket is supported, this shall return the RTSP WebSocket URI as described in Streaming Specification Section 5.1.1.5. */ + RTSPWebSocketUri?: AnyURI; + /** Indicates support for non-RTSP controlled multicast streaming. */ + autoStartMulticast?: boolean; + /** Indicates support for live media streaming via RTSPS and SRTP. */ + secureRTSPStreaming?: boolean; +} +export interface ConfigurationRef { + /** Type of the configuration as defined by tr2:ConfigurationEnumeration. */ + type?: string; + /** + * Reference token of an existing configuration. + * Token shall be included in the AddConfiguration request along with the type. + * Token shall be included in the CreateProfile request when Configuration elements are included and type is selected. + * Token is optional for RemoveConfiguration request. If no token is provided in RemoveConfiguration request, device shall + * remove the configuration of the type included in the profile. + */ + token?: ReferenceToken; +} +/** A set of media configurations. */ +export interface ConfigurationSet { + /** Optional configuration of the Video input. */ + videoSource?: VideoSourceConfiguration; + /** Optional configuration of the Audio input. */ + audioSource?: AudioSourceConfiguration; + /** Optional configuration of the Video encoder. */ + videoEncoder?: VideoEncoder2Configuration; + /** Optional configuration of the Audio encoder. */ + audioEncoder?: AudioEncoder2Configuration; + /** Optional configuration of the analytics module and rule engine. */ + analytics?: VideoAnalyticsConfiguration; + /** Optional configuration of the pan tilt zoom unit. */ + PTZ?: PTZConfiguration; + /** Optional configuration of the metadata stream. */ + metadata?: MetadataConfiguration; + /** Optional configuration of the Audio output. */ + audioOutput?: AudioOutputConfiguration; + /** Optional configuration of the Audio decoder. */ + audioDecoder?: AudioDecoderConfiguration; + /** Optional configuration of the Receiver. */ + receiver?: ReceiverConfiguration; +} +/** A media profile consists of a set of media configurations. */ +export interface MediaProfile { + /** Unique identifier of the profile. */ + token: ReferenceToken; + /** A value of true signals that the profile cannot be deleted. Default is false. */ + fixed?: boolean; + /** User readable name of the profile. */ + name?: Name; + /** The configurations assigned to the profile. */ + configurations?: ConfigurationSet; +} +export interface GetConfiguration { + /** Token of the requested configuration. */ + configurationToken?: ReferenceToken; + /** Contains the token of an existing media profile the configurations shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface SetConfigurationResponse {} +export interface EncoderInstance { + /** Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types. */ + encoding?: string; + /** The minimum guaranteed number of encoder instances (applications) for the VideoSourceConfiguration. */ + number?: number; +} +export interface EncoderInstanceInfo { + /** If a device limits the number of instances for respective Video Codecs the response contains the information how many streams can be set up at the same time per VideoSource. */ + codec?: EncoderInstance[]; + /** The minimum guaranteed total number of encoder instances (applications) per VideoSourceConfiguration. The device is able to deliver the Total number of streams */ + total?: number; +} +export interface StartStopMulticastStreaming { + /** Contains the token of the Profile that is used to define the multicast stream. */ + profileToken?: ReferenceToken; +} +export interface VideoSourceMode { + /** Indicate token for video source mode. */ + token: ReferenceToken; + /** Indication of whether this mode is active. If active this value is true. In case of non-indication, it means as false. The value of true shall be had by only one video source mode. */ + enabled?: boolean; + /** Max frame rate in frames per second for this video source mode. */ + maxFramerate?: number; + /** Max horizontal and vertical resolution for this video source mode. */ + maxResolution?: VideoResolution; + /** List of one or more encodings supported for this video source. For name definitions see tt:VideoEncodingMimeNames, and see IANA Media Types. */ + encodings?: StringList; + /** After setting the mode if a device starts to reboot this value is true. If a device change the mode without rebooting this value is false. If true, configured parameters may not be guaranteed by the device after rebooting. */ + reboot?: boolean; + /** Informative description of this video source mode. This field should be described in English. */ + description?: Description; +} +export interface Mask { + /** Token of the mask. */ + token?: ReferenceToken; + /** Token of the VideoSourceConfiguration the Mask is associated with. */ + configurationToken?: ReferenceToken; + /** Geometric representation of the mask area. */ + polygon?: Polygon; + /** + * Type of masking as defined by tr2:MaskType: + * + * Color - The masked area is colored with color defined by the Color field. + * Pixelated - The masked area is filled in mosaic style to hide details. + * Blurred - The masked area is low pass filtered to hide details. + * + */ + type?: string; + /** Color of the masked area. */ + color?: Color; + /** If set the mask will cover the image, otherwise it will be fully transparent. */ + enabled?: boolean; +} +export interface MaskOptions { + /** Information whether the polygon must have four points and a rectangular shape. */ + rectangleOnly?: boolean; + /** Indicates the device capability of change in color of privacy mask for one video source configuration will automatically be applied to all the privacy masks associated with the same video source configuration. */ + singleColorOnly?: boolean; + /** Maximum supported number of masks per VideoSourceConfiguration. */ + maxMasks?: number; + /** Maximum supported number of points per mask. */ + maxPoints?: number; + /** Information which types of tr2:MaskType are supported. Valid values are 'Color', 'Pixelated' and 'Blurred'. */ + types?: string[]; + /** Colors supported. */ + color?: ColorOptions; +} +export interface WebRTCConfiguration { + /** The signaling server URI. */ + signalingServer?: AnyURI; + /** The CertPathValidationPolicyID for validating the signaling server certificate. */ + certPathValidationPolicyID?: string; + /** The Authorization Server to use for getting access tokens. This refers to an entity in the list of configured Authorization Servers in the [ONVIF Security Service Specification]. */ + authorizationServer?: ReferenceToken; + /** The default media profile to use for streaming if no specific profile is specified when initializing a session. */ + defaultProfile?: ReferenceToken; + /** Enables/disables the configuration. */ + enabled?: boolean; + /** Enables/disables the configuration. */ + connected?: boolean; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the media service is returned in the Capabilities element. */ + capabilities?: Capabilities2; +} +export interface CreateProfile { + /** friendly name of the profile to be created */ + name?: Name; + /** Optional set of configurations to be assigned to the profile. List entries with tr2:ConfigurationEnumeration value "All" shall be ignored. */ + configuration?: ConfigurationRef[]; +} +export interface CreateProfileResponse { + /** Token assigned by the device for the newly created profile. */ + token?: ReferenceToken; +} +export interface GetProfiles { + /** Optional token of the requested profile. */ + token?: ReferenceToken; + /** The types shall be provided as defined by tr2:ConfigurationEnumeration. */ + type?: string[]; +} +export interface GetProfilesResponse { + /** + * Lists all profiles that exist in the media service. The response provides the requested types of Configurations as far as available. + * If a profile doesn't contain a type no error shall be provided. + */ + profiles?: MediaProfile[]; +} +export interface AddConfiguration { + /** Reference to the profile where the configuration should be added */ + profileToken?: ReferenceToken; + /** Optional item. If present updates the Name property of the profile. */ + name?: Name; + /** List of configurations to be added. The types shall be provided in the order defined by tr2:ConfigurationEnumeration. List entries with tr2:ConfigurationEnumeration value "All" shall be ignored. */ + configuration?: ConfigurationRef[]; +} +export interface AddConfigurationResponse {} +export interface RemoveConfiguration { + /** This element contains a reference to the media profile from which the configuration shall be removed. */ + profileToken?: ReferenceToken; + /** List of configurations to be removed. The types shall be provided in the order defined by tr2:ConfigurationEnumeration. Tokens appearing in the configuration list shall be ignored. Presence of the "All" type shall result in an empty profile. */ + configuration?: ConfigurationRef[]; +} +export interface RemoveConfigurationResponse {} +export interface DeleteProfile { + /** This element contains a reference to the profile that should be deleted. */ + token?: ReferenceToken; +} +export interface DeleteProfileResponse {} +export interface GetVideoEncoderConfigurationsResponse { + /** This element contains a list of video encoder configurations. */ + configurations?: VideoEncoder2Configuration[]; +} +export interface GetVideoSourceConfigurationsResponse { + /** This element contains a list of video source configurations. */ + configurations?: VideoSourceConfiguration[]; +} +export interface GetAudioEncoderConfigurationsResponse { + /** This element contains a list of audio encoder configurations. */ + configurations?: AudioEncoder2Configuration[]; +} +export interface GetAudioSourceConfigurationsResponse { + /** This element contains a list of audio source configurations. */ + configurations?: AudioSourceConfiguration[]; +} +export interface GetAnalyticsConfigurationsResponse { + /** This element contains a list of Analytics configurations. */ + configurations?: VideoAnalyticsConfiguration[]; +} +export interface GetMetadataConfigurationsResponse { + /** This element contains a list of metadata configurations */ + configurations?: MetadataConfiguration[]; +} +export interface GetAudioOutputConfigurationsResponse { + /** This element contains a list of audio output configurations */ + configurations?: AudioOutputConfiguration[]; +} +export interface GetAudioDecoderConfigurationsResponse { + /** This element contains a list of audio decoder configurations */ + configurations?: AudioDecoderConfiguration[]; +} +export interface SetVideoEncoderConfiguration { + /** Contains the modified video encoder configuration. The configuration shall exist in the device. */ + configuration?: VideoEncoder2Configuration; +} +export interface SetVideoSourceConfiguration { + /** Contains the modified video source configuration. The configuration shall exist in the device. */ + configuration?: VideoSourceConfiguration; +} +export interface SetAudioEncoderConfiguration { + /** Contains the modified audio encoder configuration. The configuration shall exist in the device. */ + configuration?: AudioEncoder2Configuration; +} +export interface SetAudioSourceConfiguration { + /** Contains the modified audio source configuration. The configuration shall exist in the device. */ + configuration?: AudioSourceConfiguration; +} +export interface SetMetadataConfiguration { + /** Contains the modified metadata configuration. The configuration shall exist in the device. */ + configuration?: MetadataConfiguration; +} +export interface SetAudioOutputConfiguration { + /** Contains the modified audio output configuration. The configuration shall exist in the device. */ + configuration?: AudioOutputConfiguration; +} +export interface SetAudioDecoderConfiguration { + /** Contains the modified audio decoder configuration. The configuration shall exist in the device. */ + configuration?: AudioDecoderConfiguration; +} +export interface GetVideoSourceConfigurationOptionsResponse { + /** This message contains the video source configuration options. If a video source configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: VideoSourceConfigurationOptions; +} +export interface GetVideoEncoderConfigurationOptionsResponse { + options?: VideoEncoder2ConfigurationOptions[]; +} +export interface GetAudioSourceConfigurationOptionsResponse { + /** This message contains the audio source configuration options. If a audio source configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: AudioSourceConfigurationOptions; +} +export interface GetAudioEncoderConfigurationOptionsResponse { + /** This message contains the audio encoder configuration options. If a audio encoder configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: AudioEncoder2ConfigurationOptions[]; +} +export interface GetMetadataConfigurationOptionsResponse { + /** This message contains the metadata configuration options. If a metadata configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: MetadataConfigurationOptions; +} +export interface GetAudioOutputConfigurationOptionsResponse { + /** This message contains the audio output configuration options. If a audio output configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: AudioOutputConfigurationOptions; +} +export interface GetAudioDecoderConfigurationOptionsResponse { + /** This message contains the audio decoder configuration options. If a audio decoder configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: AudioEncoder2ConfigurationOptions[]; +} +export interface GetVideoEncoderInstances { + /** Token of the video source configuration */ + configurationToken?: ReferenceToken; +} +export interface GetVideoEncoderInstancesResponse { + /** The minimum guaranteed total number of encoder instances (applications) per VideoSourceConfiguration. */ + info?: EncoderInstanceInfo; +} +export interface GetStreamUri { + /** Defines the network protocol for streaming as defined by tr2:TransportProtocol */ + protocol?: string; + /** The ProfileToken element indicates the media profile to use and will define the configuration of the content of the stream. */ + profileToken?: ReferenceToken; +} +export interface GetStreamUriResponse { + /** Stable Uri to be used for requesting the media stream */ + uri?: AnyURI; +} +export interface SetSynchronizationPoint { + /** Contains a Profile reference for which a Synchronization Point is requested. */ + profileToken?: ReferenceToken; +} +export interface SetSynchronizationPointResponse {} +export interface GetSnapshotUri { + /** The ProfileToken element indicates the media profile to use and will define the source and dimensions of the snapshot. */ + profileToken?: ReferenceToken; +} +export interface GetSnapshotUriResponse { + /** Stable Uri to be used for requesting snapshot images. */ + uri?: AnyURI; +} +export interface GetVideoSourceModes { + /** Contains a video source reference for which a video source mode is requested. */ + videoSourceToken?: ReferenceToken; +} +export interface GetVideoSourceModesResponse { + /** Return the information for specified video source mode. */ + videoSourceModes?: VideoSourceMode[]; +} +export interface SetVideoSourceMode { + /** Contains a video source reference for which a video source mode is requested. */ + videoSourceToken?: ReferenceToken; + /** Indicate video source mode. */ + videoSourceModeToken?: ReferenceToken; +} +export interface SetVideoSourceModeResponse { + /** The response contains information about rebooting after returning response. When Reboot is set true, a device will reboot automatically after setting mode. */ + reboot?: boolean; +} +export interface GetOSDs { + /** The GetOSDs command fetches the OSD configuration if the OSD token is known. */ + OSDToken?: ReferenceToken; + /** Token of the Video Source Configuration, which has OSDs associated with are requested. If token not exist, request all available OSDs. */ + configurationToken?: ReferenceToken; +} +export interface GetOSDsResponse { + /** This element contains a list of requested OSDs. */ + OSDs?: OSDConfiguration[]; +} +export interface SetOSD { + /** Contains the modified OSD configuration. */ + OSD?: OSDConfiguration; +} +export interface GetOSDOptions { + /** Video Source Configuration Token that specifies an existing video source configuration that the options shall be compatible with. */ + configurationToken?: ReferenceToken; +} +export interface GetOSDOptionsResponse { + /**/ + OSDOptions?: OSDConfigurationOptions; +} +export interface CreateOSD { + /** Contain the initial OSD configuration for create. */ + OSD?: OSDConfiguration; +} +export interface CreateOSDResponse { + /** Returns Token of the newly created OSD */ + OSDToken?: ReferenceToken; +} +export interface DeleteOSD { + /** This element contains a reference to the OSD configuration that should be deleted. */ + OSDToken?: ReferenceToken; +} +export interface GetMasks { + /** Optional mask token of an existing mask. */ + token?: ReferenceToken; + /** Optional token of a Video Source Configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetMasksResponse { + /** List of Mask configurations. */ + masks?: Mask[]; +} +export interface SetMask { + /** Mask to be updated. */ + mask?: Mask; +} +export interface GetMaskOptions { + /** Video Source Configuration Token that specifies an existing video source configuration that the options shall be compatible with. */ + configurationToken?: ReferenceToken; +} +export interface GetMaskOptionsResponse { + /**/ + options?: MaskOptions; +} +export interface CreateMask { + /** Contain the initial mask configuration for create. */ + mask?: Mask; +} +export interface CreateMaskResponse { + /** Returns Token of the newly created Mask */ + token?: ReferenceToken; +} +export interface DeleteMask { + /** This element contains a reference to the Mask configuration that should be deleted. */ + token?: ReferenceToken; +} +export interface GetWebRTCConfigurations {} +export interface GetWebRTCConfigurationsResponse { + /** Video Source Configuration Token that specifies an existing video source configuration that the options shall be compatible with. */ + webRTCConfiguration?: WebRTCConfiguration[]; +} +export interface SetWebRTCConfigurations { + /** Video Source Configuration Token that specifies an existing video source configuration that the options shall be compatible with. */ + webRTCConfiguration?: WebRTCConfiguration[]; +} +export interface SetWebRTCConfigurationsResponse {} diff --git a/src/interfaces/media.ts b/src/interfaces/media.ts new file mode 100644 index 00000000..4c3a1d26 --- /dev/null +++ b/src/interfaces/media.ts @@ -0,0 +1,663 @@ +import { ReferenceToken } from './common'; +import { + VideoResolution, + StringList, + Description, + VideoSource, + AudioSource, + AudioOutput, + Name, + Profile, + VideoEncoderConfiguration, + VideoSourceConfiguration, + AudioEncoderConfiguration, + AudioSourceConfiguration, + VideoAnalyticsConfiguration, + MetadataConfiguration, + AudioOutputConfiguration, + AudioDecoderConfiguration, + VideoSourceConfigurationOptions, + VideoEncoderConfigurationOptions, + AudioSourceConfigurationOptions, + AudioEncoderConfigurationOptions, + MetadataConfigurationOptions, + AudioOutputConfigurationOptions, + AudioDecoderConfigurationOptions, + StreamSetup, + MediaUri, + OSDConfiguration, + OSDConfigurationOptions, +} from './onvif'; + +export interface Capabilities { + /** Indicates if GetSnapshotUri is supported. */ + snapshotUri?: boolean; + /** Indicates whether or not Rotation feature is supported. */ + rotation?: boolean; + /** Indicates the support for changing video source mode. */ + videoSourceMode?: boolean; + /** Indicates if OSD is supported. */ + OSD?: boolean; + /** Indicates the support for temporary osd text configuration. */ + temporaryOSDText?: boolean; + /** Indicates the support for the Efficient XML Interchange (EXI) binary XML format. */ + EXICompression?: boolean; + /** Media profile capabilities. */ + profileCapabilities?: ProfileCapabilities; + /** Streaming capabilities. */ + streamingCapabilities?: StreamingCapabilities; +} +export interface ProfileCapabilities { + /** Maximum number of profiles supported. */ + maximumNumberOfProfiles?: number; +} +export interface StreamingCapabilities { + /** Indicates support for RTP multicast. */ + RTPMulticast?: boolean; + /** Indicates support for RTP over TCP. */ + RTP_TCP?: boolean; + /** Indicates support for RTP/RTSP/TCP. */ + RTP_RTSP_TCP?: boolean; + /** Indicates support for non aggregate RTSP control. */ + nonAggregateControl?: boolean; + /** Indicates the device does not support live media streaming via RTSP. */ + noRTSPStreaming?: boolean; +} +export interface VideoSourceMode { + /** Indicate token for video source mode. */ + token: ReferenceToken; + /** Indication of whether this mode is active. If active this value is true. In case of non-indication, it means as false. The value of true shall be had by only one video source mode. */ + enabled?: boolean; + /** Max frame rate in frames per second for this video source mode. */ + maxFramerate?: number; + /** Max horizontal and vertical resolution for this video source mode. */ + maxResolution?: VideoResolution; + /** Indication which encodings are supported for this video source. The list may contain one or more enumeration values of tt:VideoEncoding. */ + encodings?: StringList; + /** After setting the mode if a device starts to reboot this value is true. If a device change the mode without rebooting this value is false. If true, configured parameters may not be guaranteed by the device after rebooting. */ + reboot?: boolean; + /** Informative description of this video source mode. This field should be described in English. */ + description?: Description; + extension?: VideoSourceModeExtension; +} +export interface VideoSourceModeExtension {} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the media service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetVideoSources {} +export interface GetVideoSourcesResponse { + /** List of existing Video Sources */ + videoSources?: VideoSource[]; +} +export interface GetAudioSources {} +export interface GetAudioSourcesResponse { + /** List of existing Audio Sources */ + audioSources?: AudioSource[]; +} +export interface GetAudioOutputs {} +export interface GetAudioOutputsResponse { + /** List of existing Audio Outputs */ + audioOutputs?: AudioOutput[]; +} +export interface CreateProfile { + /** friendly name of the profile to be created */ + name?: Name; + /** Optional token, specifying the unique identifier of the new profile. A device supports at least a token length of 12 characters and characters "A-Z" | "a-z" | "0-9" | "-.". */ + token?: ReferenceToken; +} +export interface CreateProfileResponse { + /** returns the new created profile */ + profile?: Profile; +} +export interface GetProfile { + /** this command requests a specific profile */ + profileToken?: ReferenceToken; +} +export interface GetProfileResponse { + /** returns the requested media profile */ + profile?: Profile; +} +export interface GetProfiles {} +export interface GetProfilesResponse { + /** lists all profiles that exist in the media service */ + profiles?: Profile[]; +} +export interface AddVideoEncoderConfiguration { + /** Reference to the profile where the configuration should be added */ + profileToken?: ReferenceToken; + /** Contains a reference to the VideoEncoderConfiguration to add */ + configurationToken?: ReferenceToken; +} +export interface AddVideoEncoderConfigurationResponse {} +export interface RemoveVideoEncoderConfiguration { + /** + * Contains a reference to the media profile from which the + * VideoEncoderConfiguration shall be removed. + */ + profileToken?: ReferenceToken; +} +export interface RemoveVideoEncoderConfigurationResponse {} +export interface AddVideoSourceConfiguration { + /** Reference to the profile where the configuration should be added */ + profileToken?: ReferenceToken; + /** Contains a reference to the VideoSourceConfiguration to add */ + configurationToken?: ReferenceToken; +} +export interface AddVideoSourceConfigurationResponse {} +export interface RemoveVideoSourceConfiguration { + /** + * Contains a reference to the media profile from which the + * VideoSourceConfiguration shall be removed. + */ + profileToken?: ReferenceToken; +} +export interface RemoveVideoSourceConfigurationResponse {} +export interface AddAudioEncoderConfiguration { + /** Reference to the profile where the configuration should be added */ + profileToken?: ReferenceToken; + /** Contains a reference to the AudioEncoderConfiguration to add */ + configurationToken?: ReferenceToken; +} +export interface AddAudioEncoderConfigurationResponse {} +export interface RemoveAudioEncoderConfiguration { + /** + * Contains a reference to the media profile from which the + * AudioEncoderConfiguration shall be removed. + */ + profileToken?: ReferenceToken; +} +export interface RemoveAudioEncoderConfigurationResponse {} +export interface AddAudioSourceConfiguration { + /** Reference to the profile where the configuration should be added */ + profileToken?: ReferenceToken; + /** Contains a reference to the AudioSourceConfiguration to add */ + configurationToken?: ReferenceToken; +} +export interface AddAudioSourceConfigurationResponse {} +export interface RemoveAudioSourceConfiguration { + /** + * Contains a reference to the media profile from which the + * AudioSourceConfiguration shall be removed. + */ + profileToken?: ReferenceToken; +} +export interface RemoveAudioSourceConfigurationResponse {} +export interface AddPTZConfiguration { + /** Reference to the profile where the configuration should be added */ + profileToken?: ReferenceToken; + /** Contains a reference to the PTZConfiguration to add */ + configurationToken?: ReferenceToken; +} +export interface AddPTZConfigurationResponse {} +export interface RemovePTZConfiguration { + /** + * Contains a reference to the media profile from which the + * PTZConfiguration shall be removed. + */ + profileToken?: ReferenceToken; +} +export interface RemovePTZConfigurationResponse {} +export interface AddVideoAnalyticsConfiguration { + /** Reference to the profile where the configuration should be added */ + profileToken?: ReferenceToken; + /** Contains a reference to the VideoAnalyticsConfiguration to add */ + configurationToken?: ReferenceToken; +} +export interface AddVideoAnalyticsConfigurationResponse {} +export interface RemoveVideoAnalyticsConfiguration { + /** + * Contains a reference to the media profile from which the + * VideoAnalyticsConfiguration shall be removed. + */ + profileToken?: ReferenceToken; +} +export interface RemoveVideoAnalyticsConfigurationResponse {} +export interface AddMetadataConfiguration { + /** Reference to the profile where the configuration should be added */ + profileToken?: ReferenceToken; + /** Contains a reference to the MetadataConfiguration to add */ + configurationToken?: ReferenceToken; +} +export interface AddMetadataConfigurationResponse {} +export interface RemoveMetadataConfiguration { + /** + * Contains a reference to the media profile from which the + * MetadataConfiguration shall be removed. + */ + profileToken?: ReferenceToken; +} +export interface RemoveMetadataConfigurationResponse {} +export interface AddAudioOutputConfiguration { + /** Reference to the profile where the configuration should be added */ + profileToken?: ReferenceToken; + /** Contains a reference to the AudioOutputConfiguration to add */ + configurationToken?: ReferenceToken; +} +export interface AddAudioOutputConfigurationResponse {} +export interface RemoveAudioOutputConfiguration { + /** + * Contains a reference to the media profile from which the + * AudioOutputConfiguration shall be removed. + */ + profileToken?: ReferenceToken; +} +export interface RemoveAudioOutputConfigurationResponse {} +export interface AddAudioDecoderConfiguration { + /** This element contains a reference to the profile where the configuration should be added. */ + profileToken?: ReferenceToken; + /** This element contains a reference to the AudioDecoderConfiguration to add. */ + configurationToken?: ReferenceToken; +} +export interface AddAudioDecoderConfigurationResponse {} +export interface RemoveAudioDecoderConfiguration { + /** This element contains a reference to the media profile from which the AudioDecoderConfiguration shall be removed. */ + profileToken?: ReferenceToken; +} +export interface RemoveAudioDecoderConfigurationResponse {} +export interface DeleteProfile { + /** This element contains a reference to the profile that should be deleted. */ + profileToken?: ReferenceToken; +} +export interface DeleteProfileResponse {} +export interface GetVideoEncoderConfigurations {} +export interface GetVideoEncoderConfigurationsResponse { + /** This element contains a list of video encoder configurations. */ + configurations?: VideoEncoderConfiguration[]; +} +export interface GetVideoSourceConfigurations {} +export interface GetVideoSourceConfigurationsResponse { + /** This element contains a list of video source configurations. */ + configurations?: VideoSourceConfiguration[]; +} +export interface GetAudioEncoderConfigurations {} +export interface GetAudioEncoderConfigurationsResponse { + /** This element contains a list of audio encoder configurations. */ + configurations?: AudioEncoderConfiguration[]; +} +export interface GetAudioSourceConfigurations {} +export interface GetAudioSourceConfigurationsResponse { + /** This element contains a list of audio source configurations. */ + configurations?: AudioSourceConfiguration[]; +} +export interface GetVideoAnalyticsConfigurations {} +export interface GetVideoAnalyticsConfigurationsResponse { + /** This element contains a list of VideoAnalytics configurations. */ + configurations?: VideoAnalyticsConfiguration[]; +} +export interface GetMetadataConfigurations {} +export interface GetMetadataConfigurationsResponse { + /** This element contains a list of metadata configurations */ + configurations?: MetadataConfiguration[]; +} +export interface GetAudioOutputConfigurations {} +export interface GetAudioOutputConfigurationsResponse { + /** This element contains a list of audio output configurations */ + configurations?: AudioOutputConfiguration[]; +} +export interface GetAudioDecoderConfigurations {} +export interface GetAudioDecoderConfigurationsResponse { + /** This element contains a list of audio decoder configurations */ + configurations?: AudioDecoderConfiguration[]; +} +export interface GetVideoSourceConfiguration { + /** Token of the requested video source configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetVideoSourceConfigurationResponse { + /** The requested video source configuration. */ + configuration?: VideoSourceConfiguration; +} +export interface GetVideoEncoderConfiguration { + /** Token of the requested video encoder configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetVideoEncoderConfigurationResponse { + /** The requested video encoder configuration. */ + configuration?: VideoEncoderConfiguration; +} +export interface GetAudioSourceConfiguration { + /** Token of the requested audio source configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetAudioSourceConfigurationResponse { + /** The requested audio source configuration. */ + configuration?: AudioSourceConfiguration; +} +export interface GetAudioEncoderConfiguration { + /** Token of the requested audio encoder configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetAudioEncoderConfigurationResponse { + /** The requested audio encoder configuration */ + configuration?: AudioEncoderConfiguration; +} +export interface GetVideoAnalyticsConfiguration { + /** Token of the requested video analytics configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetVideoAnalyticsConfigurationResponse { + /** The requested video analytics configuration. */ + configuration?: VideoAnalyticsConfiguration; +} +export interface GetMetadataConfiguration { + /** Token of the requested metadata configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetMetadataConfigurationResponse { + /** The requested metadata configuration. */ + configuration?: MetadataConfiguration; +} +export interface GetAudioOutputConfiguration { + /** Token of the requested audio output configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetAudioOutputConfigurationResponse { + /** The requested audio output configuration. */ + configuration?: AudioOutputConfiguration; +} +export interface GetAudioDecoderConfiguration { + /** Token of the requested audio decoder configuration. */ + configurationToken?: ReferenceToken; +} +export interface GetAudioDecoderConfigurationResponse { + /** The requested audio decoder configuration */ + configuration?: AudioDecoderConfiguration; +} +export interface GetCompatibleVideoEncoderConfigurations { + /** Contains the token of an existing media profile the configurations shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetCompatibleVideoEncoderConfigurationsResponse { + /** Contains a list of video encoder configurations that are compatible with the specified media profile. */ + configurations?: VideoEncoderConfiguration[]; +} +export interface GetCompatibleVideoSourceConfigurations { + /** Contains the token of an existing media profile the configurations shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetCompatibleVideoSourceConfigurationsResponse { + /** Contains a list of video source configurations that are compatible with the specified media profile. */ + configurations?: VideoSourceConfiguration[]; +} +export interface GetCompatibleAudioEncoderConfigurations { + /** Contains the token of an existing media profile the configurations shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetCompatibleAudioEncoderConfigurationsResponse { + /** Contains a list of audio encoder configurations that are compatible with the specified media profile. */ + configurations?: AudioEncoderConfiguration[]; +} +export interface GetCompatibleAudioSourceConfigurations { + /** Contains the token of an existing media profile the configurations shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetCompatibleAudioSourceConfigurationsResponse { + /** Contains a list of audio source configurations that are compatible with the specified media profile. */ + configurations?: AudioSourceConfiguration[]; +} +export interface GetCompatibleVideoAnalyticsConfigurations { + /** Contains the token of an existing media profile the configurations shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetCompatibleVideoAnalyticsConfigurationsResponse { + /** Contains a list of video analytics configurations that are compatible with the specified media profile. */ + configurations?: VideoAnalyticsConfiguration[]; +} +export interface GetCompatibleMetadataConfigurations { + /** Contains the token of an existing media profile the configurations shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetCompatibleMetadataConfigurationsResponse { + /** Contains a list of metadata configurations that are compatible with the specified media profile. */ + configurations?: MetadataConfiguration[]; +} +export interface GetCompatibleAudioOutputConfigurations { + /** Contains the token of an existing media profile the configurations shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetCompatibleAudioOutputConfigurationsResponse { + /** Contains a list of audio output configurations that are compatible with the specified media profile. */ + configurations?: AudioOutputConfiguration[]; +} +export interface GetCompatibleAudioDecoderConfigurations { + /** Contains the token of an existing media profile the configurations shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetCompatibleAudioDecoderConfigurationsResponse { + /** Contains a list of audio decoder configurations that are compatible with the specified media profile. */ + configurations?: AudioDecoderConfiguration[]; +} +export interface SetVideoEncoderConfiguration { + /** Contains the modified video encoder configuration. The configuration shall exist in the device. */ + configuration?: VideoEncoderConfiguration; + /** The ForcePersistence element is obsolete and should always be assumed to be true. */ + forcePersistence?: boolean; +} +export interface SetVideoEncoderConfigurationResponse {} +export interface SetVideoSourceConfiguration { + /** Contains the modified video source configuration. The configuration shall exist in the device. */ + configuration?: VideoSourceConfiguration; + /** The ForcePersistence element is obsolete and should always be assumed to be true. */ + forcePersistence?: boolean; +} +export interface SetVideoSourceConfigurationResponse {} +export interface SetAudioEncoderConfiguration { + /** Contains the modified audio encoder configuration. The configuration shall exist in the device. */ + configuration?: AudioEncoderConfiguration; + /** The ForcePersistence element is obsolete and should always be assumed to be true. */ + forcePersistence?: boolean; +} +export interface SetAudioEncoderConfigurationResponse {} +export interface SetAudioSourceConfiguration { + /** Contains the modified audio source configuration. The configuration shall exist in the device. */ + configuration?: AudioSourceConfiguration; + /** The ForcePersistence element is obsolete and should always be assumed to be true. */ + forcePersistence?: boolean; +} +export interface SetAudioSourceConfigurationResponse {} +export interface SetVideoAnalyticsConfiguration { + /** Contains the modified video analytics configuration. The configuration shall exist in the device. */ + configuration?: VideoAnalyticsConfiguration; + /** The ForcePersistence element is obsolete and should always be assumed to be true. */ + forcePersistence?: boolean; +} +export interface SetVideoAnalyticsConfigurationResponse {} +export interface SetMetadataConfiguration { + /** Contains the modified metadata configuration. The configuration shall exist in the device. */ + configuration?: MetadataConfiguration; + /** The ForcePersistence element is obsolete and should always be assumed to be true. */ + forcePersistence?: boolean; +} +export interface SetMetadataConfigurationResponse {} +export interface SetAudioOutputConfiguration { + /** Contains the modified audio output configuration. The configuration shall exist in the device. */ + configuration?: AudioOutputConfiguration; + /** The ForcePersistence element is obsolete and should always be assumed to be true. */ + forcePersistence?: boolean; +} +export interface SetAudioOutputConfigurationResponse {} +export interface SetAudioDecoderConfiguration { + /** Contains the modified audio decoder configuration. The configuration shall exist in the device. */ + configuration?: AudioDecoderConfiguration; + /** The ForcePersistence element is obsolete and should always be assumed to be true. */ + forcePersistence?: boolean; +} +export interface SetAudioDecoderConfigurationResponse {} +export interface GetVideoSourceConfigurationOptions { + /** Optional video source configurationToken that specifies an existing configuration that the options are intended for. */ + configurationToken?: ReferenceToken; + /** Optional ProfileToken that specifies an existing media profile that the options shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetVideoSourceConfigurationOptionsResponse { + /** This message contains the video source configuration options. If a video source configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: VideoSourceConfigurationOptions; +} +export interface GetVideoEncoderConfigurationOptions { + /** Optional video encoder configuration token that specifies an existing configuration that the options are intended for. */ + configurationToken?: ReferenceToken; + /** Optional ProfileToken that specifies an existing media profile that the options shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetVideoEncoderConfigurationOptionsResponse { + options?: VideoEncoderConfigurationOptions; +} +export interface GetAudioSourceConfigurationOptions { + /** Optional audio source configuration token that specifies an existing configuration that the options are intended for. */ + configurationToken?: ReferenceToken; + /** Optional ProfileToken that specifies an existing media profile that the options shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetAudioSourceConfigurationOptionsResponse { + /** This message contains the audio source configuration options. If a audio source configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: AudioSourceConfigurationOptions; +} +export interface GetAudioEncoderConfigurationOptions { + /** Optional audio encoder configuration token that specifies an existing configuration that the options are intended for. */ + configurationToken?: ReferenceToken; + /** Optional ProfileToken that specifies an existing media profile that the options shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetAudioEncoderConfigurationOptionsResponse { + /** This message contains the audio encoder configuration options. If a audio encoder configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: AudioEncoderConfigurationOptions; +} +export interface GetMetadataConfigurationOptions { + /** Optional metadata configuration token that specifies an existing configuration that the options are intended for. */ + configurationToken?: ReferenceToken; + /** Optional ProfileToken that specifies an existing media profile that the options shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetMetadataConfigurationOptionsResponse { + /** This message contains the metadata configuration options. If a metadata configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: MetadataConfigurationOptions; +} +export interface GetAudioOutputConfigurationOptions { + /** Optional audio output configuration token that specifies an existing configuration that the options are intended for. */ + configurationToken?: ReferenceToken; + /** Optional ProfileToken that specifies an existing media profile that the options shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetAudioOutputConfigurationOptionsResponse { + /** This message contains the audio output configuration options. If a audio output configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: AudioOutputConfigurationOptions; +} +export interface GetAudioDecoderConfigurationOptions { + /** Optional audio decoder configuration token that specifies an existing configuration that the options are intended for. */ + configurationToken?: ReferenceToken; + /** Optional ProfileToken that specifies an existing media profile that the options shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetAudioDecoderConfigurationOptionsResponse { + /** This message contains the audio decoder configuration options. If a audio decoder configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ + options?: AudioDecoderConfigurationOptions; +} +export interface GetGuaranteedNumberOfVideoEncoderInstances { + /** Token of the video source configuration */ + configurationToken?: ReferenceToken; +} +export interface GetGuaranteedNumberOfVideoEncoderInstancesResponse { + /** The minimum guaranteed total number of encoder instances (applications) per VideoSourceConfiguration. The device is able to deliver the TotalNumber of streams */ + totalNumber?: number; + /** If a device limits the number of instances for respective Video Codecs the response contains the information how many Jpeg streams can be set up at the same time per VideoSource. */ + JPEG?: number; + /** If a device limits the number of instances for respective Video Codecs the response contains the information how many H264 streams can be set up at the same time per VideoSource. */ + H264?: number; + /** If a device limits the number of instances for respective Video Codecs the response contains the information how many Mpeg4 streams can be set up at the same time per VideoSource. */ + MPEG4?: number; +} +export interface GetStreamUri { + /** Stream Setup that should be used with the uri */ + streamSetup?: StreamSetup; + /** The ProfileToken element indicates the media profile to use and will define the configuration of the content of the stream. */ + profileToken?: ReferenceToken; +} +export interface GetStreamUriResponse { + /**/ + mediaUri?: MediaUri; +} +export interface StartMulticastStreaming { + /** Contains the token of the Profile that is used to define the multicast stream. */ + profileToken?: ReferenceToken; +} +export interface StartMulticastStreamingResponse {} +export interface StopMulticastStreaming { + /** Contains the token of the Profile that is used to define the multicast stream. */ + profileToken?: ReferenceToken; +} +export interface StopMulticastStreamingResponse {} +export interface SetSynchronizationPoint { + /** Contains a Profile reference for which a Synchronization Point is requested. */ + profileToken?: ReferenceToken; +} +export interface SetSynchronizationPointResponse {} +export interface GetSnapshotUri { + /** The ProfileToken element indicates the media profile to use and will define the source and dimensions of the snapshot. */ + profileToken?: ReferenceToken; +} +export interface GetSnapshotUriResponse { + /**/ + mediaUri?: MediaUri; +} +export interface GetVideoSourceModes { + /** Contains a video source reference for which a video source mode is requested. */ + videoSourceToken?: ReferenceToken; +} +export interface GetVideoSourceModesResponse { + /** Return the information for specified video source mode. */ + videoSourceModes?: VideoSourceMode[]; +} +export interface SetVideoSourceMode { + /** Contains a video source reference for which a video source mode is requested. */ + videoSourceToken?: ReferenceToken; + /** Indicate video source mode. */ + videoSourceModeToken?: ReferenceToken; +} +export interface SetVideoSourceModeResponse { + /** The response contains information about rebooting after returning response. When Reboot is set true, a device will reboot automatically after setting mode. */ + reboot?: boolean; +} +export interface GetOSDs { + /** Token of the Video Source Configuration, which has OSDs associated with are requested. If token not exist, request all available OSDs. */ + configurationToken?: ReferenceToken; +} +export interface GetOSDsResponse { + /** This element contains a list of requested OSDs. */ + OSDs?: OSDConfiguration[]; +} +export interface GetOSD { + /** The GetOSD command fetches the OSD configuration if the OSD token is known. */ + OSDToken?: ReferenceToken; +} +export interface GetOSDResponse { + /** The requested OSD configuration. */ + OSD?: OSDConfiguration; +} +export interface SetOSD { + /** Contains the modified OSD configuration. */ + OSD?: OSDConfiguration; +} +export interface SetOSDResponse {} +export interface GetOSDOptions { + /** Video Source Configuration Token that specifies an existing video source configuration that the options shall be compatible with. */ + configurationToken?: ReferenceToken; +} +export interface GetOSDOptionsResponse { + /**/ + OSDOptions?: OSDConfigurationOptions; +} +export interface CreateOSD { + /** Contain the initial OSD configuration for create. */ + OSD?: OSDConfiguration; +} +export interface CreateOSDResponse { + /** Returns Token of the newly created OSD */ + OSDToken?: ReferenceToken; +} +export interface DeleteOSD { + /** This element contains a reference to the OSD configuration that should be deleted. */ + OSDToken?: ReferenceToken; +} +export interface DeleteOSDResponse {} diff --git a/src/interfaces/metadatastream.ts b/src/interfaces/metadatastream.ts new file mode 100644 index 00000000..113a0c02 --- /dev/null +++ b/src/interfaces/metadatastream.ts @@ -0,0 +1,206 @@ +import { + Transformation, + ColorDescriptor, + GeoLocation, + SphericalCoordinate, + Rectangle, + Vector, + Polygon, + PTZStatus, + GeoOrientation, +} from './common'; +import { HumanFace } from './humanface.2'; +import { HumanBody } from './humanbody.2'; +import { AnyURI } from './basics'; +import { Date } from './onvif'; + +export type VehicleType = 'Bus' | 'Car' | 'Truck' | 'Bicycle' | 'Motorcycle'; +export type PlateType = 'Normal' | 'Police' | 'Diplomat' | 'Temporary'; +export type BarcodeType = + | 'Code-39' + | 'Code-49' + | 'Code-93' + | 'Code-128' + | 'Code-11' + | 'Code-25-Interleaved' + | 'Code-25-NonInterleaved' + | 'DataMatrix' + | 'Maxicode' + | 'Postnet' + | 'RM4SCC' + | 'ISBN-13' + | 'ISBN-13-Dual' + | 'ISBN-10' + | 'ITF-14' + | 'EAN-2' + | 'EAN-2' + | 'EAN-8' + | 'EAN-13' + | 'EAN-14' + | 'EAN-18' + | 'EAN-99' + | 'EAN-128' + | 'SCC-14' + | 'SSCC-18' + | 'UPC-A' + | 'UPC-E' + | 'PDF417' + | 'QRCode'; +export type ObjectType = 'Animal' | 'HumanFace' | 'Human' | 'Bicycle' | 'Vehicle' | 'LicensePlate' | 'Bike' | 'Barcode'; +export type ClassType = 'Animal' | 'Face' | 'Human' | 'Vehical' | 'Other'; +export interface Appearance { + transformation?: Transformation; + shape?: ShapeDescriptor; + color?: ColorDescriptor; + class?: ClassDescriptor; + extension?: AppearanceExtension; + geoLocation?: GeoLocation; + vehicleInfo?: VehicleInfo[]; + licensePlateInfo?: LicensePlateInfo; + humanFace?: HumanFace; + humanBody?: HumanBody; + imageRef?: AnyURI; + image?: any; + barcodeInfo?: BarcodeInfo; + sphericalCoordinate?: SphericalCoordinate; +} +export interface AppearanceExtension {} +export interface BarcodeInfo { + /** Information encoded in barcode */ + data?: StringLikelihood; + /** Acceptable values are defined in tt:BarcodeType */ + type?: StringLikelihood; + /** Refers to the pixels per module */ + PPM?: number; +} +export interface VehicleInfo { + type?: StringLikelihood; + brand?: StringLikelihood; + model?: StringLikelihood; +} +export interface LicensePlateInfo { + /** A string of vehicle license plate number. */ + plateNumber?: StringLikelihood; + /** A description of the vehicle license plate, e.g., "Normal", "Police", "Diplomat" */ + plateType?: StringLikelihood; + /** Describe the country of the license plate, in order to avoid the same license plate number. */ + countryCode?: StringLikelihood; + /** State province or authority that issue the license plate. */ + issuingEntity?: StringLikelihood; +} +export interface ShapeDescriptor { + boundingBox?: Rectangle; + centerOfGravity?: Vector; + polygon?: Polygon[]; + extension?: ShapeDescriptorExtension; +} +export interface ShapeDescriptorExtension {} +export interface StringLikelihood {} +export interface ClassCandidate { + type?: ClassType; + likelihood?: number; +} +export interface ClassDescriptor { + classCandidate?: ClassCandidate[]; + extension?: ClassDescriptorExtension; + /** ONVIF recommends to use this 'Type' element instead of 'ClassCandidate' and 'Extension' above for new design. Acceptable values are defined in tt:ObjectType. */ + type?: StringLikelihood[]; +} +export interface ClassDescriptorExtension { + otherTypes?: OtherType[]; + extension?: ClassDescriptorExtension2; +} +export interface ClassDescriptorExtension2 {} +export interface OtherType { + /** Object Class Type */ + type?: string; + /** A likelihood/probability that the corresponding object belongs to this class. The sum of the likelihoods shall NOT exceed 1 */ + likelihood?: number; +} +export interface OnvifObject extends ObjectId { + appearance?: Appearance; + behaviour?: Behaviour; + extension?: ObjectExtension; +} +export interface ObjectExtension {} +export interface Frame { + utcTime: Date; + /** Default color space of Color definitions in frame. Valid values are "RGB" and "YCbCr". Defaults to "YCbCr". */ + colorspace?: string; + /** Optional name of the analytics module that generated this frame. */ + source?: string; + PTZStatus?: PTZStatus; + transformation?: Transformation; + object?: any[]; + objectTree?: ObjectTree; + extension?: FrameExtension; + sceneImageRef?: AnyURI; + sceneImage?: any; +} +export interface FrameExtension { + motionInCells?: MotionInCells; + extension?: FrameExtension2; +} +export interface FrameExtension2 {} +export interface Merge { + from?: ObjectId[]; + to?: ObjectId; +} +export interface Split { + from?: ObjectId; + to?: ObjectId[]; +} +export interface Rename { + from?: ObjectId; + to?: ObjectId; +} +export interface ObjectId { + objectId?: number; +} +export interface Removed {} +export interface Idle {} +export interface Behaviour { + removed?: Removed; + idle?: Idle; + extension?: BehaviourExtension; + speed?: number; + /** Direction the object is moving. Yaw describes the horizontal direction in the range [-180..180] where 0 is towards the right of the device and 90 is away from the device. Pitch describes the vertical direction in the range [-90..90] where 90 is upwards. */ + direction?: GeoOrientation; +} +export interface BehaviourExtension {} +export interface ObjectTree { + rename?: Rename[]; + split?: Split[]; + merge?: Merge[]; + delete?: ObjectId[]; + extension?: ObjectTreeExtension; +} +export interface ObjectTreeExtension {} +export interface MotionInCells { + /** Number of columns of the cell grid (x dimension) */ + columns: number; + /** Number of rows of the cell grid (y dimension) */ + rows: number; + /** A “1” denotes a cell where motion is detected and a “0” an empty cell. The first cell is in the upper left corner. Then the cell order goes first from left to right and then from up to down. If the number of cells is not a multiple of 8 the last byte is filled with zeros. The information is run length encoded according to Packbit coding in ISO 12369 (TIFF, Revision 6.0). */ + cells: any; +} +export interface MetadataStream {} +export interface MetadataStreamExtension { + audioAnalyticsStream?: AudioAnalyticsStream; + extension?: MetadataStreamExtension2; +} +export interface MetadataStreamExtension2 {} +export interface AudioAnalyticsStream { + audioDescriptor?: AudioDescriptor[]; + extension?: AudioAnalyticsStreamExtension; +} +export interface AudioDescriptor { + utcTime: Date; +} +export interface AudioAnalyticsStreamExtension {} +export interface VideoAnalyticsStream {} +export interface VideoAnalyticsStreamExtension {} +export interface PTZStream {} +export interface PTZStreamExtension {} +export interface EventStream {} +export interface EventStreamExtension {} diff --git a/src/interfaces/onvif.ts b/src/interfaces/onvif.ts new file mode 100644 index 00000000..57f6fad5 --- /dev/null +++ b/src/interfaces/onvif.ts @@ -0,0 +1,3264 @@ +import { + ReferenceToken, + IntRange, + Vector2D, + Vector1D, + PTZVector, + MoveStatus, + Rectangle, + Vector, + Transformation, + Color, +} from './common'; +import { AnyURI, FilterType } from './basics'; + +/** User readable name. Length up to 64 characters. */ +export type Name = string; +export type IntList = number[]; +export type FloatList = number[]; +export type StringAttrList = string[]; +export type StringList = string[]; +export type ReferenceTokenList = ReferenceToken[]; +export type RotateMode = 'OFF' | 'ON' | 'AUTO'; +export type SceneOrientationMode = 'MANUAL' | 'AUTO'; +export type SceneOrientationOption = 'Below' | 'Horizon' | 'Above'; +/** Source view modes supported by device. */ +export type ViewModes = + | 'tt:Fisheye' + | 'tt:360Panorama' + | 'tt:180Panorama' + | 'tt:Quad' + | 'tt:Original' + | 'tt:LeftHalf' + | 'tt:RightHalf' + | 'tt:Dewarp'; +export type VideoEncoding = 'JPEG' | 'MPEG4' | 'H264'; +export type Mpeg4Profile = 'SP' | 'ASP'; +export type H264Profile = 'Baseline' | 'Main' | 'Extended' | 'High'; +/** Video Media Subtypes as referenced by IANA (without the leading "video/" Video Media Type). See also IANA Media Types. */ +export type VideoEncodingMimeNames = 'JPEG' | 'MPV4-ES' | 'H264' | 'H265'; +export type VideoEncodingProfiles = 'Simple' | 'AdvancedSimple' | 'Baseline' | 'Main' | 'Main10' | 'Extended' | 'High'; +export type AudioEncoding = 'G711' | 'G726' | 'AAC'; +/** Audio Media Subtypes as referenced by IANA (without the leading "audio/" Audio Media Type and except for the audio types defined in the restriction). See also IANA Media Types. */ +export type AudioEncodingMimeNames = 'PCMU' | 'G726' | 'MP4A-LATM' | 'mpeg4-generic'; +export type MetadataCompressionType = 'None' | 'GZIP' | 'EXI'; +export type StreamType = 'RTP-Unicast' | 'RTP-Multicast'; +export type TransportProtocol = 'UDP' | 'TCP' | 'RTSP' | 'HTTP'; +export type ScopeDefinition = 'Fixed' | 'Configurable'; +export type DiscoveryMode = 'Discoverable' | 'NonDiscoverable'; +export type NetworkInterfaceConfigPriority = number; +export type Duplex = 'Full' | 'Half'; +export type IANAIfTypes = number; +export type IPv6DHCPConfiguration = 'Auto' | 'Stateful' | 'Stateless' | 'Off'; +export type NetworkProtocolType = 'HTTP' | 'HTTPS' | 'RTSP'; +export type NetworkHostType = 'IPv4' | 'IPv6' | 'DNS'; +export type IPv4Address = string; +export type IPv6Address = string; +export type HwAddress = string; +export type IPType = 'IPv4' | 'IPv6'; +export type DNSName = string; +export type Domain = string; +export type IPAddressFilterType = 'Allow' | 'Deny'; +export type DynamicDNSType = 'NoUpdate' | 'ClientUpdates' | 'ServerUpdates'; +export type Dot11SSIDType = any; +export type Dot11StationMode = 'Ad-hoc' | 'Infrastructure' | 'Extended'; +export type Dot11SecurityMode = 'None' | 'WEP' | 'PSK' | 'Dot1X' | 'Extended'; +export type Dot11Cipher = 'CCMP' | 'TKIP' | 'Any' | 'Extended'; +export type Dot11PSK = any; +export type Dot11PSKPassphrase = string; +export type Dot11SignalStrength = 'None' | 'Very Bad' | 'Bad' | 'Good' | 'Very Good' | 'Extended'; +export type Dot11AuthAndMangementSuite = 'None' | 'Dot1X' | 'PSK' | 'Extended'; +export type CapabilityCategory = 'All' | 'Analytics' | 'Device' | 'Events' | 'Imaging' | 'Media' | 'PTZ'; +/** Enumeration describing the available system log modes. */ +export type SystemLogType = 'System' | 'Access'; +/** Enumeration describing the available factory default modes. */ +export type FactoryDefaultType = 'Hard' | 'Soft'; +export type SetDateTimeType = 'Manual' | 'NTP'; +export type UserLevel = 'Administrator' | 'Operator' | 'User' | 'Anonymous' | 'Extended'; +export type RelayLogicalState = 'active' | 'inactive'; +export type RelayIdleState = 'closed' | 'open'; +export type RelayMode = 'Monostable' | 'Bistable'; +export type DigitalIdleState = 'closed' | 'open'; +export type EFlipMode = 'OFF' | 'ON' | 'Extended'; +export type ReverseMode = 'OFF' | 'ON' | 'AUTO' | 'Extended'; +export type AuxiliaryData = string; +export type PTZPresetTourState = 'Idle' | 'Touring' | 'Paused' | 'Extended'; +export type PTZPresetTourDirection = 'Forward' | 'Backward' | 'Extended'; +export type PTZPresetTourOperation = 'Start' | 'Stop' | 'Pause' | 'Extended'; +export type MoveAndTrackMethod = 'PresetToken' | 'GeoLocation' | 'PTZVector' | 'ObjectID'; +export type AutoFocusMode = 'AUTO' | 'MANUAL'; +export type AFModes = 'OnceAfterMove'; +export type WideDynamicMode = 'OFF' | 'ON'; +/** Enumeration describing the available backlight compenstation modes. */ +export type BacklightCompensationMode = 'OFF' | 'ON'; +export type ExposurePriority = 'LowNoise' | 'FrameRate'; +export type ExposureMode = 'AUTO' | 'MANUAL'; +export type Enabled = 'ENABLED' | 'DISABLED'; +export type WhiteBalanceMode = 'AUTO' | 'MANUAL'; +export type IrCutFilterMode = 'ON' | 'OFF' | 'AUTO'; +export type ImageStabilizationMode = 'OFF' | 'ON' | 'AUTO' | 'Extended'; +export type IrCutFilterAutoBoundaryType = 'Common' | 'ToOn' | 'ToOff' | 'Extended'; +export type ToneCompensationMode = 'OFF' | 'ON' | 'AUTO'; +export type DefoggingMode = 'OFF' | 'ON' | 'AUTO'; +export type ImageSendingType = 'Embedded' | 'LocalStorage' | 'RemoteStorage'; +export type PropertyOperation = 'Initialized' | 'Deleted' | 'Changed'; +export type Direction = 'Left' | 'Right' | 'Any'; +/** Specifies a receiver connection mode. */ +export type ReceiverMode = 'AutoConnect' | 'AlwaysConnect' | 'NeverConnect' | 'Unknown'; +/** Specifies the current connection state of the receiver. */ +export type ReceiverState = 'NotConnected' | 'Connecting' | 'Connected' | 'Unknown'; +export type ReceiverReference = ReferenceToken; +export type RecordingReference = ReferenceToken; +export type TrackReference = ReferenceToken; +export type Description = string; +export type XPathExpression = string; +export type SearchState = 'Queued' | 'Searching' | 'Completed' | 'Unknown'; +export type JobToken = ReferenceToken; +export type TargetFormat = 'MP4' | 'CMAF'; +export type EncryptionMode = 'CENC' | 'CBCS'; +export type RecordingStatus = 'Initiated' | 'Recording' | 'Stopped' | 'Removing' | 'Removed' | 'Unknown'; +export type TrackType = 'Video' | 'Audio' | 'Metadata' | 'Extended'; +export type RecordingJobReference = ReferenceToken; +export type RecordingJobMode = string; +export type RecordingJobState = string; +export type ModeOfOperation = 'Idle' | 'Active' | 'Unknown'; +/** + * AudioClassType acceptable values are; + * gun_shot, scream, glass_breaking, tire_screech + */ +export type AudioClassType = 'gun_shot' | 'scream' | 'glass_breaking' | 'tire_screech'; +export type AudioClassification = 'GunShot' | 'Scream' | 'GlassBreaking' | 'TireScreech' | 'Alarm'; +export type OSDType = 'Text' | 'Image' | 'Extended'; +/** Base class for physical entities like inputs and outputs. */ +export interface DeviceEntity { + /** Unique identifier referencing the physical entity. */ + token: ReferenceToken; +} +/** Rectangle defined by lower left corner position and size. Units are pixel. */ +export interface IntRectangle { + x: number; + y: number; + width: number; + height: number; +} +/** Range of a rectangle. The rectangle itself is defined by lower left corner position and size. Units are pixel. */ +export interface IntRectangleRange { + /** Range of X-axis. */ + XRange?: IntRange; + /** Range of Y-axis. */ + YRange?: IntRange; + /** Range of width. */ + widthRange?: IntRange; + /** Range of height. */ + heightRange?: IntRange; +} +/** Range of values greater equal Min value and less equal Max value. */ +export interface FloatRange { + min?: number; + max?: number; +} +/** Range of duration greater equal Min duration and less equal Max duration. */ +export interface DurationRange { + min?: any; + max?: any; +} +/** List of values. */ +export interface IntItems { + items?: number[]; +} +export interface FloatItems { + items?: number[]; +} +export interface AnyHolder {} +/** Representation of a physical video input. */ +export interface VideoSource extends DeviceEntity { + /** Frame rate in frames per second. */ + framerate?: number; + /** Horizontal and vertical resolution */ + resolution?: VideoResolution; + /** Optional configuration of the image sensor. */ + imaging?: ImagingSettings; + extension?: VideoSourceExtension; +} +export interface VideoSourceExtension { + /** Optional configuration of the image sensor. To be used if imaging service 2.00 is supported. */ + imaging?: ImagingSettings20; + extension?: VideoSourceExtension2; +} +export interface VideoSourceExtension2 {} +/** Representation of a physical audio input. */ +export interface AudioSource extends DeviceEntity { + /** number of available audio channels. (1: mono, 2: stereo) */ + channels?: number; +} +/** + * A media profile consists of a set of media configurations. Media profiles are used by a client + * to configure properties of a media stream from an NVT. + * An NVT shall provide at least one media profile at boot. An NVT should provide “ready to use” + * profiles for the most common media configurations that the device offers. + * A profile consists of a set of interconnected configuration entities. Configurations are provided + * by the NVT and can be either static or created dynamically by the NVT. For example, the + * dynamic configurations can be created by the NVT depending on current available encoding + * resources. + */ +export interface Profile { + /** Unique identifier of the profile. */ + token: ReferenceToken; + /** A value of true signals that the profile cannot be deleted. Default is false. */ + fixed?: boolean; + /** User readable name of the profile. */ + name?: Name; + /** Optional configuration of the Video input. */ + videoSourceConfiguration?: VideoSourceConfiguration; + /** Optional configuration of the Audio input. */ + audioSourceConfiguration?: AudioSourceConfiguration; + /** Optional configuration of the Video encoder. */ + videoEncoderConfiguration?: VideoEncoderConfiguration; + /** Optional configuration of the Audio encoder. */ + audioEncoderConfiguration?: AudioEncoderConfiguration; + /** Optional configuration of the video analytics module and rule engine. */ + videoAnalyticsConfiguration?: VideoAnalyticsConfiguration; + /** Optional configuration of the pan tilt zoom unit. */ + PTZConfiguration?: PTZConfiguration; + /** Optional configuration of the metadata stream. */ + metadataConfiguration?: MetadataConfiguration; + /** Extensions defined in ONVIF 2.0 */ + extension?: ProfileExtension; +} +export interface ProfileExtension { + /** Optional configuration of the Audio output. */ + audioOutputConfiguration?: AudioOutputConfiguration; + /** Optional configuration of the Audio decoder. */ + audioDecoderConfiguration?: AudioDecoderConfiguration; + extension?: ProfileExtension2; +} +export interface ProfileExtension2 {} +/** Base type defining the common properties of a configuration. */ +export interface ConfigurationEntity { + /** Token that uniquely references this configuration. Length up to 64 characters. */ + token: ReferenceToken; + /** User readable name. Length up to 64 characters. */ + name?: Name; + /** Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service. */ + useCount?: number; +} +export interface VideoSourceConfiguration extends ConfigurationEntity { + /** Reference to the physical input. */ + sourceToken?: ReferenceToken; + /** Rectangle specifying the Video capturing area. The capturing area shall not be larger than the whole Video source area. */ + bounds?: IntRectangle; + extension?: VideoSourceConfigurationExtension; +} +export interface VideoSourceConfigurationExtension { + /** + * Optional element to configure rotation of captured image. + * What resolutions a device supports shall be unaffected by the Rotate parameters. + * If a device is configured with Rotate=AUTO, the device shall take control over the Degree parameter and automatically update it so that a client can query current rotation. + * The device shall automatically apply the same rotation to its pan/tilt control direction depending on the following condition: + * if Reverse=AUTO in PTControlDirection or if the device doesn’t support Reverse in PTControlDirection + */ + rotate?: Rotate; + extension?: VideoSourceConfigurationExtension2; +} +export interface VideoSourceConfigurationExtension2 { + /** Optional element describing the geometric lens distortion. Multiple instances for future variable lens support. */ + lensDescription?: LensDescription[]; + /** Optional element describing the scene orientation in the camera’s field of view. */ + sceneOrientation?: SceneOrientation; +} +export interface Rotate { + /** Parameter to enable/disable Rotation feature. */ + mode?: RotateMode; + /** Optional parameter to configure how much degree of clockwise rotation of image for On mode. Omitting this parameter for On mode means 180 degree rotation. */ + degree?: number; + extension?: RotateExtension; +} +export interface RotateExtension {} +export interface LensProjection { + /** Angle of incidence. */ + angle?: number; + /** Mapping radius as a consequence of the emergent angle. */ + radius?: number; + /** Optional ray absorption at the given angle due to vignetting. A value of one means no absorption. */ + transmittance?: number; +} +export interface LensOffset { + /** Optional horizontal offset of the lens center in normalized coordinates. */ + x?: number; + /** Optional vertical offset of the lens center in normalized coordinates. */ + y?: number; +} +export interface LensDescription { + /** Optional focal length of the optical system. */ + focalLength?: number; + /** Offset of the lens center to the imager center in normalized coordinates. */ + offset?: LensOffset; + /** + * Radial description of the projection characteristics. The resulting curve is defined by the B-Spline interpolation + * over the given elements. The element for Radius zero shall not be provided. The projection points shall be ordered with ascending Radius. + * Items outside the last projection Radius shall be assumed to be invisible (black). + */ + projection?: LensProjection[]; + /** Compensation of the x coordinate needed for the ONVIF normalized coordinate system. */ + XFactor?: number; +} +export interface VideoSourceConfigurationOptions { + /** Maximum number of profiles. */ + maximumNumberOfProfiles?: number; + /** + * Supported range for the capturing area. + * Device that does not support cropped streaming shall express BoundsRange option as mentioned below + * BoundsRange->XRange and BoundsRange->YRange with same Min/Max values HeightRange and WidthRange Min/Max values same as VideoSource Height and Width Limits. + */ + boundsRange?: IntRectangleRange; + /** List of physical inputs. */ + videoSourceTokensAvailable?: ReferenceToken[]; + extension?: VideoSourceConfigurationOptionsExtension; +} +export interface VideoSourceConfigurationOptionsExtension { + /** Options of parameters for Rotation feature. */ + rotate?: RotateOptions; + extension?: VideoSourceConfigurationOptionsExtension2; +} +export interface VideoSourceConfigurationOptionsExtension2 { + /** Scene orientation modes supported by the device for this configuration. */ + sceneOrientationMode?: SceneOrientationMode[]; +} +export interface RotateOptions { + /** + * Signals if a device requires a reboot after changing the rotation. + * If a device can handle rotation changes without rebooting this value shall be set to false. + */ + reboot?: boolean; + /** Supported options of Rotate mode parameter. */ + mode?: RotateMode[]; + /** List of supported degree value for rotation. */ + degreeList?: IntItems; + extension?: RotateOptionsExtension; +} +export interface RotateOptionsExtension {} +export interface SceneOrientation { + /** Parameter to assign the way the camera determines the scene orientation. */ + mode?: SceneOrientationMode; + /** + * Assigned or determined scene orientation based on the Mode. When assigning the Mode to AUTO, this field + * is optional and will be ignored by the device. When assigning the Mode to MANUAL, this field is required + * and the device will return an InvalidArgs fault if missing. + */ + orientation?: string; +} +export interface VideoEncoderConfiguration extends ConfigurationEntity { + /** Used video codec, either Jpeg, H.264 or Mpeg4 */ + encoding?: VideoEncoding; + /** Configured video resolution */ + resolution?: VideoResolution; + /** Relative value for the video quantizers and the quality of the video. A high value within supported quality range means higher quality */ + quality?: number; + /** Optional element to configure rate control related parameters. */ + rateControl?: VideoRateControl; + /** Optional element to configure Mpeg4 related parameters. */ + MPEG4?: Mpeg4Configuration; + /** Optional element to configure H.264 related parameters. */ + H264?: H264Configuration; + /** Defines the multicast settings that could be used for video streaming. */ + multicast?: MulticastConfiguration; + /** The rtsp session timeout for the related video stream */ + sessionTimeout?: any; +} +export interface VideoResolution { + /** Number of the columns of the Video image. */ + width?: number; + /** Number of the lines of the Video image. */ + height?: number; +} +export interface VideoRateControl { + /** Maximum output framerate in fps. If an EncodingInterval is provided the resulting encoded framerate will be reduced by the given factor. */ + frameRateLimit?: number; + /** Interval at which images are encoded and transmitted. (A value of 1 means that every frame is encoded, a value of 2 means that every 2nd frame is encoded ...) */ + encodingInterval?: number; + /** the maximum output bitrate in kbps */ + bitrateLimit?: number; +} +export interface Mpeg4Configuration { + /** Determines the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames. */ + govLength?: number; + /** the Mpeg4 profile, either simple profile (SP) or advanced simple profile (ASP) */ + mpeg4Profile?: Mpeg4Profile; +} +export interface H264Configuration { + /** Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames. */ + govLength?: number; + /** the H.264 profile, either baseline, main, extended or high */ + H264Profile?: H264Profile; +} +export interface VideoEncoderConfigurationOptions { + /** Indicates the support for the GuaranteedFrameRate attribute on the VideoEncoderConfiguration element. */ + guaranteedFrameRateSupported?: boolean; + /** Range of the quality values. A high value means higher quality. */ + qualityRange?: IntRange; + /** Optional JPEG encoder settings ranges (See also Extension element). */ + JPEG?: JpegOptions; + /** Optional MPEG-4 encoder settings ranges (See also Extension element). */ + MPEG4?: Mpeg4Options; + /** Optional H.264 encoder settings ranges (See also Extension element). */ + H264?: H264Options; + extension?: VideoEncoderOptionsExtension; +} +export interface VideoEncoderOptionsExtension { + /** Optional JPEG encoder settings ranges. */ + JPEG?: JpegOptions2; + /** Optional MPEG-4 encoder settings ranges. */ + MPEG4?: Mpeg4Options2; + /** Optional H.264 encoder settings ranges. */ + H264?: H264Options2; + extension?: VideoEncoderOptionsExtension2; +} +export interface VideoEncoderOptionsExtension2 {} +export interface JpegOptions { + /** List of supported image sizes. */ + resolutionsAvailable?: VideoResolution[]; + /** Supported frame rate in fps (frames per second). */ + frameRateRange?: IntRange; + /** Supported encoding interval range. The encoding interval corresponds to the number of frames devided by the encoded frames. An encoding interval value of "1" means that all frames are encoded. */ + encodingIntervalRange?: IntRange; +} +export interface JpegOptions2 extends JpegOptions { + /** Supported range of encoded bitrate in kbps. */ + bitrateRange?: IntRange; +} +export interface Mpeg4Options { + /** List of supported image sizes. */ + resolutionsAvailable?: VideoResolution[]; + /** Supported group of Video frames length. This value typically corresponds to the I-Frame distance. */ + govLengthRange?: IntRange; + /** Supported frame rate in fps (frames per second). */ + frameRateRange?: IntRange; + /** Supported encoding interval range. The encoding interval corresponds to the number of frames devided by the encoded frames. An encoding interval value of "1" means that all frames are encoded. */ + encodingIntervalRange?: IntRange; + /** List of supported MPEG-4 profiles. */ + mpeg4ProfilesSupported?: Mpeg4Profile[]; +} +export interface Mpeg4Options2 extends Mpeg4Options { + /** Supported range of encoded bitrate in kbps. */ + bitrateRange?: IntRange; +} +export interface H264Options { + /** List of supported image sizes. */ + resolutionsAvailable?: VideoResolution[]; + /** Supported group of Video frames length. This value typically corresponds to the I-Frame distance. */ + govLengthRange?: IntRange; + /** Supported frame rate in fps (frames per second). */ + frameRateRange?: IntRange; + /** Supported encoding interval range. The encoding interval corresponds to the number of frames devided by the encoded frames. An encoding interval value of "1" means that all frames are encoded. */ + encodingIntervalRange?: IntRange; + /** List of supported H.264 profiles. */ + H264ProfilesSupported?: H264Profile[]; +} +export interface H264Options2 extends H264Options { + /** Supported range of encoded bitrate in kbps. */ + bitrateRange?: IntRange; +} +export interface VideoEncoder2Configuration extends ConfigurationEntity { + /** Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types. */ + encoding?: string; + /** Configured video resolution */ + resolution?: VideoResolution2; + /** Optional element to configure rate control related parameters. */ + rateControl?: VideoRateControl2; + /** Defines the multicast settings that could be used for video streaming. */ + multicast?: MulticastConfiguration; + /** Relative value for the video quantizers and the quality of the video. A high value within supported quality range means higher quality */ + quality?: number; +} +export interface VideoResolution2 { + /** Number of the columns of the Video image. */ + width?: number; + /** Number of the lines of the Video image. */ + height?: number; +} +export interface VideoRateControl2 { + /** Enforce constant bitrate. */ + constantBitRate?: boolean; + /** Desired frame rate in fps. The actual rate may be lower due to e.g. performance limitations. */ + frameRateLimit?: number; + /** the maximum output bitrate in kbps */ + bitrateLimit?: number; +} +export interface VideoEncoder2ConfigurationOptions { + /** Exactly two values, which define the Lower and Upper bounds for the supported group of Video frames length. These values typically correspond to the I-Frame distance. */ + govLengthRange?: IntList; + /** Signals support for B-Frames. Upper bound for the supported anchor frame distance (must be larger than one). */ + maxAnchorFrameDistance?: number; + /** List of supported target frame rates in fps (frames per second). The list shall be sorted with highest values first. */ + frameRatesSupported?: FloatList; + /** List of supported encoder profiles as defined in tt::VideoEncodingProfiles. */ + profilesSupported?: StringAttrList; + /** Signal whether enforcing constant bitrate is supported. */ + constantBitRateSupported?: boolean; + /** Indicates the support for the GuaranteedFrameRate attribute on the VideoEncoder2Configuration element. */ + guaranteedFrameRateSupported?: boolean; + /** Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types. */ + encoding?: string; + /** Range of the quality values. A high value means higher quality. */ + qualityRange?: FloatRange; + /** List of supported image sizes. */ + resolutionsAvailable?: VideoResolution2[]; + /** Supported range of encoded bitrate in kbps. */ + bitrateRange?: IntRange; +} +export interface AudioSourceConfiguration extends ConfigurationEntity { + /** Token of the Audio Source the configuration applies to */ + sourceToken?: ReferenceToken; +} +export interface AudioSourceConfigurationOptions { + /** Tokens of the audio source the configuration can be used for. */ + inputTokensAvailable?: ReferenceToken[]; + extension?: AudioSourceOptionsExtension; +} +export interface AudioSourceOptionsExtension {} +export interface AudioEncoderConfiguration extends ConfigurationEntity { + /** Audio codec used for encoding the audio input (either G.711, G.726 or AAC) */ + encoding?: AudioEncoding; + /** The output bitrate in kbps. */ + bitrate?: number; + /** The output sample rate in kHz. */ + sampleRate?: number; + /** Defines the multicast settings that could be used for video streaming. */ + multicast?: MulticastConfiguration; + /** The rtsp session timeout for the related audio stream */ + sessionTimeout?: any; +} +export interface AudioEncoderConfigurationOptions { + /** list of supported AudioEncoderConfigurations */ + options?: AudioEncoderConfigurationOption[]; +} +export interface AudioEncoderConfigurationOption { + /** The enoding used for audio data (either G.711, G.726 or AAC) */ + encoding?: AudioEncoding; + /** List of supported bitrates in kbps for the specified Encoding */ + bitrateList?: IntItems; + /** List of supported Sample Rates in kHz for the specified Encoding */ + sampleRateList?: IntItems; +} +export interface AudioEncoder2Configuration extends ConfigurationEntity { + /** Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and IANA Media Types. */ + encoding?: string; + /** Optional multicast configuration of the audio stream. */ + multicast?: MulticastConfiguration; + /** The output bitrate in kbps. */ + bitrate?: number; + /** The output sample rate in kHz. */ + sampleRate?: number; +} +export interface AudioEncoder2ConfigurationOptions { + /** Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and IANA Media Types. */ + encoding?: string; + /** List of supported bitrates in kbps for the specified Encoding */ + bitrateList?: IntItems; + /** List of supported Sample Rates in kHz for the specified Encoding */ + sampleRateList?: IntItems; +} +export interface VideoAnalyticsConfiguration extends ConfigurationEntity { + analyticsEngineConfiguration?: AnalyticsEngineConfiguration; + ruleEngineConfiguration?: RuleEngineConfiguration; +} +export interface MetadataConfiguration extends ConfigurationEntity { + /** optional element to configure which PTZ related data is to include in the metadata stream */ + PTZStatus?: PTZFilter; + /** + * Optional element to configure the streaming of events. A client might be interested in receiving all, + * none or some of the events produced by the device: + * To get all events: Include the Events element but do not include a filter. + * To get no events: Do not include the Events element. + * To get only some events: Include the Events element and include a filter in the element. + * + */ + events?: EventSubscription; + /** Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) */ + analytics?: boolean; + /** Defines the multicast settings that could be used for video streaming. */ + multicast?: MulticastConfiguration; + /** The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) */ + sessionTimeout?: any; + /** + * Indication which AnalyticsModules shall output metadata. + * Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration. + */ + analyticsEngineConfiguration?: AnalyticsEngineConfiguration; + extension?: MetadataConfigurationExtension; +} +export interface MetadataConfigurationExtension {} +export interface PTZFilter { + /** True if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN) */ + status?: boolean; + /** True if the metadata stream shall contain the PTZ position */ + position?: boolean; +} +export interface SubscriptionPolicy {} +/** Subcription handling in the same way as base notification subscription. */ +export interface EventSubscription { + filter?: any; + subscriptionPolicy?: SubscriptionPolicy; +} +export interface MetadataConfigurationOptions { + /** True if the device is able to stream the Geo Located positions of each target. */ + geoLocation?: boolean; + /** A device signalling support for content filtering shall support expressions with the provided expression size. */ + maxContentFilterSize?: number; + PTZStatusFilterOptions?: PTZStatusFilterOptions; + extension?: MetadataConfigurationOptionsExtension; +} +export interface MetadataConfigurationOptionsExtension { + /** List of supported metadata compression type. Its options shall be chosen from tt:MetadataCompressionType. */ + compressionType?: string[]; + extension?: MetadataConfigurationOptionsExtension2; +} +export interface MetadataConfigurationOptionsExtension2 {} +export interface PTZStatusFilterOptions { + /** True if the device is able to stream pan or tilt status information. */ + panTiltStatusSupported?: boolean; + /** True if the device is able to stream zoom status inforamtion. */ + zoomStatusSupported?: boolean; + /** True if the device is able to stream the pan or tilt position. */ + panTiltPositionSupported?: boolean; + /** True if the device is able to stream zoom position information. */ + zoomPositionSupported?: boolean; + extension?: PTZStatusFilterOptionsExtension; +} +export interface PTZStatusFilterOptionsExtension {} +/** Representation of a physical video outputs. */ +export interface VideoOutput extends DeviceEntity { + layout?: Layout; + /** Resolution of the display in Pixel. */ + resolution?: VideoResolution; + /** Refresh rate of the display in Hertz. */ + refreshRate?: number; + /** Aspect ratio of the display as physical extent of width divided by height. */ + aspectRatio?: number; + extension?: VideoOutputExtension; +} +export interface VideoOutputExtension {} +export interface VideoOutputConfiguration extends ConfigurationEntity { + /** Token of the Video Output the configuration applies to */ + outputToken?: ReferenceToken; +} +export interface VideoOutputConfigurationOptions {} +export interface VideoDecoderConfigurationOptions { + /** If the device is able to decode Jpeg streams this element describes the supported codecs and configurations */ + jpegDecOptions?: JpegDecOptions; + /** If the device is able to decode H.264 streams this element describes the supported codecs and configurations */ + H264DecOptions?: H264DecOptions; + /** If the device is able to decode Mpeg4 streams this element describes the supported codecs and configurations */ + mpeg4DecOptions?: Mpeg4DecOptions; + extension?: VideoDecoderConfigurationOptionsExtension; +} +export interface H264DecOptions { + /** List of supported H.264 Video Resolutions */ + resolutionsAvailable?: VideoResolution[]; + /** List of supported H264 Profiles (either baseline, main, extended or high) */ + supportedH264Profiles?: H264Profile[]; + /** Supported H.264 bitrate range in kbps */ + supportedInputBitrate?: IntRange; + /** Supported H.264 framerate range in fps */ + supportedFrameRate?: IntRange; +} +export interface JpegDecOptions { + /** List of supported Jpeg Video Resolutions */ + resolutionsAvailable?: VideoResolution[]; + /** Supported Jpeg bitrate range in kbps */ + supportedInputBitrate?: IntRange; + /** Supported Jpeg framerate range in fps */ + supportedFrameRate?: IntRange; +} +export interface Mpeg4DecOptions { + /** List of supported Mpeg4 Video Resolutions */ + resolutionsAvailable?: VideoResolution[]; + /** List of supported Mpeg4 Profiles (either SP or ASP) */ + supportedMpeg4Profiles?: Mpeg4Profile[]; + /** Supported Mpeg4 bitrate range in kbps */ + supportedInputBitrate?: IntRange; + /** Supported Mpeg4 framerate range in fps */ + supportedFrameRate?: IntRange; +} +export interface VideoDecoderConfigurationOptionsExtension {} +/** Representation of a physical audio outputs. */ +export interface AudioOutput extends DeviceEntity {} +export interface AudioOutputConfiguration extends ConfigurationEntity { + /** Token of the phsycial Audio output. */ + outputToken?: ReferenceToken; + /** + * An audio channel MAY support different types of audio transmission. While for full duplex + * operation no special handling is required, in half duplex operation the transmission direction + * needs to be switched. + * The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which + * direction is currently active. An NVC can switch between different modes by setting the + * AudioOutputConfiguration. + * The following modes for the Send-Primacy are defined: + * www.onvif.org/ver20/HalfDuplex/Server + * The server is allowed to send audio data to the client. The client shall not send + * audio data via the backchannel to the NVT in this mode. + * www.onvif.org/ver20/HalfDuplex/Client + * The client is allowed to send audio data via the backchannel to the server. The + * NVT shall not send audio data to the client in this mode. + * www.onvif.org/ver20/HalfDuplex/Auto + * It is up to the device how to deal with sending and receiving audio data. + * + * Acoustic echo cancellation is out of ONVIF scope. + */ + sendPrimacy?: AnyURI; + /** Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRange. */ + outputLevel?: number; +} +export interface AudioOutputConfigurationOptions { + /** Tokens of the physical Audio outputs (typically one). */ + outputTokensAvailable?: ReferenceToken[]; + /** + * An audio channel MAY support different types of audio transmission. While for full duplex + * operation no special handling is required, in half duplex operation the transmission direction + * needs to be switched. + * The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which + * direction is currently active. An NVC can switch between different modes by setting the + * AudioOutputConfiguration. + * The following modes for the Send-Primacy are defined: + * www.onvif.org/ver20/HalfDuplex/Server + * The server is allowed to send audio data to the client. The client shall not send + * audio data via the backchannel to the NVT in this mode. + * www.onvif.org/ver20/HalfDuplex/Client + * The client is allowed to send audio data via the backchannel to the server. The + * NVT shall not send audio data to the client in this mode. + * www.onvif.org/ver20/HalfDuplex/Auto + * It is up to the device how to deal with sending and receiving audio data. + * + * Acoustic echo cancellation is out of ONVIF scope. + */ + sendPrimacyOptions?: AnyURI[]; + /** Minimum and maximum level range supported for this Output. */ + outputLevelRange?: IntRange; +} +/** + * The Audio Decoder Configuration does not contain any that parameter to configure the + * decoding .A decoder shall decode every data it receives (according to its capabilities). + */ +export interface AudioDecoderConfiguration extends ConfigurationEntity {} +export interface AudioDecoderConfigurationOptions { + /** If the device is able to decode AAC encoded audio this section describes the supported configurations */ + AACDecOptions?: AACDecOptions; + /** If the device is able to decode G711 encoded audio this section describes the supported configurations */ + G711DecOptions?: G711DecOptions; + /** If the device is able to decode G726 encoded audio this section describes the supported configurations */ + G726DecOptions?: G726DecOptions; + extension?: AudioDecoderConfigurationOptionsExtension; +} +export interface G711DecOptions { + /** List of supported bitrates in kbps */ + bitrate?: IntItems; + /** List of supported sample rates in kHz */ + sampleRateRange?: IntItems; +} +export interface AACDecOptions { + /** List of supported bitrates in kbps */ + bitrate?: IntItems; + /** List of supported sample rates in kHz */ + sampleRateRange?: IntItems; +} +export interface G726DecOptions { + /** List of supported bitrates in kbps */ + bitrate?: IntItems; + /** List of supported sample rates in kHz */ + sampleRateRange?: IntItems; +} +export interface AudioDecoderConfigurationOptionsExtension {} +export interface MulticastConfiguration { + /** The multicast address (if this address is set to 0 no multicast streaming is enaled) */ + address?: IPAddress; + /** The RTP mutlicast destination port. A device may support RTCP. In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) destination port number as defined in the RTSP specification. */ + port?: number; + /** In case of IPv6 the TTL value is assumed as the hop limit. Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets from (endlessly) circulating and not limiting scope. In these cases the address contains the scope. */ + TTL?: number; + /** Read only property signalling that streaming is persistant. Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state. */ + autoStart?: boolean; +} +export interface StreamSetup { + /** Defines if a multicast or unicast stream is requested */ + stream?: StreamType; + transport?: Transport; +} +export interface Transport { + /** Defines the network protocol for streaming, either UDP=RTP/UDP, RTSP=RTP/RTSP/TCP or HTTP=RTP/RTSP/HTTP/TCP */ + protocol?: TransportProtocol; + /** Optional element to describe further tunnel options. This element is normally not needed */ + tunnel?: Transport; +} +export interface MediaUri { + /** Stable Uri to be used for requesting the media stream */ + uri?: AnyURI; + /** Indicates if the Uri is only valid until the connection is established. The value shall be set to "false". */ + invalidAfterConnect?: boolean; + /** Indicates if the Uri is invalid after a reboot of the device. The value shall be set to "false". */ + invalidAfterReboot?: boolean; + /** Duration how long the Uri is valid. This parameter shall be set to PT0S to indicate that this stream URI is indefinitely valid even if the profile changes */ + timeout?: any; +} +export interface Scope { + /** Indicates if the scope is fixed or configurable. */ + scopeDef?: ScopeDefinition; + /** Scope item URI. */ + scopeItem?: AnyURI; +} +export interface NetworkInterface extends DeviceEntity { + /** Indicates whether or not an interface is enabled. */ + enabled?: boolean; + /** Network interface information */ + info?: NetworkInterfaceInfo; + /** Link configuration. */ + link?: NetworkInterfaceLink; + /** IPv4 network interface configuration. */ + IPv4?: IPv4NetworkInterface; + /** IPv6 network interface configuration. */ + IPv6?: IPv6NetworkInterface; + extension?: NetworkInterfaceExtension; +} +export interface NetworkInterfaceExtension { + interfaceType?: IANAIfTypes; + /** Extension point prepared for future 802.3 configuration. */ + dot3?: Dot3Configuration[]; + dot11?: Dot11Configuration[]; + extension?: NetworkInterfaceExtension2; +} +export interface Dot3Configuration {} +export interface NetworkInterfaceExtension2 {} +export interface NetworkInterfaceLink { + /** Configured link settings. */ + adminSettings?: NetworkInterfaceConnectionSetting; + /** Current active link settings. */ + operSettings?: NetworkInterfaceConnectionSetting; + /** Integer indicating interface type, for example: 6 is ethernet. */ + interfaceType?: IANAIfTypes; +} +export interface NetworkInterfaceConnectionSetting { + /** Auto negotiation on/off. */ + autoNegotiation?: boolean; + /** Speed. */ + speed?: number; + /** Duplex type, Half or Full. */ + duplex?: Duplex; +} +export interface NetworkInterfaceInfo { + /** Network interface name, for example eth0. */ + name?: string; + /** Network interface MAC address. */ + hwAddress?: HwAddress; + /** Maximum transmission unit. */ + MTU?: number; +} +export interface IPv6NetworkInterface { + /** Indicates whether or not IPv6 is enabled. */ + enabled?: boolean; + /** IPv6 configuration. */ + config?: IPv6Configuration; +} +export interface IPv4NetworkInterface { + /** Indicates whether or not IPv4 is enabled. */ + enabled?: boolean; + /** IPv4 configuration. */ + config?: IPv4Configuration; +} +export interface IPv4Configuration { + /** List of manually added IPv4 addresses. */ + manual?: PrefixedIPv4Address[]; + /** Link local address. */ + linkLocal?: PrefixedIPv4Address; + /** IPv4 address configured by using DHCP. */ + fromDHCP?: PrefixedIPv4Address; + /** Indicates whether or not DHCP is used. */ + DHCP?: boolean; +} +export interface IPv6Configuration { + /** Indicates whether router advertisment is used. */ + acceptRouterAdvert?: boolean; + /** DHCP configuration. */ + DHCP?: IPv6DHCPConfiguration; + /** List of manually entered IPv6 addresses. */ + manual?: PrefixedIPv6Address[]; + /** List of link local IPv6 addresses. */ + linkLocal?: PrefixedIPv6Address[]; + /** List of IPv6 addresses configured by using DHCP. */ + fromDHCP?: PrefixedIPv6Address[]; + /** List of IPv6 addresses configured by using router advertisment. */ + fromRA?: PrefixedIPv6Address[]; + extension?: IPv6ConfigurationExtension; +} +export interface IPv6ConfigurationExtension {} +export interface NetworkProtocol { + /** Network protocol type string. */ + name?: NetworkProtocolType; + /** Indicates if the protocol is enabled or not. */ + enabled?: boolean; + /** The port that is used by the protocol. */ + port?: number[]; + extension?: NetworkProtocolExtension; +} +export interface NetworkProtocolExtension {} +export interface NetworkHost { + /** Network host type: IPv4, IPv6 or DNS. */ + type?: NetworkHostType; + /** IPv4 address. */ + IPv4Address?: IPv4Address; + /** IPv6 address. */ + IPv6Address?: IPv6Address; + /** DNS name. */ + DNSname?: DNSName; + extension?: NetworkHostExtension; +} +export interface NetworkHostExtension {} +export interface IPAddress { + /** Indicates if the address is an IPv4 or IPv6 address. */ + type?: IPType; + /** IPv4 address. */ + IPv4Address?: IPv4Address; + /** IPv6 address */ + IPv6Address?: IPv6Address; +} +export interface PrefixedIPv4Address { + /** IPv4 address */ + address?: IPv4Address; + /** Prefix/submask length */ + prefixLength?: number; +} +export interface PrefixedIPv6Address { + /** IPv6 address */ + address?: IPv6Address; + /** Prefix/submask length */ + prefixLength?: number; +} +export interface HostnameInformation { + /** Indicates whether the hostname has been obtained from DHCP or not. */ + fromDHCP?: boolean; + /** Indicates the device hostname or an empty string if no hostname has been assigned. */ + name?: string; + extension?: HostnameInformationExtension; +} +export interface HostnameInformationExtension {} +export interface DNSInformation { + /** Indicates whether or not DNS information is retrieved from DHCP. */ + fromDHCP?: boolean; + /** Search domain. */ + searchDomain?: string[]; + /** List of DNS addresses received from DHCP. */ + DNSFromDHCP?: IPAddress[]; + /** List of manually entered DNS addresses. */ + DNSManual?: IPAddress[]; + extension?: DNSInformationExtension; +} +export interface DNSInformationExtension {} +export interface NTPInformation { + /** Indicates if NTP information is to be retrieved by using DHCP. */ + fromDHCP?: boolean; + /** List of NTP addresses retrieved by using DHCP. */ + NTPFromDHCP?: NetworkHost[]; + /** List of manually entered NTP addresses. */ + NTPManual?: NetworkHost[]; + extension?: NTPInformationExtension; +} +export interface NTPInformationExtension {} +export interface DynamicDNSInformation { + /** Dynamic DNS type. */ + type?: DynamicDNSType; + /** DNS name. */ + name?: DNSName; + /** Time to live. */ + TTL?: any; + extension?: DynamicDNSInformationExtension; +} +export interface DynamicDNSInformationExtension {} +export interface NetworkInterfaceSetConfiguration { + /** Indicates whether or not an interface is enabled. */ + enabled?: boolean; + /** Link configuration. */ + link?: NetworkInterfaceConnectionSetting; + /** Maximum transmission unit. */ + MTU?: number; + /** IPv4 network interface configuration. */ + IPv4?: IPv4NetworkInterfaceSetConfiguration; + /** IPv6 network interface configuration. */ + IPv6?: IPv6NetworkInterfaceSetConfiguration; + extension?: NetworkInterfaceSetConfigurationExtension; +} +export interface NetworkInterfaceSetConfigurationExtension { + dot3?: Dot3Configuration[]; + dot11?: Dot11Configuration[]; + extension?: NetworkInterfaceSetConfigurationExtension2; +} +export interface IPv6NetworkInterfaceSetConfiguration { + /** Indicates whether or not IPv6 is enabled. */ + enabled?: boolean; + /** Indicates whether router advertisment is used. */ + acceptRouterAdvert?: boolean; + /** List of manually added IPv6 addresses. */ + manual?: PrefixedIPv6Address[]; + /** DHCP configuration. */ + DHCP?: IPv6DHCPConfiguration; +} +export interface IPv4NetworkInterfaceSetConfiguration { + /** Indicates whether or not IPv4 is enabled. */ + enabled?: boolean; + /** List of manually added IPv4 addresses. */ + manual?: PrefixedIPv4Address[]; + /** Indicates whether or not DHCP is used. */ + DHCP?: boolean; +} +export interface NetworkGateway { + /** IPv4 address string. */ + IPv4Address?: IPv4Address[]; + /** IPv6 address string. */ + IPv6Address?: IPv6Address[]; +} +export interface NetworkZeroConfiguration { + /** Unique identifier of network interface. */ + interfaceToken?: ReferenceToken; + /** Indicates whether the zero-configuration is enabled or not. */ + enabled?: boolean; + /** The zero-configuration IPv4 address(es) */ + addresses?: IPv4Address[]; + extension?: NetworkZeroConfigurationExtension; +} +export interface NetworkZeroConfigurationExtension { + /** Optional array holding the configuration for the second and possibly further interfaces. */ + additional?: NetworkZeroConfiguration[]; + extension?: NetworkZeroConfigurationExtension2; +} +export interface NetworkZeroConfigurationExtension2 {} +export interface IPAddressFilter { + type?: IPAddressFilterType; + IPv4Address?: PrefixedIPv4Address[]; + IPv6Address?: PrefixedIPv6Address[]; + extension?: IPAddressFilterExtension; +} +export interface IPAddressFilterExtension {} +export interface Dot11Configuration { + SSID?: Dot11SSIDType; + mode?: Dot11StationMode; + alias?: Name; + priority?: NetworkInterfaceConfigPriority; + security?: Dot11SecurityConfiguration; +} +export interface Dot11SecurityConfiguration { + mode?: Dot11SecurityMode; + algorithm?: Dot11Cipher; + PSK?: Dot11PSKSet; + dot1X?: ReferenceToken; + extension?: Dot11SecurityConfigurationExtension; +} +export interface Dot11SecurityConfigurationExtension {} +export interface Dot11PSKSet { + /** + * According to IEEE802.11-2007 H.4.1 the RSNA PSK consists of 256 bits, or 64 octets when represented in hex + * Either Key or Passphrase shall be given, if both are supplied Key shall be used by the device and Passphrase ignored. + */ + key?: Dot11PSK; + /** + * According to IEEE802.11-2007 H.4.1 a pass-phrase is a sequence of between 8 and 63 ASCII-encoded characters and + * each character in the pass-phrase must have an encoding in the range of 32 to 126 (decimal),inclusive. + * If only Passpharse is supplied the Key shall be derived using the algorithm described in IEEE802.11-2007 section H.4 + */ + passphrase?: Dot11PSKPassphrase; + extension?: Dot11PSKSetExtension; +} +export interface Dot11PSKSetExtension {} +export interface NetworkInterfaceSetConfigurationExtension2 {} +export interface Dot11Capabilities { + TKIP?: boolean; + scanAvailableNetworks?: boolean; + multipleConfiguration?: boolean; + adHocStationMode?: boolean; + WEP?: boolean; +} +export interface Dot11Status { + SSID?: Dot11SSIDType; + BSSID?: string; + pairCipher?: Dot11Cipher; + groupCipher?: Dot11Cipher; + signalStrength?: Dot11SignalStrength; + activeConfigAlias?: ReferenceToken; +} +export interface Dot11AvailableNetworks { + SSID?: Dot11SSIDType; + BSSID?: string; + /** See IEEE802.11 7.3.2.25.2 for details. */ + authAndMangementSuite?: Dot11AuthAndMangementSuite[]; + pairCipher?: Dot11Cipher[]; + groupCipher?: Dot11Cipher[]; + signalStrength?: Dot11SignalStrength; + extension?: Dot11AvailableNetworksExtension; +} +export interface Dot11AvailableNetworksExtension {} +export interface Capabilities { + /** Analytics capabilities */ + analytics?: AnalyticsCapabilities; + /** Device capabilities */ + device?: DeviceCapabilities; + /** Event capabilities */ + events?: EventCapabilities; + /** Imaging capabilities */ + imaging?: ImagingCapabilities; + /** Media capabilities */ + media?: MediaCapabilities; + /** PTZ capabilities */ + PTZ?: PTZCapabilities; + extension?: CapabilitiesExtension; +} +export interface CapabilitiesExtension { + deviceIO?: DeviceIOCapabilities; + display?: DisplayCapabilities; + recording?: RecordingCapabilities; + search?: SearchCapabilities; + replay?: ReplayCapabilities; + receiver?: ReceiverCapabilities; + analyticsDevice?: AnalyticsDeviceCapabilities; + extensions?: CapabilitiesExtension2; +} +export interface CapabilitiesExtension2 {} +export interface AnalyticsCapabilities { + /** Analytics service URI. */ + XAddr?: AnyURI; + /** Indicates whether or not rules are supported. */ + ruleSupport?: boolean; + /** Indicates whether or not modules are supported. */ + analyticsModuleSupport?: boolean; +} +export interface DeviceCapabilities { + /** Device service URI. */ + XAddr?: AnyURI; + /** Network capabilities. */ + network?: NetworkCapabilities; + /** System capabilities. */ + system?: SystemCapabilities; + /** I/O capabilities. */ + IO?: IOCapabilities; + /** Security capabilities. */ + security?: SecurityCapabilities; + extension?: DeviceCapabilitiesExtension; +} +export interface DeviceCapabilitiesExtension {} +export interface EventCapabilities { + /** Event service URI. */ + XAddr?: AnyURI; + /** Indicates whether or not WS Subscription policy is supported. */ + WSSubscriptionPolicySupport?: boolean; + /** Indicates whether or not WS Pull Point is supported. */ + WSPullPointSupport?: boolean; + /** Indicates whether or not WS Pausable Subscription Manager Interface is supported. */ + WSPausableSubscriptionManagerInterfaceSupport?: boolean; +} +export interface IOCapabilities { + /** Number of input connectors. */ + inputConnectors?: number; + /** Number of relay outputs. */ + relayOutputs?: number; + extension?: IOCapabilitiesExtension; +} +export interface IOCapabilitiesExtension { + auxiliary?: boolean; + auxiliaryCommands?: AuxiliaryData[]; + extension?: IOCapabilitiesExtension2; +} +export interface IOCapabilitiesExtension2 {} +export interface MediaCapabilities { + /** Media service URI. */ + XAddr?: AnyURI; + /** Streaming capabilities. */ + streamingCapabilities?: RealTimeStreamingCapabilities; + extension?: MediaCapabilitiesExtension; +} +export interface MediaCapabilitiesExtension { + profileCapabilities?: ProfileCapabilities; +} +export interface RealTimeStreamingCapabilities { + /** Indicates whether or not RTP multicast is supported. */ + RTPMulticast?: boolean; + /** Indicates whether or not RTP over TCP is supported. */ + RTP_TCP?: boolean; + /** Indicates whether or not RTP/RTSP/TCP is supported. */ + RTP_RTSP_TCP?: boolean; + extension?: RealTimeStreamingCapabilitiesExtension; +} +export interface RealTimeStreamingCapabilitiesExtension {} +export interface ProfileCapabilities { + /** Maximum number of profiles. */ + maximumNumberOfProfiles?: number; +} +export interface NetworkCapabilities { + /** Indicates whether or not IP filtering is supported. */ + IPFilter?: boolean; + /** Indicates whether or not zeroconf is supported. */ + zeroConfiguration?: boolean; + /** Indicates whether or not IPv6 is supported. */ + IPVersion6?: boolean; + /** Indicates whether or not is supported. */ + dynDNS?: boolean; + extension?: NetworkCapabilitiesExtension; +} +export interface NetworkCapabilitiesExtension { + dot11Configuration?: boolean; + extension?: NetworkCapabilitiesExtension2; +} +export interface NetworkCapabilitiesExtension2 {} +export interface SecurityCapabilities { + /** Indicates whether or not TLS 1.1 is supported. */ + 'TLS1.1'?: boolean; + /** Indicates whether or not TLS 1.2 is supported. */ + 'TLS1.2'?: boolean; + /** Indicates whether or not onboard key generation is supported. */ + onboardKeyGeneration?: boolean; + /** Indicates whether or not access policy configuration is supported. */ + accessPolicyConfig?: boolean; + /** Indicates whether or not WS-Security X.509 token is supported. */ + 'X.509Token'?: boolean; + /** Indicates whether or not WS-Security SAML token is supported. */ + SAMLToken?: boolean; + /** Indicates whether or not WS-Security Kerberos token is supported. */ + kerberosToken?: boolean; + /** Indicates whether or not WS-Security REL token is supported. */ + RELToken?: boolean; + extension?: SecurityCapabilitiesExtension; +} +export interface SecurityCapabilitiesExtension { + 'TLS1.0'?: boolean; + extension?: SecurityCapabilitiesExtension2; +} +export interface SecurityCapabilitiesExtension2 { + dot1X?: boolean; + /** EAP Methods supported by the device. The int values refer to the IANA EAP Registry. */ + supportedEAPMethod?: number[]; + remoteUserHandling?: boolean; +} +export interface SystemCapabilities { + /** Indicates whether or not WS Discovery resolve requests are supported. */ + discoveryResolve?: boolean; + /** Indicates whether or not WS-Discovery Bye is supported. */ + discoveryBye?: boolean; + /** Indicates whether or not remote discovery is supported. */ + remoteDiscovery?: boolean; + /** Indicates whether or not system backup is supported. */ + systemBackup?: boolean; + /** Indicates whether or not system logging is supported. */ + systemLogging?: boolean; + /** Indicates whether or not firmware upgrade is supported. */ + firmwareUpgrade?: boolean; + /** Indicates supported ONVIF version(s). */ + supportedVersions?: OnvifVersion[]; + extension?: SystemCapabilitiesExtension; +} +export interface SystemCapabilitiesExtension { + httpFirmwareUpgrade?: boolean; + httpSystemBackup?: boolean; + httpSystemLogging?: boolean; + httpSupportInformation?: boolean; + extension?: SystemCapabilitiesExtension2; +} +export interface SystemCapabilitiesExtension2 {} +export interface OnvifVersion { + /** Major version number. */ + major?: number; + /** + * Two digit minor version number. + * If major version number is less than "16", X.0.1 maps to "01" and X.2.1 maps to "21" where X stands for Major version number. + * Otherwise, minor number is month of release, such as "06" for June. + */ + minor?: number; +} +export interface ImagingCapabilities { + /** Imaging service URI. */ + XAddr?: AnyURI; +} +export interface PTZCapabilities { + /** PTZ service URI. */ + XAddr?: AnyURI; +} +export interface DeviceIOCapabilities { + XAddr?: AnyURI; + videoSources?: number; + videoOutputs?: number; + audioSources?: number; + audioOutputs?: number; + relayOutputs?: number; +} +export interface DisplayCapabilities { + XAddr?: AnyURI; + /** Indication that the SetLayout command supports only predefined layouts. */ + fixedLayout?: boolean; +} +export interface RecordingCapabilities { + XAddr?: AnyURI; + receiverSource?: boolean; + mediaProfileSource?: boolean; + dynamicRecordings?: boolean; + dynamicTracks?: boolean; + maxStringLength?: number; +} +export interface SearchCapabilities { + XAddr?: AnyURI; + metadataSearch?: boolean; +} +export interface ReplayCapabilities { + /** The address of the replay service. */ + XAddr?: AnyURI; +} +export interface ReceiverCapabilities { + /** The address of the receiver service. */ + XAddr?: AnyURI; + /** Indicates whether the device can receive RTP multicast streams. */ + RTP_Multicast?: boolean; + /** Indicates whether the device can receive RTP/TCP streams */ + RTP_TCP?: boolean; + /** Indicates whether the device can receive RTP/RTSP/TCP streams. */ + RTP_RTSP_TCP?: boolean; + /** The maximum number of receivers supported by the device. */ + supportedReceivers?: number; + /** The maximum allowed length for RTSP URIs. */ + maximumRTSPURILength?: number; +} +export interface AnalyticsDeviceCapabilities { + XAddr?: AnyURI; + /** Obsolete property. */ + ruleSupport?: boolean; + extension?: AnalyticsDeviceExtension; +} +export interface AnalyticsDeviceExtension {} +export interface SystemLog { + /** The log information as attachment data. */ + binary?: AttachmentData; + /** The log information as character data. */ + string?: string; +} +export interface SupportInformation { + /** The support information as attachment data. */ + binary?: AttachmentData; + /** The support information as character data. */ + string?: string; +} +export interface BinaryData { + contentType?: any; + /** base64 encoded binary data. */ + data?: any; +} +export interface AttachmentData { + contentType?: any; + clude?: any; +} +export interface BackupFile { + name?: string; + data?: AttachmentData; +} +export interface SystemLogUriList { + systemLog?: SystemLogUri[]; +} +export interface SystemLogUri { + type?: SystemLogType; + uri?: AnyURI; +} +/** General date time inforamtion returned by the GetSystemDateTime method. */ +export interface SystemDateTime { + /** Indicates if the time is set manully or through NTP. */ + dateTimeType?: SetDateTimeType; + /** Informative indicator whether daylight savings is currently on/off. */ + daylightSavings?: boolean; + /** Timezone information in Posix format. */ + timeZone?: TimeZone; + /** Current system date and time in UTC format. This field is mandatory since version 2.0. */ + UTCDateTime?: DateTime; + /** Date and time in local format. */ + localDateTime?: DateTime; + extension?: SystemDateTimeExtension; +} +export interface SystemDateTimeExtension {} +export interface DateTime { + time?: Time; + date?: Date; +} +export interface Date { + year?: number; + /** Range is 1 to 12. */ + month?: number; + /** Range is 1 to 31. */ + day?: number; +} +export interface Time { + /** Range is 0 to 23. */ + hour?: number; + /** Range is 0 to 59. */ + minute?: number; + /** Range is 0 to 61 (typically 59). */ + second?: number; +} +/** + * The time zone in POSIX 1003.1 format + * The TZ format is specified by POSIX, please refer to POSIX 1003.1 section 8.3 + * Example: Europe, Paris TZ=CET-1CEST,M3.5.0/2,M10.5.0/3 + * CET = designation for standard time when daylight saving is not in force + * -1 = offset in hours = negative so 1 hour east of Greenwich meridian + * CEST = designation when daylight saving is in force ("Central European Summer Time") + * , = no offset number between code and comma, so default to one hour ahead for daylight saving + * M3.5.0 = when daylight saving starts = the last Sunday in March (the "5th" week means the last in the month) + * /2, = the local time when the switch occurs = 2 a.m. in this case + * M10.5.0 = when daylight saving ends = the last Sunday in October. + * /3, = the local time when the switch occurs = 3 a.m. in this case + */ +export interface TimeZone { + /** Posix timezone string. */ + TZ?: string; +} +export interface RemoteUser { + username?: string; + password?: string; + useDerivedPassword?: boolean; +} +export interface User { + /** Username string. */ + username?: string; + /** Password string. */ + password?: string; + /** User level string. */ + userLevel?: UserLevel; + extension?: UserExtension; +} +export interface UserExtension {} +export interface CertificateGenerationParameters { + certificateID?: string; + subject?: string; + validNotBefore?: string; + validNotAfter?: string; + extension?: CertificateGenerationParametersExtension; +} +export interface CertificateGenerationParametersExtension {} +export interface Certificate { + /** Certificate id. */ + certificateID?: string; + /** base64 encoded DER representation of certificate. */ + certificate?: BinaryData; +} +export interface CertificateStatus { + /** Certificate id. */ + certificateID?: string; + /** Indicates whether or not a certificate is used in a HTTPS configuration. */ + status?: boolean; +} +export interface CertificateWithPrivateKey { + certificateID?: string; + certificate?: BinaryData; + privateKey?: BinaryData; +} +export interface CertificateInformation { + certificateID?: string; + issuerDN?: string; + subjectDN?: string; + keyUsage?: CertificateUsage; + extendedKeyUsage?: CertificateUsage; + keyLength?: number; + version?: string; + serialNum?: string; + /** Validity Range is from "NotBefore" to "NotAfter"; the corresponding DateTimeRange is from "From" to "Until" */ + signatureAlgorithm?: string; + validity?: DateTimeRange; + extension?: CertificateInformationExtension; +} +export interface CertificateUsage {} +export interface CertificateInformationExtension {} +export interface Dot1XConfiguration { + dot1XConfigurationToken?: ReferenceToken; + identity?: string; + anonymousID?: string; + /** EAP Method type as defined in IANA EAP Registry. */ + EAPMethod?: number; + CACertificateID?: string[]; + EAPMethodConfiguration?: EAPMethodConfiguration; + extension?: Dot1XConfigurationExtension; +} +export interface Dot1XConfigurationExtension {} +export interface EAPMethodConfiguration { + /** Confgiuration information for TLS Method. */ + TLSConfiguration?: TLSConfiguration; + /** Password for those EAP Methods that require a password. The password shall never be returned on a get method. */ + password?: string; + extension?: EapMethodExtension; +} +export interface EapMethodExtension {} +export interface TLSConfiguration { + certificateID?: string; +} +export interface GenericEapPwdConfigurationExtension {} +export interface RelayOutputSettings { + /** + * 'Bistable' or 'Monostable' + * + * Bistable – After setting the state, the relay remains in this state. + * Monostable – After setting the state, the relay returns to its idle state after the specified time. + * + */ + mode?: RelayMode; + /** Time after which the relay returns to its idle state if it is in monostable mode. If the Mode field is set to bistable mode the value of the parameter can be ignored. */ + delayTime?: any; + /** + * 'open' or 'closed' + * + * 'open' means that the relay is open when the relay state is set to 'inactive' through the trigger command and closed when the state is set to 'active' through the same command. + * 'closed' means that the relay is closed when the relay state is set to 'inactive' through the trigger command and open when the state is set to 'active' through the same command. + * + */ + idleState?: RelayIdleState; +} +export interface RelayOutput extends DeviceEntity { + properties?: RelayOutputSettings; +} +export interface DigitalInput extends DeviceEntity {} +export interface PTZNode extends DeviceEntity { + /** A unique identifier that is used to reference PTZ Nodes. */ + name?: Name; + /** A list of Coordinate Systems available for the PTZ Node. For each Coordinate System, the PTZ Node MUST specify its allowed range. */ + supportedPTZSpaces?: PTZSpaces; + /** All preset operations MUST be available for this PTZ Node if one preset is supported. */ + maximumNumberOfPresets?: number; + /** A boolean operator specifying the availability of a home position. If set to true, the Home Position Operations MUST be available for this PTZ Node. */ + homeSupported?: boolean; + /** A list of supported Auxiliary commands. If the list is not empty, the Auxiliary Operations MUST be available for this PTZ Node. */ + auxiliaryCommands?: AuxiliaryData[]; + extension?: PTZNodeExtension; +} +export interface PTZNodeExtension { + /** Detail of supported Preset Tour feature. */ + supportedPresetTour?: PTZPresetTourSupported; + extension?: PTZNodeExtension2; +} +export interface PTZNodeExtension2 {} +export interface PTZPresetTourSupported { + /** Indicates number of preset tours that can be created. Required preset tour operations shall be available for this PTZ Node if one or more preset tour is supported. */ + maximumNumberOfPresetTours?: number; + /** Indicates which preset tour operations are available for this PTZ Node. */ + PTZPresetTourOperation?: PTZPresetTourOperation[]; + extension?: PTZPresetTourSupportedExtension; +} +export interface PTZPresetTourSupportedExtension {} +export interface PTZConfiguration extends ConfigurationEntity { + /** A mandatory reference to the PTZ Node that the PTZ Configuration belongs to. */ + nodeToken?: ReferenceToken; + /** If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default. */ + defaultAbsolutePantTiltPositionSpace?: AnyURI; + /** If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default. */ + defaultAbsoluteZoomPositionSpace?: AnyURI; + /** If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default. */ + defaultRelativePanTiltTranslationSpace?: AnyURI; + /** If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default. */ + defaultRelativeZoomTranslationSpace?: AnyURI; + /** If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default. */ + defaultContinuousPanTiltVelocitySpace?: AnyURI; + /** If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default. */ + defaultContinuousZoomVelocitySpace?: AnyURI; + /** If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds. */ + defaultPTZSpeed?: PTZSpeed; + /** If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops. */ + defaultPTZTimeout?: any; + /** The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. If the element is present it signals the support for configurable Pan/Tilt limits. If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. The Pan/Tilt limits are disabled by setting the limits to –INF or +INF. */ + panTiltLimits?: PanTiltLimits; + /** The Zoom limits element should be present for a PTZ Node that supports absolute zoom. If the element is present it signals the supports for configurable Zoom limits. If limits are enabled the zoom movements shall always stay within the specified range. The Zoom limits are disabled by settings the limits to -INF and +INF. */ + zoomLimits?: ZoomLimits; + /**/ + extension?: PTZConfigurationExtension; +} +export interface PTZConfigurationExtension { + /** Optional element to configure PT Control Direction related features. */ + PTControlDirection?: PTControlDirection; + extension?: PTZConfigurationExtension2; +} +export interface PTZConfigurationExtension2 {} +export interface PTControlDirection { + /** Optional element to configure related parameters for E-Flip. */ + EFlip?: EFlip; + /** Optional element to configure related parameters for reversing of PT Control Direction. */ + reverse?: Reverse; + extension?: PTControlDirectionExtension; +} +export interface PTControlDirectionExtension {} +export interface EFlip { + /** Parameter to enable/disable E-Flip feature. */ + mode?: EFlipMode; +} +export interface Reverse { + /** Parameter to enable/disable Reverse feature. */ + mode?: ReverseMode; +} +export interface PTZConfigurationOptions { + /** + * The list of acceleration ramps supported by the device. The + * smallest acceleration value corresponds to the minimal index, the + * highest acceleration corresponds to the maximum index. + */ + PTZRamps?: IntList; + /** A list of supported coordinate systems including their range limitations. */ + spaces?: PTZSpaces; + /** A timeout Range within which Timeouts are accepted by the PTZ Node. */ + PTZTimeout?: DurationRange; + /** Supported options for PT Direction Control. */ + PTControlDirection?: PTControlDirectionOptions; + extension?: PTZConfigurationOptions2; +} +export interface PTZConfigurationOptions2 {} +export interface PTControlDirectionOptions { + /** Supported options for EFlip feature. */ + EFlip?: EFlipOptions; + /** Supported options for Reverse feature. */ + reverse?: ReverseOptions; + extension?: PTControlDirectionOptionsExtension; +} +export interface PTControlDirectionOptionsExtension {} +export interface EFlipOptions { + /** Options of EFlip mode parameter. */ + mode?: EFlipMode[]; + extension?: EFlipOptionsExtension; +} +export interface EFlipOptionsExtension {} +export interface ReverseOptions { + /** Options of Reverse mode parameter. */ + mode?: ReverseMode[]; + extension?: ReverseOptionsExtension; +} +export interface ReverseOptionsExtension {} +export interface PanTiltLimits { + /** A range of pan tilt limits. */ + range?: Space2DDescription; +} +export interface ZoomLimits { + /** A range of zoom limit */ + range?: Space1DDescription; +} +export interface PTZSpaces { + /** + * The Generic Pan/Tilt Position space is provided by every PTZ node that supports absolute Pan/Tilt, since it does not relate to a specific physical range. + * Instead, the range should be defined as the full range of the PTZ unit normalized to the range -1 to 1 resulting in the following space description. + */ + absolutePanTiltPositionSpace?: Space2DDescription[]; + /** + * The Generic Zoom Position Space is provided by every PTZ node that supports absolute Zoom, since it does not relate to a specific physical range. + * Instead, the range should be defined as the full range of the Zoom normalized to the range 0 (wide) to 1 (tele). + * There is no assumption about how the generic zoom range is mapped to magnification, FOV or other physical zoom dimension. + */ + absoluteZoomPositionSpace?: Space1DDescription[]; + /** + * The Generic Pan/Tilt translation space is provided by every PTZ node that supports relative Pan/Tilt, since it does not relate to a specific physical range. + * Instead, the range should be defined as the full positive and negative translation range of the PTZ unit normalized to the range -1 to 1, + * where positive translation would mean clockwise rotation or movement in right/up direction resulting in the following space description. + */ + relativePanTiltTranslationSpace?: Space2DDescription[]; + /** + * The Generic Zoom Translation Space is provided by every PTZ node that supports relative Zoom, since it does not relate to a specific physical range. + * Instead, the corresponding absolute range should be defined as the full positive and negative translation range of the Zoom normalized to the range -1 to1, + * where a positive translation maps to a movement in TELE direction. The translation is signed to indicate direction (negative is to wide, positive is to tele). + * There is no assumption about how the generic zoom range is mapped to magnification, FOV or other physical zoom dimension. This results in the following space description. + */ + relativeZoomTranslationSpace?: Space1DDescription[]; + /** + * The generic Pan/Tilt velocity space shall be provided by every PTZ node, since it does not relate to a specific physical range. + * Instead, the range should be defined as a range of the PTZ unit’s speed normalized to the range -1 to 1, where a positive velocity would map to clockwise + * rotation or movement in the right/up direction. A signed speed can be independently specified for the pan and tilt component resulting in the following space description. + */ + continuousPanTiltVelocitySpace?: Space2DDescription[]; + /** + * The generic zoom velocity space specifies a zoom factor velocity without knowing the underlying physical model. The range should be normalized from -1 to 1, + * where a positive velocity would map to TELE direction. A generic zoom velocity space description resembles the following. + */ + continuousZoomVelocitySpace?: Space1DDescription[]; + /** + * The speed space specifies the speed for a Pan/Tilt movement when moving to an absolute position or to a relative translation. + * In contrast to the velocity spaces, speed spaces do not contain any directional information. The speed of a combined Pan/Tilt + * movement is represented by a single non-negative scalar value. + */ + panTiltSpeedSpace?: Space1DDescription[]; + /** + * The speed space specifies the speed for a Zoom movement when moving to an absolute position or to a relative translation. + * In contrast to the velocity spaces, speed spaces do not contain any directional information. + */ + zoomSpeedSpace?: Space1DDescription[]; + extension?: PTZSpacesExtension; +} +export interface PTZSpacesExtension {} +export interface Space2DDescription { + /** A URI of coordinate systems. */ + URI?: AnyURI; + /** A range of x-axis. */ + XRange?: FloatRange; + /** A range of y-axis. */ + YRange?: FloatRange; +} +export interface Space1DDescription { + /** A URI of coordinate systems. */ + URI?: AnyURI; + /** A range of x-axis. */ + XRange?: FloatRange; +} +export interface PTZSpeed { + /** Pan and tilt speed. The x component corresponds to pan and the y component to tilt. If omitted in a request, the current (if any) PanTilt movement should not be affected. */ + panTilt?: Vector2D; + /** A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected. */ + zoom?: Vector1D; +} +export interface PTZPreset { + /**/ + token?: ReferenceToken; + /** A list of preset position name. */ + name?: Name; + /** A list of preset position. */ + PTZPosition?: PTZVector; +} +export interface PresetTour { + /** Unique identifier of this preset tour. */ + token?: ReferenceToken; + /** Readable name of the preset tour. */ + name?: Name; + /** Read only parameters to indicate the status of the preset tour. */ + status?: PTZPresetTourStatus; + /** Auto Start flag of the preset tour. True allows the preset tour to be activated always. */ + autoStart?: boolean; + /** Parameters to specify the detail behavior of the preset tour. */ + startingCondition?: PTZPresetTourStartingCondition; + /** A list of detail of touring spots including preset positions. */ + tourSpot?: PTZPresetTourSpot[]; + extension?: PTZPresetTourExtension; +} +export interface PTZPresetTourExtension {} +export interface PTZPresetTourSpot { + /** Detail definition of preset position of the tour spot. */ + presetDetail?: PTZPresetTourPresetDetail; + /** Optional parameter to specify Pan/Tilt and Zoom speed on moving toward this tour spot. */ + speed?: PTZSpeed; + /** Optional parameter to specify time duration of staying on this tour sport. */ + stayTime?: any; + extension?: PTZPresetTourSpotExtension; +} +export interface PTZPresetTourSpotExtension {} +export interface PTZPresetTourPresetDetail {} +export interface PTZPresetTourTypeExtension {} +export interface PTZPresetTourStatus { + /** Indicates state of this preset tour by Idle/Touring/Paused. */ + state?: PTZPresetTourState; + /** Indicates a tour spot currently staying. */ + currentTourSpot?: PTZPresetTourSpot; + extension?: PTZPresetTourStatusExtension; +} +export interface PTZPresetTourStatusExtension {} +export interface PTZPresetTourStartingCondition { + /** Execute presets in random order. If set to true and Direction is also present, Direction will be ignored and presets of the Tour will be recalled randomly. */ + randomPresetOrder?: boolean; + /** Optional parameter to specify how many times the preset tour is recurred. */ + recurringTime?: number; + /** Optional parameter to specify how long time duration the preset tour is recurred. */ + recurringDuration?: any; + /** Optional parameter to choose which direction the preset tour goes. Forward shall be chosen in case it is omitted. */ + direction?: PTZPresetTourDirection; + extension?: PTZPresetTourStartingConditionExtension; +} +export interface PTZPresetTourStartingConditionExtension {} +export interface PTZPresetTourOptions { + /** Indicates whether or not the AutoStart is supported. */ + autoStart?: boolean; + /** Supported options for Preset Tour Starting Condition. */ + startingCondition?: PTZPresetTourStartingConditionOptions; + /** Supported options for Preset Tour Spot. */ + tourSpot?: PTZPresetTourSpotOptions; +} +export interface PTZPresetTourSpotOptions { + /** Supported options for detail definition of preset position of the tour spot. */ + presetDetail?: PTZPresetTourPresetDetailOptions; + /** Supported range of stay time for a tour spot. */ + stayTime?: DurationRange; +} +export interface PTZPresetTourPresetDetailOptions { + /** A list of available Preset Tokens for tour spots. */ + presetToken?: ReferenceToken[]; + /** An option to indicate Home postion for tour spots. */ + home?: boolean; + /** Supported range of Pan and Tilt for tour spots. */ + panTiltPositionSpace?: Space2DDescription; + /** Supported range of Zoom for a tour spot. */ + zoomPositionSpace?: Space1DDescription; + extension?: PTZPresetTourPresetDetailOptionsExtension; +} +export interface PTZPresetTourPresetDetailOptionsExtension {} +export interface PTZPresetTourStartingConditionOptions { + /** Supported range of Recurring Time. */ + recurringTime?: IntRange; + /** Supported range of Recurring Duration. */ + recurringDuration?: DurationRange; + /** Supported options for Direction of Preset Tour. */ + direction?: PTZPresetTourDirection[]; + extension?: PTZPresetTourStartingConditionOptionsExtension; +} +export interface PTZPresetTourStartingConditionOptionsExtension {} +export interface ImagingStatus { + focusStatus?: FocusStatus; +} +export interface FocusStatus { + /** Status of focus position. */ + position?: number; + /** Status of focus MoveStatus. */ + moveStatus?: MoveStatus; + /** Error status of focus. */ + error?: string; +} +export interface FocusConfiguration { + autoFocusMode?: AutoFocusMode; + defaultSpeed?: number; + /** Parameter to set autofocus near limit (unit: meter). */ + nearLimit?: number; + /** + * Parameter to set autofocus far limit (unit: meter). + * If set to 0.0, infinity will be used. + */ + farLimit?: number; +} +export interface ImagingSettings { + /** Enabled/disabled BLC mode (on/off). */ + backlightCompensation?: BacklightCompensation; + /** Image brightness (unit unspecified). */ + brightness?: number; + /** Color saturation of the image (unit unspecified). */ + colorSaturation?: number; + /** Contrast of the image (unit unspecified). */ + contrast?: number; + /** Exposure mode of the device. */ + exposure?: Exposure; + /** Focus configuration. */ + focus?: FocusConfiguration; + /** Infrared Cutoff Filter settings. */ + irCutFilter?: IrCutFilterMode; + /** Sharpness of the Video image. */ + sharpness?: number; + /** WDR settings. */ + wideDynamicRange?: WideDynamicRange; + /** White balance settings. */ + whiteBalance?: WhiteBalance; + extension?: ImagingSettingsExtension; +} +export interface ImagingSettingsExtension {} +export interface Exposure { + /** + * Exposure Mode + * + * Auto – Enabled the exposure algorithm on the NVT. + * Manual – Disabled exposure algorithm on the NVT. + * + */ + mode?: ExposureMode; + /** The exposure priority mode (low noise/framerate). */ + priority?: ExposurePriority; + /** Rectangular exposure mask. */ + window?: Rectangle; + /** Minimum value of exposure time range allowed to be used by the algorithm. */ + minExposureTime?: number; + /** Maximum value of exposure time range allowed to be used by the algorithm. */ + maxExposureTime?: number; + /** Minimum value of the sensor gain range that is allowed to be used by the algorithm. */ + minGain?: number; + /** Maximum value of the sensor gain range that is allowed to be used by the algorithm. */ + maxGain?: number; + /** Minimum value of the iris range allowed to be used by the algorithm. */ + minIris?: number; + /** Maximum value of the iris range allowed to be used by the algorithm. */ + maxIris?: number; + /** The fixed exposure time used by the image sensor (μs). */ + exposureTime?: number; + /** The fixed gain used by the image sensor (dB). */ + gain?: number; + /** The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris. */ + iris?: number; +} +export interface WideDynamicRange { + /** White dynamic range (on/off) */ + mode?: WideDynamicMode; + /** Optional level parameter (unitless) */ + level?: number; +} +export interface BacklightCompensation { + /** Backlight compensation mode (on/off). */ + mode?: BacklightCompensationMode; + /** Optional level parameter (unit unspecified). */ + level?: number; +} +export interface ImagingOptions { + backlightCompensation?: BacklightCompensationOptions; + brightness?: FloatRange; + colorSaturation?: FloatRange; + contrast?: FloatRange; + exposure?: ExposureOptions; + focus?: FocusOptions; + irCutFilterModes?: IrCutFilterMode[]; + sharpness?: FloatRange; + wideDynamicRange?: WideDynamicRangeOptions; + whiteBalance?: WhiteBalanceOptions; +} +export interface WideDynamicRangeOptions { + mode?: WideDynamicMode[]; + level?: FloatRange; +} +export interface BacklightCompensationOptions { + mode?: WideDynamicMode[]; + level?: FloatRange; +} +export interface FocusOptions { + autoFocusModes?: AutoFocusMode[]; + defaultSpeed?: FloatRange; + nearLimit?: FloatRange; + farLimit?: FloatRange; +} +export interface ExposureOptions { + mode?: ExposureMode[]; + priority?: ExposurePriority[]; + minExposureTime?: FloatRange; + maxExposureTime?: FloatRange; + minGain?: FloatRange; + maxGain?: FloatRange; + minIris?: FloatRange; + maxIris?: FloatRange; + exposureTime?: FloatRange; + gain?: FloatRange; + iris?: FloatRange; +} +export interface WhiteBalanceOptions { + mode?: WhiteBalanceMode[]; + yrGain?: FloatRange; + ybGain?: FloatRange; +} +export interface FocusMove { + /** Parameters for the absolute focus control. */ + absolute?: AbsoluteFocus; + /** Parameters for the relative focus control. */ + relative?: RelativeFocus; + /** Parameter for the continuous focus control. */ + continuous?: ContinuousFocus; +} +export interface AbsoluteFocus { + /** Position parameter for the absolute focus control. */ + position?: number; + /** Speed parameter for the absolute focus control. */ + speed?: number; +} +export interface RelativeFocus { + /** Distance parameter for the relative focus control. */ + distance?: number; + /** Speed parameter for the relative focus control. */ + speed?: number; +} +export interface ContinuousFocus { + /** Speed parameter for the Continuous focus control. */ + speed?: number; +} +export interface MoveOptions { + absolute?: AbsoluteFocusOptions; + relative?: RelativeFocusOptions; + continuous?: ContinuousFocusOptions; +} +export interface AbsoluteFocusOptions { + /** Valid ranges of the position. */ + position?: FloatRange; + /** Valid ranges of the speed. */ + speed?: FloatRange; +} +export interface RelativeFocusOptions { + /** Valid ranges of the distance. */ + distance?: FloatRange; + /** Valid ranges of the speed. */ + speed?: FloatRange; +} +export interface ContinuousFocusOptions { + /** Valid ranges of the speed. */ + speed?: FloatRange; +} +export interface WhiteBalance { + /** Auto whitebalancing mode (auto/manual). */ + mode?: WhiteBalanceMode; + /** Rgain (unitless). */ + crGain?: number; + /** Bgain (unitless). */ + cbGain?: number; +} +export interface ImagingStatus20 { + /** Status of focus. */ + focusStatus20?: FocusStatus20; + extension?: ImagingStatus20Extension; +} +export interface ImagingStatus20Extension {} +export interface FocusStatus20 { + /** Status of focus position. */ + position?: number; + /** Status of focus MoveStatus. */ + moveStatus?: MoveStatus; + /** Error status of focus. */ + error?: string; + extension?: FocusStatus20Extension; +} +export interface FocusStatus20Extension {} +/** Type describing the ImagingSettings of a VideoSource. The supported options and ranges can be obtained via the GetOptions command. */ +export interface ImagingSettings20 { + /** Enabled/disabled BLC mode (on/off). */ + backlightCompensation?: BacklightCompensation20; + /** Image brightness (unit unspecified). */ + brightness?: number; + /** Color saturation of the image (unit unspecified). */ + colorSaturation?: number; + /** Contrast of the image (unit unspecified). */ + contrast?: number; + /** Exposure mode of the device. */ + exposure?: Exposure20; + /** Focus configuration. */ + focus?: FocusConfiguration20; + /** Infrared Cutoff Filter settings. */ + irCutFilter?: IrCutFilterMode; + /** Sharpness of the Video image. */ + sharpness?: number; + /** WDR settings. */ + wideDynamicRange?: WideDynamicRange20; + /** White balance settings. */ + whiteBalance?: WhiteBalance20; + extension?: ImagingSettingsExtension20; +} +export interface ImagingSettingsExtension20 { + /** Optional element to configure Image Stabilization feature. */ + imageStabilization?: ImageStabilization; + extension?: ImagingSettingsExtension202; +} +export interface ImagingSettingsExtension202 { + /** An optional parameter applied to only auto mode to adjust timing of toggling Ir cut filter. */ + irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment[]; + extension?: ImagingSettingsExtension203; +} +export interface ImagingSettingsExtension203 { + /** Optional element to configure Image Contrast Compensation. */ + toneCompensation?: ToneCompensation; + /** Optional element to configure Image Defogging. */ + defogging?: Defogging; + /** Optional element to configure Image Noise Reduction. */ + noiseReduction?: NoiseReduction; + extension?: ImagingSettingsExtension204; +} +export interface ImagingSettingsExtension204 {} +export interface ImageStabilization { + /** Parameter to enable/disable Image Stabilization feature. */ + mode?: ImageStabilizationMode; + /** Optional level parameter (unit unspecified) */ + level?: number; + extension?: ImageStabilizationExtension; +} +export interface ImageStabilizationExtension {} +export interface IrCutFilterAutoAdjustment { + /** Specifies which boundaries to automatically toggle Ir cut filter following parameters are applied to. Its options shall be chosen from tt:IrCutFilterAutoBoundaryType. */ + boundaryType?: string; + /** Adjusts boundary exposure level for toggling Ir cut filter to on/off specified with unitless normalized value from +1.0 to -1.0. Zero is default and -1.0 is the darkest adjustment (Unitless). */ + boundaryOffset?: number; + /** Delay time of toggling Ir cut filter to on/off after crossing of the boundary exposure levels. */ + responseTime?: any; + extension?: IrCutFilterAutoAdjustmentExtension; +} +export interface IrCutFilterAutoAdjustmentExtension {} +/** Type describing whether WDR mode is enabled or disabled (on/off). */ +export interface WideDynamicRange20 { + /** Wide dynamic range mode (on/off). */ + mode?: WideDynamicMode; + /** Optional level parameter (unit unspecified). */ + level?: number; +} +/** Type describing whether BLC mode is enabled or disabled (on/off). */ +export interface BacklightCompensation20 { + /** Backlight compensation mode (on/off). */ + mode?: BacklightCompensationMode; + /** Optional level parameter (unit unspecified). */ + level?: number; +} +/** Type describing the exposure settings. */ +export interface Exposure20 { + /** + * Exposure Mode + * + * Auto – Enabled the exposure algorithm on the device. + * Manual – Disabled exposure algorithm on the device. + * + */ + mode?: ExposureMode; + /** The exposure priority mode (low noise/framerate). */ + priority?: ExposurePriority; + /** Rectangular exposure mask. */ + window?: Rectangle; + /** Minimum value of exposure time range allowed to be used by the algorithm. */ + minExposureTime?: number; + /** Maximum value of exposure time range allowed to be used by the algorithm. */ + maxExposureTime?: number; + /** Minimum value of the sensor gain range that is allowed to be used by the algorithm. */ + minGain?: number; + /** Maximum value of the sensor gain range that is allowed to be used by the algorithm. */ + maxGain?: number; + /** Minimum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation. */ + minIris?: number; + /** Maximum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation. */ + maxIris?: number; + /** The fixed exposure time used by the image sensor (μs). */ + exposureTime?: number; + /** The fixed gain used by the image sensor (dB). */ + gain?: number; + /** The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris and positive values map to higher attenuation. */ + iris?: number; +} +export interface ToneCompensation { + /** Parameter to enable/disable or automatic ToneCompensation feature. Its options shall be chosen from tt:ToneCompensationMode Type. */ + mode?: string; + /** Optional level parameter specified with unitless normalized value from 0.0 to +1.0. */ + level?: number; + extension?: ToneCompensationExtension; +} +export interface ToneCompensationExtension {} +export interface Defogging { + /** Parameter to enable/disable or automatic Defogging feature. Its options shall be chosen from tt:DefoggingMode Type. */ + mode?: string; + /** Optional level parameter specified with unitless normalized value from 0.0 to +1.0. */ + level?: number; + extension?: DefoggingExtension; +} +export interface DefoggingExtension {} +export interface NoiseReduction { + /** Level parameter specified with unitless normalized value from 0.0 to +1.0. Level=0 means no noise reduction or minimal noise reduction. */ + level?: number; +} +export interface ImagingOptions20 { + /** Valid range of Backlight Compensation. */ + backlightCompensation?: BacklightCompensationOptions20; + /** Valid range of Brightness. */ + brightness?: FloatRange; + /** Valid range of Color Saturation. */ + colorSaturation?: FloatRange; + /** Valid range of Contrast. */ + contrast?: FloatRange; + /** Valid range of Exposure. */ + exposure?: ExposureOptions20; + /** Valid range of Focus. */ + focus?: FocusOptions20; + /** Valid range of IrCutFilterModes. */ + irCutFilterModes?: IrCutFilterMode[]; + /** Valid range of Sharpness. */ + sharpness?: FloatRange; + /** Valid range of WideDynamicRange. */ + wideDynamicRange?: WideDynamicRangeOptions20; + /** Valid range of WhiteBalance. */ + whiteBalance?: WhiteBalanceOptions20; + extension?: ImagingOptions20Extension; +} +export interface ImagingOptions20Extension { + /** Options of parameters for Image Stabilization feature. */ + imageStabilization?: ImageStabilizationOptions; + extension?: ImagingOptions20Extension2; +} +export interface ImagingOptions20Extension2 { + /** Options of parameters for adjustment of Ir cut filter auto mode. */ + irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustmentOptions; + extension?: ImagingOptions20Extension3; +} +export interface ImagingOptions20Extension3 { + /** Options of parameters for Tone Compensation feature. */ + toneCompensationOptions?: ToneCompensationOptions; + /** Options of parameters for Defogging feature. */ + defoggingOptions?: DefoggingOptions; + /** Options of parameter for Noise Reduction feature. */ + noiseReductionOptions?: NoiseReductionOptions; + extension?: ImagingOptions20Extension4; +} +export interface ImagingOptions20Extension4 {} +export interface ImageStabilizationOptions { + /** Supported options of Image Stabilization mode parameter. */ + mode?: ImageStabilizationMode[]; + /** Valid range of the Image Stabilization. */ + level?: FloatRange; + extension?: ImageStabilizationOptionsExtension; +} +export interface ImageStabilizationOptionsExtension {} +export interface IrCutFilterAutoAdjustmentOptions { + /** Supported options of boundary types for adjustment of Ir cut filter auto mode. The opptions shall be chosen from tt:IrCutFilterAutoBoundaryType. */ + boundaryType?: string[]; + /** Indicates whether or not boundary offset for toggling Ir cut filter is supported. */ + boundaryOffset?: boolean; + /** Supported range of delay time for toggling Ir cut filter. */ + responseTimeRange?: DurationRange; + extension?: IrCutFilterAutoAdjustmentOptionsExtension; +} +export interface IrCutFilterAutoAdjustmentOptionsExtension {} +export interface WideDynamicRangeOptions20 { + mode?: WideDynamicMode[]; + level?: FloatRange; +} +export interface BacklightCompensationOptions20 { + /** 'ON' or 'OFF' */ + mode?: BacklightCompensationMode[]; + /** Level range of BacklightCompensation. */ + level?: FloatRange; +} +export interface ExposureOptions20 { + /** + * Exposure Mode + * + * Auto – Enabled the exposure algorithm on the device. + * Manual – Disabled exposure algorithm on the device. + * + */ + mode?: ExposureMode[]; + /** The exposure priority mode (low noise/framerate). */ + priority?: ExposurePriority[]; + /** Valid range of the Minimum ExposureTime. */ + minExposureTime?: FloatRange; + /** Valid range of the Maximum ExposureTime. */ + maxExposureTime?: FloatRange; + /** Valid range of the Minimum Gain. */ + minGain?: FloatRange; + /** Valid range of the Maximum Gain. */ + maxGain?: FloatRange; + /** Valid range of the Minimum Iris. */ + minIris?: FloatRange; + /** Valid range of the Maximum Iris. */ + maxIris?: FloatRange; + /** Valid range of the ExposureTime. */ + exposureTime?: FloatRange; + /** Valid range of the Gain. */ + gain?: FloatRange; + /** Valid range of the Iris. */ + iris?: FloatRange; +} +export interface MoveOptions20 { + /** Valid ranges for the absolute control. */ + absolute?: AbsoluteFocusOptions; + /** Valid ranges for the relative control. */ + relative?: RelativeFocusOptions20; + /** Valid ranges for the continuous control. */ + continuous?: ContinuousFocusOptions; +} +export interface RelativeFocusOptions20 { + /** Valid ranges of the distance. */ + distance?: FloatRange; + /** Valid ranges of the speed. */ + speed?: FloatRange; +} +export interface WhiteBalance20 { + /** 'AUTO' or 'MANUAL' */ + mode?: WhiteBalanceMode; + /** Rgain (unitless). */ + crGain?: number; + /** Bgain (unitless). */ + cbGain?: number; + extension?: WhiteBalance20Extension; +} +export interface WhiteBalance20Extension {} +export interface FocusConfiguration20 { + /** Zero or more modes as defined in enumeration tt:AFModes. */ + AFMode?: StringAttrList; + /** + * Mode of auto focus. + * + * AUTO - The device automatically adjusts focus. + * MANUAL - The device does not automatically adjust focus. + * + * Note: for devices supporting both manual and auto operation at the same time manual operation may be supported even if the Mode parameter is set to Auto. + */ + autoFocusMode?: AutoFocusMode; + defaultSpeed?: number; + /** Parameter to set autofocus near limit (unit: meter). */ + nearLimit?: number; + /** Parameter to set autofocus far limit (unit: meter). */ + farLimit?: number; + extension?: FocusConfiguration20Extension; +} +export interface FocusConfiguration20Extension {} +export interface WhiteBalanceOptions20 { + /** + * Mode of WhiteBalance. + * + * AUTO + * MANUAL + * + */ + mode?: WhiteBalanceMode[]; + yrGain?: FloatRange; + ybGain?: FloatRange; + extension?: WhiteBalanceOptions20Extension; +} +export interface WhiteBalanceOptions20Extension {} +export interface FocusOptions20 { + /** + * Supported modes for auto focus. + * + * AUTO - The device supports automatic focus adjustment. + * MANUAL - The device supports manual focus adjustment. + * + */ + autoFocusModes?: AutoFocusMode[]; + /** Valid range of DefaultSpeed. */ + defaultSpeed?: FloatRange; + /** Valid range of NearLimit. */ + nearLimit?: FloatRange; + /** Valid range of FarLimit. */ + farLimit?: FloatRange; + extension?: FocusOptions20Extension; +} +export interface FocusOptions20Extension { + /** Supported options for auto focus. Options shall be chosen from tt:AFModes. */ + AFModes?: StringAttrList; +} +export interface ToneCompensationOptions { + /** Supported options for Tone Compensation mode. Its options shall be chosen from tt:ToneCompensationMode Type. */ + mode?: string[]; + /** Indicates whether or not support Level parameter for Tone Compensation. */ + level?: boolean; +} +export interface DefoggingOptions { + /** Supported options for Defogging mode. Its options shall be chosen from tt:DefoggingMode Type. */ + mode?: string[]; + /** Indicates whether or not support Level parameter for Defogging. */ + level?: boolean; +} +export interface NoiseReductionOptions { + /** Indicates whether or not support Level parameter for NoiseReduction. */ + level?: boolean; +} +export interface MessageExtension {} +export interface SimpleItem { + /** Item name. */ + name: string; + /** Item value. The type is defined in the corresponding description. */ + value: any; +} +export interface ElementItem { + /** Item name. */ + name: string; +} +export interface ItemList { + /** Value name pair as defined by the corresponding description. */ + simpleItem?: SimpleItem[]; + /** Complex value structure. */ + elementItem?: ElementItem[]; + extension?: ItemListExtension; +} +export interface ItemListExtension {} +export interface MessageDescription { + /** Must be set to true when the described Message relates to a property. An alternative term of "property" is a "state" in contrast to a pure event, which contains relevant information for only a single point in time.Default is false. */ + isProperty?: boolean; + /** + * Set of tokens producing this message. The list may only contain SimpleItemDescription items. + * The set of tokens identify the component within the WS-Endpoint, which is responsible for the producing the message. + * For analytics events the token set shall include the VideoSourceConfigurationToken, the VideoAnalyticsConfigurationToken + * and the name of the analytics module or rule. + */ + source?: ItemListDescription; + /** Describes optional message payload parameters that may be used as key. E.g. object IDs of tracked objects are conveyed as key. */ + key?: ItemListDescription; + /** Describes the payload of the message. */ + data?: ItemListDescription; + extension?: MessageDescriptionExtension; +} +export interface MessageDescriptionExtension {} +export interface SimpleItemDescription { + /** Item name. Must be unique within a list. */ + name: string; + type: any; +} +export interface ElementItemDescription { + /** Item name. Must be unique within a list. */ + name: string; + /** The type of the item. The Type must reference a defined type. */ + type: any; +} +/** + * Describes a list of items. Each item in the list shall have a unique name. + * The list is designed as linear structure without optional or unbounded elements. + * Use ElementItems only when complex structures are inevitable. + */ +export interface ItemListDescription { + /** Description of a simple item. The type must be of cathegory simpleType (xs:string, xs:integer, xs:float, ...). */ + simpleItemDescription?: SimpleItemDescription[]; + /** Description of a complex type. The Type must reference a defined type. */ + elementItemDescription?: ElementItemDescription[]; + extension?: ItemListDescriptionExtension; +} +export interface ItemListDescriptionExtension {} +export interface Polyline { + point?: Vector[]; +} +export interface AnalyticsEngineConfiguration { + analyticsModule?: Config[]; + extension?: AnalyticsEngineConfigurationExtension; +} +export interface AnalyticsEngineConfigurationExtension {} +export interface RuleEngineConfiguration { + rule?: Config[]; + extension?: RuleEngineConfigurationExtension; +} +export interface RuleEngineConfigurationExtension {} +export interface Config { + /** Name of the configuration. */ + name: string; + /** The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements returned by GetSupportedRules and GetSupportedAnalyticsModules command. */ + type: any; + /** List of configuration parameters as defined in the corresponding description. */ + parameters?: ItemList; +} +export interface Messages extends MessageDescription { + /** The topic of the message. For historical reason the element is named ParentTopic, but the full topic is expected. */ + parentTopic?: string; +} +export interface ConfigDescription { + /** The Name attribute (e.g. "tt::LineDetector") uniquely identifies the type of rule, not a type definition in a schema. */ + name: any; + /** The fixed attribute signals that it is not allowed to add or remove this type of configuration. */ + fixed?: boolean; + /** The maxInstances attribute signals the maximum number of instances per configuration. */ + maxInstances?: number; + /** + * List describing the configuration parameters. The names of the parameters must be unique. If possible SimpleItems + * should be used to transport the information to ease parsing of dynamically defined messages by a client + * application. + */ + parameters?: ItemListDescription; + /** + * The analytics modules and rule engine produce Events, which must be listed within the Analytics Module Description. In order to do so + * the structure of the Message is defined and consists of three groups: Source, Key, and Data. It is recommended to use SimpleItemDescriptions wherever applicable. + * The name of all Items must be unique within all Items contained in any group of this Message. + * Depending on the component multiple parameters or none may be needed to identify the component uniquely. + */ + messages?: Messages[]; + extension?: ConfigDescriptionExtension; +} +export interface ConfigDescriptionExtension {} +export interface SupportedRules { + /** Maximum number of concurrent instances. */ + limit?: number; + /** Lists the location of all schemas that are referenced in the rules. */ + ruleContentSchemaLocation?: AnyURI[]; + /** List of rules supported by the Video Analytics configuration.. */ + ruleDescription?: ConfigDescription[]; + extension?: SupportedRulesExtension; +} +export interface SupportedRulesExtension {} +export interface SupportedAnalyticsModules { + /** Maximum number of concurrent instances. */ + limit?: number; + /** + * It optionally contains a list of URLs that provide the location of schema files. + * These schema files describe the types and elements used in the analytics module descriptions. + * Analytics module descriptions that reference types or elements imported from any ONVIF defined schema files + * need not explicitly list those schema files. + */ + analyticsModuleContentSchemaLocation?: AnyURI[]; + analyticsModuleDescription?: ConfigDescription[]; + extension?: SupportedAnalyticsModulesExtension; +} +export interface SupportedAnalyticsModulesExtension {} +export interface PolylineArray { + /** Contains array of Polyline */ + segment?: Polyline[]; + extension?: PolylineArrayExtension; +} +export interface PolylineArrayExtension {} +export interface PolylineArrayConfiguration { + /** Contains PolylineArray configuration data */ + polylineArray?: PolylineArray; +} +export interface MotionExpression { + type?: string; + /** Motion Expression data structure contains motion expression which is based on Scene Descriptor schema with XPATH syntax. The Type argument could allow introduction of different dialects */ + expression?: string; +} +export interface MotionExpressionConfiguration { + /** Contains Rule MotionExpression configuration */ + motionExpression?: MotionExpression; +} +export interface CellLayout { + /** Number of columns of the cell grid (x dimension) */ + columns: number; + /** Number of rows of the cell grid (y dimension) */ + rows: number; + /** Mapping of the cell grid to the Video frame. The cell grid is starting from the upper left corner and x dimension is going from left to right and the y dimension from up to down. */ + transformation?: Transformation; +} +/** Configuration of the streaming and coding settings of a Video window. */ +export interface PaneConfiguration { + /** Optional name of the pane configuration. */ + paneName?: string; + /** + * If the device has audio outputs, this element contains a pointer to the audio output that is associated with the pane. A client + * can retrieve the available audio outputs of a device using the GetAudioOutputs command of the DeviceIO service. + */ + audioOutputToken?: ReferenceToken; + /** + * If the device has audio sources, this element contains a pointer to the audio source that is associated with this pane. + * The audio connection from a decoder device to the NVT is established using the backchannel mechanism. A client can retrieve the available audio sources of a device using the GetAudioSources command of the + * DeviceIO service. + */ + audioSourceToken?: ReferenceToken; + /** + * The configuration of the audio encoder including codec, bitrate + * and sample rate. + */ + audioEncoderConfiguration?: AudioEncoderConfiguration; + /** + * A pointer to a Receiver that has the necessary information to receive + * data from a Transmitter. This Receiver can be connected and the network video decoder displays the received data on the specified outputs. A client can retrieve the available Receivers using the + * GetReceivers command of the Receiver Service. + */ + receiverToken?: ReferenceToken; + /** A unique identifier in the display device. */ + token?: ReferenceToken; +} +/** A pane layout describes one Video window of a display. It links a pane configuration to a region of the screen. */ +export interface PaneLayout { + /** Reference to the configuration of the streaming and coding parameters. */ + pane?: ReferenceToken; + /** Describes the location and size of the area on the monitor. The area coordinate values are espressed in normalized units [-1.0, 1.0]. */ + area?: Rectangle; +} +/** A layout describes a set of Video windows that are displayed simultaniously on a display. */ +export interface Layout { + /** List of panes assembling the display layout. */ + paneLayout?: PaneLayout[]; + extension?: LayoutExtension; +} +export interface LayoutExtension {} +/** This type contains the Audio and Video coding capabilities of a display service. */ +export interface CodingCapabilities { + /** If the device supports audio encoding this section describes the supported codecs and their configuration. */ + audioEncodingCapabilities?: AudioEncoderConfigurationOptions; + /** If the device supports audio decoding this section describes the supported codecs and their settings. */ + audioDecodingCapabilities?: AudioDecoderConfigurationOptions; + /** This section describes the supported video codesc and their configuration. */ + videoDecodingCapabilities?: VideoDecoderConfigurationOptions; +} +/** The options supported for a display layout. */ +export interface LayoutOptions { + /** Lists the possible Pane Layouts of the Video Output */ + paneLayoutOptions?: PaneLayoutOptions[]; + extension?: LayoutOptionsExtension; +} +export interface LayoutOptionsExtension {} +/** Description of a pane layout describing a complete display layout. */ +export interface PaneLayoutOptions { + /** List of areas assembling a layout. Coordinate values are in the range [-1.0, 1.0]. */ + area?: Rectangle[]; + extension?: PaneOptionExtension; +} +export interface PaneOptionExtension {} +/** Description of a receiver, including its token and configuration. */ +export interface Receiver { + /** Unique identifier of the receiver. */ + token?: ReferenceToken; + /** Describes the configuration of the receiver. */ + configuration?: ReceiverConfiguration; +} +/** Describes the configuration of a receiver. */ +export interface ReceiverConfiguration { + /** The following connection modes are defined: */ + mode?: ReceiverMode; + /** Details of the URI to which the receiver should connect. */ + mediaUri?: AnyURI; + /** Stream connection parameters. */ + streamSetup?: StreamSetup; +} +/** Contains information about a receiver's current state. */ +export interface ReceiverStateInformation { + /** The connection state of the receiver may have one of the following states: */ + state?: ReceiverState; + /** Indicates whether or not the receiver was created automatically. */ + autoCreated?: boolean; +} +export interface SourceReference { + type?: AnyURI; + token?: ReferenceToken; +} +export interface DateTimeRange { + from?: Date; + until?: Date; +} +export interface RecordingSummary { + /** The earliest point in time where there is recorded data on the device. */ + dataFrom?: Date; + /** The most recent point in time where there is recorded data on the device. */ + dataUntil?: Date; + /** The device contains this many recordings. */ + numberRecordings?: number; +} +/** A structure for defining a limited scope when searching in recorded data. */ +export interface SearchScope { + /** A list of sources that are included in the scope. If this list is included, only data from one of these sources shall be searched. */ + includedSources?: SourceReference[]; + /** A list of recordings that are included in the scope. If this list is included, only data from one of these recordings shall be searched. */ + includedRecordings?: RecordingReference[]; + /** An xpath expression used to specify what recordings to search. Only those recordings with an RecordingInformation structure that matches the filter shall be searched. */ + recordingInformationFilter?: XPathExpression; + /** Extension point */ + extension?: SearchScopeExtension; +} +export interface SearchScopeExtension {} +export interface EventFilter extends FilterType {} +export interface PTZPositionFilter { + /** The lower boundary of the PTZ volume to look for. */ + minPosition?: PTZVector; + /** The upper boundary of the PTZ volume to look for. */ + maxPosition?: PTZVector; + /** If true, search for when entering the specified PTZ volume. */ + enterOrExit?: boolean; +} +export interface MetadataFilter { + metadataStreamFilter?: XPathExpression; +} +export interface FindRecordingResultList { + /** The state of the search when the result is returned. Indicates if there can be more results, or if the search is completed. */ + searchState?: SearchState; + /** A RecordingInformation structure for each found recording matching the search. */ + recordingInformation?: RecordingInformation[]; +} +export interface FindEventResultList { + /** The state of the search when the result is returned. Indicates if there can be more results, or if the search is completed. */ + searchState?: SearchState; + /** A FindEventResult structure for each found event matching the search. */ + result?: FindEventResult[]; +} +export interface FindEventResult { + /** The recording where this event was found. Empty string if no recording is associated with this event. */ + recordingToken?: RecordingReference; + /** A reference to the track where this event was found. Empty string if no track is associated with this event. */ + trackToken?: TrackReference; + /** The time when the event occured. */ + time?: Date; + /** The description of the event. */ + event?: any; + /** If true, indicates that the event is a virtual event generated for this particular search session to give the state of a property at the start time of the search. */ + startStateEvent?: boolean; +} +export interface FindPTZPositionResultList { + /** The state of the search when the result is returned. Indicates if there can be more results, or if the search is completed. */ + searchState?: SearchState; + /** A FindPTZPositionResult structure for each found PTZ position matching the search. */ + result?: FindPTZPositionResult[]; +} +export interface FindPTZPositionResult { + /** A reference to the recording containing the PTZ position. */ + recordingToken?: RecordingReference; + /** A reference to the metadata track containing the PTZ position. */ + trackToken?: TrackReference; + /** The time when the PTZ position was valid. */ + time?: Date; + /** The PTZ position. */ + position?: PTZVector; +} +export interface FindMetadataResultList { + /** The state of the search when the result is returned. Indicates if there can be more results, or if the search is completed. */ + searchState?: SearchState; + /** A FindMetadataResult structure for each found set of Metadata matching the search. */ + result?: FindMetadataResult[]; +} +export interface FindMetadataResult { + /** A reference to the recording containing the metadata. */ + recordingToken?: RecordingReference; + /** A reference to the metadata track containing the matching metadata. */ + trackToken?: TrackReference; + /** The point in time when the matching metadata occurs in the metadata track. */ + time?: Date; +} +export interface RecordingInformation { + recordingToken?: RecordingReference; + /** + * Information about the source of the recording. This gives a description of where the data in the recording comes from. Since a single + * recording is intended to record related material, there is just one source. It is indicates the physical location or the + * major data source for the recording. Currently the recordingconfiguration cannot describe each individual data source. + */ + source?: RecordingSourceInformation; + earliestRecording?: Date; + latestRecording?: Date; + content?: Description; + /** Basic information about the track. Note that a track may represent a single contiguous time span or consist of multiple slices. */ + track?: TrackInformation[]; + recordingStatus?: RecordingStatus; +} +/** A set of informative desciptions of a data source. The Search searvice allows a client to filter on recordings based on information in this structure. */ +export interface RecordingSourceInformation { + /** + * Identifier for the source chosen by the client that creates the structure. + * This identifier is opaque to the device. Clients may use any type of URI for this field. A device shall support at least 128 characters. + */ + sourceId?: AnyURI; + /** Informative user readable name of the source, e.g. "Camera23". A device shall support at least 20 characters. */ + name?: Name; + /** Informative description of the physical location of the source, e.g. the coordinates on a map. */ + location?: Description; + /** Informative description of the source. */ + description?: Description; + /** URI provided by the service supplying data to be recorded. A device shall support at least 128 characters. */ + address?: AnyURI; +} +export interface RecordingEncryption { + /** + * Mode of encryption. + * See tt:EncryptionMode for a list of definitions and capability trc:SupportedEncryptionModes for the supported encryption modes. + */ + mode: string; + /** Key ID of the associated key for encryption. */ + KID?: string; + /** + * Key for encrypting content. + * The device shall not include this parameter when reading. + */ + key?: any; + /** + * Optional list of track tokens to be encrypted. + * If no track tokens are specified, all tracks are encrypted and no other encryption configurations shall exist for the recording. + * Each track shall only be contained in one encryption configuration. + */ + track?: string[]; +} +export interface RecordingTargetConfiguration { + /** Token of a storage configuration. */ + storage?: ReferenceToken; + /** + * Format of the recording. + * See tt:TargetFormat for a list of definitions and capability trc:SupportedTargetFormats for the supported formats. + */ + format?: string; + /** Path prefix to be inserted in the object key. */ + prefix?: string; + /** Path postfix to be inserted in the object key. */ + postfix?: string; + /** Maximum duration of a span. */ + spanDuration?: any; + /** Maximum duration of a segment. */ + segmentDuration?: any; + /** + * Optional encryption configuration. + * See capability trc:EncryptionEntryLimit for the number of supported entries. + * By specifying multiple encryption entries per recording, different tracks can be encrypted with different configurations. + * Each track shall only be contained in one encryption configuration. + */ + encryption?: RecordingEncryption[]; +} +export interface TrackInformation { + trackToken?: TrackReference; + /** + * Type of the track: "Video", "Audio" or "Metadata". + * The track shall only be able to hold data of that type. + */ + trackType?: TrackType; + /** Informative description of the contents of the track. */ + description?: Description; + /** The start date and time of the oldest recorded data in the track. */ + dataFrom?: Date; + /** The stop date and time of the newest recorded data in the track. */ + dataTo?: Date; +} +/** A set of media attributes valid for a recording at a point in time or for a time interval. */ +export interface MediaAttributes { + /** A reference to the recording that has these attributes. */ + recordingToken?: RecordingReference; + /** A set of attributes for each track. */ + trackAttributes?: TrackAttributes[]; + /** The attributes are valid from this point in time in the recording. */ + from?: Date; + /** The attributes are valid until this point in time in the recording. Can be equal to 'From' to indicate that the attributes are only known to be valid for this particular point in time. */ + until?: Date; +} +export interface TrackAttributes { + /** The basic information about the track. Note that a track may represent a single contiguous time span or consist of multiple slices. */ + trackInformation?: TrackInformation; + /** If the track is a video track, exactly one of this structure shall be present and contain the video attributes. */ + videoAttributes?: VideoAttributes; + /** If the track is an audio track, exactly one of this structure shall be present and contain the audio attributes. */ + audioAttributes?: AudioAttributes; + /** If the track is an metadata track, exactly one of this structure shall be present and contain the metadata attributes. */ + metadataAttributes?: MetadataAttributes; + /**/ + extension?: TrackAttributesExtension; +} +export interface TrackAttributesExtension {} +export interface VideoAttributes { + /** Average bitrate in kbps. */ + bitrate?: number; + /** The width of the video in pixels. */ + width?: number; + /** The height of the video in pixels. */ + height?: number; + /** Video encoding of the track. Use value from tt:VideoEncoding for MPEG4. Otherwise use values from tt:VideoEncodingMimeNames and IANA Media Types. */ + encoding?: string; + /** Average framerate in frames per second. */ + framerate?: number; +} +export interface AudioAttributes { + /** The bitrate in kbps. */ + bitrate?: number; + /** Audio encoding of the track. Use values from tt:AudioEncoding for G711 and AAC. Otherwise use values from tt:AudioEncodingMimeNames and IANA Media Types. */ + encoding?: string; + /** The sample rate in kHz. */ + samplerate?: number; +} +export interface MetadataAttributes { + /** List of all PTZ spaces active for recording. Note that events are only recorded on position changes and the actual point of recording may not necessarily contain an event of the specified type. */ + ptzSpaces?: StringAttrList; + /** Indicates that there can be PTZ data in the metadata track in the specified time interval. */ + canContainPTZ?: boolean; + /** Indicates that there can be analytics data in the metadata track in the specified time interval. */ + canContainAnalytics?: boolean; + /** Indicates that there can be notifications in the metadata track in the specified time interval. */ + canContainNotifications?: boolean; +} +export interface RecordingConfiguration { + /** Information about the source of the recording. */ + source?: RecordingSourceInformation; + /** Informative description of the source. */ + content?: Description; + /** + * Sspecifies the maximum time that data in any track within the + * recording shall be stored. The device shall delete any data older than the maximum retention + * time. Such data shall not be accessible anymore. If the MaximumRetentionPeriod is set to 0, + * the device shall not limit the retention time of stored data, except by resource constraints. + * Whatever the value of MaximumRetentionTime, the device may automatically delete + * recordings to free up storage space for new recordings. + */ + maximumRetentionTime?: any; + /** Optional external storage target configuration. */ + target?: RecordingTargetConfiguration; +} +export interface TrackConfiguration { + /** + * Type of the track. It shall be equal to the strings “Video”, + * “Audio” or “Metadata”. The track shall only be able to hold data of that type. + */ + trackType?: TrackType; + /** Informative description of the track. */ + description?: Description; +} +export interface GetRecordingsResponseItem { + /** Token of the recording. */ + recordingToken?: RecordingReference; + /** Configuration of the recording. */ + configuration?: RecordingConfiguration; + /** List of tracks. */ + tracks?: GetTracksResponseList; +} +export interface GetTracksResponseList { + /** Configuration of a track. */ + track?: GetTracksResponseItem[]; +} +export interface GetTracksResponseItem { + /** Token of the track. */ + trackToken?: TrackReference; + /** Configuration of the track. */ + configuration?: TrackConfiguration; +} +export interface RecordingJobConfiguration { + /** + * This attribute adds an additional requirement for activating the recording job. + * If this optional field is provided the job shall only record if the schedule exists and is active. + */ + scheduleToken?: any; + /** Identifies the recording to which this job shall store the received data. */ + recordingToken?: RecordingReference; + /** + * The mode of the job. If it is idle, nothing shall happen. If it is active, the device shall try + * to obtain data from the receivers. A client shall use GetRecordingJobState to determine if data transfer is really taking place. + * The only valid values for Mode shall be “Idle” and “Active”. + */ + mode?: RecordingJobMode; + /** + * This shall be a non-negative number. If there are multiple recording jobs that store data to + * the same track, the device will only store the data for the recording job with the highest + * priority. The priority is specified per recording job, but the device shall determine the priority + * of each track individually. If there are two recording jobs with the same priority, the device + * shall record the data corresponding to the recording job that was activated the latest. + */ + priority?: number; + /** Source of the recording. */ + source?: RecordingJobSource[]; + extension?: RecordingJobConfigurationExtension; + /** Optional filter defining on which event condition a recording job gets active. */ + eventFilter?: RecordingEventFilter; +} +export interface Filter { + /** Topic filter as defined in section 9.6.3 of the ONVIF Core Specification. */ + topic?: string; + /** Optional message source content filter as defined in section 9.4.4 of the ONVIF Core Specification. */ + source?: string; +} +export interface RecordingEventFilter { + filter?: Filter[]; + /** Optional timespan to record before the actual event condition became active. */ + before?: any; + /** Optional timespan to record after the actual event condition becomes inactive. */ + after?: any; +} +export interface RecordingJobConfigurationExtension {} +export interface RecordingJobSource { + /** + * This field shall be a reference to the source of the data. The type of the source + * is determined by the attribute Type in the SourceToken structure. If Type is + * http://www.onvif.org/ver10/schema/Receiver, the token is a ReceiverReference. In this case + * the device shall receive the data over the network. If Type is + * http://www.onvif.org/ver10/schema/Profile, the token identifies a media profile, instructing the + * device to obtain data from a profile that exists on the local device. + */ + sourceToken?: SourceReference; + /** + * If this field is TRUE, and if the SourceToken is omitted, the device + * shall create a receiver object (through the receiver service) and assign the + * ReceiverReference to the SourceToken field. When retrieving the RecordingJobConfiguration + * from the device, the AutoCreateReceiver field shall never be present. + */ + autoCreateReceiver?: boolean; + /** List of tracks associated with the recording. */ + tracks?: RecordingJobTrack[]; + extension?: RecordingJobSourceExtension; +} +export interface RecordingJobSourceExtension {} +export interface RecordingJobTrack { + /** + * If the received RTSP stream contains multiple tracks of the same type, the + * SourceTag differentiates between those Tracks. This field can be ignored in case of recording a local source. + */ + sourceTag?: string; + /** + * The destination is the tracktoken of the track to which the device shall store the + * received data. + */ + destination?: TrackReference; +} +export interface RecordingJobStateInformation { + /** Identification of the recording that the recording job records to. */ + recordingToken?: RecordingReference; + /** Holds the aggregated state over the whole RecordingJobInformation structure. */ + state?: RecordingJobState; + /** Identifies the data source of the recording job. */ + sources?: RecordingJobStateSource[]; + extension?: RecordingJobStateInformationExtension; +} +export interface RecordingJobStateInformationExtension {} +export interface RecordingJobStateSource { + /** Identifies the data source of the recording job. */ + sourceToken?: SourceReference; + /** Holds the aggregated state over all substructures of RecordingJobStateSource. */ + state?: RecordingJobState; + /** List of track items. */ + tracks?: RecordingJobStateTracks; +} +export interface RecordingJobStateTracks { + track?: RecordingJobStateTrack[]; +} +export interface RecordingJobStateTrack { + /** Identifies the track of the data source that provides the data. */ + sourceTag?: string; + /** Indicates the destination track. */ + destination?: TrackReference; + /** + * Optionally holds an implementation defined string value that describes the error. + * The string should be in the English language. + */ + error?: string; + /** + * Provides the job state of the track. The valid + * values of state shall be “Idle”, “Active” and “Error”. If state equals “Error”, the Error field may be filled in with an implementation defined value. + */ + state?: RecordingJobState; +} +export interface GetRecordingJobsResponseItem { + jobToken?: RecordingJobReference; + jobConfiguration?: RecordingJobConfiguration; +} +/** Configuration parameters for the replay service. */ +export interface ReplayConfiguration { + /** The RTSP session timeout. */ + sessionTimeout?: any; +} +export interface AnalyticsEngine extends ConfigurationEntity { + analyticsEngineConfiguration?: AnalyticsDeviceEngineConfiguration; +} +export interface AnalyticsDeviceEngineConfiguration { + engineConfiguration?: EngineConfiguration[]; + extension?: AnalyticsDeviceEngineConfigurationExtension; +} +export interface AnalyticsDeviceEngineConfigurationExtension {} +export interface EngineConfiguration { + videoAnalyticsConfiguration?: VideoAnalyticsConfiguration; + analyticsEngineInputInfo?: AnalyticsEngineInputInfo; +} +export interface AnalyticsEngineInputInfo { + inputInfo?: Config; + extension?: AnalyticsEngineInputInfoExtension; +} +export interface AnalyticsEngineInputInfoExtension {} +export interface AnalyticsEngineInput extends ConfigurationEntity { + sourceIdentification?: SourceIdentification; + videoInput?: VideoEncoderConfiguration; + metadataInput?: MetadataInput; +} +export interface SourceIdentification { + name?: string; + token?: ReferenceToken[]; + extension?: SourceIdentificationExtension; +} +export interface SourceIdentificationExtension {} +export interface MetadataInput { + metadataConfig?: Config[]; + extension?: MetadataInputExtension; +} +export interface MetadataInputExtension {} +export interface AnalyticsEngineControl extends ConfigurationEntity { + /** Token of the analytics engine (AnalyticsEngine) being controlled. */ + engineToken?: ReferenceToken; + /** Token of the analytics engine configuration (VideoAnalyticsConfiguration) in effect. */ + engineConfigToken?: ReferenceToken; + /** Tokens of the input (AnalyticsEngineInput) configuration applied. */ + inputToken?: ReferenceToken[]; + /** Tokens of the receiver providing media input data. The order of ReceiverToken shall exactly match the order of InputToken. */ + receiverToken?: ReferenceToken[]; + multicast?: MulticastConfiguration; + subscription?: Config; + mode?: ModeOfOperation; +} +export interface AnalyticsStateInformation { + /** Token of the control object whose status is requested. */ + analyticsEngineControlToken?: ReferenceToken; + state?: AnalyticsState; +} +export interface AnalyticsState { + error?: string; + state?: string; +} +/** Action Engine Event Payload data structure contains the information about the ONVIF command invocations. Since this event could be generated by other or proprietary actions, the command invocation specific fields are defined as optional and additional extension mechanism is provided for future or additional action definitions. */ +export interface ActionEngineEventPayload { + /** Request Message */ + requestInfo?: any; + /** Response Message */ + responseInfo?: any; + /** Fault Message */ + fault?: any; + extension?: ActionEngineEventPayloadExtension; +} +export interface ActionEngineEventPayloadExtension {} +export interface AudioClassCandidate { + /** Indicates audio class label */ + type?: AudioClassType; + /** A likelihood/probability that the corresponding audio event belongs to this class. The sum of the likelihoods shall NOT exceed 1 */ + likelihood?: number; +} +export interface AudioClassDescriptor { + /** Array of audio class label and class probability */ + classCandidate?: AudioClassCandidate[]; + extension?: AudioClassDescriptorExtension; +} +export interface AudioClassDescriptorExtension {} +export interface ActiveConnection { + currentBitrate?: number; + currentFps?: number; +} +export interface ProfileStatus { + activeConnections?: ActiveConnection[]; + extension?: ProfileStatusExtension; +} +export interface ProfileStatusExtension {} +export interface OSDReference {} +export interface OSDPosConfiguration { + /** + * For OSD position type, following are the pre-defined: UpperLeft + * UpperRight + * LowerLeft + * LowerRight + * Custom + */ + type?: string; + pos?: Vector; + extension?: OSDPosConfigurationExtension; +} +export interface OSDPosConfigurationExtension {} +/** The value range of "Transparent" could be defined by vendors only should follow this rule: the minimum value means non-transparent and the maximum value maens fully transparent. */ +export interface OSDColor { + transparent?: number; + color?: Color; +} +export interface OSDTextConfiguration { + /** This flag is applicable for Type Plain and defaults to true. When set to false the PlainText content will not be persistent across device reboots. */ + isPersistentText?: boolean; + /** + * The following OSD Text Type are defined: + * Plain - The Plain type means the OSD is shown as a text string which defined in the "PlainText" item. + * Date - The Date type means the OSD is shown as a date, format of which should be present in the "DateFormat" item. + * Time - The Time type means the OSD is shown as a time, format of which should be present in the "TimeFormat" item. + * DateAndTime - The DateAndTime type means the OSD is shown as date and time, format of which should be present in the "DateFormat" and the "TimeFormat" item. + * + */ + type?: string; + /** + * List of supported OSD date formats. This element shall be present when the value of Type field has Date or DateAndTime. The following DateFormat are defined: + * M/d/yyyy - e.g. 3/6/2013 + * MM/dd/yyyy - e.g. 03/06/2013 + * dd/MM/yyyy - e.g. 06/03/2013 + * yyyy/MM/dd - e.g. 2013/03/06 + * yyyy-MM-dd - e.g. 2013-06-03 + * dddd, MMMM dd, yyyy - e.g. Wednesday, March 06, 2013 + * MMMM dd, yyyy - e.g. March 06, 2013 + * dd MMMM, yyyy - e.g. 06 March, 2013 + * + */ + dateFormat?: string; + /** + * List of supported OSD time formats. This element shall be present when the value of Type field has Time or DateAndTime. The following TimeFormat are defined: + * h:mm:ss tt - e.g. 2:14:21 PM + * hh:mm:ss tt - e.g. 02:14:21 PM + * H:mm:ss - e.g. 14:14:21 + * HH:mm:ss - e.g. 14:14:21 + * + */ + timeFormat?: string; + /** Font size of the text in pt. */ + fontSize?: number; + /** Font color of the text. */ + fontColor?: OSDColor; + /** Background color of the text. */ + backgroundColor?: OSDColor; + /** The content of text to be displayed. */ + plainText?: string; + extension?: OSDTextConfigurationExtension; +} +export interface OSDTextConfigurationExtension {} +export interface OSDImgConfiguration { + /** The URI of the image which to be displayed. */ + imgPath?: AnyURI; + extension?: OSDImgConfigurationExtension; +} +export interface OSDImgConfigurationExtension {} +export interface ColorspaceRange { + X?: FloatRange; + Y?: FloatRange; + Z?: FloatRange; + /** Acceptable values are the same as in tt:Color. */ + colorspace?: AnyURI; +} +/** Describe the colors supported. Either list each color or define the range of color values. */ +export interface ColorOptions {} +/** Describe the option of the color and its transparency. */ +export interface OSDColorOptions { + /** Optional list of supported colors. */ + color?: ColorOptions; + /** Range of the transparent level. Larger means more tranparent. */ + transparent?: IntRange; + extension?: OSDColorOptionsExtension; +} +export interface OSDColorOptionsExtension {} +export interface OSDTextOptions { + /** List of supported OSD text type. When a device indicates the supported number relating to Text type in MaximumNumberOfOSDs, the type shall be presented. */ + type?: string[]; + /** Range of the font size value. */ + fontSizeRange?: IntRange; + /** List of supported date format. */ + dateFormat?: string[]; + /** List of supported time format. */ + timeFormat?: string[]; + /** List of supported font color. */ + fontColor?: OSDColorOptions; + /** List of supported background color. */ + backgroundColor?: OSDColorOptions; + extension?: OSDTextOptionsExtension; +} +export interface OSDTextOptionsExtension {} +export interface OSDImgOptions { + /** List of supported image MIME types, such as "image/png". */ + formatsSupported?: StringAttrList; + /** The maximum size (in bytes) of the image that can be uploaded. */ + maxSize?: number; + /** The maximum width (in pixels) of the image that can be uploaded. */ + maxWidth?: number; + /** The maximum height (in pixels) of the image that can be uploaded. */ + maxHeight?: number; + /** List of available image URIs. */ + imagePath?: AnyURI[]; + extension?: OSDImgOptionsExtension; +} +export interface OSDImgOptionsExtension {} +export interface OSDConfiguration extends DeviceEntity { + /** Reference to the video source configuration. */ + videoSourceConfigurationToken?: OSDReference; + /** Type of OSD. */ + type?: OSDType; + /** Position configuration of OSD. */ + position?: OSDPosConfiguration; + /** Text configuration of OSD. It shall be present when the value of Type field is Text. */ + textString?: OSDTextConfiguration; + /** Image configuration of OSD. It shall be present when the value of Type field is Image */ + image?: OSDImgConfiguration; + extension?: OSDConfigurationExtension; +} +export interface OSDConfigurationExtension {} +export interface MaximumNumberOfOSDs { + total: number; + image?: number; + plainText?: number; + date?: number; + time?: number; + dateAndTime?: number; +} +export interface OSDConfigurationOptions { + /** The maximum number of OSD configurations supported for the specified video source configuration. If the configuration does not support OSDs, this value shall be zero and the Type and PositionOption elements are ignored. If a device limits the number of instances by OSDType, it shall indicate the supported number for each type via the related attribute. */ + maximumNumberOfOSDs?: MaximumNumberOfOSDs; + /** List supported type of OSD configuration. When a device indicates the supported number for each types in MaximumNumberOfOSDs, related type shall be presented. A device shall return Option element relating to listed type. */ + type?: OSDType[]; + /** + * List available OSD position type. Following are the pre-defined:UpperLeft + * UpperRight + * LowerLeft + * LowerRight + * Custom + */ + positionOption?: string[]; + /** Option of the OSD text configuration. This element shall be returned if the device is signaling the support for Text. */ + textOption?: OSDTextOptions; + /** Option of the OSD image configuration. This element shall be returned if the device is signaling the support for Image. */ + imageOption?: OSDImgOptions; + extension?: OSDConfigurationOptionsExtension; +} +export interface OSDConfigurationOptionsExtension {} +export interface FileProgress { + /** Exported file name */ + fileName?: string; + /** Normalized percentage completion for uploading the exported file */ + progress?: number; +} +export interface ArrayOfFileProgress { + /** Exported file name and export progress information */ + fileProgress?: FileProgress[]; + extension?: ArrayOfFileProgressExtension; +} +export interface ArrayOfFileProgressExtension {} +export interface StorageReferencePath { + /** identifier of an existing Storage Configuration. */ + storageToken?: ReferenceToken; + /** gives the relative directory path on the storage */ + relativePath?: string; + extension?: StorageReferencePathExtension; +} +export interface StorageReferencePathExtension {} +export interface PolygonOptions { + /** + * True if the device supports defining a region only using Rectangle. + * The rectangle points are still passed using a Polygon element if the device does not support polygon regions. In this case, the points provided in the Polygon element shall represent a rectangle. + */ + rectangleOnly?: boolean; + /** + * Provides the minimum and maximum number of points that can be defined in the Polygon. + * If RectangleOnly is not set to true, this parameter is required. + */ + vertexLimits?: IntRange; +} +export interface StringItems { + item?: string[]; +} +export interface Message { + utcTime: Date; + propertyOperation?: PropertyOperation; + /** Token value pairs that triggered this message. Typically only one item is present. */ + source?: ItemList; + key?: ItemList; + data?: ItemList; + extension?: MessageExtension; +} diff --git a/src/interfaces/provisioning.ts b/src/interfaces/provisioning.ts new file mode 100644 index 00000000..532b62e0 --- /dev/null +++ b/src/interfaces/provisioning.ts @@ -0,0 +1,115 @@ +import { PositiveInteger } from './types'; +import { ReferenceToken } from './common'; + +/** The direction for PanMove to move the device. */ +export type PanDirection = 'Left' | 'Right'; +/** The direction for TiltMove to move the device. */ +export type TiltDirection = 'Up' | 'Down'; +/** The direction for ZoomMove to change the focal length in relation to the video source. */ +export type ZoomDirection = 'Wide' | 'Telephoto'; +/** The direction for RollMove to move the device. */ +export type RollDirection = 'Clockwise' | 'Counterclockwise' | 'Auto'; +/** The direction for FocusMove to move the focal plane in relation to the video source. */ +export type FocusDirection = 'Near' | 'Far' | 'Auto'; +/** The quantity of movement events that have occured over the lifetime of the device. */ +export interface Usage { + /** The quantity of pan movement events over the life of the device. */ + pan?: PositiveInteger; + /** The quantity of tilt movement events over the life of the device. */ + tilt?: PositiveInteger; + /** The quantity of zoom movement events over the life of the device. */ + zoom?: PositiveInteger; + /** The quantity of roll movement events over the life of the device. */ + roll?: PositiveInteger; + /** The quantity of focus movement events over the life of the device. */ + focus?: PositiveInteger; +} +/** The provisioning capabilities of a video source on the device. */ +export interface SourceCapabilities { + /** Unique identifier of a video source. */ + videoSourceToken: ReferenceToken; + /** Lifetime limit of pan moves for this video source. Presence of this attribute indicates support of pan move. */ + maximumPanMoves?: PositiveInteger; + /** Lifetime limit of tilt moves for this video source. Presence of this attribute indicates support of tilt move. */ + maximumTiltMoves?: PositiveInteger; + /** Lifetime limit of zoom moves for this video source. Presence of this attribute indicates support of zoom move. */ + maximumZoomMoves?: PositiveInteger; + /** Lifetime limit of roll moves for this video source. Presence of this attribute indicates support of roll move. */ + maximumRollMoves?: PositiveInteger; + /** Indicates "auto" as a valid enum for Direction in RollMove. */ + autoLevel?: boolean; + /** Lifetime limit of focus moves for this video source. Presence of this attribute indicates support of focus move. */ + maximumFocusMoves?: PositiveInteger; + /** Indicates "auto" as a valid enum for Direction in FocusMove. */ + autoFocus?: boolean; +} +/** The capabilities of Provisioning Service on the device. */ +export interface Capabilities { + /** Maximum time before stopping movement after a move operation. */ + defaultTimeout?: any; + /** Capabilities per video source. */ + source?: SourceCapabilities[]; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the provisioning service on this device. */ + capabilities?: Capabilities; +} +export interface PanMove { + /** The video source associated with the provisioning. */ + videoSource?: ReferenceToken; + /** "left" or "right". */ + direction?: PanDirection; + /** "Operation timeout, if less than default timeout. */ + timeout?: any; +} +export interface PanMoveResponse {} +export interface TiltMove { + /** The video source associated with the provisioning. */ + videoSource?: ReferenceToken; + /** "up" or "down". */ + direction?: TiltDirection; + /** "Operation timeout, if less than default timeout. */ + timeout?: any; +} +export interface TiltMoveResponse {} +export interface ZoomMove { + /** The video source associated with the provisioning. */ + videoSource?: ReferenceToken; + /** "wide" or "telephoto". */ + direction?: ZoomDirection; + /** "Operation timeout, if less than default timeout. */ + timeout?: any; +} +export interface ZoomMoveResponse {} +export interface RollMove { + /** The video source associated with the provisioning. */ + videoSource?: ReferenceToken; + /** "clockwise", "counterclockwise", or "auto". */ + direction?: RollDirection; + /** "Operation timeout, if less than default timeout. */ + timeout?: any; +} +export interface RollMoveResponse {} +export interface FocusMove { + /** The video source associated with the provisioning. */ + videoSource?: ReferenceToken; + /** "near", "far", or "auto". */ + direction?: FocusDirection; + /** "Operation timeout, if less than default timeout. */ + timeout?: any; +} +export interface FocusMoveResponse {} +export interface Stop { + /** The video source associated with the provisioning. */ + videoSource?: ReferenceToken; +} +export interface StopResponse {} +export interface GetUsage { + /** The video source associated with the provisioning. */ + videoSource?: ReferenceToken; +} +export interface GetUsageResponse { + /** The set of lifetime usage values for the provisioning associated with the video source. */ + usage?: Usage; +} diff --git a/src/interfaces/ptz.2.ts b/src/interfaces/ptz.2.ts new file mode 100644 index 00000000..726c016b --- /dev/null +++ b/src/interfaces/ptz.2.ts @@ -0,0 +1,250 @@ +import { + StringList, + PTZNode, + PTZConfiguration, + PTZConfigurationOptions, + AuxiliaryData, + PTZPreset, + PTZSpeed, + PresetTour, + PTZPresetTourOptions, + PTZPresetTourOperation, +} from './onvif'; +import { ReferenceToken, PTZStatus, PTZVector, GeoLocation } from './common'; + +export interface Capabilities { + /** Indicates whether or not EFlip is supported. */ + EFlip?: boolean; + /** Indicates whether or not reversing of PT control direction is supported. */ + reverse?: boolean; + /** Indicates support for the GetCompatibleConfigurations command. */ + getCompatibleConfigurations?: boolean; + /** Indicates that the PTZStatus includes MoveStatus information. */ + moveStatus?: boolean; + /** Indicates that the PTZStatus includes Position information. */ + statusPosition?: boolean; + /** Indication of the methods of MoveAndTrack that are supported, acceptable values are defined in tt:MoveAndTrackMethod. */ + moveAndTrack?: StringList; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the PTZ service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetNodesResponse { + /** A list of the existing PTZ Nodes on the device. */ + PTZNode?: PTZNode[]; +} +export interface GetNode { + /** Token of the requested PTZNode. */ + nodeToken?: ReferenceToken; +} +export interface GetNodeResponse { + /** A requested PTZNode. */ + PTZNode?: PTZNode; +} +export interface GetConfigurationsResponse { + /** A list of all existing PTZConfigurations on the device. */ + PTZConfiguration?: PTZConfiguration[]; +} +export interface GetConfiguration { + /** Token of the requested PTZConfiguration. */ + PTZConfigurationToken?: ReferenceToken; +} +export interface GetConfigurationResponse { + /** A requested PTZConfiguration. */ + PTZConfiguration?: PTZConfiguration; +} +export interface SetConfiguration { + /**/ + PTZConfiguration?: PTZConfiguration; + /** Flag that makes configuration persistent. Example: User wants the configuration to exist after reboot. */ + forcePersistence?: boolean; +} +export interface SetConfigurationResponse {} +export interface GetConfigurationOptions { + /** Token of an existing configuration that the options are intended for. */ + configurationToken?: ReferenceToken; +} +export interface GetConfigurationOptionsResponse { + /** The requested PTZ configuration options. */ + PTZConfigurationOptions?: PTZConfigurationOptions; +} +export interface SendAuxiliaryCommand { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; + /** The Auxiliary request data. */ + auxiliaryData?: AuxiliaryData; +} +export interface SendAuxiliaryCommandResponse { + /** The response contains the auxiliary response. */ + auxiliaryResponse?: AuxiliaryData; +} +export interface GetPresets { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; +} +export interface GetPresetsResponse { + /** A list of presets which are available for the requested MediaProfile. */ + preset?: PTZPreset[]; +} +export interface SetPreset { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; + /** A requested preset name. */ + presetName?: string; + /** A requested preset token. */ + presetToken?: ReferenceToken; +} +export interface SetPresetResponse { + /** A token to the Preset which has been set. */ + presetToken?: ReferenceToken; +} +export interface RemovePreset { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; + /** A requested preset token. */ + presetToken?: ReferenceToken; +} +export interface GotoPreset { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; + /** A requested preset token. */ + presetToken?: ReferenceToken; + /** A requested speed.The speed parameter can only be specified when Speed Spaces are available for the PTZ Node. */ + speed?: PTZSpeed; +} +export interface GetStatus { + /** A reference to the MediaProfile where the PTZStatus should be requested. */ + profileToken?: ReferenceToken; +} +export interface GetStatusResponse { + /** The PTZStatus for the requested MediaProfile. */ + PTZStatus?: PTZStatus; +} +export interface GotoHomePosition { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; + /** A requested speed.The speed parameter can only be specified when Speed Spaces are available for the PTZ Node. */ + speed?: PTZSpeed; +} +export interface GotoHomePositionResponse {} +export interface SetHomePosition { + /** A reference to the MediaProfile where the home position should be set. */ + profileToken?: ReferenceToken; +} +export interface SetHomePositionResponse {} +export interface ContinuousMove { + /** A reference to the MediaProfile. */ + profileToken?: ReferenceToken; + /** A Velocity vector specifying the velocity of pan, tilt and zoom. */ + velocity?: PTZSpeed; + /** An optional Timeout parameter. */ + timeout?: any; +} +export interface ContinuousMoveResponse {} +export interface RelativeMove { + /** A reference to the MediaProfile. */ + profileToken?: ReferenceToken; + /** A positional Translation relative to the current position */ + translation?: PTZVector; + /** An optional Speed parameter. */ + speed?: PTZSpeed; +} +export interface RelativeMoveResponse {} +export interface AbsoluteMove { + /** A reference to the MediaProfile. */ + profileToken?: ReferenceToken; + /** A Position vector specifying the absolute target position. */ + position?: PTZVector; + /** An optional Speed. */ + speed?: PTZSpeed; +} +export interface AbsoluteMoveResponse {} +export interface GeoMove { + /** A reference to the MediaProfile. */ + profileToken?: ReferenceToken; + /** The geolocation of the target position. */ + target?: GeoLocation; + /** An optional Speed. */ + speed?: PTZSpeed; + /** An optional indication of the height of the target/area. */ + areaHeight?: number; + /** An optional indication of the width of the target/area. */ + areaWidth?: number; +} +export interface GeoMoveResponse {} +export interface Stop { + /** A reference to the MediaProfile that indicate what should be stopped. */ + profileToken?: ReferenceToken; + /** Set true when we want to stop ongoing pan and tilt movements.If PanTilt arguments are not present, this command stops these movements. */ + panTilt?: boolean; + /** Set true when we want to stop ongoing zoom movement.If Zoom arguments are not present, this command stops ongoing zoom movement. */ + zoom?: boolean; +} +export interface StopResponse {} +export interface GetPresetTours { + profileToken?: ReferenceToken; +} +export interface GetPresetToursResponse { + presetTour?: PresetTour[]; +} +export interface GetPresetTour { + profileToken?: ReferenceToken; + presetTourToken?: ReferenceToken; +} +export interface GetPresetTourResponse { + presetTour?: PresetTour; +} +export interface GetPresetTourOptions { + profileToken?: ReferenceToken; + presetTourToken?: ReferenceToken; +} +export interface GetPresetTourOptionsResponse { + options?: PTZPresetTourOptions; +} +export interface CreatePresetTour { + profileToken?: ReferenceToken; +} +export interface CreatePresetTourResponse { + presetTourToken?: ReferenceToken; +} +export interface ModifyPresetTour { + profileToken?: ReferenceToken; + presetTour?: PresetTour; +} +export interface ModifyPresetTourResponse {} +export interface OperatePresetTour { + profileToken?: ReferenceToken; + presetTourToken?: ReferenceToken; + operation?: PTZPresetTourOperation; +} +export interface OperatePresetTourResponse {} +export interface RemovePresetTour { + profileToken?: ReferenceToken; + presetTourToken?: ReferenceToken; +} +export interface RemovePresetTourResponse {} +export interface GetCompatibleConfigurations { + /** Contains the token of an existing media profile the configurations shall be compatible with. */ + profileToken?: ReferenceToken; +} +export interface GetCompatibleConfigurationsResponse { + /** A list of all existing PTZConfigurations on the NVT that is suitable to be added to the addressed media profile. */ + PTZConfiguration?: PTZConfiguration[]; +} +export interface MoveAndStartTracking { + /** A reference to the MediaProfile where the operation should take place. */ + profileToken?: ReferenceToken; + /** A preset token. */ + presetToken?: ReferenceToken; + /** The geolocation of the target position. */ + geoLocation?: GeoLocation; + /** A Position vector specifying the absolute target position. */ + targetPosition?: PTZVector; + /** Speed vector specifying the velocity of pan, tilt and zoom. */ + speed?: PTZSpeed; + /** Object ID of the object to track. */ + objectID?: number; +} +export interface MoveAndStartTrackingResponse {} diff --git a/src/interfaces/radiometry.2.ts b/src/interfaces/radiometry.2.ts new file mode 100644 index 00000000..dc4c91ea --- /dev/null +++ b/src/interfaces/radiometry.2.ts @@ -0,0 +1,141 @@ +import { FloatRange } from './onvif'; +import { ReferenceToken, Vector, PTZVector, Rectangle } from './common'; + +export type TemperatureCondition = 'LessThan' | 'MoreThan' | 'EqualTo' | 'Change'; +export type TemperatureType = 'MaxTemp' | 'MinTemp' | 'AverageTemp' | 'StdDeviation' | 'MedianTemp' | 'ISOCoverage'; +export interface RadiometryModuleConfigOptions { + /** + * The total number of temperature measurement modules that can be created on the + * device, screen based or geolocated, of any type (spots or boxes). + */ + maxMeasurementModules?: number; + /** + * The total number of spot measurement modules that can be loaded simultaneously on the + * screen by the device. A value of 0 shall be used to indicate no support for Spots. + */ + maxScreenSpots?: number; + /** + * The total number of box measurement modules that can be loaded simultaneously on the + * screen by the device. A value of 0 shall be used to indicate no support for Boxes. + */ + maxScreenBoxes?: number; + /** Specifies valid ranges for the different radiometry parameters used for temperature calculation. */ + radiometryParameterOptions?: RadiometryParameterOptions; +} +/** Describes valid ranges for the different radiometry parameters used for accurate temperature calculation. */ +export interface RadiometryParameterOptions { + /** Valid range of temperature values, in Kelvin. */ + reflectedAmbientTemperature?: FloatRange; + /** Valid range of emissivity values for the objects to measure. */ + emissivity?: FloatRange; + /** Valid range of distance between camera and object for a valid temperature reading, in meters. */ + distanceToObject?: FloatRange; + /** Valid range of relative humidity values, in percentage. */ + relativeHumidity?: FloatRange; + /** Valid range of temperature values, in Kelvin. */ + atmosphericTemperature?: FloatRange; + /** Valid range of atmospheric transmittance values. */ + atmosphericTransmittance?: FloatRange; + /** Valid range of temperature values, in Kelvin. */ + extOpticsTemperature?: FloatRange; + /** Valid range of external optics transmittance. */ + extOpticsTransmittance?: FloatRange; +} +export interface RadiometrySpotModuleConfig { + /** Unique identifier for this Spot Temperature Measurement Analytics Module. */ + itemID?: ReferenceToken; + /** Indicates if the Temperature Measurement Item is enabled to provide temperature readings. */ + active?: boolean; + /** Screen coordinates, if spot is currently on screen. Assumes normalized screen limits (-1.0, 1.0). */ + screenCoords?: Vector; + /** + * Absolute orientation of the PTZ Vector with the Spot on screen. If no PTZVector is present + * the spot shall behave as a screen element, and stay on the same screen coordinates as the PTZ + * moves (like a head up display mask). If PTZVector is present the Spot element shall appear on + * display only when contained in the Field of View. In this case SpotScreenCoords shall be + * reported as relative to PTZVector. + */ + absoluteCoords?: PTZVector; + /** Not present parameter means the Device shall use its value from Global Parameters in Thermal Service. */ + radiometryParameters?: RadiometryParameters; +} +export interface RadiometryBoxModuleConfig { + /** Unique identifier for this Box Temperature Measurement Analytics Module. */ + itemID?: ReferenceToken; + /** Indicates if the Temperature Measurement Item is enabled to provide temperature readings. */ + active?: boolean; + /** Screen coordinates, if box is currently on screen. Assumes normalized screen limits (-1.0, 1.0). */ + screenCoords?: Rectangle; + /** + * Absolute orientation of the PTZ Vector with the Box on screen. If no PTZVector is present + * the box shall behave as a screen element, and stay on the same screen coordinates as the PTZ + * moves (like a head up display mask). If PTZVector is present the Box element shall appear on + * display only when contained in the Field of View. In this case BoxScreenCoords shall be + * reported as relative to PTZVector. + */ + absoluteCoords?: PTZVector; + /** Not present parameter means the Device shall use its value from Global Parameters in Thermal Service. */ + radiometryParameters?: RadiometryParameters; +} +export interface SpotTemperatureReading { + itemID?: ReferenceToken; + spotTemperature: number; + /** Not present means Global Parameters from Thermal Service are being used. */ + radiometryParameters?: RadiometryParameters; +} +export interface BoxTemperatureReading { + itemID: ReferenceToken; + maxTemperature: number; + minTemperature: number; + averageTemperature?: number; + medianTemperature?: number; + /** Not present means Global Parameters from Thermal Service are being used. */ + radiometryParameters?: RadiometryParameters; +} +export interface RadiometryParameters { + reflectedAmbientTemperature?: number; + emissivity?: number; + distanceToObject?: number; + relativeHumidity?: number; + atmosphericTemperature?: number; + atmosphericTransmittance?: number; + extOpticsTemperature?: number; + extOpticsTransmittance?: number; +} +export interface RadiometryRuleConfigOptions { + /** Specifies valid ranges for thresholds and reference parameters used for triggering radiometric rules. */ + radiometryRuleOptions?: RadiometryRuleOptions; + /** Specifies valid rule conditions for temperature comparisions in radiometric rules. */ + temperatureConditionOptions?: TemperatureCondition[]; + /** Specifies temperature measurement types provided by radiometry analytics modules in the device. */ + temperatureTypeOptions?: TemperatureType[]; +} +/** Describes valid ranges for radiometric rule condition thresholds and reference parameters. */ +export interface RadiometryRuleOptions { + /** Valid range of temperature values, in Kelvin. */ + thresholdTemperature?: FloatRange; + /** Valid range of hysteresis time interval for temperature conditions, in seconds. */ + thresholdTime?: FloatRange; + /** Valid range of temperature hysteresis values, in Kelvin. */ + hysteresisTemperature?: FloatRange; +} +export interface RadiometryTemperatureRuleConfig { + /** Reference Token to the Temperature Measurement Analytics Module providing the Temperature on which rule is defined. */ + radiometryModuleID?: ReferenceToken; + /** Indicates if the Temperature Rule is enabled to provide temperature alarm events. */ + enabled?: boolean; + /** + * Indicates which of the temperature values provided by the input Analytics Module + * shall be used by the rule. In the case of Analytics Modules providing a single + * Temperature Value (e.g. Spot) this parameter is ignored, and is therefore optional. + */ + temperatureType?: TemperatureType; + /** Indicates the type of temperature condition to check. */ + ruleCondition?: TemperatureCondition; + /** Indicates the temperature reference value the rule shall be checked against. */ + thresholdTemperature?: number; + /** Indicates the time interval during which the rule condition shall be met to trigger an event. */ + thresholdTime?: any; + /** Indicates the width in Kelvin of the temerature hysteresis band to be considered by the rule. */ + hysteresisTemperature?: number; +} diff --git a/src/interfaces/receiver.ts b/src/interfaces/receiver.ts new file mode 100644 index 00000000..2521e22c --- /dev/null +++ b/src/interfaces/receiver.ts @@ -0,0 +1,68 @@ +import { Receiver, ReceiverConfiguration, ReceiverMode, ReceiverStateInformation } from './onvif'; +import { ReferenceToken } from './common'; + +export interface Capabilities { + /** Indicates that the device can receive RTP multicast streams. */ + RTP_Multicast?: boolean; + /** Indicates that the device can receive RTP/TCP streams */ + RTP_TCP?: boolean; + /** Indicates that the device can receive RTP/RTSP/TCP streams. */ + RTP_RTSP_TCP?: boolean; + /** The maximum number of receivers supported by the device. */ + supportedReceivers: number; + /** The maximum allowed length for RTSP URIs (Minimum and default value is 128 octet). */ + maximumRTSPURILength?: number; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the receiver service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetReceivers {} +export interface GetReceiversResponse { + /** A list of all receivers that currently exist on the device. */ + receivers?: Receiver[]; +} +export interface GetReceiver { + /** The token of the receiver to be retrieved. */ + receiverToken?: ReferenceToken; +} +export interface GetReceiverResponse { + /** The details of the receiver. */ + receiver?: Receiver; +} +export interface CreateReceiver { + /** The initial configuration for the new receiver. */ + configuration?: ReceiverConfiguration; +} +export interface CreateReceiverResponse { + /** The details of the receiver that was created. */ + receiver?: Receiver; +} +export interface DeleteReceiver { + /** The token of the receiver to be deleted. */ + receiverToken?: ReferenceToken; +} +export interface DeleteReceiverResponse {} +export interface ConfigureReceiver { + /** The token of the receiver to be configured. */ + receiverToken?: ReferenceToken; + /** The new configuration for the receiver. */ + configuration?: ReceiverConfiguration; +} +export interface ConfigureReceiverResponse {} +export interface SetReceiverMode { + /** The token of the receiver to be changed. */ + receiverToken?: ReferenceToken; + /** The new receiver mode. Options available are: */ + mode?: ReceiverMode; +} +export interface SetReceiverModeResponse {} +export interface GetReceiverState { + /** The token of the receiver to be queried. */ + receiverToken?: ReferenceToken; +} +export interface GetReceiverStateResponse { + /** Description of the current receiver state. */ + receiverState?: ReceiverStateInformation; +} diff --git a/src/interfaces/recording.ts b/src/interfaces/recording.ts new file mode 100644 index 00000000..1f1c3205 --- /dev/null +++ b/src/interfaces/recording.ts @@ -0,0 +1,272 @@ +import { + StringList, + StringAttrList, + RecordingConfiguration, + RecordingReference, + GetRecordingsResponseItem, + TrackConfiguration, + TrackReference, + RecordingJobConfiguration, + RecordingJobReference, + GetRecordingJobsResponseItem, + RecordingJobMode, + RecordingJobStateInformation, + Date, + SearchScope, + StorageReferencePath, + ArrayOfFileProgress, +} from './onvif'; +import { ReferenceToken } from './common'; + +export interface Capabilities { + /** Indication if the device supports dynamic creation and deletion of recordings */ + dynamicRecordings?: boolean; + /** Indication if the device supports dynamic creation and deletion of tracks */ + dynamicTracks?: boolean; + /** Indication which encodings are supported for recording. The list may contain one or more enumeration values of tt:VideoEncoding and tt:AudioEncoding. For encodings that are neither defined in tt:VideoEncoding nor tt:AudioEncoding the device shall use the IANA defintions. Note, that a device without audio support shall not return audio encodings. */ + encoding?: StringList; + /** Maximum supported bit rate for all tracks of a recording in kBit/s. */ + maxRate?: number; + /** Maximum supported bit rate for all recordings in kBit/s. */ + maxTotalRate?: number; + /** Maximum number of recordings supported. (Integer values only.) */ + maxRecordings?: number; + /** Maximum total number of supported recording jobs by the device. */ + maxRecordingJobs?: number; + /** Indication if the device supports the GetRecordingOptions command. */ + options?: boolean; + /** Indication if the device supports recording metadata. */ + metadataRecording?: boolean; + /** + * Indication that the device supports ExportRecordedData command for the listed export file formats. + * The list shall return at least one export file format value. The value of 'ONVIF' refers to + * ONVIF Export File Format specification. + */ + supportedExportFileFormats?: StringAttrList; + /** Indication that the device supports event triggered recording. */ + eventRecording?: boolean; + /** If present a device shall support configuring before event durations up to the given value. */ + beforeEventLimit?: any; + /** If present a device shall support configuring after event durations up to the given value. */ + afterEventLimit?: any; + /** + * List of formats supported by the device for recording to an external target. + * See tt:TargetFormat for a list of definitions. + */ + supportedTargetFormats?: StringAttrList; + /** + * Number of encryption entries supported per recording. + * By specifying multiple encryption entries per recording, different tracks can be encrypted with different configurations. + */ + encryptionEntryLimit?: number; + /** + * Indicates supported encryption modes. + * See tt:EncryptionMode for a list of definitions. + */ + supportedEncryptionModes?: StringAttrList; +} +export interface RecordingOptions { + job?: JobOptions; + track?: TrackOptions; +} +export interface JobOptions { + /** Number of spare jobs that can be created for the recording. */ + spare?: number; + /** A device that supports recording of a restricted set of Media/Media2 Service Profiles returns the list of profiles that can be recorded on the given Recording. */ + compatibleSources?: StringAttrList; +} +export interface TrackOptions { + /** Total spare number of tracks that can be added to this recording. */ + spareTotal?: number; + /** Number of spare Video tracks that can be added to this recording. */ + spareVideo?: number; + /** Number of spare Aduio tracks that can be added to this recording. */ + spareAudio?: number; + /** Number of spare Metadata tracks that can be added to this recording. */ + spareMetadata?: number; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the recording service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface CreateRecording { + /** Initial configuration for the recording. */ + recordingConfiguration?: RecordingConfiguration; +} +export interface CreateRecordingResponse { + /** The reference to the created recording. */ + recordingToken?: RecordingReference; +} +export interface DeleteRecording { + /** The reference of the recording to be deleted. */ + recordingToken?: RecordingReference; +} +export interface DeleteRecordingResponse {} +export interface GetRecordings {} +export interface GetRecordingsResponse { + /** List of recording items. */ + recordingItem?: GetRecordingsResponseItem[]; +} +export interface SetRecordingConfiguration { + /** Token of the recording that shall be changed. */ + recordingToken?: RecordingReference; + /** The new configuration. */ + recordingConfiguration?: RecordingConfiguration; +} +export interface SetRecordingConfigurationResponse {} +export interface GetRecordingConfiguration { + /** Token of the configuration to be retrieved. */ + recordingToken?: RecordingReference; +} +export interface GetRecordingConfigurationResponse { + /** Configuration of the recording. */ + recordingConfiguration?: RecordingConfiguration; +} +export interface CreateTrack { + /** Identifies the recording to which a track shall be added. */ + recordingToken?: RecordingReference; + /** The configuration of the new track. */ + trackConfiguration?: TrackConfiguration; +} +export interface CreateTrackResponse { + /** + * The TrackToken shall identify the newly created track. The + * TrackToken shall be unique within the recoding to which + * the new track belongs. + */ + trackToken?: TrackReference; +} +export interface DeleteTrack { + /** Token of the recording the track belongs to. */ + recordingToken?: RecordingReference; + /** Token of the track to be deleted. */ + trackToken?: TrackReference; +} +export interface DeleteTrackResponse {} +export interface GetTrackConfiguration { + /** Token of the recording the track belongs to. */ + recordingToken?: RecordingReference; + /** Token of the track. */ + trackToken?: TrackReference; +} +export interface GetTrackConfigurationResponse { + /** Configuration of the track. */ + trackConfiguration?: TrackConfiguration; +} +export interface SetTrackConfiguration { + /** Token of the recording the track belongs to. */ + recordingToken?: RecordingReference; + /** Token of the track to be modified. */ + trackToken?: TrackReference; + /** New configuration for the track. */ + trackConfiguration?: TrackConfiguration; +} +export interface SetTrackConfigurationResponse {} +export interface CreateRecordingJob { + /** The initial configuration of the new recording job. */ + jobConfiguration?: RecordingJobConfiguration; +} +export interface CreateRecordingJobResponse { + /** The JobToken shall identify the created recording job. */ + jobToken?: RecordingJobReference; + /** + * The JobConfiguration structure shall be the configuration as it is used by the device. This may be different from the + * JobConfiguration passed to CreateRecordingJob. + */ + jobConfiguration?: RecordingJobConfiguration; +} +export interface DeleteRecordingJob { + /** The token of the job to be deleted. */ + jobToken?: RecordingJobReference; +} +export interface DeleteRecordingJobResponse {} +export interface GetRecordingJobs {} +export interface GetRecordingJobsResponse { + /** List of recording jobs. */ + jobItem?: GetRecordingJobsResponseItem[]; +} +export interface SetRecordingJobConfiguration { + /** Token of the job to be modified. */ + jobToken?: RecordingJobReference; + /** New configuration of the recording job. */ + jobConfiguration?: RecordingJobConfiguration; +} +export interface SetRecordingJobConfigurationResponse { + /** + * The JobConfiguration structure shall be the configuration + * as it is used by the device. This may be different from the JobConfiguration passed to SetRecordingJobConfiguration. + */ + jobConfiguration?: RecordingJobConfiguration; +} +export interface GetRecordingJobConfiguration { + /** Token of the recording job. */ + jobToken?: RecordingJobReference; +} +export interface GetRecordingJobConfigurationResponse { + /** Current configuration of the recording job. */ + jobConfiguration?: RecordingJobConfiguration; +} +export interface SetRecordingJobMode { + /** Token of the recording job. */ + jobToken?: RecordingJobReference; + /** The new mode for the recording job. */ + mode?: RecordingJobMode; +} +export interface SetRecordingJobModeResponse {} +export interface GetRecordingJobState { + /** Token of the recording job. */ + jobToken?: RecordingJobReference; +} +export interface GetRecordingJobStateResponse { + /** The current state of the recording job. */ + state?: RecordingJobStateInformation; +} +export interface GetRecordingOptions { + /** Token of the recording. */ + recordingToken?: RecordingReference; +} +export interface GetRecordingOptionsResponse { + /** Configuration of the recording. */ + options?: RecordingOptions; +} +export interface ExportRecordedData { + /** Optional parameter that specifies start time for the exporting. */ + startPoint?: Date; + /** Optional parameter that specifies end time for the exporting. */ + endPoint?: Date; + /** Indicates the selection criterion on the existing recordings. . */ + searchScope?: SearchScope; + /** Indicates which export file format to be used. */ + fileFormat?: string; + /** Indicates the target storage and relative directory path. */ + storageDestination?: StorageReferencePath; +} +export interface Extension {} +export interface ExportRecordedDataResponse { + /** Unique operation token for client to associate the relevant events. */ + operationToken?: ReferenceToken; + /** List of exported file names. The device can also use AsyncronousOperationStatus event to publish this list. */ + fileNames?: string[]; + extension?: Extension; +} +export interface StopExportRecordedData { + /** Unique ExportRecordedData operation token */ + operationToken?: ReferenceToken; +} +export interface StopExportRecordedDataResponse { + /** Progress percentage of ExportRecordedData operation. */ + progress?: number; + /**/ + fileProgressStatus?: ArrayOfFileProgress; +} +export interface GetExportRecordedDataState { + /** Unique ExportRecordedData operation token */ + operationToken?: ReferenceToken; +} +export interface GetExportRecordedDataStateResponse { + /** Progress percentage of ExportRecordedData operation. */ + progress?: number; + /**/ + fileProgressStatus?: ArrayOfFileProgress; +} diff --git a/src/interfaces/replay.ts b/src/interfaces/replay.ts new file mode 100644 index 00000000..2c72bf65 --- /dev/null +++ b/src/interfaces/replay.ts @@ -0,0 +1,39 @@ +import { FloatList, StreamSetup, ReplayConfiguration } from './onvif'; +import { AnyURI } from './basics'; +import { ReferenceToken } from './common'; + +export interface Capabilities { + /** Indicator that the Device supports reverse playback as defined in the ONVIF Streaming Specification. */ + reversePlayback?: boolean; + /** The list contains two elements defining the minimum and maximum valid values supported as session timeout in seconds. */ + sessionTimeoutRange?: FloatList; + /** Indicates support for RTP/RTSP/TCP. */ + RTP_RTSP_TCP?: boolean; + /** If playback streaming over WebSocket is supported, this shall return the RTSP WebSocket URI as described in Streaming Specification Section 5.1.1.5. */ + RTSPWebSocketUri?: AnyURI; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the replay service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetReplayUri { + /** Specifies the connection parameters to be used for the stream. The URI that is returned may depend on these parameters. */ + streamSetup?: StreamSetup; + /** The identifier of the recording to be streamed. */ + recordingToken?: ReferenceToken; +} +export interface GetReplayUriResponse { + /** The URI to which the client should connect in order to stream the recording. */ + uri?: AnyURI; +} +export interface SetReplayConfiguration { + /** Description of the new replay configuration parameters. */ + configuration?: ReplayConfiguration; +} +export interface SetReplayConfigurationResponse {} +export interface GetReplayConfiguration {} +export interface GetReplayConfigurationResponse { + /** The current replay configuration parameters. */ + configuration?: ReplayConfiguration; +} diff --git a/src/interfaces/rules.2.ts b/src/interfaces/rules.2.ts new file mode 100644 index 00000000..c891f5f5 --- /dev/null +++ b/src/interfaces/rules.2.ts @@ -0,0 +1,58 @@ +import { IntRange, ReferenceToken } from './common'; + +export interface MotionRegionConfigOptions { + /** Indicates the support for PTZ preset based motion detection, if supported Preset token can be associated with a motion region. */ + PTZPresetMotionSupport?: boolean; + /** + * The total number of Motion Region Detector rules that can be created on the device. + * This element is deprecated. maxInstances in the GetSupportedRules shall be used instead. + */ + maxRegions?: number; + /** True if the device supports disarming a Motion Region Detector rule. */ + disarmSupport?: boolean; + /** + * True if the device supports defining a region using a Polygon instead of a rectangle. + * The rectangle points are still passed using a Polygon element if the device does not support polygon regions. + * In this case, the points provided in the Polygon element shall represent a rectangle. + */ + polygonSupport?: boolean; + /** + * For devices that support Polygons with limitations on the number of sides, + * provides the minimum and maximum number of sides that can be defined in the + * Polygon. + */ + polygonLimits?: IntRange; + /** + * Indicates the device can only support one sensitivity level for all defines + * motion detection regions. Changing the sensitivity for one region would be + * applied to all regions. + */ + singleSensitivitySupport?: boolean; + /** + * True if the device will include the Name of the Rule to indicate the region + * that motion was detected in. + */ + ruleNotification?: boolean; +} +export interface MotionRegionConfig { + /** + * Indicates if the Motion Region is Armed (detecting motion) or Disarmed (motion is + * not being detected). + */ + armed?: boolean; + /** + * Indicates the sensitivity level of the motion detector for this region. The + * sensitivity value is normalized where 0 represents the lower sensitivity where + * significant motion is required to trigger an alarm and 1 represents the higher + * sensitivity where very little motion is required to trigger an alarm. + */ + sensitivity?: number; + /** + * Provides the points of a Polygon in the VideoSourceConfiguration's Bounds + * element. If the device does not support Polygons, this structure must contain + * four points that represent a Rectangle. + */ + ygon?: any; + /** Preset position associated with the motion region defined by Polygon. */ + presetToken?: ReferenceToken; +} diff --git a/src/interfaces/schedule.ts b/src/interfaces/schedule.ts new file mode 100644 index 00000000..97ee08d0 --- /dev/null +++ b/src/interfaces/schedule.ts @@ -0,0 +1,372 @@ +import { PositiveInteger, DataEntity } from './types'; +import { Name, Description, Time } from './onvif'; +import { ReferenceToken } from './common'; + +/** + * The service capabilities reflect optional functionality of a service. + * The information is static and does not change during device operation. + * The following capabilities are available: + */ +export interface ServiceCapabilities { + /** + * The maximum number of entries returned by a single Get<Entity>List or + * Get<Entity> request. The device shall never return more than this number + * of entities in a single response. + */ + maxLimit: PositiveInteger; + /** + * Indicates the maximum number of schedules the device supports. + * The device shall support at least one schedule. + */ + maxSchedules: PositiveInteger; + /** + * Indicates the maximum number of time periods per day the device supports + * in a schedule including special days schedule. The device shall support + * at least one time period per day. + */ + maxTimePeriodsPerDay: PositiveInteger; + /** + * Indicates the maximum number of special day group entities the device supports. + * The device shall support at least one ‘SpecialDayGroup’ entity. + */ + maxSpecialDayGroups: PositiveInteger; + /** + * Indicates the maximum number of days per ‘SpecialDayGroup’ entity the device + * supports. The device shall support at least one day per ‘SpecialDayGroup’ entity. + */ + maxDaysInSpecialDayGroup: PositiveInteger; + /** + * Indicates the maximum number of ‘SpecialDaysSchedule’ entities referred by a + * schedule that the device supports. + */ + maxSpecialDaysSchedules: PositiveInteger; + /** + * For schedules: + * If this capability is supported, then all iCalendar recurrence types shall + * be supported by the device. The device shall also support the start and end dates (or + * iCalendar occurrence count) in recurring events (see iCalendar examples in section 3). + * If this capability is not supported, then only the weekly iCalendar recurrence + * type shall be supported. Non-recurring events and other recurring types are + * not supported. The device shall only accept a start date with the year ‘1970’ + * (the month and day is needed to reflect the week day of the recurrence) + * and will not accept an occurrence count (or iCalendar until date) in recurring events. + * For special days (only applicable if SpecialDaysSupported is set to true): + * If this capability is supported, then all iCalendar recurrence types shall + * be supported by the device. The device shall also support the start and + * end dates (or occurrence count) in recurring events. + * If this capability is not supported, then only non-recurring special days are supported. + */ + extendedRecurrenceSupported: boolean; + /** If this capability is supported, then the device shall support special days. */ + specialDaysSupported: boolean; + /** + * If this capability is set to true, the device shall implement the + * GetScheduleState command, and shall notify subscribing clients whenever + * schedules become active or inactive. + */ + stateReportingSupported: boolean; + /** + * Indicates that the client is allowed to supply the token when creating schedules and special day groups. + * To enable the use of the commands SetSchedule and SetSpecialDayGroup, the value must be set to true. + */ + clientSuppliedTokenSupported?: boolean; +} +/** + * The ScheduleInfo type represents the schedule as a physical object. + * The structure contains information of a specific schedule instance. + */ +export interface ScheduleInfo extends DataEntity { + /** A user readable name. It shall be up to 64 characters. */ + name?: Name; + /** User readable description for the schedule. It shall be up to 1024 characters. */ + description?: Description; +} +/** + * The schedule structure shall include all properties of the ScheduleInfo structure + * and also the standard events (iCalendar format) and a list of SpecialDaysSchedule instances. + */ +export interface Schedule extends ScheduleInfo { + /** + * An iCalendar structure that defines a number of events. Events + * can be recurring or non-recurring. The events can, for instance, + * be used to control when a camera should record or when a facility + * is accessible. Some devices might not be able to fully support + * all the features of iCalendar. Setting the service capability + * ExtendedRecurrenceSupported to false will enable more devices + * to be ONVIF compliant. Is of type string (but contains an iCalendar structure). + */ + standard?: string; + /** + * For devices that are not able to support all the features of iCalendar, + * supporting special days is essential. Each SpecialDaysSchedule + * instance defines an alternate set of time periods that overrides + * the regular schedule for a specified list of special days. + * Is of type SpecialDaysSchedule. + */ + specialDays?: SpecialDaysSchedule[]; + extension?: ScheduleExtension; +} +export interface ScheduleExtension {} +/** A override schedule that defines alternate time periods for a group of special days. */ +export interface SpecialDaysSchedule { + /** Indicates the list of special days in a schedule. */ + groupToken?: ReferenceToken; + /** + * Indicates the alternate time periods for the list of special days + * (overrides the regular schedule). For example, the regular schedule indicates + * that it is active from 8AM to 5PM on Mondays. However, this particular + * Monday is a special day, and the alternate time periods state that the + * schedule is active from 9 AM to 11 AM and 1 PM to 4 PM. + * If no time periods are defined, then no access is allowed. + * Is of type TimePeriod. + */ + timeRange?: TimePeriod[]; + extension?: SpecialDaysScheduleExtension; +} +export interface SpecialDaysScheduleExtension {} +/** The ScheduleState contains state information for a schedule. */ +export interface ScheduleState { + /** + * Indicates that the current time is within the boundaries of the schedule + * or its special days schedules’ time periods. For example, if this + * schedule is being used for triggering automatic recording on a video source, + * the Active flag will be true when the schedule-based recording is supposed to record. + */ + active?: boolean; + /** + * Indicates that the current time is within the boundaries of its special + * days schedules’ time periods. For example, if this schedule is being used + * for recording at a lower frame rate on a video source during special days, + * the SpecialDay flag will be true. If special days are not supported by the device, + * this field may be omitted and interpreted as false by the client. + */ + specialDay?: boolean; + extension?: ScheduleStateExtension; +} +export interface ScheduleStateExtension {} +/** + * A time period defines a start and end time. For full day access, the + * start time ="00:00:00" with no defined end time. For a time period with no + * end time, the schedule runs until midnight. The end time must always be greater + * than the start time, otherwise an InvalidArgVal error messages is generated by the device. + */ +export interface TimePeriod { + /** Indicates the start time. */ + from?: Time; + /** + * Indicates the end time. Is optional, if omitted, the period ends at midnight. + * The end time is exclusive, meaning that that exact moment in time is not + * part of the period. To determine if a moment in time (t) is part of a time period, + * the formula StartTime ≤ t < EndTime is used. + */ + until?: Time; + extension?: TimePeriodExtension; +} +export interface TimePeriodExtension {} +/** The SpecialDayGroupInfo structure contains the basic information about the special days list. */ +export interface SpecialDayGroupInfo extends DataEntity { + /** User readable name. It shall be up to 64 characters. */ + name?: Name; + /** + * User readable description for the special days. It shall be up to 1024 + * characters. + */ + description?: Description; +} +/** + * The special day group structure shall include all properties of the SpecialDayGroupInfo + * structure and also a set of special days. A special day group are days (or parts of days) + * that require the regular schedule to be overridden with an alternate schedule. + * For example holidays, half-days, working Sundays, etc. + */ +export interface SpecialDayGroup extends SpecialDayGroupInfo { + /** + * An iCalendar structure that contains a group of special days. + * Is of type string (containing an iCalendar structure). + */ + days?: string; + extension?: SpecialDayGroupExtension; +} +export interface SpecialDayGroupExtension {} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** + * The capability response message contains the requested schedule service + * capabilities using a hierarchical XML capability structure. + */ + capabilities?: ServiceCapabilities; +} +export interface GetScheduleState { + /** Token of schedule instance to get ScheduleState. */ + token?: ReferenceToken; +} +export interface GetScheduleStateResponse { + /** ScheduleState item. */ + scheduleState?: ScheduleState; +} +export interface GetScheduleInfo { + /** Tokens of ScheduleInfo items to get. */ + token?: ReferenceToken[]; +} +export interface GetScheduleInfoResponse { + /** List of ScheduleInfo items. */ + scheduleInfo?: ScheduleInfo[]; +} +export interface GetScheduleInfoList { + /** + * Maximum number of entries to return. If not specified, less than one + * or higher than what the device supports, the number of items is + * determined by the device. + */ + limit?: number; + /** + * Start returning entries from this start reference. + * If not specified, entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetScheduleInfoListResponse { + /** + * StartReference to use in next call to get the following items. + * If absent, no more items to get. + */ + nextStartReference?: string; + /** List of ScheduleInfo items. */ + scheduleInfo?: ScheduleInfo[]; +} +export interface GetSchedules { + /** Tokens of Schedule items to get */ + token?: ReferenceToken[]; +} +export interface GetSchedulesResponse { + /** List of schedule items. */ + schedule?: Schedule[]; +} +export interface GetScheduleList { + /** + * Maximum number of entries to return. + * If not specified, less than one or higher than what the device supports, + * the number of items is determined by the device. + */ + limit?: number; + /** + * Start returning entries from this start reference. + * If not specified, entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetScheduleListResponse { + /** + * StartReference to use in next call to get the following items. + * If absent, no more items to get. + */ + nextStartReference?: string; + /** List of Schedule items. */ + schedule?: Schedule[]; +} +export interface CreateSchedule { + /** The Schedule to create */ + schedule?: Schedule; +} +export interface CreateScheduleResponse { + /** The token of created Schedule */ + token?: ReferenceToken; +} +export interface SetSchedule { + /** The Schedule to modify/create */ + schedule?: Schedule; +} +export interface SetScheduleResponse {} +export interface ModifySchedule { + /** The Schedule to modify/update */ + schedule?: Schedule; +} +export interface ModifyScheduleResponse {} +export interface DeleteSchedule { + /** The token of the schedule to delete. */ + token?: ReferenceToken; +} +export interface DeleteScheduleResponse {} +export interface GetSpecialDayGroupInfo { + /** Tokens of SpecialDayGroupInfo items to get. */ + token?: ReferenceToken[]; +} +export interface GetSpecialDayGroupInfoResponse { + /** List of SpecialDayGroupInfo items. */ + specialDayGroupInfo?: SpecialDayGroupInfo[]; +} +export interface GetSpecialDayGroupInfoList { + /** + * Maximum number of entries to return. If not specified, less than + * one or higher than what the device supports, the number + * of items is determined by the device. + */ + limit?: number; + /** + * Start returning entries from this start reference. + * If not specified, entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetSpecialDayGroupInfoListResponse { + /** + * StartReference to use in next call to get the following items. + * If absent, no more items to get. + */ + nextStartReference?: string; + /** List of SpecialDayGroupInfo items. */ + specialDayGroupInfo?: SpecialDayGroupInfo[]; +} +export interface GetSpecialDayGroups { + /** Tokens of the SpecialDayGroup items to get */ + token?: ReferenceToken[]; +} +export interface GetSpecialDayGroupsResponse { + /** List of SpecialDayGroup items. */ + specialDayGroup?: SpecialDayGroup[]; +} +export interface GetSpecialDayGroupList { + /** + * Maximum number of entries to return. If not specified, less than + * one or higher than what the device supports, the number of + * items is determined by the device. + */ + limit?: number; + /** + * Start returning entries from this start reference. + * If not specified, entries shall start from the beginning of the dataset. + */ + startReference?: string; +} +export interface GetSpecialDayGroupListResponse { + /** + * StartReference to use in next call to get the following items. If + * absent, no more items to get. + */ + nextStartReference?: string; + /** List of SpecialDayGroup items. */ + specialDayGroup?: SpecialDayGroup[]; +} +export interface CreateSpecialDayGroup { + /** The special day group to create. */ + specialDayGroup?: SpecialDayGroup; +} +export interface CreateSpecialDayGroupResponse { + /** The token of created special day group. */ + token?: ReferenceToken; +} +export interface SetSpecialDayGroup { + /** The SpecialDayGroup to modify/create */ + specialDayGroup?: SpecialDayGroup; +} +export interface SetSpecialDayGroupResponse {} +export interface ModifySpecialDayGroup { + /** The special day group to modify/update. */ + specialDayGroup?: SpecialDayGroup; +} +export interface ModifySpecialDayGroupResponse {} +export interface DeleteSpecialDayGroup { + /** The token of the special day group item to delete. */ + token?: ReferenceToken; +} +export interface DeleteSpecialDayGroupResponse {} diff --git a/src/interfaces/search.ts b/src/interfaces/search.ts new file mode 100644 index 00000000..5b126795 --- /dev/null +++ b/src/interfaces/search.ts @@ -0,0 +1,173 @@ +import { + RecordingSummary, + RecordingReference, + RecordingInformation, + Date, + MediaAttributes, + SearchScope, + JobToken, + FindRecordingResultList, + EventFilter, + FindEventResultList, + PTZPositionFilter, + FindPTZPositionResultList, + MetadataFilter, + FindMetadataResultList, + SearchState, +} from './onvif'; + +export interface Capabilities { + metadataSearch?: boolean; + /** Indicates support for general virtual property events in the FindEvents method. */ + generalStartEvents?: boolean; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the search service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetRecordingSummary {} +export interface GetRecordingSummaryResponse { + summary?: RecordingSummary; +} +export interface GetRecordingInformation { + recordingToken?: RecordingReference; +} +export interface GetRecordingInformationResponse { + recordingInformation?: RecordingInformation; +} +export interface GetMediaAttributes { + recordingTokens?: RecordingReference[]; + time?: Date; +} +export interface GetMediaAttributesResponse { + mediaAttributes?: MediaAttributes[]; +} +export interface FindRecordings { + /** Scope defines the dataset to consider for this search. */ + scope?: SearchScope; + /** The search will be completed after this many matches. If not specified, the search will continue until reaching the endpoint or until the session expires. */ + maxMatches?: number; + /** The time the search session will be kept alive after responding to this and subsequent requests. A device shall support at least values up to ten seconds. */ + keepAliveTime?: any; +} +export interface FindRecordingsResponse { + searchToken?: JobToken; +} +export interface GetRecordingSearchResults { + /** The search session to get results from. */ + searchToken?: JobToken; + /** The minimum number of results to return in one response. */ + minResults?: number; + /** The maximum number of results to return in one response. */ + maxResults?: number; + /** The maximum time before responding to the request, even if the MinResults parameter is not fulfilled. */ + waitTime?: any; +} +export interface GetRecordingSearchResultsResponse { + resultList?: FindRecordingResultList; +} +export interface FindEvents { + /** The point of time where the search will start. */ + startPoint?: Date; + /** The point of time where the search will stop. This can be a time before the StartPoint, in which case the search is performed backwards in time. */ + endPoint?: Date; + scope?: SearchScope; + searchFilter?: EventFilter; + /** Setting IncludeStartState to true means that the server should return virtual events representing the start state for any recording included in the scope. Start state events are limited to the topics defined in the SearchFilter that have the IsProperty flag set to true. */ + includeStartState?: boolean; + /** The search will be completed after this many matches. If not specified, the search will continue until reaching the endpoint or until the session expires. */ + maxMatches?: number; + /** The time the search session will be kept alive after responding to this and subsequent requests. A device shall support at least values up to ten seconds. */ + keepAliveTime?: any; +} +export interface FindEventsResponse { + /** A unique reference to the search session created by this request. */ + searchToken?: JobToken; +} +export interface GetEventSearchResults { + /** The search session to get results from. */ + searchToken?: JobToken; + /** The minimum number of results to return in one response. */ + minResults?: number; + /** The maximum number of results to return in one response. */ + maxResults?: number; + /** The maximum time before responding to the request, even if the MinResults parameter is not fulfilled. */ + waitTime?: any; +} +export interface GetEventSearchResultsResponse { + resultList?: FindEventResultList; +} +export interface FindPTZPosition { + /** The point of time where the search will start. */ + startPoint?: Date; + /** The point of time where the search will stop. This can be a time before the StartPoint, in which case the search is performed backwards in time. */ + endPoint?: Date; + scope?: SearchScope; + searchFilter?: PTZPositionFilter; + /** The search will be completed after this many matches. If not specified, the search will continue until reaching the endpoint or until the session expires. */ + maxMatches?: number; + /** The time the search session will be kept alive after responding to this and subsequent requests. A device shall support at least values up to ten seconds. */ + keepAliveTime?: any; +} +export interface FindPTZPositionResponse { + /** A unique reference to the search session created by this request. */ + searchToken?: JobToken; +} +export interface GetPTZPositionSearchResults { + /** The search session to get results from. */ + searchToken?: JobToken; + /** The minimum number of results to return in one response. */ + minResults?: number; + /** The maximum number of results to return in one response. */ + maxResults?: number; + /** The maximum time before responding to the request, even if the MinResults parameter is not fulfilled. */ + waitTime?: any; +} +export interface GetPTZPositionSearchResultsResponse { + resultList?: FindPTZPositionResultList; +} +export interface FindMetadata { + /** The point of time where the search will start. */ + startPoint?: Date; + /** The point of time where the search will stop. This can be a time before the StartPoint, in which case the search is performed backwards in time. */ + endPoint?: Date; + scope?: SearchScope; + metadataFilter?: MetadataFilter; + /** The search will be completed after this many matches. If not specified, the search will continue until reaching the endpoint or until the session expires. */ + maxMatches?: number; + /** The time the search session will be kept alive after responding to this and subsequent requests. A device shall support at least values up to ten seconds. */ + keepAliveTime?: any; +} +export interface FindMetadataResponse { + /** A unique reference to the search session created by this request. */ + searchToken?: JobToken; +} +export interface GetMetadataSearchResults { + /** The search session to get results from. */ + searchToken?: JobToken; + /** The minimum number of results to return in one response. */ + minResults?: number; + /** The maximum number of results to return in one response. */ + maxResults?: number; + /** The maximum time before responding to the request, even if the MinResults parameter is not fulfilled. */ + waitTime?: any; +} +export interface GetMetadataSearchResultsResponse { + resultList?: FindMetadataResultList; +} +export interface GetSearchState { + /** The search session to get the state from. */ + searchToken?: JobToken; +} +export interface GetSearchStateResponse { + state?: SearchState; +} +export interface EndSearch { + /** The search session to end. */ + searchToken?: JobToken; +} +export interface EndSearchResponse { + /** The point of time the search had reached when it was ended. It is equal to the EndPoint specified in Find-operation if the search was completed. */ + endpoint?: Date; +} diff --git a/src/interfaces/thermal.ts b/src/interfaces/thermal.ts new file mode 100644 index 00000000..8dbcea01 --- /dev/null +++ b/src/interfaces/thermal.ts @@ -0,0 +1,194 @@ +import { ReferenceToken } from './common'; +import { Name, FloatRange } from './onvif'; + +export type Polarity = 'WhiteHot' | 'BlackHot'; +/** + * Describes standard Color Palette types, used to facilitate Multi-language support and client display. + * "Custom" Type shall be used when Color Palette Name does not match any of the types included in the standard classification. + */ +export type ColorPaletteType = + | 'Custom' + | 'Grayscale' + | 'BlackHot' + | 'WhiteHot' + | 'Sepia' + | 'Red' + | 'Iron' + | 'Rain' + | 'Rainbow' + | 'Isotherm'; +/** Describes a Color Palette element. */ +export interface ColorPalette { + /** Unique identifier of this Color Palette. */ + token: ReferenceToken; + /** + * Indicates Color Palette Type. Use tth:ColorPaletteType. + * Used for multi-language support and display. + */ + type: string; + /** User readable Color Palette name. */ + name?: Name; +} +/** Type describing a NUC Table element. */ +export interface NUCTable { + /** Unique identifier of this NUC Table. */ + token: ReferenceToken; + /** Low Temperature limit for application of NUC Table, in Kelvin. */ + lowTemperature?: number; + /** High Temperature limit for application of NUC Table, in Kelvin. */ + highTemperature?: number; + /** User reabable name for the Non-Uniformity Correction (NUC) Table. */ + name?: Name; +} +/** Type describing the Cooler settings. */ +export interface Cooler { + /** Indicates whether the Cooler is enabled (running) or not. */ + enabled?: boolean; + /** Number of hours the Cooler has been running (unit: hours). Read-only. */ + runTime?: number; +} +/** + * Describes valid ranges for the thermal device cooler settings. + * Only applicable to cooled thermal devices. + */ +export interface CoolerOptions { + /** Indicates the Device allows cooler status to be changed from running (Enabled) to stopped (Disabled), and viceversa. */ + enabled?: boolean; +} +/** + * Holds default values that will be used in measurement modules when local parameters are not specified for the module (these are still required for valid temperature calculations). + * Having ReflectedAmbientTemperature, Emissivity and DistanceToObject as mandatory ensures minimum parameters are available to obtain valid temperature values. + */ +export interface RadiometryGlobalParameters { + /** Reflected Ambient Temperature for the environment in which the thermal device and the object being measured is located. */ + reflectedAmbientTemperature?: number; + /** Emissivity of the surface of the object on which temperature is being measured. */ + emissivity?: number; + /** Distance from the thermal device to the measured object. */ + distanceToObject?: number; + /** Relative Humidity in the environment in which the measurement is located. */ + relativeHumidity?: number; + /** Temperature of the atmosphere between the thermal device and the object being measured. */ + atmosphericTemperature?: number; + /** Transmittance value for the atmosphere between the thermal device and the object being measured. */ + atmosphericTransmittance?: number; + /** Temperature of the optics elements between the thermal device and the object being measured. */ + extOpticsTemperature?: number; + /** Transmittance value for the optics elements between the thermal device and the object being measured. */ + extOpticsTransmittance?: number; +} +/** Describes valid ranges for the different radiometry parameters required for accurate temperature calculation. */ +export interface RadiometryGlobalParameterOptions { + /** Valid range of temperature values, in Kelvin. */ + reflectedAmbientTemperature?: FloatRange; + /** Valid range of emissivity values for the objects to measure. */ + emissivity?: FloatRange; + /** Valid range of distance between camera and object for a valid temperature reading, in meters. */ + distanceToObject?: FloatRange; + /** Valid range of relative humidity values, in percentage. */ + relativeHumidity?: FloatRange; + /** Valid range of temperature values, in Kelvin. */ + atmosphericTemperature?: FloatRange; + /** Valid range of atmospheric transmittance values. */ + atmosphericTransmittance?: FloatRange; + /** Valid range of temperature values, in Kelvin. */ + extOpticsTemperature?: FloatRange; + /** Valid range of external optics transmittance. */ + extOpticsTransmittance?: FloatRange; +} +export interface Configuration { + /** Current Color Palette in use by the Thermal Device. */ + colorPalette?: ColorPalette; + /** Polarity configuration of the Thermal Device. */ + polarity?: Polarity; + /** Current Non-Uniformity Correction (NUC) Table in use by the Thermal Device. */ + NUCTable?: NUCTable; + /** Cooler settings of the Thermal Device. */ + cooler?: Cooler; +} +export interface Configurations { + /** Reference token to the thermal VideoSource. */ + token: ReferenceToken; + /** Current Thermal Settings for the VideoSource. */ + configuration?: Configuration; +} +export interface RadiometryConfiguration { + /** + * Global Parameters for Radiometry Measurements. Shall exist if Radiometry Capability is reported, + * and Global Parameters are supported by the device. + */ + radiometryGlobalParameters?: RadiometryGlobalParameters; +} +export interface ConfigurationOptions { + /** List of Color Palettes available for the requested Thermal VideoSource. */ + colorPalette?: ColorPalette[]; + /** List of Non-Uniformity Correction (NUC) Tables available for the requested Thermal VideoSource. */ + NUCTable?: NUCTable[]; + /** Specifies Cooler Options for cooled thermal devices. */ + coolerOptions?: CoolerOptions; +} +export interface RadiometryConfigurationOptions { + /** + * Specifies valid ranges and options for the global radiometry parameters used as default parameter values + * for temperature measurement modules (spots and boxes). + */ + radiometryGlobalParameterOptions?: RadiometryGlobalParameterOptions; +} +export interface Capabilities { + /** Indicates whether or not radiometric thermal measurements are supported by the thermal device. */ + radiometry?: boolean; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities of the thermal service are returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetConfigurationOptions { + /** Reference token to the VideoSource for which the Thermal Configuration Options are requested. */ + videoSourceToken?: ReferenceToken; +} +export interface GetConfigurationOptionsResponse { + /** Valid ranges for the Thermal configuration parameters that are categorized as device specific. */ + configurationOptions?: ConfigurationOptions; +} +export interface GetConfiguration { + /** Reference token to the VideoSource for which the Thermal Settings are requested. */ + videoSourceToken?: ReferenceToken; +} +export interface GetConfigurationResponse { + /** Thermal Settings for the VideoSource that was requested. */ + configuration?: Configuration; +} +export interface GetConfigurations {} +export interface GetConfigurationsResponse { + /** This element contains a list of thermal VideoSource configurations. */ + configurations?: Configurations[]; +} +export interface SetConfiguration { + /** Reference token to the VideoSource for which the Thermal Settings are configured. */ + videoSourceToken?: ReferenceToken; + /** Thermal Settings to be configured. */ + configuration?: Configuration; +} +export interface GetRadiometryConfigurationOptions { + /** Reference token to the VideoSource for which the Thermal Radiometry Options are requested. */ + videoSourceToken?: ReferenceToken; +} +export interface GetRadiometryConfigurationOptionsResponse { + /** Valid ranges for the Thermal Radiometry parameters that are categorized as device specific. */ + configurationOptions?: RadiometryConfigurationOptions; +} +export interface GetRadiometryConfiguration { + /** Reference token to the VideoSource for which the Radiometry Configuration is requested. */ + videoSourceToken?: ReferenceToken; +} +export interface GetRadiometryConfigurationResponse { + /** Radiometry Configuration for the VideoSource that was requested. */ + configuration?: RadiometryConfiguration; +} +export interface SetRadiometryConfiguration { + /** Reference token to the VideoSource for which the Radiometry settings are configured. */ + videoSourceToken?: ReferenceToken; + /** Radiometry settings to be configured. */ + configuration?: RadiometryConfiguration; +} diff --git a/src/interfaces/types.ts b/src/interfaces/types.ts new file mode 100644 index 00000000..295768fc --- /dev/null +++ b/src/interfaces/types.ts @@ -0,0 +1,48 @@ +/** + * Type used to reference logical and physical entities. + * Token may be extended by intermediate terminal with adding prefix to make it global unique. + * The length should be within 36 characters for generating as a local token. + * See "Remote Token" section in Resource Query specification. + */ +export type ReferenceToken = string; +/** Type used for names of logical and physical entities. */ +export type Name = string; +/** + * Description is optional and the maximum length is device specific. + * If the length is more than maximum length, it is silently chopped to the maximum length + * supported by the device/service (which may be 0). + */ +export type Description = string; +/** Type used to represent the numbers from 1 ,2 , 3,... */ +export type PositiveInteger = number; +/** Recognition/identification types supported by ONVIF. */ +export type RecognitionType = + | 'pt:Card' + | 'pt:PIN' + | 'pt:Fingerprint' + | 'pt:Face' + | 'pt:Iris' + | 'pt:Vein' + | 'pt:Palm' + | 'pt:Retina' + | 'pt:LicensePlate' + | 'pt:REX'; +export type StringList = string[]; +/** + * General datastructure referenced by a token. + * Should be used as extension base. + */ +export interface DataEntity { + /** A service-unique identifier of the item. */ + token: ReferenceToken; +} +/** Attributes contains a Name and an optional Value and type. */ +export interface Attribute { + /** + * Name of attribute. Key names starting with "ONVIF" (any case) are reserved for ONVIF + * use. + */ + name: string; + /** Value of attribute */ + value?: string; +} diff --git a/src/interfaces/uplink.ts b/src/interfaces/uplink.ts new file mode 100644 index 00000000..e5d2855b --- /dev/null +++ b/src/interfaces/uplink.ts @@ -0,0 +1,49 @@ +import { StringList } from './onvif'; +import { AnyURI } from './basics'; +import { ReferenceToken } from './common'; + +export type Protocols = 'https' | 'wss'; +export type AuthorizationModes = 'mTLS' | 'JWT'; +export type ConnectionStatus = 'Offline' | 'Connecting' | 'Connected'; +export interface Capabilities { + /** Maximum number of uplink connections that can be configured. */ + maxUplinks?: number; + /** Protocols supported by the device. Defined values are 'https' for native h2c-reverse and 'wss' for h2c-reverse over WebSocket as defined by tup:Protocols. */ + protocols?: StringList; + /** Supported authorization mode [mTLS JWT] as defined by tup:AuthorizationModes. */ + authorizationModes?: StringList; +} +export interface Configuration { + /** Uniform resource locator by which the remote client can be reached. */ + remoteAddress?: AnyURI; + /** ID of the certificate to be used for client authentication. */ + certificateID?: string; + /** Authorization level that will be assigned to the uplink connection. */ + userLevel?: string; + /** Current connection status (see tup:ConnectionStatus for possible values). */ + status?: string; + /** CertPathValidationPolicyID used to validate the uplink server certificate. If CertPathValidationPolicyID is not configured, uplink server certificate shall not be validated. */ + certPathValidationPolicyID?: string; + /** The configuration to be used to obtain a JWT token to authorize with the uplink server. */ + authorizationServer?: ReferenceToken; +} +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the uplink service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} +export interface GetUplinks {} +export interface GetUplinksResponse { + /** List of configured uplinks. */ + configuration?: Configuration[]; +} +export interface SetUplink { + /** Configuration to be added or modified. */ + configuration?: Configuration; +} +export interface SetUplinkResponse {} +export interface DeleteUplink { + /** Uniform resource locator of the configuration to be deleted. */ + remoteAddress?: AnyURI; +} +export interface DeleteUplinkResponse {} diff --git a/src/onvif.ts b/src/onvif.ts index ed4d70c4..aa5a28d0 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -92,6 +92,18 @@ export interface SetSystemDateAndTimeOptions { dateTime?: Date; dateTimeType: 'Manual' | 'NTP'; daylightSavings?: boolean; + /** + * The TZ format is specified by POSIX, please refer to POSIX 1003.1 section 8.3 + * Example: Europe, Paris TZ=CET-1CEST,M3.5.0/2,M10.5.0/3 + * CET = designation for standard time when daylight saving is not in force + * -1 = offset in hours = negative so 1 hour east of Greenwich meridian + * CEST = designation when daylight saving is in force ("Central European Summer Time") + * , = no offset number between code and comma, so default to one hour ahead for daylight saving + * M3.5.0 = when daylight saving starts = the last Sunday in March (the "5th" week means the last in the month) + * /2, = the local time when the switch occurs = 2 a.m. in this case + * M10.5.0 = when daylight saving ends = the last Sunday in October. + * /3, = the local time when the switch occurs = 3 a.m. in this case + */ timezone?: string; } @@ -104,7 +116,7 @@ export class Onvif extends EventEmitter { * onvif.on('rawRequest', (xml) => { console.log('-> request was', xml); }); * ``` */ - static rawRequest: 'rawRequest' = 'rawRequest'; + static rawRequest = 'rawRequest' as const; /** * Indicates raw xml response from device. * @event rawResponse @@ -113,7 +125,7 @@ export class Onvif extends EventEmitter { * onvif.on('rawResponse', (xml) => { console.log('<- response was', xml); }); * ``` */ - static rawResponse: 'rawResponse' = 'rawResponse'; + static rawResponse = 'rawResponse' as const; /** * Indicates any warnings * @event warn @@ -122,7 +134,7 @@ export class Onvif extends EventEmitter { * onvif.on('warn', console.warn); * ``` */ - static warn: 'warn' = 'warn'; + static warn = 'warn' as const; /** * Indicates any errors * @param error Error object @@ -132,7 +144,7 @@ export class Onvif extends EventEmitter { * onvif.on('error', console.error); * ``` */ - static error: 'error' = 'error'; + static error = 'error' as const; /** * Core device namespace for device v1.0 methods diff --git a/src/test.ts b/src/test.ts index 2ea5160a..a1334393 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,14 +1,18 @@ -import { NetworkType, Onvif } from './index'; +import { NetworkType, Onvif, Discovery } from './index'; // eslint-disable-next-line @typescript-eslint/no-var-requires const serverMockup = require('../test/serverMockup'); (async () => { + // Discovery.on('device', console.log); + // Discovery.on('error', console.error); + // await Discovery.probe(); + const cam = new Onvif({ - hostname : 'localhost', - username : 'admin', - password : '9999', - port : 10101, + hostname : '192.168.0.116', + username : 'username', + password : 'password', + port : 2020, }); // cam.on('rawResponse', console.log); diff --git a/src/utils.ts b/src/utils.ts index 10426386..e328d7ff 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -103,7 +103,7 @@ export async function parseSOAPString(rawXml: string): CamResponse { } // console.error('Fault:', reason, detail); - throw new Error(`ONVIF SOAP Fault: ${reason}${detail} ${rawXml}`); + throw new Error(`ONVIF SOAP Fault: ${reason}${detail}`); } return [result.envelope.body, xml]; } From 9afb415bfa479caa76055c412daa620ad60f7986 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 03:20:56 +0300 Subject: [PATCH 086/112] feat: setNTP --- CHECKED.md | 118 ++++++++++++++++++ onvif/files.json | 6 - promises/cam.js | 16 +-- src/compatibility/cam.ts | 26 +++- src/device.ts | 81 +----------- {onvif => utils}/processor.ts | 224 +++++++++++++++++++++++----------- 6 files changed, 309 insertions(+), 162 deletions(-) create mode 100644 CHECKED.md delete mode 100644 onvif/files.json rename {onvif => utils}/processor.ts (70%) diff --git a/CHECKED.md b/CHECKED.md new file mode 100644 index 00000000..ffa94380 --- /dev/null +++ b/CHECKED.md @@ -0,0 +1,118 @@ +ONVIF Interfaces + +- [ ] connect +- [ ] _request +- [ ] _requestPart2 +- [ ] getSystemDateAndTime +- [ ] setSystemDateAndTime +- [ ] getCapabilities +- [ ] getServiceCapabilities +- [ ] getActiveSources +- [ ] getServices +- [ ] getDeviceInformation +- [ ] getHostname +- [ ] getScopes +- [ ] setScopes +- [ ] systemReboot +- [ ] setSystemFactoryDefault +- [ ] _passwordDigest +- [ ] _envelopeHeader +- [ ] _envelopeFooter +- [ ] _parseUrl +- [ ] getNTP +- [x] setNTP +- [ ] getNetworkInterfaces +- [ ] setNetworkInterfaces +- [ ] getNetworkDefaultGateway +- [ ] setNetworkDefaultGateway +- [ ] getDNS +- [ ] setDNS +- [ ] getNetworkProtocols +- [ ] getUsers +- [ ] createUsers +- [ ] setUsers +- [ ] deleteUsers +- [ ] sendAuxiliaryCommand +- [ ] getEventProperties +- [ ] getEventServiceCapabilities +- [ ] subscribe +- [ ] createPullPointSubscription +- [ ] renew +- [ ] pullMessages +- [ ] unsubscribe +- [ ] _eventRequest +- [ ] _eventPull +- [ ] _restartEventRequest +- [ ] parseEventXML +- [ ] getVideoSources +- [ ] getVideoSourceConfigurations +- [ ] getVideoEncoderConfiguration +- [ ] getVideoEncoderConfigurationOptions +- [ ] getVideoEncoderConfigurations +- [ ] setVideoEncoderConfiguration +- [ ] getAudioSources +- [ ] getAudioEncoderConfigurations +- [ ] getAudioEncoderConfiguration +- [ ] getAudioEncoderConfigurationOptions +- [ ] setAudioEncoderConfiguration +- [ ] getAudioSourceConfigurations +- [ ] getAudioOutputs +- [ ] getAudioOutputConfigurations +- [ ] addAudioEncoderConfiguration +- [ ] addAudioSourceConfiguration +- [ ] addVideoEncoderConfiguration +- [ ] addVideoSourceConfiguration +- [ ] removeAudioEncoderConfiguration +- [ ] removeAudioSourceConfiguration +- [ ] getProfiles +- [ ] createProfile +- [ ] deleteProfile +- [ ] getStreamUri +- [ ] getSnapshotUri +- [ ] setSynchronizationPoint +- [ ] getOSDs +- [ ] getOSDOptions +- [ ] createOSD +- [ ] setOSD +- [ ] deleteOSD +- [ ] getMediaServiceCapabilities +- [ ] getPresets +- [ ] gotoPreset +- [ ] setPreset +- [ ] removePreset +- [ ] gotoHomePosition +- [ ] setHomePosition +- [ ] getStatus +- [ ] getNodes +- [ ] getConfigurations +- [ ] getConfigurationOptions +- [ ] relativeMove +- [ ] absoluteMove +- [ ] continuousMove +- [ ] stop +- [ ] _panTiltZoomVectors +- [ ] ptzSendAuxiliaryCommand +- [ ] getImagingSettings +- [ ] setImagingSettings +- [ ] getImagingServiceCapabilities +- [ ] getCurrentImagingPreset +- [ ] setCurrentImagingPreset +- [ ] getVideoSourceOptions +- [ ] imagingGetMoveOptions +- [ ] imagingGetStatus +- [ ] imagingMove +- [ ] imagingStop +- [ ] getRecordings +- [ ] getRecordingJobs +- [ ] createRecordingJob +- [ ] deleteRecordingJob +- [ ] getRecordingSummary +- [ ] getRecordingInformation +- [ ] getRecordingConfiguration +- [ ] getRecordingJobState +- [ ] getRecordingOptions +- [ ] getRecordingServiceCapabilities +- [ ] getTrackConfiguration +- [ ] getRecordingJobConfiguration +- [ ] setRecordingJobMode +- [ ] getReplayUri diff --git a/onvif/files.json b/onvif/files.json deleted file mode 100644 index 1d109297..00000000 --- a/onvif/files.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "modules": { - "ptz.wsdl": "ptz", - "devicemgmt.wsdl": "device" - } -} diff --git a/promises/cam.js b/promises/cam.js index c4e7c7a5..73f60c43 100644 --- a/promises/cam.js +++ b/promises/cam.js @@ -14,21 +14,21 @@ class CamPromise { * @param {Cam~Options} options */ constructor(options) { - this._cam = new Cam({...options, autoconnect: false}); + this._cam = new Cam({...options, autoconnect : false}); return new Proxy(this, { get(target, name) { return promisify(target, name); }, set(target, name, value) { target._cam[name] = value; - } + }, }); } } function promisify(target, name) { const method = target._cam[name]; - if (typeof method == 'function') { + if (typeof method === 'function') { if (promisifiedMethods.includes(name)) { target._cam.emit('promisify', name); const promise = (...args) => new Promise((resolve, reject) => @@ -38,17 +38,17 @@ function promisify(target, name) { } else { resolve(...data); } - }]) + }]), ); return promise; - } else { - return (...args) => method.apply(target._cam, args); } + return (...args) => method.apply(target._cam, args); + } return method; } module.exports = { - Cam: CamPromise, - promisifiedMethods + Cam : CamPromise, + promisifiedMethods, }; diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 62f73595..396c1f63 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -15,7 +15,8 @@ import { SetHomePositionOptions, SetPresetOptions, RelativeMoveOptions, ContinuousMoveOptions, } from '../ptz'; -import { SetNTPOptions } from '../device'; +import { SetNTP } from '../interfaces/devicemgmt'; +import { NetworkHost, NetworkHostType } from '../interfaces/onvif'; export type Callback = (error: any, result?: any) => void; export type CompatibilityAbsoluteMoveOptions = AbsoluteMoveOptions & { x?: number; y?: number; zoom?: number }; @@ -285,6 +286,20 @@ export class Cam extends EventEmitter { } setNTP(options: SetNTPOptions, callback: Callback) { + if (!Array.isArray(options.NTPManual)) { + options.NTPManual = []; + } + // For backward compatibility + if (options.type || options.ipv4Address || options.ipv6Address || options.dnsName || options.extension) { + // Note the case changes to follow the xml parser rules + options.NTPManual.push({ + type : options.type, + IPv4Address : options.ipv4Address, + IPv6Address : options.ipv6Address, + DNSname : options.dnsName, + extension : options.extension, + }); + } this.onvif.device.setNTP(options).then((result) => callback(null, result)).catch(callback); } @@ -296,3 +311,12 @@ export class Cam extends EventEmitter { this.onvif.device.getNetworkInterfaces().then((result) => callback(null, result)).catch(callback); } } + +interface SetNTPOptions extends SetNTP{ + // For backward compatibility + type?: NetworkHostType; + ipv4Address?: string; + ipv6Address?: string; + dnsName?: string; + extension?: string; +} diff --git a/src/device.ts b/src/device.ts index 1004837b..39c7ab4a 100644 --- a/src/device.ts +++ b/src/device.ts @@ -3,6 +3,8 @@ import { Onvif, OnvifServices, ReferenceToken, SetSystemDateAndTimeOptions, } from './onvif'; import { linerase } from './utils'; +import { SetNTP } from './interfaces/devicemgmt'; +import { IPAddress, NTPInformation } from './interfaces/onvif'; export interface OnvifService { /** Namespace uri */ @@ -385,67 +387,6 @@ export interface DeviceServiceCapabilities { type IPv4Address = string; type IPv6Address = string; -export interface IPAddress { - /** Indicates if the address is an IPv4 or IPv6 address */ - type: NetworkType; - /** IPv4 address */ - IPv4Address?: IPv4Address; - /** IPv6 address */ - IPv6Address?: IPv6Address; -} - -export interface NetworkHost { - /* Network host type: IPv4, IPv6 or DNS. */ - type: NetworkType; - /* IPv4 address. */ - IPv4Address?: IPv4Address; - /* IPv6 address. */ - IPv6Address?: IPv6Address; - /* DNS name. */ - DNSname?: string; - extension?: any; -} - -export interface NTPInformation { - /* Indicates if NTP information is to be retrieved by using DHCP. */ - fromDHCP: boolean; - /* List of NTP addresses retrieved by using DHCP. */ - NTPFromDHCP?: NetworkHost[]; - /* List of manually entered NTP addresses. */ - NTPManual?: NetworkHost[]; - extension?: any; -} - -export enum NetworkType { - IPv4 = 'IPv4', - IPv6 = 'IPv6', - DNS = 'DNS', -} - -export interface SetNTPOptions { - /* Indicates if NTP information is to be retrieved by using DHCP. */ - fromDHCP?: boolean; - NTPManual?: NTPManual[]; - // For backward compatibility - type?: NetworkType; - ipv4Address?: string; - ipv6Address?: string; - dnsName?: string; - extension?: string; -} - -export interface NTPManual { - /* Network host type. */ - type?: NetworkType; - /* IPv4 address. */ - IPv4Address?: string; // IPv4 address - /* IPv6 address. */ - IPv6Address?: string; - /* DNS name. */ - DNSname?: string; - extension?: any; -} - export interface DNSInformation { /* Indicates whether or not DNS information is retrieved from DHCP. */ fromDHCP: boolean; @@ -800,23 +741,9 @@ export class Device { /** * Set the NTP settings on a device */ - async setNTP(options: SetNTPOptions): Promise { - if (!Array.isArray(options.NTPManual)) { - options.NTPManual = []; - } - // For backward compatibility - if (options.type || options.ipv4Address || options.ipv6Address || options.dnsName || options.extension) { - // Note the case changes to follow the xml parser rules - options.NTPManual.push({ - type : options.type, - IPv4Address : options.ipv4Address, - IPv6Address : options.ipv6Address, - DNSname : options.dnsName, - extension : options.extension, - }); - } + async setNTP(options: SetNTP): Promise { let body = '' - + `${options.fromDHCP}`; + + `${options.fromDHCP ?? false}`; if (options.NTPManual && Array.isArray(options.NTPManual)) { options.NTPManual.forEach((NTPManual) => { body += (NTPManual.type ? '' diff --git a/onvif/processor.ts b/utils/processor.ts similarity index 70% rename from onvif/processor.ts rename to utils/processor.ts index 1cebd779..07ec2e09 100644 --- a/onvif/processor.ts +++ b/utils/processor.ts @@ -1,14 +1,12 @@ -// eslint-disable-next-line import/no-extraneous-dependencies import { readFileSync, writeFileSync } from 'fs'; -// eslint-disable-next-line import/no-extraneous-dependencies -// import { glob } from 'glob'; import { Parser } from 'xml2js'; -// eslint-disable-next-line import/no-extraneous-dependencies import ts, { TypeNode } from 'typescript'; -// eslint-disable-next-line import/no-extraneous-dependencies import { glob } from 'glob'; +import chalk from 'chalk'; import * as path from 'node:path'; +const BASICS_FILENAME = 'basics'; + const sourceFile = ts.createSourceFile( 'soap-types.ts', // the output file name '', // the text of the source code, not needed for our purposes @@ -22,19 +20,29 @@ const exportModifier = ts.factory.createModifiersFromModifierFlags( ts.ModifierFlags.Export, ); -const builtInTypes = [ - ts.factory.createIdentifier('/* eslint-disable import/export, no-tabs */'), - ...Object.entries({ +const generateBuiltIns = (): [ts.Node[], Links] => { + const types = { AnyURI : 'string', FilterType : 'any', NCName : 'string', - }).map(([name, typeName]) => ts.factory.createTypeAliasDeclaration( - exportModifier, - name, - undefined, - ts.factory.createTypeReferenceNode(typeName), - )), -]; + }; + const builtInTypeNodes: ts.Node[] = [ + ts.factory.createIdentifier('/* eslint-disable import/export, no-tabs */'), + ...Object.entries(types).map(([name, typeName]) => ts.factory.createTypeAliasDeclaration( + exportModifier, + name, + undefined, + ts.factory.createTypeReferenceNode(typeName), + )), + ]; + const builtInLinks: Links = new Map( + Object.entries(types).map(([name]) => ([ + name, + { name : BASICS_FILENAME }, + ])), + ); + return ([builtInTypeNodes, builtInLinks]); +}; function dataTypes(xsdType?: string): string { if (!xsdType) { @@ -169,7 +177,6 @@ interface ISchemaDefinition { interface ProcessorConstructor { filePath: string; nodes: ts.Node[]; - types: Set; links: Links; } @@ -179,26 +186,81 @@ type Links = Map * Common class to process xml-files */ export class Processor { - private readonly filePath: string; - private readonly nodes: ts.Node[] = []; + public readonly filePath: string; + public readonly nodes: ts.Node[] = []; protected schema?: ISchemaDefinition; - private readonly types: Set; - private exportNodes: ts.Node[]; + public readonly fileName: string; private links: Links; - private readonly fileName: string; + public readonly declaredTypes: Set = new Set(); + public readonly usedTypes: Set = new Set(); constructor({ filePath, - nodes, - types, links, }: ProcessorConstructor) { this.filePath = filePath; - this.exportNodes = nodes; - this.types = types; this.links = links; - this.fileName = path.parse(this.filePath).name; + this.fileName = path.parse(this.filePath).name + (this.filePath.includes('ver2') ? '2' : ''); + } + + /** + * Process the xml-file, generates all interface nodes and adds them to exportNodes + * Adds interfaces to link map-property of the constructor + * Generates usedTypes and declareTypes properties + */ + async prefix(): Promise { + await this.process(); + if (this.schema?.['xs:simpleType']) { + this.schema['xs:simpleType'].forEach((simpleType) => this.generateSimpleTypeInterface(simpleType)); + } + if (this.schema?.['xs:complexType']) { + this.schema['xs:complexType'].forEach((complexType) => this.generateComplexTypeInterface(complexType)); + } + if (this.schema?.['xs:element']) { + this.schema['xs:element'].forEach((element) => this.generateElementType(element)); + } + return this.nodes; + } + + /** + * Generate imports for all used types in the file using links map + * @param links + */ + suffix(links: Links) { + const imports = {}; + // @ts-expect-error Set.prototype.difference is not supported by ts-compiler + for (const type of this.usedTypes.difference(this.declaredTypes)) { + const fileName = links.get(type)?.name; + if (!fileName) { + console.warn(chalk.) + } + console.log(links.get(type)); + console.log(type, links.get(type)?.name); + if (imports[type]) { + imports[] + } + } + const importNode = ts.factory.createImportDeclaration( + undefined, + ts.factory.createImportClause( + false, + undefined, + ts.factory.createNamedImports([ + ts.factory.createImportSpecifier( + false, + undefined, + ts.factory.createIdentifier('text'), + ), + ]), + ), + ts.factory.createStringLiteral('moduleSpec', true), + ); + this.nodes.unshift(importNode); + this.writeInterface(); } + /** + * @deprecated + */ async main(): Promise { await this.process(); if (this.schema?.['xs:simpleType']) { @@ -211,7 +273,6 @@ export class Processor { this.schema['xs:element'].forEach((element) => this.generateElementType(element)); } this.writeInterface(); - this.exportNodes = this.exportNodes.concat(this.nodes); return this.nodes; } @@ -227,7 +288,9 @@ export class Processor { ); // write the code to file - writeFileSync(`./onvif/interfaces/${this.fileName}.d.ts`, result, { encoding : 'utf-8' }); + console.log(chalk.yellow(`Save to ./utils/interfaces/${this.fileName}.d.ts`)); + writeFileSync(`./utils/interfaces/${this.fileName}.ts`, result, { encoding : 'utf-8' }); + throw 1; } async processXML() { @@ -259,10 +322,10 @@ export class Processor { addNode(name: string, node: ts.Node) { if (this.links.has(name)) { - console.log(`>>> ${name}`); + console.log(chalk.magentaBright(`${name} in ${this.links.get(name)!.name} already exists`)); } + this.declaredTypes.add(name); this.links.set(name, { - node, name : this.fileName, }); this.nodes.push(node); @@ -271,11 +334,7 @@ export class Processor { generateSimpleTypeInterface(simpleType: ISimpleType) { const name = cleanName(simpleType.meta.name); - if (this.types.has(name)) { - console.error(name); - return; - } - this.types.add(name); + // TODO type? const interfaceSymbol = ts.factory.createIdentifier(name); if (simpleType['xs:restriction']) { @@ -326,7 +385,8 @@ export class Processor { } createProperty(attribute: any) { - let type: TypeNode = ts.factory.createTypeReferenceNode(cleanName(dataTypes(attribute.meta.type))); + const typeName = cleanName(dataTypes(attribute.meta.type)); + let type: TypeNode = ts.factory.createTypeReferenceNode(typeName); /** REFS FOR XMIME */ if (!attribute.meta.name && attribute.meta.ref) { attribute.meta.name = attribute.meta.ref.slice(6); @@ -341,6 +401,10 @@ export class Processor { attribute.meta.use !== 'required' ? ts.factory.createToken(ts.SyntaxKind.QuestionToken) : undefined, type, ); + if (typeName.charAt(0) === typeName.charAt(0).toUpperCase()) { + this.usedTypes.add(typeName); + } + console.log(chalk.yellow(`> ${attribute.meta.name} ${cleanName(dataTypes(attribute.meta.type))}`)); return this.createAnnotationIfExists(attribute, property); } @@ -353,7 +417,7 @@ export class Processor { } // TODO method descriptions? // element.meta - console.log(`> ${element.meta.name}`); + // console.log(`> ${element.meta.name}`); } generateComplexTypeInterface(complexType: IComplexType) { @@ -458,51 +522,58 @@ class ProcessorWSDL extends Processor { interface IType { name?: string; - node: ts.Node; } class InterfaceProcessor { - private nodes: ts.Node[]; - private types: Set; + private nodes: ts.Node[] = []; private links: Links = new Map(); - constructor() { - this.nodes = []; - this.types = new Set(); - } - async start() { + async start(sourcesPath: string, outPath: string) { + const [builtInTypes, builtInLinks] = generateBuiltIns(); this.nodes = builtInTypes; + this.links = builtInLinks; + + const processors = []; - const xsds = await glob('../specs/wsdl/**/*.xsd'); + const xsds = await glob(path.join(sourcesPath, '/**/*.xsd')); for (const xsd of xsds) { - console.log(`processing ${xsd}`); + console.log(chalk.greenBright(`processing ${xsd}`)); const proc = new ProcessorXSD({ filePath : xsd, nodes : this.nodes, - types : this.types, links : this.links, }); - await proc.main(); + processors.push(proc); + const procNodes = await proc.prefix(); + this.nodes = this.nodes.concat(procNodes); } - // const wsdls = await glob('../specs/wsdl/**/*.wsdl'); - // for (const wdsl of wsdls) { - // console.log(`processing ${wdsl}`); - // const proc = new ProcessorWSDL({ - // filePath : wdsl, - // nodes : this.nodes, - // types : this.types, - // links : this.links, - // }); - // await proc.main(); - // } - - const proc = new ProcessorWSDL({ - filePath : '../specs/wsdl/ver20/ptz/wsdl/ptz.wsdl', - nodes : this.nodes, - types : this.types, - links : this.links, - }); - await proc.main(); + const wsdls = await glob(path.join(sourcesPath, '/**/*.wsdl')); + for (const wdsl of wsdls) { + console.log(chalk.greenBright(`processing ${wdsl}`)); + const proc = new ProcessorWSDL({ + filePath : wdsl, + nodes : this.nodes, + links : this.links, + }); + processors.push(proc); + const procNodes = await proc.prefix(); + this.nodes = this.nodes.concat(procNodes); + } + + for (const proc of processors) { + proc.suffix(this.links); + console.log(''); + console.log('------------------------------'); + console.log(''); + } + + // const proc = new ProcessorWSDL({ + // filePath : '../specs/wsdl/ver20/ptz/wsdl/ptz.wsdl', + // nodes : this.nodes, + // types : this.types, + // links : this.links, + // }); + // await proc.main(); const nodeArr = ts.factory.createNodeArray(this.nodes); const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); @@ -513,8 +584,21 @@ class InterfaceProcessor { ); // write the code to file - writeFileSync('./onvif/interfaces/interface.ts', result, { encoding : 'utf-8' }); + // writeFileSync(path.join(outPath, `${BASICS_FILENAME}.ts`), result, { encoding : 'utf-8' }); + + // console.log(chalk.greenBright([...this.links.entries()])); } } -(new InterfaceProcessor()).start().catch(console.error); +// + +const [_a, _b, sources, out] = process.argv; +if (out !== undefined) { + (new InterfaceProcessor()).start(sources, out).catch(console.error); +} else { + console.log(`Usage: processor.ts + - ONVIF specs source directory + - generated interfaces output directory + Example: processor.ts "../specs/wsdl/ver20" "./onvif/interfaces"`); + process.exit(1); +} From eb6065e379537418c7ce24865713cdff97af8d22 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 03:22:05 +0300 Subject: [PATCH 087/112] chore: cleanup interface generation code moved to https://github.com/agsh/onvif-generate-interfaces --- utils/processor.ts | 604 --------------------------------------------- 1 file changed, 604 deletions(-) delete mode 100644 utils/processor.ts diff --git a/utils/processor.ts b/utils/processor.ts deleted file mode 100644 index 07ec2e09..00000000 --- a/utils/processor.ts +++ /dev/null @@ -1,604 +0,0 @@ -import { readFileSync, writeFileSync } from 'fs'; -import { Parser } from 'xml2js'; -import ts, { TypeNode } from 'typescript'; -import { glob } from 'glob'; -import chalk from 'chalk'; -import * as path from 'node:path'; - -const BASICS_FILENAME = 'basics'; - -const sourceFile = ts.createSourceFile( - 'soap-types.ts', // the output file name - '', // the text of the source code, not needed for our purposes - ts.ScriptTarget.Latest, // the target language version for the output file - false, - ts.ScriptKind.TS, // output script kind. options include JS, TS, JSX, TSX and others -); - -// used for adding `export` directive to generated type -const exportModifier = ts.factory.createModifiersFromModifierFlags( - ts.ModifierFlags.Export, -); - -const generateBuiltIns = (): [ts.Node[], Links] => { - const types = { - AnyURI : 'string', - FilterType : 'any', - NCName : 'string', - }; - const builtInTypeNodes: ts.Node[] = [ - ts.factory.createIdentifier('/* eslint-disable import/export, no-tabs */'), - ...Object.entries(types).map(([name, typeName]) => ts.factory.createTypeAliasDeclaration( - exportModifier, - name, - undefined, - ts.factory.createTypeReferenceNode(typeName), - )), - ]; - const builtInLinks: Links = new Map( - Object.entries(types).map(([name]) => ([ - name, - { name : BASICS_FILENAME }, - ])), - ); - return ([builtInTypeNodes, builtInLinks]); -}; - -function dataTypes(xsdType?: string): string { - if (!xsdType) { - return 'any'; - } - // const type = xsdType.slice(3); - switch (xsdType) { - case 'xs:double': return 'number'; - case 'xs:float': return 'number'; - case 'xs:int': return 'number'; - case 'xs:integer': return 'number'; - case 'xs:short': return 'number'; - case 'xs:signedInt': return 'number'; - case 'xs:unsignedInt': return 'number'; - case 'xs:unsignedShort': return 'number'; - case 'xs:dateTime': return 'Date'; - case 'xs:token': return 'string'; - case 'xs:anyURI': return 'AnyURI'; - case 'xs:anyType': return 'any'; - case 'xs:hexBinary': return 'any'; - case 'xs:base64Binary': return 'any'; - case 'xs:duration': return 'any'; - case 'wsnt:FilterType': return 'any'; - case 'wsnt:NotificationMessageHolderType': return 'any'; - case 'soapenv:Envelope': return 'any'; - case 'soapenv:Fault': return 'any'; - case 'xs:anySimpleType': return 'any'; - case 'xs:QName': return 'any'; - case 'wsnt:TopicExpressionType': return 'any'; - case 'wsnt:QueryExpressionType': return 'any'; - case 'xs:positiveInteger': return 'PositiveInteger'; - case 'xs:nonNegativeInteger': return 'number'; - case 'tt:Object': return 'OnvifObject'; - case 'xs:time': return 'Time'; - default: return xsdType.slice(xsdType.indexOf(':') + 1); - } -} - -function cleanName(name: string): string { - if (name === 'Object') { - return 'OnvifObject'; - } - return name.replace(/[-.]/g, ''); -} - -function camelCase(name: string): string { - const secondLetter = name.charAt(1); - if (secondLetter && secondLetter.toUpperCase() !== secondLetter) { - name = name.charAt(0).toLowerCase() + name.slice(1); - } - if (/[-.]/g.test(name)) { - name = `'${name}'`; - } - return name; -} - -interface ISimpleType { - meta: { - name: string; - }; - 'xs:annotation': { - 'xs:documentation': string[]; - }[]; - 'xs:restriction': { - meta: { - base: string; - }; - 'xs:enumeration'?: { - meta: { - value: string; - }; - }[]; - }[]; - 'xs:list': { - meta: { - itemType: string; - }; - }[]; -} - -interface IComplexType { - meta: { - name: string; - }; - 'xs:complexContent': { - 'xs:extension': { - meta: { - base: string; - }; - 'xs:sequence': any[]; - }[]; - }[]; - 'xs:attribute'?: { - meta : { - name: string; - type: string; - use: 'required' | 'optional'; - }; - }[]; - 'xs:sequence'?: { - 'xs:element': { - meta: { - name: string; - type: string; - use: 'required' | 'optional'; - }; - 'xs:complexType'?: IComplexType[]; - 'xs:annotation': { - 'xs:documentation': string[]; - }[]; - }[]; - 'xs:any'?: any; - }[]; - 'xs:annotation'?: { - 'xs:documentation': string[]; - }[]; -} - -interface IElement { - meta: { - name: string; - }; - 'xs:complexType': IComplexType[]; -} - -interface ISchemaDefinition { - 'xs:simpleType': ISimpleType[]; - 'xs:complexType': IComplexType[]; - 'xs:element': IElement[]; -} - -interface ProcessorConstructor { - filePath: string; - nodes: ts.Node[]; - links: Links; -} - -type Links = Map - -/** - * Common class to process xml-files - */ -export class Processor { - public readonly filePath: string; - public readonly nodes: ts.Node[] = []; - protected schema?: ISchemaDefinition; - public readonly fileName: string; - private links: Links; - public readonly declaredTypes: Set = new Set(); - public readonly usedTypes: Set = new Set(); - constructor({ - filePath, - links, - }: ProcessorConstructor) { - this.filePath = filePath; - this.links = links; - this.fileName = path.parse(this.filePath).name + (this.filePath.includes('ver2') ? '2' : ''); - } - - /** - * Process the xml-file, generates all interface nodes and adds them to exportNodes - * Adds interfaces to link map-property of the constructor - * Generates usedTypes and declareTypes properties - */ - async prefix(): Promise { - await this.process(); - if (this.schema?.['xs:simpleType']) { - this.schema['xs:simpleType'].forEach((simpleType) => this.generateSimpleTypeInterface(simpleType)); - } - if (this.schema?.['xs:complexType']) { - this.schema['xs:complexType'].forEach((complexType) => this.generateComplexTypeInterface(complexType)); - } - if (this.schema?.['xs:element']) { - this.schema['xs:element'].forEach((element) => this.generateElementType(element)); - } - return this.nodes; - } - - /** - * Generate imports for all used types in the file using links map - * @param links - */ - suffix(links: Links) { - const imports = {}; - // @ts-expect-error Set.prototype.difference is not supported by ts-compiler - for (const type of this.usedTypes.difference(this.declaredTypes)) { - const fileName = links.get(type)?.name; - if (!fileName) { - console.warn(chalk.) - } - console.log(links.get(type)); - console.log(type, links.get(type)?.name); - if (imports[type]) { - imports[] - } - } - const importNode = ts.factory.createImportDeclaration( - undefined, - ts.factory.createImportClause( - false, - undefined, - ts.factory.createNamedImports([ - ts.factory.createImportSpecifier( - false, - undefined, - ts.factory.createIdentifier('text'), - ), - ]), - ), - ts.factory.createStringLiteral('moduleSpec', true), - ); - this.nodes.unshift(importNode); - this.writeInterface(); - } - - /** - * @deprecated - */ - async main(): Promise { - await this.process(); - if (this.schema?.['xs:simpleType']) { - this.schema['xs:simpleType'].forEach((simpleType) => this.generateSimpleTypeInterface(simpleType)); - } - if (this.schema?.['xs:complexType']) { - this.schema['xs:complexType'].forEach((complexType) => this.generateComplexTypeInterface(complexType)); - } - if (this.schema?.['xs:element']) { - this.schema['xs:element'].forEach((element) => this.generateElementType(element)); - } - this.writeInterface(); - return this.nodes; - } - - writeInterface() { - const nodeArr = ts.factory.createNodeArray(this.nodes); - - // printer for writing the AST to a file as code - const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); - const result = printer.printList( - ts.ListFormat.MultiLine, - nodeArr, - sourceFile, - ); - - // write the code to file - console.log(chalk.yellow(`Save to ./utils/interfaces/${this.fileName}.d.ts`)); - writeFileSync(`./utils/interfaces/${this.fileName}.ts`, result, { encoding : 'utf-8' }); - throw 1; - } - - async processXML() { - const xsdData = readFileSync(this.filePath, { encoding : 'utf-8' }) - .replace(/([\s\S]*?)<\/xs:documentation>/g, (_, b) => ``); - - const xmlParser = new Parser({ - attrkey : 'meta', - }); - - return xmlParser.parseStringPromise(xsdData); - } - - async process() { - throw new Error('Not implemented'); - } - - createAnnotationIfExists(attribute: any, node: any) { - if (attribute['xs:annotation']) { - return ts.addSyntheticLeadingComment( - node, - ts.SyntaxKind.MultiLineCommentTrivia, - `* ${attribute['xs:annotation']?.[0]['xs:documentation'][0]} `, - true, - ); - } - return node; - } - - addNode(name: string, node: ts.Node) { - if (this.links.has(name)) { - console.log(chalk.magentaBright(`${name} in ${this.links.get(name)!.name} already exists`)); - } - this.declaredTypes.add(name); - this.links.set(name, { - name : this.fileName, - }); - this.nodes.push(node); - } - - generateSimpleTypeInterface(simpleType: ISimpleType) { - const name = cleanName(simpleType.meta.name); - - // TODO type? - - const interfaceSymbol = ts.factory.createIdentifier(name); - if (simpleType['xs:restriction']) { - /** RESTRICTIONS */ - if (simpleType['xs:restriction'][0]['xs:enumeration']) { - this.addNode( - name, - this.createAnnotationIfExists( - simpleType, - ts.factory.createTypeAliasDeclaration( - exportModifier, - interfaceSymbol, // interface name - undefined, - ts.factory.createUnionTypeNode(simpleType['xs:restriction'][0]['xs:enumeration'] - .map((enumValue) => ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(enumValue.meta.value, true)))), - ), - ), - ); - } else { - this.addNode( - name, - this.createAnnotationIfExists( - simpleType, - ts.factory.createTypeAliasDeclaration( - exportModifier, - interfaceSymbol, - undefined, - ts.factory.createTypeReferenceNode(dataTypes(simpleType['xs:restriction'][0].meta.base)), - ), - ), - ); - } - } else if (simpleType['xs:list']) { - /** LISTS */ - this.addNode( - name, - this.createAnnotationIfExists( - simpleType, - ts.factory.createTypeAliasDeclaration( - exportModifier, - interfaceSymbol, - undefined, - ts.factory.createArrayTypeNode(ts.factory.createTypeReferenceNode(dataTypes(simpleType['xs:list'][0].meta.itemType))), - ), - ), - ); - } - } - - createProperty(attribute: any) { - const typeName = cleanName(dataTypes(attribute.meta.type)); - let type: TypeNode = ts.factory.createTypeReferenceNode(typeName); - /** REFS FOR XMIME */ - if (!attribute.meta.name && attribute.meta.ref) { - attribute.meta.name = attribute.meta.ref.slice(6); - } - /** ARRAYS */ - if (attribute.meta.maxOccurs === 'unbounded') { - type = ts.factory.createArrayTypeNode(type); - } - const property = ts.factory.createPropertySignature( - undefined, - camelCase(attribute.meta.name), - attribute.meta.use !== 'required' ? ts.factory.createToken(ts.SyntaxKind.QuestionToken) : undefined, - type, - ); - if (typeName.charAt(0) === typeName.charAt(0).toUpperCase()) { - this.usedTypes.add(typeName); - } - console.log(chalk.yellow(`> ${attribute.meta.name} ${cleanName(dataTypes(attribute.meta.type))}`)); - return this.createAnnotationIfExists(attribute, property); - } - - generateElementType(element: IElement) { - if (element['xs:complexType'] && typeof element['xs:complexType'][0] === 'object') { - element['xs:complexType'][0].meta = { - name : element.meta.name, - }; - this.generateComplexTypeInterface(element['xs:complexType'][0]); - } - // TODO method descriptions? - // element.meta - // console.log(`> ${element.meta.name}`); - } - - generateComplexTypeInterface(complexType: IComplexType) { - const { name } = complexType.meta; - const interfaceSymbol = ts.factory.createIdentifier(cleanName(name)); - - let members: ts.TypeElement[] = []; - let heritage; - - /** Complex Content */ - if (Array.isArray(complexType['xs:complexContent'])) { - const name = complexType['xs:complexContent'][0]['xs:extension'][0].meta.base; - const heritageName = name.slice(name.indexOf(':') + 1); - heritage = extendInterface(heritageName); - if (complexType['xs:sequence']) { - throw new Error('complexType[\'xs:sequence\'] in complexContent: complexType.meta.name'); - } - complexType['xs:sequence'] = complexType['xs:complexContent'][0]['xs:extension'][0]['xs:sequence']; - } - - if (complexType['xs:attribute']) { - members = members.concat( - complexType['xs:attribute'].map((attribute) => this.createProperty(attribute)), - ); - } - if (complexType['xs:sequence']) { - if (!Array.isArray(complexType['xs:sequence'][0]['xs:element'])) { - /** TODO Any */ - // if (complexType['xs:sequence'][0]['xs:any']) { - // members.push( - // ts.factory.createPropertySignature( - // undefined, - // '[key: string]', - // undefined, - // ts.factory.createTypeReferenceNode('any'), - // ), - // ); - // } - - // console.log(complexType); - // console.log('--------------'); - // return ts.factory.createPropertySignature( - // undefined, - // complexType.meta.name, - // ts.factory.createToken(ts.SyntaxKind.QuestionToken), - // ts.factory.createTypeReferenceNode('any'), - // ); - } else { - members = members.concat( - members = complexType['xs:sequence'][0]['xs:element'].map((attribute) => { - // console.log(attribute.meta.name); - /** TODO complex type inside complex type */ - if (attribute['xs:complexType']) { - attribute['xs:complexType'][0].meta = { name : attribute.meta.name }; - this.generateComplexTypeInterface(attribute['xs:complexType'][0]); - attribute.meta.type = `tt:${attribute.meta.name}`; - } - const cl = this.createProperty(attribute); - return cl; - }), - ); - } - } - - const node = ts.factory.createInterfaceDeclaration( - exportModifier, // modifiers - interfaceSymbol, // interface name - undefined, // no generic type parameters - heritage, - members, - ); - this.addNode( - name, - this.createAnnotationIfExists(complexType, node), - ); - } -} - -function extendInterface(interfaceName?: string) { - if (interfaceName) { - return [ts.factory.createHeritageClause( - ts.SyntaxKind.ExtendsKeyword, - [ts.factory.createExpressionWithTypeArguments(ts.factory.createIdentifier(interfaceName), [])], - )]; - } - return undefined; -} - -class ProcessorXSD extends Processor { - async process() { - this.schema = (await this.processXML())['xs:schema'] as ISchemaDefinition; - } -} - -class ProcessorWSDL extends Processor { - async process() { - const xml = await this.processXML(); - const schemaDefinition = xml['wsdl:definitions']['wsdl:types']?.[0]['xs:schema']?.[0]; - this.schema = schemaDefinition as ISchemaDefinition; - } -} - -interface IType { - name?: string; -} - -class InterfaceProcessor { - private nodes: ts.Node[] = []; - private links: Links = new Map(); - async start(sourcesPath: string, outPath: string) { - const [builtInTypes, builtInLinks] = generateBuiltIns(); - this.nodes = builtInTypes; - this.links = builtInLinks; - - const processors = []; - - const xsds = await glob(path.join(sourcesPath, '/**/*.xsd')); - for (const xsd of xsds) { - console.log(chalk.greenBright(`processing ${xsd}`)); - const proc = new ProcessorXSD({ - filePath : xsd, - nodes : this.nodes, - links : this.links, - }); - processors.push(proc); - const procNodes = await proc.prefix(); - this.nodes = this.nodes.concat(procNodes); - } - - const wsdls = await glob(path.join(sourcesPath, '/**/*.wsdl')); - for (const wdsl of wsdls) { - console.log(chalk.greenBright(`processing ${wdsl}`)); - const proc = new ProcessorWSDL({ - filePath : wdsl, - nodes : this.nodes, - links : this.links, - }); - processors.push(proc); - const procNodes = await proc.prefix(); - this.nodes = this.nodes.concat(procNodes); - } - - for (const proc of processors) { - proc.suffix(this.links); - console.log(''); - console.log('------------------------------'); - console.log(''); - } - - // const proc = new ProcessorWSDL({ - // filePath : '../specs/wsdl/ver20/ptz/wsdl/ptz.wsdl', - // nodes : this.nodes, - // types : this.types, - // links : this.links, - // }); - // await proc.main(); - - const nodeArr = ts.factory.createNodeArray(this.nodes); - const printer = ts.createPrinter({ newLine : ts.NewLineKind.LineFeed }); - const result = printer.printList( - ts.ListFormat.MultiLine, - nodeArr, - sourceFile, - ); - - // write the code to file - // writeFileSync(path.join(outPath, `${BASICS_FILENAME}.ts`), result, { encoding : 'utf-8' }); - - // console.log(chalk.greenBright([...this.links.entries()])); - } -} - -// - -const [_a, _b, sources, out] = process.argv; -if (out !== undefined) { - (new InterfaceProcessor()).start(sources, out).catch(console.error); -} else { - console.log(`Usage: processor.ts - - ONVIF specs source directory - - generated interfaces output directory - Example: processor.ts "../specs/wsdl/ver20" "./onvif/interfaces"`); - process.exit(1); -} From 770b73314c36d87de9508c9f40b48e36f0b15a89 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 03:25:18 +0300 Subject: [PATCH 088/112] chore: suspend annoying github actions --- {.github => ___.github}/workflows/npm.yml | 0 {.github => ___.github}/workflows/pr.yml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {.github => ___.github}/workflows/npm.yml (100%) rename {.github => ___.github}/workflows/pr.yml (100%) diff --git a/.github/workflows/npm.yml b/___.github/workflows/npm.yml similarity index 100% rename from .github/workflows/npm.yml rename to ___.github/workflows/npm.yml diff --git a/.github/workflows/pr.yml b/___.github/workflows/pr.yml similarity index 100% rename from .github/workflows/pr.yml rename to ___.github/workflows/pr.yml From a3f87a63cdc5d6a38096905b8d00bec5f40ab7fd Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 03:53:03 +0300 Subject: [PATCH 089/112] feat: getNTP, getDNS --- CHECKED.md | 6 +++--- src/device.ts | 14 +------------- src/test.ts | 18 +++++++++--------- 3 files changed, 13 insertions(+), 25 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index ffa94380..eae4e299 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -19,13 +19,13 @@ ONVIF Interfaces - [ ] _envelopeHeader - [ ] _envelopeFooter - [ ] _parseUrl -- [ ] getNTP -- [x] setNTP +- [x] getNTP cam.device.getNTP +- [x] setNTP cam.device.setNTP - [ ] getNetworkInterfaces - [ ] setNetworkInterfaces - [ ] getNetworkDefaultGateway - [ ] setNetworkDefaultGateway -- [ ] getDNS +- [x] getDNS cam.device.getDNS - [ ] setDNS - [ ] getNetworkProtocols - [ ] getUsers diff --git a/src/device.ts b/src/device.ts index 39c7ab4a..52103760 100644 --- a/src/device.ts +++ b/src/device.ts @@ -4,7 +4,7 @@ import { } from './onvif'; import { linerase } from './utils'; import { SetNTP } from './interfaces/devicemgmt'; -import { IPAddress, NTPInformation } from './interfaces/onvif'; +import { DNSInformation, IPAddress, NTPInformation } from './interfaces/onvif'; export interface OnvifService { /** Namespace uri */ @@ -387,18 +387,6 @@ export interface DeviceServiceCapabilities { type IPv4Address = string; type IPv6Address = string; -export interface DNSInformation { - /* Indicates whether or not DNS information is retrieved from DHCP. */ - fromDHCP: boolean; - /* Search domain. */ - searchDomain?: string[]; - /* List of DNS addresses received from DHCP. */ - DNSFromDHCP?: IPAddress[]; - /* List of manually entered DNS addresses. */ - DNSManual?: IPAddress[]; - extension?: any; -} - export interface NetworkInterfaceInfo { /* Network interface name, for example eth0. */ name?: string; diff --git a/src/test.ts b/src/test.ts index a1334393..87f5692f 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,8 +1,6 @@ -import { NetworkType, Onvif, Discovery } from './index'; +import { Onvif } from './index'; // eslint-disable-next-line @typescript-eslint/no-var-requires -const serverMockup = require('../test/serverMockup'); - (async () => { // Discovery.on('device', console.log); // Discovery.on('error', console.error); @@ -26,14 +24,16 @@ const serverMockup = require('../test/serverMockup'); console.log('-------------------------------------------'); console.log(await cam.ptz.getStatus()); console.log('-------------------------------------------'); - console.log(await cam.device.setNTP({ - NTPManual : [{ - type : NetworkType.DNS, - }], - })); + // console.log(await cam.device.setNTP({ + // NTPManual : [{ + // type : NetworkType.DNS, + // }], + // })); console.log(4); // console.log(profiles); // Discovery.on('device', console.log); // const cams = await Discovery.probe({ timeout : 1000 }); // console.log(cams); -})().catch(console.error).finally(serverMockup.close); + + console.log(await cam.device.getDNS()); +})().catch(console.error); From 51127574607f4c3640ab54a72b72cf3d070ddac4 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 17:19:11 +0300 Subject: [PATCH 090/112] feat: add options to create implicit array to linerase function --- src/utils.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index e328d7ff..f41ae8d6 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -7,12 +7,16 @@ const prefixMatch = /(?!xmlns)^.*:/; /** * Parse SOAP object to pretty JS-object */ -export function linerase(xml: any): any { +export function linerase(xml: any, options?: { array: string[]; name?: string } | number): any { + if (typeof options !== 'object') { + options = { array : [] }; + } if (Array.isArray(xml)) { - if (xml.length > 1) { - return xml.map(linerase); + if (xml.length === 1 && !options.array.includes(options.name!)) { + [xml] = xml; + } else { + return xml.map((item) => linerase(item, options)); } - [xml] = xml; } if (typeof xml === 'object') { let obj: any = {}; @@ -20,10 +24,10 @@ export function linerase(xml: any): any { if (key === '$') { // for xml attributes obj = { ...obj, - ...linerase(xml.$), + ...linerase(xml.$, options), }; } else { - obj[key] = linerase(xml[key]); + obj[key] = linerase(xml[key], { ...options, name : key }); } }); return obj; From 5f341667164c177fa8d8dd524fefc355d44eced9 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 17:34:13 +0300 Subject: [PATCH 091/112] feat: getOSDs --- CHECKED.md | 2 +- src/compatibility/cam.ts | 10 ++++++++++ src/device.ts | 7 +++++-- src/media.ts | 27 +++++++++++++++++++++++---- src/test.ts | 17 +++++++++++++++-- 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index eae4e299..91fbf65b 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -70,7 +70,7 @@ ONVIF Interfaces - [ ] getStreamUri - [ ] getSnapshotUri - [ ] setSynchronizationPoint -- [ ] getOSDs +- [X] getOSDs cam.media.getOSDs (schema strict) - [ ] getOSDOptions - [ ] createOSD - [ ] setOSD diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 396c1f63..3b1333aa 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -17,6 +17,7 @@ import { } from '../ptz'; import { SetNTP } from '../interfaces/devicemgmt'; import { NetworkHost, NetworkHostType } from '../interfaces/onvif'; +import { GetOSDs } from '../interfaces/media.2'; export type Callback = (error: any, result?: any) => void; export type CompatibilityAbsoluteMoveOptions = AbsoluteMoveOptions & { x?: number; y?: number; zoom?: number }; @@ -310,6 +311,15 @@ export class Cam extends EventEmitter { getNetworkInterfaces(callback: Callback) { this.onvif.device.getNetworkInterfaces().then((result) => callback(null, result)).catch(callback); } + + getOSDs(options?: GetOSDs | Callback, callback?: Callback) { + if (callback) { + this.onvif.media.getOSDs(options as GetOSDs).then((result) => callback(null, result)).catch(callback); + } + this.onvif.media.getOSDs().then((result) => { + if (typeof options === 'function') { (options as Callback)(null, result); } + }).catch(options ? options as Callback : (error) => this.emit('error', error)); + } } interface SetNTPOptions extends SetNTP{ diff --git a/src/device.ts b/src/device.ts index 52103760..d7515261 100644 --- a/src/device.ts +++ b/src/device.ts @@ -615,7 +615,10 @@ export class Device { Object.keys(this.onvif.capabilities.extension).forEach((ext) => { const extensionName = ext as keyof CapabilitiesExtension; // TODO think about complex extensions like `telexCapabilities` and `scdlCapabilities` - if (extensionName !== 'XAddr' && 'XAddr' in this.onvif.capabilities.extension![extensionName]!) { + if (extensionName !== 'XAddr' + && 'XAddr' in this.onvif.capabilities.extension![extensionName]! + && this.onvif.capabilities.extension![extensionName]!.XAddr + ) { this.onvif.uri[extensionName] = new URL(this.onvif.capabilities.extension![extensionName]!.XAddr); } }); @@ -744,7 +747,7 @@ export class Device { }); } body += ''; - const [data] = await this.onvif.request({ + const [data, stat] = await this.onvif.request({ service : 'device', body, }); diff --git a/src/media.ts b/src/media.ts index b256f744..8a410677 100644 --- a/src/media.ts +++ b/src/media.ts @@ -1,8 +1,9 @@ -import { - AnyURI, Name, Onvif, ReferenceToken, -} from './onvif'; +import { Onvif } from './onvif'; import { linerase } from './utils'; -import { IPAddress } from './device'; +import { IPAddress, Name } from './interfaces/onvif'; +import { ReferenceToken } from './interfaces/common'; +import { AnyURI } from './interfaces/basics'; +import { GetOSDs, GetOSDsResponse } from './interfaces/media.2'; export interface IntRectangle { x: number; @@ -1010,6 +1011,7 @@ export class Media { service : 'media', body : '', }); + const a = linerase(data); this.videoSources = linerase(data).getVideoSourcesResponse.videoSources; // videoSources is an array of video sources, but linerase remove the array if there is only one element inside, // so we convert it back to an array @@ -1106,4 +1108,21 @@ export class Media { }); return linerase(data).getSnapshotUriResponse.mediaUri; } + + async getOSDs({ configurationToken, OSDToken }: GetOSDs = {}): Promise { + const mediaService = (this.onvif.device.media2Support ? 'media2' : 'media'); + const mediaNS = (this.onvif.device.media2Support + ? 'http://www.onvif.org/ver20/media/wsdl' : 'http://www.onvif.org/ver10/media/wsdl'); + + const [data] = await this.onvif.request({ + service : mediaService, + body : `${ + configurationToken ? `${configurationToken}` : '' + }${ + OSDToken ? `${configurationToken}` : '' + }`, + }); + // this.videoSources = linerase(data).getVideoSourcesResponse.videoSources; + return linerase(data[0].getOSDsResponse[0], { array : ['OSDs'] }); + } } diff --git a/src/test.ts b/src/test.ts index 87f5692f..6ab053a6 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,4 +1,5 @@ -import { Onvif } from './index'; +import { Discovery, Onvif } from './index'; +import { Cam as CamJs } from '../promises'; // eslint-disable-next-line @typescript-eslint/no-var-requires (async () => { @@ -12,10 +13,18 @@ import { Onvif } from './index'; password : 'password', port : 2020, }); + const camJs = new CamJs({ + hostname : '192.168.0.116', + username : 'username', + password : 'password', + port : 2020, + }); // cam.on('rawResponse', console.log); // cam.on('rawRequest', console.log); await cam.connect(); + await camJs.connect(); + const profiles = await cam.media.getProfiles(); console.log((await cam.device.getDeviceInformation()).firmwareVersion); console.log((await cam.device.getHostname())); @@ -35,5 +44,9 @@ import { Onvif } from './index'; // const cams = await Discovery.probe({ timeout : 1000 }); // console.log(cams); - console.log(await cam.device.getDNS()); + // console.log(await camJs.getOSDs()); + console.log(await cam.media.getOSDs({ + configurationToken : 'vsconf', + // OSDToken : 'textOSD', + })); })().catch(console.error); From acd8055ab8e47df88dbb0d32488e3a621b96a991 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 19:13:49 +0300 Subject: [PATCH 092/112] feat: getOSDOptions --- CHECKED.md | 4 ++-- src/compatibility/cam.ts | 15 +++++++++++++++ src/media.ts | 17 ++++++++++++++++- src/test.ts | 11 ++++++++++- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index 91fbf65b..b9525ab4 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -70,8 +70,8 @@ ONVIF Interfaces - [ ] getStreamUri - [ ] getSnapshotUri - [ ] setSynchronizationPoint -- [X] getOSDs cam.media.getOSDs (schema strict) -- [ ] getOSDOptions +- [x] getOSDs cam.media.getOSDs (schema strict) +- [x] getOSDOptions cam.media.getOSDOptions (videoSourceConfigurationToken -> configurationToken) - [ ] createOSD - [ ] setOSD - [ ] deleteOSD diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 3b1333aa..9519b8bf 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -320,6 +320,21 @@ export class Cam extends EventEmitter { if (typeof options === 'function') { (options as Callback)(null, result); } }).catch(options ? options as Callback : (error) => this.emit('error', error)); } + + getOSDOptions(options?: GetOSDOptions | Callback, callback?: Callback) { + if (callback) { + this.onvif.media.getOSDOptions({ + configurationToken : (options as GetOSDOptions).videoSourceConfigurationToken, + }).then((result) => callback(null, result)).catch(callback); + } + this.onvif.media.getOSDOptions().then((result) => { + if (typeof options === 'function') { (options as Callback)(null, result); } + }).catch(options ? options as Callback : (error) => this.emit('error', error)); + } +} + +interface GetOSDOptions { + videoSourceConfigurationToken: string; } interface SetNTPOptions extends SetNTP{ diff --git a/src/media.ts b/src/media.ts index 8a410677..50c1c0e6 100644 --- a/src/media.ts +++ b/src/media.ts @@ -3,7 +3,7 @@ import { linerase } from './utils'; import { IPAddress, Name } from './interfaces/onvif'; import { ReferenceToken } from './interfaces/common'; import { AnyURI } from './interfaces/basics'; -import { GetOSDs, GetOSDsResponse } from './interfaces/media.2'; +import { GetOSDOptions, GetOSDOptionsResponse, GetOSDs, GetOSDsResponse } from './interfaces/media.2'; export interface IntRectangle { x: number; @@ -1125,4 +1125,19 @@ export class Media { // this.videoSources = linerase(data).getVideoSourcesResponse.videoSources; return linerase(data[0].getOSDsResponse[0], { array : ['OSDs'] }); } + + async getOSDOptions({ configurationToken }: GetOSDOptions = {}): Promise { + const mediaService = (this.onvif.device.media2Support ? 'media2' : 'media'); + const mediaNS = (this.onvif.device.media2Support + ? 'http://www.onvif.org/ver20/media/wsdl' : 'http://www.onvif.org/ver10/media/wsdl'); + + const [data] = await this.onvif.request({ + service : mediaService, + body : `` + + `${configurationToken ?? this.onvif.activeSource!.videoSourceConfigurationToken}` + + '', + }); + const result = linerase(data).getOSDOptionsResponse; + return result; + } } diff --git a/src/test.ts b/src/test.ts index 6ab053a6..0a7cbe17 100644 --- a/src/test.ts +++ b/src/test.ts @@ -44,9 +44,18 @@ import { Cam as CamJs } from '../promises'; // const cams = await Discovery.probe({ timeout : 1000 }); // console.log(cams); + console.log(cam.activeSource); + // console.log(await camJs.getOSDs()); console.log(await cam.media.getOSDs({ configurationToken : 'vsconf', // OSDToken : 'textOSD', })); -})().catch(console.error); + + console.log((await camJs.getOSDOptions())); + console.log((await cam.media.getOSDOptions({ }))); +})().catch((e) => { + console.error(e); + console.log(e.rawPacket.toString()); + process.exit(1); +}); From 1a0dea7b9ec52b6b00f3d153e99f128eb405121c Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 20:34:05 +0300 Subject: [PATCH 093/112] feat: getServices --- CHECKED.md | 2 +- src/compatibility/cam.ts | 13 +++++++++---- src/device.ts | 25 +++++++++---------------- src/test.ts | 8 +++++--- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index b9525ab4..1c876f9d 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -8,7 +8,7 @@ ONVIF Interfaces - [ ] getCapabilities - [ ] getServiceCapabilities - [ ] getActiveSources -- [ ] getServices +- [x] getServices includeCapability wrapped into object - [ ] getDeviceInformation - [ ] getHostname - [ ] getScopes diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 9519b8bf..fe26d31d 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -16,7 +16,7 @@ import { SetPresetOptions, RelativeMoveOptions, ContinuousMoveOptions, } from '../ptz'; import { SetNTP } from '../interfaces/devicemgmt'; -import { NetworkHost, NetworkHostType } from '../interfaces/onvif'; +import { NetworkHostType } from '../interfaces/onvif'; import { GetOSDs } from '../interfaces/media.2'; export type Callback = (error: any, result?: any) => void; @@ -115,9 +115,14 @@ export class Cam extends EventEmitter { this.onvif.media.getVideoSources().then((result) => callback(null, result)).catch(callback); } - getServices(includeCapability: boolean, callback: Callback) { - this.onvif.device.getServices(includeCapability) - .then((result) => callback(null, result)).catch(callback); + getServices(includeCapability: boolean | Callback, callback: Callback) { + if (callback) { + this.onvif.device.getServices({ includeCapability : includeCapability as boolean }) + .then((result) => callback(null, result.service)).catch(callback); + } else { + this.onvif.device.getServices() + .then((result) => (includeCapability as Callback)(null, result.service)).catch(callback); + } } getDeviceInformation(callback: Callback) { diff --git a/src/device.ts b/src/device.ts index d7515261..b30702b3 100644 --- a/src/device.ts +++ b/src/device.ts @@ -3,20 +3,9 @@ import { Onvif, OnvifServices, ReferenceToken, SetSystemDateAndTimeOptions, } from './onvif'; import { linerase } from './utils'; -import { SetNTP } from './interfaces/devicemgmt'; +import { GetServices, GetServicesResponse, Service, SetNTP } from './interfaces/devicemgmt'; import { DNSInformation, IPAddress, NTPInformation } from './interfaces/onvif'; -export interface OnvifService { - /** Namespace uri */ - namespace: string; - /** Uri for requests */ - XAddr: string; - /** Minor version */ - minor: number; - /** Major version */ - major: number; -} - export interface OnvifVersion { /** Major version number */ major: number; @@ -529,7 +518,7 @@ export interface NetworkInterface { */ export class Device { private readonly onvif: Onvif; - #services: OnvifService[] = []; + #services: Service[] = []; get services() { return this.#services; } @@ -560,13 +549,14 @@ export class Device { /** * Returns information about services of the device. */ - async getServices(includeCapability = true): Promise { + async getServices({ includeCapability }: GetServices = { includeCapability : true }): Promise { const [data] = await this.onvif.request({ body : '' + `${includeCapability}` + '', }); - this.#services = linerase(data).getServicesResponse.service; + const result = linerase(data).getServicesResponse; + this.#services = result.service; // ONVIF Profile T introduced Media2 (ver20) so cameras from around 2020/2021 will have // two media entries in the ServicesResponse, one for Media (ver10/media) and one for Media2 (ver20/media) // This is so that existing VMS software can still access the video via the orignal ONVIF Media API @@ -575,6 +565,9 @@ export class Device { // Look for services with namespaces and XAddr values if (Object.prototype.hasOwnProperty.call(service, 'namespace') && Object.prototype.hasOwnProperty.call(service, 'XAddr')) { // Only parse ONVIF namespaces. Axis cameras return Axis namespaces in GetServices + if (!service.namespace || !service.XAddr) { + return; + } const parsedNamespace = url.parse(service.namespace); if (parsedNamespace.hostname === 'www.onvif.org' && parsedNamespace.path) { const namespaceSplitted = parsedNamespace.path.substring(1).split('/'); // remove leading Slash, then split @@ -590,7 +583,7 @@ export class Device { } } }); - return this.#services; + return result; } /** diff --git a/src/test.ts b/src/test.ts index 0a7cbe17..68f6f0e6 100644 --- a/src/test.ts +++ b/src/test.ts @@ -44,7 +44,7 @@ import { Cam as CamJs } from '../promises'; // const cams = await Discovery.probe({ timeout : 1000 }); // console.log(cams); - console.log(cam.activeSource); + // console.log(cam.activeSource); // console.log(await camJs.getOSDs()); console.log(await cam.media.getOSDs({ @@ -52,8 +52,10 @@ import { Cam as CamJs } from '../promises'; // OSDToken : 'textOSD', })); - console.log((await camJs.getOSDOptions())); - console.log((await cam.media.getOSDOptions({ }))); + // console.log((await camJs.getOSDOptions())); + // console.log((await cam.media.getOSDOptions({ }))); + + console.log(await cam.device.getServices()); })().catch((e) => { console.error(e); console.log(e.rawPacket.toString()); From 7f261f3d12e2c6eb7f9487da319ca7dfc519280e Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 20:58:35 +0300 Subject: [PATCH 094/112] chore: frash docs --- docs/assets/highlight.css | 53 +- docs/assets/main.js | 112 +- docs/assets/search.js | 2 +- docs/assets/style.css | 1003 ++++++++----- docs/classes/Device.html | 207 +-- docs/classes/DiscoverySingleton.html | 997 +++---------- docs/classes/Media.html | 159 +- docs/classes/Onvif.html | 1316 ++++------------- docs/index.html | 612 +------- docs/interfaces/ActiveSource.html | 143 +- docs/interfaces/AnalyticsCapabilities.html | 97 +- .../AnalyticsDeviceCapabilities.html | 84 +- .../AnalyticsEngineConfiguration.html | 76 +- .../interfaces/AudioDecoderConfiguration.html | 93 +- .../AudioEncoder2Configuration.html | 137 +- .../interfaces/AudioEncoderConfiguration.html | 148 +- docs/interfaces/AudioOutputConfiguration.html | 126 +- docs/interfaces/AudioSourceConfiguration.html | 104 +- docs/interfaces/BacklightCompensation.html | 82 +- docs/interfaces/BacklightCompensation20.html | 82 +- docs/interfaces/Capabilities.html | 120 +- docs/interfaces/CapabilitiesExtension.html | 127 +- docs/interfaces/Config.html | 93 +- docs/interfaces/ConfigurationSet.html | 170 +-- docs/interfaces/Defogging.html | 90 +- docs/interfaces/DeviceCapabilities.html | 115 +- docs/interfaces/DeviceIOCapabilities.html | 126 +- docs/interfaces/DeviceInformation.html | 115 +- docs/interfaces/DiscoveryOptions.html | 126 +- docs/interfaces/DisplayCapabilities.html | 79 +- docs/interfaces/EventCapabilities.html | 108 +- docs/interfaces/EventSubscription.html | 76 +- docs/interfaces/Exposure.html | 192 +-- docs/interfaces/Exposure20.html | 192 +-- docs/interfaces/FocusConfiguration.html | 98 +- docs/interfaces/FocusConfiguration20.html | 120 +- docs/interfaces/H264Configuration.html | 82 +- docs/interfaces/IOCapabilities.html | 90 +- docs/interfaces/IOCapabilitiesExtension.html | 84 +- docs/interfaces/IPAddress.html | 86 -- docs/interfaces/ImageStabilization.html | 90 +- docs/interfaces/ImagingCapabilities.html | 71 +- docs/interfaces/ImagingSettings.html | 178 +-- docs/interfaces/ImagingSettings20.html | 178 +-- .../ImagingSettingsExtension20.html | 79 +- .../ImagingSettingsExtension202.html | 79 +- .../ImagingSettingsExtension203.html | 101 +- docs/interfaces/IntRectangle.html | 92 +- .../interfaces/IrCutFilterAutoAdjustment.html | 101 +- docs/interfaces/ItemList.html | 103 +- docs/interfaces/LensDescription.html | 104 +- docs/interfaces/LensOffset.html | 82 +- docs/interfaces/LensProjection.html | 93 +- docs/interfaces/MediaCapabilities.html | 90 +- .../MediaCapabilitiesExtension.html | 68 +- docs/interfaces/MediaProfile.html | 104 +- docs/interfaces/MetadataConfiguration.html | 200 +-- docs/interfaces/Mpeg4Configuration.html | 82 +- docs/interfaces/MulticastConfiguration.html | 104 +- docs/interfaces/NetworkCapabilities.html | 126 +- .../NetworkCapabilitiesExtension.html | 76 +- docs/interfaces/NoiseReduction.html | 71 +- docs/interfaces/OnvifOptions.html | 175 +-- docs/interfaces/OnvifRequestOptions.html | 674 ++------- docs/interfaces/OnvifService.html | 95 -- docs/interfaces/OnvifServices.html | 164 +- docs/interfaces/OnvifVersion.html | 82 +- docs/interfaces/PTControlDirection.html | 106 +- docs/interfaces/PTZCapabilities.html | 75 +- docs/interfaces/PTZConfiguration.html | 255 +--- .../interfaces/PTZConfigurationExtension.html | 79 +- docs/interfaces/PTZFilter.html | 82 +- docs/interfaces/PTZSpeed.html | 94 +- docs/interfaces/PanTiltLimits.html | 71 +- docs/interfaces/Profile.html | 181 +-- docs/interfaces/ProfileCapabilities.html | 68 +- docs/interfaces/ProfileExtension.html | 90 +- docs/interfaces/Range.html | 76 +- .../RealTimeStreamingCapabilities.html | 104 +- docs/interfaces/ReceiverCapabilities.html | 126 +- docs/interfaces/RecordingCapabilities.html | 108 +- docs/interfaces/Rectangle.html | 92 +- docs/interfaces/ReplayCapabilities.html | 68 +- docs/interfaces/Rotate.html | 90 +- docs/interfaces/RuleEngineConfiguration.html | 76 +- docs/interfaces/SceneOrientation.html | 82 +- docs/interfaces/SearchCapabilities.html | 76 +- docs/interfaces/SecurityCapabilities.html | 184 +-- .../SecurityCapabilitiesExtension.html | 79 +- .../SecurityCapabilitiesExtension2.html | 87 +- docs/interfaces/Space1DDescription.html | 82 +- docs/interfaces/Space2DDescription.html | 93 +- docs/interfaces/SystemCapabilities.html | 202 +-- .../SystemCapabilitiesExtension.html | 100 +- docs/interfaces/ToneCompensation.html | 90 +- .../VideoAnalyticsConfiguration.html | 109 +- .../VideoEncoder2Configuration.html | 181 +-- .../interfaces/VideoEncoderConfiguration.html | 192 +-- docs/interfaces/VideoRateControl.html | 93 +- docs/interfaces/VideoRateControl2.html | 93 +- docs/interfaces/VideoResolution.html | 82 +- docs/interfaces/VideoSource.html | 112 +- docs/interfaces/VideoSourceConfiguration.html | 134 +- .../VideoSourceConfigurationExtension.html | 79 +- .../VideoSourceConfigurationExtension2.html | 82 +- docs/interfaces/VideoSourceExtension.html | 79 +- docs/interfaces/WhiteBalance.html | 95 +- docs/interfaces/WhiteBalance20.html | 106 +- docs/interfaces/WideDynamicRange.html | 82 +- docs/interfaces/WideDynamicRange20.html | 82 +- docs/interfaces/ZoomLimits.html | 68 +- docs/modules.html | 436 ++---- docs/types/AnyURI.html | 156 +- docs/types/Duration.html | 156 +- docs/types/Name.html | 156 +- docs/types/ReferenceToken.html | 156 +- docs/variables/Discovery.html | 169 +-- 117 files changed, 2507 insertions(+), 14691 deletions(-) delete mode 100644 docs/interfaces/IPAddress.html delete mode 100644 docs/interfaces/OnvifService.html diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index 4f75d425..484d2745 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -1,30 +1,24 @@ :root { - --light-hl-0: #0000FF; - --dark-hl-0: #569CD6; + --light-hl-0: #AF00DB; + --dark-hl-0: #C586C0; --light-hl-1: #000000; --dark-hl-1: #D4D4D4; --light-hl-2: #001080; --dark-hl-2: #9CDCFE; - --light-hl-3: #795E26; - --dark-hl-3: #DCDCAA; - --light-hl-4: #A31515; - --dark-hl-4: #CE9178; - --light-hl-5: #800000; - --dark-hl-5: #808080; - --light-hl-6: #267F99; - --dark-hl-6: #4EC9B0; - --light-hl-7: #000000FF; - --dark-hl-7: #D4D4D4; - --light-hl-8: #098658; - --dark-hl-8: #B5CEA8; - --light-hl-9: #008000; - --dark-hl-9: #6A9955; - --light-hl-10: #AF00DB; - --dark-hl-10: #C586C0; - --light-hl-11: #000000; - --dark-hl-11: #C8C8C8; - --light-hl-12: #0070C1; - --dark-hl-12: #4FC1FF; + --light-hl-3: #A31515; + --dark-hl-3: #CE9178; + --light-hl-4: #0000FF; + --dark-hl-4: #569CD6; + --light-hl-5: #0070C1; + --dark-hl-5: #4FC1FF; + --light-hl-6: #795E26; + --dark-hl-6: #DCDCAA; + --light-hl-7: #098658; + --dark-hl-7: #B5CEA8; + --light-hl-8: #008000; + --dark-hl-8: #6A9955; + --light-hl-9: #267F99; + --dark-hl-9: #4EC9B0; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -40,9 +34,6 @@ --hl-7: var(--light-hl-7); --hl-8: var(--light-hl-8); --hl-9: var(--light-hl-9); - --hl-10: var(--light-hl-10); - --hl-11: var(--light-hl-11); - --hl-12: var(--light-hl-12); --code-background: var(--light-code-background); } } @@ -57,9 +48,6 @@ --hl-7: var(--dark-hl-7); --hl-8: var(--dark-hl-8); --hl-9: var(--dark-hl-9); - --hl-10: var(--dark-hl-10); - --hl-11: var(--dark-hl-11); - --hl-12: var(--dark-hl-12); --code-background: var(--dark-code-background); } } @@ -74,9 +62,6 @@ --hl-7: var(--light-hl-7); --hl-8: var(--light-hl-8); --hl-9: var(--light-hl-9); - --hl-10: var(--light-hl-10); - --hl-11: var(--light-hl-11); - --hl-12: var(--light-hl-12); --code-background: var(--light-code-background); } @@ -91,9 +76,6 @@ --hl-7: var(--dark-hl-7); --hl-8: var(--dark-hl-8); --hl-9: var(--dark-hl-9); - --hl-10: var(--dark-hl-10); - --hl-11: var(--dark-hl-11); - --hl-12: var(--dark-hl-12); --code-background: var(--dark-code-background); } @@ -107,7 +89,4 @@ .hl-7 { color: var(--hl-7); } .hl-8 { color: var(--hl-8); } .hl-9 { color: var(--hl-9); } -.hl-10 { color: var(--hl-10); } -.hl-11 { color: var(--hl-11); } -.hl-12 { color: var(--hl-12); } pre, code { background: var(--code-background); } diff --git a/docs/assets/main.js b/docs/assets/main.js index abd0485a..7d7f77a0 100644 --- a/docs/assets/main.js +++ b/docs/assets/main.js @@ -1,54 +1,60 @@ "use strict"; -"use strict";(()=>{var Qe=Object.create;var ae=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var Oe=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var _e=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Me=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ce(e))!Re.call(t,i)&&i!==n&&ae(t,i,{get:()=>e[i],enumerable:!(r=Pe(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Qe(Oe(t)):{},Me(e||!t||!t.__esModule?ae(n,"default",{value:t,enumerable:!0}):n,t));var de=_e((ce,he)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var h=t.utils.clone(n)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(r.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ou?h+=2:a==u&&(n+=r[l+1]*i[h+1],l+=2,h+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),m=s.str.charAt(1),v;m in s.node.edges?v=s.node.edges[m]:(v=new t.TokenSet,s.node.edges[m]=v),s.str.length==1&&(v.final=!0),i.push({node:v,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ce=="object"?he.exports=n():e.lunr=n()}(this,function(){return t})})()});var le=[];function j(t,e){le.push({selector:e,constructor:t})}var Y=class{constructor(){this.createComponents(document.body)}createComponents(e){le.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r}),r.dataset.hasInstance=String(!0))})})}};var k=class{constructor(e){this.el=e.el}};var J=class{constructor(){this.listeners={}}addEventListener(e,n){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(n)}removeEventListener(e,n){if(!(e in this.listeners))return;let r=this.listeners[e];for(let i=0,s=r.length;i{let n=Date.now();return(...r)=>{n+e-Date.now()<0&&(t(...r),n=Date.now())}};var re=class extends J{constructor(){super();this.scrollTop=0;this.lastY=0;this.width=0;this.height=0;this.showToolbar=!0;this.toolbar=document.querySelector(".tsd-page-toolbar"),this.navigation=document.querySelector(".col-menu"),window.addEventListener("scroll",ne(()=>this.onScroll(),10)),window.addEventListener("resize",ne(()=>this.onResize(),10)),this.searchInput=document.querySelector("#tsd-search input"),this.searchInput&&this.searchInput.addEventListener("focus",()=>{this.hideShowToolbar()}),this.onResize(),this.onScroll()}triggerResize(){let n=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(n)}onResize(){this.width=window.innerWidth||0,this.height=window.innerHeight||0;let n=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(n)}onScroll(){this.scrollTop=window.scrollY||0;let n=new CustomEvent("scroll",{detail:{scrollTop:this.scrollTop}});this.dispatchEvent(n),this.hideShowToolbar()}hideShowToolbar(){let n=this.showToolbar;this.showToolbar=this.lastY>=this.scrollTop||this.scrollTop<=0||!!this.searchInput&&this.searchInput===document.activeElement,n!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),this.navigation?.classList.toggle("col-menu--hide")),this.lastY=this.scrollTop}},R=re;R.instance=new re;var X=class extends k{constructor(n){super(n);this.anchors=[];this.index=-1;R.instance.addEventListener("resize",()=>this.onResize()),R.instance.addEventListener("scroll",r=>this.onScroll(r)),this.createAnchors()}createAnchors(){let n=window.location.href;n.indexOf("#")!=-1&&(n=n.substring(0,n.indexOf("#"))),this.el.querySelectorAll("a").forEach(r=>{let i=r.href;if(i.indexOf("#")==-1||i.substring(0,n.length)!=n)return;let s=i.substring(i.indexOf("#")+1),o=document.querySelector("a.tsd-anchor[name="+s+"]"),a=r.parentNode;!o||!a||this.anchors.push({link:a,anchor:o,position:0})}),this.onResize()}onResize(){let n;for(let i=0,s=this.anchors.length;ii.position-s.position);let r=new CustomEvent("scroll",{detail:{scrollTop:R.instance.scrollTop}});this.onScroll(r)}onScroll(n){let r=n.detail.scrollTop+5,i=this.anchors,s=i.length-1,o=this.index;for(;o>-1&&i[o].position>r;)o-=1;for(;o-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=o,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))}};var ue=(t,e=100)=>{let n;return(...r)=>{clearTimeout(n),n=setTimeout(()=>t(r),e)}};var me=De(de());function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let n=document.querySelector("#tsd-search input"),r=document.querySelector("#tsd-search .results");if(!n||!r)throw new Error("The input field or the result list wrapper was not found");let i=!1;r.addEventListener("mousedown",()=>i=!0),r.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),n.addEventListener("focus",()=>t.classList.add("has-focus")),n.addEventListener("blur",()=>{i||(i=!1,t.classList.remove("has-focus"))});let s={base:t.dataset.base+"/"};Fe(t,r,n,s)}function Fe(t,e,n,r){n.addEventListener("input",ue(()=>{Ae(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ve(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?fe(e,-1):s.key==="ArrowDown"?fe(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function He(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=me.Index.load(window.searchData.index))}function Ae(t,e,n,r){if(He(r,t),!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s=i?r.index.search(`*${i}*`):[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o${pe(u.parent,i)}.${l}`);let h=document.createElement("li");h.classList.value=u.classes??"";let m=document.createElement("a");m.href=r.base+u.url,m.innerHTML=l,h.append(m),e.appendChild(h)}}function fe(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ve(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function pe(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ie(t.substring(s,o)),`${ie(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ie(t.substring(s))),i.join("")}var Ne={"&":"&","<":"<",">":">","'":"'",'"':"""};function ie(t){return t.replace(/[&<>"'"]/g,e=>Ne[e])}var F="mousedown",ye="mousemove",B="mouseup",Z={x:0,y:0},ge=!1,se=!1,je=!1,H=!1,xe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(xe?"is-mobile":"not-mobile");xe&&"ontouchstart"in document.documentElement&&(je=!0,F="touchstart",ye="touchmove",B="touchend");document.addEventListener(F,t=>{se=!0,H=!1;let e=F=="touchstart"?t.targetTouches[0]:t;Z.y=e.pageY||0,Z.x=e.pageX||0});document.addEventListener(ye,t=>{if(!!se&&!H){let e=F=="touchstart"?t.targetTouches[0]:t,n=Z.x-(e.pageX||0),r=Z.y-(e.pageY||0);H=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{se=!1});document.addEventListener("click",t=>{ge&&(t.preventDefault(),t.stopImmediatePropagation(),ge=!1)});var K=class extends k{constructor(n){super(n);this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,r=>this.onPointerUp(r)),this.el.addEventListener("click",r=>r.preventDefault()),document.addEventListener(F,r=>this.onDocumentPointerDown(r)),document.addEventListener(B,r=>this.onDocumentPointerUp(r))}setActive(n){if(this.active==n)return;this.active=n,document.documentElement.classList.toggle("has-"+this.className,n),this.el.classList.toggle("active",n);let r=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(r),setTimeout(()=>document.documentElement.classList.remove(r),500)}onPointerUp(n){H||(this.setActive(!0),n.preventDefault())}onDocumentPointerDown(n){if(this.active){if(n.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(n){if(!H&&this.active&&n.target.closest(".col-menu")){let r=n.target.closest("a");if(r){let i=window.location.href;i.indexOf("#")!=-1&&(i=i.substring(0,i.indexOf("#"))),r.href.substring(0,i.length)==i&&setTimeout(()=>this.setActive(!1),250)}}}};var oe;try{oe=localStorage}catch{oe={getItem(){return null},setItem(){}}}var Q=oe;var Le=document.head.appendChild(document.createElement("style"));Le.dataset.for="filters";var ee=class extends k{constructor(n){super(n);this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),Le.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.checked}setLocalStorage(n){Q.setItem(this.key,n.toString()),this.value=n,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),document.querySelectorAll(".tsd-index-section").forEach(n=>{n.style.display="block";let r=Array.from(n.querySelectorAll(".tsd-index-link")).every(i=>i.offsetParent==null);n.style.display=r?"none":"block"})}};var te=class extends k{constructor(n){super(n);this.calculateHeights(),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.textContent.replace(/\s+/g,"-").toLowerCase()}`,this.setLocalStorage(this.fromLocalStorage(),!0),this.summary.addEventListener("click",r=>this.toggleVisibility(r)),this.icon.style.transform=this.getIconRotation()}getIconRotation(n=this.el.open){return`rotate(${n?0:-90}deg)`}calculateHeights(){let n=this.el.open,{position:r,left:i}=this.el.style;this.el.style.position="fixed",this.el.style.left="-9999px",this.el.open=!0,this.expandedHeight=this.el.offsetHeight+"px",this.el.open=!1,this.collapsedHeight=this.el.offsetHeight+"px",this.el.open=n,this.el.style.height=n?this.expandedHeight:this.collapsedHeight,this.el.style.position=r,this.el.style.left=i}toggleVisibility(n){n.preventDefault(),this.el.style.overflow="hidden",this.el.open?this.collapse():this.expand()}expand(n=!0){this.el.open=!0,this.animate(this.collapsedHeight,this.expandedHeight,{opening:!0,duration:n?300:0})}collapse(n=!0){this.animate(this.expandedHeight,this.collapsedHeight,{opening:!1,duration:n?300:0})}animate(n,r,{opening:i,duration:s=300}){if(this.animation)return;let o={duration:s,easing:"ease"};this.animation=this.el.animate({height:[n,r]},o),this.icon.animate({transform:[this.icon.style.transform||this.getIconRotation(!i),this.getIconRotation(i)]},o).addEventListener("finish",()=>{this.icon.style.transform=this.getIconRotation(i)}),this.animation.addEventListener("finish",()=>this.animationEnd(i))}animationEnd(n){this.el.open=n,this.animation=void 0,this.el.style.height="auto",this.el.style.overflow="visible",this.setLocalStorage(n)}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.open}setLocalStorage(n,r=!1){this.fromLocalStorage()===n&&!r||(Q.setItem(this.key,n.toString()),this.el.open=n,this.handleValueChange(r))}handleValueChange(n=!1){this.fromLocalStorage()===this.el.open&&!n||(this.fromLocalStorage()?this.expand(!1):this.collapse(!1))}};function be(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,Ee(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),Ee(t.value)})}function Ee(t){document.documentElement.dataset.theme=t}ve();j(X,".menu-highlight");j(K,"a[data-toggle]");j(te,".tsd-index-accordion");j(ee,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("theme");Se&&be(Se);var Be=new Y;Object.defineProperty(window,"app",{value:Be});})(); -/*! - * lunr.Builder - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Index - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Pipeline - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Set - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.TokenSet - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Vector - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.stemmer - * Copyright (C) 2020 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - */ -/*! - * lunr.stopWordFilter - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.tokenizer - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.trimmer - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.utils - * Copyright (C) 2020 Oliver Nightingale - */ -/** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - */ +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings."}; +"use strict";(()=>{var Ce=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Ce(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){se.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!e.checkVisibility()){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),Ve(t,i,r,e)}function Ve(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?He(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function He(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var Be={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>Be[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",H="mouseup",J={x:0,y:0},me=!1,ne=!1,je=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(je=!0,F="touchstart",ye="touchmove",H="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(H,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(H,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(H,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var qe=new U;Object.defineProperty(window,"app",{value:qe});fe();we();})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/assets/search.js b/docs/assets/search.js index 3986a3f4..beffe5fa 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = JSON.parse("{\"kinds\":{\"32\":\"Variable\",\"128\":\"Class\",\"256\":\"Interface\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"262144\":\"Accessor\",\"4194304\":\"Type alias\"},\"rows\":[{\"kind\":256,\"name\":\"OnvifOptions\",\"url\":\"interfaces/OnvifOptions.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"useSecure\",\"url\":\"interfaces/OnvifOptions.html#useSecure\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"secureOptions\",\"url\":\"interfaces/OnvifOptions.html#secureOptions\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"hostname\",\"url\":\"interfaces/OnvifOptions.html#hostname\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"username\",\"url\":\"interfaces/OnvifOptions.html#username\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"password\",\"url\":\"interfaces/OnvifOptions.html#password\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"port\",\"url\":\"interfaces/OnvifOptions.html#port\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/OnvifOptions.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"timeout\",\"url\":\"interfaces/OnvifOptions.html#timeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"urn\",\"url\":\"interfaces/OnvifOptions.html#urn\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"agent\",\"url\":\"interfaces/OnvifOptions.html#agent\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"preserveAddress\",\"url\":\"interfaces/OnvifOptions.html#preserveAddress\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":1024,\"name\":\"autoConnect\",\"url\":\"interfaces/OnvifOptions.html#autoConnect\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifOptions\"},{\"kind\":256,\"name\":\"OnvifServices\",\"url\":\"interfaces/OnvifServices.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"PTZ\",\"url\":\"interfaces/OnvifServices.html#PTZ\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"analyticsDevice\",\"url\":\"interfaces/OnvifServices.html#analyticsDevice\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"device\",\"url\":\"interfaces/OnvifServices.html#device\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"deviceIO\",\"url\":\"interfaces/OnvifServices.html#deviceIO\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"display\",\"url\":\"interfaces/OnvifServices.html#display\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"events\",\"url\":\"interfaces/OnvifServices.html#events\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"imaging\",\"url\":\"interfaces/OnvifServices.html#imaging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"media2\",\"url\":\"interfaces/OnvifServices.html#media2\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"media\",\"url\":\"interfaces/OnvifServices.html#media\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"receiver\",\"url\":\"interfaces/OnvifServices.html#receiver\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"recording\",\"url\":\"interfaces/OnvifServices.html#recording\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"replay\",\"url\":\"interfaces/OnvifServices.html#replay\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":1024,\"name\":\"search\",\"url\":\"interfaces/OnvifServices.html#search\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifServices\"},{\"kind\":256,\"name\":\"OnvifRequestOptions\",\"url\":\"interfaces/OnvifRequestOptions.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"service\",\"url\":\"interfaces/OnvifRequestOptions.html#service\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifRequestOptions\"},{\"kind\":1024,\"name\":\"body\",\"url\":\"interfaces/OnvifRequestOptions.html#body\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifRequestOptions\"},{\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/OnvifRequestOptions.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifRequestOptions\"},{\"kind\":1024,\"name\":\"ptz\",\"url\":\"interfaces/OnvifRequestOptions.html#ptz\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifRequestOptions\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/OnvifRequestOptions.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"OnvifRequestOptions\"},{\"kind\":256,\"name\":\"ActiveSource\",\"url\":\"interfaces/ActiveSource.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"sourceToken\",\"url\":\"interfaces/ActiveSource.html#sourceToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"profileToken\",\"url\":\"interfaces/ActiveSource.html#profileToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"videoSourceConfigurationToken\",\"url\":\"interfaces/ActiveSource.html#videoSourceConfigurationToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"encoding\",\"url\":\"interfaces/ActiveSource.html#encoding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/ActiveSource.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/ActiveSource.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"fps\",\"url\":\"interfaces/ActiveSource.html#fps\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"bitrate\",\"url\":\"interfaces/ActiveSource.html#bitrate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"ptz\",\"url\":\"interfaces/ActiveSource.html#ptz\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/ActiveSource.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"ActiveSource\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/ActiveSource.html#__type.name\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"ActiveSource.__type\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/ActiveSource.html#__type.token\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"ActiveSource.__type\"},{\"kind\":128,\"name\":\"Onvif\",\"url\":\"classes/Onvif.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":1024,\"name\":\"rawRequest\",\"url\":\"classes/Onvif.html#rawRequest\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"rawResponse\",\"url\":\"classes/Onvif.html#rawResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"warn\",\"url\":\"classes/Onvif.html#warn\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"error\",\"url\":\"classes/Onvif.html#error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Onvif.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"device\",\"url\":\"classes/Onvif.html#device\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"media\",\"url\":\"classes/Onvif.html#media\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"useSecure\",\"url\":\"classes/Onvif.html#useSecure\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"secureOptions\",\"url\":\"classes/Onvif.html#secureOptions\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"hostname\",\"url\":\"classes/Onvif.html#hostname\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"username\",\"url\":\"classes/Onvif.html#username\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"password\",\"url\":\"classes/Onvif.html#password\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"port\",\"url\":\"classes/Onvif.html#port\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"path\",\"url\":\"classes/Onvif.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"timeout\",\"url\":\"classes/Onvif.html#timeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"agent\",\"url\":\"classes/Onvif.html#agent\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"preserveAddress\",\"url\":\"classes/Onvif.html#preserveAddress\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"events\",\"url\":\"classes/Onvif.html#events\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"uri\",\"url\":\"classes/Onvif.html#uri\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"timeShift\",\"url\":\"classes/Onvif.html#timeShift\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"capabilities\",\"url\":\"classes/Onvif.html#capabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"defaultProfiles\",\"url\":\"classes/Onvif.html#defaultProfiles\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"defaultProfile\",\"url\":\"classes/Onvif.html#defaultProfile\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"activeSources\",\"url\":\"classes/Onvif.html#activeSources\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"activeSource\",\"url\":\"classes/Onvif.html#activeSource\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"urn\",\"url\":\"classes/Onvif.html#urn\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":1024,\"name\":\"deviceInformation\",\"url\":\"classes/Onvif.html#deviceInformation\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"envelopeHeader\",\"url\":\"classes/Onvif.html#envelopeHeader\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"envelopeFooter\",\"url\":\"classes/Onvif.html#envelopeFooter\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"passwordDigest\",\"url\":\"classes/Onvif.html#passwordDigest\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Onvif.html#passwordDigest.passwordDigest-1.__type\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"Onvif.passwordDigest.passwordDigest\"},{\"kind\":1024,\"name\":\"passDigest\",\"url\":\"classes/Onvif.html#passwordDigest.passwordDigest-1.__type.passDigest\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Onvif.passwordDigest.passwordDigest.__type\"},{\"kind\":1024,\"name\":\"nonce\",\"url\":\"classes/Onvif.html#passwordDigest.passwordDigest-1.__type.nonce\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Onvif.passwordDigest.passwordDigest.__type\"},{\"kind\":1024,\"name\":\"timestamp\",\"url\":\"classes/Onvif.html#passwordDigest.passwordDigest-1.__type.timestamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Onvif.passwordDigest.passwordDigest.__type\"},{\"kind\":2048,\"name\":\"setupSystemDateAndTime\",\"url\":\"classes/Onvif.html#setupSystemDateAndTime\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"rawRequest\",\"url\":\"classes/Onvif.html#rawRequest-1\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"request\",\"url\":\"classes/Onvif.html#request\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"parseUrl\",\"url\":\"classes/Onvif.html#parseUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"getSystemDateAndTime\",\"url\":\"classes/Onvif.html#getSystemDateAndTime\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"getActiveSources\",\"url\":\"classes/Onvif.html#getActiveSources\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Onvif\"},{\"kind\":2048,\"name\":\"connect\",\"url\":\"classes/Onvif.html#connect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Onvif\"},{\"kind\":256,\"name\":\"OnvifService\",\"url\":\"interfaces/OnvifService.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"namespace\",\"url\":\"interfaces/OnvifService.html#namespace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifService\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/OnvifService.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifService\"},{\"kind\":1024,\"name\":\"minor\",\"url\":\"interfaces/OnvifService.html#minor\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifService\"},{\"kind\":1024,\"name\":\"major\",\"url\":\"interfaces/OnvifService.html#major\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifService\"},{\"kind\":256,\"name\":\"OnvifVersion\",\"url\":\"interfaces/OnvifVersion.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"major\",\"url\":\"interfaces/OnvifVersion.html#major\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifVersion\"},{\"kind\":1024,\"name\":\"minor\",\"url\":\"interfaces/OnvifVersion.html#minor\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"OnvifVersion\"},{\"kind\":256,\"name\":\"NetworkCapabilitiesExtension\",\"url\":\"interfaces/NetworkCapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"dot11Configuration\",\"url\":\"interfaces/NetworkCapabilitiesExtension.html#dot11Configuration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/NetworkCapabilitiesExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilitiesExtension\"},{\"kind\":256,\"name\":\"NetworkCapabilities\",\"url\":\"interfaces/NetworkCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"IPFilter\",\"url\":\"interfaces/NetworkCapabilities.html#IPFilter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilities\"},{\"kind\":1024,\"name\":\"zeroConfiguration\",\"url\":\"interfaces/NetworkCapabilities.html#zeroConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilities\"},{\"kind\":1024,\"name\":\"IPVersion6\",\"url\":\"interfaces/NetworkCapabilities.html#IPVersion6\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilities\"},{\"kind\":1024,\"name\":\"dynDNS\",\"url\":\"interfaces/NetworkCapabilities.html#dynDNS\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/NetworkCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NetworkCapabilities\"},{\"kind\":256,\"name\":\"SystemCapabilitiesExtension\",\"url\":\"interfaces/SystemCapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"httpFirmwareUpgrade\",\"url\":\"interfaces/SystemCapabilitiesExtension.html#httpFirmwareUpgrade\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"httpSystemBackup\",\"url\":\"interfaces/SystemCapabilitiesExtension.html#httpSystemBackup\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"httpSystemLogging\",\"url\":\"interfaces/SystemCapabilitiesExtension.html#httpSystemLogging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"httpSupportInformation\",\"url\":\"interfaces/SystemCapabilitiesExtension.html#httpSupportInformation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/SystemCapabilitiesExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilitiesExtension\"},{\"kind\":256,\"name\":\"SystemCapabilities\",\"url\":\"interfaces/SystemCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"discoveryResolve\",\"url\":\"interfaces/SystemCapabilities.html#discoveryResolve\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"discoveryBye\",\"url\":\"interfaces/SystemCapabilities.html#discoveryBye\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"remoteDiscovery\",\"url\":\"interfaces/SystemCapabilities.html#remoteDiscovery\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"systemBackup\",\"url\":\"interfaces/SystemCapabilities.html#systemBackup\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"systemLogging\",\"url\":\"interfaces/SystemCapabilities.html#systemLogging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"firmwareUpgrade\",\"url\":\"interfaces/SystemCapabilities.html#firmwareUpgrade\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"httpFirmwareUpgrade\",\"url\":\"interfaces/SystemCapabilities.html#httpFirmwareUpgrade\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"httpSystemBackup\",\"url\":\"interfaces/SystemCapabilities.html#httpSystemBackup\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"httpSystemLogging\",\"url\":\"interfaces/SystemCapabilities.html#httpSystemLogging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"supportedVersions\",\"url\":\"interfaces/SystemCapabilities.html#supportedVersions\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":1024,\"name\":\"extensions\",\"url\":\"interfaces/SystemCapabilities.html#extensions\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SystemCapabilities\"},{\"kind\":256,\"name\":\"IOCapabilitiesExtension\",\"url\":\"interfaces/IOCapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"auxiliary\",\"url\":\"interfaces/IOCapabilitiesExtension.html#auxiliary\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"auxiliaryCommands\",\"url\":\"interfaces/IOCapabilitiesExtension.html#auxiliaryCommands\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/IOCapabilitiesExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilitiesExtension\"},{\"kind\":256,\"name\":\"IOCapabilities\",\"url\":\"interfaces/IOCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"inputConnectors\",\"url\":\"interfaces/IOCapabilities.html#inputConnectors\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilities\"},{\"kind\":1024,\"name\":\"relayOutputs\",\"url\":\"interfaces/IOCapabilities.html#relayOutputs\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/IOCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IOCapabilities\"},{\"kind\":256,\"name\":\"SecurityCapabilitiesExtension2\",\"url\":\"interfaces/SecurityCapabilitiesExtension2.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"dot1X\",\"url\":\"interfaces/SecurityCapabilitiesExtension2.html#dot1X\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilitiesExtension2\"},{\"kind\":1024,\"name\":\"supportedEAPMethod\",\"url\":\"interfaces/SecurityCapabilitiesExtension2.html#supportedEAPMethod\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilitiesExtension2\"},{\"kind\":1024,\"name\":\"remoteUserHandling\",\"url\":\"interfaces/SecurityCapabilitiesExtension2.html#remoteUserHandling\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilitiesExtension2\"},{\"kind\":256,\"name\":\"SecurityCapabilitiesExtension\",\"url\":\"interfaces/SecurityCapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"TLS1.0\",\"url\":\"interfaces/SecurityCapabilitiesExtension.html#TLS1_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilitiesExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/SecurityCapabilitiesExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilitiesExtension\"},{\"kind\":256,\"name\":\"SecurityCapabilities\",\"url\":\"interfaces/SecurityCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"TLS1.1\",\"url\":\"interfaces/SecurityCapabilities.html#TLS1_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"TLS1.2\",\"url\":\"interfaces/SecurityCapabilities.html#TLS1_2\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"onboardKeyGeneration\",\"url\":\"interfaces/SecurityCapabilities.html#onboardKeyGeneration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"accessPolicyConfig\",\"url\":\"interfaces/SecurityCapabilities.html#accessPolicyConfig\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"X.509Token\",\"url\":\"interfaces/SecurityCapabilities.html#X_509Token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"SAMLToken\",\"url\":\"interfaces/SecurityCapabilities.html#SAMLToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"kerberosToken\",\"url\":\"interfaces/SecurityCapabilities.html#kerberosToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"RELToken\",\"url\":\"interfaces/SecurityCapabilities.html#RELToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/SecurityCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SecurityCapabilities\"},{\"kind\":256,\"name\":\"EventCapabilities\",\"url\":\"interfaces/EventCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/EventCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventCapabilities\"},{\"kind\":1024,\"name\":\"WSSubscriptionPolicySupport\",\"url\":\"interfaces/EventCapabilities.html#WSSubscriptionPolicySupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventCapabilities\"},{\"kind\":1024,\"name\":\"WSPullPointSupport\",\"url\":\"interfaces/EventCapabilities.html#WSPullPointSupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventCapabilities\"},{\"kind\":1024,\"name\":\"WSPausableSubscriptionManagerInterfaceSupport\",\"url\":\"interfaces/EventCapabilities.html#WSPausableSubscriptionManagerInterfaceSupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventCapabilities\"},{\"kind\":256,\"name\":\"ImagingCapabilities\",\"url\":\"interfaces/ImagingCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/ImagingCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingCapabilities\"},{\"kind\":256,\"name\":\"RealTimeStreamingCapabilities\",\"url\":\"interfaces/RealTimeStreamingCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"RTPMulticast\",\"url\":\"interfaces/RealTimeStreamingCapabilities.html#RTPMulticast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RealTimeStreamingCapabilities\"},{\"kind\":1024,\"name\":\"RTP_TCP\",\"url\":\"interfaces/RealTimeStreamingCapabilities.html#RTP_TCP\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RealTimeStreamingCapabilities\"},{\"kind\":1024,\"name\":\"RTP_RTSP_TCP\",\"url\":\"interfaces/RealTimeStreamingCapabilities.html#RTP_RTSP_TCP\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RealTimeStreamingCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/RealTimeStreamingCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RealTimeStreamingCapabilities\"},{\"kind\":256,\"name\":\"ProfileCapabilities\",\"url\":\"interfaces/ProfileCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"maximumNumberOfProfiles\",\"url\":\"interfaces/ProfileCapabilities.html#maximumNumberOfProfiles\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ProfileCapabilities\"},{\"kind\":256,\"name\":\"MediaCapabilitiesExtension\",\"url\":\"interfaces/MediaCapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"profileCapabilities\",\"url\":\"interfaces/MediaCapabilitiesExtension.html#profileCapabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaCapabilitiesExtension\"},{\"kind\":256,\"name\":\"MediaCapabilities\",\"url\":\"interfaces/MediaCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/MediaCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaCapabilities\"},{\"kind\":1024,\"name\":\"streamingCapabilities\",\"url\":\"interfaces/MediaCapabilities.html#streamingCapabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/MediaCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaCapabilities\"},{\"kind\":256,\"name\":\"PTZCapabilities\",\"url\":\"interfaces/PTZCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/PTZCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZCapabilities\"},{\"kind\":256,\"name\":\"DeviceIOCapabilities\",\"url\":\"interfaces/DeviceIOCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/DeviceIOCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"videoSources\",\"url\":\"interfaces/DeviceIOCapabilities.html#videoSources\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"videoOutputs\",\"url\":\"interfaces/DeviceIOCapabilities.html#videoOutputs\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"audioSources\",\"url\":\"interfaces/DeviceIOCapabilities.html#audioSources\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"audioOutputs\",\"url\":\"interfaces/DeviceIOCapabilities.html#audioOutputs\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"relayOutputs\",\"url\":\"interfaces/DeviceIOCapabilities.html#relayOutputs\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"extensions\",\"url\":\"interfaces/DeviceIOCapabilities.html#extensions\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/DeviceIOCapabilities.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"DeviceIOCapabilities\"},{\"kind\":1024,\"name\":\"telexCapabilities\",\"url\":\"interfaces/DeviceIOCapabilities.html#__type.telexCapabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"DeviceIOCapabilities.__type\"},{\"kind\":1024,\"name\":\"scdlCapabilities\",\"url\":\"interfaces/DeviceIOCapabilities.html#__type.scdlCapabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"DeviceIOCapabilities.__type\"},{\"kind\":256,\"name\":\"DisplayCapabilities\",\"url\":\"interfaces/DisplayCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/DisplayCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DisplayCapabilities\"},{\"kind\":1024,\"name\":\"fixedLayout\",\"url\":\"interfaces/DisplayCapabilities.html#fixedLayout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DisplayCapabilities\"},{\"kind\":256,\"name\":\"RecordingCapabilities\",\"url\":\"interfaces/RecordingCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/RecordingCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":1024,\"name\":\"receiverSource\",\"url\":\"interfaces/RecordingCapabilities.html#receiverSource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":1024,\"name\":\"mediaProfileSource\",\"url\":\"interfaces/RecordingCapabilities.html#mediaProfileSource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":1024,\"name\":\"dynamicRecordings\",\"url\":\"interfaces/RecordingCapabilities.html#dynamicRecordings\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":1024,\"name\":\"dynamicTracks\",\"url\":\"interfaces/RecordingCapabilities.html#dynamicTracks\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":1024,\"name\":\"maxStringLength\",\"url\":\"interfaces/RecordingCapabilities.html#maxStringLength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RecordingCapabilities\"},{\"kind\":256,\"name\":\"SearchCapabilities\",\"url\":\"interfaces/SearchCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/SearchCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SearchCapabilities\"},{\"kind\":1024,\"name\":\"metadataSearch\",\"url\":\"interfaces/SearchCapabilities.html#metadataSearch\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SearchCapabilities\"},{\"kind\":256,\"name\":\"ReplayCapabilities\",\"url\":\"interfaces/ReplayCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/ReplayCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReplayCapabilities\"},{\"kind\":256,\"name\":\"ReceiverCapabilities\",\"url\":\"interfaces/ReceiverCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/ReceiverCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":1024,\"name\":\"RTP_Multicast\",\"url\":\"interfaces/ReceiverCapabilities.html#RTP_Multicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":1024,\"name\":\"RTP_TCP\",\"url\":\"interfaces/ReceiverCapabilities.html#RTP_TCP\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":1024,\"name\":\"RTP_RTSP_TCP\",\"url\":\"interfaces/ReceiverCapabilities.html#RTP_RTSP_TCP\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":1024,\"name\":\"supportedReceivers\",\"url\":\"interfaces/ReceiverCapabilities.html#supportedReceivers\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":1024,\"name\":\"maximumRTSPURILength\",\"url\":\"interfaces/ReceiverCapabilities.html#maximumRTSPURILength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ReceiverCapabilities\"},{\"kind\":256,\"name\":\"AnalyticsDeviceCapabilities\",\"url\":\"interfaces/AnalyticsDeviceCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/AnalyticsDeviceCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsDeviceCapabilities\"},{\"kind\":1024,\"name\":\"ruleSupport\",\"url\":\"interfaces/AnalyticsDeviceCapabilities.html#ruleSupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsDeviceCapabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/AnalyticsDeviceCapabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsDeviceCapabilities\"},{\"kind\":256,\"name\":\"CapabilitiesExtension\",\"url\":\"interfaces/CapabilitiesExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/CapabilitiesExtension.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"deviceIO\",\"url\":\"interfaces/CapabilitiesExtension.html#deviceIO\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"display\",\"url\":\"interfaces/CapabilitiesExtension.html#display\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"recording\",\"url\":\"interfaces/CapabilitiesExtension.html#recording\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"search\",\"url\":\"interfaces/CapabilitiesExtension.html#search\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"replay\",\"url\":\"interfaces/CapabilitiesExtension.html#replay\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"receiver\",\"url\":\"interfaces/CapabilitiesExtension.html#receiver\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":1024,\"name\":\"analyticsDevice\",\"url\":\"interfaces/CapabilitiesExtension.html#analyticsDevice\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"CapabilitiesExtension\"},{\"kind\":256,\"name\":\"DeviceCapabilities\",\"url\":\"interfaces/DeviceCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/DeviceCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":1024,\"name\":\"network\",\"url\":\"interfaces/DeviceCapabilities.html#network\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":1024,\"name\":\"system\",\"url\":\"interfaces/DeviceCapabilities.html#system\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":1024,\"name\":\"IO\",\"url\":\"interfaces/DeviceCapabilities.html#IO\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":1024,\"name\":\"security\",\"url\":\"interfaces/DeviceCapabilities.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":1024,\"name\":\"extensions\",\"url\":\"interfaces/DeviceCapabilities.html#extensions\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceCapabilities\"},{\"kind\":256,\"name\":\"AnalyticsCapabilities\",\"url\":\"interfaces/AnalyticsCapabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"XAddr\",\"url\":\"interfaces/AnalyticsCapabilities.html#XAddr\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsCapabilities\"},{\"kind\":1024,\"name\":\"ruleSupport\",\"url\":\"interfaces/AnalyticsCapabilities.html#ruleSupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsCapabilities\"},{\"kind\":1024,\"name\":\"analyticsModuleSupport\",\"url\":\"interfaces/AnalyticsCapabilities.html#analyticsModuleSupport\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsCapabilities\"},{\"kind\":256,\"name\":\"Capabilities\",\"url\":\"interfaces/Capabilities.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"analytics\",\"url\":\"interfaces/Capabilities.html#analytics\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"device\",\"url\":\"interfaces/Capabilities.html#device\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"events\",\"url\":\"interfaces/Capabilities.html#events\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"imaging\",\"url\":\"interfaces/Capabilities.html#imaging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"media\",\"url\":\"interfaces/Capabilities.html#media\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"ptz\",\"url\":\"interfaces/Capabilities.html#ptz\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/Capabilities.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Capabilities\"},{\"kind\":128,\"name\":\"Device\",\"url\":\"classes/Device.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Device.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":1024,\"name\":\"onvif\",\"url\":\"classes/Device.html#onvif\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Device\"},{\"kind\":1024,\"name\":\"services\",\"url\":\"classes/Device.html#services\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Device\"},{\"kind\":1024,\"name\":\"media2Support\",\"url\":\"classes/Device.html#media2Support\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":2048,\"name\":\"getSystemDateAndTime\",\"url\":\"classes/Device.html#getSystemDateAndTime\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":2048,\"name\":\"getServices\",\"url\":\"classes/Device.html#getServices\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":2048,\"name\":\"getCapabilities\",\"url\":\"classes/Device.html#getCapabilities\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":2048,\"name\":\"getDeviceInformation\",\"url\":\"classes/Device.html#getDeviceInformation\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":2048,\"name\":\"getHostname\",\"url\":\"classes/Device.html#getHostname\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Device\"},{\"kind\":256,\"name\":\"DeviceInformation\",\"url\":\"interfaces/DeviceInformation.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"manufacturer\",\"url\":\"interfaces/DeviceInformation.html#manufacturer\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceInformation\"},{\"kind\":1024,\"name\":\"model\",\"url\":\"interfaces/DeviceInformation.html#model\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceInformation\"},{\"kind\":1024,\"name\":\"firmwareVersion\",\"url\":\"interfaces/DeviceInformation.html#firmwareVersion\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceInformation\"},{\"kind\":1024,\"name\":\"serialNumber\",\"url\":\"interfaces/DeviceInformation.html#serialNumber\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceInformation\"},{\"kind\":1024,\"name\":\"hardwareId\",\"url\":\"interfaces/DeviceInformation.html#hardwareId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DeviceInformation\"},{\"kind\":4194304,\"name\":\"AnyURI\",\"url\":\"types/AnyURI.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"ReferenceToken\",\"url\":\"types/ReferenceToken.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"Name\",\"url\":\"types/Name.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":256,\"name\":\"IntRectangle\",\"url\":\"interfaces/IntRectangle.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"x\",\"url\":\"interfaces/IntRectangle.html#x\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IntRectangle\"},{\"kind\":1024,\"name\":\"y\",\"url\":\"interfaces/IntRectangle.html#y\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IntRectangle\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/IntRectangle.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IntRectangle\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/IntRectangle.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IntRectangle\"},{\"kind\":256,\"name\":\"Rotate\",\"url\":\"interfaces/Rotate.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/Rotate.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rotate\"},{\"kind\":1024,\"name\":\"degree\",\"url\":\"interfaces/Rotate.html#degree\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rotate\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/Rotate.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rotate\"},{\"kind\":256,\"name\":\"LensOffset\",\"url\":\"interfaces/LensOffset.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"x\",\"url\":\"interfaces/LensOffset.html#x\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensOffset\"},{\"kind\":1024,\"name\":\"y\",\"url\":\"interfaces/LensOffset.html#y\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensOffset\"},{\"kind\":256,\"name\":\"LensProjection\",\"url\":\"interfaces/LensProjection.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"angle\",\"url\":\"interfaces/LensProjection.html#angle\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensProjection\"},{\"kind\":1024,\"name\":\"radius\",\"url\":\"interfaces/LensProjection.html#radius\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensProjection\"},{\"kind\":1024,\"name\":\"transmittance\",\"url\":\"interfaces/LensProjection.html#transmittance\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensProjection\"},{\"kind\":256,\"name\":\"LensDescription\",\"url\":\"interfaces/LensDescription.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"focalLength\",\"url\":\"interfaces/LensDescription.html#focalLength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensDescription\"},{\"kind\":1024,\"name\":\"offset\",\"url\":\"interfaces/LensDescription.html#offset\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensDescription\"},{\"kind\":1024,\"name\":\"projection\",\"url\":\"interfaces/LensDescription.html#projection\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensDescription\"},{\"kind\":1024,\"name\":\"XFactor\",\"url\":\"interfaces/LensDescription.html#XFactor\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"LensDescription\"},{\"kind\":256,\"name\":\"SceneOrientation\",\"url\":\"interfaces/SceneOrientation.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/SceneOrientation.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SceneOrientation\"},{\"kind\":1024,\"name\":\"orientation\",\"url\":\"interfaces/SceneOrientation.html#orientation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SceneOrientation\"},{\"kind\":256,\"name\":\"VideoSourceConfigurationExtension2\",\"url\":\"interfaces/VideoSourceConfigurationExtension2.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"lensDescription\",\"url\":\"interfaces/VideoSourceConfigurationExtension2.html#lensDescription\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfigurationExtension2\"},{\"kind\":1024,\"name\":\"sceneOrientation\",\"url\":\"interfaces/VideoSourceConfigurationExtension2.html#sceneOrientation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfigurationExtension2\"},{\"kind\":256,\"name\":\"VideoSourceConfigurationExtension\",\"url\":\"interfaces/VideoSourceConfigurationExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"rotate\",\"url\":\"interfaces/VideoSourceConfigurationExtension.html#rotate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfigurationExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/VideoSourceConfigurationExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfigurationExtension\"},{\"kind\":256,\"name\":\"VideoSourceConfiguration\",\"url\":\"interfaces/VideoSourceConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/VideoSourceConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/VideoSourceConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/VideoSourceConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"viewMode\",\"url\":\"interfaces/VideoSourceConfiguration.html#viewMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"sourceToken\",\"url\":\"interfaces/VideoSourceConfiguration.html#sourceToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"bounds\",\"url\":\"interfaces/VideoSourceConfiguration.html#bounds\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/VideoSourceConfiguration.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceConfiguration\"},{\"kind\":256,\"name\":\"AudioSourceConfiguration\",\"url\":\"interfaces/AudioSourceConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/AudioSourceConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioSourceConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/AudioSourceConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioSourceConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/AudioSourceConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioSourceConfiguration\"},{\"kind\":1024,\"name\":\"sourceToken\",\"url\":\"interfaces/AudioSourceConfiguration.html#sourceToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioSourceConfiguration\"},{\"kind\":256,\"name\":\"VideoResolution\",\"url\":\"interfaces/VideoResolution.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/VideoResolution.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoResolution\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/VideoResolution.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoResolution\"},{\"kind\":256,\"name\":\"VideoRateControl\",\"url\":\"interfaces/VideoRateControl.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"frameRateLimit\",\"url\":\"interfaces/VideoRateControl.html#frameRateLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl\"},{\"kind\":1024,\"name\":\"encodingInterval\",\"url\":\"interfaces/VideoRateControl.html#encodingInterval\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl\"},{\"kind\":1024,\"name\":\"bitrateLimit\",\"url\":\"interfaces/VideoRateControl.html#bitrateLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl\"},{\"kind\":256,\"name\":\"Mpeg4Configuration\",\"url\":\"interfaces/Mpeg4Configuration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"govLength\",\"url\":\"interfaces/Mpeg4Configuration.html#govLength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Mpeg4Configuration\"},{\"kind\":1024,\"name\":\"mpeg4Profile\",\"url\":\"interfaces/Mpeg4Configuration.html#mpeg4Profile\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Mpeg4Configuration\"},{\"kind\":256,\"name\":\"H264Configuration\",\"url\":\"interfaces/H264Configuration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"govLength\",\"url\":\"interfaces/H264Configuration.html#govLength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"H264Configuration\"},{\"kind\":1024,\"name\":\"H264Profile\",\"url\":\"interfaces/H264Configuration.html#H264Profile\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"H264Configuration\"},{\"kind\":256,\"name\":\"IPAddress\",\"url\":\"interfaces/IPAddress.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/IPAddress.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IPAddress\"},{\"kind\":1024,\"name\":\"IPv4Address\",\"url\":\"interfaces/IPAddress.html#IPv4Address\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IPAddress\"},{\"kind\":1024,\"name\":\"IPv6Address\",\"url\":\"interfaces/IPAddress.html#IPv6Address\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IPAddress\"},{\"kind\":256,\"name\":\"MulticastConfiguration\",\"url\":\"interfaces/MulticastConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"address\",\"url\":\"interfaces/MulticastConfiguration.html#address\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MulticastConfiguration\"},{\"kind\":1024,\"name\":\"port\",\"url\":\"interfaces/MulticastConfiguration.html#port\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MulticastConfiguration\"},{\"kind\":1024,\"name\":\"TTL\",\"url\":\"interfaces/MulticastConfiguration.html#TTL\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MulticastConfiguration\"},{\"kind\":1024,\"name\":\"autoStart\",\"url\":\"interfaces/MulticastConfiguration.html#autoStart\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MulticastConfiguration\"},{\"kind\":4194304,\"name\":\"Duration\",\"url\":\"types/Duration.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":256,\"name\":\"VideoEncoderConfiguration\",\"url\":\"interfaces/VideoEncoderConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/VideoEncoderConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/VideoEncoderConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/VideoEncoderConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"guaranteedFrameRate\",\"url\":\"interfaces/VideoEncoderConfiguration.html#guaranteedFrameRate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"encoding\",\"url\":\"interfaces/VideoEncoderConfiguration.html#encoding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"resolution\",\"url\":\"interfaces/VideoEncoderConfiguration.html#resolution\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"quality\",\"url\":\"interfaces/VideoEncoderConfiguration.html#quality\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"rateControl\",\"url\":\"interfaces/VideoEncoderConfiguration.html#rateControl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"MPEG4\",\"url\":\"interfaces/VideoEncoderConfiguration.html#MPEG4\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"H264\",\"url\":\"interfaces/VideoEncoderConfiguration.html#H264\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"multicast\",\"url\":\"interfaces/VideoEncoderConfiguration.html#multicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":1024,\"name\":\"sessionTimeout\",\"url\":\"interfaces/VideoEncoderConfiguration.html#sessionTimeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoderConfiguration\"},{\"kind\":256,\"name\":\"AudioEncoderConfiguration\",\"url\":\"interfaces/AudioEncoderConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/AudioEncoderConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/AudioEncoderConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/AudioEncoderConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"encoding\",\"url\":\"interfaces/AudioEncoderConfiguration.html#encoding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"bitrate\",\"url\":\"interfaces/AudioEncoderConfiguration.html#bitrate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"sampleRate\",\"url\":\"interfaces/AudioEncoderConfiguration.html#sampleRate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"multicast\",\"url\":\"interfaces/AudioEncoderConfiguration.html#multicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":1024,\"name\":\"sessionTimeout\",\"url\":\"interfaces/AudioEncoderConfiguration.html#sessionTimeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoderConfiguration\"},{\"kind\":256,\"name\":\"ItemList\",\"url\":\"interfaces/ItemList.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"simpleItem\",\"url\":\"interfaces/ItemList.html#simpleItem\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ItemList\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/ItemList.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"ItemList\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/ItemList.html#__type.name\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"ItemList.__type\"},{\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/ItemList.html#__type.value\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"ItemList.__type\"},{\"kind\":1024,\"name\":\"elementItem\",\"url\":\"interfaces/ItemList.html#elementItem\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ItemList\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ItemList.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ItemList\"},{\"kind\":256,\"name\":\"Config\",\"url\":\"interfaces/Config.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/Config.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/Config.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"parameters\",\"url\":\"interfaces/Config.html#parameters\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":256,\"name\":\"AnalyticsEngineConfiguration\",\"url\":\"interfaces/AnalyticsEngineConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"analyticsModule\",\"url\":\"interfaces/AnalyticsEngineConfiguration.html#analyticsModule\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsEngineConfiguration\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/AnalyticsEngineConfiguration.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AnalyticsEngineConfiguration\"},{\"kind\":256,\"name\":\"RuleEngineConfiguration\",\"url\":\"interfaces/RuleEngineConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"rule\",\"url\":\"interfaces/RuleEngineConfiguration.html#rule\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RuleEngineConfiguration\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/RuleEngineConfiguration.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"RuleEngineConfiguration\"},{\"kind\":256,\"name\":\"VideoAnalyticsConfiguration\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoAnalyticsConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoAnalyticsConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoAnalyticsConfiguration\"},{\"kind\":1024,\"name\":\"analyticsEngineConfiguration\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html#analyticsEngineConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoAnalyticsConfiguration\"},{\"kind\":1024,\"name\":\"ruleEngineConfiguration\",\"url\":\"interfaces/VideoAnalyticsConfiguration.html#ruleEngineConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoAnalyticsConfiguration\"},{\"kind\":256,\"name\":\"PTZSpeed\",\"url\":\"interfaces/PTZSpeed.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"panTilt\",\"url\":\"interfaces/PTZSpeed.html#panTilt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZSpeed\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/PTZSpeed.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"PTZSpeed\"},{\"kind\":1024,\"name\":\"x\",\"url\":\"interfaces/PTZSpeed.html#__type.x\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PTZSpeed.__type\"},{\"kind\":1024,\"name\":\"y\",\"url\":\"interfaces/PTZSpeed.html#__type.y\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PTZSpeed.__type\"},{\"kind\":1024,\"name\":\"zoom\",\"url\":\"interfaces/PTZSpeed.html#zoom\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZSpeed\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/PTZSpeed.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"PTZSpeed\"},{\"kind\":1024,\"name\":\"x\",\"url\":\"interfaces/PTZSpeed.html#__type-1.x-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PTZSpeed.__type\"},{\"kind\":256,\"name\":\"Range\",\"url\":\"interfaces/Range.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"min\",\"url\":\"interfaces/Range.html#min\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Range\"},{\"kind\":1024,\"name\":\"max\",\"url\":\"interfaces/Range.html#max\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Range\"},{\"kind\":256,\"name\":\"Space2DDescription\",\"url\":\"interfaces/Space2DDescription.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"URI\",\"url\":\"interfaces/Space2DDescription.html#URI\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Space2DDescription\"},{\"kind\":1024,\"name\":\"XRange\",\"url\":\"interfaces/Space2DDescription.html#XRange\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Space2DDescription\"},{\"kind\":1024,\"name\":\"YRange\",\"url\":\"interfaces/Space2DDescription.html#YRange\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Space2DDescription\"},{\"kind\":256,\"name\":\"PanTiltLimits\",\"url\":\"interfaces/PanTiltLimits.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"range\",\"url\":\"interfaces/PanTiltLimits.html#range\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PanTiltLimits\"},{\"kind\":256,\"name\":\"Space1DDescription\",\"url\":\"interfaces/Space1DDescription.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"URI\",\"url\":\"interfaces/Space1DDescription.html#URI\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Space1DDescription\"},{\"kind\":1024,\"name\":\"XRange\",\"url\":\"interfaces/Space1DDescription.html#XRange\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Space1DDescription\"},{\"kind\":256,\"name\":\"ZoomLimits\",\"url\":\"interfaces/ZoomLimits.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"range\",\"url\":\"interfaces/ZoomLimits.html#range\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ZoomLimits\"},{\"kind\":256,\"name\":\"PTControlDirection\",\"url\":\"interfaces/PTControlDirection.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"EFlip\",\"url\":\"interfaces/PTControlDirection.html#EFlip\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTControlDirection\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/PTControlDirection.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"PTControlDirection\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/PTControlDirection.html#__type.mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PTControlDirection.__type\"},{\"kind\":1024,\"name\":\"reverse\",\"url\":\"interfaces/PTControlDirection.html#reverse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTControlDirection\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/PTControlDirection.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"PTControlDirection\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/PTControlDirection.html#__type-1.mode-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PTControlDirection.__type\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/PTControlDirection.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTControlDirection\"},{\"kind\":256,\"name\":\"PTZConfigurationExtension\",\"url\":\"interfaces/PTZConfigurationExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"PTControlDirection\",\"url\":\"interfaces/PTZConfigurationExtension.html#PTControlDirection\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfigurationExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/PTZConfigurationExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfigurationExtension\"},{\"kind\":256,\"name\":\"PTZConfiguration\",\"url\":\"interfaces/PTZConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/PTZConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/PTZConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/PTZConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"moveRamp\",\"url\":\"interfaces/PTZConfiguration.html#moveRamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"presetRamp\",\"url\":\"interfaces/PTZConfiguration.html#presetRamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"presetTourRamp\",\"url\":\"interfaces/PTZConfiguration.html#presetTourRamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"nodeToken\",\"url\":\"interfaces/PTZConfiguration.html#nodeToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultAbsolutePantTiltPositionSpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultAbsolutePantTiltPositionSpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultAbsoluteZoomPositionSpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultAbsoluteZoomPositionSpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultRelativePanTiltTranslationSpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultRelativePanTiltTranslationSpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultRelativeZoomTranslationSpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultRelativeZoomTranslationSpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultContinuousPanTiltVelocitySpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultContinuousPanTiltVelocitySpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultContinuousZoomVelocitySpace\",\"url\":\"interfaces/PTZConfiguration.html#defaultContinuousZoomVelocitySpace\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultPTZSpeed\",\"url\":\"interfaces/PTZConfiguration.html#defaultPTZSpeed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"defaultPTZTimeout\",\"url\":\"interfaces/PTZConfiguration.html#defaultPTZTimeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"panTiltLimits\",\"url\":\"interfaces/PTZConfiguration.html#panTiltLimits\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"zoomLimits\",\"url\":\"interfaces/PTZConfiguration.html#zoomLimits\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/PTZConfiguration.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZConfiguration\"},{\"kind\":256,\"name\":\"PTZFilter\",\"url\":\"interfaces/PTZFilter.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"status\",\"url\":\"interfaces/PTZFilter.html#status\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZFilter\"},{\"kind\":1024,\"name\":\"position\",\"url\":\"interfaces/PTZFilter.html#position\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PTZFilter\"},{\"kind\":256,\"name\":\"EventSubscription\",\"url\":\"interfaces/EventSubscription.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"filter\",\"url\":\"interfaces/EventSubscription.html#filter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventSubscription\"},{\"kind\":1024,\"name\":\"subscriptionPolicy\",\"url\":\"interfaces/EventSubscription.html#subscriptionPolicy\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"EventSubscription\"},{\"kind\":256,\"name\":\"MetadataConfiguration\",\"url\":\"interfaces/MetadataConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/MetadataConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/MetadataConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/MetadataConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"compressionType\",\"url\":\"interfaces/MetadataConfiguration.html#compressionType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"geoLocation\",\"url\":\"interfaces/MetadataConfiguration.html#geoLocation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"shapePolygon\",\"url\":\"interfaces/MetadataConfiguration.html#shapePolygon\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"PTZStatus\",\"url\":\"interfaces/MetadataConfiguration.html#PTZStatus\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"events\",\"url\":\"interfaces/MetadataConfiguration.html#events\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"analytics\",\"url\":\"interfaces/MetadataConfiguration.html#analytics\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"multicast\",\"url\":\"interfaces/MetadataConfiguration.html#multicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"sessionTimeout\",\"url\":\"interfaces/MetadataConfiguration.html#sessionTimeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"analyticsEngineConfiguration\",\"url\":\"interfaces/MetadataConfiguration.html#analyticsEngineConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/MetadataConfiguration.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MetadataConfiguration\"},{\"kind\":256,\"name\":\"AudioOutputConfiguration\",\"url\":\"interfaces/AudioOutputConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/AudioOutputConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/AudioOutputConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/AudioOutputConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":1024,\"name\":\"outputToken\",\"url\":\"interfaces/AudioOutputConfiguration.html#outputToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":1024,\"name\":\"sendPrimacy\",\"url\":\"interfaces/AudioOutputConfiguration.html#sendPrimacy\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":1024,\"name\":\"outputLevel\",\"url\":\"interfaces/AudioOutputConfiguration.html#outputLevel\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioOutputConfiguration\"},{\"kind\":256,\"name\":\"AudioDecoderConfiguration\",\"url\":\"interfaces/AudioDecoderConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/AudioDecoderConfiguration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioDecoderConfiguration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/AudioDecoderConfiguration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioDecoderConfiguration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/AudioDecoderConfiguration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioDecoderConfiguration\"},{\"kind\":256,\"name\":\"ProfileExtension\",\"url\":\"interfaces/ProfileExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"audioOutputConfiguration\",\"url\":\"interfaces/ProfileExtension.html#audioOutputConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ProfileExtension\"},{\"kind\":1024,\"name\":\"audioDecoderConfiguration\",\"url\":\"interfaces/ProfileExtension.html#audioDecoderConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ProfileExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ProfileExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ProfileExtension\"},{\"kind\":256,\"name\":\"Profile\",\"url\":\"interfaces/Profile.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/Profile.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"fixed\",\"url\":\"interfaces/Profile.html#fixed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/Profile.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"videoSourceConfiguration\",\"url\":\"interfaces/Profile.html#videoSourceConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"audioSourceConfiguration\",\"url\":\"interfaces/Profile.html#audioSourceConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"videoEncoderConfiguration\",\"url\":\"interfaces/Profile.html#videoEncoderConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"audioEncoderConfiguration\",\"url\":\"interfaces/Profile.html#audioEncoderConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"videoAnalyticsConfiguration\",\"url\":\"interfaces/Profile.html#videoAnalyticsConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"PTZConfiguration\",\"url\":\"interfaces/Profile.html#PTZConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"metadataConfiguration\",\"url\":\"interfaces/Profile.html#metadataConfiguration\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/Profile.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Profile\"},{\"kind\":256,\"name\":\"VideoRateControl2\",\"url\":\"interfaces/VideoRateControl2.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"constantBitRate\",\"url\":\"interfaces/VideoRateControl2.html#constantBitRate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl2\"},{\"kind\":1024,\"name\":\"frameRateLimit\",\"url\":\"interfaces/VideoRateControl2.html#frameRateLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl2\"},{\"kind\":1024,\"name\":\"bitrateLimit\",\"url\":\"interfaces/VideoRateControl2.html#bitrateLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoRateControl2\"},{\"kind\":256,\"name\":\"VideoEncoder2Configuration\",\"url\":\"interfaces/VideoEncoder2Configuration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/VideoEncoder2Configuration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/VideoEncoder2Configuration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/VideoEncoder2Configuration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"govLength\",\"url\":\"interfaces/VideoEncoder2Configuration.html#govLength\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"profile\",\"url\":\"interfaces/VideoEncoder2Configuration.html#profile\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"guaranteedFrameRate\",\"url\":\"interfaces/VideoEncoder2Configuration.html#guaranteedFrameRate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"encoding\",\"url\":\"interfaces/VideoEncoder2Configuration.html#encoding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"resolution\",\"url\":\"interfaces/VideoEncoder2Configuration.html#resolution\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"rateControl\",\"url\":\"interfaces/VideoEncoder2Configuration.html#rateControl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"mutlicast\",\"url\":\"interfaces/VideoEncoder2Configuration.html#mutlicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":1024,\"name\":\"quality\",\"url\":\"interfaces/VideoEncoder2Configuration.html#quality\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoEncoder2Configuration\"},{\"kind\":256,\"name\":\"AudioEncoder2Configuration\",\"url\":\"interfaces/AudioEncoder2Configuration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/AudioEncoder2Configuration.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/AudioEncoder2Configuration.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"useCount\",\"url\":\"interfaces/AudioEncoder2Configuration.html#useCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"encoding\",\"url\":\"interfaces/AudioEncoder2Configuration.html#encoding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"multicast\",\"url\":\"interfaces/AudioEncoder2Configuration.html#multicast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"bitrate\",\"url\":\"interfaces/AudioEncoder2Configuration.html#bitrate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":1024,\"name\":\"sampleRate\",\"url\":\"interfaces/AudioEncoder2Configuration.html#sampleRate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"AudioEncoder2Configuration\"},{\"kind\":256,\"name\":\"ConfigurationSet\",\"url\":\"interfaces/ConfigurationSet.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"videoSource\",\"url\":\"interfaces/ConfigurationSet.html#videoSource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"audioSource\",\"url\":\"interfaces/ConfigurationSet.html#audioSource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"videoEncoder\",\"url\":\"interfaces/ConfigurationSet.html#videoEncoder\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"audioEncoder\",\"url\":\"interfaces/ConfigurationSet.html#audioEncoder\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"analytics\",\"url\":\"interfaces/ConfigurationSet.html#analytics\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"PTZ\",\"url\":\"interfaces/ConfigurationSet.html#PTZ\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"metadata\",\"url\":\"interfaces/ConfigurationSet.html#metadata\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"audioOutput\",\"url\":\"interfaces/ConfigurationSet.html#audioOutput\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"audioDecoder\",\"url\":\"interfaces/ConfigurationSet.html#audioDecoder\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":1024,\"name\":\"receiver\",\"url\":\"interfaces/ConfigurationSet.html#receiver\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ConfigurationSet\"},{\"kind\":256,\"name\":\"MediaProfile\",\"url\":\"interfaces/MediaProfile.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/MediaProfile.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaProfile\"},{\"kind\":1024,\"name\":\"fixed\",\"url\":\"interfaces/MediaProfile.html#fixed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaProfile\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/MediaProfile.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaProfile\"},{\"kind\":1024,\"name\":\"configurations\",\"url\":\"interfaces/MediaProfile.html#configurations\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"MediaProfile\"},{\"kind\":256,\"name\":\"BacklightCompensation\",\"url\":\"interfaces/BacklightCompensation.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/BacklightCompensation.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BacklightCompensation\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/BacklightCompensation.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BacklightCompensation\"},{\"kind\":256,\"name\":\"Rectangle\",\"url\":\"interfaces/Rectangle.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"x\",\"url\":\"interfaces/Rectangle.html#x\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rectangle\"},{\"kind\":1024,\"name\":\"y\",\"url\":\"interfaces/Rectangle.html#y\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rectangle\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/Rectangle.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rectangle\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/Rectangle.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Rectangle\"},{\"kind\":256,\"name\":\"Exposure\",\"url\":\"interfaces/Exposure.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/Exposure.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"priority\",\"url\":\"interfaces/Exposure.html#priority\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"window\",\"url\":\"interfaces/Exposure.html#window\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"minExposureTime\",\"url\":\"interfaces/Exposure.html#minExposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"maxExposureTime\",\"url\":\"interfaces/Exposure.html#maxExposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"minGain\",\"url\":\"interfaces/Exposure.html#minGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"maxGain\",\"url\":\"interfaces/Exposure.html#maxGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"minIris\",\"url\":\"interfaces/Exposure.html#minIris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"maxIris\",\"url\":\"interfaces/Exposure.html#maxIris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"exposureTime\",\"url\":\"interfaces/Exposure.html#exposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"gain\",\"url\":\"interfaces/Exposure.html#gain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":1024,\"name\":\"iris\",\"url\":\"interfaces/Exposure.html#iris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure\"},{\"kind\":256,\"name\":\"FocusConfiguration\",\"url\":\"interfaces/FocusConfiguration.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"autoFocusMode\",\"url\":\"interfaces/FocusConfiguration.html#autoFocusMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration\"},{\"kind\":1024,\"name\":\"defaultSpeed\",\"url\":\"interfaces/FocusConfiguration.html#defaultSpeed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration\"},{\"kind\":1024,\"name\":\"nearLimit\",\"url\":\"interfaces/FocusConfiguration.html#nearLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration\"},{\"kind\":1024,\"name\":\"farLimit\",\"url\":\"interfaces/FocusConfiguration.html#farLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration\"},{\"kind\":256,\"name\":\"WideDynamicRange\",\"url\":\"interfaces/WideDynamicRange.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/WideDynamicRange.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WideDynamicRange\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/WideDynamicRange.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WideDynamicRange\"},{\"kind\":256,\"name\":\"WhiteBalance\",\"url\":\"interfaces/WhiteBalance.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/WhiteBalance.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WhiteBalance\"},{\"kind\":1024,\"name\":\"crGain\",\"url\":\"interfaces/WhiteBalance.html#crGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WhiteBalance\"},{\"kind\":1024,\"name\":\"cbGain\",\"url\":\"interfaces/WhiteBalance.html#cbGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WhiteBalance\"},{\"kind\":256,\"name\":\"ImagingSettings\",\"url\":\"interfaces/ImagingSettings.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"backlightCompensation\",\"url\":\"interfaces/ImagingSettings.html#backlightCompensation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"brightness\",\"url\":\"interfaces/ImagingSettings.html#brightness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"colorSaturation\",\"url\":\"interfaces/ImagingSettings.html#colorSaturation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"contrast\",\"url\":\"interfaces/ImagingSettings.html#contrast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"exposure\",\"url\":\"interfaces/ImagingSettings.html#exposure\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"focus\",\"url\":\"interfaces/ImagingSettings.html#focus\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"irCutFilter\",\"url\":\"interfaces/ImagingSettings.html#irCutFilter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"sharpness\",\"url\":\"interfaces/ImagingSettings.html#sharpness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"wideDynamicRange\",\"url\":\"interfaces/ImagingSettings.html#wideDynamicRange\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"whiteBalance\",\"url\":\"interfaces/ImagingSettings.html#whiteBalance\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImagingSettings.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings\"},{\"kind\":256,\"name\":\"BacklightCompensation20\",\"url\":\"interfaces/BacklightCompensation20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/BacklightCompensation20.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BacklightCompensation20\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/BacklightCompensation20.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BacklightCompensation20\"},{\"kind\":256,\"name\":\"Exposure20\",\"url\":\"interfaces/Exposure20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/Exposure20.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"priority\",\"url\":\"interfaces/Exposure20.html#priority\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"window\",\"url\":\"interfaces/Exposure20.html#window\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"minExposureTime\",\"url\":\"interfaces/Exposure20.html#minExposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"maxExposureTime\",\"url\":\"interfaces/Exposure20.html#maxExposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"minGain\",\"url\":\"interfaces/Exposure20.html#minGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"maxGain\",\"url\":\"interfaces/Exposure20.html#maxGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"minIris\",\"url\":\"interfaces/Exposure20.html#minIris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"maxIris\",\"url\":\"interfaces/Exposure20.html#maxIris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"exposureTime\",\"url\":\"interfaces/Exposure20.html#exposureTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"gain\",\"url\":\"interfaces/Exposure20.html#gain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":1024,\"name\":\"iris\",\"url\":\"interfaces/Exposure20.html#iris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Exposure20\"},{\"kind\":256,\"name\":\"FocusConfiguration20\",\"url\":\"interfaces/FocusConfiguration20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"AFMode\",\"url\":\"interfaces/FocusConfiguration20.html#AFMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":1024,\"name\":\"autoFocusMode\",\"url\":\"interfaces/FocusConfiguration20.html#autoFocusMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":1024,\"name\":\"defaultSpeed\",\"url\":\"interfaces/FocusConfiguration20.html#defaultSpeed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":1024,\"name\":\"nearLimit\",\"url\":\"interfaces/FocusConfiguration20.html#nearLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":1024,\"name\":\"farLimit\",\"url\":\"interfaces/FocusConfiguration20.html#farLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/FocusConfiguration20.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FocusConfiguration20\"},{\"kind\":256,\"name\":\"WideDynamicRange20\",\"url\":\"interfaces/WideDynamicRange20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/WideDynamicRange20.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WideDynamicRange20\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/WideDynamicRange20.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WideDynamicRange20\"},{\"kind\":256,\"name\":\"WhiteBalance20\",\"url\":\"interfaces/WhiteBalance20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/WhiteBalance20.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WhiteBalance20\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/WhiteBalance20.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"WhiteBalance20\"},{\"kind\":1024,\"name\":\"crGain\",\"url\":\"interfaces/WhiteBalance20.html#crGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"WhiteBalance20\"},{\"kind\":1024,\"name\":\"cbGain\",\"url\":\"interfaces/WhiteBalance20.html#cbGain\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"WhiteBalance20\"},{\"kind\":256,\"name\":\"ImageStabilization\",\"url\":\"interfaces/ImageStabilization.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/ImageStabilization.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImageStabilization\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/ImageStabilization.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImageStabilization\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImageStabilization.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImageStabilization\"},{\"kind\":256,\"name\":\"IrCutFilterAutoAdjustment\",\"url\":\"interfaces/IrCutFilterAutoAdjustment.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"boundaryType\",\"url\":\"interfaces/IrCutFilterAutoAdjustment.html#boundaryType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IrCutFilterAutoAdjustment\"},{\"kind\":1024,\"name\":\"boundaryOffset\",\"url\":\"interfaces/IrCutFilterAutoAdjustment.html#boundaryOffset\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IrCutFilterAutoAdjustment\"},{\"kind\":1024,\"name\":\"responseTime\",\"url\":\"interfaces/IrCutFilterAutoAdjustment.html#responseTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IrCutFilterAutoAdjustment\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/IrCutFilterAutoAdjustment.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IrCutFilterAutoAdjustment\"},{\"kind\":256,\"name\":\"ToneCompensation\",\"url\":\"interfaces/ToneCompensation.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/ToneCompensation.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ToneCompensation\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/ToneCompensation.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ToneCompensation\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ToneCompensation.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ToneCompensation\"},{\"kind\":256,\"name\":\"Defogging\",\"url\":\"interfaces/Defogging.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/Defogging.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Defogging\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/Defogging.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Defogging\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/Defogging.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Defogging\"},{\"kind\":256,\"name\":\"NoiseReduction\",\"url\":\"interfaces/NoiseReduction.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"level\",\"url\":\"interfaces/NoiseReduction.html#level\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"NoiseReduction\"},{\"kind\":256,\"name\":\"ImagingSettingsExtension203\",\"url\":\"interfaces/ImagingSettingsExtension203.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"toneCompensation\",\"url\":\"interfaces/ImagingSettingsExtension203.html#toneCompensation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension203\"},{\"kind\":1024,\"name\":\"defogging\",\"url\":\"interfaces/ImagingSettingsExtension203.html#defogging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension203\"},{\"kind\":1024,\"name\":\"noiseReduction\",\"url\":\"interfaces/ImagingSettingsExtension203.html#noiseReduction\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension203\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImagingSettingsExtension203.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension203\"},{\"kind\":256,\"name\":\"ImagingSettingsExtension202\",\"url\":\"interfaces/ImagingSettingsExtension202.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"irCutFilterAutoAdjustment\",\"url\":\"interfaces/ImagingSettingsExtension202.html#irCutFilterAutoAdjustment\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension202\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImagingSettingsExtension202.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension202\"},{\"kind\":256,\"name\":\"ImagingSettingsExtension20\",\"url\":\"interfaces/ImagingSettingsExtension20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"imageStabilization\",\"url\":\"interfaces/ImagingSettingsExtension20.html#imageStabilization\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension20\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImagingSettingsExtension20.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettingsExtension20\"},{\"kind\":256,\"name\":\"ImagingSettings20\",\"url\":\"interfaces/ImagingSettings20.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"backlightCompensation\",\"url\":\"interfaces/ImagingSettings20.html#backlightCompensation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"brightness\",\"url\":\"interfaces/ImagingSettings20.html#brightness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"colorSaturation\",\"url\":\"interfaces/ImagingSettings20.html#colorSaturation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"contrast\",\"url\":\"interfaces/ImagingSettings20.html#contrast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"exposure\",\"url\":\"interfaces/ImagingSettings20.html#exposure\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"focus\",\"url\":\"interfaces/ImagingSettings20.html#focus\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"irCutFilter\",\"url\":\"interfaces/ImagingSettings20.html#irCutFilter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"sharpness\",\"url\":\"interfaces/ImagingSettings20.html#sharpness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"wideDynamicRange\",\"url\":\"interfaces/ImagingSettings20.html#wideDynamicRange\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"whiteBalance\",\"url\":\"interfaces/ImagingSettings20.html#whiteBalance\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/ImagingSettings20.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ImagingSettings20\"},{\"kind\":256,\"name\":\"VideoSourceExtension\",\"url\":\"interfaces/VideoSourceExtension.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"imaging\",\"url\":\"interfaces/VideoSourceExtension.html#imaging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceExtension\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/VideoSourceExtension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSourceExtension\"},{\"kind\":256,\"name\":\"VideoSource\",\"url\":\"interfaces/VideoSource.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"token\",\"url\":\"interfaces/VideoSource.html#token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSource\"},{\"kind\":1024,\"name\":\"framerate\",\"url\":\"interfaces/VideoSource.html#framerate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSource\"},{\"kind\":1024,\"name\":\"resolution\",\"url\":\"interfaces/VideoSource.html#resolution\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSource\"},{\"kind\":1024,\"name\":\"imaging\",\"url\":\"interfaces/VideoSource.html#imaging\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSource\"},{\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/VideoSource.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"VideoSource\"},{\"kind\":128,\"name\":\"Media\",\"url\":\"classes/Media.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Media.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Media\"},{\"kind\":1024,\"name\":\"onvif\",\"url\":\"classes/Media.html#onvif\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Media\"},{\"kind\":1024,\"name\":\"profiles\",\"url\":\"classes/Media.html#profiles\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Media\"},{\"kind\":1024,\"name\":\"videoSources\",\"url\":\"classes/Media.html#videoSources\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Media\"},{\"kind\":2048,\"name\":\"getProfiles\",\"url\":\"classes/Media.html#getProfiles\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Media\"},{\"kind\":2048,\"name\":\"getVideoSources\",\"url\":\"classes/Media.html#getVideoSources\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Media\"},{\"kind\":256,\"name\":\"DiscoveryOptions\",\"url\":\"interfaces/DiscoveryOptions.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"timeout\",\"url\":\"interfaces/DiscoveryOptions.html#timeout\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":1024,\"name\":\"resolve\",\"url\":\"interfaces/DiscoveryOptions.html#resolve\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":1024,\"name\":\"messageId\",\"url\":\"interfaces/DiscoveryOptions.html#messageId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":1024,\"name\":\"device\",\"url\":\"interfaces/DiscoveryOptions.html#device\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":1024,\"name\":\"listeningPort\",\"url\":\"interfaces/DiscoveryOptions.html#listeningPort\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/DiscoveryOptions.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DiscoveryOptions\"},{\"kind\":128,\"name\":\"DiscoverySingleton\",\"url\":\"classes/DiscoverySingleton.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":1024,\"name\":\"device\",\"url\":\"classes/DiscoverySingleton.html#device\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"DiscoverySingleton\"},{\"kind\":1024,\"name\":\"error\",\"url\":\"classes/DiscoverySingleton.html#error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"DiscoverySingleton\"},{\"kind\":1024,\"name\":\"instance\",\"url\":\"classes/DiscoverySingleton.html#instance\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"DiscoverySingleton\"},{\"kind\":262144,\"name\":\"getInstance\",\"url\":\"classes/DiscoverySingleton.html#getInstance\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"DiscoverySingleton\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/DiscoverySingleton.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-is-private\",\"parent\":\"DiscoverySingleton\"},{\"kind\":2048,\"name\":\"probe\",\"url\":\"classes/DiscoverySingleton.html#probe\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"DiscoverySingleton\"},{\"kind\":32,\"name\":\"Discovery\",\"url\":\"variables/Discovery.html\",\"classes\":\"tsd-kind-variable\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"comment\"],\"fieldVectors\":[[\"name/0\",[0,60.776]],[\"comment/0\",[]],[\"name/1\",[1,55.668]],[\"comment/1\",[]],[\"name/2\",[2,55.668]],[\"comment/2\",[]],[\"name/3\",[3,55.668]],[\"comment/3\",[]],[\"name/4\",[4,55.668]],[\"comment/4\",[]],[\"name/5\",[5,55.668]],[\"comment/5\",[]],[\"name/6\",[6,52.303]],[\"comment/6\",[]],[\"name/7\",[7,55.668]],[\"comment/7\",[]],[\"name/8\",[8,52.303]],[\"comment/8\",[]],[\"name/9\",[9,55.668]],[\"comment/9\",[]],[\"name/10\",[10,55.668]],[\"comment/10\",[]],[\"name/11\",[11,55.668]],[\"comment/11\",[]],[\"name/12\",[12,60.776]],[\"comment/12\",[]],[\"name/13\",[13,60.776]],[\"comment/13\",[]],[\"name/14\",[14,47.784]],[\"comment/14\",[]],[\"name/15\",[15,55.668]],[\"comment/15\",[]],[\"name/16\",[16,46.113]],[\"comment/16\",[]],[\"name/17\",[17,55.668]],[\"comment/17\",[]],[\"name/18\",[18,55.668]],[\"comment/18\",[]],[\"name/19\",[19,49.79]],[\"comment/19\",[]],[\"name/20\",[20,49.79]],[\"comment/20\",[]],[\"name/21\",[21,60.776]],[\"comment/21\",[]],[\"name/22\",[22,49.79]],[\"comment/22\",[]],[\"name/23\",[23,52.303]],[\"comment/23\",[]],[\"name/24\",[24,55.668]],[\"comment/24\",[]],[\"name/25\",[25,55.668]],[\"comment/25\",[]],[\"name/26\",[26,55.668]],[\"comment/26\",[]],[\"name/27\",[27,60.776]],[\"comment/27\",[]],[\"name/28\",[28,60.776]],[\"comment/28\",[]],[\"name/29\",[29,60.776]],[\"comment/29\",[]],[\"name/30\",[30,60.776]],[\"comment/30\",[]],[\"name/31\",[14,47.784]],[\"comment/31\",[]],[\"name/32\",[31,42.318]],[\"comment/32\",[]],[\"name/33\",[32,55.668]],[\"comment/33\",[]],[\"name/34\",[33,52.303]],[\"comment/34\",[]],[\"name/35\",[34,60.776]],[\"comment/35\",[]],[\"name/36\",[35,60.776]],[\"comment/36\",[]],[\"name/37\",[36,47.784]],[\"comment/37\",[]],[\"name/38\",[37,49.79]],[\"comment/38\",[]],[\"name/39\",[38,49.79]],[\"comment/39\",[]],[\"name/40\",[39,60.776]],[\"comment/40\",[]],[\"name/41\",[40,52.303]],[\"comment/41\",[]],[\"name/42\",[14,47.784]],[\"comment/42\",[]],[\"name/43\",[31,42.318]],[\"comment/43\",[]],[\"name/44\",[41,36.209]],[\"comment/44\",[]],[\"name/45\",[42,37.423]],[\"comment/45\",[]],[\"name/46\",[43,52.303]],[\"comment/46\",[]],[\"name/47\",[44,55.668]],[\"comment/47\",[]],[\"name/48\",[45,60.776]],[\"comment/48\",[]],[\"name/49\",[46,60.776]],[\"comment/49\",[]],[\"name/50\",[47,55.668]],[\"comment/50\",[]],[\"name/51\",[48,49.79]],[\"comment/51\",[]],[\"name/52\",[16,46.113]],[\"comment/52\",[]],[\"name/53\",[22,49.79]],[\"comment/53\",[]],[\"name/54\",[1,55.668]],[\"comment/54\",[]],[\"name/55\",[2,55.668]],[\"comment/55\",[]],[\"name/56\",[3,55.668]],[\"comment/56\",[]],[\"name/57\",[4,55.668]],[\"comment/57\",[]],[\"name/58\",[5,55.668]],[\"comment/58\",[]],[\"name/59\",[6,52.303]],[\"comment/59\",[]],[\"name/60\",[7,55.668]],[\"comment/60\",[]],[\"name/61\",[8,52.303]],[\"comment/61\",[]],[\"name/62\",[10,55.668]],[\"comment/62\",[]],[\"name/63\",[11,55.668]],[\"comment/63\",[]],[\"name/64\",[19,49.79]],[\"comment/64\",[]],[\"name/65\",[49,52.303]],[\"comment/65\",[]],[\"name/66\",[50,60.776]],[\"comment/66\",[]],[\"name/67\",[51,55.668]],[\"comment/67\",[]],[\"name/68\",[52,60.776]],[\"comment/68\",[]],[\"name/69\",[53,60.776]],[\"comment/69\",[]],[\"name/70\",[54,60.776]],[\"comment/70\",[]],[\"name/71\",[32,55.668]],[\"comment/71\",[]],[\"name/72\",[9,55.668]],[\"comment/72\",[]],[\"name/73\",[55,55.668]],[\"comment/73\",[]],[\"name/74\",[56,60.776]],[\"comment/74\",[]],[\"name/75\",[57,60.776]],[\"comment/75\",[]],[\"name/76\",[58,60.776]],[\"comment/76\",[]],[\"name/77\",[31,42.318]],[\"comment/77\",[]],[\"name/78\",[59,60.776]],[\"comment/78\",[]],[\"name/79\",[60,60.776]],[\"comment/79\",[]],[\"name/80\",[61,60.776]],[\"comment/80\",[]],[\"name/81\",[62,60.776]],[\"comment/81\",[]],[\"name/82\",[44,55.668]],[\"comment/82\",[]],[\"name/83\",[63,60.776]],[\"comment/83\",[]],[\"name/84\",[64,60.776]],[\"comment/84\",[]],[\"name/85\",[65,55.668]],[\"comment/85\",[]],[\"name/86\",[66,60.776]],[\"comment/86\",[]],[\"name/87\",[67,60.776]],[\"comment/87\",[]],[\"name/88\",[68,60.776]],[\"comment/88\",[]],[\"name/89\",[69,60.776]],[\"comment/89\",[]],[\"name/90\",[70,37.423]],[\"comment/90\",[]],[\"name/91\",[71,55.668]],[\"comment/91\",[]],[\"name/92\",[72,55.668]],[\"comment/92\",[]],[\"name/93\",[73,60.776]],[\"comment/93\",[]],[\"name/94\",[72,55.668]],[\"comment/94\",[]],[\"name/95\",[71,55.668]],[\"comment/95\",[]],[\"name/96\",[74,60.776]],[\"comment/96\",[]],[\"name/97\",[75,60.776]],[\"comment/97\",[]],[\"name/98\",[76,28.858]],[\"comment/98\",[]],[\"name/99\",[77,60.776]],[\"comment/99\",[]],[\"name/100\",[78,60.776]],[\"comment/100\",[]],[\"name/101\",[79,60.776]],[\"comment/101\",[]],[\"name/102\",[80,60.776]],[\"comment/102\",[]],[\"name/103\",[81,60.776]],[\"comment/103\",[]],[\"name/104\",[76,28.858]],[\"comment/104\",[]],[\"name/105\",[82,60.776]],[\"comment/105\",[]],[\"name/106\",[83,55.668]],[\"comment/106\",[]],[\"name/107\",[84,55.668]],[\"comment/107\",[]],[\"name/108\",[85,55.668]],[\"comment/108\",[]],[\"name/109\",[86,60.776]],[\"comment/109\",[]],[\"name/110\",[76,28.858]],[\"comment/110\",[]],[\"name/111\",[87,60.776]],[\"comment/111\",[]],[\"name/112\",[88,60.776]],[\"comment/112\",[]],[\"name/113\",[89,60.776]],[\"comment/113\",[]],[\"name/114\",[90,60.776]],[\"comment/114\",[]],[\"name/115\",[91,60.776]],[\"comment/115\",[]],[\"name/116\",[92,60.776]],[\"comment/116\",[]],[\"name/117\",[93,60.776]],[\"comment/117\",[]],[\"name/118\",[83,55.668]],[\"comment/118\",[]],[\"name/119\",[84,55.668]],[\"comment/119\",[]],[\"name/120\",[85,55.668]],[\"comment/120\",[]],[\"name/121\",[94,60.776]],[\"comment/121\",[]],[\"name/122\",[95,52.303]],[\"comment/122\",[]],[\"name/123\",[96,60.776]],[\"comment/123\",[]],[\"name/124\",[97,60.776]],[\"comment/124\",[]],[\"name/125\",[98,60.776]],[\"comment/125\",[]],[\"name/126\",[76,28.858]],[\"comment/126\",[]],[\"name/127\",[99,60.776]],[\"comment/127\",[]],[\"name/128\",[100,60.776]],[\"comment/128\",[]],[\"name/129\",[101,55.668]],[\"comment/129\",[]],[\"name/130\",[76,28.858]],[\"comment/130\",[]],[\"name/131\",[102,60.776]],[\"comment/131\",[]],[\"name/132\",[103,60.776]],[\"comment/132\",[]],[\"name/133\",[104,60.776]],[\"comment/133\",[]],[\"name/134\",[105,60.776]],[\"comment/134\",[]],[\"name/135\",[106,60.776]],[\"comment/135\",[]],[\"name/136\",[107,60.776]],[\"comment/136\",[]],[\"name/137\",[76,28.858]],[\"comment/137\",[]],[\"name/138\",[108,60.776]],[\"comment/138\",[]],[\"name/139\",[109,60.776]],[\"comment/139\",[]],[\"name/140\",[110,60.776]],[\"comment/140\",[]],[\"name/141\",[111,60.776]],[\"comment/141\",[]],[\"name/142\",[112,60.776]],[\"comment/142\",[]],[\"name/143\",[113,60.776]],[\"comment/143\",[]],[\"name/144\",[114,60.776]],[\"comment/144\",[]],[\"name/145\",[115,60.776]],[\"comment/145\",[]],[\"name/146\",[116,60.776]],[\"comment/146\",[]],[\"name/147\",[76,28.858]],[\"comment/147\",[]],[\"name/148\",[117,60.776]],[\"comment/148\",[]],[\"name/149\",[70,37.423]],[\"comment/149\",[]],[\"name/150\",[118,60.776]],[\"comment/150\",[]],[\"name/151\",[119,60.776]],[\"comment/151\",[]],[\"name/152\",[120,60.776]],[\"comment/152\",[]],[\"name/153\",[121,60.776]],[\"comment/153\",[]],[\"name/154\",[70,37.423]],[\"comment/154\",[]],[\"name/155\",[122,60.776]],[\"comment/155\",[]],[\"name/156\",[123,60.776]],[\"comment/156\",[]],[\"name/157\",[124,55.668]],[\"comment/157\",[]],[\"name/158\",[125,55.668]],[\"comment/158\",[]],[\"name/159\",[76,28.858]],[\"comment/159\",[]],[\"name/160\",[126,55.668]],[\"comment/160\",[]],[\"name/161\",[127,60.776]],[\"comment/161\",[]],[\"name/162\",[128,60.776]],[\"comment/162\",[]],[\"name/163\",[126,55.668]],[\"comment/163\",[]],[\"name/164\",[129,60.776]],[\"comment/164\",[]],[\"name/165\",[70,37.423]],[\"comment/165\",[]],[\"name/166\",[130,60.776]],[\"comment/166\",[]],[\"name/167\",[76,28.858]],[\"comment/167\",[]],[\"name/168\",[131,60.776]],[\"comment/168\",[]],[\"name/169\",[70,37.423]],[\"comment/169\",[]],[\"name/170\",[132,60.776]],[\"comment/170\",[]],[\"name/171\",[70,37.423]],[\"comment/171\",[]],[\"name/172\",[133,55.668]],[\"comment/172\",[]],[\"name/173\",[134,60.776]],[\"comment/173\",[]],[\"name/174\",[135,60.776]],[\"comment/174\",[]],[\"name/175\",[136,60.776]],[\"comment/175\",[]],[\"name/176\",[101,55.668]],[\"comment/176\",[]],[\"name/177\",[95,52.303]],[\"comment/177\",[]],[\"name/178\",[31,42.318]],[\"comment/178\",[]],[\"name/179\",[137,60.776]],[\"comment/179\",[]],[\"name/180\",[138,60.776]],[\"comment/180\",[]],[\"name/181\",[139,60.776]],[\"comment/181\",[]],[\"name/182\",[70,37.423]],[\"comment/182\",[]],[\"name/183\",[140,60.776]],[\"comment/183\",[]],[\"name/184\",[141,60.776]],[\"comment/184\",[]],[\"name/185\",[70,37.423]],[\"comment/185\",[]],[\"name/186\",[142,60.776]],[\"comment/186\",[]],[\"name/187\",[143,60.776]],[\"comment/187\",[]],[\"name/188\",[144,60.776]],[\"comment/188\",[]],[\"name/189\",[145,60.776]],[\"comment/189\",[]],[\"name/190\",[146,60.776]],[\"comment/190\",[]],[\"name/191\",[147,60.776]],[\"comment/191\",[]],[\"name/192\",[70,37.423]],[\"comment/192\",[]],[\"name/193\",[148,60.776]],[\"comment/193\",[]],[\"name/194\",[149,60.776]],[\"comment/194\",[]],[\"name/195\",[70,37.423]],[\"comment/195\",[]],[\"name/196\",[150,60.776]],[\"comment/196\",[]],[\"name/197\",[70,37.423]],[\"comment/197\",[]],[\"name/198\",[151,60.776]],[\"comment/198\",[]],[\"name/199\",[124,55.668]],[\"comment/199\",[]],[\"name/200\",[125,55.668]],[\"comment/200\",[]],[\"name/201\",[152,60.776]],[\"comment/201\",[]],[\"name/202\",[153,60.776]],[\"comment/202\",[]],[\"name/203\",[154,60.776]],[\"comment/203\",[]],[\"name/204\",[70,37.423]],[\"comment/204\",[]],[\"name/205\",[155,55.668]],[\"comment/205\",[]],[\"name/206\",[76,28.858]],[\"comment/206\",[]],[\"name/207\",[156,60.776]],[\"comment/207\",[]],[\"name/208\",[70,37.423]],[\"comment/208\",[]],[\"name/209\",[17,55.668]],[\"comment/209\",[]],[\"name/210\",[18,55.668]],[\"comment/210\",[]],[\"name/211\",[24,55.668]],[\"comment/211\",[]],[\"name/212\",[26,55.668]],[\"comment/212\",[]],[\"name/213\",[25,55.668]],[\"comment/213\",[]],[\"name/214\",[23,52.303]],[\"comment/214\",[]],[\"name/215\",[15,55.668]],[\"comment/215\",[]],[\"name/216\",[157,60.776]],[\"comment/216\",[]],[\"name/217\",[70,37.423]],[\"comment/217\",[]],[\"name/218\",[158,60.776]],[\"comment/218\",[]],[\"name/219\",[159,60.776]],[\"comment/219\",[]],[\"name/220\",[160,60.776]],[\"comment/220\",[]],[\"name/221\",[161,60.776]],[\"comment/221\",[]],[\"name/222\",[95,52.303]],[\"comment/222\",[]],[\"name/223\",[162,60.776]],[\"comment/223\",[]],[\"name/224\",[70,37.423]],[\"comment/224\",[]],[\"name/225\",[155,55.668]],[\"comment/225\",[]],[\"name/226\",[163,60.776]],[\"comment/226\",[]],[\"name/227\",[51,55.668]],[\"comment/227\",[]],[\"name/228\",[164,52.303]],[\"comment/228\",[]],[\"name/229\",[16,46.113]],[\"comment/229\",[]],[\"name/230\",[19,49.79]],[\"comment/230\",[]],[\"name/231\",[20,49.79]],[\"comment/231\",[]],[\"name/232\",[22,49.79]],[\"comment/232\",[]],[\"name/233\",[14,47.784]],[\"comment/233\",[]],[\"name/234\",[76,28.858]],[\"comment/234\",[]],[\"name/235\",[16,46.113]],[\"comment/235\",[]],[\"name/236\",[48,49.79]],[\"comment/236\",[]],[\"name/237\",[43,52.303]],[\"comment/237\",[]],[\"name/238\",[165,60.776]],[\"comment/238\",[]],[\"name/239\",[166,60.776]],[\"comment/239\",[]],[\"name/240\",[65,55.668]],[\"comment/240\",[]],[\"name/241\",[167,60.776]],[\"comment/241\",[]],[\"name/242\",[168,60.776]],[\"comment/242\",[]],[\"name/243\",[169,60.776]],[\"comment/243\",[]],[\"name/244\",[170,60.776]],[\"comment/244\",[]],[\"name/245\",[55,55.668]],[\"comment/245\",[]],[\"name/246\",[171,60.776]],[\"comment/246\",[]],[\"name/247\",[172,60.776]],[\"comment/247\",[]],[\"name/248\",[173,60.776]],[\"comment/248\",[]],[\"name/249\",[174,60.776]],[\"comment/249\",[]],[\"name/250\",[175,60.776]],[\"comment/250\",[]],[\"name/251\",[176,60.776]],[\"comment/251\",[]],[\"name/252\",[177,60.776]],[\"comment/252\",[]],[\"name/253\",[41,36.209]],[\"comment/253\",[]],[\"name/254\",[178,60.776]],[\"comment/254\",[]],[\"name/255\",[179,47.784]],[\"comment/255\",[]],[\"name/256\",[180,49.79]],[\"comment/256\",[]],[\"name/257\",[37,49.79]],[\"comment/257\",[]],[\"name/258\",[38,49.79]],[\"comment/258\",[]],[\"name/259\",[181,55.668]],[\"comment/259\",[]],[\"name/260\",[182,37.423]],[\"comment/260\",[]],[\"name/261\",[183,60.776]],[\"comment/261\",[]],[\"name/262\",[76,28.858]],[\"comment/262\",[]],[\"name/263\",[184,60.776]],[\"comment/263\",[]],[\"name/264\",[179,47.784]],[\"comment/264\",[]],[\"name/265\",[180,49.79]],[\"comment/265\",[]],[\"name/266\",[185,60.776]],[\"comment/266\",[]],[\"name/267\",[186,60.776]],[\"comment/267\",[]],[\"name/268\",[187,60.776]],[\"comment/268\",[]],[\"name/269\",[188,60.776]],[\"comment/269\",[]],[\"name/270\",[189,55.668]],[\"comment/270\",[]],[\"name/271\",[190,60.776]],[\"comment/271\",[]],[\"name/272\",[191,60.776]],[\"comment/272\",[]],[\"name/273\",[192,60.776]],[\"comment/273\",[]],[\"name/274\",[193,60.776]],[\"comment/274\",[]],[\"name/275\",[194,55.668]],[\"comment/275\",[]],[\"name/276\",[182,37.423]],[\"comment/276\",[]],[\"name/277\",[195,60.776]],[\"comment/277\",[]],[\"name/278\",[196,60.776]],[\"comment/278\",[]],[\"name/279\",[189,55.668]],[\"comment/279\",[]],[\"name/280\",[194,55.668]],[\"comment/280\",[]],[\"name/281\",[197,60.776]],[\"comment/281\",[]],[\"name/282\",[181,55.668]],[\"comment/282\",[]],[\"name/283\",[76,28.858]],[\"comment/283\",[]],[\"name/284\",[198,55.668]],[\"comment/284\",[]],[\"name/285\",[42,37.423]],[\"comment/285\",[]],[\"name/286\",[41,36.209]],[\"comment/286\",[]],[\"name/287\",[199,40.408]],[\"comment/287\",[]],[\"name/288\",[200,60.776]],[\"comment/288\",[]],[\"name/289\",[33,52.303]],[\"comment/289\",[]],[\"name/290\",[201,60.776]],[\"comment/290\",[]],[\"name/291\",[76,28.858]],[\"comment/291\",[]],[\"name/292\",[202,55.668]],[\"comment/292\",[]],[\"name/293\",[42,37.423]],[\"comment/293\",[]],[\"name/294\",[41,36.209]],[\"comment/294\",[]],[\"name/295\",[199,40.408]],[\"comment/295\",[]],[\"name/296\",[33,52.303]],[\"comment/296\",[]],[\"name/297\",[203,60.776]],[\"comment/297\",[]],[\"name/298\",[37,49.79]],[\"comment/298\",[]],[\"name/299\",[38,49.79]],[\"comment/299\",[]],[\"name/300\",[204,60.776]],[\"comment/300\",[]],[\"name/301\",[205,55.668]],[\"comment/301\",[]],[\"name/302\",[206,60.776]],[\"comment/302\",[]],[\"name/303\",[207,55.668]],[\"comment/303\",[]],[\"name/304\",[208,60.776]],[\"comment/304\",[]],[\"name/305\",[209,52.303]],[\"comment/305\",[]],[\"name/306\",[210,60.776]],[\"comment/306\",[]],[\"name/307\",[211,60.776]],[\"comment/307\",[]],[\"name/308\",[209,52.303]],[\"comment/308\",[]],[\"name/309\",[212,60.776]],[\"comment/309\",[]],[\"name/310\",[213,60.776]],[\"comment/310\",[]],[\"name/311\",[214,52.303]],[\"comment/311\",[]],[\"name/312\",[215,60.776]],[\"comment/312\",[]],[\"name/313\",[216,60.776]],[\"comment/313\",[]],[\"name/314\",[217,60.776]],[\"comment/314\",[]],[\"name/315\",[218,60.776]],[\"comment/315\",[]],[\"name/316\",[6,52.303]],[\"comment/316\",[]],[\"name/317\",[219,60.776]],[\"comment/317\",[]],[\"name/318\",[220,60.776]],[\"comment/318\",[]],[\"name/319\",[221,60.776]],[\"comment/319\",[]],[\"name/320\",[222,55.668]],[\"comment/320\",[]],[\"name/321\",[42,37.423]],[\"comment/321\",[]],[\"name/322\",[41,36.209]],[\"comment/322\",[]],[\"name/323\",[199,40.408]],[\"comment/323\",[]],[\"name/324\",[223,55.668]],[\"comment/324\",[]],[\"name/325\",[36,47.784]],[\"comment/325\",[]],[\"name/326\",[224,52.303]],[\"comment/326\",[]],[\"name/327\",[225,55.668]],[\"comment/327\",[]],[\"name/328\",[226,55.668]],[\"comment/328\",[]],[\"name/329\",[227,60.776]],[\"comment/329\",[]],[\"name/330\",[228,60.776]],[\"comment/330\",[]],[\"name/331\",[229,49.79]],[\"comment/331\",[]],[\"name/332\",[230,52.303]],[\"comment/332\",[]],[\"name/333\",[231,55.668]],[\"comment/333\",[]],[\"name/334\",[42,37.423]],[\"comment/334\",[]],[\"name/335\",[41,36.209]],[\"comment/335\",[]],[\"name/336\",[199,40.408]],[\"comment/336\",[]],[\"name/337\",[36,47.784]],[\"comment/337\",[]],[\"name/338\",[40,52.303]],[\"comment/338\",[]],[\"name/339\",[232,55.668]],[\"comment/339\",[]],[\"name/340\",[229,49.79]],[\"comment/340\",[]],[\"name/341\",[230,52.303]],[\"comment/341\",[]],[\"name/342\",[233,60.776]],[\"comment/342\",[]],[\"name/343\",[234,60.776]],[\"comment/343\",[]],[\"name/344\",[31,42.318]],[\"comment/344\",[]],[\"name/345\",[41,36.209]],[\"comment/345\",[]],[\"name/346\",[235,60.776]],[\"comment/346\",[]],[\"name/347\",[236,60.776]],[\"comment/347\",[]],[\"name/348\",[76,28.858]],[\"comment/348\",[]],[\"name/349\",[237,60.776]],[\"comment/349\",[]],[\"name/350\",[41,36.209]],[\"comment/350\",[]],[\"name/351\",[214,52.303]],[\"comment/351\",[]],[\"name/352\",[238,60.776]],[\"comment/352\",[]],[\"name/353\",[239,52.303]],[\"comment/353\",[]],[\"name/354\",[240,60.776]],[\"comment/354\",[]],[\"name/355\",[76,28.858]],[\"comment/355\",[]],[\"name/356\",[241,55.668]],[\"comment/356\",[]],[\"name/357\",[242,60.776]],[\"comment/357\",[]],[\"name/358\",[76,28.858]],[\"comment/358\",[]],[\"name/359\",[243,55.668]],[\"comment/359\",[]],[\"name/360\",[42,37.423]],[\"comment/360\",[]],[\"name/361\",[41,36.209]],[\"comment/361\",[]],[\"name/362\",[199,40.408]],[\"comment/362\",[]],[\"name/363\",[239,52.303]],[\"comment/363\",[]],[\"name/364\",[241,55.668]],[\"comment/364\",[]],[\"name/365\",[244,60.776]],[\"comment/365\",[]],[\"name/366\",[245,60.776]],[\"comment/366\",[]],[\"name/367\",[31,42.318]],[\"comment/367\",[]],[\"name/368\",[179,47.784]],[\"comment/368\",[]],[\"name/369\",[180,49.79]],[\"comment/369\",[]],[\"name/370\",[246,60.776]],[\"comment/370\",[]],[\"name/371\",[31,42.318]],[\"comment/371\",[]],[\"name/372\",[179,47.784]],[\"comment/372\",[]],[\"name/373\",[247,52.303]],[\"comment/373\",[]],[\"name/374\",[248,60.776]],[\"comment/374\",[]],[\"name/375\",[249,60.776]],[\"comment/375\",[]],[\"name/376\",[250,60.776]],[\"comment/376\",[]],[\"name/377\",[49,52.303]],[\"comment/377\",[]],[\"name/378\",[251,55.668]],[\"comment/378\",[]],[\"name/379\",[252,60.776]],[\"comment/379\",[]],[\"name/380\",[253,55.668]],[\"comment/380\",[]],[\"name/381\",[247,52.303]],[\"comment/381\",[]],[\"name/382\",[254,60.776]],[\"comment/382\",[]],[\"name/383\",[49,52.303]],[\"comment/383\",[]],[\"name/384\",[251,55.668]],[\"comment/384\",[]],[\"name/385\",[255,55.668]],[\"comment/385\",[]],[\"name/386\",[247,52.303]],[\"comment/386\",[]],[\"name/387\",[256,55.668]],[\"comment/387\",[]],[\"name/388\",[257,60.776]],[\"comment/388\",[]],[\"name/389\",[31,42.318]],[\"comment/389\",[]],[\"name/390\",[182,37.423]],[\"comment/390\",[]],[\"name/391\",[258,60.776]],[\"comment/391\",[]],[\"name/392\",[31,42.318]],[\"comment/392\",[]],[\"name/393\",[182,37.423]],[\"comment/393\",[]],[\"name/394\",[76,28.858]],[\"comment/394\",[]],[\"name/395\",[259,60.776]],[\"comment/395\",[]],[\"name/396\",[256,55.668]],[\"comment/396\",[]],[\"name/397\",[76,28.858]],[\"comment/397\",[]],[\"name/398\",[260,55.668]],[\"comment/398\",[]],[\"name/399\",[42,37.423]],[\"comment/399\",[]],[\"name/400\",[41,36.209]],[\"comment/400\",[]],[\"name/401\",[199,40.408]],[\"comment/401\",[]],[\"name/402\",[261,60.776]],[\"comment/402\",[]],[\"name/403\",[262,60.776]],[\"comment/403\",[]],[\"name/404\",[263,60.776]],[\"comment/404\",[]],[\"name/405\",[264,60.776]],[\"comment/405\",[]],[\"name/406\",[265,60.776]],[\"comment/406\",[]],[\"name/407\",[266,60.776]],[\"comment/407\",[]],[\"name/408\",[267,60.776]],[\"comment/408\",[]],[\"name/409\",[268,60.776]],[\"comment/409\",[]],[\"name/410\",[269,60.776]],[\"comment/410\",[]],[\"name/411\",[270,60.776]],[\"comment/411\",[]],[\"name/412\",[271,60.776]],[\"comment/412\",[]],[\"name/413\",[272,60.776]],[\"comment/413\",[]],[\"name/414\",[253,55.668]],[\"comment/414\",[]],[\"name/415\",[255,55.668]],[\"comment/415\",[]],[\"name/416\",[76,28.858]],[\"comment/416\",[]],[\"name/417\",[273,60.776]],[\"comment/417\",[]],[\"name/418\",[274,60.776]],[\"comment/418\",[]],[\"name/419\",[275,60.776]],[\"comment/419\",[]],[\"name/420\",[276,60.776]],[\"comment/420\",[]],[\"name/421\",[277,60.776]],[\"comment/421\",[]],[\"name/422\",[278,60.776]],[\"comment/422\",[]],[\"name/423\",[279,55.668]],[\"comment/423\",[]],[\"name/424\",[42,37.423]],[\"comment/424\",[]],[\"name/425\",[41,36.209]],[\"comment/425\",[]],[\"name/426\",[199,40.408]],[\"comment/426\",[]],[\"name/427\",[280,60.776]],[\"comment/427\",[]],[\"name/428\",[281,60.776]],[\"comment/428\",[]],[\"name/429\",[282,60.776]],[\"comment/429\",[]],[\"name/430\",[283,60.776]],[\"comment/430\",[]],[\"name/431\",[19,49.79]],[\"comment/431\",[]],[\"name/432\",[164,52.303]],[\"comment/432\",[]],[\"name/433\",[229,49.79]],[\"comment/433\",[]],[\"name/434\",[230,52.303]],[\"comment/434\",[]],[\"name/435\",[239,52.303]],[\"comment/435\",[]],[\"name/436\",[76,28.858]],[\"comment/436\",[]],[\"name/437\",[284,55.668]],[\"comment/437\",[]],[\"name/438\",[42,37.423]],[\"comment/438\",[]],[\"name/439\",[41,36.209]],[\"comment/439\",[]],[\"name/440\",[199,40.408]],[\"comment/440\",[]],[\"name/441\",[285,60.776]],[\"comment/441\",[]],[\"name/442\",[286,60.776]],[\"comment/442\",[]],[\"name/443\",[287,60.776]],[\"comment/443\",[]],[\"name/444\",[288,55.668]],[\"comment/444\",[]],[\"name/445\",[42,37.423]],[\"comment/445\",[]],[\"name/446\",[41,36.209]],[\"comment/446\",[]],[\"name/447\",[199,40.408]],[\"comment/447\",[]],[\"name/448\",[289,60.776]],[\"comment/448\",[]],[\"name/449\",[284,55.668]],[\"comment/449\",[]],[\"name/450\",[288,55.668]],[\"comment/450\",[]],[\"name/451\",[76,28.858]],[\"comment/451\",[]],[\"name/452\",[290,55.668]],[\"comment/452\",[]],[\"name/453\",[42,37.423]],[\"comment/453\",[]],[\"name/454\",[291,55.668]],[\"comment/454\",[]],[\"name/455\",[41,36.209]],[\"comment/455\",[]],[\"name/456\",[198,55.668]],[\"comment/456\",[]],[\"name/457\",[202,55.668]],[\"comment/457\",[]],[\"name/458\",[222,55.668]],[\"comment/458\",[]],[\"name/459\",[231,55.668]],[\"comment/459\",[]],[\"name/460\",[243,55.668]],[\"comment/460\",[]],[\"name/461\",[260,55.668]],[\"comment/461\",[]],[\"name/462\",[279,55.668]],[\"comment/462\",[]],[\"name/463\",[76,28.858]],[\"comment/463\",[]],[\"name/464\",[292,60.776]],[\"comment/464\",[]],[\"name/465\",[293,60.776]],[\"comment/465\",[]],[\"name/466\",[205,55.668]],[\"comment/466\",[]],[\"name/467\",[207,55.668]],[\"comment/467\",[]],[\"name/468\",[294,60.776]],[\"comment/468\",[]],[\"name/469\",[42,37.423]],[\"comment/469\",[]],[\"name/470\",[41,36.209]],[\"comment/470\",[]],[\"name/471\",[199,40.408]],[\"comment/471\",[]],[\"name/472\",[209,52.303]],[\"comment/472\",[]],[\"name/473\",[290,55.668]],[\"comment/473\",[]],[\"name/474\",[223,55.668]],[\"comment/474\",[]],[\"name/475\",[36,47.784]],[\"comment/475\",[]],[\"name/476\",[224,52.303]],[\"comment/476\",[]],[\"name/477\",[226,55.668]],[\"comment/477\",[]],[\"name/478\",[295,60.776]],[\"comment/478\",[]],[\"name/479\",[225,55.668]],[\"comment/479\",[]],[\"name/480\",[296,60.776]],[\"comment/480\",[]],[\"name/481\",[42,37.423]],[\"comment/481\",[]],[\"name/482\",[41,36.209]],[\"comment/482\",[]],[\"name/483\",[199,40.408]],[\"comment/483\",[]],[\"name/484\",[36,47.784]],[\"comment/484\",[]],[\"name/485\",[229,49.79]],[\"comment/485\",[]],[\"name/486\",[40,52.303]],[\"comment/486\",[]],[\"name/487\",[232,55.668]],[\"comment/487\",[]],[\"name/488\",[297,60.776]],[\"comment/488\",[]],[\"name/489\",[298,55.668]],[\"comment/489\",[]],[\"name/490\",[299,60.776]],[\"comment/490\",[]],[\"name/491\",[300,60.776]],[\"comment/491\",[]],[\"name/492\",[301,60.776]],[\"comment/492\",[]],[\"name/493\",[164,52.303]],[\"comment/493\",[]],[\"name/494\",[14,47.784]],[\"comment/494\",[]],[\"name/495\",[302,60.776]],[\"comment/495\",[]],[\"name/496\",[303,60.776]],[\"comment/496\",[]],[\"name/497\",[304,60.776]],[\"comment/497\",[]],[\"name/498\",[23,52.303]],[\"comment/498\",[]],[\"name/499\",[305,60.776]],[\"comment/499\",[]],[\"name/500\",[42,37.423]],[\"comment/500\",[]],[\"name/501\",[291,55.668]],[\"comment/501\",[]],[\"name/502\",[41,36.209]],[\"comment/502\",[]],[\"name/503\",[306,60.776]],[\"comment/503\",[]],[\"name/504\",[307,52.303]],[\"comment/504\",[]],[\"name/505\",[182,37.423]],[\"comment/505\",[]],[\"name/506\",[308,43.43]],[\"comment/506\",[]],[\"name/507\",[309,60.776]],[\"comment/507\",[]],[\"name/508\",[179,47.784]],[\"comment/508\",[]],[\"name/509\",[180,49.79]],[\"comment/509\",[]],[\"name/510\",[37,49.79]],[\"comment/510\",[]],[\"name/511\",[38,49.79]],[\"comment/511\",[]],[\"name/512\",[310,52.303]],[\"comment/512\",[]],[\"name/513\",[182,37.423]],[\"comment/513\",[]],[\"name/514\",[311,55.668]],[\"comment/514\",[]],[\"name/515\",[312,55.668]],[\"comment/515\",[]],[\"name/516\",[313,55.668]],[\"comment/516\",[]],[\"name/517\",[314,55.668]],[\"comment/517\",[]],[\"name/518\",[315,55.668]],[\"comment/518\",[]],[\"name/519\",[316,55.668]],[\"comment/519\",[]],[\"name/520\",[317,55.668]],[\"comment/520\",[]],[\"name/521\",[318,55.668]],[\"comment/521\",[]],[\"name/522\",[319,55.668]],[\"comment/522\",[]],[\"name/523\",[320,55.668]],[\"comment/523\",[]],[\"name/524\",[321,55.668]],[\"comment/524\",[]],[\"name/525\",[322,60.776]],[\"comment/525\",[]],[\"name/526\",[323,55.668]],[\"comment/526\",[]],[\"name/527\",[324,55.668]],[\"comment/527\",[]],[\"name/528\",[325,55.668]],[\"comment/528\",[]],[\"name/529\",[326,55.668]],[\"comment/529\",[]],[\"name/530\",[327,52.303]],[\"comment/530\",[]],[\"name/531\",[182,37.423]],[\"comment/531\",[]],[\"name/532\",[308,43.43]],[\"comment/532\",[]],[\"name/533\",[328,52.303]],[\"comment/533\",[]],[\"name/534\",[182,37.423]],[\"comment/534\",[]],[\"name/535\",[329,55.668]],[\"comment/535\",[]],[\"name/536\",[330,55.668]],[\"comment/536\",[]],[\"name/537\",[331,60.776]],[\"comment/537\",[]],[\"name/538\",[307,52.303]],[\"comment/538\",[]],[\"name/539\",[332,55.668]],[\"comment/539\",[]],[\"name/540\",[333,55.668]],[\"comment/540\",[]],[\"name/541\",[334,55.668]],[\"comment/541\",[]],[\"name/542\",[310,52.303]],[\"comment/542\",[]],[\"name/543\",[335,55.668]],[\"comment/543\",[]],[\"name/544\",[336,55.668]],[\"comment/544\",[]],[\"name/545\",[337,55.668]],[\"comment/545\",[]],[\"name/546\",[327,52.303]],[\"comment/546\",[]],[\"name/547\",[328,52.303]],[\"comment/547\",[]],[\"name/548\",[76,28.858]],[\"comment/548\",[]],[\"name/549\",[338,60.776]],[\"comment/549\",[]],[\"name/550\",[182,37.423]],[\"comment/550\",[]],[\"name/551\",[308,43.43]],[\"comment/551\",[]],[\"name/552\",[339,60.776]],[\"comment/552\",[]],[\"name/553\",[182,37.423]],[\"comment/553\",[]],[\"name/554\",[311,55.668]],[\"comment/554\",[]],[\"name/555\",[312,55.668]],[\"comment/555\",[]],[\"name/556\",[313,55.668]],[\"comment/556\",[]],[\"name/557\",[314,55.668]],[\"comment/557\",[]],[\"name/558\",[315,55.668]],[\"comment/558\",[]],[\"name/559\",[316,55.668]],[\"comment/559\",[]],[\"name/560\",[317,55.668]],[\"comment/560\",[]],[\"name/561\",[318,55.668]],[\"comment/561\",[]],[\"name/562\",[319,55.668]],[\"comment/562\",[]],[\"name/563\",[320,55.668]],[\"comment/563\",[]],[\"name/564\",[321,55.668]],[\"comment/564\",[]],[\"name/565\",[340,60.776]],[\"comment/565\",[]],[\"name/566\",[341,60.776]],[\"comment/566\",[]],[\"name/567\",[323,55.668]],[\"comment/567\",[]],[\"name/568\",[324,55.668]],[\"comment/568\",[]],[\"name/569\",[325,55.668]],[\"comment/569\",[]],[\"name/570\",[326,55.668]],[\"comment/570\",[]],[\"name/571\",[76,28.858]],[\"comment/571\",[]],[\"name/572\",[342,60.776]],[\"comment/572\",[]],[\"name/573\",[182,37.423]],[\"comment/573\",[]],[\"name/574\",[308,43.43]],[\"comment/574\",[]],[\"name/575\",[343,60.776]],[\"comment/575\",[]],[\"name/576\",[76,28.858]],[\"comment/576\",[]],[\"name/577\",[182,37.423]],[\"comment/577\",[]],[\"name/578\",[329,55.668]],[\"comment/578\",[]],[\"name/579\",[330,55.668]],[\"comment/579\",[]],[\"name/580\",[344,55.668]],[\"comment/580\",[]],[\"name/581\",[182,37.423]],[\"comment/581\",[]],[\"name/582\",[308,43.43]],[\"comment/582\",[]],[\"name/583\",[76,28.858]],[\"comment/583\",[]],[\"name/584\",[345,55.668]],[\"comment/584\",[]],[\"name/585\",[346,60.776]],[\"comment/585\",[]],[\"name/586\",[347,60.776]],[\"comment/586\",[]],[\"name/587\",[348,60.776]],[\"comment/587\",[]],[\"name/588\",[76,28.858]],[\"comment/588\",[]],[\"name/589\",[349,55.668]],[\"comment/589\",[]],[\"name/590\",[182,37.423]],[\"comment/590\",[]],[\"name/591\",[308,43.43]],[\"comment/591\",[]],[\"name/592\",[76,28.858]],[\"comment/592\",[]],[\"name/593\",[350,55.668]],[\"comment/593\",[]],[\"name/594\",[182,37.423]],[\"comment/594\",[]],[\"name/595\",[308,43.43]],[\"comment/595\",[]],[\"name/596\",[76,28.858]],[\"comment/596\",[]],[\"name/597\",[351,55.668]],[\"comment/597\",[]],[\"name/598\",[308,43.43]],[\"comment/598\",[]],[\"name/599\",[352,60.776]],[\"comment/599\",[]],[\"name/600\",[349,55.668]],[\"comment/600\",[]],[\"name/601\",[350,55.668]],[\"comment/601\",[]],[\"name/602\",[351,55.668]],[\"comment/602\",[]],[\"name/603\",[76,28.858]],[\"comment/603\",[]],[\"name/604\",[353,60.776]],[\"comment/604\",[]],[\"name/605\",[345,55.668]],[\"comment/605\",[]],[\"name/606\",[76,28.858]],[\"comment/606\",[]],[\"name/607\",[354,60.776]],[\"comment/607\",[]],[\"name/608\",[344,55.668]],[\"comment/608\",[]],[\"name/609\",[76,28.858]],[\"comment/609\",[]],[\"name/610\",[355,60.776]],[\"comment/610\",[]],[\"name/611\",[307,52.303]],[\"comment/611\",[]],[\"name/612\",[332,55.668]],[\"comment/612\",[]],[\"name/613\",[333,55.668]],[\"comment/613\",[]],[\"name/614\",[334,55.668]],[\"comment/614\",[]],[\"name/615\",[310,52.303]],[\"comment/615\",[]],[\"name/616\",[335,55.668]],[\"comment/616\",[]],[\"name/617\",[336,55.668]],[\"comment/617\",[]],[\"name/618\",[337,55.668]],[\"comment/618\",[]],[\"name/619\",[327,52.303]],[\"comment/619\",[]],[\"name/620\",[328,52.303]],[\"comment/620\",[]],[\"name/621\",[76,28.858]],[\"comment/621\",[]],[\"name/622\",[356,60.776]],[\"comment/622\",[]],[\"name/623\",[20,49.79]],[\"comment/623\",[]],[\"name/624\",[76,28.858]],[\"comment/624\",[]],[\"name/625\",[298,55.668]],[\"comment/625\",[]],[\"name/626\",[42,37.423]],[\"comment/626\",[]],[\"name/627\",[357,60.776]],[\"comment/627\",[]],[\"name/628\",[224,52.303]],[\"comment/628\",[]],[\"name/629\",[20,49.79]],[\"comment/629\",[]],[\"name/630\",[76,28.858]],[\"comment/630\",[]],[\"name/631\",[22,49.79]],[\"comment/631\",[]],[\"name/632\",[48,49.79]],[\"comment/632\",[]],[\"name/633\",[43,52.303]],[\"comment/633\",[]],[\"name/634\",[358,60.776]],[\"comment/634\",[]],[\"name/635\",[133,55.668]],[\"comment/635\",[]],[\"name/636\",[359,60.776]],[\"comment/636\",[]],[\"name/637\",[360,60.776]],[\"comment/637\",[]],[\"name/638\",[361,60.776]],[\"comment/638\",[]],[\"name/639\",[8,52.303]],[\"comment/639\",[]],[\"name/640\",[362,60.776]],[\"comment/640\",[]],[\"name/641\",[363,60.776]],[\"comment/641\",[]],[\"name/642\",[16,46.113]],[\"comment/642\",[]],[\"name/643\",[364,60.776]],[\"comment/643\",[]],[\"name/644\",[214,52.303]],[\"comment/644\",[]],[\"name/645\",[365,60.776]],[\"comment/645\",[]],[\"name/646\",[16,46.113]],[\"comment/646\",[]],[\"name/647\",[47,55.668]],[\"comment/647\",[]],[\"name/648\",[366,60.776]],[\"comment/648\",[]],[\"name/649\",[367,60.776]],[\"comment/649\",[]],[\"name/650\",[48,49.79]],[\"comment/650\",[]],[\"name/651\",[368,60.776]],[\"comment/651\",[]],[\"name/652\",[369,60.776]],[\"comment/652\",[]]],\"invertedIndex\":[[\"__type\",{\"_index\":31,\"name\":{\"32\":{},\"43\":{},\"77\":{},\"178\":{},\"344\":{},\"367\":{},\"371\":{},\"389\":{},\"392\":{}},\"comment\":{}}],[\"accesspolicyconfig\",{\"_index\":112,\"name\":{\"142\":{}},\"comment\":{}}],[\"activesource\",{\"_index\":32,\"name\":{\"33\":{},\"71\":{}},\"comment\":{}}],[\"activesources\",{\"_index\":54,\"name\":{\"70\":{}},\"comment\":{}}],[\"address\",{\"_index\":218,\"name\":{\"315\":{}},\"comment\":{}}],[\"afmode\",{\"_index\":341,\"name\":{\"566\":{}},\"comment\":{}}],[\"agent\",{\"_index\":10,\"name\":{\"10\":{},\"62\":{}},\"comment\":{}}],[\"analytics\",{\"_index\":164,\"name\":{\"228\":{},\"432\":{},\"493\":{}},\"comment\":{}}],[\"analyticscapabilities\",{\"_index\":162,\"name\":{\"223\":{}},\"comment\":{}}],[\"analyticsdevice\",{\"_index\":15,\"name\":{\"15\":{},\"215\":{}},\"comment\":{}}],[\"analyticsdevicecapabilities\",{\"_index\":154,\"name\":{\"203\":{}},\"comment\":{}}],[\"analyticsengineconfiguration\",{\"_index\":239,\"name\":{\"353\":{},\"363\":{},\"435\":{}},\"comment\":{}}],[\"analyticsmodule\",{\"_index\":240,\"name\":{\"354\":{}},\"comment\":{}}],[\"analyticsmodulesupport\",{\"_index\":163,\"name\":{\"226\":{}},\"comment\":{}}],[\"angle\",{\"_index\":186,\"name\":{\"267\":{}},\"comment\":{}}],[\"anyuri\",{\"_index\":176,\"name\":{\"251\":{}},\"comment\":{}}],[\"audiodecoder\",{\"_index\":304,\"name\":{\"497\":{}},\"comment\":{}}],[\"audiodecoderconfiguration\",{\"_index\":288,\"name\":{\"444\":{},\"450\":{}},\"comment\":{}}],[\"audioencoder\",{\"_index\":301,\"name\":{\"492\":{}},\"comment\":{}}],[\"audioencoder2configuration\",{\"_index\":296,\"name\":{\"480\":{}},\"comment\":{}}],[\"audioencoderconfiguration\",{\"_index\":231,\"name\":{\"333\":{},\"459\":{}},\"comment\":{}}],[\"audiooutput\",{\"_index\":303,\"name\":{\"496\":{}},\"comment\":{}}],[\"audiooutputconfiguration\",{\"_index\":284,\"name\":{\"437\":{},\"449\":{}},\"comment\":{}}],[\"audiooutputs\",{\"_index\":136,\"name\":{\"175\":{}},\"comment\":{}}],[\"audiosource\",{\"_index\":299,\"name\":{\"490\":{}},\"comment\":{}}],[\"audiosourceconfiguration\",{\"_index\":202,\"name\":{\"292\":{},\"457\":{}},\"comment\":{}}],[\"audiosources\",{\"_index\":135,\"name\":{\"174\":{}},\"comment\":{}}],[\"autoconnect\",{\"_index\":12,\"name\":{\"12\":{}},\"comment\":{}}],[\"autofocusmode\",{\"_index\":323,\"name\":{\"526\":{},\"567\":{}},\"comment\":{}}],[\"autostart\",{\"_index\":220,\"name\":{\"318\":{}},\"comment\":{}}],[\"auxiliary\",{\"_index\":97,\"name\":{\"124\":{}},\"comment\":{}}],[\"auxiliarycommands\",{\"_index\":98,\"name\":{\"125\":{}},\"comment\":{}}],[\"backlightcompensation\",{\"_index\":307,\"name\":{\"504\":{},\"538\":{},\"611\":{}},\"comment\":{}}],[\"backlightcompensation20\",{\"_index\":338,\"name\":{\"549\":{}},\"comment\":{}}],[\"bitrate\",{\"_index\":40,\"name\":{\"41\":{},\"338\":{},\"486\":{}},\"comment\":{}}],[\"bitratelimit\",{\"_index\":207,\"name\":{\"303\":{},\"467\":{}},\"comment\":{}}],[\"body\",{\"_index\":29,\"name\":{\"29\":{}},\"comment\":{}}],[\"boundaryoffset\",{\"_index\":347,\"name\":{\"586\":{}},\"comment\":{}}],[\"boundarytype\",{\"_index\":346,\"name\":{\"585\":{}},\"comment\":{}}],[\"bounds\",{\"_index\":201,\"name\":{\"290\":{}},\"comment\":{}}],[\"brightness\",{\"_index\":332,\"name\":{\"539\":{},\"612\":{}},\"comment\":{}}],[\"capabilities\",{\"_index\":51,\"name\":{\"67\":{},\"227\":{}},\"comment\":{}}],[\"capabilitiesextension\",{\"_index\":156,\"name\":{\"207\":{}},\"comment\":{}}],[\"cbgain\",{\"_index\":330,\"name\":{\"536\":{},\"579\":{}},\"comment\":{}}],[\"colorsaturation\",{\"_index\":333,\"name\":{\"540\":{},\"613\":{}},\"comment\":{}}],[\"compressiontype\",{\"_index\":280,\"name\":{\"427\":{}},\"comment\":{}}],[\"config\",{\"_index\":237,\"name\":{\"349\":{}},\"comment\":{}}],[\"configurations\",{\"_index\":306,\"name\":{\"503\":{}},\"comment\":{}}],[\"configurationset\",{\"_index\":297,\"name\":{\"488\":{}},\"comment\":{}}],[\"connect\",{\"_index\":67,\"name\":{\"87\":{}},\"comment\":{}}],[\"constantbitrate\",{\"_index\":293,\"name\":{\"465\":{}},\"comment\":{}}],[\"constructor\",{\"_index\":48,\"name\":{\"51\":{},\"236\":{},\"632\":{},\"650\":{}},\"comment\":{}}],[\"contrast\",{\"_index\":334,\"name\":{\"541\":{},\"614\":{}},\"comment\":{}}],[\"crgain\",{\"_index\":329,\"name\":{\"535\":{},\"578\":{}},\"comment\":{}}],[\"defaultabsolutepanttiltpositionspace\",{\"_index\":265,\"name\":{\"406\":{}},\"comment\":{}}],[\"defaultabsolutezoompositionspace\",{\"_index\":266,\"name\":{\"407\":{}},\"comment\":{}}],[\"defaultcontinuouspantiltvelocityspace\",{\"_index\":269,\"name\":{\"410\":{}},\"comment\":{}}],[\"defaultcontinuouszoomvelocityspace\",{\"_index\":270,\"name\":{\"411\":{}},\"comment\":{}}],[\"defaultprofile\",{\"_index\":53,\"name\":{\"69\":{}},\"comment\":{}}],[\"defaultprofiles\",{\"_index\":52,\"name\":{\"68\":{}},\"comment\":{}}],[\"defaultptzspeed\",{\"_index\":271,\"name\":{\"412\":{}},\"comment\":{}}],[\"defaultptztimeout\",{\"_index\":272,\"name\":{\"413\":{}},\"comment\":{}}],[\"defaultrelativepantilttranslationspace\",{\"_index\":267,\"name\":{\"408\":{}},\"comment\":{}}],[\"defaultrelativezoomtranslationspace\",{\"_index\":268,\"name\":{\"409\":{}},\"comment\":{}}],[\"defaultspeed\",{\"_index\":324,\"name\":{\"527\":{},\"568\":{}},\"comment\":{}}],[\"defogging\",{\"_index\":350,\"name\":{\"593\":{},\"601\":{}},\"comment\":{}}],[\"degree\",{\"_index\":183,\"name\":{\"261\":{}},\"comment\":{}}],[\"device\",{\"_index\":16,\"name\":{\"16\":{},\"52\":{},\"229\":{},\"235\":{},\"642\":{},\"646\":{}},\"comment\":{}}],[\"devicecapabilities\",{\"_index\":157,\"name\":{\"216\":{}},\"comment\":{}}],[\"deviceinformation\",{\"_index\":55,\"name\":{\"73\":{},\"245\":{}},\"comment\":{}}],[\"deviceio\",{\"_index\":17,\"name\":{\"17\":{},\"209\":{}},\"comment\":{}}],[\"deviceiocapabilities\",{\"_index\":132,\"name\":{\"170\":{}},\"comment\":{}}],[\"discovery\",{\"_index\":369,\"name\":{\"652\":{}},\"comment\":{}}],[\"discoverybye\",{\"_index\":89,\"name\":{\"113\":{}},\"comment\":{}}],[\"discoveryoptions\",{\"_index\":361,\"name\":{\"638\":{}},\"comment\":{}}],[\"discoveryresolve\",{\"_index\":88,\"name\":{\"112\":{}},\"comment\":{}}],[\"discoverysingleton\",{\"_index\":365,\"name\":{\"645\":{}},\"comment\":{}}],[\"display\",{\"_index\":18,\"name\":{\"18\":{},\"210\":{}},\"comment\":{}}],[\"displaycapabilities\",{\"_index\":139,\"name\":{\"181\":{}},\"comment\":{}}],[\"dot11configuration\",{\"_index\":75,\"name\":{\"97\":{}},\"comment\":{}}],[\"dot1x\",{\"_index\":103,\"name\":{\"132\":{}},\"comment\":{}}],[\"duration\",{\"_index\":221,\"name\":{\"319\":{}},\"comment\":{}}],[\"dynamicrecordings\",{\"_index\":144,\"name\":{\"188\":{}},\"comment\":{}}],[\"dynamictracks\",{\"_index\":145,\"name\":{\"189\":{}},\"comment\":{}}],[\"dyndns\",{\"_index\":81,\"name\":{\"103\":{}},\"comment\":{}}],[\"eflip\",{\"_index\":257,\"name\":{\"388\":{}},\"comment\":{}}],[\"elementitem\",{\"_index\":236,\"name\":{\"347\":{}},\"comment\":{}}],[\"encoding\",{\"_index\":36,\"name\":{\"37\":{},\"325\":{},\"337\":{},\"475\":{},\"484\":{}},\"comment\":{}}],[\"encodinginterval\",{\"_index\":206,\"name\":{\"302\":{}},\"comment\":{}}],[\"envelopefooter\",{\"_index\":57,\"name\":{\"75\":{}},\"comment\":{}}],[\"envelopeheader\",{\"_index\":56,\"name\":{\"74\":{}},\"comment\":{}}],[\"error\",{\"_index\":47,\"name\":{\"50\":{},\"647\":{}},\"comment\":{}}],[\"eventcapabilities\",{\"_index\":117,\"name\":{\"148\":{}},\"comment\":{}}],[\"events\",{\"_index\":19,\"name\":{\"19\":{},\"64\":{},\"230\":{},\"431\":{}},\"comment\":{}}],[\"eventsubscription\",{\"_index\":276,\"name\":{\"420\":{}},\"comment\":{}}],[\"exposure\",{\"_index\":310,\"name\":{\"512\":{},\"542\":{},\"615\":{}},\"comment\":{}}],[\"exposure20\",{\"_index\":339,\"name\":{\"552\":{}},\"comment\":{}}],[\"exposuretime\",{\"_index\":319,\"name\":{\"522\":{},\"562\":{}},\"comment\":{}}],[\"extension\",{\"_index\":76,\"name\":{\"98\":{},\"104\":{},\"110\":{},\"126\":{},\"130\":{},\"137\":{},\"147\":{},\"159\":{},\"167\":{},\"206\":{},\"234\":{},\"262\":{},\"283\":{},\"291\":{},\"348\":{},\"355\":{},\"358\":{},\"394\":{},\"397\":{},\"416\":{},\"436\":{},\"451\":{},\"463\":{},\"548\":{},\"571\":{},\"576\":{},\"583\":{},\"588\":{},\"592\":{},\"596\":{},\"603\":{},\"606\":{},\"609\":{},\"621\":{},\"624\":{},\"630\":{}},\"comment\":{}}],[\"extensions\",{\"_index\":95,\"name\":{\"122\":{},\"177\":{},\"222\":{}},\"comment\":{}}],[\"farlimit\",{\"_index\":326,\"name\":{\"529\":{},\"570\":{}},\"comment\":{}}],[\"filter\",{\"_index\":277,\"name\":{\"421\":{}},\"comment\":{}}],[\"firmwareupgrade\",{\"_index\":93,\"name\":{\"117\":{}},\"comment\":{}}],[\"firmwareversion\",{\"_index\":173,\"name\":{\"248\":{}},\"comment\":{}}],[\"fixed\",{\"_index\":291,\"name\":{\"454\":{},\"501\":{}},\"comment\":{}}],[\"fixedlayout\",{\"_index\":140,\"name\":{\"183\":{}},\"comment\":{}}],[\"focallength\",{\"_index\":190,\"name\":{\"271\":{}},\"comment\":{}}],[\"focus\",{\"_index\":335,\"name\":{\"543\":{},\"616\":{}},\"comment\":{}}],[\"focusconfiguration\",{\"_index\":322,\"name\":{\"525\":{}},\"comment\":{}}],[\"focusconfiguration20\",{\"_index\":340,\"name\":{\"565\":{}},\"comment\":{}}],[\"fps\",{\"_index\":39,\"name\":{\"40\":{}},\"comment\":{}}],[\"framerate\",{\"_index\":357,\"name\":{\"627\":{}},\"comment\":{}}],[\"frameratelimit\",{\"_index\":205,\"name\":{\"301\":{},\"466\":{}},\"comment\":{}}],[\"gain\",{\"_index\":320,\"name\":{\"523\":{},\"563\":{}},\"comment\":{}}],[\"geolocation\",{\"_index\":281,\"name\":{\"428\":{}},\"comment\":{}}],[\"getactivesources\",{\"_index\":66,\"name\":{\"86\":{}},\"comment\":{}}],[\"getcapabilities\",{\"_index\":168,\"name\":{\"242\":{}},\"comment\":{}}],[\"getdeviceinformation\",{\"_index\":169,\"name\":{\"243\":{}},\"comment\":{}}],[\"gethostname\",{\"_index\":170,\"name\":{\"244\":{}},\"comment\":{}}],[\"getinstance\",{\"_index\":367,\"name\":{\"649\":{}},\"comment\":{}}],[\"getprofiles\",{\"_index\":359,\"name\":{\"636\":{}},\"comment\":{}}],[\"getservices\",{\"_index\":167,\"name\":{\"241\":{}},\"comment\":{}}],[\"getsystemdateandtime\",{\"_index\":65,\"name\":{\"85\":{},\"240\":{}},\"comment\":{}}],[\"getvideosources\",{\"_index\":360,\"name\":{\"637\":{}},\"comment\":{}}],[\"govlength\",{\"_index\":209,\"name\":{\"305\":{},\"308\":{},\"472\":{}},\"comment\":{}}],[\"guaranteedframerate\",{\"_index\":223,\"name\":{\"324\":{},\"474\":{}},\"comment\":{}}],[\"h264\",{\"_index\":228,\"name\":{\"330\":{}},\"comment\":{}}],[\"h264configuration\",{\"_index\":211,\"name\":{\"307\":{}},\"comment\":{}}],[\"h264profile\",{\"_index\":212,\"name\":{\"309\":{}},\"comment\":{}}],[\"hardwareid\",{\"_index\":175,\"name\":{\"250\":{}},\"comment\":{}}],[\"height\",{\"_index\":38,\"name\":{\"39\":{},\"258\":{},\"299\":{},\"511\":{}},\"comment\":{}}],[\"hostname\",{\"_index\":3,\"name\":{\"3\":{},\"56\":{}},\"comment\":{}}],[\"httpfirmwareupgrade\",{\"_index\":83,\"name\":{\"106\":{},\"118\":{}},\"comment\":{}}],[\"httpsupportinformation\",{\"_index\":86,\"name\":{\"109\":{}},\"comment\":{}}],[\"httpsystembackup\",{\"_index\":84,\"name\":{\"107\":{},\"119\":{}},\"comment\":{}}],[\"httpsystemlogging\",{\"_index\":85,\"name\":{\"108\":{},\"120\":{}},\"comment\":{}}],[\"imagestabilization\",{\"_index\":344,\"name\":{\"580\":{},\"608\":{}},\"comment\":{}}],[\"imaging\",{\"_index\":20,\"name\":{\"20\":{},\"231\":{},\"623\":{},\"629\":{}},\"comment\":{}}],[\"imagingcapabilities\",{\"_index\":121,\"name\":{\"153\":{}},\"comment\":{}}],[\"imagingsettings\",{\"_index\":331,\"name\":{\"537\":{}},\"comment\":{}}],[\"imagingsettings20\",{\"_index\":355,\"name\":{\"610\":{}},\"comment\":{}}],[\"imagingsettingsextension20\",{\"_index\":354,\"name\":{\"607\":{}},\"comment\":{}}],[\"imagingsettingsextension202\",{\"_index\":353,\"name\":{\"604\":{}},\"comment\":{}}],[\"imagingsettingsextension203\",{\"_index\":352,\"name\":{\"599\":{}},\"comment\":{}}],[\"inputconnectors\",{\"_index\":100,\"name\":{\"128\":{}},\"comment\":{}}],[\"instance\",{\"_index\":366,\"name\":{\"648\":{}},\"comment\":{}}],[\"intrectangle\",{\"_index\":178,\"name\":{\"254\":{}},\"comment\":{}}],[\"io\",{\"_index\":160,\"name\":{\"220\":{}},\"comment\":{}}],[\"iocapabilities\",{\"_index\":99,\"name\":{\"127\":{}},\"comment\":{}}],[\"iocapabilitiesextension\",{\"_index\":96,\"name\":{\"123\":{}},\"comment\":{}}],[\"ipaddress\",{\"_index\":213,\"name\":{\"310\":{}},\"comment\":{}}],[\"ipfilter\",{\"_index\":78,\"name\":{\"100\":{}},\"comment\":{}}],[\"ipv4address\",{\"_index\":215,\"name\":{\"312\":{}},\"comment\":{}}],[\"ipv6address\",{\"_index\":216,\"name\":{\"313\":{}},\"comment\":{}}],[\"ipversion6\",{\"_index\":80,\"name\":{\"102\":{}},\"comment\":{}}],[\"ircutfilter\",{\"_index\":336,\"name\":{\"544\":{},\"617\":{}},\"comment\":{}}],[\"ircutfilterautoadjustment\",{\"_index\":345,\"name\":{\"584\":{},\"605\":{}},\"comment\":{}}],[\"iris\",{\"_index\":321,\"name\":{\"524\":{},\"564\":{}},\"comment\":{}}],[\"itemlist\",{\"_index\":233,\"name\":{\"342\":{}},\"comment\":{}}],[\"kerberostoken\",{\"_index\":115,\"name\":{\"145\":{}},\"comment\":{}}],[\"lensdescription\",{\"_index\":189,\"name\":{\"270\":{},\"279\":{}},\"comment\":{}}],[\"lensoffset\",{\"_index\":184,\"name\":{\"263\":{}},\"comment\":{}}],[\"lensprojection\",{\"_index\":185,\"name\":{\"266\":{}},\"comment\":{}}],[\"level\",{\"_index\":308,\"name\":{\"506\":{},\"532\":{},\"551\":{},\"574\":{},\"582\":{},\"591\":{},\"595\":{},\"598\":{}},\"comment\":{}}],[\"listeningport\",{\"_index\":364,\"name\":{\"643\":{}},\"comment\":{}}],[\"major\",{\"_index\":72,\"name\":{\"92\":{},\"94\":{}},\"comment\":{}}],[\"manufacturer\",{\"_index\":171,\"name\":{\"246\":{}},\"comment\":{}}],[\"max\",{\"_index\":249,\"name\":{\"375\":{}},\"comment\":{}}],[\"maxexposuretime\",{\"_index\":314,\"name\":{\"517\":{},\"557\":{}},\"comment\":{}}],[\"maxgain\",{\"_index\":316,\"name\":{\"519\":{},\"559\":{}},\"comment\":{}}],[\"maximumnumberofprofiles\",{\"_index\":127,\"name\":{\"161\":{}},\"comment\":{}}],[\"maximumrtspurilength\",{\"_index\":153,\"name\":{\"202\":{}},\"comment\":{}}],[\"maxiris\",{\"_index\":318,\"name\":{\"521\":{},\"561\":{}},\"comment\":{}}],[\"maxstringlength\",{\"_index\":146,\"name\":{\"190\":{}},\"comment\":{}}],[\"media\",{\"_index\":22,\"name\":{\"22\":{},\"53\":{},\"232\":{},\"631\":{}},\"comment\":{}}],[\"media2\",{\"_index\":21,\"name\":{\"21\":{}},\"comment\":{}}],[\"media2support\",{\"_index\":166,\"name\":{\"239\":{}},\"comment\":{}}],[\"mediacapabilities\",{\"_index\":129,\"name\":{\"164\":{}},\"comment\":{}}],[\"mediacapabilitiesextension\",{\"_index\":128,\"name\":{\"162\":{}},\"comment\":{}}],[\"mediaprofile\",{\"_index\":305,\"name\":{\"499\":{}},\"comment\":{}}],[\"mediaprofilesource\",{\"_index\":143,\"name\":{\"187\":{}},\"comment\":{}}],[\"messageid\",{\"_index\":363,\"name\":{\"641\":{}},\"comment\":{}}],[\"metadata\",{\"_index\":302,\"name\":{\"495\":{}},\"comment\":{}}],[\"metadataconfiguration\",{\"_index\":279,\"name\":{\"423\":{},\"462\":{}},\"comment\":{}}],[\"metadatasearch\",{\"_index\":148,\"name\":{\"193\":{}},\"comment\":{}}],[\"min\",{\"_index\":248,\"name\":{\"374\":{}},\"comment\":{}}],[\"minexposuretime\",{\"_index\":313,\"name\":{\"516\":{},\"556\":{}},\"comment\":{}}],[\"mingain\",{\"_index\":315,\"name\":{\"518\":{},\"558\":{}},\"comment\":{}}],[\"miniris\",{\"_index\":317,\"name\":{\"520\":{},\"560\":{}},\"comment\":{}}],[\"minor\",{\"_index\":71,\"name\":{\"91\":{},\"95\":{}},\"comment\":{}}],[\"mode\",{\"_index\":182,\"name\":{\"260\":{},\"276\":{},\"390\":{},\"393\":{},\"505\":{},\"513\":{},\"531\":{},\"534\":{},\"550\":{},\"553\":{},\"573\":{},\"577\":{},\"581\":{},\"590\":{},\"594\":{}},\"comment\":{}}],[\"model\",{\"_index\":172,\"name\":{\"247\":{}},\"comment\":{}}],[\"moveramp\",{\"_index\":261,\"name\":{\"402\":{}},\"comment\":{}}],[\"mpeg4\",{\"_index\":227,\"name\":{\"329\":{}},\"comment\":{}}],[\"mpeg4configuration\",{\"_index\":208,\"name\":{\"304\":{}},\"comment\":{}}],[\"mpeg4profile\",{\"_index\":210,\"name\":{\"306\":{}},\"comment\":{}}],[\"multicast\",{\"_index\":229,\"name\":{\"331\":{},\"340\":{},\"433\":{},\"485\":{}},\"comment\":{}}],[\"multicastconfiguration\",{\"_index\":217,\"name\":{\"314\":{}},\"comment\":{}}],[\"mutlicast\",{\"_index\":295,\"name\":{\"478\":{}},\"comment\":{}}],[\"name\",{\"_index\":41,\"name\":{\"44\":{},\"253\":{},\"286\":{},\"294\":{},\"322\":{},\"335\":{},\"345\":{},\"350\":{},\"361\":{},\"400\":{},\"425\":{},\"439\":{},\"446\":{},\"455\":{},\"470\":{},\"482\":{},\"502\":{}},\"comment\":{}}],[\"namespace\",{\"_index\":69,\"name\":{\"89\":{}},\"comment\":{}}],[\"nearlimit\",{\"_index\":325,\"name\":{\"528\":{},\"569\":{}},\"comment\":{}}],[\"network\",{\"_index\":158,\"name\":{\"218\":{}},\"comment\":{}}],[\"networkcapabilities\",{\"_index\":77,\"name\":{\"99\":{}},\"comment\":{}}],[\"networkcapabilitiesextension\",{\"_index\":74,\"name\":{\"96\":{}},\"comment\":{}}],[\"nodetoken\",{\"_index\":264,\"name\":{\"405\":{}},\"comment\":{}}],[\"noisereduction\",{\"_index\":351,\"name\":{\"597\":{},\"602\":{}},\"comment\":{}}],[\"nonce\",{\"_index\":60,\"name\":{\"79\":{}},\"comment\":{}}],[\"offset\",{\"_index\":191,\"name\":{\"272\":{}},\"comment\":{}}],[\"onboardkeygeneration\",{\"_index\":111,\"name\":{\"141\":{}},\"comment\":{}}],[\"onvif\",{\"_index\":43,\"name\":{\"46\":{},\"237\":{},\"633\":{}},\"comment\":{}}],[\"onvifoptions\",{\"_index\":0,\"name\":{\"0\":{}},\"comment\":{}}],[\"onvifrequestoptions\",{\"_index\":27,\"name\":{\"27\":{}},\"comment\":{}}],[\"onvifservice\",{\"_index\":68,\"name\":{\"88\":{}},\"comment\":{}}],[\"onvifservices\",{\"_index\":13,\"name\":{\"13\":{}},\"comment\":{}}],[\"onvifversion\",{\"_index\":73,\"name\":{\"93\":{}},\"comment\":{}}],[\"orientation\",{\"_index\":195,\"name\":{\"277\":{}},\"comment\":{}}],[\"outputlevel\",{\"_index\":287,\"name\":{\"443\":{}},\"comment\":{}}],[\"outputtoken\",{\"_index\":285,\"name\":{\"441\":{}},\"comment\":{}}],[\"pantilt\",{\"_index\":245,\"name\":{\"366\":{}},\"comment\":{}}],[\"pantiltlimits\",{\"_index\":253,\"name\":{\"380\":{},\"414\":{}},\"comment\":{}}],[\"parameters\",{\"_index\":238,\"name\":{\"352\":{}},\"comment\":{}}],[\"parseurl\",{\"_index\":64,\"name\":{\"84\":{}},\"comment\":{}}],[\"passdigest\",{\"_index\":59,\"name\":{\"78\":{}},\"comment\":{}}],[\"password\",{\"_index\":5,\"name\":{\"5\":{},\"58\":{}},\"comment\":{}}],[\"passworddigest\",{\"_index\":58,\"name\":{\"76\":{}},\"comment\":{}}],[\"path\",{\"_index\":7,\"name\":{\"7\":{},\"60\":{}},\"comment\":{}}],[\"port\",{\"_index\":6,\"name\":{\"6\":{},\"59\":{},\"316\":{}},\"comment\":{}}],[\"position\",{\"_index\":275,\"name\":{\"419\":{}},\"comment\":{}}],[\"preserveaddress\",{\"_index\":11,\"name\":{\"11\":{},\"63\":{}},\"comment\":{}}],[\"presetramp\",{\"_index\":262,\"name\":{\"403\":{}},\"comment\":{}}],[\"presettourramp\",{\"_index\":263,\"name\":{\"404\":{}},\"comment\":{}}],[\"priority\",{\"_index\":311,\"name\":{\"514\":{},\"554\":{}},\"comment\":{}}],[\"probe\",{\"_index\":368,\"name\":{\"651\":{}},\"comment\":{}}],[\"profile\",{\"_index\":290,\"name\":{\"452\":{},\"473\":{}},\"comment\":{}}],[\"profilecapabilities\",{\"_index\":126,\"name\":{\"160\":{},\"163\":{}},\"comment\":{}}],[\"profileextension\",{\"_index\":289,\"name\":{\"448\":{}},\"comment\":{}}],[\"profiles\",{\"_index\":358,\"name\":{\"634\":{}},\"comment\":{}}],[\"profiletoken\",{\"_index\":34,\"name\":{\"35\":{}},\"comment\":{}}],[\"projection\",{\"_index\":192,\"name\":{\"273\":{}},\"comment\":{}}],[\"ptcontroldirection\",{\"_index\":256,\"name\":{\"387\":{},\"396\":{}},\"comment\":{}}],[\"ptz\",{\"_index\":14,\"name\":{\"14\":{},\"31\":{},\"42\":{},\"233\":{},\"494\":{}},\"comment\":{}}],[\"ptzcapabilities\",{\"_index\":131,\"name\":{\"168\":{}},\"comment\":{}}],[\"ptzconfiguration\",{\"_index\":260,\"name\":{\"398\":{},\"461\":{}},\"comment\":{}}],[\"ptzconfigurationextension\",{\"_index\":259,\"name\":{\"395\":{}},\"comment\":{}}],[\"ptzfilter\",{\"_index\":273,\"name\":{\"417\":{}},\"comment\":{}}],[\"ptzspeed\",{\"_index\":244,\"name\":{\"365\":{}},\"comment\":{}}],[\"ptzstatus\",{\"_index\":283,\"name\":{\"430\":{}},\"comment\":{}}],[\"quality\",{\"_index\":225,\"name\":{\"327\":{},\"479\":{}},\"comment\":{}}],[\"radius\",{\"_index\":187,\"name\":{\"268\":{}},\"comment\":{}}],[\"range\",{\"_index\":247,\"name\":{\"373\":{},\"381\":{},\"386\":{}},\"comment\":{}}],[\"ratecontrol\",{\"_index\":226,\"name\":{\"328\":{},\"477\":{}},\"comment\":{}}],[\"rawrequest\",{\"_index\":44,\"name\":{\"47\":{},\"82\":{}},\"comment\":{}}],[\"rawresponse\",{\"_index\":45,\"name\":{\"48\":{}},\"comment\":{}}],[\"realtimestreamingcapabilities\",{\"_index\":122,\"name\":{\"155\":{}},\"comment\":{}}],[\"receiver\",{\"_index\":23,\"name\":{\"23\":{},\"214\":{},\"498\":{}},\"comment\":{}}],[\"receivercapabilities\",{\"_index\":150,\"name\":{\"196\":{}},\"comment\":{}}],[\"receiversource\",{\"_index\":142,\"name\":{\"186\":{}},\"comment\":{}}],[\"recording\",{\"_index\":24,\"name\":{\"24\":{},\"211\":{}},\"comment\":{}}],[\"recordingcapabilities\",{\"_index\":141,\"name\":{\"184\":{}},\"comment\":{}}],[\"rectangle\",{\"_index\":309,\"name\":{\"507\":{}},\"comment\":{}}],[\"referencetoken\",{\"_index\":177,\"name\":{\"252\":{}},\"comment\":{}}],[\"relayoutputs\",{\"_index\":101,\"name\":{\"129\":{},\"176\":{}},\"comment\":{}}],[\"reltoken\",{\"_index\":116,\"name\":{\"146\":{}},\"comment\":{}}],[\"remotediscovery\",{\"_index\":90,\"name\":{\"114\":{}},\"comment\":{}}],[\"remoteuserhandling\",{\"_index\":105,\"name\":{\"134\":{}},\"comment\":{}}],[\"replay\",{\"_index\":25,\"name\":{\"25\":{},\"213\":{}},\"comment\":{}}],[\"replaycapabilities\",{\"_index\":149,\"name\":{\"194\":{}},\"comment\":{}}],[\"request\",{\"_index\":63,\"name\":{\"83\":{}},\"comment\":{}}],[\"resolution\",{\"_index\":224,\"name\":{\"326\":{},\"476\":{},\"628\":{}},\"comment\":{}}],[\"resolve\",{\"_index\":362,\"name\":{\"640\":{}},\"comment\":{}}],[\"responsetime\",{\"_index\":348,\"name\":{\"587\":{}},\"comment\":{}}],[\"reverse\",{\"_index\":258,\"name\":{\"391\":{}},\"comment\":{}}],[\"rotate\",{\"_index\":181,\"name\":{\"259\":{},\"282\":{}},\"comment\":{}}],[\"rtp_multicast\",{\"_index\":151,\"name\":{\"198\":{}},\"comment\":{}}],[\"rtp_rtsp_tcp\",{\"_index\":125,\"name\":{\"158\":{},\"200\":{}},\"comment\":{}}],[\"rtp_tcp\",{\"_index\":124,\"name\":{\"157\":{},\"199\":{}},\"comment\":{}}],[\"rtpmulticast\",{\"_index\":123,\"name\":{\"156\":{}},\"comment\":{}}],[\"rule\",{\"_index\":242,\"name\":{\"357\":{}},\"comment\":{}}],[\"ruleengineconfiguration\",{\"_index\":241,\"name\":{\"356\":{},\"364\":{}},\"comment\":{}}],[\"rulesupport\",{\"_index\":155,\"name\":{\"205\":{},\"225\":{}},\"comment\":{}}],[\"samltoken\",{\"_index\":114,\"name\":{\"144\":{}},\"comment\":{}}],[\"samplerate\",{\"_index\":232,\"name\":{\"339\":{},\"487\":{}},\"comment\":{}}],[\"scdlcapabilities\",{\"_index\":138,\"name\":{\"180\":{}},\"comment\":{}}],[\"sceneorientation\",{\"_index\":194,\"name\":{\"275\":{},\"280\":{}},\"comment\":{}}],[\"search\",{\"_index\":26,\"name\":{\"26\":{},\"212\":{}},\"comment\":{}}],[\"searchcapabilities\",{\"_index\":147,\"name\":{\"191\":{}},\"comment\":{}}],[\"secureoptions\",{\"_index\":2,\"name\":{\"2\":{},\"55\":{}},\"comment\":{}}],[\"security\",{\"_index\":161,\"name\":{\"221\":{}},\"comment\":{}}],[\"securitycapabilities\",{\"_index\":108,\"name\":{\"138\":{}},\"comment\":{}}],[\"securitycapabilitiesextension\",{\"_index\":106,\"name\":{\"135\":{}},\"comment\":{}}],[\"securitycapabilitiesextension2\",{\"_index\":102,\"name\":{\"131\":{}},\"comment\":{}}],[\"sendprimacy\",{\"_index\":286,\"name\":{\"442\":{}},\"comment\":{}}],[\"serialnumber\",{\"_index\":174,\"name\":{\"249\":{}},\"comment\":{}}],[\"service\",{\"_index\":28,\"name\":{\"28\":{}},\"comment\":{}}],[\"services\",{\"_index\":165,\"name\":{\"238\":{}},\"comment\":{}}],[\"sessiontimeout\",{\"_index\":230,\"name\":{\"332\":{},\"341\":{},\"434\":{}},\"comment\":{}}],[\"setupsystemdateandtime\",{\"_index\":62,\"name\":{\"81\":{}},\"comment\":{}}],[\"shapepolygon\",{\"_index\":282,\"name\":{\"429\":{}},\"comment\":{}}],[\"sharpness\",{\"_index\":337,\"name\":{\"545\":{},\"618\":{}},\"comment\":{}}],[\"simpleitem\",{\"_index\":234,\"name\":{\"343\":{}},\"comment\":{}}],[\"sourcetoken\",{\"_index\":33,\"name\":{\"34\":{},\"289\":{},\"296\":{}},\"comment\":{}}],[\"space1ddescription\",{\"_index\":254,\"name\":{\"382\":{}},\"comment\":{}}],[\"space2ddescription\",{\"_index\":250,\"name\":{\"376\":{}},\"comment\":{}}],[\"status\",{\"_index\":274,\"name\":{\"418\":{}},\"comment\":{}}],[\"streamingcapabilities\",{\"_index\":130,\"name\":{\"166\":{}},\"comment\":{}}],[\"subscriptionpolicy\",{\"_index\":278,\"name\":{\"422\":{}},\"comment\":{}}],[\"supportedeapmethod\",{\"_index\":104,\"name\":{\"133\":{}},\"comment\":{}}],[\"supportedreceivers\",{\"_index\":152,\"name\":{\"201\":{}},\"comment\":{}}],[\"supportedversions\",{\"_index\":94,\"name\":{\"121\":{}},\"comment\":{}}],[\"system\",{\"_index\":159,\"name\":{\"219\":{}},\"comment\":{}}],[\"systembackup\",{\"_index\":91,\"name\":{\"115\":{}},\"comment\":{}}],[\"systemcapabilities\",{\"_index\":87,\"name\":{\"111\":{}},\"comment\":{}}],[\"systemcapabilitiesextension\",{\"_index\":82,\"name\":{\"105\":{}},\"comment\":{}}],[\"systemlogging\",{\"_index\":92,\"name\":{\"116\":{}},\"comment\":{}}],[\"telexcapabilities\",{\"_index\":137,\"name\":{\"179\":{}},\"comment\":{}}],[\"timeout\",{\"_index\":8,\"name\":{\"8\":{},\"61\":{},\"639\":{}},\"comment\":{}}],[\"timeshift\",{\"_index\":50,\"name\":{\"66\":{}},\"comment\":{}}],[\"timestamp\",{\"_index\":61,\"name\":{\"80\":{}},\"comment\":{}}],[\"tls1.0\",{\"_index\":107,\"name\":{\"136\":{}},\"comment\":{}}],[\"tls1.1\",{\"_index\":109,\"name\":{\"139\":{}},\"comment\":{}}],[\"tls1.2\",{\"_index\":110,\"name\":{\"140\":{}},\"comment\":{}}],[\"token\",{\"_index\":42,\"name\":{\"45\":{},\"285\":{},\"293\":{},\"321\":{},\"334\":{},\"360\":{},\"399\":{},\"424\":{},\"438\":{},\"445\":{},\"453\":{},\"469\":{},\"481\":{},\"500\":{},\"626\":{}},\"comment\":{}}],[\"tonecompensation\",{\"_index\":349,\"name\":{\"589\":{},\"600\":{}},\"comment\":{}}],[\"transmittance\",{\"_index\":188,\"name\":{\"269\":{}},\"comment\":{}}],[\"ttl\",{\"_index\":219,\"name\":{\"317\":{}},\"comment\":{}}],[\"type\",{\"_index\":214,\"name\":{\"311\":{},\"351\":{},\"644\":{}},\"comment\":{}}],[\"uri\",{\"_index\":49,\"name\":{\"65\":{},\"377\":{},\"383\":{}},\"comment\":{}}],[\"url\",{\"_index\":30,\"name\":{\"30\":{}},\"comment\":{}}],[\"urn\",{\"_index\":9,\"name\":{\"9\":{},\"72\":{}},\"comment\":{}}],[\"usecount\",{\"_index\":199,\"name\":{\"287\":{},\"295\":{},\"323\":{},\"336\":{},\"362\":{},\"401\":{},\"426\":{},\"440\":{},\"447\":{},\"471\":{},\"483\":{}},\"comment\":{}}],[\"username\",{\"_index\":4,\"name\":{\"4\":{},\"57\":{}},\"comment\":{}}],[\"usesecure\",{\"_index\":1,\"name\":{\"1\":{},\"54\":{}},\"comment\":{}}],[\"value\",{\"_index\":235,\"name\":{\"346\":{}},\"comment\":{}}],[\"videoanalyticsconfiguration\",{\"_index\":243,\"name\":{\"359\":{},\"460\":{}},\"comment\":{}}],[\"videoencoder\",{\"_index\":300,\"name\":{\"491\":{}},\"comment\":{}}],[\"videoencoder2configuration\",{\"_index\":294,\"name\":{\"468\":{}},\"comment\":{}}],[\"videoencoderconfiguration\",{\"_index\":222,\"name\":{\"320\":{},\"458\":{}},\"comment\":{}}],[\"videooutputs\",{\"_index\":134,\"name\":{\"173\":{}},\"comment\":{}}],[\"videoratecontrol\",{\"_index\":204,\"name\":{\"300\":{}},\"comment\":{}}],[\"videoratecontrol2\",{\"_index\":292,\"name\":{\"464\":{}},\"comment\":{}}],[\"videoresolution\",{\"_index\":203,\"name\":{\"297\":{}},\"comment\":{}}],[\"videosource\",{\"_index\":298,\"name\":{\"489\":{},\"625\":{}},\"comment\":{}}],[\"videosourceconfiguration\",{\"_index\":198,\"name\":{\"284\":{},\"456\":{}},\"comment\":{}}],[\"videosourceconfigurationextension\",{\"_index\":197,\"name\":{\"281\":{}},\"comment\":{}}],[\"videosourceconfigurationextension2\",{\"_index\":196,\"name\":{\"278\":{}},\"comment\":{}}],[\"videosourceconfigurationtoken\",{\"_index\":35,\"name\":{\"36\":{}},\"comment\":{}}],[\"videosourceextension\",{\"_index\":356,\"name\":{\"622\":{}},\"comment\":{}}],[\"videosources\",{\"_index\":133,\"name\":{\"172\":{},\"635\":{}},\"comment\":{}}],[\"viewmode\",{\"_index\":200,\"name\":{\"288\":{}},\"comment\":{}}],[\"warn\",{\"_index\":46,\"name\":{\"49\":{}},\"comment\":{}}],[\"whitebalance\",{\"_index\":328,\"name\":{\"533\":{},\"547\":{},\"620\":{}},\"comment\":{}}],[\"whitebalance20\",{\"_index\":343,\"name\":{\"575\":{}},\"comment\":{}}],[\"widedynamicrange\",{\"_index\":327,\"name\":{\"530\":{},\"546\":{},\"619\":{}},\"comment\":{}}],[\"widedynamicrange20\",{\"_index\":342,\"name\":{\"572\":{}},\"comment\":{}}],[\"width\",{\"_index\":37,\"name\":{\"38\":{},\"257\":{},\"298\":{},\"510\":{}},\"comment\":{}}],[\"window\",{\"_index\":312,\"name\":{\"515\":{},\"555\":{}},\"comment\":{}}],[\"wspausablesubscriptionmanagerinterfacesupport\",{\"_index\":120,\"name\":{\"152\":{}},\"comment\":{}}],[\"wspullpointsupport\",{\"_index\":119,\"name\":{\"151\":{}},\"comment\":{}}],[\"wssubscriptionpolicysupport\",{\"_index\":118,\"name\":{\"150\":{}},\"comment\":{}}],[\"x\",{\"_index\":179,\"name\":{\"255\":{},\"264\":{},\"368\":{},\"372\":{},\"508\":{}},\"comment\":{}}],[\"x.509token\",{\"_index\":113,\"name\":{\"143\":{}},\"comment\":{}}],[\"xaddr\",{\"_index\":70,\"name\":{\"90\":{},\"149\":{},\"154\":{},\"165\":{},\"169\":{},\"171\":{},\"182\":{},\"185\":{},\"192\":{},\"195\":{},\"197\":{},\"204\":{},\"208\":{},\"217\":{},\"224\":{}},\"comment\":{}}],[\"xfactor\",{\"_index\":193,\"name\":{\"274\":{}},\"comment\":{}}],[\"xrange\",{\"_index\":251,\"name\":{\"378\":{},\"384\":{}},\"comment\":{}}],[\"y\",{\"_index\":180,\"name\":{\"256\":{},\"265\":{},\"369\":{},\"509\":{}},\"comment\":{}}],[\"yrange\",{\"_index\":252,\"name\":{\"379\":{}},\"comment\":{}}],[\"zeroconfiguration\",{\"_index\":79,\"name\":{\"101\":{}},\"comment\":{}}],[\"zoom\",{\"_index\":246,\"name\":{\"370\":{}},\"comment\":{}}],[\"zoomlimits\",{\"_index\":255,\"name\":{\"385\":{},\"415\":{}},\"comment\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA8SdW5MbN5Lvv4v6Vatl4V7z5rU8O47jsRWWZs6cndhwUN2lFsdskstLW/LE+e6nCmCxgaw/UFlFTpwHhyURyMyqStzylwD++Wq//e3w6g9//+erX1ebh1d/EIvaVlq8frVZPjWv/vDqm83Xv/z8/avXr077dfvX49ddc/j38I9vPh+f1u0v9+vl4dC0Ql69+r+vc3J+bj41+2Zz33zY/tpsiLz0x0lyf+z+l0rr/qksQ5tL/Z82z6tPP+2Oq+3mcJGz2hyb/aflfSss/r0otFoIdZF6OjTvm/vTvmGJvIuLR8Jfv9ot29dypGZmlB68iCnPckerzFf+eXs4buJvUdQblZ6vsn1re77KqPR8lbu24m/b/QNPZVT6CpXb/ZGpLpS85umOn7lP5kvOV3VcPTXbE/PBXgpf4Sz7DdNPfMH5ipaPXVmWqr7oFV9s37Ru/dx88/DQ/onZ6IeVrnja03H77Xazae65z5xUmKR40G2/b59i1arJau4L8Dvudx/+iyftLpQsPMDFutyr2yzXX4+r+8PbpivHVDusdYUJD1M0P9xM4fc/TVLpi1+jdHXYrZdfuTovpa9Q2Ty3hZl+eXcpfIXC1dPycbV5ZGp8KX2FyqfmYbUUTI2XwtcqnKLvOnX75r5ZPTd7psao+HVK2wkD/0vG5a9SO6GFXApfofDQLPf3+clGqvBSeJrCwXjxc/M/p+ZwHJshp8X4Y8chmDBF7t1LncKzEbsz6j9uH/JfEOk+V7hacadxit5Q/mq1u+Pvk9SG8nPUxo70zf2xbeXvt6c9/tLx7xNcx5dPl8YloXdpBfxQianZCeT202o9RTOpMV/18+qh2YYi7YTw0+rxtF92b36CLWMi5hvXbO63uW54aEdUer7K31YPePk11NcXna/sc7N6/Ayn7ENtl7Lz1X3awe52qCsUnK/o4+rYugCvZd69FL6iAeFeCLSbQveTUWS0li89zy+/dOEttrI3l/LjOt90xmUeMBdhKSl9Uwy0UM29pblQwYS+6cWCI7sLwCbEff775vj+6+HYPL1tveWbzcOH1VMpzFYozh8RHtq6XcU5Cu6iyvj5S080YtCHjBOyjfpQ8spZhn1ddx3U++Vz2wXP+iJ3Qxk3M68LXv2+3cx7Z1HlqwwSLp0JX4w5Sw2zJr537pe/nWdLBUl3SanCxKuo5bBrn6UZVXMpNkPPb8soOAgUnH+fIbnZ77f7kui+AE+2rl7Ax337vMf96f5YVpAWm/EIJEYEVHACQ7w1PRDOWMhzhmYgeXQ9wIc7QDoT6UxjOUDPBILDRjdADQ/YsEkNfmEMPsMGM+iDs3AMi8Mg6aP0hYVdoN1jsIVLWYBwFlvhsQ4gnUE4pqIN9IKmAI18FGNVdE//8wy598vd8uNqvTqumuJDkHKzeupPy9P6+C4s0IvKhkWv1sdXN9PXUOAFuVxabpYnFGcDo4BwBH5sPm33Tz5MMT6opoV5OsVCvcz29oxZ2sQpWiL/Ecw/S8oy5WdoPkzUnCk/Q/M94Z141jVOOEuh6r82+0PsITTAef6dP2N/Wv5jm0cZsbi7vmjB9N68nLLVhq3sXHSSsvh1/dgc20H912+j7vO7L8dmk3t9pfITlufbY1UlMcdZuu6gHPwuig+aW39c9Sbu4upXGTXywZjW8T/P9+/+uFofMbvLCb6LKrEfNmfA781+O8c9giWo9tUmff/u3JDMxLcSVbvaiIevm7c/vp9kwKXK9crnNtpbtNWSUX9LpE5qDne4/tVm9Qu+P+63T2//9O27STaBylcb9OOHaTaE8ler7cx/ntZiLlWuVj61+76i186Fvv2UiT24ForzO+/Px+Puj6v902+tuX/ZPe6XDzh4OqLrDsvJxFELz1kwM1T7j+X9r6fdbBuJkH+BgT9sH3PZQRMsfJFyWxNPuy52gtZFk+1Eom5mbLE1jto33ip5JpVbJ8+0CfPc1eF++9zsv/7cHLbrZ2ZDvGTS0brcBx815z++zjMl1LvWjH3ztD02b3uhUywZVr3WmMPkPui8IJ7X7ZTNmNTTxHZM71yyuQZzho5z9sHs0eLmY9kthrDbjlxXD1g3HqeuH56yrhyGkebhvPKZ0qveoco3eUMzh8kbjY7Zd3Xc7pePzeiqKvu6cP1rzXpafnkPJE/6kgUZ15r32Gx/2N57cd9tjvtpA/cdrH2tSd3GjP9stlPseKlyIy/qUkMO7/sGNMONBgJuNuH4cXucZVhOwLWGbc5LOO+Zc40rCbnWwI7nXmddVsLVrv7wMLEruNS4VvVlFTBJfVJrhgnxmuH7n9ir+UxR/uphefrSVl7iGXJJ+l1cEz9w7jnGTPl2+/S03DzA988zKZJwE9OK68qiSeNrynFT8r4xbg7fE1ab3el43ve33XNF3w2rcR4zv2xbL7/+dDq2MtkWkDrXqJ/wned93mz66v1pvzp+hZ4AN3CVa0yjZH+bqeCur5xLfCw+1NjM/rtv3v25OX7e4gGJYR2UdEtTQ6DgL+0Y+Ke2s1nnlkUMU6GkK01l+9dko/ne9eGH99WbxTwFd13lXxbzXsS8AOG4TYwQIdOssc/DNfBf9TFmf4Oi+mqG+up26tldaaQ+vyV2ivrt5uN2uX/4X83X/2w2TWERnjUmI+F605b3reLDu+16df81TOanGQbrX2/WOSPtm0j6NLuwgBsYNmXInDtQ3n7MuclIkzPrb2/0os5uC8yb87dfonrXm/H+mz//MMOKuNr1Rvza7D82++1hhiG06vXG9DnbM4yhVa83pgtxvl09xtmOLEuSeteb8fN3c5wkqnW9CcO56bQBH0xuS1ui+IY9Lb90ncNEa6JaNzOhOyPsh2bziHfcjtqSVL+JUe/OmxNmGjWofgMvOpf1g9vUOeMdqH3T9/SnVRfynThow/rXmzV53n/NdD8zy/+uO0RmbIo/KMSf3/+t21zBl3nXl8cPNrQ2o/Z/v39/+ni436/8BqcwzzqHgicYU5ZytYnvTuv1u21rxhzLQOXrDVqeDsuP6yZ+6j8vN8vHZv99b9IsWyfJnf4YSSwynFE0GpAcFruBU+ekjrg1shk/3c/Nct3tQHh/3DfLJ8ZzFivwn/jnD+/+3C5bVvdLPE0aV3NHROA3UX6+vHG/fMCppjy7zrVvbNLPH95fa1ck4obGFccdhmXjAxDXrNi1z7u8xhwaFJuym+XL6un09OPpqV3R/PRpsOWNoecuLwO/C/Rc+A38uduzzI6G5kvz38eO985HVN1hMfh1FB6S+VZYFt6gM8cyR7ryobXZ1AVmD54xI1f/SrOKfUPGlPH+oKQ+6QM+/Ndo+0+L3OA7I4kjX5naiZ/m7fkYyrFHQuVu8FxZsSMPB83OKI9O0pr2aHek5o1MKVDaEVPGWO0UU5anh9W8t0Jq3siUWW+F1LzelDGMnjeFBdOnmFJOp8kbwkioGTGDezYXx4axo7qgjOgRcqc/NOvmy+w+a2jfGyRwlsUjJ34d7h/Wt7QbyLuR2ckoEQ4OHjV8WOwWY0RG6tgQAWzOptV/aR5+WH7NnNqeNSCtN8eMdN18Pu92fL0MCt7gRefljrxqbHm2iw2HCefPGS3YMah8A4P8MUznFdAso6CAGxj28LX9w+r+UmeiM9yh+rcz68N+ef/rTJMudW/x+bpU9n1bOI8XSt9uUHueSWlWSnem81grHpa6QRPOCB1pv8DgbFs5Lh+Wx+X77BnXOQsGNWeYkvaWnBFpWOom/eSc8QgYnB0HfB/HGAYG5W4zCmCx44PA0OxC6HEkVpszgla9jTHZEGjJjHLQc5oB5UBsyQpG/JVvyoWO95Wmed4drH+9Wed4Zveof/n5+2JHnzEsI2GWacmZ6emdJWNttlD8Bk13TPpICy49S24yd1qXaNuoQWn9m5lVjBCOGjUeK+SZFPsJO2R+ZbQ86xuF0HjZK8bi4OgcOHgJTsGC0ctwphmRvxSnZMPI5TiTTCjedVIwYvzOk0lm5K8iKdgwciXJxPcw40uMXMIy9UNkb7opf4fyjTeTjGBch1WwhXst1hRgxRut/iWD1Lyxid/3nzd+TlH9UuVa5eHAhym6LzWuVY073ZzaQl874WnPOVyTnvelzrXqORHyK+LjU2Z/7Hnfv2rGN3uud8tZ3pXzOxYr6gv/efsw26qskHkG5uZ5Y/38hM3GvQUskXdx8fGxojyX42kcOSef1Zqz9wqCNly+VpCjrnCr4FDf2KWC7DAzT135YgCOsszVPUNVpZsCrl5pzVlaMdrYn85HMI6cFwOK8Vvcp8LZkDnBd5/GzoREluemMd3/pig/V7hacfGLZrWPf9iyCSAnpfx1B4WmZNhtTq2Q42mP1wVY9B2pVsSs46/5afvQwLsFc9rP5a9U2x8DVjiEO2PAsOaVphya/Wq5DjmKE+wg1a404vNy/9A91fdwt3zGhKTSdAMSVnS/zdw51f3A9+lDV/xt86ks6i4qluEv3p6Sku8zCxyq5fvSsoaqSZIpV4f7sWkULTNhKsU5LAWKn3BKyuARSh3d+XpX3mIcFOY/++jSOCeduUJGTzJ76Zi1hbmCnGLMyKo9bwpn8T7BkKfWb2aYca52IyNYLWTEIn5T4ZgHjti/7MnpulhkICo3oaVkZl9ZqeXpFzQ6NyL9Rq8FYumPq11vxJ8//GWa+lBhluLS1z2fj9SOn++b4zGzXhutNGV0OG5/bB63x9XYGfoj2u6GkngvZ/jEuU5r1+Az55gG9vVvbNbDabduvlxh10XA9YaVPOuH1QYOhKjcBP95eFr1hrAa8EX8Ha3Ke3z/GBlj2inWfp4tpOb1ply05q5YzdtCq84yJt3E1fjEze/fPatCVwuKTfGDyXLvliP9N7I7u2eqK5rPk8jaQCrOMSTZ6NqWGD0+d1Bo2kp+CVfRWOjdpUJmk+vA3ozidete3Tm1U3THda5UX4pOZbSPxqbYyicqvo3SZtNtzobjXUbvS43pqqkP094lZwYtx/fkkeeDglmPODA9Y8B99gCrvP778qFVI+ozfbLh9cnmX9Qnm7l9srldn2yu6pOBIcSfDadPNjP75O5Us93x5+2pFfbNw3OD6RxWcAcrZ73L3KDrQFYw2hVPdaGrRHrHukqe0uKgiNSOD4o8xWODItLNGhR56kcGRaSdMyjylf/8zUTVvsK13l08eTfj3+OH7xbU086EOTgOyt1qcMSCWY34JoNjRv/44FhSn4SJu8v53r3/X+2KDIbiXn7mv9JfGxx6JbLuQrlM6C6yKzfotfV2n/fLA95ASrUlxWcrLTaJgc7xxoBVDr7Q5USrscE1X3rCymeLb9sZkX13rld4UPwYucF+/bhtC3/GwfMRW+LKtzKo/UxzTAnVbmVE9qDTMTPKx51ON2S8JRSMYTaMMYMG7YTXPma2i/fvv387QebduXzh+XhzrlJznNUMmc1vtcR4JqO3r3Ct4t1+tc3iu4zuqM616ov0MKN+HBuW1JdCyZw7uYeF+T49OXhKEsjnRVDHt1lsj3KGNedqtzOigmejj1tR5c9Hn2wG5zbbnCnsO22L5pQclGMU3x2PuSOA8Tz4WDz7lzsDLywB5k3/uYpXTL7cN7VP+TvDuCrXTDT1soK+WmUXquOrPJe+WmXp7umhytFrp8edaEornds4Y+XCkVyfi+KzrHMeRbHx6UrEC9HDcX/qbgwqibpLy5UyL+IuxIhKJfl5XYFDUVFUiKllmBQtaBY/UkRLznymLu9s5In6Ile9NZjNVXiBE87wyeuO75FHukr3xo/Jfvvj+6Ls8Ps82Zvmt7QNlV8ZLM7VvFAvbfKxOYa75d4uj803m4fuONCi5kyFOboPU3VnKsx9bk7jTsvN1MRuCcOyMzXm88czalGFmbr7LPcxlVG5uV9wvCuLS831UUaHeaWWFy+b4iq4yqyn9K3q5+bjdlsegkjBmc861klfisz8YmPyD9fI7xrLyEBwKTL3/TRTxoJMBa7uGGVsjj8398fl5nGNEUb0O3+xBDPhBqLu8vluiVkZJfgO0oGSwoWjDCW/rR4wuB4q6ovOV/a5WT1+xuB4oO1SdpK65MSl7bEdU5G28Mv1YflITjn2dzYluyXzcd+MKriUmqOifPB6pIVxwjpVFL/zH9rKP336dMBM6+XXK5saEVRoaJFBU5oZVZBvZFABfSXv9tt/hHTWnLKXEhNyMnKdGhB41xfOP0VkZEbhfvmwOsHINNJ4KX2NyuN+uTk8rY5tS8cRL6SZVppoAP16b5vL3SE5C6IiE3ajdhkS+dQhJPcurZN/sNjmXCJxsZ0ONF+KX6V0N9oSBoqTKlcp/9sfl0mMZUzzS/mpatPNgM2m+Wm/auvk77kkZa4fm6DE8ig1MDTnODOe5S6tNNmA+IX+9eUA9wTslK+IHq/Ff+nr8V6Bqe5uKAq/G8ZDZ/d3jvsf11og6wbmTvq4s8znf9p9dtbIU3J3ETDzxcyawjFtG5/dTTGP89mmGHsDWFUUPQKtso8wcTdh2YZieGiqCadDW+60gYN42Yyo5m1MeV41v/05MxaVTYlq3saUgy+avdO0bE1a+TYGfWzfNN5wW7blUu82ZszqQa7tODL9xTcv142M9he5sjfoL4qiR/qL7CNM7C/KNhT7i6kmlPqLshmj/cVUU0YaadkaTiNlGDQYwH5uDtv1qThuvRThu182yIYkjsTZqJ2TQ21Q50i0La90+ArbyU/7vo/7LdwwQMtMWC3v2/93NX9YtUt7tuy7Qb3SI0bGZ1NW7rfdUa4+MP2Md0VgQ0DN60z5uDrup78PUmuyCcmhLrvmcXwr6LAU/6s/bp/zEZKM4Lu4En4+YHhufd2VPF8DMsUGUm+GGcnhaMKMv+dBoRu9ZiyX8ZaHVmfUdwUL7zhjQFprugmJJ/eXD4x7Myx5kw2LBdGjexYzD5ALw2WO1yxZUEzRmab+w4cfpmoPVW6hvDvD4/1xOf0FxBVnGiIWta30S+bXW+po3XVdh39/y/GqwdD7XTfANHve+hsVvtUCPCubswKHTzFnCZ63YnwNPsWI0UV43hDeKnyKMY+n5X7Z6m8e/tjPe2bYhaXcyMR+HjTDrqjqjYzZj8/48+YklW9k0P+cluvMHogRa15q3urdMKbyhZeT1L6RSX9+991/wpTmEWP6ejcyo5tVzLDiXO1GRjyVrloaseRp9K6lyea0IroAUZfAmLlxccSmgYD5hg0iTdyhMVv4VrGmuUNj/inmRJtmDo2TjRiNN10xNE42pjTujBgzOu5MNua8Cp9hy0vNG5lyWD7t1tmZwog1SeUbGVTs2EbsGe/Ypr+f0Y5t7B3xOjaOYUlq47F5+mGF31L/G7/bOqy6D5k7BjiRd5eUzeTn9ca9qONeQJ3TNXbp9KVeZN7EznFE9Zti7wj0j1wb/bxcn2bZ0Ve8lSHNunlq6/K+flqY/fknnG+Sqhs/1mSoLLm8w7clpCj8wm8jObeJ5JQH0LMpuZlDpkHE4ostoCy+Ldb+4Zi5/TFWkpRkqoIX6Hy3eVxtGICvUH5KOmRy/8ssRfQSmXxnXXrEOU4/btqECwzLRiVJ0u1DMr9SpuiE1JrMVykJvtuXvkLO+llZ0CUrGGnRo6YM4nUvNxCxIna4+K1idgXpnKhd5lnmxO1KloxH7qYZMhq7KxnDi95NM2g5sescNXJE4M0M3/M7klGb87KuMTdpf02X2CvgoTL9b1fuUUjEFHYoXEyZsj8hFV6I+Q2FD19DVXgN1W1eQ8V8DVXO0ncf/ut97mj0/je+pbtluxpbw1afCLt7KYitvpiVUfT7dgtn1KmWcym2imQAX24e8aja/TAhj3yFR8WLlLtQIjP6eStyopfQM2LRy7xjUNFJav2ulSTejqRiD0vxX8tffv5+gsi7UDyT3T40NrdPIftRc3ovNa5V/X8mq/4/V6hOWnhoaj4vBR/nGxeYMOvMPdBQ3t2++CiphQWPrFgeWd3eI4cixz2yuoFHAr0cj8ypjl/of7V9Y94nXn69gUMQYSPeEBmWG7LO+Ovtap/f8jQsxX+S7/64Xu0mCL3rK+RGmoHB06N3RdVjITxQOZg8cfMTx4g3xb1QOUtGAmn75rnZ42NRcza9VPn/8FXOys9P9W/5s9OAgN7wG30baor/PrMsGgt2lqIAOevGAwDF70SmsskSpbizKVuY30tw+6GSojsoJDthzTzfvA9StIvzXcbNKX0ejlE3CMJAkSORl4GpE8MtWGcxxsJVWQqsYLWj0RSu6qftc/Pz8ikzMCLVUY3rVO/2zaE5TlOe1LmF+g/b036OCVG9K92t7bizGzsyPhdVuU75Q/NpeVofv/noU7Oads5+7Cbt77aHVVfNzzv5djGl3dTkbmJ5G3ORpJuY+nOzbos9N+cV0YfuvIX1cr7B4/Juanb3Xm5mc0bYTQzuxtzV5rQ9Hc5v5q/Nenu/On6dZ/KouBsb3b2aW1mMZN3E3JHIYt62qOKtDCnkmIyZMpZdwh5DRsMweAgh1a4z4vfioh9bkNS5Tv2kCenceWh++vnH9kXiy9MvP07I6zkuj/jMnlTY3aVg1vyzXdktJWGgYaiKivKVxS/pu+e23PvTx2KQbVBowl7D7BfAQu8uFfDzDO3Nfa2ozLvtenUP6U/GCFh5ukHJtqjmuHxYHpejKyJY8AbLorzckbURtnziAqmgvbhKmqS8tFQqGDC6XppkxP32qVsF+DzFTAypYMuw9g1Memy23R1i0z3uLq15A1MOn5e7pm1SXx8n20Kq3sCYbt6R7dQLlsT1bmBG03UhU224VLqBAZfMhok2xPVuYEYxW7lgxnim8jQXHc1SLjkpL0N53udhZoVwvtiUpJBpzlya8ZX8eXTaN2bGYKvKT6fj7jS+DTlX9lYbVXKiOftU0CPM2aaStWF8l8oEE0Y3qWTN4O1RmWDK1hctH4qStSatfBuDDs3m4d1+9bTEE9GyQWnlW76hH9pxBO5J5LyhvvJsgwZN9m0zYXcZKnyrRpuVzWm18CnmNNu8FePtdooRow03bwiv5Y4Yk1517c+hKLM8UmZCavuEgQFquStIyCzB6QOVTOM2gIJtGRHXGVcO5EBjGIGcvHLgEQXNt6CGkaQxWHi2Jxvy+JKJgcYq+lKzVGQxZKyhTB/LCp4nHEKZKC1UnGXIcsLpdokhhYrz3wh38/PwlWRqzn8ns0wp1Zz/Vvi7L4bvJVt3ljmsjIPYBlBhluInbnQv0Z6rNcsETg89sWMubbmJjjTLHxIdF+L30f5ytuXm+B+rY/HUlYH0u2HNwjaH5Alyffnko/LOlsw8Ky9ryNQT6s5mzDqirnig9Ln3EKOeni99q41WeeETTkcSrAlycZtVwY7xXVaTzOAekIRMmXRCEs+c4ll3Y/aMH3o33aBdfqY4Zs5L1Zu9nekHSMH3NPMEKZ6R3COkkGWTzpDimcM/RAoZNPEUKaZJS/bZTdCm5bTDm3hGPZ2Oa9aJRcikuPKtDGIetoXMmXLaVtaY3DlF4+NUvvStYkmzx6nCg8yJJs0dp6abwT2taNY4Nd0c7nlFszq56eawT+XBjXfKsTw8g5hHKCFzppyhxDOGf4gSsmfiKUqs/iQp8x5f9ETL8PuOKGLCFnyXVsLPOTB7PMTCNyCtdJ0BcYBk4it4qXWDdzDZBFLrShNKED6jf5S/c5W/+/BffLWh8HUK+9AHX2tU4wbfOgTwJ37qS6UbGHCO0k+04KXWdSbsm/tm9TxFfVRjsuo0D+5htSydAh/9fpOsNyJuNNktMm9qgH+orBzl5yjLJ9RRXSN5dOOq7uMvmMkFokoHdSapjx3jP5b3v667uzO+3T7tms0hO2GHBfmukttNmRdbvusP251Rvs7h9oL2dZGyj6lPTrgo3d98q8ub2Tc3z7u2mX1n8/wLmyfd1nzFVc3T7mkeu6T5uy+77eG0h9+2/+36VpJIKjeMi0HZYN1qu8/EDFI1Ucl5qn5r/2n727iiS7l5ap5Wm75IlwDIeH+DCjMVL79MVDyoMPuJ/3OJz7sZPOm54OwnZCq6FJz9RN/vV3D0GzzRueDsJ2IquhScp6iZ5BnNLdzikfWpHq/5TivWu1tNfHFxh/rH7f1pHGkPS01JRjpuff3cdY8Z4Xe0In4+8ADlfXPZ3Xs5O0i9a83YNMt9lnDmbIgrXWvApxn6P12lPna4/716aN5+bf+yus8eEkTLXD+iQ4nlkX1g6NTZLtZZnugWlCYv8fPq2PzHcp275T7+/QYvj0obeXGxcblV2D430A2VXcpeoe7jBHUf56hLTlp/Wj6uNo/vm+Ox/R/swEkR/jf6yF1AIg13udr4Uelz5EzadxI3mUvKsB1xlauU32/X2/375bEweEELhvWuNGNz3GdgR0b/pcJVipvCgggqjipcpfhT1+Gztfalr1K52n97OuZ3O0PFaZ2r1B8+L/e7SW4e17hK9W+MQRNaACpeZ8jIwIONSCtd6e+lmwCww49eCJBVPRq6Ewt2nEss/kXhu7PgGQG81vqbhPB6C2YE8RITUKQHv+GXX28X7WG9x8isKyI+vSp2zCevbjzq0ytjxn3yqiZEfi7vcmLsp6CcH/25KJ8Y/yk++VhgJnpiVmim+KRsZcw4UPHJxgI00ZOxQjTFJ2MrY8aD8sq4EaFe46SYUF7tWFSoV8eKC+XVjEWGejWs2FC2Ex6u6nF3jMrxO+Zv/sgPDfXPdanDDUfkX+WMAFVvxdwQVd6Y6UGq3paZYaq8KRMDVb0dc0JVeSOmBat6G2aEq0odSWHKmbdhfN45YkQpaoab4bDU7SNnrFkSMPfa6BlvjllUnIugZV5mUoL/IovuAoQyHIUYe0X4Lvv1joeHf1sd/m21+dy0E1Lfg0xUzwvp9QaAoN4NTGCF+S4mDAN9s0ygob/m/XH5cbVe/V6MSKWlrm+nGZnldgrMndpOc3rL7ZSveHTBj5Tz1vxZA5Iv+hJA+qYd7b95+MfpcOwuNIT25ApPCPBuT5uH5f5r7litsoo7Uj3z8NlnGjHqp0+fDjg1mGnWRcCNDNs3h912c8hO8kfMItVvZFTZZcsWMTyXYU7swB+23RFIZVhAy1zfHUGJ5c5oYOjUrgjrLHdEXKXFb4oVj3/KgvL4C75tPm0fHzNbOy4/Xv/NUlHlj/Vi09SvRLSUP8+omuJ3IarGPwhSF3+JH7erQ/Nz83DK3ouQluB/k+zrAgJH3hkxksUoL6eTiIXMDbSZ4lPyl8d7ojFFd0AIK6qfPGF+8Z1vaKOWxbVvZtJm1ONG7RqIuJlxU2DM0K7JYCZjEs+t4fkNheJ8t15NmiGOaLwrSZv6lrIHLcz8cOL6D5c7diFfY5qJEz4be6lW0HQHpUx9KTf+TNd/Jd5HYn2bKZ9kbnJL/8hXpbfkP8OkBJeLLZNTXApxjclJLpcYx7w0l5Ip7ESXFxumpbqMI50JyqemuxQi0cyEl0sMekrKSwn0TEl6ecE+k9Ne8iZMSXzpDZic+lIi3JOTX16Q97z0l4Ix0xJgLobMSIG5zbgwezjIjgJ/fdmWXTy/EpWbNjxnZuJZwXcvlfAjQtPnvOS8CePvecSIzKseseIGu0ipNM75Umfbcl1md5ZP7tCFgbq49GyVjLN1Yp3cw3TKSnm+OtlFr/XMGQ6Z8cP/bI7vj/tm+fSX/eqnXXbnLCjG98vz2VTZ06xzwu9IRfyM6Alyw50vN8mES5WrlbcPc9ze41OYSm+grzTHAPqlN8vd4fP2OP6tBwVv+7WxeP73Hj5HZIxwF1v8vu2LEWd5YRt48YF0JeJ5cesEp/vjdl+QdJcWw6YHc8rv7VBSEpWZoSE6daWohZTjaRIL9fLeH5vjO8bjpMXm6fkr86GGRefpu7S2EWVxuZmaXrx8TFdScp62n96/HXt/5yKz5dM+J6vlpSBTV4xUVof77XOz/1ro4WiZCVOs/K0qUOjdceQmlYG5pdnPM4Y7UPFLhesUP7UrveVj8z3MWcOq4yrXKX9onld4gow1X8pfp3a9OrQzq3Yu9267n/CtabXrjMjd4J7xs1JWQEllNFpeir1fdQc1HKNpaN9Uh0X4bYd8zBGR7G/5YmxuUr3fg6E7p7YvPUOrMKJSKu70vvfnOU946LTOHBvibredLnzk6+5Lz9AqxdCJLnqfl/vV8uM61lx0GnIJ5rvLndTvT7td27KyN7SCkhPQ+fLL6un09OPp6WOz/+nTi6zclZk5bXdFSfjlZh4zN1M8/v5S+qddUziuvWBmVspME8ln+zGTinD+6QZRjVjS2JUXZ3ty0YzumKs/bZ+ad+WrS1/UoRqzVD822z9v8bieKHwpN0uN/9+YjnOhWQoOvUf4y5CX8WQ8pw5WmaUctrhxA7LVZhnxufWGsR7qRTctPUvl8vRltV4t91+/3T49LTcP44+MasxSPXYz8otK1oXIRJXRWr70Jr/8kpsLYUVvLhWK+t40Y4HiFw+99HyTrXiDhTAt6x/ldl+hN+vyD/9WXWMO6fVLl7v73/j9/vKjD+A25xvq+46Wp+FupHb2eUOBEZO6K+hn2oOqzjNm36zbEfu5f8IP++XmsF5OMGlcwHWGdY8636pM7XkmdaB6tTltT4fzw/61WW/vV8evTKNG619rVve0s21ClecZtAtP53eaMc1AVeYp/719jCmaB+XnqR3rQyONrKGMKkuCU+dsjSztTgpMWLzgvTFDaXdPhb2pqXX5uRZX1TJ/eGZOVTqcnC+eeLvaNz7DsRDSyxbmv8Tv/rhe7abLvuvr5Twi9xRzpjvjhoxPfnIywnNMzCyfYNKbYtr5iF3XTYT4NnKa+DWG7pvnZn+Y8ypfav5/d7SzKedHLU4gc3L6p7mtu1HDvMtdY9+/0O0GtvJm5JMNJjP0ZFdysUOFRfndaSvg5+XTbrLwu6hidpCFT5FbxZXCEXkzLtVuYkRb/EOeHY29jw8jFGmyMdSLZhgFRNzEuLH5WN4m1vRsxBSSMXGOCZWzJdJCN82UAKLZWRLE9pEAezF8fJtobSRrPF57tmp6PDPWMhbRLCvpCpQDwrGutDRfJfkaf22STJNUX/hxgoeFxdm4tLuXklnLz5YVVm8MPedifCXk9Xy/2Z2OxXcUlZj0opji7kLR7APEBmaUwQUUUpVfP/EUHfPffqDrOPL1GergwWhIV/5UNJ6igq8NdI05HFaXDAPb4za02tIwQAvdcBiAopnDwMD2rBEhOD3VhrjWlSYccicjZZQfiuchldTGX/d9P1AWPi4tc7tvCyXzPu3A8OKX/TEzYOYMiOrcQv3kFzDuVwUD4Pf9+XwiRNGKvtCUL8x7vkTytAe8WI6f8OfmafvcjDoxKHY7P84J57kyeoJ5r7tgx/gLL5tBh4SY/o8MDKDobYeHnAL+IIGeZk4/nbVkvLcum0DaNPPt45I37b+ve/eZRyls1lgeTyPr0aTMjbdpUMkT9mjEhmfn912SSyiameC9FLjVMohI5CyFIiunT1GpvrEZKlRGuXvplU1+XeVFb/KuGCve8ot6Gvvgsbqk8EyFaTpoXlc5EXRUzel4nzu6iih6KclXldwXfk4t6Pyk0DGAYrfrG3LCed0DeoIZvpk3YsxLJxiQHf2y2ssjX1l1Os8LmREj3xkUu+U8DwvnzvOGT5ALXbykfkyyI613tRnZr501oPy1y6rJrd3n9I6R7w0L3u6L58Xzvjl+jtwOtXMWy0RDomo3MKKwx6dgw9hGnzETkvntcbsrTWpffr7hTJYIZU5fI0unT76GOkemXgx1uYnXQFdx2pVRFG2Wia8c73dWtP92k22lvRzWptLOkOwelM32oRluuLvI73+eITlz2zJ6BM4Ny0VdO5LQPVDyUoAlnWxN/LH8kqISc6R/y3xRqOjV+nJbLrNax7ZelnXTzHukjpFmn9VwiekWNMRlJms49PblFcRFJsvfRyGmvApSatZ7gttZ4NvibmMpvDOesmHBOT5GFovIxcaXiDn5y2g2nldBSs3wgpdZYMkLklKTtdwnM45iD52Wm+4B7WhZ+OzhV57U2lb6ZZD8drled0e/XYR3uU3tNOz8z8XBtpjrBuTcjSROXmwpmLt92rWfrDsx8Pi1tCw/qx8pXt4lWdJdWioC3ZOXjNE86NvoQJX+07f/dpN5UC+HNQ/qDMnPIOKN3APxu9J+7bLc5fFzQW74dYbcz9vDMclxGciOSsyQT9c4A/Gjy5mS9EOz7/ZuDzvpi/ioxAz598udP5bzuCrpIKVm6DmBkzcu4k+FwzaKUovHsFzEsw5hKftm7gSWF/8cO3ylKP98LdH5BJe8lkG5q3UVHmlYcIa25X3XG5LT2QaqSKn57eRbljvjwrPeZSfn+82n7f5pCWds0dscFp2hEa9CL1rKq9ByT1BeXMUDCGdlNdKe8OImak7llQ2RTuZqm+a+0B+/FJgs+5d98z+n5lAQHpWYLL2bbn89HJunt8tj883mIYEeA02Z0pO1HiZpzZSe86x/Gh2Y00Kz3uf9dldqL3GRWW9uRP7hGvldQIHVnw0LznpXU7rQbPk5mr+Juv+yTlpyjrbiMWexMtYhZ6x3ynqRc3W85Q9CmdKznix7eFvyaKNHt41oKRzcluhhHNtW1oQjl7GOcuRypB0zB1d+5HKCvlzkMqt1LHJZ6hP94PBz83G7LYySpNScJ8zFR+OHGouPljTk46MvGsbjo+XRY0zBeHy0IL8YH72oYMVHR95TMWSZvC1WzLL8znjKuPHRsT4OxkfTDq4YHy3IL8ZHX1ZGnPho0QsK8dHICxjx0fKcuxQfjafenPhoyQNQfPTls5fioyP9/4d35d7f/z7HY4uSD7Mld2P5j+/LY73/fdbbaI6/bfe/fn+BvuV3A0rP0QoPTo0VFY9NHZXNGQcZR6Z6Pf/9+lWrpvny6g//fNXtFu46mT+8Em/km7ot+2nVrB/aen9/1a9dtk/n64ketvcn/8f/PhcLG2a6wqH0vy9evf774rVRb5Sr//u/X/+9r+x/8P/Qy3j5F1+xav9WoYrVoGKVVBTt38Rrad84I5OKYlBRJBVl+zeJNMpBRZlUVO3f1Gtdv5GuSiqqQUWVVNTt3zSqqAcVdVLRtH8zr7V5s6hMUtEMKpqkom3/ZpFGO6hok4qu/ZtDFd2goksqth709/q1lm/0Iv0c9aBinTpA5w/VAj1lNXSeiniPd5/qta7eqJpUBg6UelDV+UUl0NNWQyeqUi+qOt+oJKw8dKQq9aSq848K+lI1dKYq9aaq85FKwzYzdKgq9aiq85PKwMpDp6pSr6o6X6nsa+XeyFqnlYeOVaWeVXX+UkHfqobOVaXeVXU+U9WvVf3GCfKdhw5WpR7W3Wb1d7FAmsXQw0TqYaLzGVHBykMPE6SP8p2UQL4tQDeVepjofEZI1KbE0MNE6mGi8xmh0HcWQw8TqYeJzmeEhpqHHiZSDxOdzwjYa4mhh4nUw0TnMwL2XGLoYSL1MNH5jIAeJoYeJlIPE53PiBpWHnqYSD1Mdj4j4fgnhx4mUw+Tnc9IOAbKoYfJ1MNk5zNSwMpDD5NkJPRDIR4LwWCYephU2c5ADj1Mph4mO5+RCjmJHHqYTD1Mdj4jNaw89DCZepjsfEaa16p64xYirTz0MJl6mOx8Rlr4woYeJlMPk53PSIfGKjn0MJl6mPIeBgdYNfQwlXqY6nxGLWDloYep1MNU5zMKuqcaephKPUx1PqNgB6iGHqbIfCvvYQpMuVIPU53PKPlatZolma4NPUylHqZ8H4Yml2roYCp1MNW5jFKvZduRGPLIQwdTqYOpzmUUHNvV0MFU6mCqcxkFx3Y1dDCVOpjuXEZB19ZDB9Opg2nvYA5WHjqYTh1MewerYeWhg+nUwXTnMhr2vHroYDp1MN25jIaurYcOpsmk3s/qYc+rwbw+dTDd+YyGPa8eephOPUx3PqNh56mHHqZTD9Odz2iNeiE99DCdepjOT8P00MN06mFmkZ1VmKGHmdTDTJXtC8zQw0zqYcZ7GBrazdDBTOpgxjsYrDv0L5P6l+k8Bq/fhu5lUvcyncPAiZAZepchy8bOX+A8yICFY+pcpnMXOM6YoW+Z1LeMn+LDpZwZ+pZJfct434JLOTP0LZP6lvWLSLgas0PfsqlvWe9b0D/s0Lds6lu2cxdt0AuzQ+eyqXNZ71wWvTA79C6bepf1vRf8zHboXjZ1L+t7LzjdtUP/sql/WZOdvdmhg1kSmvCLSLjqtiA6kXqY7XzGQA+zQw+zqYfZzmcM7O7t0MNs6mGu8xkDZzJu6GEu9TDX+YyRsPLQw1zqYa7zGQPd0w09zKUe5jqfMXBC4YYe5lIPc77/ghMKN/Qwl3qY63zGwAmFG3qYSz3M+cgXnFC4oYe51MNc5zOmhm976GGOBMA6n7GL16J+Y4VLK4MYWOphrvMZCz3MDT3MpR5Wdz5j4YSiHnpYnXpY3fmMhROKeuhhdephdeczFgYL6qGH1amH1Z3PWOhh9dDD6tTDapX9VPXQw+rUw2o/REL3rIceVqceVnc+Y6F71kMPq1MPq318FXa99dDD6tTDau9hcL5bDz2sJmHWOuueNYi00lBr5zQOzpbDb2n16N/O9Tu/cTAYFn6j9UnAddG5jsMR1wUIuS5IzHXReY/DQdcFiLouSNh10TmQw3HXBQi8LkjkdaGzbz/8RuuT4OvCT8xw6HYBwq8LEn9ddJ7kcPR2ASKwCxKCXfjwPnT68ButT6Kwi86fHOyWw2+0PvE/H7130PUrFOwfRPs7f6qx/8J4P/E/H8OvMW5CIX8a8/dh/Iz/o6g/Dfv7SH7G/1Hgn0b+fTA/4/8o9k+D/z6eX8MhpkLhfxr/9yH9TPtBBIAiAB/Vr+EoVSEIQCmAD+zXcKCqEAcgIKDysf0atz+AAirCAiof3q9x+wM0oCI4oPIR/hq3PwAEKkIEKh/kr3H7A0ygIlCg8nH+Grc/gAUqwgUqH+pvRwUsADggYQOVD/e3wwIWADyQ8IHKh/zbcQHiQoAIKsIIKhHWqNgHASaoCCeofOi/HRmwAOCEhBVUMgBPGAipAC6oCC+oPALIjEKAGFQEGVSeArRjC3wCQA0qgg0qTwLawQULQPST+GFgBwsMAwE9qAg+qGRhIAYAoSIEoZLBD3FLABChIhSh8mCgymBrABIqQhIqDwfaAQpbAPyQ0IRKhngJHkwAUKgIUag8JGiHKGgBgAoVoQqVCvA9g7GBIxKyUHlYkPmKgC1UBC5UnhdUGRQO+EJFAEMVCEPuCRCJJ37ouUGV4emAM1QENFQeHrTjJBYAHJHQhkoFR8RjAgAOFSEOlQqOiJsCgA4VoQ6VBwntUIkFAEck5KHSi0JbAvChIvSh0lWhKQAAURECUemQCYIbI4AQFaEQlQcL7XCNBQBPJCSi8nChHa+xAOCJhEZUHjBUmPhXAEhUhEhUHjK0AzYWADyRUIlKh8AebgsATFSETFQeNrQDNhYAPJHQiSrgCYHbAgAUFSEUlYcO7YCN02OAJxJKUQVMgTMBKgAqKkIqKk8fKpwNUAFaURFcUZmQl4Q9ESCLijCLynOITKcMsEVFuEXlWUSFswoqwC4qAi8qDyTaER8h+goAjIoQjMpTiXbIxxYARyQYowocQ2aypIAjEpRRBZaBEwUqQDMqgjOqM8/AngyIRkWQRhWYRuYlAqpREaxR2eCIuCkAslERtFF5WtHOGbAA4IgEb1Q2JMnh1TYgHBVBHJWnFpXCwwKgHBXBHJUnF5mmAEBHRUhHFVCHwut1ADsqQjsqDzC6PajwHQJHJMSj8hCjwgkFFYAeFaEelQcZuUcA4KMi5KNyAa7htgTgR0XoR+VEwZMBAKkIAalccETcGAEEqQgFqVyhRwQcpCIgpHLBD3FjBiykIjCkcqUeEfCQigCRygVHxI0ZMJGKQJHKuZIFKH2TOKJnHe3EDc7xABupCBypPO+ocLJGBfhIRQBJ5ZlHhRM2KsBIKgJJKs89Kpy0UQFOUhFQUtVh2YxXvYCVVASWVHVYNuPgB+AlFQEmVZ1PiqoAMqkIM6k8BmmnnvgVAEck3KTyKKSdemIBwBEJO6k8DmmnnlgAcETCT6q6LngyQCgVYShiERwRdicCQBRBIIpYBEeE3YEAFEUQiiIWhR5RAIwiCEYRHou0k19sAcgtJhxFeC7STn6xAJBfTECK8GCkwixeAJIiCEkRi5DHDluzAChFEJQiPBppJ79YAMg1JixFeDbSzn6xAJBvTGCKWBQ8UQCaIghNEWHnBIb7AuAUQXCKCLsnMOAXgKcIwlNEVfJEAFQEASoi7KLAWQICEBVBiIoIOylyFgBPJEhFhN0UONVAAKYiCFMRYUcFnqYKAFUEgSoi7KrA01QBqIogVEWEnRUGN2eAVQTBKiLsrrC4OQOuIugGC89JKpz4INAeC7rJQhSWKwLtsxhstPCeaPFLhHstiCd6VIIneQJtt6D7LURIVsb9CdpyQfdcBLaSewXAEem+i7DxAm9zQTsv6NaLsPcC+zHafEF3X4TtF3jvBtp/QTdglHZgoC0YhKsIj0ky2z8AVhEEqwiPSTIbVwBWEQSriIBVMvqBBxKqIgJVwWk4AlAVQaiKkKW+EFAVQaiK8JSkXQXjRwAuSLCKCFjFGiwA+CDBKiJgFZyWIwBWEQSriIBVutQc9BWBFxKsIgJWwXNsAbCKIFhFBKyC83sEwCqCYBWhSn0hwCqCYBWhSn0h4CqCcBURuArOExKAqwjCVYTHJDivVQCsIghWEQGrdIkWSABwRIJVRMAqMFFdAKoiCFURHpJkNu4BqCIIVBGekWT27gGmIghTER6RZHbgAaQiCFIRAanAdHkBiIogREXoPGIWAKgIAlREACoOT88BUBEEqIgAVBxMmRUAqAgCVITnI3h/OMApguAUofOAWQCaIghNER6O4ERlAWCKIDBFBJji8GAAYIogMEUEmIJzzQSAKYLAFBFgCk42EwCmCAJTRIApONtMAJgiCEwRAabgdDMBYIogMEUEmILzzQSAKYLAFBFgCk44EwCmCAJThIcjFc44E4CmCEJTRKApOGVLAJoiCE0RgabgbBMBaIogNEUEmoKTtgSgKYLQFBFoSmZWAWiKIDRFBJqSGdMBTRGEpohAUzLTEkBTBKEpItAUnHgmAE0RhKaIQFMyXwHQFEFoigg0BaeuCUBTBKEpwub7Q8BSBGEpIrAUnPomAEsRhKUIG0Zk3BsAmCIITBEBpuDkNwFgiiAwRQSYgrPfBIApgsAU4dmIWCzQFiUBYIogMEW4cBAB7g0ATBEEpgjPRsQC9wYApggCU4RnIwJnvwkAUwSBKcKzEYGz3wSAKYLAFOHhiFjg3gDQFEFoivBwRODsNQFoiiA0RbiwTsazU0BTBKEpwsMRgeP4AtAUQWiK8HBE4OwzAWiKIDRFeDgiKrzWBzRFEJoiPBwRFV7sA5oiCE0RgaZk5meApghCU4SHIwLn7AhAUwShKcLDEdHt+QOtEdAUQWiK8HBEVNiVAU0RhKYIT0eyFgBPJDhFeDoiKniSgQA4RRCcIuoQssFtAeAUQXCKqF2hLQCcIghOEXVdaAsApwiCU+QieCI+UwHgFElwilyEA1rguCABTpEEp8iFyH9GCXCKJDhFLmTelSXAKZLgFLlQ+eYsAU6RBKfIhc43ZwlwiiQ4RQacgpuzBDhFEpwiF8ETYZcmAU6RBKfIRX7fnQQ0RRKaIj0cETgLUQKaIglNkdWi4AaApkhCU2RV5VuzBDRFEpoiq3BaUOYkGOCIhKZID0cEzkKUgKZIQlOkhyMCZyFKQFMkoSmyyi+bJYApksAU6dmIwFmMEsAUSWCKrELgRr+W7o2TVADwQwJTpGcjAmcxSgBTJIEpsgqOiDs0AFMkgSlSFNJhJYApksAUKfLBGwlYiiQsRXo0gjdlSoBSJEEpMhxchdMwJWApkrAUGQ6vynxEwFIkYSkyHGCF8zglYCmSsBQZWIrMfAPghwSmyLBPBa9ZJaApktAUGWhK5lgogFMkwSky4BQ80ZaAp0h6plXgKZmzpdCxVvRcqwBUcudLAUekZ1vJ/P4AiU63GhxvFU5Qw70JPOGKOKIHJPgsH4kOuaKnXMnCDFGig67oSVcy+CFc9kt02BU97crzEYFTWSU68IqeeCWDH+LuDB16RU+98nxE4FRWiQ6+IkBFej6S8QLAUyThKTLwFMgCJMApkuAU6ekIPjFHApoiCU2RKnghBJsS0BRJaIpU4Sw/PLUBOEUSnCI9HRH4DC8JcIokOEWG87BwioIEPEUSniJVfsO8BDxFEp4iA09RuCsBQEUSoCIDUMGZtBIQFUmIitT58z8kICqSEBWp80eASEBUJCEq0gMSoXB3DoiKJERFekAiFAyCSkBUJCEqMhAVBQG/BExFEqYidXBD7AUAqkgCVaQObohbEqAqklAV6SGJ0HihBaiKJFRFekgiNF5oAaoiCVWROoA93JIAVZGEqsjzKVowIVsCqiIJVZEekggN97xJQFUkoSrSQxKhsScCqiIJVZEeknT3XUMBwBMJVZEekgicgikBVZGEqkgTDjh1cEwAVEUSqiI9JBHd+UlgUABURRKqIj0kwec5SgBVJIEq0jMSfKSjBExFEqYiPSIRBrcEwFQkYSrSI5LcHB0wFUmYirQh3QYPSoCpSMJUpC3MDgFSkQSpSE9IBE4hlQCpSIJUZEAqGS8CUEUSqCKtLngRgCqSQBVpw1m7eFgEUEUSqCI9IxE4iVUCqCIJVJGekQicgyoBVJEEqsgAVXAOqgRQRRKoIgNUMXhYAlBFEqgiA1TBGaASQBVJoIoMUAXnX0oAVSSBKjJAFZx/KQFUkQSqyABVcP6lBFBFEqgiA1TBKUMSQBVJoIoMUCXTHQCoIglUkQGq4PxJCaCKJFBFBqiC0+ckgCqSQBUZoErOkYAnEqgiA1TJvEQAVSSBKtIzEoHP0pIAqkgCVWSAKpleHUAVSaCKrPNZsBIwFUmYigxMBZN2CZiKJExFhh0qeMUNkIokSEXW2ZN7JQAqkgAVGYCKta+VelOR06EBT5GEp8jAUyzuSwBPkYSnSI9HMmdbA5wiCU5RAafg7EMFcIoiOEUt8sFDBWiKIjRFBZrioAsqQFMUoSnKw5HM+ckApigCU9Qim+igAEpRBKWogFKgByhAUhQhKWqRP5xcAZCiCEhRAaQ4fN42ACmKgBTlwUjupHBwhjQBKcpzkcxh4YCjKMJRVOAoOPVPAY6iCEdRgaPgU64U4CiKcBQVOArOnVOAoyjCUVTgKA6ucBTgKIpwFBU4Cs6dU4CjKMJRlOciwkEuqwBIUQSkqABScO6cAiBFEZCiAkjBuXMKgBRFQIoKICX3CMARCUhRAaTg5DsFQIoiIEWFez9w8p0CIEURkKLC3R+YjitAUhQhKSqc9wWbEgApioAUFUAKTv5TAKQoAlJUACk4d08BkKIISFEBpODENwVAiiIgRQWQUuOmBECKIiBFicJx+oCjKMJRVOAocDgAFEURiqICRcHDAYAoikAUFSBKDSdECkAURSCKCreDwFsjFGAoijAU5ZmIqLEPA4iiCERRAaLUMGqnAERRBKIoGZwQRu0UoCiKUBQVLgvBp84pQFEUoSgqXBiC8+4UoCiKUBQVLg3pNoWAlgwoiiIURYWLQxYw/KsARVGEoqhwecgCXz8GKIqi94d4KpJpR+gGEXqFiKciuB2hO0ToJSIeimTaEbpGhN4j4plIphmgm0QGV4l4kocvIoGXiRAfVMEHcT+GLhShN4ooU3AhdKsIvVZE2YILoZtF6NUiKvggnpSg20Xo9SIq+CAMuyp0wwhhKCrcMZK5kwX4IGEoSud9ECAURRCK8kRELvCcCCAURRCK8kRE4rxNBRCKIghF6fxJIgoQFEUIigoEBacYKUBQFCEoSucvtgH8RBF+ojwOkThRTQF+ogg/UR6HSHzqoQL8RBF+ojwOkRVuyICfKMJPlMchEp96qAA/UYSfKFNYIAN8ogg+UZ6GSHzmoAL4RBF8ojwNkfjUQwXwiSL4RBVO+FKAnihCT5SHIbLCcxpATxShJ8rDkMxYBOCJIvBEeRiSuZ4JOCFhJ8q4/FgE2Iki7ESZkg8CdqIIO1F2UXABwE4UYSfKoxCJk2YVYCeKsBNlA8OD6EIBeKIIPFEBnmB0oQA8UQSeKM9CJE7bVQCeKAJPlC0wPAXgiSLwRIVbTHDKqgLwRBF4ojwLkQKHSgA8UQSeKM9CpIB33igATxSBJ8qzEIn3qSoATxSBJ8qzEClwrAXAE0XgifIsRArsygCeKAJPlGchEh87qQA8UQSeKM9C8AU8CrATRdiJ8ihECtybAXaiCDtRHoVInPCpADtRhJ0oj0IkPrlAAXaiCDtRzhbcALATRdiJcsERcVMA7EQRdqI8Csl9BOCHBJ2oelH4CACdKIJOlCchUuKZCUAniqATVYvCOwToRBF0ojwKkRLuWVeAnSjCTpRHIVJCfKQAO1GEnajC6V4KsBNF2ImqCwxPAXqiCD1RnoZIiXsTgE8UwSfK05DcEwA3JPREhd0ouScAfkjwiV7kcw01oCea0BO9CG4I42Ua4BNN8In2NCTjRRrgE03wiV7kCZ4G+EQTfKIXwQvxdeUAoGgCUPQiT/A0ACiaABS9yC5RNOAnmvATvcgTPA3wiSb4RAd8ghNmNeAnmvAT7XmIxAmzGgAUTQCK9jxE4oRZDQCKJgBFV8EJ8Y2aAKBoAlC05yESJ5xqAFA0ASja8xCJE041ACiaABTteYhU+HZNAFA0ASja8xCJE0Y1ACiaABTteYjECaMaABRNAIr2PETio1c1ACiaABTteYjEJ6dqAFA0ASja8xCZudMVABRNAIoWi/zERAOAoglA0aIwKmsAUDQBKFrkc7w0ICiaEBQtgiPitgQIiiYERYvgiJnbaYEjEoKiPRCR+OBTDQiKJgRFiwCUcVsCBEUTgqI9EZGZm2oBQtEEoWjPRGTmtloAUTSBKFqEpAa4SNCAomhCUbTMB681gCiaQBQts4FDDRiKJgxFy3zwWgOEoglC0eGedXzqqQYIRROEoj0RkfjUUw0QiiYIRQeEgjNmNUAomiAUfb5zHXcFAKFoglC0zJ+opAFB0YSg6HCwFz4SSgOCoglB0WeCAgPwGhAUTQiKDlew4wC8BghFE4SiVYja4HcAIIomEEUX7kvRAKJoAlF0gCj41lcNKIomFEWr/H4oDSiKJhRFh40osB0ChqIJQ9FhGwpuhwChaIJQdEAo+NhaDRCKJghFB4SCc5Y1QCiaIBQdEArOOdYAoWh6S7tHItLAJZZGF7XTm9rDVe34E6K72ull7WEfCvyE6LZ2el172IWCPyG6sJ3e2O6JiMQJyxpd2j64tV0X2gC8uJ04oWci2S8AvJDe3u6ZSKYVo/vb6QXugaEYvEJDd7jTS9w9Esm5APBBglB0QCgGBms0QCiaIBRt8sMxICiaEBQdNqDgJFMNCIomBEWHDSg4R1EDgqIJQdFhAwrOatEAoWiCUHRAKBjna4BQNEEo2oTgdeYdAC8kDEWHDSiZdT6gKJpQFG1cYVIHMIomGEV7KpJpB4CiaEJRdKAo+OxoDSiKJhRFB4qCE/81oCiaUBQdKArOVNSAomhCUbQtJBpqQFE0oSg6UBS89UADiqIJRdG2EK0BEEUTiKJtPloDEIomCEXbQrQGEBRNCIq2hSRDDQiKJgRFB4KS6UwBQdGEoGhXSPDSgKBoQlC0yyd4aQBQNAEo2hUSvDQAKJoAFB12n+D8LA0IiiYERQeCgrevaEBQNCEoOuw+wSlmGhAUTQiKDgQF73/RgKBoQlC0y2cZagBQNAEo2mWzDDXAJ5rgE+3yWYYa4BNN8IkO+AT7EKAnmtATHehJZm0E6Ikm9ER7GILTqzSAJ5rAEx3gCU6v0gCeaAJPdIAnFk+sATzRBJ5oD0OkxX05oCea0BNdBx/EM1NATzShJzrQE7z7RwN6ogk90Z6GSIujBACfaIJPdLgbJbPGBvhEE3xiFvljhw3AJ4bgExPwCT7+2wB8Ygg+MQGf4P03BuATQ/CJ8ThE4v0zBvATQ/iJCdtP4CnyBuATQ/CJ8ThE4rO3DeAnhvATs8gn1xgAUAwBKGYRFslwQDOAoBhCUMwi2xcawE8M4Scm8BPshAbwE0P4iQn8xMHOyAB+Ygg/MWEDCqaIBvATQ/iJCfyknRcq+6ZS5B0AfmIIPzGBn+AdLAbwE0P4iakKW5MN4CeG8BNTFbYmG8BPDOEnJvATuPfBAHxiCD4xnobgbUgG0BND6IkJ9MTBVEkD6Ikh9MRUBZZsAD0xhJ6YsP0EnyFlAD0xhJ6YQE8cbomAnhhCT4wIfgh3tBqATwzBJybgEwcnZgbgE0PwiQn4xMG5pQH4xBB8YgI+qeFS3QB8Ygg+MQGf1PDEDgPwiSH4xAR8UsO0DAPwiSH4xAR8UsOZhQH4xBB8YgI+qeFK2wB8Ygg+MR6HSByuMICfGMJPTNiEgk9/NoCgGEJQjCcissaeCBCKIQjFBISClwgGIBRDEIoJCAWvcgxAKIYgFOOJiFpgTwQIxRCEYjwRUQs8sAGEYghCMbJwtqEBDMUQhmLCLpTMuAQYiiEMxciwNxQPrYChGMJQjCqcGmIAQzGEoRiPRNQCNybAUAxhKMYzEYUjbwZAFEMgivFMRC3gNN0AiGIIRDFKFeYngKIYQlGMCp6IxwXAUQzhKEYFT8StEYAUQ0CKUWFwxq0RgBRDQIpRpdEZgBRDQIpRwRNxcwYgxRCQYsJeFLyVwQCQYghIMQGk4DN3DSAphpAUo0WhPwAsxRCWYrQstEYAUwyBKaawHcUAlmIISzEejagKLroNYCmGsBSjCxmHBrAUQ1iKCRtSMj0agCmGwBTj2YjC20EMgCmGwBSjS9NEQFMMoSnGlKaJgKYYQlOMKU0TAU8xhKcYU5omAp5iCE8xpjRNBDzFEJ5iTGmaCHiKITzFmNI0EfAUQ3iKMaVpIuAphvAUY0rTRMBTDOEpxpSmiYCnGMJTjClNEwFQMQSoGFuaJgKgYghQMTZ0iXjZCoCKIUDFeD6i8NYmA4CKIUDFWFmYZwKgYghQMQGoZOaZAKgYAlSM1YV5JiAqhhAVY01hngmYiiFMxdg8XzaAqRjCVIwNXSKe7AOmYghTMbbUJQKmYghTMWFXSqZXB0zFEKZiXHBEHEcEUMUQqGJcPtPGAKZiCFMxgalkXgFgKoYwFeMRSW6eC5iKIUzFuDBJxL0BYCqGMBXjEYnC91kawFQMYSrGlZYrAKoYAlWMKy1XAFYxBKsYlyfMBmAVQ7CKqcMcEbdlwFUM4SrGYxKFLyUwgKsYwlXMmatAsGUAWDEErBjPSRS+EsAAsGIIWDF1YY4IuIohXMWETSl4h5kBXMUQrmJKu1IM4CqGcBVTl+aIgKsYwlVMnb+awgCsYghWMZ6SKLxHzgCsYghWsYvCqtkCrmIJV7GBq+BXYAFXsYSr2EW+P7QAq1iCVWw41EvAqYUFWMUSrGLDtpTcEwz90BKuYsO2FHyvgwVcxRKuYgNXwY5sAVixBKxYz0kybmABWLEErFhPSrIvceiIlqAVu8j3hxaQFUvIivWgROGdjhaQFUvIiq2qfIdqAVmxhKzYquCHAKxYAlZsFfwQ8kELwIolYMV6TpIZFS0AK5aAFVu4IcUCrmIJV7FVcEMIKC0AK5aAFRv2peDwkwVkxRKyYqtw9DBcb1pAViwhK7YKsRs4SbeArFhCVqwHJZnwkwVkxRKyYs9kBYafLCArlpAVK0LsBjsyICuWkBXrQUkm/GQBWbGErFgRHBEuWC0gK5aQFSvCBBGGnywgK5aQFSvCQgU7EiArlpAVK/ILFQvAiiVgxYqwWxTOriwAK5aAFRsO94K3NFvAVSzhKlbmd4tagFUswSo2YBWcc2IBVrEEq1hPSTDrt4CqWEJVrIckCl8yYwFVsYSq2PPZXjD5zAKqYglVseGGFPwJAFSxBKpYz0hynwD4IGEq1iMShS+5sYCpWMJUbGAqBl3WbgFSsQSp2IBU8CU5FiAVS5CKDQd74S3HFiAVS5CKDUgF3zFjAVKxBKlYT0gyrwAQFUuIig0XpMC7cS0AKpYAFRtum4cXtFjAUyzhKTbwFIkHNMBTLOEpNtw2j/f4WcBTLOEpNvAUvGfYAp5iCU+xKnSFeEQEPMUSnmIDT8GX1FjAUyzhKTbwFIUHNMBTLOEp9rwxBQ9ogKdYwlNs4Cn4khoLeIolPMUGnoL3DFvAUyzhKdbzkQoe52IBT7GEp9jAU/CeYwt4iiU8xeqQ+4WbMuAplvAUG66dh3clWYBTLMEpNuAUvGfZApxiCU6x5/O9Mm4E/JDgFGuCH+KmBHCKJTjFmvx1URbQFEtoivVwpNsWAfoCAFMsgSnWBC/ESxQAUyyBKdaETXp4hQBgiiUwxXo2ojSeVwGYYglMseF8L7xl2QKYYglMsZ6NKLxl2QKYYglMseF6FLxl2QKYYglMsZ6NKI2bIoAplsAUa/Nbli1gKZawFBtYCt4zbAFLsYSl2MBS8J5hC1iKJSzFhs0pKI/TApJiCUmxHowovOXYApJiCUmxYWuKxg0BkBRLSIoNJEXjhgBIiiUkxYYr5xd4ZgJQiiUoxdp85NACkmIJSbE2jMroPBwLQIolIMV6LqLwhlcLQIolIMW6/GGHFnAUSziK9VxE4Q2zFoAUS0CK9VxE4Q2zFoAUS0CKDSAFX5FjAUixBKTYAFLwjlMLQIolIMUGkIKvyLEApFgCUmzYnIKvyLEApFgCUqznIgrvlLMApFgCUqwHIwrvlLOApFhCUmwgKXifmgUkxRKSYuuCIwKQYglIsQGk4D1KFoAUS0CKDTtUMuFfAFIsASk27FDJhH8BSbGEpNhAUvAmJwtIiiUkxYYdKviAMQtIiiUkxdY23x0BkGIJSLHhdpQMxwAkxRKSYutCABuAFEtAiluEo5XgR3QApDgCUtyiyr4BBziKIxzFhdtR8BtwAKQ4AlJc4XgvBziKIxzFeSyi8D4pBziKIxzFBY6C72lygKM4wlFc4Ch4n5QDHMURjuICR8H7pBzgKI5wFHc+4gtGPh3gKI5wFFfgKA5wFEc4igscBW/UcoCjOMJRXDjhC0ZcHMAojmAUV4XeEA4IDnAURziKq/KX9DiAURzBKK7KXtLjAERxBKK4KjghHI8coCiOUBQXKAre5uUARXGEoriqcParAxTFEYriqsLZrw5QFEcoigsUBW8Uc4CiOEJRXKAo+KYhByiKIxTFhetR8CYjByiKIxTFBYqCrwpygKI4QlGcKJxC7ABFcYSiuLA/JfMVAEVxhKK4QFEc7g4BRXGEoriwPwU3ZQBRHIEoLtyP4hR0REBRHKEoLlyQ0uWboVcAHJFQFCeCI+L+GGAURzCKC9tT8CsAGMURjOI8FVH4tiUHMIojGMUFjJJ5h4CjOMJRXOAoDvengKM4wlFcuGg+ZwHwQ8JRXNidgu97cgCkOAJSnCz4IQApjoAUJ0t+CECKIyDFeTCi8IVTDpAUR0iKCwd8ZZ4AuCEBKS7sTck0BABSHAEpLoAUfGGVAyDFEZDiCiDFAZDiCEhxYWsKvvDKAZLiCElxYWtKxgDghYSkuEBS8IVVDpAUR0iKC7ekZIZVQFIcISkuHPGV6dABSXGEpLiwMwUfdOcASXGEpLhwxBeGQQ6QFEdIigskBV/a5QBJcYSkOA9GcATaAZDiCEhxAaTgS78cACmOgBQXQEqNRwQAUhwBKU4X/BCAFEdAitOFQzcdACmOgBQXNqZk+gIAUhwBKc6DEYV3TDpAUhwhKU7nubIDIMURkOLCIV81HpIASHEEpDhT6g4BSHEEpDgTukM8JAGS4ghJcabQHQKS4ghJcYGk1HhEASTFEZLiTJ7nOQBSHAEpznMRjS8ucwCkOAJSnCkMyoCjOMJRnCmtUgBHcYSjOFNapQCO4ghHcR6L4BNBHMAojmAU57EIZvsOYBRHMIrzVEQvIFV2AKM4glGcDZujcLAAYBRHMIrzXEQvYNTNAZDiCEhxnotovBXAAZDiCEhxNrghjDw6AFIcASnOcxGNT+dxAKQ4AlKc5yIapww6AFIcASnOgxGNUwYdICmOkBTnyYjGKYMOoBRHUIrzZETjjD8HUIojKMV5NKIx2XaApTjCUpxHIxpn/DnAUhxhKS7clFJhTwQsxRGW4jwa0RX2RMBSHGEpzqMRjS8+coClOMJSnEcjusKeCFiKIyzFeTSi8bmJDrAUR1iK82hE461FDrAUR1iKc3mm5wBKcQSlOE9GNL44yQGU4ghKcXVwRDwsApbiCEtxHo1ovKvFAZbiCEtxHo1kOnWAUhxBKc6TEXi0jAMgxRGQ4jwXqfDkEHAURziK81gEnvDkAEVxhKI4T0UyswpAURyhKC5QFJyq5QBFcYSiOE9FNMzZdICiOEJRag9F8GU/NYAoNYEotYcimXS5GlCUmlCU2kORTMJeDShKTShK7akIPgO4BhSlJhSl9lAErxFrAFFqAlHqcMgXXKHVgKHUhKHU4Y4UnOpWA4ZSE4ZSeyRiMl9g6IM1QSj1wuWnVTVAKDVBKHXplK8aMJSaMJS6WuSnVTVgKDVhKLVnIgYORTVgKDVhKHUVekEYbKkBQ6kJQ6k9EzEwfb4GDKUmDKX2UMTA4+hrAFFqAlHqcMSXwl4MIEpNIEod7phXuBkBiFITiFKHO+Y1nBLVAKLUBKLU4Y55hTsCAFFqAlHqcMiXxn4MIEpNIErtmYjG+ytrAFFqAlFqEYgy/goAotQEotSeiQgFp0Q1gCg1gSh1gCgKzq1rAFFqAlHqsBUFD0g1gCg1gSh1gCg4d7gGEKUmEKUWYYECJ6Y1oCg1oSi1CAsU3BsAilITilKL0CFmvgLwREJR6rAXReP+DFCUmlCUWoYOEbcFgFFqglFqGZbK2A8ARqkJRqk9FcmssWqAUWqCUWoZlsrYkQBGqQlGqWVYoGBHAhilJhillmGBgvsDgFFqglFqGRYo+DMCjlITjlLLsEDBrgw4Sk04Si3DAgW7MuAoNeEotecimTVWDUBKTUBKrcIKBXsiACk1ASl1uGte43cAQEpNQEodbpvHZ9PXgKTUhKTU5y0p+B0AklITklKrcABn5h0ATyQopQ4oBW+HqAFKqQlKqcMhX5k5IkAp/b/99+tXq81zsz82D99vHpovr/7w97+/+uWX49dd8+r1P1/9sgr/2K5gvaJXf/jnq1b1H/75f1+/qurzH7qb28MfLv/SLkL8H7oc1fCHdl3j/9AlSYU/OP9T+6ezneGfewv9b53Jv+yb/zk1h2NsTjcRu9jTTbU4gpYfD9v16dg8bZ+TZ+ua30VYF8Tw1buWNlXqdndcbTeH5MXVOhKu5SSZu+XmuFofd9vDygveLe/Tr9LOJy/Cu1zYKcJ/326fCpJlLFnxJN/fN7vjftsK3y8fOqeKRYrKvYiUwQtYIg+H3Xa9uv96v918Wj3GIquqfhFZKccUeVw9N4ftaZ8+crtAezHv7MfWnJ1hoXmyHx7I968WkadWwnDF7NvHTt5eO1Jf5Ah3tkv07UwJ5vt8eFptDs3xuNo8Evkyls9sUZ+etg+p31SRu3fnNbHEPHZ/i19aZEslz59iwZO1ftzuV8fPT8nDCRN924rpJ+vVMn1FIvI2KZgesVmuvx5X96lTuMgpRN+fdneYhT/UvJ7xIvt+uVt+XK3bptykemwd62G+wV7qQ/O8SptI3IKrs7FCMj9yKjZvcvxqxESTm83jatOEjuK0X3ZdW9LEKxEPY+ehSZnzH7ob2Capa73/tE47kdh1lZlofpB3OO1227TvrNwi/pDMjn7zmBonTNzFWeb4tvl62q9iMZEpzOc7PazafuK+/W+fvKzYPbuj9acKy3/oePjS/fSku5uLraLZAHujbkTXzG4kEibyBsdur910O/OSF9FHb5ft51dhmN1Xp6Id0HenY2qui78cswd4kZW3VkcuoZXsP9xka9NORccDSj3BXDBNsCp2gglfKsjKPrqI27gK77T7UBOaRdBAHl3Ej87s4E7HbWtn25OmvVA0tlfcL3Lcfmr/8UAnCt2pjS8eJM9P2x3QyBX72GxjgbWJ51n859w0j9vjavA1qjoeOi23rR+3h+OSzHvreEgQzKn06Us7OC73X9O5pIqfkTlJ6CV1xZabBzI7jT+pPPeTwvTTS3v+LpY5WHxc3v+6Xj1+bhv4067ZHIbt20Xu2F3FET67Oi+6utOHZuvpYq3xTDTWxOxAPq6ObcNMZ7TxlOHcH6neXs3sS85y16unVeobLnr/qp/qamYr+Lh9SPxDinh+yhRx2jy0zrH99KldFaTPHY1IhvucZ3GD8IFYxMJ4rdMLS2fg8YRBLXizj4/7zlE2ZD3VnWj1YlE/BbfMtcH9cr3ufDANI0Q9WpcHwBOULFR0/J4c86XnptI6sseeXUv0nuuYa4xYePPl2LY12lHaeOHI7N7uPz4uV5v0e6j4e/TjgeO12/vtertvewEwrKp44dwdbX/+0MzHb/uXVqR/A19HQj06Xh51eRiTFeyb9bILTmQV1LECXivqFHTBhFYYbZXdHeUvUxnJ63SGURgRzwtEfX7DsjrH+RSz700mRod00Ii7osV5Cuv6walecL9lrKAhE1oRz+qYXjycIsUrLNfbV3G/1KadPGyOYBDqri19Mc9OkLc/3R+3ySom+ejnRbzsG5y99A920XcUbL84rjanbTfVo/HVOATah65qyf5qkVwYYY2bnWG/m7PUc4z1uVlv79smCCKh0UDR7bWfJr6LshZkx100d8hoZe+XaTy8Ox0x6uTOoXbLDJ/c74e9sYzlVX1vzGsXD633HldP5FGjkZv35Xsxg8lE9NI07wkfll/9dPGwfKaBTxW3LJ7zPDSflqf1MY7SF8P0Ui1iHbxRnSgpRuuliqMHFa/B9gqiCHsyrsdTkYr7yYJMfuuSKl5NV7zV9EBLsZFJFXd4zAXGWcVuv/20SoNocYDC6n4EmvTKz1LTsT1yQ9sjqAWzvZ3FHn8/7JrmIX34OGTFnN2+yOua35aEfpLmx5xGnSX285uzV7Td2OawXmZcOh6Qq0kvolfTuUVZRxwlZEY0zjqGbzoehow8z7eNZVu+fXxs+6Z01RTPieuepC64Lvy4b0j8N+omJHMWAShADN36eOL5/6KfYMt+0OgOjQt/YA7NY3wgeieCOWcNIlebT9v902CBYBbxGHx+DH0Bf9yX7TUkEam4AxV9aIVJAHt52deg4o/AnJUEoYdmX3zBcbhKGKbkz/e7dEkQtV5RnyeXkttNttKeTSwvXvcz4+4Pq8N9O2FMI2jdMXcvH5sZA79I+vg1aQcu6girxUSrNtvjmfOk3Ujci1SC+b56oWh2HPdxlpl/cBHYLhy363Q27+I4K7d19PIOq45JHckKPR5RLJOZtSJ36+XX1Okin6v69sa2sBOXbRQ6fmquB6ZfQsRfQjKTFR62xy4TOZIiYymS2aV2UrLgwcRRhXNnXZ+nIFIwZ6udht3hV7KsFvE3kdyZbyfr0Nyf9u10Lo9L4sFRcmeOregvaQZJPMuV56evemIomSsoLzcfwIi5Yc3sdLZHmX73OLgrmWadduvmSzomxY3EccWA11/HWJGZDNELaudkj2RJF/fLzLjnw9e2xup+39xv9w90WVfFcx3BTN85S2znjPe/EmnxeLZgOtvXDekCbLQSYYZVmk/rVTK0ytgRVN9OLRNENuum+/vq2CRxZ7mIA+vMUaLZLD+u09FLxOkPou6Dzn1aoOyppuzJj5S8L+MpN5keyzifrM/lkH3U8cKO3flfNDMi26tabY7tTGm5TnlN7PXM/qzZ70kELl7zXmbH51fjmEGI5rn9W3a8ikeJijnP8RJJxlMc2j9/zD66pJkJkkHs6ePhfr/aDXl/HLlgTo6bL7vt4bRP13IxSTN9cpJRfR4qkwj3oilLjMNhmjd096JoJEzGE+zu9u9gqeFKBQwm7j3dWWC/XKwWfbpu3zSqPrux6qO+lTl3I1Wf8Fj1abBC9I1Y91MqfWnNffS46v+ln3bJHuhL1Tf0Plov+15BLS6A4KxLmf5fenv0ok/dWfTNufdD3Ruv+yak+zwu0ws09vyTcReg1Jfpe05zSVXuOyfbEwZb9f/SP6AVfXPtWXl3xUT4Q792tH2HY+vLH3pk0T+FYyKLy9cm1D7O6ehNqvonEszI+qflfgCku5sooyiG7t8jr2F+Wq2PJGUqTj/RzMn4p9X+6bflvjntHvfLNG2kjrNpmf1vL65dgAzgZbyaEZr53lZfSOgnRgTa9EkNzMWRF/d5+9T04d10wRp1a5YZsvES29UMidxVMRAWTHr+adux7mbzePychpLiwdcx7eoSgVJvixMAVd/smGsOLy6fSRYnBBnmQmkokg4EcUSO+zl26UNX8cSZJ2Hflh8kpshIkGVGwi6SQCpKnKbUw1vNTOH+tN8+0SBQFUsU+jIZ7McI5jS6E71fprPMOBGb2cwo4pLxAsaIflgwvD7gsdmu25YxnM7EPYHkxX4jWe0/78lULt4/UjGXo61ECmFVbJllftXH5hjvlkiBRTw5rNmGZaesIiYVsveWmoksOsFxs0XZE3Gum7vs7BDzFBDRMfa/UCHmcNeKLgaoRRwfk/3cpmYGBzvpJBAVjymyX3fUzKzyVt7n7eHo6ydGxgNCP0WsmVClFbryyQ+Ej8dCLTMTtpW1aY6/bfe/+hXcpyVxXBG3BGl6R1PcxnrcbB9IU4hpubvQO+ZqppN4TKPncbqy7OcTNXN3Qitve3iAoeB4t5i+fHe2ma1YIjAegfr1Qa3Y37xLTGqO5F2a+F324UhmwOtFJnr+OAznqgkSh7i2u70r4rXsht5OLna034sHswt3YgY0O5FlniPiFbbsE35qJrh9kU+MjruQiysxJ26d0M1yd/i8PZKtJSrOlLB9FLZmhhdTucgDZDyb5rentmc6pjNXHQMu5/pORPK/mhcJ05mi7+X4nfLhuG+WT/R9yjhboZ9g18wszVgqfJtxf8KMBnUyvx6OzVOX3bPcPNDoSBxodX3s4OIIzNSWVsnz6qFB+yGUTBIt+ubADA89bo/b3FJNV0kUpu8NuZNAIhm9bxeDGsmct7RyQ5eY9rJxrnIfuaiZq6QXmdDKeDDkttztM1hjxoBV9SEY1cf2NHNTxuNpuV+2M4HmAS6jRLxOVH1YRzPRyGfRnQIaB9Lj1R2zO+iEFLYFxaF5ZvpSJxHkLok63mLEHAI+L/cPXfhklcQ8Khe1I8FM7fjcdEl4aQQgNujc3E2/qbkPxBnuY7cNCFJ1lWRtMaNZaJobxxTOtl0S6qdJRStmGzn8RHGZtUMV77cRmjc+fz4edw+rR3LmQiWS7V9M81pRhXBenNhd9fHgitnLd7LPXzvz9DGtqRZ9jJvrTJ14P1R1Oz1OyYeK32rVx40rZpbai+D1MOcr7j2rPlxcMZdRn38DJwdUcQcnLE/S6mnZfX8/o/x9uKci3ulg3GVPBe/5O9nkqUUcKbpsVbmwmz4wyISFZwV5OBbn2DDPFTjLREcnqDiwYJgzNiKPhBnjkwYscylAJF7QARUdz3+YLS0vWqSy40URc4GVly1T2XH8isnzu24hdbN42cIcnVebsGG52+qx3RMQE6eAMUOwl6gEzWsXsR8Jd8nA4Q3Trdh9a+Fw038c9ZeG2UST11bF45JgTvQLuYvxEr9iblRMxeGdaHEYpmLG9Va7IbSK9wIxkwZWu2eVelr81plz9U5Ifh4YsxLB3CvSSaTBsDSSHmfTMrc9rUhypkgSMZjwsROSf9Z4K6VkkqpOYvFZ43xcyQSwrdBADdN01OitMZOVVvv703HoaipeNJp+nWuZsd1IaLf1fPnwj9Ph6EskKmLIVvcqmJvSVvtVuhcv5hGmXy4Z7ijaTXpW6bxSxt2BYuZF/trsPzb7du67/bVJO4F4KlFpnkf/2qSJpDHakMwxsl2/Hh4amOQi4m1e8hLVYJ5/1gkebs8WcaBEMjeMd6LaZeE/2nFiYGIccmYukNbNc5OkR8l49mr67AnTn2tk9CUdo/ebPlvF9MfD2X4VYJmbX9arza9pbxSH95mDVSekY3BpslcVpxD2DUcy5x6dmzebdkpDz/JRMeiyzGSip+U/0hyyOOWAuS3vabk50SeMtyj0qTGS+eY7eW0nezzt0z6tipddQvO+wNMyyVOVcXavesmo4Vr2JZt9FcctTL/WMEy21AoecuS4Bxd9xgwz564VuHo6PW1OT1139gkAEZXsDGMu36DY4/a0J6LjAC5zq8dA9BCOVPGmvooZpjvL3R8Pu9N+NYwGVnGSm2DGrjqhgwEsPhekT54y/KffLQ+HdpLx8Llt4FtyQEscEa/4PtWLBE8t4/x0ZpitldiZ1q7g88g6zn6o+G/zcNz7LRwDO+PxQzBTMlp5p0Oz76oBifEauGLuCjlLTL0xXvFWzByvp+ZhleacxGuzvpH3m7oumUvMxb+Xniyd4+6OSWeCEHBYnIiDqpLJtb20/G6zeMXGzPYaSMSLtpgkVnbC1wHxbRkfoWWYA3UsbHjcV2WSXXzcl3k4tK0vjZir+EktM3761ByXD8tj4ooyXo4b5kGqvaDCyWtxVnofctPMtORe/KFZ7u9JzxC3HGZQ6ImMsfGkXvWTR8vcQtEKy88G4lfZpxYbw1vTtYIHs4GY1hjR5xgzwy6twOFwFZ99InroYJjus9qQaWPM/ZjtY3W4T+PJcV/FzIHshOR3nMaMgjtxIufJibiDltV5WJf9F5D2suo6v0JVX/5woUz9ORf9rmbTbwgzfRq76RM0TL/j2fQnXJs+C8D0m+hMr8IuLi57Xu845pmJ3WMmU/bKJQMRs3V2my+XT2QfUZyqyNy+2gkaJkOoeEeDYx7J8bRrHgk6jVkgM9TvpRTYaRxaYOIJLxLB03jloJhB+afjKXX1OJLKXGY/ndbH1f2SRk2Sc+nOHqf67ff6ctAn85ioi5L8y6yTxGXmVz4d10Pb46m8Zq5eKYmN+4zzw/enFvYpkqJPxZOXtt5DQNXvu1Hqsgvl8oe+sOk3liwub7VPi76c2dznPmlzyZjuC19iG/0+GdufwuaYrrhpwBYNGZ9MaeRlqwuvwZwjpOnKKu5S+j0fgjnynwXmOvf4XFtmwAtIhFNHk5z7NEm09/HsFvx44cGcjBcDz8nJ8kxKRAWeAVQ4uexI8GkVnxogmGd1Ug3wHYt4k4FkMhUqmWK4Ko4hC2bskgodxP3iDlEw1yib5rdSpnAcx5DMI5BAdnDcBGyfF8YccTtxgyC3jNP6NDOSv9mu2qVx83AaBH9VPHeyfdKB5VqYJi/HJ0P3QV3JTJBFYe44O5Z5LcF283G73D/82nx9bDbNcCSrknPsubZtnlef0u8afQOeD3sZIGcujr3zBZ3vRUHyEtLFl4hSfat46c/rZb0ssNsuXgkyLyvZ7lox8LqKeBHCFbZftX8dTmziE0wl8yydcMr4kIDEWEYzu4wga9jK49CDZrrpbpk27TjDyjEnbefjudIVeDw579PyXb/Ocv3cyzHjqGcVfnKTum4crVP9Yk1Ps9wfzgVOW4wj6czJyG7ZJY0eSUxRxmhIMVdhXZR393m/PJCFa+x9zIlhHzBOMseiDx2qMYMEuyWJvMYh5wuoO39f5vElNCYZn990ltgvWfqoi2PCHZR7LZPOuI/Puj4u65hH0O72jd8726VNwDt44kw6ZvgkkmmQzLh/FTWz9XiZIGM6PgZU9GEIwTzq2VOi/XODcghjWnA5q50vdZBHq+KVuWPmnQdRw0BGch7ohGelO4/irQf2sgGR2fOcERvpw5VLDgTuu8v+eATXL98cE1S/kLzha0gOMuVavepuS0qzH5LZwyXi2J9gZ5goZrfffiSb+eKkRmZEFAX542mE1pfdANwP7wXmSUecPtKPcxVzN8BZOFxJyfhoaM1MTMFbz+L8gT4QUTMDimeJYLIR53+cW3ifuGH7szZcHyJ1vV+4PgXIycu/9L3updblUGl9+UM/nlyOveEOVjh9JY4oSeZ0sBXVXXOyTl+uil8u87Mf0pVonAYrmWx154+z3W/XD6v98PlkvAxX/Qkqus88d8yl2lAJ3CYZ7+rkjvfH39OQUtyKQp2+q+udoQ+YiT7rzfRRcsfchN8qzbfj5Koy9kPk8VicOqz7MKLmTneJZNxDxL6nmVyPSoYfNNlTx+x5jr+D01ySw7KZSYqtJJ9C/dzQk+hVjGsdu6H8nqMQ8WMyNyG30jb0CsMYhFq+K8LjW+JoiGPu4uhkDXbsqRj6OubJNxdJ3YShW0oPd3LEW80tM+SbiM3st4r7EG7Xfvy9m9QQ343REpPo+4OwB4u/2CJmIAmeqB2n0yomwukEDRxWxpld+jJ8MjNg8encKo7lO2YeTisKNM74zF3HjPz8z2m5ptPJODat+nOxNbNL3i8fVulbE/H0TzKTywYHTso4xVf1CFf1SybFzOruNpOeh9T0mWMf6Qc+zZyX7Je/oSuP44PyeH24F3TYdcggkRSHqJifoVmuO28L28GLe6tieMI8ZqadizSr53Soibf79HNN0eM3wxzEesFZa+N0CMFM9O6FglyheJepYB52fTm+NJ3PxoDk/PRM+nIRmD/MOI4SMOcZcG+RjFe3hv3+PjX7ZnM/XIPEm0GZol7uS0rbSrzqdv0SibkNZ+QWJhXvp3TM9OYJNx+oeKFouf0k88oDFfeelklNO+Ff0bWacbip6ru5ipmW1UoFuzdi2sB+t0/bdv6BznuPUzYqZmgoiOvSSD8vNw9rilrjgz+qfqlbMQ9t3XunQucxxINtn+BWM1lxLBWeyBBPQpmJNftmcLx6Elvse2TeCjlIy3fDcWfPxJlgiEymeNyP7a/XGaS6xCdP9ME63R8iaplneoDT81WMlC179A2D+OBOpXgSY9jNrhu70m48Pi1Y9dDWMffd7bdHeqRGDK5kfyqr5M6pjrtfYMpTFfMbwVxMddK6PQW/HMnhhPFhWFV/ZJtgng3QSR0IjIevPvNIMCfOrUD8zHEud8VMldgPLiWPbxllbkvohIxepx5v0ukjeYq5F3CfuercJodOX06d5jnPYfmERpX4WzNZfStptx6cFiPjPdrqkgXGbHuH+4d1flYWJ8IzQdDhvtk0Wawd7xDsJ0GSuaHZH1SW2BdnNgtmhrSX8tAkeRNVvGFKML3RC6Kn1ldxRqJgEgV0Aluc48QMHA0T3eP9Kn36vGBu3g/S8uNjnOzAjPX6CzTgLaLR6i/U5X6D85UcaWuN++SeF4hLn888AvNy20fuDSRXjzN32SCheA9KfLx7xQz6F6Une3uqeHJXMU+d6MX7i/kGi+x4qOE2xWbzsNuvnpbpNX/SJHEFrm/tV8t12AKY9hHxupUJCs9JR+nAEgOUKVLyp8vGnWGfrVIzjyCGRyDGkQ7Z3zbhmHcDHc438oL79eJTLJS8pCn3uchs9zzmD6qLc4Iut9QyFwZEMFwgx2F95imLB3AKapx92dOimjsR6E8CTZdZ8Uqoj/rVzCNILiLhGiuOu7J7/bNAFKVTcVtyzJXgAZ4wGifHyH4Pfs2c6h7GDmyMA/T9CW6Xs2CZ+UxICXrL8eSL2dA+L3ets66/PtKMoThrhOv7n5f73eAm+bg5mf7JLTNx/LDqppnD+3jiBSgzjTAEJIdkPznt+fyB+j1PitsDdoGk6iFzwIWM5z6KeTaNFynyIpNvzWyhO5rCreKjWhz7YQnzEfHWJNH3G66Pgrh+d5jTlzRIZi99SPeIijjIIpmAFZClONVGcz2x7dfSYSKOc75cDMd8slYaPIQ9HhuYe/3QZvYkuTCevjEPjD/L7M7gOuBdIHEKA/Ng44BH0nySmK8yz0YapyzxifAVEyvFVzANr3uWMQjWTNRweXHNcvfUzQvSI0LjjrFiBt+HIslm/vjJmYm3F5kv1DqNiSc3wDL9+yLzDJvJQBWfhMe8A/gi8kKY0kVgvL7kenkv8pyNnx4BEUdFmHGqMEqnK8A4eNsPMIIZBMoesBkvmZjJjEFWrs3EE7SKOxAMJML1o0sSpqcYCw4AjSfPFTMWHoTtm4/bbbp7Jka9st+xXDOnp8dm3XzJh6vilGDmYbV0V4GKz1F1zE4WrJmSjqZnxP2ZHJecw5eTenkz307R79tNOitPBlaemPWherNIzU3Sqftjb5kndXh5VSovpmbMAJYXk8Ypkqw95rUQw4znOCbcp/7Jy0bc/hTvfpeZ6vG26idRyvSbPvqb6/TlVO4+d1D302zdO7XuQ/j6svu+37Vre4Bj+0MAHBNVH7dd9Ptp1zb5YeZUvG/D9M9lmT1LxGhT90rOZ2C2007W0+o4uD5FmCSplyntSFJZ4kQZ5oyUnmwq4y0l6nLlJfP5yJ0GyUVGPXPoz15Q/SFmNbMfPu3T/VvJ7cpMCQQ2xPPG3vF4kg6tt502aRce5/3Jns2pvmmoPtKs1GUXfJ8Rv7hc1Hm5MrFvWf31SrrPcNf/r7Jry20bBoJ36XdRlA/RylmKfCiukAhQbSN+yA6Qu0eSPfKQotzJAbykKVEc7s7MinKooSz+WD1tGOEb0f8fNlAciBHUbUd/L1imDsTfXbH42ke7ptKjfUqv821u2mFwPKxnVVz2UynFQ+VUtcekMMU0OzXKyPozCb+RA4nQ9RrIJoE4hyGqhU51u10nNQbPbLpSLFaM/T+qTdVeDs36QZdAPjp9wBkiMlbHQcZ+wQlPmlmYhQg3OJhdnjBfAwr18VDoB/4enHEB564Qy2rjEDmOEPMWjVh8HIMtcSsZM3rxapAGtPGScipQvLhcI+bZI6y59SIHl/rVxG8SX8snlCEWRSjo8mPn+5t7moQN4hdkYYS8mQRvCyca0/x3hNhHj/N9TsxELg0xT6VGPr7fjZ1dE89qu5WYd1lqbmQ4028AhVb3cpe65HU389fiQq8Tq1xdFWOjKMekfWK7t+ZQv1TtrDUgqzUDeHgBwGYlNt/j8GmrV7aGE/1Euv7B/L30v2rWM8q5Zx+QgERJKIARRaiUDpHOmjvUiOz4PmSsI+bS5tTAexJsw84oiDmjro+67aL4rP4NaBoeRHvTbr+rjvvqZaAP3VOa//rD/rV+vzu5ZKhFvH+NqOzpRzu27W7bbA7ZkJE9hrje+3kuNhubU1ai0ixyUbbM9HZANw7kND9dn3B5DhB3l2JDtPOv4vdTBmjzoS+C0fOgO4//P8N1ZAUMHHQMKtcGLhEGjlsG5S0LhaRFKymLO5nFX7V4/yx8AyzSFVYsXp8HG+xYPmNZRelEj7NzRqfC+BQ9QbyIo2L+LqsTHJbT4dF7KN4DOq2V4m3/kpk1Q3+Rwv5Rv28XUQrDIBE4DFT4eFIMy9DzrkQ7uRJWkSWyVqW4nYeBMkYmfLB7NL0uxH01xFxyMWEZvfIiPP/8sWt2g2FW/5s/z5+fX4BceVtMWwMA"; \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css index 958d2c26..d0c980d4 100644 --- a/docs/assets/style.css +++ b/docs/assets/style.css @@ -2,38 +2,84 @@ /* Light */ --light-color-background: #f2f4f8; --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; --light-color-icon-background: var(--light-color-background); --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); --light-color-text: #222; - --light-color-text-aside: #707070; - --light-color-link: #4da6ff; - --light-color-ts: #db1373; - --light-color-ts-interface: #139d2c; - --light-color-ts-enum: #9c891a; - --light-color-ts-class: #2484e5; + --light-color-text-aside: #6e6e6e; + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; --light-color-ts-function: #572be7; - --light-color-ts-namespace: #b111c9; - --light-color-ts-private: #707070; - --light-color-ts-variable: #4d68ff; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: var(--light-color-ts-variable); + --light-color-ts-method: var(--light-color-ts-function); + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var(--light-color-ts-constructor); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: var(--light-color-ts-property); + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + --light-external-icon: url("data:image/svg+xml;utf8,"); --light-color-scheme: light; /* Dark */ --dark-color-background: #2b2e33; --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; --dark-color-icon-background: var(--dark-color-background-secondary); --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; --dark-color-text: #f5f5f5; --dark-color-text-aside: #dddddd; --dark-color-link: #00aff4; - --dark-color-ts: #ff6492; - --dark-color-ts-interface: #6cff87; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); --dark-color-ts-enum: #f4d93e; - --dark-color-ts-class: #61b0ff; - --dark-color-ts-function: #9772ff; - --dark-color-ts-namespace: #e14dff; - --dark-color-ts-private: #e2e2e2; - --dark-color-ts-variable: #4d68ff; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: var(--dark-color-ts-variable); + --dark-color-ts-method: var(--dark-color-ts-function); + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: var(--dark-color-ts-property); + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + --dark-external-icon: url("data:image/svg+xml;utf8,"); --dark-color-scheme: dark; } @@ -42,19 +88,41 @@ :root { --color-background: var(--light-color-background); --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); --color-icon-background: var(--light-color-icon-background); --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); --color-link: var(--light-color-link); - --color-ts: var(--light-color-ts); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-class: var(--light-color-ts-class); - --color-ts-function: var(--light-color-ts-function); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-module: var(--light-color-ts-module); --color-ts-namespace: var(--light-color-ts-namespace); - --color-ts-private: var(--light-color-ts-private); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + --external-icon: var(--light-external-icon); --color-scheme: var(--light-color-scheme); } @@ -64,19 +132,41 @@ :root { --color-background: var(--dark-color-background); --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); --color-icon-background: var(--dark-color-icon-background); --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); --color-link: var(--dark-color-link); - --color-ts: var(--dark-color-ts); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-function: var(--dark-color-ts-function); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-module: var(--dark-color-ts-module); --color-ts-namespace: var(--dark-color-ts-namespace); - --color-ts-private: var(--dark-color-ts-private); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + --external-icon: var(--dark-external-icon); --color-scheme: var(--dark-color-scheme); } @@ -93,19 +183,41 @@ body { :root[data-theme="light"] { --color-background: var(--light-color-background); --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); --color-icon-background: var(--light-color-icon-background); --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); --color-link: var(--light-color-link); - --color-ts: var(--light-color-ts); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-class: var(--light-color-ts-class); - --color-ts-function: var(--light-color-ts-function); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-module: var(--light-color-ts-module); --color-ts-namespace: var(--light-color-ts-namespace); - --color-ts-private: var(--light-color-ts-private); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + --external-icon: var(--light-external-icon); --color-scheme: var(--light-color-scheme); } @@ -113,23 +225,55 @@ body { :root[data-theme="dark"] { --color-background: var(--dark-color-background); --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); --color-icon-background: var(--dark-color-icon-background); --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); --color-link: var(--dark-color-link); - --color-ts: var(--dark-color-ts); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-function: var(--dark-color-ts-function); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-module: var(--dark-color-ts-module); --color-ts-namespace: var(--dark-color-ts-namespace); - --color-ts-private: var(--dark-color-ts-private); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + --external-icon: var(--dark-external-icon); --color-scheme: var(--dark-color-scheme); } +*:focus-visible, +.tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); +} + +.always-visible, +.always-visible .tsd-signatures { + display: inherit !important; +} + h1, h2, h3, @@ -169,16 +313,6 @@ h6 { margin: 2.33rem 0; } -.uppercase { - text-transform: uppercase; -} - -pre { - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - dl, menu, ol, @@ -191,61 +325,25 @@ dd { } .container { - max-width: 1600px; + max-width: 1700px; padding: 0 2rem; } -@media (min-width: 640px) { - .container { - padding: 0 4rem; - } -} -@media (min-width: 1200px) { - .container { - padding: 0 8rem; - } -} -@media (min-width: 1600px) { - .container { - padding: 0 12rem; - } -} - /* Footer */ -.tsd-generator { +footer { border-top: 1px solid var(--color-accent); padding-top: 1rem; padding-bottom: 1rem; max-height: 3.5rem; } - -.tsd-generator > p { - margin-top: 0; - margin-bottom: 0; - padding: 0 1rem; +footer > p { + margin: 0 1em; } .container-main { - display: flex; - justify-content: space-between; - position: relative; margin: 0 auto; -} - -.col-4, -.col-8 { - box-sizing: border-box; - float: left; - padding: 2rem 1rem; -} - -.col-4 { - flex: 0 0 25%; -} -.col-8 { - flex: 1 0; - flex-wrap: wrap; - padding-left: 0; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); } @keyframes fade-in { @@ -288,22 +386,6 @@ dd { opacity: 0; } } -@keyframes shift-to-left { - from { - transform: translate(0, 0); - } - to { - transform: translate(-25%, 0); - } -} -@keyframes unshift-to-left { - from { - transform: translate(-25%, 0); - } - to { - transform: translate(0, 0); - } -} @keyframes pop-in-from-right { from { transform: translate(100%, 0); @@ -323,7 +405,8 @@ dd { } body { background: var(--color-background); - font-family: "Segoe UI", sans-serif; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; color: var(--color-text); } @@ -341,6 +424,9 @@ a.external[target="_blank"] { background-repeat: no-repeat; padding-right: 13px; } +a.tsd-anchor-link { + color: var(--color-text); +} code, pre { @@ -352,13 +438,29 @@ pre { } pre { + position: relative; + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; padding: 10px; - border: 0.1em solid var(--color-accent); + border: 1px solid var(--color-accent); } pre code { padding: 0; font-size: 100%; } +pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; +} +pre:hover > button, +pre > button.visible { + opacity: 1; +} blockquote { margin: 1em 0; @@ -374,13 +476,12 @@ blockquote { padding: 0 0 0 20px; margin: 0; } -.tsd-typography h4, .tsd-typography .tsd-index-panel h3, .tsd-index-panel .tsd-typography h3, +.tsd-typography h4, .tsd-typography h5, .tsd-typography h6 { font-size: 1em; - margin: 0; } .tsd-typography h5, .tsd-typography h6 { @@ -391,91 +492,18 @@ blockquote { .tsd-typography ol { margin: 1em 0; } - -@media (max-width: 1024px) { - html .col-content { - float: none; - max-width: 100%; - width: 100%; - padding-top: 3rem; - } - html .col-menu { - position: fixed !important; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - z-index: 1024; - top: 0 !important; - bottom: 0 !important; - left: auto !important; - right: 0 !important; - padding: 1.5rem 1.5rem 0 0; - max-width: 25rem; - visibility: hidden; - background-color: var(--color-background); - transform: translate(100%, 0); - } - html .col-menu > *:last-child { - padding-bottom: 20px; - } - html .overlay { - content: ""; - display: block; - position: fixed; - z-index: 1023; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.75); - visibility: hidden; - } - - .to-has-menu .overlay { - animation: fade-in 0.4s; - } - - .to-has-menu :is(header, footer, .col-content) { - animation: shift-to-left 0.4s; - } - - .to-has-menu .col-menu { - animation: pop-in-from-right 0.4s; - } - - .from-has-menu .overlay { - animation: fade-out 0.4s; - } - - .from-has-menu :is(header, footer, .col-content) { - animation: unshift-to-left 0.4s; - } - - .from-has-menu .col-menu { - animation: pop-out-to-right 0.4s; - } - - .has-menu body { - overflow: hidden; - } - .has-menu .overlay { - visibility: visible; - } - .has-menu :is(header, footer, .col-content) { - transform: translate(-25%, 0); - } - .has-menu .col-menu { - visibility: visible; - transform: translate(0, 0); - display: grid; - align-items: center; - grid-template-rows: auto 1fr; - grid-gap: 1.5rem; - max-height: 100vh; - padding: 1rem 2rem; - } - .has-menu .tsd-navigation { - max-height: 100%; - } +.tsd-typography table { + border-collapse: collapse; + border: none; +} +.tsd-typography td, +.tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); +} +.tsd-typography thead, +.tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); } .tsd-breadcrumb { @@ -558,13 +586,13 @@ dl.tsd-comment-tag-group p { } .tsd-filter-input { display: flex; - width: fit-content; width: -moz-fit-content; + width: fit-content; align-items: center; - user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; + user-select: none; cursor: pointer; } .tsd-filter-input input[type="checkbox"] { @@ -587,11 +615,8 @@ dl.tsd-comment-tag-group p { Don't remove unless you know what you're doing. */ opacity: 0.99; } -.tsd-filter-input input[type="checkbox"]:focus + svg { - transform: scale(0.95); -} -.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { - transform: scale(1); +.tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); } .tsd-checkbox-background { fill: var(--color-accent); @@ -608,13 +633,18 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { stroke: var(--color-accent); } -.tsd-theme-toggle { - padding-top: 0.75rem; +.settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; } -.tsd-theme-toggle > h4 { - display: inline; - vertical-align: middle; - margin-right: 0.75rem; + +.tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; +} + +.tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; } .tsd-hierarchy { @@ -625,6 +655,28 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { font-weight: bold; } +.tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); +} +.tsd-full-hierarchy, +.tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; +} +.tsd-full-hierarchy ul { + padding-left: 1.5rem; +} +.tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} + .tsd-panel-group.tsd-index-group { margin-bottom: 0; } @@ -656,43 +708,6 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { -o-page-break-inside: avoid; page-break-inside: avoid; } -.tsd-index-panel a, -.tsd-index-panel a.tsd-parent-kind-module { - color: var(--color-ts); -} -.tsd-index-panel a.tsd-parent-kind-interface { - color: var(--color-ts-interface); -} -.tsd-index-panel a.tsd-parent-kind-enum { - color: var(--color-ts-enum); -} -.tsd-index-panel a.tsd-parent-kind-class { - color: var(--color-ts-class); -} -.tsd-index-panel a.tsd-kind-module { - color: var(--color-ts-namespace); -} -.tsd-index-panel a.tsd-kind-interface { - color: var(--color-ts-interface); -} -.tsd-index-panel a.tsd-kind-enum { - color: var(--color-ts-enum); -} -.tsd-index-panel a.tsd-kind-class { - color: var(--color-ts-class); -} -.tsd-index-panel a.tsd-kind-function { - color: var(--color-ts-function); -} -.tsd-index-panel a.tsd-kind-namespace { - color: var(--color-ts-namespace); -} -.tsd-index-panel a.tsd-kind-variable { - color: var(--color-ts-variable); -} -.tsd-index-panel a.tsd-is-private { - color: var(--color-ts-private); -} .tsd-flag { display: inline-block; @@ -707,7 +722,7 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { } .tsd-anchor { - position: absolute; + position: relative; top: -100px; } @@ -721,146 +736,111 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { margin-bottom: 0; border-bottom: none; } -.tsd-member [data-tsd-kind] { - color: var(--color-ts); -} -.tsd-member [data-tsd-kind="Interface"] { - color: var(--color-ts-interface); -} -.tsd-member [data-tsd-kind="Enum"] { - color: var(--color-ts-enum); -} -.tsd-member [data-tsd-kind="Class"] { - color: var(--color-ts-class); + +.tsd-navigation.settings { + margin: 1rem 0; } -.tsd-member [data-tsd-kind="Private"] { - color: var(--color-ts-private); +.tsd-navigation > a, +.tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; } - -.tsd-navigation a { - display: block; - margin: 0.4rem 0; - border-left: 2px solid transparent; +.tsd-navigation a, +.tsd-navigation summary > span, +.tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; color: var(--color-text); text-decoration: none; - transition: border-left-color 0.1s; + box-sizing: border-box; } -.tsd-navigation a:hover { +.tsd-navigation a.current, +.tsd-page-navigation a.current { + background: var(--color-active-menu-item); +} +.tsd-navigation a:hover, +.tsd-page-navigation a:hover { text-decoration: underline; } -.tsd-navigation ul { - margin: 0; +.tsd-navigation ul, +.tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; padding: 0; list-style: none; } -.tsd-navigation li { +.tsd-navigation li, +.tsd-page-navigation li { padding: 0; + max-width: 100%; } - -.tsd-navigation.primary .tsd-accordion-details > ul { - margin-top: 0.75rem; +.tsd-navigation .tsd-nav-link { + display: none; } -.tsd-navigation.primary a { - padding: 0.75rem 0.5rem; - margin: 0; +.tsd-nested-navigation { + margin-left: 3rem; } -.tsd-navigation.primary ul li a { - margin-left: 0.5rem; +.tsd-nested-navigation > li > details { + margin-left: -1.5rem; } -.tsd-navigation.primary ul li li a { +.tsd-small-nested-navigation { margin-left: 1.5rem; } -.tsd-navigation.primary ul li li li a { - margin-left: 2.5rem; -} -.tsd-navigation.primary ul li li li li a { - margin-left: 3.5rem; -} -.tsd-navigation.primary ul li li li li li a { - margin-left: 4.5rem; -} -.tsd-navigation.primary ul li li li li li li a { - margin-left: 5.5rem; -} -.tsd-navigation.primary li.current > a { - border-left: 0.15rem var(--color-text) solid; -} -.tsd-navigation.primary li.selected > a { - font-weight: bold; - border-left: 0.2rem var(--color-text) solid; -} -.tsd-navigation.primary ul li a:hover { - border-left: 0.2rem var(--color-text-aside) solid; -} -.tsd-navigation.primary li.globals + li > span, -.tsd-navigation.primary li.globals + li > a { - padding-top: 20px; +.tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; } -.tsd-navigation.secondary.tsd-navigation--toolbar-hide { - max-height: calc(100vh - 1rem); - top: 0.5rem; -} -.tsd-navigation.secondary > ul { - display: inline; - padding-right: 0.5rem; - transition: opacity 0.2s; -} -.tsd-navigation.secondary ul li a { - padding-left: 0; +.tsd-page-navigation ul { + padding-left: 1.75rem; } -.tsd-navigation.secondary ul li li a { - padding-left: 1.1rem; -} -.tsd-navigation.secondary ul li li li a { - padding-left: 2.2rem; -} -.tsd-navigation.secondary ul li li li li a { - padding-left: 3.3rem; -} -.tsd-navigation.secondary ul li li li li li a { - padding-left: 4.4rem; + +#tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; } -.tsd-navigation.secondary ul li li li li li li a { - padding-left: 5.5rem; +#tsd-sidebar-links a:last-of-type { + margin-bottom: 0; } a.tsd-index-link { - margin: 0.25rem 0; + padding: 0.25rem 0 !important; font-size: 1rem; line-height: 1.25rem; display: inline-flex; align-items: center; + color: var(--color-text); } -.tsd-accordion-summary > h1, -.tsd-accordion-summary > h2, -.tsd-accordion-summary > h3, -.tsd-accordion-summary > h4, -.tsd-accordion-summary > h5 { - display: inline-flex; - align-items: center; - vertical-align: middle; - margin-bottom: 0; - user-select: none; +.tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ +} +.tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ +} +.tsd-accordion-summary, +.tsd-accordion-summary a { -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; -} -.tsd-accordion-summary { - display: block; + user-select: none; + cursor: pointer; } +.tsd-accordion-summary a { + width: calc(100% - 1.5rem); +} .tsd-accordion-summary > * { margin-top: 0; margin-bottom: 0; padding-top: 0; padding-bottom: 0; } -.tsd-accordion-summary::-webkit-details-marker { - display: none; -} -.tsd-index-accordion .tsd-accordion-summary svg { - margin-right: 0.25rem; +.tsd-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; } .tsd-index-content > :not(:first-child) { margin-top: 0.75rem; @@ -885,34 +865,6 @@ a.tsd-index-link { margin-right: 0.8rem; } -@media (min-width: 1024px) { - .col-content { - margin: 2rem auto; - } - - .menu-sticky-wrap { - position: sticky; - height: calc(100vh - 2rem); - top: 4rem; - right: 0; - padding: 0 1.5rem; - padding-top: 1rem; - margin-top: 3rem; - transition: 0.3s ease-in-out; - transition-property: top, padding-top, padding, height; - overflow-y: auto; - } - .col-menu { - border-left: 1px solid var(--color-accent); - } - .col-menu--hide { - top: 1rem; - } - .col-menu .tsd-navigation:not(:last-child) { - padding-bottom: 1.75rem; - } -} - .tsd-panel { margin-bottom: 2.5rem; } @@ -936,7 +888,7 @@ a.tsd-index-link { } .tsd-panel-group { - margin: 4rem 0; + margin: 2rem 0; } .tsd-panel-group.tsd-index-group { margin: 2rem 0; @@ -944,6 +896,9 @@ a.tsd-index-link { .tsd-panel-group.tsd-index-group details { margin: 2rem 0; } +.tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; +} #tsd-search { transition: background-color 0.2s; @@ -978,7 +933,8 @@ a.tsd-index-link { right: -40px; } #tsd-search .field input, -#tsd-search .title { +#tsd-search .title, +#tsd-toolbar-links a { transition: opacity 0.2s; } #tsd-search .results { @@ -992,8 +948,9 @@ a.tsd-index-link { box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); } #tsd-search .results li { - padding: 0 10px; background-color: var(--color-background); + line-height: initial; + padding: 4px; } #tsd-search .results li:nth-child(even) { background-color: var(--color-background-secondary); @@ -1001,12 +958,15 @@ a.tsd-index-link { #tsd-search .results li.state { display: none; } -#tsd-search .results li.current, -#tsd-search .results li:hover { +#tsd-search .results li.current:not(.no-results), +#tsd-search .results li:hover:not(.no-results) { background-color: var(--color-accent); } #tsd-search .results a { - display: block; + display: flex; + align-items: center; + padding: 0.25rem; + box-sizing: border-box; } #tsd-search .results a:before { top: 10px; @@ -1022,7 +982,8 @@ a.tsd-index-link { top: 0; opacity: 1; } -#tsd-search.has-focus .title { +#tsd-search.has-focus .title, +#tsd-search.has-focus #tsd-toolbar-links a { z-index: 0; opacity: 0; } @@ -1036,6 +997,22 @@ a.tsd-index-link { display: block; } +#tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; +} +#tsd-toolbar-links a { + margin-left: 1.5rem; +} +#tsd-toolbar-links a:hover { + text-decoration: underline; +} + .tsd-signature { margin: 0 0 1rem 0; padding: 1rem 0.5rem; @@ -1045,6 +1022,11 @@ a.tsd-index-link { overflow-x: auto; } +.tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; +} + .tsd-signature-symbol { color: var(--color-text-aside); font-weight: normal; @@ -1066,6 +1048,12 @@ a.tsd-index-link { border-width: 1px 0; transition: background-color 0.1s; } +.tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; +} +.tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; +} .tsd-description .tsd-signatures .tsd-signature { border-width: 1px; } @@ -1100,7 +1088,7 @@ ul.tsd-type-parameter-list h5 { } .tsd-page-toolbar { - position: fixed; + position: sticky; z-index: 1; top: 0; left: 0; @@ -1134,9 +1122,10 @@ ul.tsd-type-parameter-list h5 { .tsd-page-toolbar .table-cell:first-child { width: 100%; } - -.tsd-page-toolbar--hide { - transform: translateY(-100%); +.tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; } .tsd-widget { @@ -1144,7 +1133,9 @@ ul.tsd-type-parameter-list h5 { overflow: hidden; opacity: 0.8; height: 40px; - transition: opacity 0.1s, background-color 0.2s; + transition: + opacity 0.1s, + background-color 0.2s; vertical-align: bottom; cursor: pointer; } @@ -1166,12 +1157,6 @@ ul.tsd-type-parameter-list h5 { .tsd-widget.menu { display: none; } -@media (max-width: 1024px) { - .tsd-widget.options, - .tsd-widget.menu { - display: inline-block; - } -} input[type="checkbox"] + .tsd-widget:before { background-position: -120px 0; } @@ -1202,7 +1187,85 @@ img { } .deprecated { - text-decoration: line-through; + text-decoration: line-through !important; +} + +.warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); +} + +.tsd-kind-project { + color: var(--color-ts-project); +} +.tsd-kind-module { + color: var(--color-ts-module); +} +.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-kind-enum-member { + color: var(--color-ts-enum-member); +} +.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-kind-constructor { + color: var(--color-ts-constructor); +} +.tsd-kind-property { + color: var(--color-ts-property); +} +.tsd-kind-method { + color: var(--color-ts-method); +} +.tsd-kind-call-signature { + color: var(--color-ts-call-signature); +} +.tsd-kind-index-signature { + color: var(--color-ts-index-signature); +} +.tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); +} +.tsd-kind-parameter { + color: var(--color-ts-parameter); +} +.tsd-kind-type-literal { + color: var(--color-ts-type-literal); +} +.tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); +} +.tsd-kind-accessor { + color: var(--color-ts-accessor); +} +.tsd-kind-get-signature { + color: var(--color-ts-get-signature); +} +.tsd-kind-set-signature { + color: var(--color-ts-set-signature); +} +.tsd-kind-type-alias { + color: var(--color-ts-type-alias); +} + +/* if we have a kind icon, don't color the text by kind */ +.tsd-kind-icon ~ span { + color: var(--color-text); } * { @@ -1223,3 +1286,153 @@ img { border-radius: 999rem; border: 0.25rem solid var(--color-icon-background); } + +/* mobile */ +@media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } +} + +/* one sidebar */ +@media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } +} +@media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } +} + +/* two sidebars */ +@media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem 0; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } +} diff --git a/docs/classes/Device.html b/docs/classes/Device.html index 38c3b031..9c4390a7 100644 --- a/docs/classes/Device.html +++ b/docs/classes/Device.html @@ -1,168 +1,41 @@ -Device | onvif
-
- -
-
-
-
- -

Class Device

-
-

Device methods

-
-
-

Hierarchy

-
    -
  • Device
-
-
-
- -
-
-

Constructors

-
- -
-
-

Properties

-
- -
media2Support: boolean = false
-
- -
onvif: Onvif
-
- -
services: OnvifService[] = []
-
-

Methods

-
- -
  • This operation gets the DNS settings from a device. The device shall return its DNS configurations through the +GetDNS command.

    +

    Returns Promise<DNSInformation>

  • This operation gets the NTP settings from a device. If the device supports NTP, it shall be possible to get the +NTP server settings through the GetNTP command.

    +

    Returns Promise<NTPInformation>

  • This operation gets the network interface configuration from a device. The device shall support return of network +interface configuration settings as defined by the NetworkInterface type through the GetNetworkInterfaces command.

    +

    Returns Promise<NetworkInterface[]>

  • Returns information about services of the device.

    +

    Parameters

    • __namedParameters: GetServices = ...

    Returns Promise<GetServicesResponse>

  • Returns Promise<Date>

  • Set the NTP settings on a device

    +

    Parameters

    • options: SetNTP

    Returns Promise<NTPInformation>

  • Set the scope parameters of a device

    +

    Parameters

    • scopes: string[]

      Array of scope's uris

      +

    Returns Promise<Scope[]>

  • This operation reboots the device

    +

    Returns Promise<string>

\ No newline at end of file diff --git a/docs/classes/DiscoverySingleton.html b/docs/classes/DiscoverySingleton.html index 46bee484..07d8b72c 100644 --- a/docs/classes/DiscoverySingleton.html +++ b/docs/classes/DiscoverySingleton.html @@ -1,574 +1,184 @@ -DiscoverySingleton | onvif
-
- -
-
-
-
- -

Class DiscoverySingleton

-
-

Class for Discovery singleton

-
-
-

Hierarchy

-
    -
  • EventEmitter -
      -
    • DiscoverySingleton
-
-
-
- -
-
-

Constructors

-
- -
-
-

Properties

-
- -
captureRejectionSymbol: typeof captureRejectionSymbol
-
- -
captureRejections: boolean
-

Sets or gets the default captureRejection value for all emitters.

-
-
- -
defaultMaxListeners: number
-
- -
errorMonitor: typeof errorMonitor
-

This symbol shall be used to install a listener for only monitoring 'error' -events. Listeners installed using this symbol are called before the regular -'error' listeners are called.

-

Installing a listener using this symbol does not change the behavior once an -'error' event is emitted, therefore the process will still crash if no -regular 'error' listener is installed.

-
-
- -
-
-

Events

-
- -
device: "device" = 'device'
-

Fires when device found

+DiscoverySingleton | onvif

Class DiscoverySingleton

Class for Discovery singleton

+

Hierarchy

  • EventEmitter
    • DiscoverySingleton

Properties

captureRejectionSymbol: typeof captureRejectionSymbol

Value: Symbol.for('nodejs.rejection')

+

See how to write a custom rejection handler.

+

v13.4.0, v12.16.0

+
captureRejections: boolean

Value: boolean

+

Change the default captureRejections option on all new EventEmitter objects.

+

v13.4.0, v12.16.0

+
defaultMaxListeners: number

By default, a maximum of 10 listeners can be registered for any single +event. This limit can be changed for individual EventEmitter instances +using the emitter.setMaxListeners(n) method. To change the default +for allEventEmitter instances, the events.defaultMaxListeners property +can be used. If this value is not a positive number, a RangeError is thrown.

+

Take caution when setting the events.defaultMaxListeners because the +change affects all EventEmitter instances, including those created before +the change is made. However, calling emitter.setMaxListeners(n) still has +precedence over events.defaultMaxListeners.

+

This is not a hard limit. The EventEmitter instance will allow +more listeners to be added but will output a trace warning to stderr indicating +that a "possible EventEmitter memory leak" has been detected. For any single +EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to +temporarily avoid this warning:

+
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
}); +
-

Param

Onvif instance Onvif or just information object about found device - device

- -

Example

discovery.on('device', console.log);
-
-
-
- -
error: "error" = 'error'
-

Indicates any errors

- -

Param

Error instance or array of error instances from Error - error

- -

Example

discovery.on('error', console.error);
-
-
-
-

Accessors

-
- -
-
-

Methods

-
- -
    - -
  • -

    Alias for emitter.on(eventName, listener).

    - -

    Since

    v0.1.26

    -
    -
    -

    Parameters

    -
      -
    • -
      eventName: string | symbol
    • -
    • -
      listener: ((...args: any[]) => void)
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        • -
          -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
          -

          Returns void

    -

    Returns DiscoverySingleton

-
- -
    - -
  • -

    Synchronously calls each of the listeners registered for the event namedeventName, in the order they were registered, passing the supplied arguments +

    The --trace-warnings command-line flag can be used to display the +stack trace for such warnings.

    +

    The emitted warning can be inspected with process.on('warning') and will +have the additional emitter, type, and count properties, referring to +the event emitter instance, the event's name and the number of attached +listeners, respectively. +Its name property is set to 'MaxListenersExceededWarning'.

    +

    v0.11.2

    +
errorMonitor: typeof errorMonitor

This symbol shall be used to install a listener for only monitoring 'error' events. Listeners installed using this symbol are called before the regular 'error' listeners are called.

+

Installing a listener using this symbol does not change the behavior once an 'error' event is emitted. Therefore, the process will still crash if no +regular 'error' listener is installed.

+

v13.6.0, v12.17.0

+

Accessors

Methods

  • Type Parameters

    • K

    Parameters

    • error: Error
    • event: string | symbol
    • Rest...args: AnyRest

    Returns void

  • Alias for emitter.on(eventName, listener).

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol
    • listener: ((...args: any[]) => void)
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v0.1.26

    +
  • Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments to each.

    Returns true if the event had listeners, false otherwise.

    -
    const EventEmitter = require('events');
    const myEmitter = new EventEmitter();

    // First listener
    myEmitter.on('event', function firstListener() {
    console.log('Helloooo! first listener');
    });
    // Second listener
    myEmitter.on('event', function secondListener(arg1, arg2) {
    console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
    });
    // Third listener
    myEmitter.on('event', function thirdListener(...args) {
    const parameters = args.join(', ');
    console.log(`event with parameters ${parameters} in third listener`);
    });

    console.log(myEmitter.listeners('event'));

    myEmitter.emit('event', 1, 2, 3, 4, 5);

    // Prints:
    // [
    // [Function: firstListener],
    // [Function: secondListener],
    // [Function: thirdListener]
    // ]
    // Helloooo! first listener
    // event with parameters 1, 2 in second listener
    // event with parameters 1, 2, 3, 4, 5 in third listener -
    +
    import { EventEmitter } from 'node:events';
    const myEmitter = new EventEmitter();

    // First listener
    myEmitter.on('event', function firstListener() {
    console.log('Helloooo! first listener');
    });
    // Second listener
    myEmitter.on('event', function secondListener(arg1, arg2) {
    console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
    });
    // Third listener
    myEmitter.on('event', function thirdListener(...args) {
    const parameters = args.join(', ');
    console.log(`event with parameters ${parameters} in third listener`);
    });

    console.log(myEmitter.listeners('event'));

    myEmitter.emit('event', 1, 2, 3, 4, 5);

    // Prints:
    // [
    // [Function: firstListener],
    // [Function: secondListener],
    // [Function: thirdListener]
    // ]
    // Helloooo! first listener
    // event with parameters 1, 2 in second listener
    // event with parameters 1, 2, 3, 4, 5 in third listener +
    -

    Since

    v0.1.26

    -
    -
    -

    Parameters

    -
      -
    • -
      eventName: string | symbol
    • -
    • -
      Rest ...args: any[]
    -

    Returns boolean

-
- -
    - -
  • -

    Returns an array listing the events for which the emitter has registered +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol
    • Rest...args: AnyRest

    Returns boolean

    v0.1.26

    +
  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    const EventEmitter = require('events');
    const myEE = new EventEmitter();
    myEE.on('foo', () => {});
    myEE.on('bar', () => {});

    const sym = Symbol('symbol');
    myEE.on(sym, () => {});

    console.log(myEE.eventNames());
    // Prints: [ 'foo', 'bar', Symbol(symbol) ] -
    - -

    Since

    v6.0.0

    -
    -

    Returns (string | symbol)[]

-
- -
    - -
  • -

    Returns the current max listener value for the EventEmitter which is either -set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

    - -

    Since

    v1.0.0

    -
    -

    Returns number

-
- -
    - -
  • -

    Returns the number of listeners listening to the event named eventName.

    +
    import { EventEmitter } from 'node:events';

    const myEE = new EventEmitter();
    myEE.on('foo', () => {});
    myEE.on('bar', () => {});

    const sym = Symbol('symbol');
    myEE.on(sym, () => {});

    console.log(myEE.eventNames());
    // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
    -

    Since

    v3.2.0

    -
    -
    -

    Parameters

    -
      -
    • -
      eventName: string | symbol
      -

      The name of the event being listened for

      -
    -

    Returns number

-
- -
    - -
  • -

    Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] -
    +

    Returns (string | symbol)[]

    v6.0.0

    +
  • Returns the current max listener value for the EventEmitter which is either +set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

    +

    Returns number

    v1.0.0

    +
  • Returns the number of listeners listening for the event named eventName. +If listener is provided, it will return how many times the listener is found +in the list of the listeners of the event.

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

      The name of the event being listened for

      +
    • Optionallistener: Function

      The event handler function

      +

    Returns number

    v3.2.0

    +
  • Returns a copy of the array of listeners for the event named eventName.

    +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    -

    Since

    v0.1.26

    -
    -
    -

    Parameters

    -
      -
    • -
      eventName: string | symbol
    -

    Returns Function[]

-
- -
    - -
  • -

    Alias for emitter.removeListener().

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

    Returns Function[]

    v0.1.26

    +
  • Alias for emitter.removeListener().

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol
    • listener: ((...args: any[]) => void)
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v10.0.0

    +
  • Adds the listener function to the end of the listeners array for the event +named eventName. No checks are made to see if the listener has already +been added. Multiple calls passing the same combination of eventName and +listener will result in the listener being added, and called, multiple times.

    +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    }); +
    -

    Since

    v10.0.0

    -
    -
    -

    Parameters

    -
      -
    • -
      eventName: string | symbol
    • -
    • -
      listener: ((...args: any[]) => void)
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        • -
          -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
          -

          Returns void

    -

    Returns DiscoverySingleton

-
- -
    - -
  • -

    Adds the listener function to the end of the listeners array for the -event named eventName. No checks are made to see if the listener has -already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple -times.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    }); -

    Returns a reference to the EventEmitter, so that calls can be chained.

    -

    By default, event listeners are invoked in the order they are added. Theemitter.prependListener() method can be used as an alternative to add the +

    By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the event listener to the beginning of the listeners array.

    -
    const myEE = new EventEmitter();
    myEE.on('foo', () => console.log('a'));
    myEE.prependListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a -
    +
    import { EventEmitter } from 'node:events';
    const myEE = new EventEmitter();
    myEE.on('foo', () => console.log('a'));
    myEE.prependListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a +
    -

    Since

    v0.1.101

    -
    -
    -

    Parameters

    -
      -
    • -
      eventName: string | symbol
      -

      The name of the event.

      -
    • -
    • -
      listener: ((...args: any[]) => void)
      -

      The callback function

      -
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        • -
          -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
          -

          Returns void

    -

    Returns DiscoverySingleton

-
- -
    - -
  • -

    Adds a one-timelistener function for the event named eventName. The +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

      The name of the event.

      +
    • listener: ((...args: any[]) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v0.1.101

    +
  • Adds a one-time listener function for the event named eventName. The next time eventName is triggered, this listener is removed and then invoked.

    -
    server.once('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); -
    +
    server.once('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    -

    By default, event listeners are invoked in the order they are added. Theemitter.prependOnceListener() method can be used as an alternative to add the +

    By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener() method can be used as an alternative to add the event listener to the beginning of the listeners array.

    -
    const myEE = new EventEmitter();
    myEE.once('foo', () => console.log('a'));
    myEE.prependOnceListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a -
    +
    import { EventEmitter } from 'node:events';
    const myEE = new EventEmitter();
    myEE.once('foo', () => console.log('a'));
    myEE.prependOnceListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a +
    -

    Since

    v0.3.0

    -
    -
    -

    Parameters

    -
      -
    • -
      eventName: string | symbol
      -

      The name of the event.

      -
    • -
    • -
      listener: ((...args: any[]) => void)
      -

      The callback function

      -
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        • -
          -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
          -

          Returns void

    -

    Returns DiscoverySingleton

-
- -
    - -
  • -

    Adds the listener function to the beginning of the listeners array for the +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

      The name of the event.

      +
    • listener: ((...args: any[]) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v0.3.0

    +
  • Adds the listener function to the beginning of the listeners array for the event named eventName. No checks are made to see if the listener has -already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple -times.

    -
    server.prependListener('connection', (stream) => {
    console.log('someone connected!');
    }); -
    -

    Returns a reference to the EventEmitter, so that calls can be chained.

    +already been added. Multiple calls passing the same combination of eventName +and listener will result in the listener being added, and called, multiple times.

    +
    server.prependListener('connection', (stream) => {
    console.log('someone connected!');
    }); +
    -

    Since

    v6.0.0

    -
    -
    -

    Parameters

    -
      -
    • -
      eventName: string | symbol
      -

      The name of the event.

      -
    • -
    • -
      listener: ((...args: any[]) => void)
      -

      The callback function

      -
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        • -
          -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
          -

          Returns void

    -

    Returns DiscoverySingleton

-
- -
    - -
  • -

    Adds a one-timelistener function for the event named eventName to the_beginning_ of the listeners array. The next time eventName is triggered, this -listener is removed, and then invoked.

    -
    server.prependOnceListener('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); -

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

      The name of the event.

      +
    • listener: ((...args: any[]) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v6.0.0

    +
  • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this +listener is removed, and then invoked.

    +
    server.prependOnceListener('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); +
    -

    Since

    v6.0.0

    -
    -
    -

    Parameters

    -
      -
    • -
      eventName: string | symbol
      -

      The name of the event.

      -
    • -
    • -
      listener: ((...args: any[]) => void)
      -

      The callback function

      -
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        • -
          -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
          -

          Returns void

    -

    Returns DiscoverySingleton

-
- -
    - -
  • -

    Discover NVT devices in the subnetwork

    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

      The name of the event.

      +
    • listener: ((...args: any[]) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v6.0.0

    +
  • Discover NVT devices in the subnetwork

    +

    Parameters

    Returns Promise<(Onvif | Record<string, unknown>)[]>

    import { Discovery } from 'onvif';
    Discovery.on('device', async (cam) => {
    // function would be called as soon as NVT responses
    cam.username = <USERNAME>;
    cam.password = <PASSWORD>;
    await cam.connect();
    })
    Discovery.probe(); +
    -

    Example

    import { Discovery } from 'onvif';
    Discovery.on('device', async (cam) => {
    // function would be called as soon as NVT responses
    cam.username = <USERNAME>;
    cam.password = <PASSWORD>;
    await cam.connect();
    })
    Discovery.probe(); -
    +
    import { Discovery } from 'onvif';
    (async () => {
    const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect());
    console.log(await cams[0]?.getSystemDateAndTime());
    })(); +
    -

    Example

    import { Discovery } from 'onvif';
    (async () => {
    const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect());
    console.log(await cams[0]?.getSystemDateAndTime());
    })(); -
    -
    -
    -

    Parameters

    -
    -

    Returns Promise<(Record<string, unknown> | Onvif)[]>

-
- -
    - -
  • -

    Returns a copy of the array of listeners for the event named eventName, +

  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    const emitter = new EventEmitter();
    emitter.once('log', () => console.log('log once'));

    // Returns a new Array with a function `onceWrapper` which has a property
    // `listener` which contains the original listener bound above
    const listeners = emitter.rawListeners('log');
    const logFnWrapper = listeners[0];

    // Logs "log once" to the console and does not unbind the `once` event
    logFnWrapper.listener();

    // Logs "log once" to the console and removes the listener
    logFnWrapper();

    emitter.on('log', () => console.log('log persistently'));
    // Will return a new Array with a single function bound by `.on()` above
    const newListeners = emitter.rawListeners('log');

    // Logs "log persistently" twice
    newListeners[0]();
    emitter.emit('log'); -
    +
    import { EventEmitter } from 'node:events';
    const emitter = new EventEmitter();
    emitter.once('log', () => console.log('log once'));

    // Returns a new Array with a function `onceWrapper` which has a property
    // `listener` which contains the original listener bound above
    const listeners = emitter.rawListeners('log');
    const logFnWrapper = listeners[0];

    // Logs "log once" to the console and does not unbind the `once` event
    logFnWrapper.listener();

    // Logs "log once" to the console and removes the listener
    logFnWrapper();

    emitter.on('log', () => console.log('log persistently'));
    // Will return a new Array with a single function bound by `.on()` above
    const newListeners = emitter.rawListeners('log');

    // Logs "log persistently" twice
    newListeners[0]();
    emitter.emit('log'); +
    -

    Since

    v9.4.0

    -
    -
    -

    Parameters

    -
      -
    • -
      eventName: string | symbol
    -

    Returns Function[]

-
- -
    - -
  • -

    Removes all listeners, or those of the specified eventName.

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

    Returns Function[]

    v9.4.0

    +
  • Removes all listeners, or those of the specified eventName.

    It is bad practice to remove listeners added elsewhere in the code, particularly when the EventEmitter instance was created by some other component or module (e.g. sockets or file streams).

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Parameters

    • OptionaleventName: string | symbol

    Returns this

    v0.1.26

    +
  • Removes the specified listener from the listener array for the event named eventName.

    +
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    -

    Since

    v0.1.26

    -
    -
    -

    Parameters

    -
      -
    • -
      Optional event: string | symbol
    -

    Returns DiscoverySingleton

-
- -
-
- -
    - -
  • -

    By default EventEmitters will print a warning if more than 10 listeners are +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol
    • listener: ((...args: any[]) => void)
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v0.1.26

    +
  • By default EventEmitters will print a warning if more than 10 listeners are added for a particular event. This is a useful default that helps finding memory leaks. The emitter.setMaxListeners() method allows the limit to be -modified for this specific EventEmitter instance. The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

    +modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Parameters

    • n: number

    Returns this

    v0.3.5

    +
  • Experimental

    Listens once to the abort event on the provided signal.

    +

    Listening to the abort event on abort signals is unsafe and may +lead to resource leaks since another third party with the signal can +call e.stopImmediatePropagation(). Unfortunately Node.js cannot change +this since it would violate the web standard. Additionally, the original +API makes it easy to forget to remove listeners.

    +

    This API allows safely using AbortSignals in Node.js APIs by solving these +two issues by listening to the event such that stopImmediatePropagation does +not prevent the listener from running.

    +

    Returns a disposable so that it may be unsubscribed from more easily.

    +
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    } +
    -

    Since

    v0.3.5

    -
    -
    -

    Parameters

    -
      -
    • -
      n: number
    -

    Returns DiscoverySingleton

-
- -
    - -
  • -

    Returns a copy of the array of listeners for the event named eventName.

    +

    Parameters

    • signal: AbortSignal
    • resource: ((event: Event) => void)
        • (event): void
        • Parameters

          • event: Event

          Returns void

    Returns Disposable

    Disposable that removes the abort listener.

    +

    v20.5.0

    +
  • Returns a copy of the array of listeners for the event named eventName.

    For EventEmitters this behaves exactly the same as calling .listeners on the emitter.

    For EventTargets this is the only way to get the event listeners for the event target. This is useful for debugging and diagnostic purposes.

    -
    const { getEventListeners, EventEmitter } = require('events');

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    getEventListeners(ee, 'foo'); // [listener]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    getEventListeners(et, 'foo'); // [listener]
    } -
    +
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    } +
    + +

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget
    • name: string | symbol

    Returns Function[]

    v15.2.0, v14.17.0

    +
  • Returns the currently set max amount of listeners.

    +

    For EventEmitters this behaves exactly the same as calling .getMaxListeners on +the emitter.

    +

    For EventTargets this is the only way to get the max event listeners for the +event target. If the number of event handlers on a single EventTarget exceeds +the max set, the EventTarget will print a warning.

    +
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    } +
    -

    Since

    v15.2.0, v14.17.0

    -
    -
    -

    Parameters

    -
      -
    • -
      emitter: EventEmitter | DOMEventTarget
    • -
    • -
      name: string | symbol
    -

    Returns Function[]

-
- -
    - -
  • -

    A class method that returns the number of listeners for the given eventNameregistered on the given emitter.

    -
    const { EventEmitter, listenerCount } = require('events');
    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 -
    +

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget

    Returns number

    v19.9.0

    +
  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    -

    Since

    v0.9.12

    +

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

      +
    • eventName: string | symbol

      The event name

      +

    Returns number

    v0.9.12

    +

    Since v3.2.0 - Use listenerCount instead.

    +
  • import { on, EventEmitter } from 'node:events';
    import process from 'node:process';

    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo')) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here +
    -

    Deprecated

    Since v3.2.0 - Use listenerCount instead.

    -
    -
    -

    Parameters

    -
      -
    • -
      emitter: EventEmitter
      -

      The emitter to query

      -
    • -
    • -
      eventName: string | symbol
      -

      The event name

      -
    -

    Returns number

-
- -
    - -
  • -
    const { on, EventEmitter } = require('events');

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo')) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })(); -

    Returns an AsyncIterator that iterates eventName events. It will throw -if the EventEmitter emits 'error'. It removes all listeners when +if the EventEmitter emits 'error'. It removes all listeners when exiting the loop. The value returned by each iteration is an array composed of the emitted event arguments.

    An AbortSignal can be used to cancel waiting on events:

    -
    const { on, EventEmitter } = require('events');
    const ac = new AbortController();

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo', { signal: ac.signal })) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })();

    process.nextTick(() => ac.abort()); -
    +
    import { on, EventEmitter } from 'node:events';
    import process from 'node:process';

    const ac = new AbortController();

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo', { signal: ac.signal })) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })();

    process.nextTick(() => ac.abort()); +
    -

    Since

    v13.6.0, v12.16.0

    +

    Use the close option to specify an array of event names that will end the iteration:

    +
    import { on, EventEmitter } from 'node:events';
    import process from 'node:process';

    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    ee.emit('close');
    });

    for await (const event of on(ee, 'foo', { close: ['close'] })) {
    console.log(event); // prints ['bar'] [42]
    }
    // the loop will exit after 'close' is emitted
    console.log('done'); // prints 'done' +
    -

    Returns

    that iterates eventName events emitted by the emitter

    -
    -
    -

    Parameters

    -
      -
    • -
      emitter: EventEmitter
    • -
    • -
      eventName: string
      -

      The name of the event being listened for

      -
    • -
    • -
      Optional options: StaticEventEmitterOptions
    -

    Returns AsyncIterableIterator<any>

-
- -
    - -
  • -

    Creates a Promise that is fulfilled when the EventEmitter emits the given -event or that is rejected if the EventEmitter emits 'error' while waiting. +

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterableIterator<any[]>

    An AsyncIterator that iterates eventName events emitted by the emitter

    +

    v13.6.0, v12.16.0

    +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterableIterator<any[]>

  • Creates a Promise that is fulfilled when the EventEmitter emits the given +event or that is rejected if the EventEmitter emits 'error' while waiting. The Promise will resolve with an array of all the arguments emitted to the given event.

    -

    This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event -semantics and does not listen to the 'error' event.

    -
    const { once, EventEmitter } = require('events');

    async function run() {
    const ee = new EventEmitter();

    process.nextTick(() => {
    ee.emit('myevent', 42);
    });

    const [value] = await once(ee, 'myevent');
    console.log(value);

    const err = new Error('kaboom');
    process.nextTick(() => {
    ee.emit('error', err);
    });

    try {
    await once(ee, 'myevent');
    } catch (err) {
    console.log('error happened', err);
    }
    }

    run(); -
    -

    The special handling of the 'error' event is only used when events.once()is used to wait for another event. If events.once() is used to wait for the -'error' event itself, then it is treated as any other kind of event without +

    This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event +semantics and does not listen to the 'error' event.

    +
    import { once, EventEmitter } from 'node:events';
    import process from 'node:process';

    const ee = new EventEmitter();

    process.nextTick(() => {
    ee.emit('myevent', 42);
    });

    const [value] = await once(ee, 'myevent');
    console.log(value);

    const err = new Error('kaboom');
    process.nextTick(() => {
    ee.emit('error', err);
    });

    try {
    await once(ee, 'myevent');
    } catch (err) {
    console.error('error happened', err);
    } +
    + +

    The special handling of the 'error' event is only used when events.once() is used to wait for another event. If events.once() is used to wait for the +'error' event itself, then it is treated as any other kind of event without special handling:

    -
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();

    once(ee, 'error')
    .then(([err]) => console.log('ok', err.message))
    .catch((err) => console.log('error', err.message));

    ee.emit('error', new Error('boom'));

    // Prints: ok boom -
    +
    import { EventEmitter, once } from 'node:events';

    const ee = new EventEmitter();

    once(ee, 'error')
    .then(([err]) => console.log('ok', err.message))
    .catch((err) => console.error('error', err.message));

    ee.emit('error', new Error('boom'));

    // Prints: ok boom +
    +

    An AbortSignal can be used to cancel waiting for the event:

    -
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();
    const ac = new AbortController();

    async function foo(emitter, event, signal) {
    try {
    await once(emitter, event, { signal });
    console.log('event emitted!');
    } catch (error) {
    if (error.name === 'AbortError') {
    console.error('Waiting for the event was canceled!');
    } else {
    console.error('There was an error', error.message);
    }
    }
    }

    foo(ee, 'foo', ac.signal);
    ac.abort(); // Abort waiting for the event
    ee.emit('foo'); // Prints: Waiting for the event was canceled! -
    +
    import { EventEmitter, once } from 'node:events';

    const ee = new EventEmitter();
    const ac = new AbortController();

    async function foo(emitter, event, signal) {
    try {
    await once(emitter, event, { signal });
    console.log('event emitted!');
    } catch (error) {
    if (error.name === 'AbortError') {
    console.error('Waiting for the event was canceled!');
    } else {
    console.error('There was an error', error.message);
    }
    }
    }

    foo(ee, 'foo', ac.signal);
    ac.abort(); // Abort waiting for the event
    ee.emit('foo'); // Prints: Waiting for the event was canceled! +
    + +

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

    v11.13.0, v10.16.0

    +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
    + +

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      +
    • Rest...eventTargets: (EventEmitter<DefaultEventMap> | EventTarget)[]

    Returns void

    v15.4.0

    +

Events

device: "device" = ...

Fires when device found

+

Onvif instance Onvif or just information object about found device +device

+
discovery.on('device', console.log);
+
+ +
error: "error" = ...

Indicates any errors

+

Error instance or array of error instances from Error +error

+
discovery.on('error', console.error);
+
-

Since

v11.13.0, v10.16.0

-
-
-

Parameters

-
    -
  • -
    emitter: NodeEventTarget
  • -
  • -
    eventName: string | symbol
  • -
  • -
    Optional options: StaticEventEmitterOptions
-

Returns Promise<any[]>

- -
  • -
    -

    Parameters

    -
      -
    • -
      emitter: DOMEventTarget
    • -
    • -
      eventName: string
    • -
    • -
      Optional options: StaticEventEmitterOptions
    -

    Returns Promise<any[]>

  • -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/classes/Media.html b/docs/classes/Media.html index 3ca9231b..badfdffd 100644 --- a/docs/classes/Media.html +++ b/docs/classes/Media.html @@ -1,127 +1,32 @@ -Media | onvif
    -
    - -
    -
    -
    -
    - -

    Class Media

    -
    -

    Hierarchy

    -
      -
    • Media
    -
    -
    -
    - -
    -
    -

    Constructors

    -
    -
    -

    Properties

    -
    -
    -

    Methods

    -
    -
    -

    Constructors

    -
    - -
    -
    -

    Properties

    -
    - -
    onvif: Onvif
    -
    - -
    profiles: Profile[] = []
    -
    - -
    videoSources: VideoSource[] = []
    -
    -

    Methods

    -
    - -
    -
    - -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Media | onvif

    Class Media

    Constructors

    Properties

    profiles: Profile[] = []
    videoSources: VideoSource[] = []

    Methods

    • Parameters

      • __namedParameters: GetOSDOptions = {}

      Returns Promise<GetOSDOptionsResponse>

    • Parameters

      • __namedParameters: GetOSDs = {}

      Returns Promise<GetOSDsResponse>

    • Receive snapshot URI

      +

      Parameters

      Returns Promise<{
          uri: string;
      }>

    • This method requests a URI that can be used to initiate a live media stream using RTSP as the control protocol. +The returned URI shall remain valid indefinitely even if the profile is changed. +Method uses Media2 if device supports it.

      +

      For Media2 you need to provide only protocol parameter ('RTPS' by default). Here is supported values from the +ONVIF documentation: +Defined stream types are

      +
        +
      • RtspUnicast RTSP streaming RTP as UDP Unicast.
      • +
      • RtspMulticast RTSP streaming RTP as UDP Multicast.
      • +
      • RTSP RTSP streaming RTP over TCP.
      • +
      • RtspOverHttp Tunneling both the RTSP control channel and the RTP stream over HTTP or HTTPS.
      • +
      +

      For Media1 you need to set both parameters: protocl and stream (RTP-Unicast by default) If Media2 supported +by device, this parameters will be converted to Media2 call. This is excerpt from ONVIF documentation: +The correct syntax for the StreamSetup element for these media stream setups defined in 5.1.1 of the streaming specification are as follows:

      +
        +
      • RTP unicast over UDP: StreamType = "RTP_unicast", TransportProtocol = "UDP"
      • +
      • RTP over RTSP over HTTP over TCP: StreamType = "RTP_unicast", TransportProtocol = "HTTP"
      • +
      • RTP over RTSP over TCP: StreamType = "RTP_unicast", TransportProtocol = "RTSP"
      • +
      +

      Parameters

      Returns Promise<{
          invalidAfterConnect?: boolean;
          invalidAfterReboot?: boolean;
          timeout?: string;
          uri: string;
      }>

    \ No newline at end of file diff --git a/docs/classes/Onvif.html b/docs/classes/Onvif.html index 84e1b9ba..3b0c1402 100644 --- a/docs/classes/Onvif.html +++ b/docs/classes/Onvif.html @@ -1,801 +1,207 @@ -Onvif | onvif
    -
    - -
    -
    -
    -
    - -

    Class Onvif

    -
    -

    Hierarchy

    -
      -
    • EventEmitter -
        -
      • Onvif
    -
    -
    -
    - -
    -
    -

    Constructors

    -
    - -
    -
    -

    Properties

    -
    - -
    activeSource?: ActiveSource
    -
    - -
    activeSources: ActiveSource[] = []
    -
    - -
    agent: boolean | Agent
    -
    - -
    capabilities: Capabilities
    -
    - -
    defaultProfile?: Profile
    -
    - -
    defaultProfiles: Profile[] = []
    -
    - -
    device: Device
    -

    Core device namespace for device v1.0 methods

    +Onvif | onvif

    Class Onvif

    Hierarchy

    • EventEmitter
      • Onvif

    Constructors

    Properties

    activeSource?: ActiveSource
    agent: boolean | Agent
    capabilities: Capabilities
    defaultProfile?: Profile
    defaultProfiles: Profile[] = []
    device: Device

    Core device namespace for device v1.0 methods

    +
    const date = await onvif.device.getSystemDateAndTime();
    console.log(date.toLocaleString()); +
    -

    Example

    const date = await onvif.device.getSystemDateAndTime();
    console.log(date.toLocaleString()); -
    -
    -
    - -
    deviceInformation?: DeviceInformation
    -
    - -
    events: Record<string, unknown>
    -
    - -
    hostname: string
    -
    - -
    media: Media
    -
    - -
    password?: string
    -
    - -
    path: string
    -
    - -
    port: number
    -
    - -
    preserveAddress: boolean = false
    -
    - -
    secureOptions: SecureContextOptions
    -
    - -
    timeShift?: number
    -
    - -
    timeout: number
    -
    - -
    -
    - -
    urn?: string
    -
    - -
    useSecure: boolean
    -
    - -
    username?: string
    -
    - -
    captureRejectionSymbol: typeof captureRejectionSymbol
    -
    - -
    captureRejections: boolean
    -

    Sets or gets the default captureRejection value for all emitters.

    -
    -
    - -
    defaultMaxListeners: number
    -
    - -
    errorMonitor: typeof errorMonitor
    -

    This symbol shall be used to install a listener for only monitoring 'error' -events. Listeners installed using this symbol are called before the regular -'error' listeners are called.

    -

    Installing a listener using this symbol does not change the behavior once an -'error' event is emitted, therefore the process will still crash if no -regular 'error' listener is installed.

    -
    -
    -

    Events

    -
    - -
    error: "error" = 'error'
    -

    Indicates any errors

    +
    deviceInformation?: DeviceInformation
    hostname: string
    media: Media
    password?: string
    path: string
    port: number
    preserveAddress: boolean = false
    ptz: PTZ
    secureOptions: SecureContextOptions
    timeout: number
    urn?: string
    useSecure: boolean
    username?: string
    captureRejectionSymbol: typeof captureRejectionSymbol

    Value: Symbol.for('nodejs.rejection')

    +

    See how to write a custom rejection handler.

    +

    v13.4.0, v12.16.0

    +
    captureRejections: boolean

    Value: boolean

    +

    Change the default captureRejections option on all new EventEmitter objects.

    +

    v13.4.0, v12.16.0

    +
    defaultMaxListeners: number

    By default, a maximum of 10 listeners can be registered for any single +event. This limit can be changed for individual EventEmitter instances +using the emitter.setMaxListeners(n) method. To change the default +for allEventEmitter instances, the events.defaultMaxListeners property +can be used. If this value is not a positive number, a RangeError is thrown.

    +

    Take caution when setting the events.defaultMaxListeners because the +change affects all EventEmitter instances, including those created before +the change is made. However, calling emitter.setMaxListeners(n) still has +precedence over events.defaultMaxListeners.

    +

    This is not a hard limit. The EventEmitter instance will allow +more listeners to be added but will output a trace warning to stderr indicating +that a "possible EventEmitter memory leak" has been detected. For any single +EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to +temporarily avoid this warning:

    +
    import { EventEmitter } from 'node:events';
    const emitter = new EventEmitter();
    emitter.setMaxListeners(emitter.getMaxListeners() + 1);
    emitter.once('event', () => {
    // do stuff
    emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
    }); +
    -

    Param

    Error instance from Error - error

    - -

    Example

    onvif.on('error', console.error);
    -
    -
    -
    - -
    rawRequest: "rawRequest" = 'rawRequest'
    -

    Indicates raw xml request to device. - rawRequest

    - -

    Example

    onvif.on('rawRequest', (xml) => { console.log('-> request was', xml); });
    -
    -
    -
    - -
    rawResponse: "rawResponse" = 'rawResponse'
    -

    Indicates raw xml response from device. - rawResponse

    - -

    Example

    onvif.on('rawResponse', (xml) => { console.log('<- response was', xml); });
    -
    -
    -
    - -
    warn: "warn" = 'warn'
    -

    Indicates any warnings - warn

    - -

    Example

    onvif.on('warn', console.warn);
    -
    -
    -
    -

    Methods

    -
    - -
      - -
    • -

      Alias for emitter.on(eventName, listener).

      - -

      Since

      v0.1.26

      -
      -
      -

      Parameters

      -
        -
      • -
        eventName: string | symbol
      • -
      • -
        listener: ((...args: any[]) => void)
        -
          -
        • -
            -
          • (...args: any[]): void
          • -
          • -
            -

            Parameters

            -
              -
            • -
              Rest ...args: any[]
            -

            Returns void

      -

      Returns Onvif

    -
    - -
      - -
    • -

      Connect to the camera and fill device information properties

      -
      -

      Returns Promise<Onvif>

    -
    - -
      - -
    • -

      Synchronously calls each of the listeners registered for the event namedeventName, in the order they were registered, passing the supplied arguments +

      The --trace-warnings command-line flag can be used to display the +stack trace for such warnings.

      +

      The emitted warning can be inspected with process.on('warning') and will +have the additional emitter, type, and count properties, referring to +the event emitter instance, the event's name and the number of attached +listeners, respectively. +Its name property is set to 'MaxListenersExceededWarning'.

      +

      v0.11.2

      +
    errorMonitor: typeof errorMonitor

    This symbol shall be used to install a listener for only monitoring 'error' events. Listeners installed using this symbol are called before the regular 'error' listeners are called.

    +

    Installing a listener using this symbol does not change the behavior once an 'error' event is emitted. Therefore, the process will still crash if no +regular 'error' listener is installed.

    +

    v13.6.0, v12.17.0

    +

    Methods

    • Type Parameters

      • K

      Parameters

      • error: Error
      • event: string | symbol
      • Rest...args: AnyRest

      Returns void

    • Alias for emitter.on(eventName, listener).

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.26

      +
    • Connect to the camera and fill device information properties

      +

      Returns Promise<Onvif>

    • Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments to each.

      Returns true if the event had listeners, false otherwise.

      -
      const EventEmitter = require('events');
      const myEmitter = new EventEmitter();

      // First listener
      myEmitter.on('event', function firstListener() {
      console.log('Helloooo! first listener');
      });
      // Second listener
      myEmitter.on('event', function secondListener(arg1, arg2) {
      console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
      });
      // Third listener
      myEmitter.on('event', function thirdListener(...args) {
      const parameters = args.join(', ');
      console.log(`event with parameters ${parameters} in third listener`);
      });

      console.log(myEmitter.listeners('event'));

      myEmitter.emit('event', 1, 2, 3, 4, 5);

      // Prints:
      // [
      // [Function: firstListener],
      // [Function: secondListener],
      // [Function: thirdListener]
      // ]
      // Helloooo! first listener
      // event with parameters 1, 2 in second listener
      // event with parameters 1, 2, 3, 4, 5 in third listener -
      +
      import { EventEmitter } from 'node:events';
      const myEmitter = new EventEmitter();

      // First listener
      myEmitter.on('event', function firstListener() {
      console.log('Helloooo! first listener');
      });
      // Second listener
      myEmitter.on('event', function secondListener(arg1, arg2) {
      console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
      });
      // Third listener
      myEmitter.on('event', function thirdListener(...args) {
      const parameters = args.join(', ');
      console.log(`event with parameters ${parameters} in third listener`);
      });

      console.log(myEmitter.listeners('event'));

      myEmitter.emit('event', 1, 2, 3, 4, 5);

      // Prints:
      // [
      // [Function: firstListener],
      // [Function: secondListener],
      // [Function: thirdListener]
      // ]
      // Helloooo! first listener
      // event with parameters 1, 2 in second listener
      // event with parameters 1, 2, 3, 4, 5 in third listener +
      -

      Since

      v0.1.26

      -
      -
      -

      Parameters

      -
        -
      • -
        eventName: string | symbol
      • -
      • -
        Rest ...args: any[]
      -

      Returns boolean

    -
    - -
      - -
    • Private -

      Envelope footer for all SOAP messages

      -
      -

      Returns string

    -
    - -
      - -
    • Private -

      Envelope header for all SOAP messages

      -
      -
      -

      Parameters

      -
        -
      • -
        openHeader: boolean = false
      -

      Returns string

    -
    - -
      - -
    • -

      Returns an array listing the events for which the emitter has registered +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • Rest...args: AnyRest

      Returns boolean

      v0.1.26

      +
    • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

      -
      const EventEmitter = require('events');
      const myEE = new EventEmitter();
      myEE.on('foo', () => {});
      myEE.on('bar', () => {});

      const sym = Symbol('symbol');
      myEE.on(sym, () => {});

      console.log(myEE.eventNames());
      // Prints: [ 'foo', 'bar', Symbol(symbol) ] -
      - -

      Since

      v6.0.0

      -
      -

      Returns (string | symbol)[]

    -
    - -
      - -
    • Private -

      Check and find out video configuration for device

      -
      -

      Returns Promise<void>

    -
    - -
      - -
    • -

      Returns the current max listener value for the EventEmitter which is either -set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

      - -

      Since

      v1.0.0

      -
      -

      Returns number

    -
    - -
      - -
    • -

      Receive date and time from cam

      -
      -

      Returns Promise<Date>

    -
    - -
      - -
    • -

      Returns the number of listeners listening to the event named eventName.

      +
      import { EventEmitter } from 'node:events';

      const myEE = new EventEmitter();
      myEE.on('foo', () => {});
      myEE.on('bar', () => {});

      const sym = Symbol('symbol');
      myEE.on(sym, () => {});

      console.log(myEE.eventNames());
      // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
      -

      Since

      v3.2.0

      -
      -
      -

      Parameters

      -
        -
      • -
        eventName: string | symbol
        -

        The name of the event being listened for

        -
      -

      Returns number

    -
    - -
      - -
    • -

      Returns a copy of the array of listeners for the event named eventName.

      -
      server.on('connection', (stream) => {
      console.log('someone connected!');
      });
      console.log(util.inspect(server.listeners('connection')));
      // Prints: [ [Function] ] -
      +

      Returns (string | symbol)[]

      v6.0.0

      +
    • Returns the current max listener value for the EventEmitter which is either +set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

      +

      Returns number

      v1.0.0

      +
    • Receive date and time from cam

      +

      Returns Promise<Date>

    • Returns the number of listeners listening for the event named eventName. +If listener is provided, it will return how many times the listener is found +in the list of the listeners of the event.

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event being listened for

        +
      • Optionallistener: Function

        The event handler function

        +

      Returns number

      v3.2.0

      +
    • Returns a copy of the array of listeners for the event named eventName.

      +
      server.on('connection', (stream) => {
      console.log('someone connected!');
      });
      console.log(util.inspect(server.listeners('connection')));
      // Prints: [ [Function] ] +
      -

      Since

      v0.1.26

      -
      -
      -

      Parameters

      -
        -
      • -
        eventName: string | symbol
      -

      Returns Function[]

    -
    - -
      - -
    • -

      Alias for emitter.removeListener().

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      v0.1.26

      +
    • Alias for emitter.removeListener().

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v10.0.0

      +
    • Adds the listener function to the end of the listeners array for the event +named eventName. No checks are made to see if the listener has already +been added. Multiple calls passing the same combination of eventName and +listener will result in the listener being added, and called, multiple times.

      +
      server.on('connection', (stream) => {
      console.log('someone connected!');
      }); +
      -

      Since

      v10.0.0

      -
      -
      -

      Parameters

      -
        -
      • -
        eventName: string | symbol
      • -
      • -
        listener: ((...args: any[]) => void)
        -
          -
        • -
            -
          • (...args: any[]): void
          • -
          • -
            -

            Parameters

            -
              -
            • -
              Rest ...args: any[]
            -

            Returns void

      -

      Returns Onvif

    -
    - -
      - -
    • -

      Adds the listener function to the end of the listeners array for the -event named eventName. No checks are made to see if the listener has -already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple -times.

      -
      server.on('connection', (stream) => {
      console.log('someone connected!');
      }); -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      By default, event listeners are invoked in the order they are added. Theemitter.prependListener() method can be used as an alternative to add the +

      By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the event listener to the beginning of the listeners array.

      -
      const myEE = new EventEmitter();
      myEE.on('foo', () => console.log('a'));
      myEE.prependListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a -
      +
      import { EventEmitter } from 'node:events';
      const myEE = new EventEmitter();
      myEE.on('foo', () => console.log('a'));
      myEE.prependListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a +
      -

      Since

      v0.1.101

      -
      -
      -

      Parameters

      -
        -
      • -
        eventName: string | symbol
        -

        The name of the event.

        -
      • -
      • -
        listener: ((...args: any[]) => void)
        -

        The callback function

        -
        -
          -
        • -
            -
          • (...args: any[]): void
          • -
          • -
            -

            Parameters

            -
              -
            • -
              Rest ...args: any[]
            -

            Returns void

      -

      Returns Onvif

    -
    - -
      - -
    • -

      Adds a one-timelistener function for the event named eventName. The +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        +
      • listener: ((...args: any[]) => void)

        The callback function

        +
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.101

      +
    • Adds a one-time listener function for the event named eventName. The next time eventName is triggered, this listener is removed and then invoked.

      -
      server.once('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); -
      +
      server.once('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); +
      +

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      By default, event listeners are invoked in the order they are added. Theemitter.prependOnceListener() method can be used as an alternative to add the +

      By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener() method can be used as an alternative to add the event listener to the beginning of the listeners array.

      -
      const myEE = new EventEmitter();
      myEE.once('foo', () => console.log('a'));
      myEE.prependOnceListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a -
      +
      import { EventEmitter } from 'node:events';
      const myEE = new EventEmitter();
      myEE.once('foo', () => console.log('a'));
      myEE.prependOnceListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a +
      -

      Since

      v0.3.0

      -
      -
      -

      Parameters

      -
        -
      • -
        eventName: string | symbol
        -

        The name of the event.

        -
      • -
      • -
        listener: ((...args: any[]) => void)
        -

        The callback function

        -
        -
          -
        • -
            -
          • (...args: any[]): void
          • -
          • -
            -

            Parameters

            -
              -
            • -
              Rest ...args: any[]
            -

            Returns void

      -

      Returns Onvif

    -
    - -
      - -
    • Private -

      Parse url with an eye on preserveAddress property

      -
      -
      -

      Parameters

      -
        -
      • -
        address: string
      -

      Returns URL

    -
    - -
      - -
    • -

      Returns { nonce: string; passDigest: string; timestamp: string }

      -
        -
      • -
        nonce: string
      • -
      • -
        passDigest: string
      • -
      • -
        timestamp: string
    -
    - -
      - -
    • -

      Adds the listener function to the beginning of the listeners array for the +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        +
      • listener: ((...args: any[]) => void)

        The callback function

        +
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.3.0

      +
    • Adds the listener function to the beginning of the listeners array for the event named eventName. No checks are made to see if the listener has -already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple -times.

      -
      server.prependListener('connection', (stream) => {
      console.log('someone connected!');
      }); -
      -

      Returns a reference to the EventEmitter, so that calls can be chained.

      +already been added. Multiple calls passing the same combination of eventName +and listener will result in the listener being added, and called, multiple times.

      +
      server.prependListener('connection', (stream) => {
      console.log('someone connected!');
      }); +
      -

      Since

      v6.0.0

      -
      -
      -

      Parameters

      -
        -
      • -
        eventName: string | symbol
        -

        The name of the event.

        -
      • -
      • -
        listener: ((...args: any[]) => void)
        -

        The callback function

        -
        -
          -
        • -
            -
          • (...args: any[]): void
          • -
          • -
            -

            Parameters

            -
              -
            • -
              Rest ...args: any[]
            -

            Returns void

      -

      Returns Onvif

    -
    - -
      - -
    • -

      Adds a one-timelistener function for the event named eventName to the_beginning_ of the listeners array. The next time eventName is triggered, this -listener is removed, and then invoked.

      -
      server.prependOnceListener('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); -

      Returns a reference to the EventEmitter, so that calls can be chained.

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        +
      • listener: ((...args: any[]) => void)

        The callback function

        +
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v6.0.0

      +
    • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this +listener is removed, and then invoked.

      +
      server.prependOnceListener('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); +
      -

      Since

      v6.0.0

      -
      -
      -

      Parameters

      -
        -
      • -
        eventName: string | symbol
        -

        The name of the event.

        -
      • -
      • -
        listener: ((...args: any[]) => void)
        -

        The callback function

        -
        -
          -
        • -
            -
          • (...args: any[]): void
          • -
          • -
            -

            Parameters

            -
              -
            • -
              Rest ...args: any[]
            -

            Returns void

      -

      Returns Onvif

    -
    - -
      - -
    • -

      Returns a copy of the array of listeners for the event named eventName, +

      Returns a reference to the EventEmitter, so that calls can be chained.

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        +
      • listener: ((...args: any[]) => void)

        The callback function

        +
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v6.0.0

      +
    • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

      -
      const emitter = new EventEmitter();
      emitter.once('log', () => console.log('log once'));

      // Returns a new Array with a function `onceWrapper` which has a property
      // `listener` which contains the original listener bound above
      const listeners = emitter.rawListeners('log');
      const logFnWrapper = listeners[0];

      // Logs "log once" to the console and does not unbind the `once` event
      logFnWrapper.listener();

      // Logs "log once" to the console and removes the listener
      logFnWrapper();

      emitter.on('log', () => console.log('log persistently'));
      // Will return a new Array with a single function bound by `.on()` above
      const newListeners = emitter.rawListeners('log');

      // Logs "log persistently" twice
      newListeners[0]();
      emitter.emit('log'); -
      +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.once('log', () => console.log('log once'));

      // Returns a new Array with a function `onceWrapper` which has a property
      // `listener` which contains the original listener bound above
      const listeners = emitter.rawListeners('log');
      const logFnWrapper = listeners[0];

      // Logs "log once" to the console and does not unbind the `once` event
      logFnWrapper.listener();

      // Logs "log once" to the console and removes the listener
      logFnWrapper();

      emitter.on('log', () => console.log('log persistently'));
      // Will return a new Array with a single function bound by `.on()` above
      const newListeners = emitter.rawListeners('log');

      // Logs "log persistently" twice
      newListeners[0]();
      emitter.emit('log'); +
      -

      Since

      v9.4.0

      -
      -
      -

      Parameters

      -
        -
      • -
        eventName: string | symbol
      -

      Returns Function[]

    -
    - -
    -
    - -
      - -
    • -

      Removes all listeners, or those of the specified eventName.

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      v9.4.0

      +
    • Removes all listeners, or those of the specified eventName.

      It is bad practice to remove listeners added elsewhere in the code, particularly when the EventEmitter instance was created by some other component or module (e.g. sockets or file streams).

      Returns a reference to the EventEmitter, so that calls can be chained.

      +

      Parameters

      • OptionaleventName: string | symbol

      Returns this

      v0.1.26

      +
    • Removes the specified listener from the listener array for the event named eventName.

      +
      const callback = (stream) => {
      console.log('someone connected!');
      };
      server.on('connection', callback);
      // ...
      server.removeListener('connection', callback); +
      -

      Since

      v0.1.26

      -
      -
      -

      Parameters

      -
        -
      • -
        Optional event: string | symbol
      -

      Returns Onvif

    -
    - -
    -
    - -
    -
    - -
      - -
    • -

      By default EventEmitters will print a warning if more than 10 listeners are +

      Returns a reference to the EventEmitter, so that calls can be chained.

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.26

      +
    • By default EventEmitters will print a warning if more than 10 listeners are added for a particular event. This is a useful default that helps finding memory leaks. The emitter.setMaxListeners() method allows the limit to be -modified for this specific EventEmitter instance. The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

      +modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.

      Returns a reference to the EventEmitter, so that calls can be chained.

      +

      Parameters

      • n: number

      Returns this

      v0.3.5

      +
    • Experimental

      Listens once to the abort event on the provided signal.

      +

      Listening to the abort event on abort signals is unsafe and may +lead to resource leaks since another third party with the signal can +call e.stopImmediatePropagation(). Unfortunately Node.js cannot change +this since it would violate the web standard. Additionally, the original +API makes it easy to forget to remove listeners.

      +

      This API allows safely using AbortSignals in Node.js APIs by solving these +two issues by listening to the event such that stopImmediatePropagation does +not prevent the listener from running.

      +

      Returns a disposable so that it may be unsubscribed from more easily.

      +
      import { addAbortListener } from 'node:events';

      function example(signal) {
      let disposable;
      try {
      signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
      disposable = addAbortListener(signal, (e) => {
      // Do something when signal is aborted.
      });
      } finally {
      disposable?.[Symbol.dispose]();
      }
      } +
      -

      Since

      v0.3.5

      -
      -
      -

      Parameters

      -
        -
      • -
        n: number
      -

      Returns Onvif

    -
    - -
      - -
    • -
      -

      Parameters

      -
        -
      • -
        data: any
      -

      Returns Date

    -
    - -
      - -
    • -

      Returns a copy of the array of listeners for the event named eventName.

      +

      Parameters

      • signal: AbortSignal
      • resource: ((event: Event) => void)
          • (event): void
          • Parameters

            • event: Event

            Returns void

      Returns Disposable

      Disposable that removes the abort listener.

      +

      v20.5.0

      +
    • Returns a copy of the array of listeners for the event named eventName.

      For EventEmitters this behaves exactly the same as calling .listeners on the emitter.

      For EventTargets this is the only way to get the event listeners for the event target. This is useful for debugging and diagnostic purposes.

      -
      const { getEventListeners, EventEmitter } = require('events');

      {
      const ee = new EventEmitter();
      const listener = () => console.log('Events are fun');
      ee.on('foo', listener);
      getEventListeners(ee, 'foo'); // [listener]
      }
      {
      const et = new EventTarget();
      const listener = () => console.log('Events are fun');
      et.addEventListener('foo', listener);
      getEventListeners(et, 'foo'); // [listener]
      } -
      +
      import { getEventListeners, EventEmitter } from 'node:events';

      {
      const ee = new EventEmitter();
      const listener = () => console.log('Events are fun');
      ee.on('foo', listener);
      console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
      }
      {
      const et = new EventTarget();
      const listener = () => console.log('Events are fun');
      et.addEventListener('foo', listener);
      console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
      } +
      -

      Since

      v15.2.0, v14.17.0

      -
      -
      -

      Parameters

      -
        -
      • -
        emitter: EventEmitter | DOMEventTarget
      • -
      • -
        name: string | symbol
      -

      Returns Function[]

    -
    - -
      - -
    • -

      A class method that returns the number of listeners for the given eventNameregistered on the given emitter.

      -
      const { EventEmitter, listenerCount } = require('events');
      const myEmitter = new EventEmitter();
      myEmitter.on('event', () => {});
      myEmitter.on('event', () => {});
      console.log(listenerCount(myEmitter, 'event'));
      // Prints: 2 -
      +

      Parameters

      • emitter: EventEmitter<DefaultEventMap> | EventTarget
      • name: string | symbol

      Returns Function[]

      v15.2.0, v14.17.0

      +
    • Returns the currently set max amount of listeners.

      +

      For EventEmitters this behaves exactly the same as calling .getMaxListeners on +the emitter.

      +

      For EventTargets this is the only way to get the max event listeners for the +event target. If the number of event handlers on a single EventTarget exceeds +the max set, the EventTarget will print a warning.

      +
      import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

      {
      const ee = new EventEmitter();
      console.log(getMaxListeners(ee)); // 10
      setMaxListeners(11, ee);
      console.log(getMaxListeners(ee)); // 11
      }
      {
      const et = new EventTarget();
      console.log(getMaxListeners(et)); // 10
      setMaxListeners(11, et);
      console.log(getMaxListeners(et)); // 11
      } +
      + +

      Parameters

      • emitter: EventEmitter<DefaultEventMap> | EventTarget

      Returns number

      v19.9.0

      +
    • A class method that returns the number of listeners for the given eventName registered on the given emitter.

      +
      import { EventEmitter, listenerCount } from 'node:events';

      const myEmitter = new EventEmitter();
      myEmitter.on('event', () => {});
      myEmitter.on('event', () => {});
      console.log(listenerCount(myEmitter, 'event'));
      // Prints: 2 +
      -

      Since

      v0.9.12

      +

      Parameters

      • emitter: EventEmitter<DefaultEventMap>

        The emitter to query

        +
      • eventName: string | symbol

        The event name

        +

      Returns number

      v0.9.12

      +

      Since v3.2.0 - Use listenerCount instead.

      +
    • import { on, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      });

      for await (const event of on(ee, 'foo')) {
      // The execution of this inner block is synchronous and it
      // processes one event at a time (even with await). Do not use
      // if concurrent execution is required.
      console.log(event); // prints ['bar'] [42]
      }
      // Unreachable here +
      -

      Deprecated

      Since v3.2.0 - Use listenerCount instead.

      -
      -
      -

      Parameters

      -
        -
      • -
        emitter: EventEmitter
        -

        The emitter to query

        -
      • -
      • -
        eventName: string | symbol
        -

        The event name

        -
      -

      Returns number

    -
    - -
      - -
    • -
      const { on, EventEmitter } = require('events');

      (async () => {
      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      });

      for await (const event of on(ee, 'foo')) {
      // The execution of this inner block is synchronous and it
      // processes one event at a time (even with await). Do not use
      // if concurrent execution is required.
      console.log(event); // prints ['bar'] [42]
      }
      // Unreachable here
      })(); -

      Returns an AsyncIterator that iterates eventName events. It will throw -if the EventEmitter emits 'error'. It removes all listeners when +if the EventEmitter emits 'error'. It removes all listeners when exiting the loop. The value returned by each iteration is an array composed of the emitted event arguments.

      An AbortSignal can be used to cancel waiting on events:

      -
      const { on, EventEmitter } = require('events');
      const ac = new AbortController();

      (async () => {
      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      });

      for await (const event of on(ee, 'foo', { signal: ac.signal })) {
      // The execution of this inner block is synchronous and it
      // processes one event at a time (even with await). Do not use
      // if concurrent execution is required.
      console.log(event); // prints ['bar'] [42]
      }
      // Unreachable here
      })();

      process.nextTick(() => ac.abort()); -
      +
      import { on, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ac = new AbortController();

      (async () => {
      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      });

      for await (const event of on(ee, 'foo', { signal: ac.signal })) {
      // The execution of this inner block is synchronous and it
      // processes one event at a time (even with await). Do not use
      // if concurrent execution is required.
      console.log(event); // prints ['bar'] [42]
      }
      // Unreachable here
      })();

      process.nextTick(() => ac.abort()); +
      -

      Since

      v13.6.0, v12.16.0

      +

      Use the close option to specify an array of event names that will end the iteration:

      +
      import { on, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      ee.emit('close');
      });

      for await (const event of on(ee, 'foo', { close: ['close'] })) {
      console.log(event); // prints ['bar'] [42]
      }
      // the loop will exit after 'close' is emitted
      console.log('done'); // prints 'done' +
      -

      Returns

      that iterates eventName events emitted by the emitter

      -
      -
      -

      Parameters

      -
        -
      • -
        emitter: EventEmitter
      • -
      • -
        eventName: string
        -

        The name of the event being listened for

        -
      • -
      • -
        Optional options: StaticEventEmitterOptions
      -

      Returns AsyncIterableIterator<any>

    -
    - -
      - -
    • -

      Creates a Promise that is fulfilled when the EventEmitter emits the given -event or that is rejected if the EventEmitter emits 'error' while waiting. +

      Parameters

      • emitter: EventEmitter<DefaultEventMap>
      • eventName: string | symbol
      • Optionaloptions: StaticEventEmitterIteratorOptions

      Returns AsyncIterableIterator<any[]>

      An AsyncIterator that iterates eventName events emitted by the emitter

      +

      v13.6.0, v12.16.0

      +
    • Parameters

      • emitter: EventTarget
      • eventName: string
      • Optionaloptions: StaticEventEmitterIteratorOptions

      Returns AsyncIterableIterator<any[]>

    • Creates a Promise that is fulfilled when the EventEmitter emits the given +event or that is rejected if the EventEmitter emits 'error' while waiting. The Promise will resolve with an array of all the arguments emitted to the given event.

      -

      This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event -semantics and does not listen to the 'error' event.

      -
      const { once, EventEmitter } = require('events');

      async function run() {
      const ee = new EventEmitter();

      process.nextTick(() => {
      ee.emit('myevent', 42);
      });

      const [value] = await once(ee, 'myevent');
      console.log(value);

      const err = new Error('kaboom');
      process.nextTick(() => {
      ee.emit('error', err);
      });

      try {
      await once(ee, 'myevent');
      } catch (err) {
      console.log('error happened', err);
      }
      }

      run(); -
      -

      The special handling of the 'error' event is only used when events.once()is used to wait for another event. If events.once() is used to wait for the -'error' event itself, then it is treated as any other kind of event without +

      This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event +semantics and does not listen to the 'error' event.

      +
      import { once, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ee = new EventEmitter();

      process.nextTick(() => {
      ee.emit('myevent', 42);
      });

      const [value] = await once(ee, 'myevent');
      console.log(value);

      const err = new Error('kaboom');
      process.nextTick(() => {
      ee.emit('error', err);
      });

      try {
      await once(ee, 'myevent');
      } catch (err) {
      console.error('error happened', err);
      } +
      + +

      The special handling of the 'error' event is only used when events.once() is used to wait for another event. If events.once() is used to wait for the +'error' event itself, then it is treated as any other kind of event without special handling:

      -
      const { EventEmitter, once } = require('events');

      const ee = new EventEmitter();

      once(ee, 'error')
      .then(([err]) => console.log('ok', err.message))
      .catch((err) => console.log('error', err.message));

      ee.emit('error', new Error('boom'));

      // Prints: ok boom -
      +
      import { EventEmitter, once } from 'node:events';

      const ee = new EventEmitter();

      once(ee, 'error')
      .then(([err]) => console.log('ok', err.message))
      .catch((err) => console.error('error', err.message));

      ee.emit('error', new Error('boom'));

      // Prints: ok boom +
      +

      An AbortSignal can be used to cancel waiting for the event:

      -
      const { EventEmitter, once } = require('events');

      const ee = new EventEmitter();
      const ac = new AbortController();

      async function foo(emitter, event, signal) {
      try {
      await once(emitter, event, { signal });
      console.log('event emitted!');
      } catch (error) {
      if (error.name === 'AbortError') {
      console.error('Waiting for the event was canceled!');
      } else {
      console.error('There was an error', error.message);
      }
      }
      }

      foo(ee, 'foo', ac.signal);
      ac.abort(); // Abort waiting for the event
      ee.emit('foo'); // Prints: Waiting for the event was canceled! -
      +
      import { EventEmitter, once } from 'node:events';

      const ee = new EventEmitter();
      const ac = new AbortController();

      async function foo(emitter, event, signal) {
      try {
      await once(emitter, event, { signal });
      console.log('event emitted!');
      } catch (error) {
      if (error.name === 'AbortError') {
      console.error('Waiting for the event was canceled!');
      } else {
      console.error('There was an error', error.message);
      }
      }
      }

      foo(ee, 'foo', ac.signal);
      ac.abort(); // Abort waiting for the event
      ee.emit('foo'); // Prints: Waiting for the event was canceled! +
      + +

      Parameters

      • emitter: EventEmitter<DefaultEventMap>
      • eventName: string | symbol
      • Optionaloptions: StaticEventEmitterOptions

      Returns Promise<any[]>

      v11.13.0, v10.16.0

      +
    • Parameters

      • emitter: EventTarget
      • eventName: string
      • Optionaloptions: StaticEventEmitterOptions

      Returns Promise<any[]>

    • import { setMaxListeners, EventEmitter } from 'node:events';

      const target = new EventTarget();
      const emitter = new EventEmitter();

      setMaxListeners(5, target, emitter); +
      + +

      Parameters

      • Optionaln: number

        A non-negative number. The maximum number of listeners per EventTarget event.

        +
      • Rest...eventTargets: (EventEmitter<DefaultEventMap> | EventTarget)[]

      Returns void

      v15.4.0

      +

    Events

    error: "error" = ...

    Indicates any errors

    +

    Error object +error

    +
    onvif.on('error', console.error);
    +
    + +
    rawRequest: "rawRequest" = ...

    Indicates raw xml request to device. +rawRequest

    +
    onvif.on('rawRequest', (xml) => { console.log('-> request was', xml); });
    +
    + +
    rawResponse: "rawResponse" = ...

    Indicates raw xml response from device. +rawResponse

    +
    onvif.on('rawResponse', (xml) => { console.log('<- response was', xml); });
    +
    + +
    warn: "warn" = ...

    Indicates any warnings +warn

    +
    onvif.on('warn', console.warn);
    +
    -

    Since

    v11.13.0, v10.16.0

    -
    -
    -

    Parameters

    -
      -
    • -
      emitter: NodeEventTarget
    • -
    • -
      eventName: string | symbol
    • -
    • -
      Optional options: StaticEventEmitterOptions
    -

    Returns Promise<any[]>

    - -
  • -
    -

    Parameters

    -
      -
    • -
      emitter: DOMEventTarget
    • -
    • -
      eventName: string
    • -
    • -
      Optional options: StaticEventEmitterOptions
    -

    Returns Promise<any[]>

  • -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 544bbffb..899c3ccb 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,609 +1,15 @@ -onvif
    -
    - -
    -
    -
    -
    -

    onvif

    -
    - -

    ONVIF

    -
    -

    Build Status -Coverage Status +onvif

    onvif

    ONVIF

    Coverage Status NPM version

    ONVIF Client protocol Profile S (Live Streaming) and Profile G (Replay) Node.js implementation.

    This is a wrapper to ONVIF protocol which allows you to get information about your NVT (network video transmitter) device, its media sources, control PTZ (pan-tilt-zoom) movements and manage presets, detect devices in your network and control its events. It will also allow you to get information about your NVR (network video recorder) Profile G device and obtain a list of recordings.

    -

    The library uses NodeJS.

    +

    The library uses NodeJS. And works on the server-side.

    ONVIF

    - - -

    Installation

    -
    - - -

    NPM

    -
    -

    npm install onvif - install latest stable version

    -

    npm install agsh/onvif - install latest version from GitHub

    -

    npm install agsh/onvif#dev - install latest development version

    - - -

    Clone the latest version from github

    -
    -

    git clone https://github.com/agsh/onvif.git

    - - -

    Tests

    -
    -

    In the library directory run npm test

    -

    By default the tests use a mockup server to generate ONVIF replies.

    -

    To test with the real device, set appropriate environment variables HOSTNAME, USERNAME, PASSWORD, PORT and run -tests.

    - - -

    Documentation

    -
    -

    To build jsdoc for the library with default theme run npm run jsdoc. Otherwise use jsdoc with sources from -./lib/*.js

    - - -

    Quick example

    -
    -

    This example asks your camera to look up and starts a web server at port 3030 that distributes a web page with vlc-plugin -container which translates video from the camera.

    -
    var
    http = require('http'),
    Cam = require('onvif').Cam;

    new Cam({
    hostname: <CAMERA_HOST>,
    username: <USERNAME>,
    password: <PASSWORD>
    }, function(err) {
    this.absoluteMove({x: 1, y: 1, zoom: 1});
    this.getStreamUri({protocol:'RTSP'}, function(err, stream) {
    http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end('<html><body>' +
    '<embed type="application/x-vlc-plugin" target="' + stream.uri + '"></embed>' +
    '</body></html>');
    }).listen(3030);
    });
    }); -
    - - -

    Other examples (located in the Examples Folder on the Github)

    -
    -
      -
    • example.js - Move camera to a pre-defined position then server the RTSP URL up via a HTTP Server. Click on the RTSP address in a browser to open the video (if you have the VLC plugin installed)
    • -
    • example2.js - takes an IP address range, scans the range for ONVIF devices (brute force scan) and displays information about each device found including make and model and RTSP URLs -For Profile S Cameras and Encoders it displays the default RTSP address -For Profile G Recorders it displays the RTSP address of the first recording
    • -
    • example3.js - reads the command line cursor keys and sends PTZ commands to the Camera
    • -
    • example4.js - uses Discovery to find cameras on the local network
    • -
    • example5.js - connect to a camera via SOCKS proxy. Note SSH includes a SOCKS proxy so you can use this example to connect to remote cameras via SSH
    • -
    • example6.js - ONVIF Events. Example can be switched btween using Pull Point Subscriptions and using Base Subscribe with a built in mini HTTP Server
    • -
    • example7.js - example using a Promise API. It uses 'promisify' to convert the ONVIF Library to return promises and uses Await to wait for responses
    • -
    • example8.js - example setting OSD On Screen Display. (also uses Promises API)
    • -
    - - -

    Troubleshooting

    -
    -

    Different cameras have different ONVIF implementation. I've tested this module only with a couple of devices. So if you got different problems with this library, please let me know via e-mail. Else please just send the model of your -camera to me.

    - - -

    API

    -
    -

    This page and API class documentation you can found here: http://agsh.github.io/onvif/

    -

    Short description of library possibilities is below.

    - - -

    Discovery

    -
    -

    Since 0.2.7 version library supports WS-Discovery of NVT devices. Currently it uses only Probe SOAP method that just works well. -You can find devices in your subnetwork using probe method of the Discovery singleton. -Discovery is an EventEmitter inheritor, so you can wait until discovery timeout, or subscribe on device event. -You must subscribe to the error event as a device on your network could reply with bad XML -Here some examples:

    -
    var onvif = require('onvif');
    onvif.Discovery.on('device', function(cam){
    // function will be called as soon as NVT responds
    cam.username = <USERNAME>;
    cam.password = <PASSWORD>;
    cam.connect(console.log);
    })
    // Must have an error handler to catch bad replies from the network
    onvif.Discovery.on('error', function (err,xml) {
    // function called as soon as NVT responds, but this library could not parse the response
    console.log('Discovery error ' + err);
    });
    onvif.Discovery.probe(); -
    -
    var onvif = require('onvif');
    // Must have an error handler to catch bad replies from the network
    onvif.Discovery.on('error', function (err,xml) {
    console.log('Discovery error ' + err);
    });
    onvif.Discovery.probe(function(err, cams) {
    // function will be called only after timeout (5 sec by default)
    if (err) {
    // There is a device on the network returning bad discovery data
    // Probe results will be incomplete
    throw err;
    }
    cams.forEach(function(cam) {
    cam.username = <USERNAME>;
    cam.password = <PASSWORD>;
    cam.connect(console.log);
    });
    }); -
    -

    In all of that cases you've got disconnected cameras. To access each camera (and issue ONVIF commands) you normally need -the tuple username:password. So, as shown in the examples, you can assign these properties and call connect method to -get full functionality.

    - - -

    Discovery.probe(options, callback)

    -
    -

    Options

    -
      -
    • timeout, number. Time the probe method will wait NVT responses in ms
    • -
    • resolve, boolean. If this argument is false, all discovered NVTs would be presented as data object instead of Cam instance
    • -
    - - -

    Discovery events

    -
    -
      -
    • device(cam, remoteInfo, responseXML) fires on device discover. cam is a Cam instance, remoteInfo is an object with network information - and responseXML is a body of SOAP response
    • -
    • error(error) fires on some UDP error or on bad SOAP response from NVT
    • -
    - - -

    Cam class

    -
    -
    var Cam = require('onvif').Cam;
    -
    - - -

    new Cam(options, callback)

    -
    -

    Options are:

    -
      -
    • hostname
    • -
    • username, password (optional, to deal with majority of functions)
    • -
    • port (optional)
    • -
    -

    The library calls connect() automatically which executes the getSystemDateAndTime, getCapabilities and other methods. -Note on username and password:

    -
      -
    • Some cameras do not require username:password credentials.
    • -
    • If a camera does require a username:password but you do not provide them, you will be limited to executing a few ONVIF methods that can operate without credentials, for example you can execute only getSystemDateAndTime method.
    • -
    -

    Callback (optional) executes when the cam is initialised. Single argument for this function is possible error.

    - - -

    Technical description

    -
    -

    When the cam object is created it automatically sends a getCapabilities command to the ONVIF device. If the device is a camera or encoder (NVT) it sends two commands to the ONVIF device: -getVideoSources and getProfiles. It fills corresponding properties of an object:

    -
      -
    • capabilities
        -
      • device
      • -
      • events
      • -
      • imaging
      • -
      • media
      • -
      • PTZ
      • -
      • extension
      • -
      -
    • -
    • uri (this is a links to different NVT services)
    • -
    • videoSources
        -
      • $.token
      • -
      • framerate
      • -
      • resolution
      • -
      -
    • -
    • profiles, array of profile object
        -
      • name
      • -
      • videoSourceConfiguration
      • -
      • videoEncoderConfiguration
      • -
      • PTZConfiguration
      • -
      -
    • -
    -

    After that it runs getActiveSources method. It iterates over all video sources and tries to find out proper configuration -for profile and videosource. First matching profile becomes a member of defaultProfiles array and video source configuration -with ptz configuration becomes a member of activeSources array.

    -

    Configuration for the first or the only one video source becomes defaultProfile and activeSource properties. All methods -without passing options object use it. You can change it manually at any time.

    -
      -
    • defaultProfile (link to the first profile in profiles)
    • -
    • activeSource (based on the default profile)
        -
      • sourceToken
      • -
      • profileToken
      • -
      • encoding
      • -
      • width
      • -
      • height
      • -
      • fps
      • -
      • bitrate
      • -
      • ptz
      • -
      -
    • -
    - - -

    connect(callback)

    -
    -

    Connect to the camera and fill device information properties with getSystemDateAndTime, getCapabilities, getVideoSources, getProfiles methods

    -

    See more detailed information at http://www.onvif.org/ver10/media/wsdl/media.wsdl -After cam initialisation we can run several ONVIF commands. -There are several common methods that work without credentials. Here are they: getSystemDateAndTime.

    - - -

    getSystemDateAndTime(callback)

    -
    -

    Returns a Date object with current camera datetime in the callback. -The ONVIF Standard says this would work without credentials (passed username and password arguments) so that the timeShift difference between the local clock and the NVT's onboard clock can be calculated for SOAP Authentication. However some devices claiming ONVIF support require a password and the library will re-try the connection if a username and password are available.

    - - -

    getDeviceInformation(callback)

    -
    -

    Device. Returns a device information, such as manufacturer, model and firmware version in the callback

    - - -

    getServices(callback)

    -
    -

    Device. Returns in callback and assigns to #services property an array consists of objects with properties: namespace, XAddr, version

    - - -

    getServiceCapabilities(callback)

    -
    -

    Device. Returns in callback and assigns to #serviceCapabilities property the capabilities of the device service (not media): -network, security and system. If your device supports some auxiliary capabilities they will be there too.

    - - -

    getStreamUri(options, callback)

    -
    -

    Media. Returns a URI that can be used to initiate a live media stream using RTSP as the control protocol -The options are:

    -
      -
    • stream (optional) - defines if a multicast or unicast stream is requested. Possible values are: 'RTP-Unicast' (default), 'RTP-Multicast'
    • -
    • protocol (optional) - defines the network protocol for streaming. Possible values are: 'UDP', 'TCP', 'RTSP' (default), 'HTTP'
    • -
    • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
    • -
    - - -

    getSnapshotUri(options, callback)

    -
    -

    Media. Obtain a JPEG snapshot URI from the device.

    - - -

    getPresets(options, callback)

    -
    -

    Returns the saved presets as an a key-value object where the key is the name of a preset and a value is a preset token. -This method also stores the presets information in a #presets property of an object.

    -

    The options are:

    -
      -
    • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
    • -
    - - -

    gotoPreset(options, callback)

    -
    -

    PTZ. Operation to go to a saved preset position for the PTZ node in the selected profile.

    -

    The options are:

    -
      -
    • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
    • -
    • preset - the name of preset. List of presets you can get by #getPresets method or in #presets property.
    • -
    - - -

    setPreset(options, callback)

    -
    -

    PTZ. Operation to set the current position as a preset for the PTZ node in the selected profile. If presetToken is passed as an option, then the preset for which that token is attached will be replaced. After success, you should re-fetch the presets with #getPresets method.

    -

    The options are:

    -
      -
    • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
    • -
    • presetName - the name to give to the preset. (optional) is this is a preset update.
    • -
    - - -

    removePreset(options, callback)

    -
    -

    PTZ. Operation to remove a preset specified by the preset token. After success, you should re-fetch the presets with #getPresets method.

    -

    The options are:

    -
      -
    • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
    • -
    • presetToken - the preset token to use for preset removal (this will be the value of a preset object found in #presets after calling the #getPresets method.
    • -
    - - -

    gotoHomePosition(options, callback)

    -
    -

    PTZ. Operation to go to the saved home position for the PTZ node in the selected profile. If no home position has been saved, the ONVIF camera will do nothing.

    -

    The options are:

    -
      -
    • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken

      -
    • -
    • speed An object with properties

      -
        -
      • x Pan speed
      • -
      • y Tilt speed
      • -
      • zoom Zoom speed
      • -
      -

      If the speed option is omitted, the default speed set by the PTZConfiguration will be used.

      -
    • -
    - - -

    setHomePosition(options, callback)

    -
    -

    PTZ. Operation to set the current position as the home position for the PTZ node in the selected profile.

    -

    The options are:

    -
      -
    • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
    • -
    - - -

    getNodes(callback)

    -
    -

    PTZ. Returns the properties of the current PTZ node, if it exists. -Use this function to get maximum number of presets, ranges of admitted values for x, y, zoom, iris, focus. -Sets all information into #nodes property.

    - - -

    relativeMove(options, callback)

    -
    -

    PTZ. This is a relative pan-tilt-zoom method. Options for this method is a delta between desired and current position of the camera.

    -

    The options are:

    -
      -
    • x Pan, number or a string within -1 to 1, optional

      -
    • -
    • y Tilt, number or a string within -1 to 1, optional

      -
    • -
    • zoom Zoom, number or a string within -1 to 1, optional

      -
    • -
    • speed An object with properties

      -
        -
      • x Pan speed
      • -
      • y Tilt speed
      • -
      • zoom Zoom speed
      • -
      -

      If the speed option is omitted, the default speed set by the PTZConfiguration will be used.

      -
    • -
    -

    Callback is optional and means essentially nothing

    - - -

    absoluteMove(options, callback)

    -
    -

    PTZ. This is an absolute pan-tilt-zoom method. Options for this method is an absolute position of the camera.

    -

    The options are:

    -
      -
    • x Pan, number or a string within -1 to 1, optional

      -
    • -
    • y Tilt, number or a string within -1 to 1, optional

      -
    • -
    • zoom Zoom, number or a string within -1 to 1, optional

      -
    • -
    • speed An object with properties

      -
        -
      • x Pan speed
      • -
      • y Tilt speed
      • -
      • zoom Zoom speed
      • -
      -

      If the speed option is omitted, the default speed set by the PTZConfiguration will be used.

      -
    • -
    -

    Callback is optional and means essentially nothing

    - - -

    continuousMove(options, callback)

    -
    -

    PTZ. Operation for continuous Pan/Tilt and Zoom movements

    -

    The options are:

    -
      -
    • x Pan velocity, number or a string within -1 to 1, optional
    • -
    • y Tilt velocity, number or a string within -1 to 1, optional
    • -
    • zoom Zoom velocity, number or a string within -1 to 1, optional
    • -
    • timeout Timeout in milliseconds, number. If timeout is omitted, movement will continue until stop command
    • -
    - - -

    stop(options, callback)

    -
    -

    PTZ. Stop ongoing pan, tilt and zoom movements of absolute, relative and continuous type

    -

    Options and callback are optional. The options properties are:

    -
      -
    • profileToken (optional) - defines media profile to use and will define the configuration of the content of the stream. Default is #activeSource.profileToken
    • -
    • panTilt (optional) - set true when we want to stop ongoing pan and tilt movements. If panTilt arguments are not present, this command stops these movements.
    • -
    • zoom (optional) - set true when we want to stop ongoing zoom movement. If zoom arguments are not present, this command stops ongoing zoom movement.
    • -
    - - -

    getStatus(options, callback)

    -
    -

    PTZ. Returns an object with the current PTZ values.

    -
    {
    position: {
    x: 'pan position'
    , y: 'tilt position'
    , zoom: 'zoom'
    }
    , moveStatus: {} // camera moving
    , utcTime: 'current camera datetime'
    } -
    - - -

    getConfigurations(callback)

    -
    -

    PTZ. Get all the existing PTZConfigurations from the device. Configurations saved into #configurations property

    - - -

    getConfigurationOptions(configurationToken, callback)

    -
    -

    PTZ. Get supported coordinate systems including their range limitations for selected configuration. Extends corresponding -configuration object

    - - -

    Supported methods

    -
    -
      -
    • GetSystemDateAndTime
    • -
    • GetCapabilities
    • -
    • GetVideoSources
    • -
    • GetProfiles
    • -
    • GetServices
    • -
    • GetDeviceInformation
    • -
    • GetStreamUri
    • -
    • GetSnapshotUri
    • -
    • GetPresets
    • -
    • GotoPreset
    • -
    • RelativeMove
    • -
    • AbsoluteMove
    • -
    • ContinuousMove
    • -
    • Stop
    • -
    • GetStatus
    • -
    • SystemReboot
    • -
    • GetImagingSettings
    • -
    • SetImagingSettings
    • -
    • GetHostname
    • -
    • GetScopes
    • -
    • SetScopes
    • -
    • GetRecordings
    • -
    • GetReplayUri
    • -
    - - -

    Changelog

    -
    -
      -
    • 0.6.5 Add MEDIA2 support, Profile T and GetServices XAddrs support for H265 cameras. Add support for HTTPS. Add Discovery.on('error') to examples. Add flag to only send Zoom, or only send Pan/Tilt for some broken cameras (Sony XP1 Xiongmai). Fix bug in GetServices. Improve setNTP command. API changed on getNetworkInterfaces and other methods that could return an Array or a Single Item. We now return an Array in all cases. Add example converting library so it uses Promises with Promisify. Enable 3702 Discovery on Windows for MockServer. Add MockServer test cases)
    • -
    • 0.6.1 Workaround for cams that don't send date-time
    • -
    • 0.6.0 Refactor modules for proper import in electron-based environment
    • -
    • 0.5.5 Added ptz.gotoHomePosition, ptz.setHomePosition. Fixed exceptions in ptz.getConfigurations and utils.parseSOAPString. Added tests for ptz.setPreset, ptz.removePreset, ptz.gotoHomePosition, and ptz.setHomePosition.
    • -
    • 0.5.4 Bumped for NPM.
    • -
    • 0.5.3 Some fixes. Tests
    • -
    • 0.5.2 preserveAddress property for NAT devices, discovery with multiple network interfaces (@Climax777)
    • -
    • 0.5.1 Critical bugfix in SOAP-auth for some cams
    • -
    • 0.5.0 Profile G support (@RogerHardiman), proper SOAP auth, nodejs support >= 0.12
    • -
    • 0.4.2 Bugfixes
    • -
    • 0.4.1 Improved discovery (@sousandrei, @RogerHardiman)
    • -
    • 0.4.0 Encoder support (@chriswiggins), Imaging service (@EastL)
    • -
    • 0.3.1 EventEmitter-based events
    • -
    • 0.3.0 Refactoring, documentation, event service basics
    • -
    • 0.2.7 WS-Discovery
    • -
    - - -

    Links

    -
    -

    WSDL schemes and docs:

    - -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +

    This is a new version of the ONVIF library. Previous version was written in JS, and this the typescript library with interfaces desbring ONVIF data structures. Right now some of the methods from the v.0.6.x were implemented, the list of supportrted ONVIF commands you can find here: https://github.com/agsh/onvif/blob/v1/IMPLEMENTED.md

    +

    The library will be updated because other methods are currently under development.

    +

    The documentation for the new library was generated by typedoc and you can find it here: https://htmlpreview.github.io/?https://github.com/agsh/onvif/blob/v1/docs/index.html

    +

    The code, which use the old version of the library (0.6.x), should work using the compatibility class: https://github.com/agsh/onvif/blob/v1/src/compatibility/cam.ts where all methods are located.

    +

    Thanks a lot for your interest and I will be glad to any questions and comments!

    +

    P.S. I still need device access to test the code, any help would be greatly appreciated.

    +
    \ No newline at end of file diff --git a/docs/interfaces/ActiveSource.html b/docs/interfaces/ActiveSource.html index 80ef5f21..d74b665e 100644 --- a/docs/interfaces/ActiveSource.html +++ b/docs/interfaces/ActiveSource.html @@ -1,132 +1,11 @@ -ActiveSource | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ActiveSource

    -
    -

    Information about active video source

    -
    -
    -

    Hierarchy

    -
      -
    • ActiveSource
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    bitrate?: number
    -
    - -
    encoding?: string
    -
    - -
    fps?: number
    -
    - -
    height?: number
    -
    - -
    profileToken: string
    -
    - -
    ptz?: { name: string; token: string }
    -
    -

    Type declaration

    -
      -
    • -
      name: string
    • -
    • -
      token: string
    -
    - -
    sourceToken: string
    -
    - -
    videoSourceConfigurationToken: string
    -
    - -
    width?: number
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ActiveSource | onvif

    Interface ActiveSource

    Information about active video source

    +
    interface ActiveSource {
        bitrate?: number;
        encoding?: string;
        fps?: number;
        height?: number;
        profileToken: string;
        ptz?: {
            name: string;
            token: string;
        };
        sourceToken: string;
        videoSourceConfigurationToken: string;
        width?: number;
    }

    Properties

    bitrate?: number
    encoding?: string
    fps?: number
    height?: number
    profileToken: string
    ptz?: {
        name: string;
        token: string;
    }
    sourceToken: string
    videoSourceConfigurationToken: string
    width?: number
    \ No newline at end of file diff --git a/docs/interfaces/AnalyticsCapabilities.html b/docs/interfaces/AnalyticsCapabilities.html index 6b6c37c8..2965e6e8 100644 --- a/docs/interfaces/AnalyticsCapabilities.html +++ b/docs/interfaces/AnalyticsCapabilities.html @@ -1,89 +1,8 @@ -AnalyticsCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface AnalyticsCapabilities

    -
    -

    Analytics capabilities

    -
    -
    -

    Hierarchy

    -
      -
    • AnalyticsCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -

    Analytics service URI

    -
    -
    - -
    analyticsModuleSupport: boolean
    -

    Indicates whether modules are supported

    -
    -
    - -
    ruleSupport: boolean
    -

    Indicates whether rules are supported

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +AnalyticsCapabilities | onvif

    Interface AnalyticsCapabilities

    Analytics capabilities

    +
    interface AnalyticsCapabilities {
        XAddr: string;
        analyticsModuleSupport: boolean;
        ruleSupport: boolean;
    }

    Properties

    XAddr: string

    Analytics service URI

    +
    analyticsModuleSupport: boolean

    Indicates whether modules are supported

    +
    ruleSupport: boolean

    Indicates whether rules are supported

    +
    \ No newline at end of file diff --git a/docs/interfaces/AnalyticsDeviceCapabilities.html b/docs/interfaces/AnalyticsDeviceCapabilities.html index 2a242bdf..81a748ae 100644 --- a/docs/interfaces/AnalyticsDeviceCapabilities.html +++ b/docs/interfaces/AnalyticsDeviceCapabilities.html @@ -1,80 +1,4 @@ -AnalyticsDeviceCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface AnalyticsDeviceCapabilities

    -
    -

    Hierarchy

    -
      -
    • AnalyticsDeviceCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -
    - -
    extension?: any
    -
    - -
    ruleSupport?: boolean
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +AnalyticsDeviceCapabilities | onvif

    Interface AnalyticsDeviceCapabilities

    interface AnalyticsDeviceCapabilities {
        XAddr: string;
        extension?: any;
        ruleSupport?: boolean;
    }

    Properties

    XAddr: string
    extension?: any
    ruleSupport?: boolean
    \ No newline at end of file diff --git a/docs/interfaces/AnalyticsEngineConfiguration.html b/docs/interfaces/AnalyticsEngineConfiguration.html index 62352390..7b30b225 100644 --- a/docs/interfaces/AnalyticsEngineConfiguration.html +++ b/docs/interfaces/AnalyticsEngineConfiguration.html @@ -1,73 +1,3 @@ -AnalyticsEngineConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface AnalyticsEngineConfiguration

    -
    -

    Hierarchy

    -
      -
    • AnalyticsEngineConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    analyticsModule?: Config
    -
    - -
    extension?: any
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +AnalyticsEngineConfiguration | onvif

    Interface AnalyticsEngineConfiguration

    interface AnalyticsEngineConfiguration {
        analyticsModule?: Config;
        extension?: any;
    }

    Properties

    analyticsModule?: Config
    extension?: any
    \ No newline at end of file diff --git a/docs/interfaces/AudioDecoderConfiguration.html b/docs/interfaces/AudioDecoderConfiguration.html index e40badeb..00c0c744 100644 --- a/docs/interfaces/AudioDecoderConfiguration.html +++ b/docs/interfaces/AudioDecoderConfiguration.html @@ -1,87 +1,8 @@ -AudioDecoderConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface AudioDecoderConfiguration

    -
    -

    Hierarchy

    -
      -
    • AudioDecoderConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount: number
    -

    Number of internal references currently using this configuration. +AudioDecoderConfiguration | onvif

    Interface AudioDecoderConfiguration

    interface AudioDecoderConfiguration {
        name: string;
        token: string;
        useCount: number;
    }

    Properties

    Properties

    name: string

    User readable name. Length up to 64 characters

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioEncoder2Configuration.html b/docs/interfaces/AudioEncoder2Configuration.html index ed3a1b13..b495cf63 100644 --- a/docs/interfaces/AudioEncoder2Configuration.html +++ b/docs/interfaces/AudioEncoder2Configuration.html @@ -1,124 +1,17 @@ -AudioEncoder2Configuration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface AudioEncoder2Configuration

    -
    -

    Hierarchy

    -
      -
    • AudioEncoder2Configuration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    bitrate: number
    -

    The output bitrate in kbps

    -
    -
    - -
    encoding: string
    -

    Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and IANA Media Types +AudioEncoder2Configuration | onvif

    Interface AudioEncoder2Configuration

    interface AudioEncoder2Configuration {
        bitrate: number;
        encoding: string;
        multicast?: MulticastConfiguration;
        name: string;
        sampleRate: number;
        token: string;
        useCount: number;
    }

    Properties

    bitrate: number

    The output bitrate in kbps

    +
    encoding: string

    Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and IANA Media Types https://www.iana.org/assignments/media-types/media-types.xhtml#audio

    -
    -
    - - -

    Optional multicast configuration of the audio stream

    -
    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    sampleRate: number
    -

    The output sample rate in kHz

    -
    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount: number
    -

    Number of internal references currently using this configuration. +

    Optional multicast configuration of the audio stream

    +
    name: string

    User readable name. Length up to 64 characters

    +
    sampleRate: number

    The output sample rate in kHz

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioEncoderConfiguration.html b/docs/interfaces/AudioEncoderConfiguration.html index 8fd83137..607a5b51 100644 --- a/docs/interfaces/AudioEncoderConfiguration.html +++ b/docs/interfaces/AudioEncoderConfiguration.html @@ -1,132 +1,18 @@ -AudioEncoderConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface AudioEncoderConfiguration

    -
    -

    Hierarchy

    -
      -
    • AudioEncoderConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    bitrate: number
    -

    The output bitrate in kbps

    -
    -
    - -
    encoding: "G711" | "G726" | "AAC"
    -

    Audio codec used for encoding the audio input (either G.711, G.726 or AAC)

    -
    -
    - - -

    Defines the multicast settings that could be used for video streaming

    -
    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    sampleRate: number
    -

    The output sample rate in kHz

    -
    -
    - -
    sessionTimeout: string
    -

    The rtsp session timeout for the related audio stream

    -
    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount: number
    -

    Number of internal references currently using this configuration. +AudioEncoderConfiguration | onvif

    Interface AudioEncoderConfiguration

    interface AudioEncoderConfiguration {
        bitrate: number;
        encoding: "G711" | "G726" | "AAC";
        multicast: MulticastConfiguration;
        name: string;
        sampleRate: number;
        sessionTimeout: string;
        token: string;
        useCount: number;
    }

    Properties

    bitrate: number

    The output bitrate in kbps

    +
    encoding: "G711" | "G726" | "AAC"

    Audio codec used for encoding the audio input (either G.711, G.726 or AAC)

    +

    Defines the multicast settings that could be used for video streaming

    +
    name: string

    User readable name. Length up to 64 characters

    +
    sampleRate: number

    The output sample rate in kHz

    +
    sessionTimeout: string

    The rtsp session timeout for the related audio stream

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioOutputConfiguration.html b/docs/interfaces/AudioOutputConfiguration.html index 756b01f6..aaeedf1a 100644 --- a/docs/interfaces/AudioOutputConfiguration.html +++ b/docs/interfaces/AudioOutputConfiguration.html @@ -1,65 +1,13 @@ -AudioOutputConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface AudioOutputConfiguration

    -
    -

    Hierarchy

    -
      -
    • AudioOutputConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    outputLevel: number
    -

    Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRang

    -
    -
    - -
    outputToken: string
    -

    Token of the phsycial Audio output

    -
    -
    - -
    sendPrimacy?: string
    -

    An audio channel MAY support different types of audio transmission. +AudioOutputConfiguration | onvif

    Interface AudioOutputConfiguration

    interface AudioOutputConfiguration {
        name: string;
        outputLevel: number;
        outputToken: string;
        sendPrimacy?: string;
        token: string;
        useCount: number;
    }

    Properties

    name: string

    User readable name. Length up to 64 characters

    +
    outputLevel: number

    Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRang

    +
    outputToken: string

    Token of the phsycial Audio output

    +
    sendPrimacy?: string

    An audio channel MAY support different types of audio transmission. While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which direction is currently active. An NVC can switch between different modes by setting the AudioOutputConfiguration. @@ -72,55 +20,7 @@

    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount: number
    -

    Number of internal references currently using this configuration. +

    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioSourceConfiguration.html b/docs/interfaces/AudioSourceConfiguration.html index fef07771..54d315d3 100644 --- a/docs/interfaces/AudioSourceConfiguration.html +++ b/docs/interfaces/AudioSourceConfiguration.html @@ -1,96 +1,10 @@ -AudioSourceConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface AudioSourceConfiguration

    -
    -

    Hierarchy

    -
      -
    • AudioSourceConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    sourceToken: string
    -

    Token of the Audio Source the configuration applies to

    -
    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount: number
    -

    Number of internal references currently using this configuration +AudioSourceConfiguration | onvif

    Interface AudioSourceConfiguration

    interface AudioSourceConfiguration {
        name: string;
        sourceToken: string;
        token: string;
        useCount: number;
    }

    Properties

    name: string

    User readable name. Length up to 64 characters

    +
    sourceToken: string

    Token of the Audio Source the configuration applies to

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration This informational parameter is read-only. Deprecated for Media2 Service

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/BacklightCompensation.html b/docs/interfaces/BacklightCompensation.html index 9f19d754..7673510b 100644 --- a/docs/interfaces/BacklightCompensation.html +++ b/docs/interfaces/BacklightCompensation.html @@ -1,81 +1,9 @@ -BacklightCompensation | onvif
    -
    - -
    -
    -
    -
    - -

    Interface BacklightCompensation

    -
    -

    Hierarchy

    -
      -
    • BacklightCompensation
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    level: number
    -

    Optional level parameter (unit unspecified)

    -
    -
    - -
    mode: "OFF" | "ON"
    -

    Backlight compensation mode (on/off).

    +BacklightCompensation | onvif

    Interface BacklightCompensation

    interface BacklightCompensation {
        level: number;
        mode: "OFF" | "ON";
    }

    Properties

    Properties

    level: number

    Optional level parameter (unit unspecified)

    +
    mode: "OFF" | "ON"

    Backlight compensation mode (on/off).

    • OFF: Backlight compensation is disabled
    • ON: Backlight compensation is enabled
    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/BacklightCompensation20.html b/docs/interfaces/BacklightCompensation20.html index 9cd331a0..06e02d59 100644 --- a/docs/interfaces/BacklightCompensation20.html +++ b/docs/interfaces/BacklightCompensation20.html @@ -1,81 +1,9 @@ -BacklightCompensation20 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface BacklightCompensation20

    -
    -

    Hierarchy

    -
      -
    • BacklightCompensation20
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    level?: number
    -

    Optional level parameter (unit unspecified)

    -
    -
    - -
    mode: "OFF" | "ON"
    -

    Backlight compensation mode (on/off)

    +BacklightCompensation20 | onvif

    Interface BacklightCompensation20

    interface BacklightCompensation20 {
        level?: number;
        mode: "OFF" | "ON";
    }

    Properties

    Properties

    level?: number

    Optional level parameter (unit unspecified)

    +
    mode: "OFF" | "ON"

    Backlight compensation mode (on/off)

    • OFF: Backlight compensation is disabled
    • ON: Backlight compensation is enabled
    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/Capabilities.html b/docs/interfaces/Capabilities.html index 3e83d8ab..db1683af 100644 --- a/docs/interfaces/Capabilities.html +++ b/docs/interfaces/Capabilities.html @@ -1,111 +1,9 @@ -Capabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Capabilities

    -
    -

    Capability list

    -
    -
    -

    Hierarchy

    -
      -
    • Capabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Capabilities | onvif

    Interface Capabilities

    Capability list

    +
    interface Capabilities {
        analytics?: AnalyticsCapabilities;
        device?: DeviceCapabilities;
        events?: EventCapabilities;
        extension?: CapabilitiesExtension;
        imaging?: ImagingCapabilities;
        media?: MediaCapabilities;
        ptz?: PTZCapabilities;
    }

    Properties

    \ No newline at end of file diff --git a/docs/interfaces/CapabilitiesExtension.html b/docs/interfaces/CapabilitiesExtension.html index 5fb69f3c..ae4b0408 100644 --- a/docs/interfaces/CapabilitiesExtension.html +++ b/docs/interfaces/CapabilitiesExtension.html @@ -1,117 +1,10 @@ -CapabilitiesExtension | onvif
    -
    - -
    -
    -
    -
    - -

    Interface CapabilitiesExtension

    -
    -

    Hierarchy

    -
      -
    • CapabilitiesExtension
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -
    - -
    analyticsDevice?: AnalyticsDeviceCapabilities
    -
    - - -

    DeviceIO capabilities

    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +CapabilitiesExtension | onvif

    Interface CapabilitiesExtension

    interface CapabilitiesExtension {
        XAddr: string;
        analyticsDevice?: AnalyticsDeviceCapabilities;
        deviceIO?: DeviceIOCapabilities;
        display?: DisplayCapabilities;
        receiver?: ReceiverCapabilities;
        recording?: RecordingCapabilities;
        replay?: ReplayCapabilities;
        search?: SearchCapabilities;
    }

    Properties

    XAddr: string
    analyticsDevice?: AnalyticsDeviceCapabilities

    DeviceIO capabilities

    +
    \ No newline at end of file diff --git a/docs/interfaces/Config.html b/docs/interfaces/Config.html index 4a8a0d39..4ec7f2f1 100644 --- a/docs/interfaces/Config.html +++ b/docs/interfaces/Config.html @@ -1,87 +1,8 @@ -Config | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Config

    -
    -

    Hierarchy

    -
      -
    • Config
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    name: string
    -

    Name of the configuration

    -
    -
    - -
    parameters: ItemList[]
    -

    List of configuration parameters as defined in the corresponding description

    -
    -
    - -
    type: string
    -

    The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements +Config | onvif

    Interface Config

    interface Config {
        name: string;
        parameters: ItemList[];
        type: string;
    }

    Properties

    Properties

    name: string

    Name of the configuration

    +
    parameters: ItemList[]

    List of configuration parameters as defined in the corresponding description

    +
    type: string

    The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements returned by GetSupportedRules and GetSupportedAnalyticsModules command.

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/ConfigurationSet.html b/docs/interfaces/ConfigurationSet.html index d144d2ef..90d78649 100644 --- a/docs/interfaces/ConfigurationSet.html +++ b/docs/interfaces/ConfigurationSet.html @@ -1,149 +1,21 @@ -ConfigurationSet | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ConfigurationSet

    -
    -

    Hierarchy

    -
      -
    • ConfigurationSet
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - - -

    Optional configuration of the pan tilt zoom unit

    -
    -
    - - -

    Optional configuration of the analytics module and rule engine

    -
    -
    - - -

    Optional configuration of the Audio decoder

    -
    -
    - - -

    Optional configuration of the Audio encoder

    -
    -
    - - -

    Optional configuration of the Audio output

    -
    -
    - - -

    Optional configuration of the Audio input

    -
    -
    - - -

    Optional configuration of the metadata stream

    -
    -
    - -
    receiver?: any
    -

    Optional configuration of the Receiver

    -
    -
    - - -

    Optional configuration of the Video encoder

    -
    -
    - - -

    Optional configuration of the Video input

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ConfigurationSet | onvif

    Interface ConfigurationSet

    Properties

    Optional configuration of the pan tilt zoom unit

    +

    Optional configuration of the analytics module and rule engine

    +

    Optional configuration of the Audio decoder

    +

    Optional configuration of the Audio encoder

    +

    Optional configuration of the Audio output

    +

    Optional configuration of the Audio input

    +

    Optional configuration of the metadata stream

    +
    receiver?: any

    Optional configuration of the Receiver

    +

    Optional configuration of the Video encoder

    +

    Optional configuration of the Video input

    +
    \ No newline at end of file diff --git a/docs/interfaces/Defogging.html b/docs/interfaces/Defogging.html index d46b39cf..17cc9bdf 100644 --- a/docs/interfaces/Defogging.html +++ b/docs/interfaces/Defogging.html @@ -1,84 +1,6 @@ -Defogging | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Defogging

    -
    -

    Hierarchy

    -
      -
    • Defogging
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    extension?: any
    -
    - -
    level?: number
    -

    Optional level parameter specified with unitless normalized value from 0.0 to +1.0

    -
    -
    - -
    mode: string
    -

    Parameter to enable/disable or automatic Defogging feature. Its options shall be chosen from tt:DefoggingMode Type

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Defogging | onvif

    Interface Defogging

    interface Defogging {
        extension?: any;
        level?: number;
        mode: string;
    }

    Properties

    Properties

    extension?: any
    level?: number

    Optional level parameter specified with unitless normalized value from 0.0 to +1.0

    +
    mode: string

    Parameter to enable/disable or automatic Defogging feature. Its options shall be chosen from tt:DefoggingMode Type

    +
    \ No newline at end of file diff --git a/docs/interfaces/DeviceCapabilities.html b/docs/interfaces/DeviceCapabilities.html index 2dd7b11e..1db8b666 100644 --- a/docs/interfaces/DeviceCapabilities.html +++ b/docs/interfaces/DeviceCapabilities.html @@ -1,106 +1,9 @@ -DeviceCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface DeviceCapabilities

    -
    -

    Device capabilities

    -
    -
    -

    Hierarchy

    -
      -
    • DeviceCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    -
    - -
    XAddr: string
    -

    Device service URI

    -
    -
    - -
    extensions?: any
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +DeviceCapabilities | onvif

    Interface DeviceCapabilities

    Device capabilities

    +
    interface DeviceCapabilities {
        IO?: IOCapabilities;
        XAddr: string;
        extensions?: any;
        network?: NetworkCapabilities;
        security?: SecurityCapabilities;
        system?: SystemCapabilities;
    }

    Properties

    XAddr: string

    Device service URI

    +
    extensions?: any
    \ No newline at end of file diff --git a/docs/interfaces/DeviceIOCapabilities.html b/docs/interfaces/DeviceIOCapabilities.html index ff17ab95..68f56b33 100644 --- a/docs/interfaces/DeviceIOCapabilities.html +++ b/docs/interfaces/DeviceIOCapabilities.html @@ -1,117 +1,9 @@ -DeviceIOCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface DeviceIOCapabilities

    -
    -

    Hierarchy

    -
      -
    • DeviceIOCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -

    DeviceIO service URI

    -
    -
    - -
    audioOutputs: number
    -
    - -
    audioSources: number
    -
    - -
    extensions: { scdlCapabilities: any; telexCapabilities: any }
    -
    -

    Type declaration

    -
      -
    • -
      scdlCapabilities: any
    • -
    • -
      telexCapabilities: any
    -
    - -
    relayOutputs: number
    -
    - -
    videoOutputs: number
    -
    - -
    videoSources: number
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +DeviceIOCapabilities | onvif

    Interface DeviceIOCapabilities

    interface DeviceIOCapabilities {
        XAddr: string;
        audioOutputs: number;
        audioSources: number;
        extensions: {
            scdlCapabilities: any;
            telexCapabilities: any;
        };
        relayOutputs: number;
        videoOutputs: number;
        videoSources: number;
    }

    Properties

    XAddr: string

    DeviceIO service URI

    +
    audioOutputs: number
    audioSources: number
    extensions: {
        scdlCapabilities: any;
        telexCapabilities: any;
    }
    relayOutputs: number
    videoOutputs: number
    videoSources: number
    \ No newline at end of file diff --git a/docs/interfaces/DeviceInformation.html b/docs/interfaces/DeviceInformation.html index 62bcd7b5..45228a2d 100644 --- a/docs/interfaces/DeviceInformation.html +++ b/docs/interfaces/DeviceInformation.html @@ -1,104 +1,11 @@ -DeviceInformation | onvif
    -
    - -
    -
    -
    -
    - -

    Interface DeviceInformation

    -
    -

    Hierarchy

    -
      -
    • DeviceInformation
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    firmwareVersion: string
    -

    The firmware version in the device

    -
    -
    - -
    hardwareId: string
    -

    The hardware ID of the device

    -
    -
    - -
    manufacturer: string
    -

    The manufactor of the device

    -
    -
    - -
    model: string
    -

    The device model

    -
    -
    - -
    serialNumber: string
    -

    The serial number of the device

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +DeviceInformation | onvif

    Interface DeviceInformation

    interface DeviceInformation {
        firmwareVersion: string;
        hardwareId: string;
        manufacturer: string;
        model: string;
        serialNumber: string;
    }

    Properties

    firmwareVersion: string

    The firmware version in the device

    +
    hardwareId: string

    The hardware ID of the device

    +
    manufacturer: string

    The manufactor of the device

    +
    model: string

    The device model

    +
    serialNumber: string

    The serial number of the device

    +
    \ No newline at end of file diff --git a/docs/interfaces/DiscoveryOptions.html b/docs/interfaces/DiscoveryOptions.html index 60c8768f..ce07150c 100644 --- a/docs/interfaces/DiscoveryOptions.html +++ b/docs/interfaces/DiscoveryOptions.html @@ -1,113 +1,13 @@ -DiscoveryOptions | onvif
    -
    - -
    -
    -
    -
    - -

    Interface DiscoveryOptions

    -
    -

    Hierarchy

    -
      -
    • DiscoveryOptions
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    device?: string
    -

    Interface to bind on for discovery ex. eth0

    -
    -
    - -
    listeningPort?: number
    -

    Client will listen to discovery data device sent

    -
    -
    - -
    messageId?: string
    -

    WS-Discovery message id

    -
    -
    - -
    resolve?: boolean
    -

    Set to false if you want to omit creating of Cam objects. Default true

    -
    -
    - -
    timeout?: number
    -

    Timeout in milliseconds for discovery responses, Default 5000

    -
    -
    - -
    type?: "udp4" | "udp6"
    -

    Socket type

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +DiscoveryOptions | onvif

    Interface DiscoveryOptions

    interface DiscoveryOptions {
        device?: string;
        listeningPort?: number;
        messageId?: string;
        resolve?: boolean;
        timeout?: number;
        type?: "udp4" | "udp6";
    }

    Properties

    device?: string

    Interface to bind on for discovery ex. eth0

    +
    listeningPort?: number

    Client will listen to discovery data device sent

    +
    messageId?: string

    WS-Discovery message id

    +
    resolve?: boolean

    Set to false if you want to omit creating of Cam objects. Default true

    +
    timeout?: number

    Timeout in milliseconds for discovery responses, Default 5000

    +
    type?: "udp4" | "udp6"

    Socket type

    +
    \ No newline at end of file diff --git a/docs/interfaces/DisplayCapabilities.html b/docs/interfaces/DisplayCapabilities.html index f75537ce..28e44f71 100644 --- a/docs/interfaces/DisplayCapabilities.html +++ b/docs/interfaces/DisplayCapabilities.html @@ -1,75 +1,4 @@ -DisplayCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface DisplayCapabilities

    -
    -

    Hierarchy

    -
      -
    • DisplayCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -
    - -
    fixedLayout: boolean
    -

    Indication that the SetLayout command supports only predefined layouts

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +DisplayCapabilities | onvif

    Interface DisplayCapabilities

    interface DisplayCapabilities {
        XAddr: string;
        fixedLayout: boolean;
    }

    Properties

    Properties

    XAddr: string
    fixedLayout: boolean

    Indication that the SetLayout command supports only predefined layouts

    +
    \ No newline at end of file diff --git a/docs/interfaces/EventCapabilities.html b/docs/interfaces/EventCapabilities.html index ed739b2e..f6d02931 100644 --- a/docs/interfaces/EventCapabilities.html +++ b/docs/interfaces/EventCapabilities.html @@ -1,98 +1,10 @@ -EventCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface EventCapabilities

    -
    -

    Event capabilities

    -
    -
    -

    Hierarchy

    -
      -
    • EventCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    WSPausableSubscriptionManagerInterfaceSupport: boolean
    -

    Indicates whether or not WS Pausable Subscription Manager Interface is supported

    -
    -
    - -
    WSPullPointSupport: boolean
    -

    Indicates whether or not WS Pull Point is supported

    -
    -
    - -
    WSSubscriptionPolicySupport: boolean
    -

    Indicates whether or not WS Subscription policy is supported

    -
    -
    - -
    XAddr: string
    -

    Event service URI

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +EventCapabilities | onvif

    Interface EventCapabilities

    Event capabilities

    +
    interface EventCapabilities {
        WSPausableSubscriptionManagerInterfaceSupport: boolean;
        WSPullPointSupport: boolean;
        WSSubscriptionPolicySupport: boolean;
        XAddr: string;
    }

    Properties

    WSPausableSubscriptionManagerInterfaceSupport: boolean

    Indicates whether or not WS Pausable Subscription Manager Interface is supported

    +
    WSPullPointSupport: boolean

    Indicates whether or not WS Pull Point is supported

    +
    WSSubscriptionPolicySupport: boolean

    Indicates whether or not WS Subscription policy is supported

    +
    XAddr: string

    Event service URI

    +
    \ No newline at end of file diff --git a/docs/interfaces/EventSubscription.html b/docs/interfaces/EventSubscription.html index 17ba3c9a..fee8bf59 100644 --- a/docs/interfaces/EventSubscription.html +++ b/docs/interfaces/EventSubscription.html @@ -1,73 +1,3 @@ -EventSubscription | onvif
    -
    - -
    -
    -
    -
    - -

    Interface EventSubscription

    -
    -

    Hierarchy

    -
      -
    • EventSubscription
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    filter?: string
    -
    - -
    subscriptionPolicy?: any
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +EventSubscription | onvif

    Interface EventSubscription

    interface EventSubscription {
        filter?: string;
        subscriptionPolicy?: any;
    }

    Properties

    filter?: string
    subscriptionPolicy?: any
    \ No newline at end of file diff --git a/docs/interfaces/Exposure.html b/docs/interfaces/Exposure.html index 9bc7b9e3..e1207dab 100644 --- a/docs/interfaces/Exposure.html +++ b/docs/interfaces/Exposure.html @@ -1,171 +1,29 @@ -Exposure | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Exposure

    -
    -

    Hierarchy

    -
      -
    • Exposure
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    exposureTime: number
    -

    The fixed exposure time used by the image sensor (μs)

    -
    -
    - -
    gain: number
    -

    The fixed gain used by the image sensor (dB)

    -
    -
    - -
    iris: number
    -

    The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris

    -
    -
    - -
    maxExposureTime: number
    -

    Maximum value of exposure time range allowed to be used by the algorithm

    -
    -
    - -
    maxGain: number
    -

    Maximum value of the sensor gain range that is allowed to be used by the algorithm

    -
    -
    - -
    maxIris: number
    -

    Maximum value of the iris range allowed to be used by the algorithm

    -
    -
    - -
    minExposureTime: number
    -

    Minimum value of exposure time range allowed to be used by the algorithm

    -
    -
    - -
    minGain: number
    -

    Minimum value of the sensor gain range that is allowed to be used by the algorithm

    -
    -
    - -
    minIris: number
    -

    Minimum value of the iris range allowed to be used by the algorithm

    -
    -
    - -
    mode: "AUTO" | "MANUAL"
    -

    Exposure Mode

    +Exposure | onvif

    Interface Exposure

    interface Exposure {
        exposureTime: number;
        gain: number;
        iris: number;
        maxExposureTime: number;
        maxGain: number;
        maxIris: number;
        minExposureTime: number;
        minGain: number;
        minIris: number;
        mode: "AUTO" | "MANUAL";
        priority: "LowNoise" | "FrameRate";
        window: Rectangle;
    }

    Properties

    exposureTime: number

    The fixed exposure time used by the image sensor (μs)

    +
    gain: number

    The fixed gain used by the image sensor (dB)

    +
    iris: number

    The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris

    +
    maxExposureTime: number

    Maximum value of exposure time range allowed to be used by the algorithm

    +
    maxGain: number

    Maximum value of the sensor gain range that is allowed to be used by the algorithm

    +
    maxIris: number

    Maximum value of the iris range allowed to be used by the algorithm

    +
    minExposureTime: number

    Minimum value of exposure time range allowed to be used by the algorithm

    +
    minGain: number

    Minimum value of the sensor gain range that is allowed to be used by the algorithm

    +
    minIris: number

    Minimum value of the iris range allowed to be used by the algorithm

    +
    mode: "AUTO" | "MANUAL"

    Exposure Mode

    • Auto – Enabled the exposure algorithm on the NVT
    • Manual – Disabled exposure algorithm on the NVT
    -
    -
    - -
    priority: "LowNoise" | "FrameRate"
    -

    The exposure priority mode (low noise/framerate)

    -
    -
    - -
    window: Rectangle
    -

    Rectangular exposure mask

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    priority: "LowNoise" | "FrameRate"

    The exposure priority mode (low noise/framerate)

    +
    window: Rectangle

    Rectangular exposure mask

    +
    \ No newline at end of file diff --git a/docs/interfaces/Exposure20.html b/docs/interfaces/Exposure20.html index 50146705..4435ea8c 100644 --- a/docs/interfaces/Exposure20.html +++ b/docs/interfaces/Exposure20.html @@ -1,171 +1,29 @@ -Exposure20 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Exposure20

    -
    -

    Hierarchy

    -
      -
    • Exposure20
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    exposureTime?: number
    -

    The fixed exposure time used by the image sensor (μs)

    -
    -
    - -
    gain?: number
    -

    The fixed gain used by the image sensor (dB)

    -
    -
    - -
    iris?: number
    -

    The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris and positive values map to higher attenuation

    -
    -
    - -
    maxExposureTime?: number
    -

    Maximum value of exposure time range allowed to be used by the algorithm

    -
    -
    - -
    maxGain?: number
    -

    Maximum value of the sensor gain range that is allowed to be used by the algorithm

    -
    -
    - -
    maxIris?: number
    -

    Maximum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation

    -
    -
    - -
    minExposureTime?: number
    -

    Minimum value of exposure time range allowed to be used by the algorithm

    -
    -
    - -
    minGain?: number
    -

    Minimum value of the sensor gain range that is allowed to be used by the algorithm

    -
    -
    - -
    minIris?: number
    -

    Minimum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation

    -
    -
    - -
    mode: "AUTO" | "MANUAL"
    -

    Exposure Mode

    +Exposure20 | onvif

    Interface Exposure20

    interface Exposure20 {
        exposureTime?: number;
        gain?: number;
        iris?: number;
        maxExposureTime?: number;
        maxGain?: number;
        maxIris?: number;
        minExposureTime?: number;
        minGain?: number;
        minIris?: number;
        mode: "AUTO" | "MANUAL";
        priority?: "LowNoise" | "FrameRate";
        window?: Rectangle;
    }

    Properties

    exposureTime?: number

    The fixed exposure time used by the image sensor (μs)

    +
    gain?: number

    The fixed gain used by the image sensor (dB)

    +
    iris?: number

    The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris and positive values map to higher attenuation

    +
    maxExposureTime?: number

    Maximum value of exposure time range allowed to be used by the algorithm

    +
    maxGain?: number

    Maximum value of the sensor gain range that is allowed to be used by the algorithm

    +
    maxIris?: number

    Maximum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation

    +
    minExposureTime?: number

    Minimum value of exposure time range allowed to be used by the algorithm

    +
    minGain?: number

    Minimum value of the sensor gain range that is allowed to be used by the algorithm

    +
    minIris?: number

    Minimum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation

    +
    mode: "AUTO" | "MANUAL"

    Exposure Mode

    • Auto – Enabled the exposure algorithm on the device
    • Manual – Disabled exposure algorithm on the device
    -
    -
    - -
    priority?: "LowNoise" | "FrameRate"
    -

    The exposure priority mode (low noise/framerate)

    -
    -
    - -
    window?: Rectangle
    -

    Rectangular exposure mask

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    priority?: "LowNoise" | "FrameRate"

    The exposure priority mode (low noise/framerate)

    +
    window?: Rectangle

    Rectangular exposure mask

    +
    \ No newline at end of file diff --git a/docs/interfaces/FocusConfiguration.html b/docs/interfaces/FocusConfiguration.html index 3ce6c655..b0bc500c 100644 --- a/docs/interfaces/FocusConfiguration.html +++ b/docs/interfaces/FocusConfiguration.html @@ -1,91 +1,7 @@ -FocusConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface FocusConfiguration

    -
    -

    Hierarchy

    -
      -
    • FocusConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    autoFocusMode: "AUTO" | "MANUAL"
    -
    - -
    defaultSpeed: number
    -
    - -
    farLimit: number
    -

    Parameter to set autofocus far limit (unit: meter). If set to 0.0, infinity will be used

    -
    -
    - -
    nearLimit: number
    -

    Parameter to set autofocus near limit (unit: meter)

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +FocusConfiguration | onvif

    Interface FocusConfiguration

    interface FocusConfiguration {
        autoFocusMode: "AUTO" | "MANUAL";
        defaultSpeed: number;
        farLimit: number;
        nearLimit: number;
    }

    Properties

    autoFocusMode: "AUTO" | "MANUAL"
    defaultSpeed: number
    farLimit: number

    Parameter to set autofocus far limit (unit: meter). If set to 0.0, infinity will be used

    +
    nearLimit: number

    Parameter to set autofocus near limit (unit: meter)

    +
    \ No newline at end of file diff --git a/docs/interfaces/FocusConfiguration20.html b/docs/interfaces/FocusConfiguration20.html index 40b01bb0..16443488 100644 --- a/docs/interfaces/FocusConfiguration20.html +++ b/docs/interfaces/FocusConfiguration20.html @@ -1,115 +1,17 @@ -FocusConfiguration20 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface FocusConfiguration20

    -
    -

    Hierarchy

    -
      -
    • FocusConfiguration20
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    AFMode: string[]
    -

    Zero or more modes as defined in enumeration tt:AFModes

    -
    -
    - -
    autoFocusMode: "AUTO" | "MANUAL"
    -

    Mode of auto focus

    +FocusConfiguration20 | onvif

    Interface FocusConfiguration20

    interface FocusConfiguration20 {
        AFMode: string[];
        autoFocusMode: "AUTO" | "MANUAL";
        defaultSpeed?: number;
        extension?: any;
        farLimit?: number;
        nearLimit?: number;
    }

    Properties

    AFMode: string[]

    Zero or more modes as defined in enumeration tt:AFModes

    +
    autoFocusMode: "AUTO" | "MANUAL"

    Mode of auto focus

    • AUTO - The device automatically adjusts focus
    • MANUAL - The device does not automatically adjust focus Note: for devices supporting both manual and auto operation at the same time manual operation may be supported even if the Mode parameter is set to Auto.
    -
    -
    - -
    defaultSpeed?: number
    -
    - -
    extension?: any
    -
    - -
    farLimit?: number
    -

    Parameter to set autofocus far limit (unit: meter)

    -
    -
    - -
    nearLimit?: number
    -

    Parameter to set autofocus near limit (unit: meter)

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    defaultSpeed?: number
    extension?: any
    farLimit?: number

    Parameter to set autofocus far limit (unit: meter)

    +
    nearLimit?: number

    Parameter to set autofocus near limit (unit: meter)

    +
    \ No newline at end of file diff --git a/docs/interfaces/H264Configuration.html b/docs/interfaces/H264Configuration.html index 37f00859..b768d810 100644 --- a/docs/interfaces/H264Configuration.html +++ b/docs/interfaces/H264Configuration.html @@ -1,80 +1,8 @@ -H264Configuration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface H264Configuration

    -
    -

    Hierarchy

    -
      -
    • H264Configuration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    H264Profile: "Baseline" | "Main" | "Extended" | "High"
    -

    The H.264 profile, either baseline, main, extended or high

    -
    -
    - -
    govLength: number
    -

    Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. +H264Configuration | onvif

    Interface H264Configuration

    interface H264Configuration {
        H264Profile:
            | "Baseline"
            | "Main"
            | "Extended"
            | "High";
        govLength: number;
    }

    Properties

    Properties

    H264Profile:
        | "Baseline"
        | "Main"
        | "Extended"
        | "High"

    The H.264 profile, either baseline, main, extended or high

    +
    govLength: number

    Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/IOCapabilities.html b/docs/interfaces/IOCapabilities.html index e3ae2b9d..9fa809b4 100644 --- a/docs/interfaces/IOCapabilities.html +++ b/docs/interfaces/IOCapabilities.html @@ -1,84 +1,6 @@ -IOCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface IOCapabilities

    -
    -

    Hierarchy

    -
      -
    • IOCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    -
    - -
    inputConnectors?: number
    -

    Number of input connectors

    -
    -
    - -
    relayOutputs?: number
    -

    Number of relay outputs

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +IOCapabilities | onvif

    Interface IOCapabilities

    interface IOCapabilities {
        extension?: IOCapabilitiesExtension;
        inputConnectors?: number;
        relayOutputs?: number;
    }

    Properties

    inputConnectors?: number

    Number of input connectors

    +
    relayOutputs?: number

    Number of relay outputs

    +
    \ No newline at end of file diff --git a/docs/interfaces/IOCapabilitiesExtension.html b/docs/interfaces/IOCapabilitiesExtension.html index d8f76a01..ae5266f6 100644 --- a/docs/interfaces/IOCapabilitiesExtension.html +++ b/docs/interfaces/IOCapabilitiesExtension.html @@ -1,80 +1,4 @@ -IOCapabilitiesExtension | onvif
    -
    - -
    -
    -
    -
    - -

    Interface IOCapabilitiesExtension

    -
    -

    Hierarchy

    -
      -
    • IOCapabilitiesExtension
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    auxiliary?: boolean
    -
    - -
    auxiliaryCommands?: Record<string, unknown>
    -
    - -
    extension?: any
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +IOCapabilitiesExtension | onvif

    Interface IOCapabilitiesExtension

    interface IOCapabilitiesExtension {
        auxiliary?: boolean;
        auxiliaryCommands?: Record<string, unknown>;
        extension?: any;
    }

    Properties

    auxiliary?: boolean
    auxiliaryCommands?: Record<string, unknown>
    extension?: any
    \ No newline at end of file diff --git a/docs/interfaces/IPAddress.html b/docs/interfaces/IPAddress.html deleted file mode 100644 index 2921ca66..00000000 --- a/docs/interfaces/IPAddress.html +++ /dev/null @@ -1,86 +0,0 @@ -IPAddress | onvif
    -
    - -
    -
    -
    -
    - -

    Interface IPAddress

    -
    -

    Hierarchy

    -
      -
    • IPAddress
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    IPv4Address?: string
    -

    IPv4 address

    -
    -
    - -
    IPv6Address?: string
    -

    IPv6 address

    -
    -
    - -
    type: "IPv4" | "IPv6"
    -

    Indicates if the address is an IPv4 or IPv6 address

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file diff --git a/docs/interfaces/ImageStabilization.html b/docs/interfaces/ImageStabilization.html index 7893ef09..a642faf0 100644 --- a/docs/interfaces/ImageStabilization.html +++ b/docs/interfaces/ImageStabilization.html @@ -1,84 +1,6 @@ -ImageStabilization | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ImageStabilization

    -
    -

    Hierarchy

    -
      -
    • ImageStabilization
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    extension?: any
    -
    - -
    level?: number
    -

    Optional level parameter (unit unspecified)

    -
    -
    - -
    mode: "OFF" | "ON" | "AUTO" | "Extended"
    -

    Parameter to enable/disable Image Stabilization feature

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ImageStabilization | onvif

    Interface ImageStabilization

    interface ImageStabilization {
        extension?: any;
        level?: number;
        mode:
            | "OFF"
            | "ON"
            | "AUTO"
            | "Extended";
    }

    Properties

    Properties

    extension?: any
    level?: number

    Optional level parameter (unit unspecified)

    +
    mode:
        | "OFF"
        | "ON"
        | "AUTO"
        | "Extended"

    Parameter to enable/disable Image Stabilization feature

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingCapabilities.html b/docs/interfaces/ImagingCapabilities.html index f21961f2..6c65c705 100644 --- a/docs/interfaces/ImagingCapabilities.html +++ b/docs/interfaces/ImagingCapabilities.html @@ -1,68 +1,3 @@ -ImagingCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ImagingCapabilities

    -
    -

    Hierarchy

    -
      -
    • ImagingCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -

    Imaging service URI

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ImagingCapabilities | onvif

    Interface ImagingCapabilities

    interface ImagingCapabilities {
        XAddr: string;
    }

    Properties

    Properties

    XAddr: string

    Imaging service URI

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingSettings.html b/docs/interfaces/ImagingSettings.html index 9a5b844f..a574cc05 100644 --- a/docs/interfaces/ImagingSettings.html +++ b/docs/interfaces/ImagingSettings.html @@ -1,156 +1,22 @@ -ImagingSettings | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ImagingSettings

    -
    -

    Hierarchy

    -
      -
    • ImagingSettings
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    backlightCompensation?: BacklightCompensation
    -

    Enabled/disabled BLC mode (on/off)

    -
    -
    - -
    brightness?: number
    -

    Image brightness (unit unspecified)

    -
    -
    - -
    colorSaturation?: number
    -

    Color saturation of the image (unit unspecified)

    -
    -
    - -
    contrast?: number
    -

    Contrast of the image (unit unspecified)

    -
    -
    - -
    exposure?: Exposure
    -

    Exposure mode of the device

    -
    -
    - -
    extension?: any
    -
    - - -

    Focus configuration

    -
    -
    - -
    irCutFilter?: "OFF" | "ON" | "AUTO"
    -

    Infrared Cutoff Filter settings

    -
    -
    - -
    sharpness?: number
    -

    Sharpness of the Video image

    -
    -
    - -
    whiteBalance?: WhiteBalance
    -

    White balance settings

    -
    -
    - -
    wideDynamicRange?: WideDynamicRange
    -

    WDR settings

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ImagingSettings | onvif

    Interface ImagingSettings

    interface ImagingSettings {
        backlightCompensation?: BacklightCompensation;
        brightness?: number;
        colorSaturation?: number;
        contrast?: number;
        exposure?: Exposure;
        extension?: any;
        focus?: FocusConfiguration;
        irCutFilter?: "OFF" | "ON" | "AUTO";
        sharpness?: number;
        whiteBalance?: WhiteBalance;
        wideDynamicRange?: WideDynamicRange;
    }

    Properties

    backlightCompensation?: BacklightCompensation

    Enabled/disabled BLC mode (on/off)

    +
    brightness?: number

    Image brightness (unit unspecified)

    +
    colorSaturation?: number

    Color saturation of the image (unit unspecified)

    +
    contrast?: number

    Contrast of the image (unit unspecified)

    +
    exposure?: Exposure

    Exposure mode of the device

    +
    extension?: any

    Focus configuration

    +
    irCutFilter?: "OFF" | "ON" | "AUTO"

    Infrared Cutoff Filter settings

    +
    sharpness?: number

    Sharpness of the Video image

    +
    whiteBalance?: WhiteBalance

    White balance settings

    +
    wideDynamicRange?: WideDynamicRange

    WDR settings

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingSettings20.html b/docs/interfaces/ImagingSettings20.html index a84ce59b..23e31edc 100644 --- a/docs/interfaces/ImagingSettings20.html +++ b/docs/interfaces/ImagingSettings20.html @@ -1,156 +1,22 @@ -ImagingSettings20 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ImagingSettings20

    -
    -

    Hierarchy

    -
      -
    • ImagingSettings20
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    backlightCompensation?: BacklightCompensation20
    -

    Enabled/disabled BLC mode (on/off)

    -
    -
    - -
    brightness?: number
    -

    Image brightness (unit unspecified)

    -
    -
    - -
    colorSaturation?: number
    -

    Color saturation of the image (unit unspecified)

    -
    -
    - -
    contrast?: number
    -

    Contrast of the image (unit unspecified)

    -
    -
    - -
    exposure?: Exposure20
    -

    Exposure mode of the device

    -
    -
    - -
    -
    - - -

    Focus configuration

    -
    -
    - -
    irCutFilter?: "OFF" | "ON" | "AUTO"
    -

    Infrared Cutoff Filter settings

    -
    -
    - -
    sharpness?: number
    -

    Sharpness of the Video image

    -
    -
    - -
    whiteBalance?: WhiteBalance20
    -

    White balance settings

    -
    -
    - -
    wideDynamicRange?: WideDynamicRange20
    -

    WDR settings

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ImagingSettings20 | onvif

    Interface ImagingSettings20

    interface ImagingSettings20 {
        backlightCompensation?: BacklightCompensation20;
        brightness?: number;
        colorSaturation?: number;
        contrast?: number;
        exposure?: Exposure20;
        extension?: ImagingSettingsExtension20;
        focus?: FocusConfiguration20;
        irCutFilter?: "OFF" | "ON" | "AUTO";
        sharpness?: number;
        whiteBalance?: WhiteBalance20;
        wideDynamicRange?: WideDynamicRange20;
    }

    Properties

    backlightCompensation?: BacklightCompensation20

    Enabled/disabled BLC mode (on/off)

    +
    brightness?: number

    Image brightness (unit unspecified)

    +
    colorSaturation?: number

    Color saturation of the image (unit unspecified)

    +
    contrast?: number

    Contrast of the image (unit unspecified)

    +
    exposure?: Exposure20

    Exposure mode of the device

    +

    Focus configuration

    +
    irCutFilter?: "OFF" | "ON" | "AUTO"

    Infrared Cutoff Filter settings

    +
    sharpness?: number

    Sharpness of the Video image

    +
    whiteBalance?: WhiteBalance20

    White balance settings

    +
    wideDynamicRange?: WideDynamicRange20

    WDR settings

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingSettingsExtension20.html b/docs/interfaces/ImagingSettingsExtension20.html index 18092f48..ff41776f 100644 --- a/docs/interfaces/ImagingSettingsExtension20.html +++ b/docs/interfaces/ImagingSettingsExtension20.html @@ -1,75 +1,4 @@ -ImagingSettingsExtension20 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ImagingSettingsExtension20

    -
    -

    Hierarchy

    -
      -
    • ImagingSettingsExtension20
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    -
    - -
    imageStabilization?: ImageStabilization
    -

    Optional element to configure Image Stabilization feature

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ImagingSettingsExtension20 | onvif

    Interface ImagingSettingsExtension20

    interface ImagingSettingsExtension20 {
        extension?: ImagingSettingsExtension202;
        imageStabilization?: ImageStabilization;
    }

    Properties

    imageStabilization?: ImageStabilization

    Optional element to configure Image Stabilization feature

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingSettingsExtension202.html b/docs/interfaces/ImagingSettingsExtension202.html index e41bba52..9a75aac1 100644 --- a/docs/interfaces/ImagingSettingsExtension202.html +++ b/docs/interfaces/ImagingSettingsExtension202.html @@ -1,75 +1,4 @@ -ImagingSettingsExtension202 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ImagingSettingsExtension202

    -
    -

    Hierarchy

    -
      -
    • ImagingSettingsExtension202
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    -
    - -
    irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment
    -

    An optional parameter applied to only auto mode to adjust timing of toggling Ir cut filter

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ImagingSettingsExtension202 | onvif

    Interface ImagingSettingsExtension202

    interface ImagingSettingsExtension202 {
        extension?: ImagingSettingsExtension203;
        irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment;
    }

    Properties

    irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment

    An optional parameter applied to only auto mode to adjust timing of toggling Ir cut filter

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingSettingsExtension203.html b/docs/interfaces/ImagingSettingsExtension203.html index 37bc6cb1..d7573688 100644 --- a/docs/interfaces/ImagingSettingsExtension203.html +++ b/docs/interfaces/ImagingSettingsExtension203.html @@ -1,93 +1,8 @@ -ImagingSettingsExtension203 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ImagingSettingsExtension203

    -
    -

    Hierarchy

    -
      -
    • ImagingSettingsExtension203
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    defogging?: Defogging
    -

    Optional element to configure Image Defogging

    -
    -
    - -
    extension?: any
    -
    - -
    noiseReduction?: NoiseReduction
    -

    Optional element to configure Image Noise Reduction

    -
    -
    - -
    toneCompensation?: ToneCompensation
    -

    Optional element to configure Image Contrast Compensation

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ImagingSettingsExtension203 | onvif

    Interface ImagingSettingsExtension203

    interface ImagingSettingsExtension203 {
        defogging?: Defogging;
        extension?: any;
        noiseReduction?: NoiseReduction;
        toneCompensation?: ToneCompensation;
    }

    Properties

    defogging?: Defogging

    Optional element to configure Image Defogging

    +
    extension?: any
    noiseReduction?: NoiseReduction

    Optional element to configure Image Noise Reduction

    +
    toneCompensation?: ToneCompensation

    Optional element to configure Image Contrast Compensation

    +
    \ No newline at end of file diff --git a/docs/interfaces/IntRectangle.html b/docs/interfaces/IntRectangle.html index 7c22d9d2..be796d7e 100644 --- a/docs/interfaces/IntRectangle.html +++ b/docs/interfaces/IntRectangle.html @@ -1,87 +1,5 @@ -IntRectangle | onvif
    -
    - -
    -
    -
    -
    - -

    Interface IntRectangle

    -
    -

    Hierarchy

    -
      -
    • IntRectangle
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    height: number
    -
    - -
    width: number
    -
    - -
    x: number
    -
    - -
    y: number
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +IntRectangle | onvif

    Interface IntRectangle

    interface IntRectangle {
        height: number;
        width: number;
        x: number;
        y: number;
    }

    Properties

    Properties

    height: number
    width: number
    x: number
    y: number
    \ No newline at end of file diff --git a/docs/interfaces/IrCutFilterAutoAdjustment.html b/docs/interfaces/IrCutFilterAutoAdjustment.html index 9480e38c..0350bbc2 100644 --- a/docs/interfaces/IrCutFilterAutoAdjustment.html +++ b/docs/interfaces/IrCutFilterAutoAdjustment.html @@ -1,95 +1,10 @@ -IrCutFilterAutoAdjustment | onvif
    -
    - -
    -
    -
    -
    - -

    Interface IrCutFilterAutoAdjustment

    -
    -

    Hierarchy

    -
      -
    • IrCutFilterAutoAdjustment
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    boundaryOffset?: number
    -

    Adjusts boundary exposure level for toggling Ir cut filter to on/off specified with unitless normalized value +IrCutFilterAutoAdjustment | onvif

    Interface IrCutFilterAutoAdjustment

    interface IrCutFilterAutoAdjustment {
        boundaryOffset?: number;
        boundaryType: string;
        extension?: any;
        responseTime?: string;
    }

    Properties

    boundaryOffset?: number

    Adjusts boundary exposure level for toggling Ir cut filter to on/off specified with unitless normalized value from +1.0 to -1.0. Zero is default and -1.0 is the darkest adjustment (Unitless).

    -
    -
    - -
    boundaryType: string
    -

    Specifies which boundaries to automatically toggle Ir cut filter following parameters are applied to. +

    boundaryType: string

    Specifies which boundaries to automatically toggle Ir cut filter following parameters are applied to. Its options shall be chosen from tt:IrCutFilterAutoBoundaryType

    -
    -
    - -
    extension?: any
    -
    - -
    responseTime?: string
    -

    Delay time of toggling Ir cut filter to on/off after crossing of the boundary exposure levels

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    extension?: any
    responseTime?: string

    Delay time of toggling Ir cut filter to on/off after crossing of the boundary exposure levels

    +
    \ No newline at end of file diff --git a/docs/interfaces/ItemList.html b/docs/interfaces/ItemList.html index e19f2d0c..8f261b58 100644 --- a/docs/interfaces/ItemList.html +++ b/docs/interfaces/ItemList.html @@ -1,95 +1,8 @@ -ItemList | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ItemList

    -
    -

    Hierarchy

    -
      -
    • ItemList
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    elementItem?: any
    -

    Complex value structure

    -
    -
    - -
    extension: any
    -
    - -
    simpleItem?: { name: string; value: any }
    -

    Value name pair as defined by the corresponding description

    -
    -
    -

    Type declaration

    -
      -
    • -
      name: string
      -

      Item name

      -
    • -
    • -
      value: any
      -

      Item value. The type is defined in the corresponding description

      -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ItemList | onvif

    Interface ItemList

    interface ItemList {
        elementItem?: any;
        extension: any;
        simpleItem?: {
            name: string;
            value: any;
        };
    }

    Properties

    elementItem?: any

    Complex value structure

    +
    extension: any
    simpleItem?: {
        name: string;
        value: any;
    }

    Value name pair as defined by the corresponding description

    +

    Type declaration

    • name: string

      Item name

      +
    • value: any

      Item value. The type is defined in the corresponding description

      +
    \ No newline at end of file diff --git a/docs/interfaces/LensDescription.html b/docs/interfaces/LensDescription.html index 8b5c4e30..d3c947eb 100644 --- a/docs/interfaces/LensDescription.html +++ b/docs/interfaces/LensDescription.html @@ -1,98 +1,12 @@ -LensDescription | onvif
    -
    - -
    -
    -
    -
    - -

    Interface LensDescription

    -
    -

    Hierarchy

    -
      -
    • LensDescription
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    XFactor: number
    -

    Compensation of the x coordinate needed for the ONVIF normalized coordinate system

    -
    -
    - -
    focalLength: number
    -

    Optional focal length of the optical system

    -
    -
    - -
    offset: LensOffset
    -

    Offset of the lens center to the imager center in normalized coordinates

    -
    -
    - -
    projection: LensProjection
    -

    Radial description of the projection characteristics. +LensDescription | onvif

    Interface LensDescription

    interface LensDescription {
        XFactor: number;
        focalLength: number;
        offset: LensOffset;
        projection: LensProjection;
    }

    Properties

    XFactor: number

    Compensation of the x coordinate needed for the ONVIF normalized coordinate system

    +
    focalLength: number

    Optional focal length of the optical system

    +
    offset: LensOffset

    Offset of the lens center to the imager center in normalized coordinates

    +
    projection: LensProjection

    Radial description of the projection characteristics. The resulting curve is defined by the B-Spline interpolation over the given elements. The element for Radius zero shall not be provided. The projection points shall be ordered with ascending Radius. Items outside the last projection Radius shall be assumed to be invisible (black)

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/LensOffset.html b/docs/interfaces/LensOffset.html index 3e3fbdec..deb3d473 100644 --- a/docs/interfaces/LensOffset.html +++ b/docs/interfaces/LensOffset.html @@ -1,77 +1,5 @@ -LensOffset | onvif
    -
    - -
    -
    -
    -
    - -

    Interface LensOffset

    -
    -

    Hierarchy

    -
      -
    • LensOffset
    -
    -
    -
    - -
    -
    -

    Properties

    -
    x -y -
    -
    -

    Properties

    -
    - -
    x: number
    -

    Optional horizontal offset of the lens center in normalized coordinates

    -
    -
    - -
    y: number
    -

    Optional vertical offset of the lens center in normalized coordinates

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +LensOffset | onvif

    Interface LensOffset

    interface LensOffset {
        x: number;
        y: number;
    }

    Properties

    x +y +

    Properties

    x: number

    Optional horizontal offset of the lens center in normalized coordinates

    +
    y: number

    Optional vertical offset of the lens center in normalized coordinates

    +
    \ No newline at end of file diff --git a/docs/interfaces/LensProjection.html b/docs/interfaces/LensProjection.html index a3714662..226c5b49 100644 --- a/docs/interfaces/LensProjection.html +++ b/docs/interfaces/LensProjection.html @@ -1,86 +1,7 @@ -LensProjection | onvif
    -
    - -
    -
    -
    -
    - -

    Interface LensProjection

    -
    -

    Hierarchy

    -
      -
    • LensProjection
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    angle: number
    -

    Angle of incidence

    -
    -
    - -
    radius: number
    -

    Mapping radius as a consequence of the emergent angle

    -
    -
    - -
    transmittance?: number
    -

    Optional ray absorption at the given angle due to vignetting. A value of one means no absorption

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +LensProjection | onvif

    Interface LensProjection

    interface LensProjection {
        angle: number;
        radius: number;
        transmittance?: number;
    }

    Properties

    angle: number

    Angle of incidence

    +
    radius: number

    Mapping radius as a consequence of the emergent angle

    +
    transmittance?: number

    Optional ray absorption at the given angle due to vignetting. A value of one means no absorption

    +
    \ No newline at end of file diff --git a/docs/interfaces/MediaCapabilities.html b/docs/interfaces/MediaCapabilities.html index 40559add..1917cd2e 100644 --- a/docs/interfaces/MediaCapabilities.html +++ b/docs/interfaces/MediaCapabilities.html @@ -1,84 +1,6 @@ -MediaCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface MediaCapabilities

    -
    -

    Hierarchy

    -
      -
    • MediaCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -

    Media service URI

    -
    -
    - -
    -
    - -
    streamingCapabilities: RealTimeStreamingCapabilities
    -

    Streaming capabilities

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +MediaCapabilities | onvif

    Interface MediaCapabilities

    interface MediaCapabilities {
        XAddr: string;
        extension?: MediaCapabilitiesExtension;
        streamingCapabilities: RealTimeStreamingCapabilities;
    }

    Properties

    XAddr: string

    Media service URI

    +
    streamingCapabilities: RealTimeStreamingCapabilities

    Streaming capabilities

    +
    \ No newline at end of file diff --git a/docs/interfaces/MediaCapabilitiesExtension.html b/docs/interfaces/MediaCapabilitiesExtension.html index 4b9215c7..81e6819a 100644 --- a/docs/interfaces/MediaCapabilitiesExtension.html +++ b/docs/interfaces/MediaCapabilitiesExtension.html @@ -1,66 +1,2 @@ -MediaCapabilitiesExtension | onvif
    -
    - -
    -
    -
    -
    - -

    Interface MediaCapabilitiesExtension

    -
    -

    Hierarchy

    -
      -
    • MediaCapabilitiesExtension
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    profileCapabilities: ProfileCapabilities
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +MediaCapabilitiesExtension | onvif

    Interface MediaCapabilitiesExtension

    interface MediaCapabilitiesExtension {
        profileCapabilities: ProfileCapabilities;
    }

    Properties

    profileCapabilities: ProfileCapabilities
    \ No newline at end of file diff --git a/docs/interfaces/MediaProfile.html b/docs/interfaces/MediaProfile.html index 5fbccfb9..55d69eab 100644 --- a/docs/interfaces/MediaProfile.html +++ b/docs/interfaces/MediaProfile.html @@ -1,95 +1,9 @@ -MediaProfile | onvif
    -
    - -
    -
    -
    -
    - -

    Interface MediaProfile

    -
    -

    Hierarchy

    -
      -
    • MediaProfile
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    configurations: ConfigurationSet
    -

    The configurations assigned to the profile

    -
    -
    - -
    fixed: boolean
    -

    A value of true signals that the profile cannot be deleted. Default is false

    -
    -
    - -
    name: string
    -

    User readable name of the profile

    -
    -
    - -
    token: string
    -

    Unique identifier of the profile

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +MediaProfile | onvif

    Interface MediaProfile

    interface MediaProfile {
        configurations: ConfigurationSet;
        fixed: boolean;
        name: string;
        token: string;
    }

    Properties

    configurations: ConfigurationSet

    The configurations assigned to the profile

    +
    fixed: boolean

    A value of true signals that the profile cannot be deleted. Default is false

    +
    name: string

    User readable name of the profile

    +
    token: string

    Unique identifier of the profile

    +
    \ No newline at end of file diff --git a/docs/interfaces/MetadataConfiguration.html b/docs/interfaces/MetadataConfiguration.html index e59f38d4..32f9da43 100644 --- a/docs/interfaces/MetadataConfiguration.html +++ b/docs/interfaces/MetadataConfiguration.html @@ -1,182 +1,34 @@ -MetadataConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface MetadataConfiguration

    -
    -

    Hierarchy

    -
      -
    • MetadataConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    PTZStatus?: PTZFilter
    -

    Optional element to configure which PTZ related data is to include in the metadata stream

    -
    -
    - -
    analytics?: boolean
    -

    Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.)

    -
    -
    - -
    analyticsEngineConfiguration?: AnalyticsEngineConfiguration
    -

    Indication which AnalyticsModules shall output metadata. +MetadataConfiguration | onvif

    Interface MetadataConfiguration

    interface MetadataConfiguration {
        PTZStatus?: PTZFilter;
        analytics?: boolean;
        analyticsEngineConfiguration?: AnalyticsEngineConfiguration;
        compressionType: string;
        events: EventSubscription;
        extension?: any;
        geoLocation: boolean;
        multicast: MulticastConfiguration;
        name: string;
        sessionTimeout: string;
        shapePolygon: boolean;
        token: string;
        useCount: number;
    }

    Properties

    PTZStatus?: PTZFilter

    Optional element to configure which PTZ related data is to include in the metadata stream

    +
    analytics?: boolean

    Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.)

    +
    analyticsEngineConfiguration?: AnalyticsEngineConfiguration

    Indication which AnalyticsModules shall output metadata. Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration

    -
    -
    - -
    compressionType: string
    -

    Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType

    -
    -
    - - -

    Optional element to configure the streaming of events. +

    compressionType: string

    Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType

    +

    Optional element to configure the streaming of events. A client might be interested in receiving all, none or some of the events produced by the device:

    • To get all events: Include the Events element but do not include a filter
    • To get no events: Do not include the Events element
    • To get only some events: Include the Events element and include a filter in the element
    -
    -
    - -
    extension?: any
    -
    - -
    geoLocation: boolean
    -

    Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target

    -
    -
    - - -

    Defines the multicast settings that could be used for video streaming

    -
    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    sessionTimeout: string
    -

    The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored)

    -
    -
    - -
    shapePolygon: boolean
    -

    Optional parameter to configure if the generated metadata stream should contain shape information as polygon

    -
    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount: number
    -

    Number of internal references currently using this configuration. +

    extension?: any
    geoLocation: boolean

    Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target

    +

    Defines the multicast settings that could be used for video streaming

    +
    name: string

    User readable name. Length up to 64 characters

    +
    sessionTimeout: string

    The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored)

    +
    shapePolygon: boolean

    Optional parameter to configure if the generated metadata stream should contain shape information as polygon

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/Mpeg4Configuration.html b/docs/interfaces/Mpeg4Configuration.html index 78dde031..850e99e2 100644 --- a/docs/interfaces/Mpeg4Configuration.html +++ b/docs/interfaces/Mpeg4Configuration.html @@ -1,79 +1,7 @@ -Mpeg4Configuration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Mpeg4Configuration

    -
    -

    Hierarchy

    -
      -
    • Mpeg4Configuration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    govLength: number
    -

    Determines the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. +Mpeg4Configuration | onvif

    Interface Mpeg4Configuration

    interface Mpeg4Configuration {
        govLength: number;
        mpeg4Profile: "SP" | "ASP";
    }

    Properties

    Properties

    govLength: number

    Determines the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames

    -
    -
    - -
    mpeg4Profile: "SP" | "ASP"
    -

    The Mpeg4 profile, either simple profile (SP) or advanced simple profile (ASP)

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    mpeg4Profile: "SP" | "ASP"

    The Mpeg4 profile, either simple profile (SP) or advanced simple profile (ASP)

    +
    \ No newline at end of file diff --git a/docs/interfaces/MulticastConfiguration.html b/docs/interfaces/MulticastConfiguration.html index bb2ec3db..b18e73df 100644 --- a/docs/interfaces/MulticastConfiguration.html +++ b/docs/interfaces/MulticastConfiguration.html @@ -1,100 +1,14 @@ -MulticastConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface MulticastConfiguration

    -
    -

    Hierarchy

    -
      -
    • MulticastConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    TTL: number
    -

    In case of IPv6 the TTL value is assumed as the hop limit. +MulticastConfiguration | onvif

    Interface MulticastConfiguration

    interface MulticastConfiguration {
        TTL: number;
        address: IPAddress;
        autoStart: boolean;
        port: number;
    }

    Properties

    Properties

    TTL: number

    In case of IPv6 the TTL value is assumed as the hop limit. Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets from (endlessly) circulating and not limiting scope. In these cases the address contains the scope

    -
    -
    - -
    address: IPAddress
    -

    The multicast address (if this address is set to 0 no multicast streaming is enaled)

    -
    -
    - -
    autoStart: boolean
    -

    Read only property signalling that streaming is persistant. +

    address: IPAddress

    The multicast address (if this address is set to 0 no multicast streaming is enaled)

    +
    autoStart: boolean

    Read only property signalling that streaming is persistant. Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state.

    -
    -
    - -
    port: number
    -

    The RTP mutlicast destination port. A device may support RTCP. +

    port: number

    The RTP mutlicast destination port. A device may support RTCP. In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) destination port number as defined in the RTSP specification

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/NetworkCapabilities.html b/docs/interfaces/NetworkCapabilities.html index 3977ebe6..132ff820 100644 --- a/docs/interfaces/NetworkCapabilities.html +++ b/docs/interfaces/NetworkCapabilities.html @@ -1,105 +1,21 @@ -NetworkCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface NetworkCapabilities

    -
    -

    Network capabilities

    -
    -
    -

    Hierarchy

    -
      -
    • NetworkCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    IPFilter?: boolean
    -

    Indicates support for IP filtering

    -
    -
    - -
    IPVersion6?: boolean
    -

    Indicates support for IPv6

    -
    -
    - -
    dynDNS?: boolean
    -

    Indicates support for dynamic DNS configuration

    -
    -
    - -
    -
    - -
    zeroConfiguration?: boolean
    -

    Indicates support for zeroconf

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +NetworkCapabilities | onvif

    Interface NetworkCapabilities

    Network capabilities

    +
    interface NetworkCapabilities {
        DHCPv6: boolean;
        IPFilter?: boolean;
        IPVersion6?: boolean;
        NTP: number;
        dot11Configuration?: boolean;
        dot1XConfigurations?: number;
        dynDNS?: boolean;
        extension: NetworkCapabilitiesExtension;
        hostnameFromDHCP?: boolean;
        zeroConfiguration?: boolean;
    }

    Properties

    DHCPv6: boolean

    Indicates support for Stateful IPv6 DHCP

    +
    IPFilter?: boolean

    Indicates support for IP filtering

    +
    IPVersion6?: boolean

    Indicates support for IPv6

    +
    NTP: number

    Maximum number of NTP servers supported by the devices SetNTP command

    +
    dot11Configuration?: boolean

    Indicates support for IEEE 802.11 configuration

    +
    dot1XConfigurations?: number

    Indicates the maximum number of Dot1X configurations supported by the device

    +
    dynDNS?: boolean

    Indicates support for dynamic DNS configuration

    +
    hostnameFromDHCP?: boolean

    Indicates support for retrieval of hostname from DHCP

    +
    zeroConfiguration?: boolean

    Indicates support for zeroconf

    +
    \ No newline at end of file diff --git a/docs/interfaces/NetworkCapabilitiesExtension.html b/docs/interfaces/NetworkCapabilitiesExtension.html index 1601cbf4..efc2b65d 100644 --- a/docs/interfaces/NetworkCapabilitiesExtension.html +++ b/docs/interfaces/NetworkCapabilitiesExtension.html @@ -1,73 +1,3 @@ -NetworkCapabilitiesExtension | onvif
    -
    - -
    -
    -
    -
    - -

    Interface NetworkCapabilitiesExtension

    -
    -

    Hierarchy

    -
      -
    • NetworkCapabilitiesExtension
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    dot11Configuration?: boolean
    -
    - -
    extension?: any
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +NetworkCapabilitiesExtension | onvif

    Interface NetworkCapabilitiesExtension

    interface NetworkCapabilitiesExtension {
        dot11Configuration?: boolean;
        extension?: any;
    }

    Properties

    dot11Configuration?: boolean
    extension?: any
    \ No newline at end of file diff --git a/docs/interfaces/NoiseReduction.html b/docs/interfaces/NoiseReduction.html index cb5c0fdb..81ac04f1 100644 --- a/docs/interfaces/NoiseReduction.html +++ b/docs/interfaces/NoiseReduction.html @@ -1,69 +1,4 @@ -NoiseReduction | onvif
    -
    - -
    -
    -
    -
    - -

    Interface NoiseReduction

    -
    -

    Hierarchy

    -
      -
    • NoiseReduction
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    level: number
    -

    Level parameter specified with unitless normalized value from 0.0 to +1.0. +NoiseReduction | onvif

    Interface NoiseReduction

    interface NoiseReduction {
        level: number;
    }

    Properties

    Properties

    level: number

    Level parameter specified with unitless normalized value from 0.0 to +1.0. Level=0 means no noise reduction or minimal noise reduction

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/OnvifOptions.html b/docs/interfaces/OnvifOptions.html index ffd49c4e..ca4cc728 100644 --- a/docs/interfaces/OnvifOptions.html +++ b/docs/interfaces/OnvifOptions.html @@ -1,156 +1,19 @@ -OnvifOptions | onvif
    -
    - -
    -
    -
    -
    - -

    Interface OnvifOptions

    -
    -

    Cam constructor options

    -
    -
    -

    Hierarchy

    -
      -
    • OnvifOptions
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    agent?: boolean | Agent
    -

    Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections.

    -
    -
    - -
    autoConnect?: boolean
    -

    Set false if the camera should not connect automatically, defaults false.

    -
    -
    - -
    hostname: string
    -
    - -
    password?: string
    -
    - -
    path?: string
    -
    - -
    port?: number
    -
    - -
    preserveAddress?: boolean
    -

    Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false.

    -
    -
    - -
    secureOptions?: SecureContextOptions
    -

    Set options for https like ca, cert, ciphers, rejectUnauthorized, secureOptions, secureProtocol, etc.

    -
    -
    - -
    timeout?: number
    -
    - -
    urn?: string
    -
    - -
    useSecure?: boolean
    -

    Set true if using https protocol, defaults to false.

    -
    -
    - -
    username?: string
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +OnvifOptions | onvif

    Interface OnvifOptions

    Cam constructor options

    +
    interface OnvifOptions {
        agent?: boolean | Agent;
        autoConnect?: boolean;
        hostname: string;
        password?: string;
        path?: string;
        port?: number;
        preserveAddress?: boolean;
        secureOptions?: SecureContextOptions;
        timeout?: number;
        urn?: string;
        useSecure?: boolean;
        username?: string;
    }

    Properties

    agent?: boolean | Agent

    Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections.

    +
    autoConnect?: boolean

    Set false if the camera should not connect automatically, defaults false.

    +
    hostname: string
    password?: string
    path?: string
    port?: number
    preserveAddress?: boolean

    Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false.

    +
    secureOptions?: SecureContextOptions

    Set options for https like ca, cert, ciphers, rejectUnauthorized, secureOptions, secureProtocol, etc.

    +
    timeout?: number
    urn?: string
    useSecure?: boolean

    Set true if using https protocol, defaults to false.

    +
    username?: string
    \ No newline at end of file diff --git a/docs/interfaces/OnvifRequestOptions.html b/docs/interfaces/OnvifRequestOptions.html index 5a174118..d4c4e8c6 100644 --- a/docs/interfaces/OnvifRequestOptions.html +++ b/docs/interfaces/OnvifRequestOptions.html @@ -1,266 +1,114 @@ -OnvifRequestOptions | onvif
    -
    - -
    -
    -
    -
    - -

    Interface OnvifRequestOptions

    -
    -

    Hierarchy

    -
      -
    • RequestOptions -
        -
      • OnvifRequestOptions
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    _defaultAgent?: Agent
    -
    - -
    agent?: boolean | Agent
    -
    - -
    auth?: null | string
    -
    - -
    body: string
    -

    SOAP body

    -
    -
    - -
    ca?: string | Buffer | (string | Buffer)[]
    -

    Optionally override the trusted CA certificates. Default is to trust -the well-known CAs curated by Mozilla. Mozilla's CAs are completely +OnvifRequestOptions | onvif

    Interface OnvifRequestOptions

    interface OnvifRequestOptions {
        ALPNCallback?: ((arg: {
            protocols: string[];
            servername: string;
        }) => undefined | string);
        _defaultAgent?: Agent;
        agent?: boolean | Agent;
        auth?: null | string;
        body: string;
        ca?: string | Buffer | (string | Buffer)[];
        cert?: string | Buffer | (string | Buffer)[];
        checkServerIdentity?: ((hostname: string, cert: PeerCertificate) => Error | undefined);
        ciphers?: string;
        clientCertEngine?: string;
        createConnection?: ((options: ClientRequestArgs, oncreate: ((err: null | Error, socket: Duplex) => void)) => undefined | null | Duplex);
        crl?: string | Buffer | (string | Buffer)[];
        defaultPort?: string | number;
        dhparam?: string | Buffer;
        ecdhCurve?: string;
        family?: number;
        headers?: OutgoingHttpHeaders;
        hints?: number;
        honorCipherOrder?: boolean;
        host?: null | string;
        hostname?: null | string;
        insecureHTTPParser?: boolean;
        joinDuplicateHeaders?: boolean;
        key?: string | Buffer | (string | Buffer | KeyObject)[];
        localAddress?: string;
        localPort?: number;
        lookup?: LookupFunction;
        maxHeaderSize?: number;
        maxVersion?: SecureVersion;
        method?: string;
        minVersion?: SecureVersion;
        passphrase?: string;
        path?: null | string;
        pfx?: string | Buffer | (string | Buffer | PxfObject)[];
        port?: null | string | number;
        privateKeyEngine?: string;
        privateKeyIdentifier?: string;
        protocol?: null | string;
        ptz?: boolean;
        rejectUnauthorized?: boolean;
        secureOptions?: number;
        secureProtocol?: string;
        servername?: string;
        service?: keyof OnvifServices;
        sessionIdContext?: string;
        sessionTimeout?: number;
        setHost?: boolean;
        sigalgs?: string;
        signal?: AbortSignal;
        socketPath?: string;
        ticketKeys?: Buffer;
        timeout?: number;
        uniqueHeaders?: (string | string[])[];
        url?: string;
    }

    Hierarchy

    • RequestOptions
      • OnvifRequestOptions

    Properties

    ALPNCallback?: ((arg: {
        protocols: string[];
        servername: string;
    }) => undefined | string)

    If set, this will be called when a client opens a connection using the ALPN extension. +One argument will be passed to the callback: an object containing servername and protocols fields, +respectively containing the server name from the SNI extension (if any) and an array of +ALPN protocol name strings. The callback must return either one of the strings listed in protocols, +which will be returned to the client as the selected ALPN protocol, or undefined, +to reject the connection with a fatal alert. If a string is returned that does not match one of +the client's ALPN protocols, an error will be thrown. +This option cannot be used with the ALPNProtocols option, and setting both options will throw an error.

    +
    _defaultAgent?: Agent
    agent?: boolean | Agent
    auth?: null | string
    body: string

    SOAP body

    +
    ca?: string | Buffer | (string | Buffer)[]

    Optionally override the trusted CA certificates. Default is to trust +the well-known CAs curated by Mozilla. Mozilla's CAs are completely replaced when CAs are explicitly specified using this option.

    -
    -
    - -
    cert?: string | Buffer | (string | Buffer)[]
    -

    Cert chains in PEM format. One cert chain should be provided per - private key. Each cert chain should consist of the PEM formatted - certificate for a provided private key, followed by the PEM - formatted intermediate certificates (if any), in order, and not - including the root CA (the root CA must be pre-known to the peer, - see ca). When providing multiple cert chains, they do not have to - be in the same order as their private keys in key. If the - intermediate certificates are not provided, the peer will not be - able to validate the certificate, and the handshake will fail.

    -
    -
    - -
    ciphers?: string
    -

    Cipher suite specification, replacing the default. For more +

    cert?: string | Buffer | (string | Buffer)[]

    Cert chains in PEM format. One cert chain should be provided per +private key. Each cert chain should consist of the PEM formatted +certificate for a provided private key, followed by the PEM +formatted intermediate certificates (if any), in order, and not +including the root CA (the root CA must be pre-known to the peer, +see ca). When providing multiple cert chains, they do not have to +be in the same order as their private keys in key. If the +intermediate certificates are not provided, the peer will not be +able to validate the certificate, and the handshake will fail.

    +
    checkServerIdentity?: ((hostname: string, cert: PeerCertificate) => Error | undefined)

    Type declaration

      • (hostname, cert): Error | undefined
      • Verifies the certificate cert is issued to hostname.

        +

        Returns Error object, populating it with reason, host, and cert on +failure. On success, returns undefined.

        +

        This function is intended to be used in combination with thecheckServerIdentity option that can be passed to connect and as +such operates on a certificate object. For other purposes, consider using x509.checkHost() instead.

        +

        This function can be overwritten by providing an alternative function as the options.checkServerIdentity option that is passed to tls.connect(). The +overwriting function can call tls.checkServerIdentity() of course, to augment +the checks done with additional verification.

        +

        This function is only called if the certificate passed all other checks, such as +being issued by trusted CA (options.ca).

        +

        Earlier versions of Node.js incorrectly accepted certificates for a givenhostname if a matching uniformResourceIdentifier subject alternative name +was present (see CVE-2021-44531). Applications that wish to acceptuniformResourceIdentifier subject alternative names can use +a custom options.checkServerIdentity function that implements the desired behavior.

        +

        Parameters

        • hostname: string

          The host name or IP address to verify the certificate against.

          +
        • cert: PeerCertificate

          A certificate object representing the peer's certificate.

          +

        Returns Error | undefined

        v0.8.4

        +
    ciphers?: string

    Cipher suite specification, replacing the default. For more information, see modifying the default cipher suite. Permitted ciphers can be obtained via tls.getCiphers(). Cipher names must be uppercased in order for OpenSSL to accept them.

    -
    -
    - -
    clientCertEngine?: string
    -

    Name of an OpenSSL engine which can provide the client certificate.

    -
    -
    - -
    createConnection?: ((options: ClientRequestArgs, oncreate: ((err: Error, socket: Socket) => void)) => Socket)
    -
    -

    Type declaration

    -
      -
    • -
        -
      • (options: ClientRequestArgs, oncreate: ((err: Error, socket: Socket) => void)): Socket
      • -
      • -
        -

        Parameters

        -
          -
        • -
          options: ClientRequestArgs
        • -
        • -
          oncreate: ((err: Error, socket: Socket) => void)
          -
            -
          • -
              -
            • (err: Error, socket: Socket): void
            • -
            • -
              -

              Parameters

              -
                -
              • -
                err: Error
              • -
              • -
                socket: Socket
              -

              Returns void

        -

        Returns Socket

    -
    - -
    crl?: string | Buffer | (string | Buffer)[]
    -

    PEM formatted CRLs (Certificate Revocation Lists).

    -
    -
    - -
    defaultPort?: string | number
    -
    - -
    dhparam?: string | Buffer
    -

    Diffie Hellman parameters, required for Perfect Forward Secrecy. Use -openssl dhparam to create the parameters. The key length must be -greater than or equal to 1024 bits or else an error will be thrown. -Although 1024 bits is permissible, use 2048 bits or larger for -stronger security. If omitted or invalid, the parameters are -silently discarded and DHE ciphers will not be available.

    -
    -
    - -
    ecdhCurve?: string
    -

    A string describing a named curve or a colon separated list of curve +

    clientCertEngine?: string

    Name of an OpenSSL engine which can provide the client certificate.

    +
    createConnection?: ((options: ClientRequestArgs, oncreate: ((err: null | Error, socket: Duplex) => void)) => undefined | null | Duplex)
    crl?: string | Buffer | (string | Buffer)[]

    PEM formatted CRLs (Certificate Revocation Lists).

    +
    defaultPort?: string | number
    dhparam?: string | Buffer

    'auto' or custom Diffie-Hellman parameters, required for non-ECDHE perfect forward secrecy. +If omitted or invalid, the parameters are silently discarded and DHE ciphers will not be available. +ECDHE-based perfect forward secrecy will still be available.

    +
    ecdhCurve?: string

    A string describing a named curve or a colon separated list of curve NIDs or names, for example P-521:P-384:P-256, to use for ECDH key agreement. Set to auto to select the curve automatically. Use crypto.getCurves() to obtain a list of available curve names. On recent releases, openssl ecparam -list_curves will also display the name and description of each available elliptic curve. Default: tls.DEFAULT_ECDH_CURVE.

    -
    -
    - -
    family?: number
    -
    - -
    headers?: OutgoingHttpHeaders
    -
    - -
    honorCipherOrder?: boolean
    -

    Attempt to use the server's cipher suite preferences instead of the -client's. When true, causes SSL_OP_CIPHER_SERVER_PREFERENCE to be +

    family?: number
    headers?: OutgoingHttpHeaders
    hints?: number
    honorCipherOrder?: boolean

    Attempt to use the server's cipher suite preferences instead of the +client's. When true, causes SSL_OP_CIPHER_SERVER_PREFERENCE to be set in secureOptions

    -
    -
    - -
    host?: null | string
    -
    - -
    hostname?: null | string
    -
    - -
    key?: string | Buffer | (Buffer | KeyObject)[]
    -

    Private keys in PEM format. PEM allows the option of private keys +

    host?: null | string
    hostname?: null | string
    insecureHTTPParser?: boolean
    joinDuplicateHeaders?: boolean
    key?: string | Buffer | (string | Buffer | KeyObject)[]

    Private keys in PEM format. PEM allows the option of private keys being encrypted. Encrypted keys will be decrypted with options.passphrase. Multiple keys using different algorithms can be provided either as an array of unencrypted key strings or buffers, @@ -268,83 +116,25 @@

    -
    - -
    localAddress?: string
    -
    - -
    lookup?: LookupFunction
    -
    - -
    maxHeaderSize?: number
    -
    -

    Default

    8192

    -
    -
    - -
    maxVersion?: SecureVersion
    -

    Optionally set the maximum TLS version to allow. One -of 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Cannot be specified along with the +

    localAddress?: string
    localPort?: number
    lookup?: LookupFunction
    maxHeaderSize?: number
    16384
    +
    + +
    maxVersion?: SecureVersion

    Optionally set the maximum TLS version to allow. One +of 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Cannot be specified along with the secureProtocol option, use one or the other. -Default: 'TLSv1.3', unless changed using CLI options. Using ---tls-max-v1.2 sets the default to 'TLSv1.2'. Using --tls-max-v1.3 sets the default to -'TLSv1.3'. If multiple of the options are provided, the highest maximum is used.

    -
    -
    - -
    method?: string
    -
    - -
    minVersion?: SecureVersion
    -

    Optionally set the minimum TLS version to allow. One -of 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Cannot be specified along with the +Default: 'TLSv1.3', unless changed using CLI options. Using +--tls-max-v1.2 sets the default to 'TLSv1.2'. Using --tls-max-v1.3 sets the default to +'TLSv1.3'. If multiple of the options are provided, the highest maximum is used.

    +
    method?: string
    minVersion?: SecureVersion

    Optionally set the minimum TLS version to allow. One +of 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Cannot be specified along with the secureProtocol option, use one or the other. It is not recommended to use less than TLSv1.2, but it may be required for interoperability. -Default: 'TLSv1.2', unless changed using CLI options. Using ---tls-v1.0 sets the default to 'TLSv1'. Using --tls-v1.1 sets the default to -'TLSv1.1'. Using --tls-min-v1.3 sets the default to -'TLSv1.3'. If multiple of the options are provided, the lowest minimum is used.

    -
    -
    - -
    passphrase?: string
    -

    Shared passphrase used for a single private key and/or a PFX.

    -
    -
    - -
    path?: null | string
    -
    - -
    pfx?: string | Buffer | (string | Buffer | PxfObject)[]
    -

    PFX or PKCS12 encoded private key and certificate chain. pfx is an +Default: 'TLSv1.2', unless changed using CLI options. Using +--tls-v1.0 sets the default to 'TLSv1'. Using --tls-v1.1 sets the default to +'TLSv1.1'. Using --tls-min-v1.3 sets the default to +'TLSv1.3'. If multiple of the options are provided, the lowest minimum is used.

    +
    passphrase?: string

    Shared passphrase used for a single private key and/or a PFX.

    +
    path?: null | string
    pfx?: string | Buffer | (string | Buffer | PxfObject)[]

    PFX or PKCS12 encoded private key and certificate chain. pfx is an alternative to providing key and cert individually. PFX is usually encrypted, if it is, passphrase will be used to decrypt it. Multiple PFX can be provided either as an array of unencrypted PFX buffers, @@ -352,235 +142,35 @@

    -
    - -
    port?: null | string | number
    -
    - -
    privateKeyEngine?: string
    -

    Name of an OpenSSL engine to get private key from. Should be used +

    port?: null | string | number
    privateKeyEngine?: string

    Name of an OpenSSL engine to get private key from. Should be used together with privateKeyIdentifier.

    -
    -
    - -
    privateKeyIdentifier?: string
    -

    Identifier of a private key managed by an OpenSSL engine. Should be +

    privateKeyIdentifier?: string

    Identifier of a private key managed by an OpenSSL engine. Should be used together with privateKeyEngine. Should not be set together with key, because both options define a private key in different ways.

    -
    -
    - -
    protocol?: null | string
    -
    - -
    ptz?: boolean
    -

    Make request to PTZ uri or not

    -
    -
    - -
    rejectUnauthorized?: boolean
    -
    - -
    secureOptions?: number
    -

    Optionally affect the OpenSSL protocol behavior, which is not +

    protocol?: null | string
    ptz?: boolean

    Make request to PTZ uri or not

    +
    rejectUnauthorized?: boolean
    secureOptions?: number

    Optionally affect the OpenSSL protocol behavior, which is not usually necessary. This should be used carefully if at all! Value is a numeric bitmask of the SSL_OP_* options from OpenSSL Options

    -
    -
    - -
    secureProtocol?: string
    -

    Legacy mechanism to select the TLS protocol version to use, it does +

    secureProtocol?: string

    Legacy mechanism to select the TLS protocol version to use, it does not support independent control of the minimum and maximum version, and does not support limiting the protocol to TLSv1.3. Use minVersion and maxVersion instead. The possible values are listed as SSL_METHODS, use the function names as strings. For example, use -'TLSv1_1_method' to force TLS version 1.1, or 'TLS_method' to allow +'TLSv1_1_method' to force TLS version 1.1, or 'TLS_method' to allow any TLS protocol version up to TLSv1.3. It is not recommended to use TLS versions less than 1.2, but it may be required for interoperability. Default: none, see minVersion.

    -
    -
    - -
    servername?: string
    -
    - -
    service?: keyof OnvifServices
    -

    Name of service (ptz, media, etc)

    -
    -
    - -
    sessionIdContext?: string
    -

    Opaque identifier used by servers to ensure session state is not +

    servername?: string
    service?: keyof OnvifServices

    Name of service (ptz, media, etc)

    +
    sessionIdContext?: string

    Opaque identifier used by servers to ensure session state is not shared between applications. Unused by clients.

    -
    -
    - -
    sessionTimeout?: number
    -

    The number of seconds after which a TLS session created by the +

    sessionTimeout?: number

    The number of seconds after which a TLS session created by the server will no longer be resumable. See Session Resumption for more information. Default: 300.

    -
    -
    - -
    setHost?: boolean
    -
    - -
    sigalgs?: string
    -

    Colon-separated list of supported signature algorithms. The list - can contain digest algorithms (SHA256, MD5 etc.), public key - algorithms (RSA-PSS, ECDSA etc.), combination of both (e.g - 'RSA+SHA384') or TLS v1.3 scheme names (e.g. rsa_pss_pss_sha512).

    -
    -
    - -
    signal?: AbortSignal
    -
    - -
    socketPath?: string
    -
    - -
    ticketKeys?: Buffer
    -

    48-bytes of cryptographically strong pseudo-random data. +

    setHost?: boolean
    sigalgs?: string

    Colon-separated list of supported signature algorithms. The list +can contain digest algorithms (SHA256, MD5 etc.), public key +algorithms (RSA-PSS, ECDSA etc.), combination of both (e.g +'RSA+SHA384') or TLS v1.3 scheme names (e.g. rsa_pss_pss_sha512).

    +
    signal?: AbortSignal
    socketPath?: string
    ticketKeys?: Buffer

    48-bytes of cryptographically strong pseudo-random data. See Session Resumption for more information.

    -
    -
    - -
    timeout?: number
    -
    - -
    url?: string
    -

    Defines another url to request

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    timeout?: number
    uniqueHeaders?: (string | string[])[]
    url?: string

    Defines another url to request

    +
    \ No newline at end of file diff --git a/docs/interfaces/OnvifService.html b/docs/interfaces/OnvifService.html deleted file mode 100644 index 0946b3cf..00000000 --- a/docs/interfaces/OnvifService.html +++ /dev/null @@ -1,95 +0,0 @@ -OnvifService | onvif
    -
    - -
    -
    -
    -
    - -

    Interface OnvifService

    -
    -

    Hierarchy

    -
      -
    • OnvifService
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -

    Uri for requests

    -
    -
    - -
    major: number
    -

    Major version

    -
    -
    - -
    minor: number
    -

    Minor version

    -
    -
    - -
    namespace: string
    -

    Namespace uri

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file diff --git a/docs/interfaces/OnvifServices.html b/docs/interfaces/OnvifServices.html index 15a1b3c2..b86e99c5 100644 --- a/docs/interfaces/OnvifServices.html +++ b/docs/interfaces/OnvifServices.html @@ -1,150 +1,14 @@ -OnvifServices | onvif
    -
    - -
    -
    -
    -
    - -

    Interface OnvifServices

    -
    -

    Hierarchy

    -
      -
    • OnvifServices
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    PTZ?: URL
    -
    - -
    analyticsDevice?: URL
    -
    - -
    device?: URL
    -
    - -
    deviceIO?: URL
    -
    - -
    display?: URL
    -
    - -
    events?: URL
    -
    - -
    imaging?: URL
    -
    - -
    media?: URL
    -
    - -
    media2?: URL
    -
    - -
    receiver?: URL
    -
    - -
    recording?: URL
    -
    - -
    replay?: URL
    -
    - -
    search?: URL
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +OnvifServices | onvif

    Interface OnvifServices

    interface OnvifServices {
        PTZ?: URL;
        analyticsDevice?: URL;
        device?: URL;
        deviceIO?: URL;
        display?: URL;
        events?: URL;
        imaging?: URL;
        media?: URL;
        media2?: URL;
        receiver?: URL;
        recording?: URL;
        replay?: URL;
        search?: URL;
    }

    Properties

    PTZ?: URL
    analyticsDevice?: URL
    device?: URL
    deviceIO?: URL
    display?: URL
    events?: URL
    imaging?: URL
    media?: URL
    media2?: URL
    receiver?: URL
    recording?: URL
    replay?: URL
    search?: URL
    \ No newline at end of file diff --git a/docs/interfaces/OnvifVersion.html b/docs/interfaces/OnvifVersion.html index bbc57256..28bb73f2 100644 --- a/docs/interfaces/OnvifVersion.html +++ b/docs/interfaces/OnvifVersion.html @@ -1,79 +1,7 @@ -OnvifVersion | onvif
    -
    - -
    -
    -
    -
    - -

    Interface OnvifVersion

    -
    -

    Hierarchy

    -
      -
    • OnvifVersion
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    major: number
    -

    Major version number

    -
    -
    - -
    minor: number
    -

    Two digit minor version number. +OnvifVersion | onvif

    Interface OnvifVersion

    interface OnvifVersion {
        major: number;
        minor: number;
    }

    Properties

    Properties

    major: number

    Major version number

    +
    minor: number

    Two digit minor version number. If major version number is less than "16", X.0.1 maps to "01" and X.2.1 maps to "21" where X stands for Major version number. Otherwise, minor number is month of release, such as "06" for June

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/PTControlDirection.html b/docs/interfaces/PTControlDirection.html index 5cb9c726..4436baba 100644 --- a/docs/interfaces/PTControlDirection.html +++ b/docs/interfaces/PTControlDirection.html @@ -1,98 +1,8 @@ -PTControlDirection | onvif
    -
    - -
    -
    -
    -
    - -

    Interface PTControlDirection

    -
    -

    Hierarchy

    -
      -
    • PTControlDirection
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    EFlip?: { mode: "OFF" | "ON" | "Extended" }
    -

    Optional element to configure related parameters for E-Flip

    -
    -
    -

    Type declaration

    -
      -
    • -
      mode: "OFF" | "ON" | "Extended"
      -

      Parameter to enable/disable E-Flip feature

      -
    -
    - -
    extension: any
    -
    - -
    reverse: { mode: "OFF" | "ON" | "AUTO" | "Extended" }
    -

    Optional element to configure related parameters for reversing of PT Control Direction

    -
    -
    -

    Type declaration

    -
      -
    • -
      mode: "OFF" | "ON" | "AUTO" | "Extended"
      -

      Parameter to enable/disable Reverse feature

      -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +PTControlDirection | onvif

    Interface PTControlDirection

    interface PTControlDirection {
        EFlip?: {
            mode: "OFF" | "ON" | "Extended";
        };
        extension: any;
        reverse: {
            mode:
                | "OFF"
                | "ON"
                | "AUTO"
                | "Extended";
        };
    }

    Properties

    Properties

    EFlip?: {
        mode: "OFF" | "ON" | "Extended";
    }

    Optional element to configure related parameters for E-Flip

    +

    Type declaration

    • mode: "OFF" | "ON" | "Extended"

      Parameter to enable/disable E-Flip feature

      +
    extension: any
    reverse: {
        mode:
            | "OFF"
            | "ON"
            | "AUTO"
            | "Extended";
    }

    Optional element to configure related parameters for reversing of PT Control Direction

    +

    Type declaration

    • mode:
          | "OFF"
          | "ON"
          | "AUTO"
          | "Extended"

      Parameter to enable/disable Reverse feature

      +
    \ No newline at end of file diff --git a/docs/interfaces/PTZCapabilities.html b/docs/interfaces/PTZCapabilities.html index e6467bb0..020c05ba 100644 --- a/docs/interfaces/PTZCapabilities.html +++ b/docs/interfaces/PTZCapabilities.html @@ -1,71 +1,4 @@ -PTZCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface PTZCapabilities

    -
    -

    PTZ capabilities

    -
    -
    -

    Hierarchy

    -
      -
    • PTZCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -

    PTZ service URI

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +PTZCapabilities | onvif

    Interface PTZCapabilities

    PTZ capabilities

    +
    interface PTZCapabilities {
        XAddr: string;
    }

    Properties

    Properties

    XAddr: string

    PTZ service URI

    +
    \ No newline at end of file diff --git a/docs/interfaces/PTZConfiguration.html b/docs/interfaces/PTZConfiguration.html index f943d5ca..43b9b9fe 100644 --- a/docs/interfaces/PTZConfiguration.html +++ b/docs/interfaces/PTZConfiguration.html @@ -1,226 +1,43 @@ -PTZConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface PTZConfiguration

    -
    -

    Hierarchy

    -
      -
    • PTZConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    defaultAbsolutePantTiltPositionSpace?: string
    -

    If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default

    -
    -
    - -
    defaultAbsoluteZoomPositionSpace?: string
    -

    If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default

    -
    -
    - -
    defaultContinuousPanTiltVelocitySpace?: string
    -

    If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default

    -
    -
    - -
    defaultContinuousZoomVelocitySpace?: string
    -

    If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default

    -
    -
    - -
    defaultPTZSpeed?: PTZSpeed
    -

    If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds

    -
    -
    - -
    defaultPTZTimeout?: string
    -

    If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops

    -
    -
    - -
    defaultRelativePanTiltTranslationSpace?: string
    -

    If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default

    -
    -
    - -
    defaultRelativeZoomTranslationSpace?: string
    -

    If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default

    -
    -
    - -
    -
    - -
    moveRamp: number
    -

    The optional acceleration ramp used by the device when moving

    -
    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    nodeToken: string
    -

    A mandatory reference to the PTZ Node that the PTZ Configuration belongs to

    -
    -
    - -
    panTiltLimits?: PanTiltLimits
    -

    The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. +PTZConfiguration | onvif

    Interface PTZConfiguration

    interface PTZConfiguration {
        defaultAbsolutePantTiltPositionSpace?: string;
        defaultAbsoluteZoomPositionSpace?: string;
        defaultContinuousPanTiltVelocitySpace?: string;
        defaultContinuousZoomVelocitySpace?: string;
        defaultPTZSpeed?: PTZSpeed;
        defaultPTZTimeout?: string;
        defaultRelativePanTiltTranslationSpace?: string;
        defaultRelativeZoomTranslationSpace?: string;
        extension?: PTZConfigurationExtension;
        moveRamp?: number;
        name: string;
        nodeToken: string;
        panTiltLimits?: PanTiltLimits;
        presetRamp?: number;
        presetTourRamp?: number;
        token: string;
        useCount: number;
        zoomLimits?: ZoomLimits;
    }

    Properties

    defaultAbsolutePantTiltPositionSpace?: string

    If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default

    +
    defaultAbsoluteZoomPositionSpace?: string

    If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default

    +
    defaultContinuousPanTiltVelocitySpace?: string

    If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default

    +
    defaultContinuousZoomVelocitySpace?: string

    If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default

    +
    defaultPTZSpeed?: PTZSpeed

    If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds

    +
    defaultPTZTimeout?: string

    If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops

    +
    defaultRelativePanTiltTranslationSpace?: string

    If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default

    +
    defaultRelativeZoomTranslationSpace?: string

    If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default

    +
    moveRamp?: number

    The optional acceleration ramp used by the device when moving

    +
    name: string

    User readable name. Length up to 64 characters

    +
    nodeToken: string

    A mandatory reference to the PTZ Node that the PTZ Configuration belongs to

    +
    panTiltLimits?: PanTiltLimits

    The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. If the element is present it signals the support for configurable Pan/Tilt limits. If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. The Pan/Tilt limits are disabled by setting the limits to –INF or +INF

    -
    -
    - -
    presetRamp: number
    -

    The optional acceleration ramp used by the device when recalling presets

    -
    -
    - -
    presetTourRamp: number
    -

    The optional acceleration ramp used by the device when executing PresetTours

    -
    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount: number
    -

    Number of internal references currently using this configuration. +

    presetRamp?: number

    The optional acceleration ramp used by the device when recalling presets

    +
    presetTourRamp?: number

    The optional acceleration ramp used by the device when executing PresetTours

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    -
    - -
    zoomLimits?: ZoomLimits
    -

    The Zoom limits element should be present for a PTZ Node that supports absolute zoom. +

    zoomLimits?: ZoomLimits

    The Zoom limits element should be present for a PTZ Node that supports absolute zoom. If the element is present it signals the supports for configurable Zoom limits. If limits are enabled the zoom movements shall always stay within the specified range. The Zoom limits are disabled by settings the limits to -INF and +INF

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/PTZConfigurationExtension.html b/docs/interfaces/PTZConfigurationExtension.html index 9f43f054..b095c5d8 100644 --- a/docs/interfaces/PTZConfigurationExtension.html +++ b/docs/interfaces/PTZConfigurationExtension.html @@ -1,75 +1,4 @@ -PTZConfigurationExtension | onvif
    -
    - -
    -
    -
    -
    - -

    Interface PTZConfigurationExtension

    -
    -

    Hierarchy

    -
      -
    • PTZConfigurationExtension
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    PTControlDirection: PTControlDirection
    -

    Optional element to configure PT Control Direction related features

    -
    -
    - -
    extension: any
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +PTZConfigurationExtension | onvif

    Interface PTZConfigurationExtension

    interface PTZConfigurationExtension {
        PTControlDirection: PTControlDirection;
        extension: any;
    }

    Properties

    PTControlDirection: PTControlDirection

    Optional element to configure PT Control Direction related features

    +
    extension: any
    \ No newline at end of file diff --git a/docs/interfaces/PTZFilter.html b/docs/interfaces/PTZFilter.html index 9e0713ab..681087cb 100644 --- a/docs/interfaces/PTZFilter.html +++ b/docs/interfaces/PTZFilter.html @@ -1,77 +1,5 @@ -PTZFilter | onvif
    -
    - -
    -
    -
    -
    - -

    Interface PTZFilter

    -
    -

    Hierarchy

    -
      -
    • PTZFilter
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    position: boolean
    -

    true if the metadata stream shall contain the PTZ position

    -
    -
    - -
    status: boolean
    -

    true if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN)

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +PTZFilter | onvif

    Interface PTZFilter

    interface PTZFilter {
        position: boolean;
        status: boolean;
    }

    Properties

    Properties

    position: boolean

    true if the metadata stream shall contain the PTZ position

    +
    status: boolean

    true if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN)

    +
    \ No newline at end of file diff --git a/docs/interfaces/PTZSpeed.html b/docs/interfaces/PTZSpeed.html index 71c057e2..6e97e65f 100644 --- a/docs/interfaces/PTZSpeed.html +++ b/docs/interfaces/PTZSpeed.html @@ -1,90 +1,6 @@ -PTZSpeed | onvif
    -
    - -
    -
    -
    -
    - -

    Interface PTZSpeed

    -
    -

    Hierarchy

    -
      -
    • PTZSpeed
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    panTilt: { x: number; y: number }
    -

    Pan and tilt speed. The x component corresponds to pan and the y component to tilt. +PTZSpeed | onvif

    Interface PTZSpeed

    interface PTZSpeed {
        panTilt?: Vector2D;
        zoom?: Vector1D;
    }

    Properties

    Properties

    panTilt?: Vector2D

    Pan and tilt speed. The x component corresponds to pan and the y component to tilt. If omitted in a request, the current (if any) PanTilt movement should not be affected

    -
    -
    -

    Type declaration

    -
      -
    • -
      x: number
    • -
    • -
      y: number
    -
    - -
    zoom: { x: number }
    -

    A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected

    -
    -
    -

    Type declaration

    -
      -
    • -
      x: number
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    zoom?: Vector1D

    A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected

    +
    \ No newline at end of file diff --git a/docs/interfaces/PanTiltLimits.html b/docs/interfaces/PanTiltLimits.html index b66f53f3..7035bb27 100644 --- a/docs/interfaces/PanTiltLimits.html +++ b/docs/interfaces/PanTiltLimits.html @@ -1,68 +1,3 @@ -PanTiltLimits | onvif
    -
    - -
    -
    -
    -
    - -

    Interface PanTiltLimits

    -
    -

    Hierarchy

    -
      -
    • PanTiltLimits
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - - -

    A range of pan tilt limits

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +PanTiltLimits | onvif

    Interface PanTiltLimits

    interface PanTiltLimits {
        range: Space2DDescription;
    }

    Properties

    Properties

    A range of pan tilt limits

    +
    \ No newline at end of file diff --git a/docs/interfaces/Profile.html b/docs/interfaces/Profile.html index ef6e856a..478c897e 100644 --- a/docs/interfaces/Profile.html +++ b/docs/interfaces/Profile.html @@ -1,158 +1,23 @@ -Profile | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Profile

    -
    -

    Hierarchy

    -
      -
    • Profile
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    PTZConfiguration?: PTZConfiguration
    -

    Optional configuration of the pan tilt zoom unit

    -
    -
    - -
    audioEncoderConfiguration?: AudioEncoderConfiguration
    -

    Optional configuration of the Audio encoder

    -
    -
    - -
    audioSourceConfiguration?: AudioSourceConfiguration
    -

    Optional configuration of the Audio input

    -
    -
    - -
    extension?: ProfileExtension
    -

    Extensions defined in ONVIF 2.0

    -
    -
    - -
    fixed: boolean
    -

    A value of true signals that the profile cannot be deleted. Default is false

    -
    -
    - -
    metadataConfiguration?: MetadataConfiguration
    -

    Optional configuration of the metadata stream

    -
    -
    - -
    name: string
    -

    User readable name of the profile

    -
    -
    - -
    token: string
    -

    Unique identifier of the profile

    -
    -
    - -
    videoAnalyticsConfiguration?: VideoAnalyticsConfiguration
    -

    Optional configuration of the video analytics module and rule engine

    -
    -
    - -
    videoEncoderConfiguration?: VideoEncoderConfiguration
    -

    Optional configuration of the Video encoder

    -
    -
    - -
    videoSourceConfiguration?: VideoSourceConfiguration
    -

    Optional configuration of the Video input

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Profile | onvif

    Interface Profile

    Properties

    PTZConfiguration?: PTZConfiguration

    Optional configuration of the pan tilt zoom unit

    +
    audioEncoderConfiguration?: AudioEncoderConfiguration

    Optional configuration of the Audio encoder

    +
    audioSourceConfiguration?: AudioSourceConfiguration

    Optional configuration of the Audio input

    +
    extension?: ProfileExtension

    Extensions defined in ONVIF 2.0

    +
    fixed: boolean

    A value of true signals that the profile cannot be deleted. Default is false

    +
    metadataConfiguration?: MetadataConfiguration

    Optional configuration of the metadata stream

    +
    name: string

    User readable name of the profile

    +
    token: string

    Unique identifier of the profile

    +
    videoAnalyticsConfiguration?: VideoAnalyticsConfiguration

    Optional configuration of the video analytics module and rule engine

    +
    videoEncoderConfiguration?: VideoEncoderConfiguration

    Optional configuration of the Video encoder

    +
    videoSourceConfiguration?: VideoSourceConfiguration

    Optional configuration of the Video input

    +
    \ No newline at end of file diff --git a/docs/interfaces/ProfileCapabilities.html b/docs/interfaces/ProfileCapabilities.html index 93cdd4d1..c48d7e87 100644 --- a/docs/interfaces/ProfileCapabilities.html +++ b/docs/interfaces/ProfileCapabilities.html @@ -1,66 +1,2 @@ -ProfileCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ProfileCapabilities

    -
    -

    Hierarchy

    -
      -
    • ProfileCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    maximumNumberOfProfiles: number
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ProfileCapabilities | onvif

    Interface ProfileCapabilities

    interface ProfileCapabilities {
        maximumNumberOfProfiles: number;
    }

    Properties

    maximumNumberOfProfiles: number
    \ No newline at end of file diff --git a/docs/interfaces/ProfileExtension.html b/docs/interfaces/ProfileExtension.html index e6d01d59..3b5bcd9d 100644 --- a/docs/interfaces/ProfileExtension.html +++ b/docs/interfaces/ProfileExtension.html @@ -1,84 +1,6 @@ -ProfileExtension | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ProfileExtension

    -
    -

    Hierarchy

    -
      -
    • ProfileExtension
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    audioDecoderConfiguration: AudioDecoderConfiguration
    -

    Optional configuration of the Audio decoder

    -
    -
    - -
    audioOutputConfiguration: AudioOutputConfiguration
    -

    Optional configuration of the Audio output

    -
    -
    - -
    extension?: any
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ProfileExtension | onvif

    Interface ProfileExtension

    Properties

    audioDecoderConfiguration: AudioDecoderConfiguration

    Optional configuration of the Audio decoder

    +
    audioOutputConfiguration: AudioOutputConfiguration

    Optional configuration of the Audio output

    +
    extension?: any
    \ No newline at end of file diff --git a/docs/interfaces/Range.html b/docs/interfaces/Range.html index 380d422d..398a3f4b 100644 --- a/docs/interfaces/Range.html +++ b/docs/interfaces/Range.html @@ -1,73 +1,3 @@ -Range | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Range

    -
    -

    Hierarchy

    -
      -
    • Range
    -
    -
    -
    - -
    -
    -

    Properties

    -
    max -min -
    -
    -

    Properties

    -
    - -
    max: number
    -
    - -
    min: number
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Range | onvif

    Interface Range

    interface Range {
        max: number;
        min: number;
    }

    Properties

    max +min +

    Properties

    max: number
    min: number
    \ No newline at end of file diff --git a/docs/interfaces/RealTimeStreamingCapabilities.html b/docs/interfaces/RealTimeStreamingCapabilities.html index 907b81dd..ef2669df 100644 --- a/docs/interfaces/RealTimeStreamingCapabilities.html +++ b/docs/interfaces/RealTimeStreamingCapabilities.html @@ -1,95 +1,9 @@ -RealTimeStreamingCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface RealTimeStreamingCapabilities

    -
    -

    Hierarchy

    -
      -
    • RealTimeStreamingCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    RTPMulticast: boolean
    -

    Indicates whether or not RTP multicast is supported

    -
    -
    - -
    RTP_RTSP_TCP: boolean
    -

    Indicates whether or not RTP/RTSP/TCP is supported

    -
    -
    - -
    RTP_TCP: boolean
    -

    Indicates whether or not RTP over TCP is supported

    -
    -
    - -
    extension: any
    -

    Extensions

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +RealTimeStreamingCapabilities | onvif

    Interface RealTimeStreamingCapabilities

    interface RealTimeStreamingCapabilities {
        RTPMulticast: boolean;
        RTP_RTSP_TCP: boolean;
        RTP_TCP: boolean;
        extension: any;
    }

    Properties

    RTPMulticast: boolean

    Indicates whether or not RTP multicast is supported

    +
    RTP_RTSP_TCP: boolean

    Indicates whether or not RTP/RTSP/TCP is supported

    +
    RTP_TCP: boolean

    Indicates whether or not RTP over TCP is supported

    +
    extension: any

    Extensions

    +
    \ No newline at end of file diff --git a/docs/interfaces/ReceiverCapabilities.html b/docs/interfaces/ReceiverCapabilities.html index 6c167b7f..5a58e288 100644 --- a/docs/interfaces/ReceiverCapabilities.html +++ b/docs/interfaces/ReceiverCapabilities.html @@ -1,113 +1,13 @@ -ReceiverCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ReceiverCapabilities

    -
    -

    Hierarchy

    -
      -
    • ReceiverCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    RTP_Multicast: boolean
    -

    Indicates whether the device can receive RTP multicast streams

    -
    -
    - -
    RTP_RTSP_TCP: boolean
    -

    Indicates whether the device can receive RTP/RTSP/TCP streams

    -
    -
    - -
    RTP_TCP: boolean
    -

    Indicates whether the device can receive RTP/TCP streams

    -
    -
    - -
    XAddr: string
    -

    The address of the receiver service

    -
    -
    - -
    maximumRTSPURILength: number
    -

    The maximum allowed length for RTSP URIs

    -
    -
    - -
    supportedReceivers: number
    -

    The maximum number of receivers supported by the device

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ReceiverCapabilities | onvif

    Interface ReceiverCapabilities

    interface ReceiverCapabilities {
        RTP_Multicast: boolean;
        RTP_RTSP_TCP: boolean;
        RTP_TCP: boolean;
        XAddr: string;
        maximumRTSPURILength: number;
        supportedReceivers: number;
    }

    Properties

    RTP_Multicast: boolean

    Indicates whether the device can receive RTP multicast streams

    +
    RTP_RTSP_TCP: boolean

    Indicates whether the device can receive RTP/RTSP/TCP streams

    +
    RTP_TCP: boolean

    Indicates whether the device can receive RTP/TCP streams

    +
    XAddr: string

    The address of the receiver service

    +
    maximumRTSPURILength: number

    The maximum allowed length for RTSP URIs

    +
    supportedReceivers: number

    The maximum number of receivers supported by the device

    +
    \ No newline at end of file diff --git a/docs/interfaces/RecordingCapabilities.html b/docs/interfaces/RecordingCapabilities.html index 2f1836bb..363e40e7 100644 --- a/docs/interfaces/RecordingCapabilities.html +++ b/docs/interfaces/RecordingCapabilities.html @@ -1,101 +1,7 @@ -RecordingCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface RecordingCapabilities

    -
    -

    Hierarchy

    -
      -
    • RecordingCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -
    - -
    dynamicRecordings: boolean
    -
    - -
    dynamicTracks: boolean
    -
    - -
    maxStringLength: number
    -
    - -
    mediaProfileSource: boolean
    -
    - -
    receiverSource: boolean
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +RecordingCapabilities | onvif

    Interface RecordingCapabilities

    interface RecordingCapabilities {
        XAddr: string;
        dynamicRecordings: boolean;
        dynamicTracks: boolean;
        maxStringLength: number;
        mediaProfileSource: boolean;
        receiverSource: boolean;
    }

    Properties

    XAddr: string
    dynamicRecordings: boolean
    dynamicTracks: boolean
    maxStringLength: number
    mediaProfileSource: boolean
    receiverSource: boolean
    \ No newline at end of file diff --git a/docs/interfaces/Rectangle.html b/docs/interfaces/Rectangle.html index 0cfc45dd..e7a5c432 100644 --- a/docs/interfaces/Rectangle.html +++ b/docs/interfaces/Rectangle.html @@ -1,87 +1,5 @@ -Rectangle | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Rectangle

    -
    -

    Hierarchy

    -
      -
    • Rectangle
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    height: number
    -
    - -
    width: number
    -
    - -
    x: number
    -
    - -
    y: number
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Rectangle | onvif

    Interface Rectangle

    interface Rectangle {
        height: number;
        width: number;
        x: number;
        y: number;
    }

    Properties

    Properties

    height: number
    width: number
    x: number
    y: number
    \ No newline at end of file diff --git a/docs/interfaces/ReplayCapabilities.html b/docs/interfaces/ReplayCapabilities.html index cf64a92d..090bf7c6 100644 --- a/docs/interfaces/ReplayCapabilities.html +++ b/docs/interfaces/ReplayCapabilities.html @@ -1,66 +1,2 @@ -ReplayCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ReplayCapabilities

    -
    -

    Hierarchy

    -
      -
    • ReplayCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ReplayCapabilities | onvif

    Interface ReplayCapabilities

    interface ReplayCapabilities {
        XAddr: string;
    }

    Properties

    Properties

    XAddr: string
    \ No newline at end of file diff --git a/docs/interfaces/Rotate.html b/docs/interfaces/Rotate.html index 38d49350..57f887f1 100644 --- a/docs/interfaces/Rotate.html +++ b/docs/interfaces/Rotate.html @@ -1,84 +1,6 @@ -Rotate | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Rotate

    -
    -

    Hierarchy

    -
      -
    • Rotate
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    degree?: number
    -

    Optional parameter to configure how much degree of clockwise rotation of image for On mode. Omitting this parameter for On mode means 180 degree rotation.

    -
    -
    - -
    extension: any
    -
    - -
    mode: "OFF" | "ON" | "AUTO"
    -

    Parameter to enable/disable Rotation feature

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Rotate | onvif

    Interface Rotate

    interface Rotate {
        degree?: number;
        extension: any;
        mode: "OFF" | "ON" | "AUTO";
    }

    Properties

    Properties

    degree?: number

    Optional parameter to configure how much degree of clockwise rotation of image for On mode. Omitting this parameter for On mode means 180 degree rotation.

    +
    extension: any
    mode: "OFF" | "ON" | "AUTO"

    Parameter to enable/disable Rotation feature

    +
    \ No newline at end of file diff --git a/docs/interfaces/RuleEngineConfiguration.html b/docs/interfaces/RuleEngineConfiguration.html index 847ada21..08c31c08 100644 --- a/docs/interfaces/RuleEngineConfiguration.html +++ b/docs/interfaces/RuleEngineConfiguration.html @@ -1,73 +1,3 @@ -RuleEngineConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface RuleEngineConfiguration

    -
    -

    Hierarchy

    -
      -
    • RuleEngineConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    extension?: any
    -
    - -
    rule?: Config
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +RuleEngineConfiguration | onvif

    Interface RuleEngineConfiguration

    interface RuleEngineConfiguration {
        extension?: any;
        rule?: Config;
    }

    Properties

    Properties

    extension?: any
    rule?: Config
    \ No newline at end of file diff --git a/docs/interfaces/SceneOrientation.html b/docs/interfaces/SceneOrientation.html index f94a8313..fd3fd886 100644 --- a/docs/interfaces/SceneOrientation.html +++ b/docs/interfaces/SceneOrientation.html @@ -1,79 +1,7 @@ -SceneOrientation | onvif
    -
    - -
    -
    -
    -
    - -

    Interface SceneOrientation

    -
    -

    Hierarchy

    -
      -
    • SceneOrientation
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    mode: "AUTO" | "MANUAL"
    -

    Parameter to assign the way the camera determines the scene orientation

    -
    -
    - -
    orientation?: string
    -

    Assigned or determined scene orientation based on the Mode. +SceneOrientation | onvif

    Interface SceneOrientation

    interface SceneOrientation {
        mode: "AUTO" | "MANUAL";
        orientation?: string;
    }

    Properties

    Properties

    mode: "AUTO" | "MANUAL"

    Parameter to assign the way the camera determines the scene orientation

    +
    orientation?: string

    Assigned or determined scene orientation based on the Mode. When assigning the Mode to AUTO, this field is optional and will be ignored by the device. When assigning the Mode to MANUAL, this field is required and the device will return an InvalidArgs fault if missing

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/SearchCapabilities.html b/docs/interfaces/SearchCapabilities.html index 2e1f733b..a233d558 100644 --- a/docs/interfaces/SearchCapabilities.html +++ b/docs/interfaces/SearchCapabilities.html @@ -1,73 +1,3 @@ -SearchCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface SearchCapabilities

    -
    -

    Hierarchy

    -
      -
    • SearchCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    XAddr: string
    -
    - -
    metadataSearch: boolean
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +SearchCapabilities | onvif

    Interface SearchCapabilities

    interface SearchCapabilities {
        XAddr: string;
        metadataSearch: boolean;
    }

    Properties

    Properties

    XAddr: string
    metadataSearch: boolean
    \ No newline at end of file diff --git a/docs/interfaces/SecurityCapabilities.html b/docs/interfaces/SecurityCapabilities.html index b4efc1d2..600b5f7f 100644 --- a/docs/interfaces/SecurityCapabilities.html +++ b/docs/interfaces/SecurityCapabilities.html @@ -1,141 +1,43 @@ -SecurityCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface SecurityCapabilities

    -
    -

    Security capabilities

    -
    -
    -

    Hierarchy

    -
      -
    • SecurityCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    RELToken: boolean
    -

    Indicates support for WS-Security REL token

    -
    -
    - -
    SAMLToken: boolean
    -

    Indicates support for WS-Security SAML token

    -
    -
    - -
    TLS1.1: boolean
    -

    Indicates support for TLS 1.1

    -
    -
    - -
    TLS1.2: boolean
    -

    Indicates support for TLS 1.2

    -
    -
    - -
    X.509Token: boolean
    -

    Indicates support for WS-Security X.509 token

    -
    -
    - -
    accessPolicyConfig: boolean
    -

    Indicates support for access policy configuration

    -
    -
    - -
    -
    - -
    kerberosToken: boolean
    -

    Indicates support for WS-Security Kerberos token

    -
    -
    - -
    onboardKeyGeneration: boolean
    -

    Indicates support for onboard key generation

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +SecurityCapabilities | onvif

    Interface SecurityCapabilities

    Security capabilities

    +
    interface SecurityCapabilities {
        RELToken: boolean;
        SAMLToken: boolean;
        TLS1.0?: boolean;
        TLS1.1: boolean;
        TLS1.2: boolean;
        X.509Token: boolean;
        accessPolicyConfig: boolean;
        defaultAccessPolicy?: boolean;
        dot1X?: boolean;
        extension?: SecurityCapabilitiesExtension;
        httpDigest?: boolean;
        kerberosToken: boolean;
        maxPasswordHistory: number;
        maxPasswordLength?: number;
        maxUserNameLength?: number;
        maxUsers?: number;
        onboardKeyGeneration: boolean;
        remoteUserHandling?: boolean;
        securityPolicies?: string[];
        supportedEAPMethods?: number[];
        usernameToken?: boolean;
    }

    Properties

    RELToken: boolean

    Indicates support for WS-Security REL token

    +
    SAMLToken: boolean

    Indicates support for WS-Security SAML token

    +
    TLS1.0?: boolean

    Indicates support for TLS 1.1

    +
    TLS1.1: boolean

    Indicates support for TLS 1.1

    +
    TLS1.2: boolean

    Indicates support for TLS 1.2

    +
    X.509Token: boolean

    Indicates support for WS-Security X.509 token

    +
    accessPolicyConfig: boolean

    Indicates support for access policy configuration

    +
    defaultAccessPolicy?: boolean

    Indicates support for the ONVIF default access policy

    +
    dot1X?: boolean

    Indicates support for IEEE 802.1X configuration

    +
    httpDigest?: boolean

    Indicates support for WS over HTTP digest authenticated communication layer

    +
    kerberosToken: boolean

    Indicates support for WS-Security Kerberos token

    +
    maxPasswordHistory: number

    Maximum number of passwords that the device can remember for each user

    +
    maxPasswordLength?: number

    Maximum number of characters supported for the password by CreateUsers and SetUser

    +
    maxUserNameLength?: number

    Maximum number of characters supported for the username by CreateUsers

    +
    maxUsers?: number

    The maximum number of users that the device supports

    +
    onboardKeyGeneration: boolean

    Indicates support for onboard key generation

    +
    remoteUserHandling?: boolean

    Indicates support for remote user configuration. Used when accessing another device

    +
    securityPolicies?: string[]

    Indicates which security policies are supported. Options are: ModifyPassword, PasswordComplexity, AuthFailureWarnings

    +
    supportedEAPMethods?: number[]

    EAP Methods supported by the device. The int values refer to the IANA EAP Registry

    +
    usernameToken?: boolean

    Indicates support for WS-Security Username token

    +
    \ No newline at end of file diff --git a/docs/interfaces/SecurityCapabilitiesExtension.html b/docs/interfaces/SecurityCapabilitiesExtension.html index 3e62df71..5be82838 100644 --- a/docs/interfaces/SecurityCapabilitiesExtension.html +++ b/docs/interfaces/SecurityCapabilitiesExtension.html @@ -1,75 +1,4 @@ -SecurityCapabilitiesExtension | onvif
    -
    - -
    -
    -
    -
    - -

    Interface SecurityCapabilitiesExtension

    -
    -

    Hierarchy

    -
      -
    • SecurityCapabilitiesExtension
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    TLS1.0: boolean
    -

    Indicates support for TLS 1.0

    -
    -
    - -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +SecurityCapabilitiesExtension | onvif

    Interface SecurityCapabilitiesExtension

    interface SecurityCapabilitiesExtension {
        TLS1.0: boolean;
        extension?: SecurityCapabilitiesExtension2;
    }

    Properties

    Properties

    TLS1.0: boolean

    Indicates support for TLS 1.0

    +
    \ No newline at end of file diff --git a/docs/interfaces/SecurityCapabilitiesExtension2.html b/docs/interfaces/SecurityCapabilitiesExtension2.html index 614b9f8e..63d98581 100644 --- a/docs/interfaces/SecurityCapabilitiesExtension2.html +++ b/docs/interfaces/SecurityCapabilitiesExtension2.html @@ -1,82 +1,5 @@ -SecurityCapabilitiesExtension2 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface SecurityCapabilitiesExtension2

    -
    -

    Hierarchy

    -
      -
    • SecurityCapabilitiesExtension2
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    dot1X: boolean
    -
    - -
    remoteUserHandling: boolean
    -
    - -
    supportedEAPMethod?: number
    -

    EAP Methods supported by the device. The int values refer to the IANA EAP Registry

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +SecurityCapabilitiesExtension2 | onvif

    Interface SecurityCapabilitiesExtension2

    interface SecurityCapabilitiesExtension2 {
        dot1X: boolean;
        remoteUserHandling: boolean;
        supportedEAPMethod?: number;
    }

    Properties

    dot1X: boolean
    remoteUserHandling: boolean
    supportedEAPMethod?: number

    EAP Methods supported by the device. The int values refer to the IANA EAP Registry

    +
    \ No newline at end of file diff --git a/docs/interfaces/Space1DDescription.html b/docs/interfaces/Space1DDescription.html index 0cc6c525..e1aed27f 100644 --- a/docs/interfaces/Space1DDescription.html +++ b/docs/interfaces/Space1DDescription.html @@ -1,77 +1,5 @@ -Space1DDescription | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Space1DDescription

    -
    -

    Hierarchy

    -
      -
    • Space1DDescription
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    URI: string
    -

    A URI of coordinate systems

    -
    -
    - -
    XRange: Range
    -

    A range of x-axis

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Space1DDescription | onvif

    Interface Space1DDescription

    interface Space1DDescription {
        URI: string;
        XRange: Range;
    }

    Properties

    Properties

    URI: string

    A URI of coordinate systems

    +
    XRange: Range

    A range of x-axis

    +
    \ No newline at end of file diff --git a/docs/interfaces/Space2DDescription.html b/docs/interfaces/Space2DDescription.html index 1cff834a..a072500f 100644 --- a/docs/interfaces/Space2DDescription.html +++ b/docs/interfaces/Space2DDescription.html @@ -1,86 +1,7 @@ -Space2DDescription | onvif
    -
    - -
    -
    -
    -
    - -

    Interface Space2DDescription

    -
    -

    Hierarchy

    -
      -
    • Space2DDescription
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    URI: string
    -

    A URI of coordinate systems

    -
    -
    - -
    XRange: Range
    -

    A range of x-axis

    -
    -
    - -
    YRange: Range
    -

    A range of y-axis

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Space2DDescription | onvif

    Interface Space2DDescription

    interface Space2DDescription {
        URI: string;
        XRange: Range;
        YRange: Range;
    }

    Properties

    Properties

    URI: string

    A URI of coordinate systems

    +
    XRange: Range

    A range of x-axis

    +
    YRange: Range

    A range of y-axis

    +
    \ No newline at end of file diff --git a/docs/interfaces/SystemCapabilities.html b/docs/interfaces/SystemCapabilities.html index 1c687d26..6b1d41c6 100644 --- a/docs/interfaces/SystemCapabilities.html +++ b/docs/interfaces/SystemCapabilities.html @@ -1,159 +1,43 @@ -SystemCapabilities | onvif
    -
    - -
    -
    -
    -
    - -

    Interface SystemCapabilities

    -
    -

    System capabilities

    -
    -
    -

    Hierarchy

    -
      -
    • SystemCapabilities
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    discoveryBye: boolean
    -

    Indicates support for WS Discovery resolve requests

    -
    -
    - -
    discoveryResolve: boolean
    -

    Indicates whether or not WS Discovery resolve requests are supported

    -
    -
    - -
    -
    - -
    firmwareUpgrade: boolean
    -

    Indicates support for firmware upgrade through MTOM

    -
    -
    - -
    httpFirmwareUpgrade?: boolean
    -

    Indicates support for firmware upgrade through HTTP

    -
    -
    - -
    httpSystemBackup?: boolean
    -

    Indicates support for system backup through HTTP

    -
    -
    - -
    httpSystemLogging?: boolean
    -

    Indicates support for retrieval of system logging through HTTP

    -
    -
    - -
    remoteDiscovery: boolean
    -

    Indicates support for remote discovery

    -
    -
    - -
    supportedVersions: OnvifVersion
    -

    Indicates supported ONVIF version(s)

    -
    -
    - -
    systemBackup: boolean
    -

    Indicates support for system backup through MTOM

    -
    -
    - -
    systemLogging: boolean
    -

    Indicates support for retrieval of system logging through MTOM

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +SystemCapabilities | onvif

    Interface SystemCapabilities

    System capabilities

    +
    interface SystemCapabilities {
        addons?: string[];
        autoGeo?: string[];
        discoveryBye: boolean;
        discoveryNotSupported?: boolean;
        discoveryResolve: boolean;
        extensions?: SystemCapabilitiesExtension;
        firmwareUpgrade: boolean;
        geoLocationEntries?: number;
        httpFirmwareUpgrade?: boolean;
        httpSupportInformation?: boolean;
        httpSystemBackup?: boolean;
        httpSystemLogging?: boolean;
        maxStorageConfigurations?: number;
        networkConfigNotSupported?: boolean;
        remoteDiscovery: boolean;
        storageConfiguration?: boolean;
        storageTypesSupported?: string[];
        supportedVersions: OnvifVersion;
        systemBackup: boolean;
        systemLogging: boolean;
        userConfigNotSupported?: boolean;
    }

    Properties

    addons?: string[]

    List of supported Addons by the device

    +
    autoGeo?: string[]

    List of supported automatic GeoLocation adjustment supported by the device. Valid items are defined by tds:AutoGeoMode

    +
    discoveryBye: boolean

    Indicates support for WS Discovery resolve requests

    +
    discoveryNotSupported?: boolean

    Indicates no support for network discovery

    +
    discoveryResolve: boolean

    Indicates whether or not WS Discovery resolve requests are supported

    +
    firmwareUpgrade: boolean

    Indicates support for firmware upgrade through MTOM

    +
    geoLocationEntries?: number

    If present signals support for geo location. The value signals the supported number of entries

    +
    httpFirmwareUpgrade?: boolean

    Indicates support for firmware upgrade through HTTP

    +
    httpSupportInformation?: boolean

    Indicates support for retrieving support information through HTTP

    +
    httpSystemBackup?: boolean

    Indicates support for system backup through HTTP

    +
    httpSystemLogging?: boolean

    Indicates support for retrieval of system logging through HTTP

    +
    maxStorageConfigurations?: number

    Indicates maximum number of storage configurations supported

    +
    networkConfigNotSupported?: boolean

    Indicates no support for network configuration

    +
    remoteDiscovery: boolean

    Indicates support for remote discovery

    +
    storageConfiguration?: boolean

    Indicates support for storage configuration interfaces

    +
    storageTypesSupported?: string[]

    Enumerates the supported StorageTypes, see tds:StorageType

    +
    supportedVersions: OnvifVersion

    Indicates supported ONVIF version(s)

    +
    systemBackup: boolean

    Indicates support for system backup through MTOM

    +
    systemLogging: boolean

    Indicates support for retrieval of system logging through MTOM

    +
    userConfigNotSupported?: boolean

    Indicates no support for user configuration

    +
    \ No newline at end of file diff --git a/docs/interfaces/SystemCapabilitiesExtension.html b/docs/interfaces/SystemCapabilitiesExtension.html index c8e06456..ef5ce371 100644 --- a/docs/interfaces/SystemCapabilitiesExtension.html +++ b/docs/interfaces/SystemCapabilitiesExtension.html @@ -1,94 +1,6 @@ -SystemCapabilitiesExtension | onvif
    -
    - -
    -
    -
    -
    - -

    Interface SystemCapabilitiesExtension

    -
    -

    Hierarchy

    -
      -
    • SystemCapabilitiesExtension
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    extension?: any
    -
    - -
    httpFirmwareUpgrade?: boolean
    -
    - -
    httpSupportInformation?: boolean
    -
    - -
    httpSystemBackup?: boolean
    -
    - -
    httpSystemLogging?: boolean
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +SystemCapabilitiesExtension | onvif

    Interface SystemCapabilitiesExtension

    interface SystemCapabilitiesExtension {
        extension?: any;
        httpFirmwareUpgrade?: boolean;
        httpSupportInformation?: boolean;
        httpSystemBackup?: boolean;
        httpSystemLogging?: boolean;
    }

    Properties

    extension?: any
    httpFirmwareUpgrade?: boolean
    httpSupportInformation?: boolean
    httpSystemBackup?: boolean
    httpSystemLogging?: boolean
    \ No newline at end of file diff --git a/docs/interfaces/ToneCompensation.html b/docs/interfaces/ToneCompensation.html index aed0f93a..a1f33923 100644 --- a/docs/interfaces/ToneCompensation.html +++ b/docs/interfaces/ToneCompensation.html @@ -1,84 +1,6 @@ -ToneCompensation | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ToneCompensation

    -
    -

    Hierarchy

    -
      -
    • ToneCompensation
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    extension?: any
    -
    - -
    level?: number
    -

    Optional level parameter specified with unitless normalized value from 0.0 to +1.0

    -
    -
    - -
    mode: string
    -

    Parameter to enable/disable or automatic ToneCompensation feature. Its options shall be chosen from tt:ToneCompensationMode Type

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ToneCompensation | onvif

    Interface ToneCompensation

    interface ToneCompensation {
        extension?: any;
        level?: number;
        mode: string;
    }

    Properties

    Properties

    extension?: any
    level?: number

    Optional level parameter specified with unitless normalized value from 0.0 to +1.0

    +
    mode: string

    Parameter to enable/disable or automatic ToneCompensation feature. Its options shall be chosen from tt:ToneCompensationMode Type

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoAnalyticsConfiguration.html b/docs/interfaces/VideoAnalyticsConfiguration.html index c95daf4d..b4ac87bb 100644 --- a/docs/interfaces/VideoAnalyticsConfiguration.html +++ b/docs/interfaces/VideoAnalyticsConfiguration.html @@ -1,101 +1,10 @@ -VideoAnalyticsConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoAnalyticsConfiguration

    -
    -

    Hierarchy

    -
      -
    • VideoAnalyticsConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    analyticsEngineConfiguration: AnalyticsEngineConfiguration
    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    ruleEngineConfiguration: RuleEngineConfiguration
    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount: number
    -

    Number of internal references currently using this configuration. +VideoAnalyticsConfiguration | onvif

    Interface VideoAnalyticsConfiguration

    interface VideoAnalyticsConfiguration {
        analyticsEngineConfiguration: AnalyticsEngineConfiguration;
        name: string;
        ruleEngineConfiguration: RuleEngineConfiguration;
        token: string;
        useCount: number;
    }

    Properties

    analyticsEngineConfiguration: AnalyticsEngineConfiguration
    name: string

    User readable name. Length up to 64 characters

    +
    ruleEngineConfiguration: RuleEngineConfiguration
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/VideoEncoder2Configuration.html b/docs/interfaces/VideoEncoder2Configuration.html index d0a83804..3683c74f 100644 --- a/docs/interfaces/VideoEncoder2Configuration.html +++ b/docs/interfaces/VideoEncoder2Configuration.html @@ -1,165 +1,30 @@ -VideoEncoder2Configuration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoEncoder2Configuration

    -
    -

    Hierarchy

    -
      -
    • VideoEncoder2Configuration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    encoding: string
    -

    Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types +VideoEncoder2Configuration | onvif

    Interface VideoEncoder2Configuration

    interface VideoEncoder2Configuration {
        encoding: string;
        govLength: number;
        guaranteedFrameRate: boolean;
        mutlicast?: MulticastConfiguration;
        name: string;
        profile: string;
        quality: number;
        rateControl?: VideoRateControl2;
        resolution: VideoResolution;
        token: string;
        useCount?: number;
    }

    Properties

    encoding: string

    Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types https://www.iana.org/assignments/media-types/media-types.xhtml#video

    -
    -
    - -
    govLength: number
    -

    Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. +

    govLength: number

    Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames

    -
    -
    - -
    guaranteedFrameRate: boolean
    -

    A value of true indicates that frame rate is a fixed value rather than an upper limit, +

    guaranteedFrameRate: boolean

    A value of true indicates that frame rate is a fixed value rather than an upper limit, and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. Default is false.

    -
    -
    - - -

    Defines the multicast settings that could be used for video streaming

    -
    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    profile: string
    -

    The encoder profile as defined in tt:VideoEncodingProfiles

    -
    -
    - -
    quality: number
    -

    Relative value for the video quantizers and the quality of the video. +

    Defines the multicast settings that could be used for video streaming

    +
    name: string

    User readable name. Length up to 64 characters

    +
    profile: string

    The encoder profile as defined in tt:VideoEncodingProfiles

    +
    quality: number

    Relative value for the video quantizers and the quality of the video. A high value within supported quality range means higher quality

    -
    -
    - -
    rateControl?: VideoRateControl2
    -

    Optional element to configure rate control related parameters.

    -
    -
    - -
    resolution: VideoResolution
    -

    Configured video resolution

    -
    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount?: number
    -

    Number of internal references currently using this configuration. +

    rateControl?: VideoRateControl2

    Optional element to configure rate control related parameters.

    +
    resolution: VideoResolution

    Configured video resolution

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount?: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/VideoEncoderConfiguration.html b/docs/interfaces/VideoEncoderConfiguration.html index 0fb439b7..e468c19f 100644 --- a/docs/interfaces/VideoEncoderConfiguration.html +++ b/docs/interfaces/VideoEncoderConfiguration.html @@ -1,171 +1,29 @@ -VideoEncoderConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoEncoderConfiguration

    -
    -

    Hierarchy

    -
      -
    • VideoEncoderConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - - -

    Optional element to configure H.264 related parameters.

    -
    -
    - - -

    Optional element to configure Mpeg4 related parameters

    -
    -
    - -
    encoding: "JPEG" | "MPEG4" | "H264"
    -

    Used video codec, either Jpeg, H.264 or Mpeg4

    -
    -
    - -
    guaranteedFrameRate: boolean
    -

    A value of true indicates that frame rate is a fixed value rather than an upper limit, +VideoEncoderConfiguration | onvif

    Interface VideoEncoderConfiguration

    interface VideoEncoderConfiguration {
        H264?: H264Configuration;
        MPEG4?: Mpeg4Configuration;
        encoding: "JPEG" | "MPEG4" | "H264";
        guaranteedFrameRate: boolean;
        multicast: MulticastConfiguration;
        name: string;
        quality: number;
        rateControl?: VideoRateControl;
        resolution: VideoResolution;
        sessionTimeout: string;
        token: string;
        useCount: number;
    }

    Properties

    Optional element to configure H.264 related parameters.

    +

    Optional element to configure Mpeg4 related parameters

    +
    encoding: "JPEG" | "MPEG4" | "H264"

    Used video codec, either Jpeg, H.264 or Mpeg4

    +
    guaranteedFrameRate: boolean

    A value of true indicates that frame rate is a fixed value rather than an upper limit, and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. Default is false.

    -
    -
    - - -

    Defines the multicast settings that could be used for video streaming

    -
    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    quality: number
    -

    Relative value for the video quantizers and the quality of the video. +

    Defines the multicast settings that could be used for video streaming

    +
    name: string

    User readable name. Length up to 64 characters

    +
    quality: number

    Relative value for the video quantizers and the quality of the video. A high value within supported quality range means higher quality

    -
    -
    - -
    rateControl?: VideoRateControl
    -

    Optional element to configure rate control related parameters.

    -
    -
    - -
    resolution: VideoResolution
    -

    Configured video resolution

    -
    -
    - -
    sessionTimeout: string
    -

    The rtsp session timeout for the related video stream

    -
    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount: number
    -

    Number of internal references currently using this configuration. +

    rateControl?: VideoRateControl

    Optional element to configure rate control related parameters.

    +
    resolution: VideoResolution

    Configured video resolution

    +
    sessionTimeout: string

    The rtsp session timeout for the related video stream

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/VideoRateControl.html b/docs/interfaces/VideoRateControl.html index 3485a805..805e534f 100644 --- a/docs/interfaces/VideoRateControl.html +++ b/docs/interfaces/VideoRateControl.html @@ -1,86 +1,7 @@ -VideoRateControl | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoRateControl

    -
    -

    Hierarchy

    -
      -
    • VideoRateControl
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    bitrateLimit: number
    -

    the maximum output bitrate in kbps

    -
    -
    - -
    encodingInterval: number
    -

    Interval at which images are encoded and transmitted. (A value of 1 means that every frame is encoded, a value of 2 means that every 2nd frame is encoded ...)

    -
    -
    - -
    frameRateLimit: number
    -

    Maximum output framerate in fps. If an EncodingInterval is provided the resulting encoded framerate will be reduced by the given factor

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +VideoRateControl | onvif

    Interface VideoRateControl

    interface VideoRateControl {
        bitrateLimit: number;
        encodingInterval: number;
        frameRateLimit: number;
    }

    Properties

    bitrateLimit: number

    the maximum output bitrate in kbps

    +
    encodingInterval: number

    Interval at which images are encoded and transmitted. (A value of 1 means that every frame is encoded, a value of 2 means that every 2nd frame is encoded ...)

    +
    frameRateLimit: number

    Maximum output framerate in fps. If an EncodingInterval is provided the resulting encoded framerate will be reduced by the given factor

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoRateControl2.html b/docs/interfaces/VideoRateControl2.html index c373a2a8..307e6864 100644 --- a/docs/interfaces/VideoRateControl2.html +++ b/docs/interfaces/VideoRateControl2.html @@ -1,86 +1,7 @@ -VideoRateControl2 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoRateControl2

    -
    -

    Hierarchy

    -
      -
    • VideoRateControl2
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    bitrateLimit: number
    -

    the maximum output bitrate in kbps

    -
    -
    - -
    constantBitRate: boolean
    -

    Enforce constant bitrate

    -
    -
    - -
    frameRateLimit: number
    -

    Desired frame rate in fps. The actual rate may be lower due to e.g. performance limitations

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +VideoRateControl2 | onvif

    Interface VideoRateControl2

    interface VideoRateControl2 {
        bitrateLimit: number;
        constantBitRate: boolean;
        frameRateLimit: number;
    }

    Properties

    bitrateLimit: number

    the maximum output bitrate in kbps

    +
    constantBitRate: boolean

    Enforce constant bitrate

    +
    frameRateLimit: number

    Desired frame rate in fps. The actual rate may be lower due to e.g. performance limitations

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoResolution.html b/docs/interfaces/VideoResolution.html index 6abf65c9..4022deeb 100644 --- a/docs/interfaces/VideoResolution.html +++ b/docs/interfaces/VideoResolution.html @@ -1,77 +1,5 @@ -VideoResolution | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoResolution

    -
    -

    Hierarchy

    -
      -
    • VideoResolution
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    height: number
    -

    Number of the lines of the Video image

    -
    -
    - -
    width: number
    -

    Number of the columns of the Video image

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +VideoResolution | onvif

    Interface VideoResolution

    interface VideoResolution {
        height: number;
        width: number;
    }

    Properties

    Properties

    height: number

    Number of the lines of the Video image

    +
    width: number

    Number of the columns of the Video image

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoSource.html b/docs/interfaces/VideoSource.html index c0bc2795..531ffee3 100644 --- a/docs/interfaces/VideoSource.html +++ b/docs/interfaces/VideoSource.html @@ -1,102 +1,10 @@ -VideoSource | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoSource

    -
    -

    Hierarchy

    -
      -
    • VideoSource
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    -
    - -
    framerate: number
    -

    Frame rate in frames per second

    -
    -
    - -
    imaging?: ImagingSettings
    -

    Optional configuration of the image sensor

    -
    -
    - -
    resolution: VideoResolution
    -

    Horizontal and vertical resolution

    -
    -
    - -
    token: string
    -

    Unique identifier referencing the physical entity

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +VideoSource | onvif

    Interface VideoSource

    interface VideoSource {
        extension?: VideoSourceExtension;
        framerate: number;
        imaging?: ImagingSettings;
        resolution: VideoResolution;
        token: string;
    }

    Properties

    framerate: number

    Frame rate in frames per second

    +
    imaging?: ImagingSettings

    Optional configuration of the image sensor

    +
    resolution: VideoResolution

    Horizontal and vertical resolution

    +
    token: string

    Unique identifier referencing the physical entity

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoSourceConfiguration.html b/docs/interfaces/VideoSourceConfiguration.html index dc37115f..37798b18 100644 --- a/docs/interfaces/VideoSourceConfiguration.html +++ b/docs/interfaces/VideoSourceConfiguration.html @@ -1,121 +1,15 @@ -VideoSourceConfiguration | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoSourceConfiguration

    -
    -

    Hierarchy

    -
      -
    • VideoSourceConfiguration
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    bounds: IntRectangle
    -

    Rectangle specifying the Video capturing area. The capturing area shall not be larger than the whole Video source area

    -
    -
    - -
    -
    - -
    name: string
    -

    User readable name. Length up to 64 characters

    -
    -
    - -
    sourceToken: string
    -

    Reference to the physical input

    -
    -
    - -
    token: string
    -

    Token that uniquely references this configuration. Length up to 64 characters

    -
    -
    - -
    useCount: number
    -

    Number of internal references currently using this configuration +VideoSourceConfiguration | onvif

    Interface VideoSourceConfiguration

    interface VideoSourceConfiguration {
        bounds: IntRectangle;
        extension?: VideoSourceConfigurationExtension;
        name: string;
        sourceToken: string;
        token: string;
        useCount: number;
        viewMode: string;
    }

    Properties

    bounds: IntRectangle

    Rectangle specifying the Video capturing area. The capturing area shall not be larger than the whole Video source area

    +
    name: string

    User readable name. Length up to 64 characters

    +
    sourceToken: string

    Reference to the physical input

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration This informational parameter is read-only. Deprecated for Media2 Service

    -
    -
    - -
    viewMode: string
    -

    Readonly parameter signalling Source configuration's view mode, for devices supporting different view modes as defined in tt:viewModes

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    viewMode: string

    Readonly parameter signalling Source configuration's view mode, for devices supporting different view modes as defined in tt:viewModes

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoSourceConfigurationExtension.html b/docs/interfaces/VideoSourceConfigurationExtension.html index 5b4acd31..35be0ef2 100644 --- a/docs/interfaces/VideoSourceConfigurationExtension.html +++ b/docs/interfaces/VideoSourceConfigurationExtension.html @@ -1,78 +1,7 @@ -VideoSourceConfigurationExtension | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoSourceConfigurationExtension

    -
    -

    Hierarchy

    -
      -
    • VideoSourceConfigurationExtension
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    -
    - -
    rotate: Rotate
    -

    Optional element to configure rotation of captured image. What resolutions a device supports shall be unaffected by the Rotate parameters. +VideoSourceConfigurationExtension | onvif

    Interface VideoSourceConfigurationExtension

    interface VideoSourceConfigurationExtension {
        extension?: VideoSourceConfigurationExtension2;
        rotate: Rotate;
    }

    Properties

    Properties

    rotate: Rotate

    Optional element to configure rotation of captured image. What resolutions a device supports shall be unaffected by the Rotate parameters. If a device is configured with Rotate=AUTO, the device shall take control over the Degree parameter and automatically update it so that a client can query current rotation. The device shall automatically apply the same rotation to its pan/tilt control direction depending on the following condition: if Reverse=AUTO in PTControlDirection or if the device doesn’t support Reverse in PTControlDirection

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/VideoSourceConfigurationExtension2.html b/docs/interfaces/VideoSourceConfigurationExtension2.html index aed7c0e6..f567e02d 100644 --- a/docs/interfaces/VideoSourceConfigurationExtension2.html +++ b/docs/interfaces/VideoSourceConfigurationExtension2.html @@ -1,77 +1,5 @@ -VideoSourceConfigurationExtension2 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoSourceConfigurationExtension2

    -
    -

    Hierarchy

    -
      -
    • VideoSourceConfigurationExtension2
    -
    -
    -
    - -
    -
    -

    Properties

    -
    - -
    lensDescription?: LensDescription
    -

    Optional element describing the geometric lens distortion. Multiple instances for future variable lens support

    -
    -
    - -
    sceneOrientation: SceneOrientation
    -

    Optional element describing the scene orientation in the camera’s field of view

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +VideoSourceConfigurationExtension2 | onvif

    Interface VideoSourceConfigurationExtension2

    interface VideoSourceConfigurationExtension2 {
        lensDescription?: LensDescription;
        sceneOrientation: SceneOrientation;
    }

    Properties

    lensDescription?: LensDescription

    Optional element describing the geometric lens distortion. Multiple instances for future variable lens support

    +
    sceneOrientation: SceneOrientation

    Optional element describing the scene orientation in the camera’s field of view

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoSourceExtension.html b/docs/interfaces/VideoSourceExtension.html index 533eec98..b71c71a8 100644 --- a/docs/interfaces/VideoSourceExtension.html +++ b/docs/interfaces/VideoSourceExtension.html @@ -1,75 +1,4 @@ -VideoSourceExtension | onvif
    -
    - -
    -
    -
    -
    - -

    Interface VideoSourceExtension

    -
    -

    Hierarchy

    -
      -
    • VideoSourceExtension
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    extension?: any
    -
    - - -

    Optional configuration of the image sensor. To be used if imaging service 2.00 is supported

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +VideoSourceExtension | onvif

    Interface VideoSourceExtension

    interface VideoSourceExtension {
        extension?: any;
        imaging?: ImagingSettings20;
    }

    Properties

    Properties

    extension?: any

    Optional configuration of the image sensor. To be used if imaging service 2.00 is supported

    +
    \ No newline at end of file diff --git a/docs/interfaces/WhiteBalance.html b/docs/interfaces/WhiteBalance.html index 385bd209..93719f6a 100644 --- a/docs/interfaces/WhiteBalance.html +++ b/docs/interfaces/WhiteBalance.html @@ -1,88 +1,7 @@ -WhiteBalance | onvif
    -
    - -
    -
    -
    -
    - -

    Interface WhiteBalance

    -
    -

    Hierarchy

    -
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    cbGain: number
    -

    Bgain (unitless)

    -
    -
    - -
    crGain: number
    -

    Rgain (unitless)

    -
    -
    - -
    mode: "AUTO" | "MANUAL"
    -

    Auto whitebalancing mode (auto/manual)

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +WhiteBalance | onvif

    Interface WhiteBalance

    interface WhiteBalance {
        cbGain: number;
        crGain: number;
        mode: "AUTO" | "MANUAL";
    }

    Hierarchy (view full)

    Properties

    Properties

    cbGain: number

    Bgain (unitless)

    +
    crGain: number

    Rgain (unitless)

    +
    mode: "AUTO" | "MANUAL"

    Auto whitebalancing mode (auto/manual)

    +
    \ No newline at end of file diff --git a/docs/interfaces/WhiteBalance20.html b/docs/interfaces/WhiteBalance20.html index 6ee9a9c3..5b7bfa78 100644 --- a/docs/interfaces/WhiteBalance20.html +++ b/docs/interfaces/WhiteBalance20.html @@ -1,98 +1,8 @@ -WhiteBalance20 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface WhiteBalance20

    -
    -

    Hierarchy

    -
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    cbGain: number
    -

    Bgain (unitless)

    -
    -
    - -
    crGain: number
    -

    Rgain (unitless)

    -
    -
    - -
    extension: any
    -
    - -
    mode: "AUTO" | "MANUAL"
    -

    Auto whitebalancing mode (auto/manual)

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +WhiteBalance20 | onvif

    Interface WhiteBalance20

    interface WhiteBalance20 {
        cbGain: number;
        crGain: number;
        extension: any;
        mode: "AUTO" | "MANUAL";
    }

    Hierarchy (view full)

    Properties

    Properties

    cbGain: number

    Bgain (unitless)

    +
    crGain: number

    Rgain (unitless)

    +
    extension: any
    mode: "AUTO" | "MANUAL"

    Auto whitebalancing mode (auto/manual)

    +
    \ No newline at end of file diff --git a/docs/interfaces/WideDynamicRange.html b/docs/interfaces/WideDynamicRange.html index b9b6f84e..af4584d6 100644 --- a/docs/interfaces/WideDynamicRange.html +++ b/docs/interfaces/WideDynamicRange.html @@ -1,77 +1,5 @@ -WideDynamicRange | onvif
    -
    - -
    -
    -
    -
    - -

    Interface WideDynamicRange

    -
    -

    Hierarchy

    -
      -
    • WideDynamicRange
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    level: number
    -

    Optional level parameter (unitless)

    -
    -
    - -
    mode: "OFF" | "ON"
    -

    White dynamic range (on/off)

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +WideDynamicRange | onvif

    Interface WideDynamicRange

    interface WideDynamicRange {
        level: number;
        mode: "OFF" | "ON";
    }

    Properties

    Properties

    level: number

    Optional level parameter (unitless)

    +
    mode: "OFF" | "ON"

    White dynamic range (on/off)

    +
    \ No newline at end of file diff --git a/docs/interfaces/WideDynamicRange20.html b/docs/interfaces/WideDynamicRange20.html index e67c0a4c..2da51776 100644 --- a/docs/interfaces/WideDynamicRange20.html +++ b/docs/interfaces/WideDynamicRange20.html @@ -1,77 +1,5 @@ -WideDynamicRange20 | onvif
    -
    - -
    -
    -
    -
    - -

    Interface WideDynamicRange20

    -
    -

    Hierarchy

    -
      -
    • WideDynamicRange20
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    level?: number
    -

    Optional level parameter (unit unspecified)

    -
    -
    - -
    mode?: "OFF" | "ON"
    -

    Wide dynamic range mode (on/off)

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +WideDynamicRange20 | onvif

    Interface WideDynamicRange20

    interface WideDynamicRange20 {
        level?: number;
        mode?: "OFF" | "ON";
    }

    Properties

    Properties

    level?: number

    Optional level parameter (unit unspecified)

    +
    mode?: "OFF" | "ON"

    Wide dynamic range mode (on/off)

    +
    \ No newline at end of file diff --git a/docs/interfaces/ZoomLimits.html b/docs/interfaces/ZoomLimits.html index 768c3538..7f4a892d 100644 --- a/docs/interfaces/ZoomLimits.html +++ b/docs/interfaces/ZoomLimits.html @@ -1,66 +1,2 @@ -ZoomLimits | onvif
    -
    - -
    -
    -
    -
    - -

    Interface ZoomLimits

    -
    -

    Hierarchy

    -
      -
    • ZoomLimits
    -
    -
    -
    - -
    -
    -

    Properties

    -
    -
    -

    Properties

    -
    - -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ZoomLimits | onvif

    Interface ZoomLimits

    interface ZoomLimits {
        range: Space1DDescription;
    }

    Properties

    Properties

    \ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html index 08872581..e6df809e 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,275 +1,161 @@ -onvif
    -
    - -
    -
    -
    -
    -

    onvif

    -
    -
    -

    Index

    -
    -

    Classes

    -
    -
    -

    Interfaces

    -
    ActiveSource -AnalyticsCapabilities -AnalyticsDeviceCapabilities -AnalyticsEngineConfiguration -AudioDecoderConfiguration -AudioEncoder2Configuration -AudioEncoderConfiguration -AudioOutputConfiguration -AudioSourceConfiguration -BacklightCompensation -BacklightCompensation20 -Capabilities -CapabilitiesExtension -Config -ConfigurationSet -Defogging -DeviceCapabilities -DeviceIOCapabilities -DeviceInformation -DiscoveryOptions -DisplayCapabilities -EventCapabilities -EventSubscription -Exposure -Exposure20 -FocusConfiguration -FocusConfiguration20 -H264Configuration -IOCapabilities -IOCapabilitiesExtension -IPAddress -ImageStabilization -ImagingCapabilities -ImagingSettings -ImagingSettings20 -ImagingSettingsExtension20 -ImagingSettingsExtension202 -ImagingSettingsExtension203 -IntRectangle -IrCutFilterAutoAdjustment -ItemList -LensDescription -LensOffset -LensProjection -MediaCapabilities -MediaCapabilitiesExtension -MediaProfile -MetadataConfiguration -Mpeg4Configuration -MulticastConfiguration -NetworkCapabilities -NetworkCapabilitiesExtension -NoiseReduction -OnvifOptions -OnvifRequestOptions -OnvifService -OnvifServices -OnvifVersion -PTControlDirection -PTZCapabilities -PTZConfiguration -PTZConfigurationExtension -PTZFilter -PTZSpeed -PanTiltLimits -Profile -ProfileCapabilities -ProfileExtension -Range -RealTimeStreamingCapabilities -ReceiverCapabilities -RecordingCapabilities -Rectangle -ReplayCapabilities -Rotate -RuleEngineConfiguration -SceneOrientation -SearchCapabilities -SecurityCapabilities -SecurityCapabilitiesExtension -SecurityCapabilitiesExtension2 -Space1DDescription -Space2DDescription -SystemCapabilities -SystemCapabilitiesExtension -ToneCompensation -VideoAnalyticsConfiguration -VideoEncoder2Configuration -VideoEncoderConfiguration -VideoRateControl -VideoRateControl2 -VideoResolution -VideoSource -VideoSourceConfiguration -VideoSourceConfigurationExtension -VideoSourceConfigurationExtension2 -VideoSourceExtension -WhiteBalance -WhiteBalance20 -WideDynamicRange -WideDynamicRange20 -ZoomLimits -
    -
    -

    Type Aliases

    -
    -
    -

    Variables

    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +onvif

    onvif

    Index

    Classes

    Interfaces

    AbsoluteMoveOptions +ActiveSource +AnalyticsCapabilities +AnalyticsDeviceCapabilities +AnalyticsEngineConfiguration +AudioDecoderConfiguration +AudioEncoder2Configuration +AudioEncoderConfiguration +AudioOutputConfiguration +AudioSourceConfiguration +BacklightCompensation +BacklightCompensation20 +Capabilities +CapabilitiesExtension +Config +ConfigurationSet +ContinuousMoveOptions +Defogging +DeviceCapabilities +DeviceIOCapabilities +DeviceInformation +DeviceServiceCapabilities +DiscoveryOptions +DisplayCapabilities +Dot11Configuration +Dot11PSKSet +Dot11SecurityConfiguration +DurationRange +EventCapabilities +EventSubscription +Exposure +Exposure20 +FocusConfiguration +FocusConfiguration20 +GetPresetsOptions +GetSnapshotUriOptions +GetStatusOptions +GetStreamUriOptions +GotoHomePositionOptions +GotoPresetOptions +H264Configuration +HostnameInformation +IOCapabilities +IOCapabilitiesExtension +IPv4Configuration +IPv4NetworkInterface +IPv6Configuration +IPv6NetworkInterface +ImageStabilization +ImagingCapabilities +ImagingSettings +ImagingSettings20 +ImagingSettingsExtension20 +ImagingSettingsExtension202 +ImagingSettingsExtension203 +IntRectangle +IrCutFilterAutoAdjustment +ItemList +LensDescription +LensOffset +LensProjection +MediaCapabilities +MediaCapabilitiesExtension +MediaProfile +MetadataConfiguration +MiscCapabilities +Mpeg4Configuration +MulticastConfiguration +NetworkCapabilities +NetworkCapabilitiesExtension +NetworkInterface +NetworkInterfaceConnectionSetting +NetworkInterfaceExtension +NetworkInterfaceInfo +NetworkInterfaceLink +NoiseReduction +OnvifOptions +OnvifRequestOptions +OnvifServices +OnvifVersion +PTControlDirection +PTControlDirectionOptions +PTZCapabilities +PTZConfiguration +PTZConfigurationExtension +PTZConfigurationOptions +PTZFilter +PTZInputVector +PTZMoveStatus +PTZNode +PTZPreset +PTZPresetTourSupported +PTZSpace +PTZSpeed +PTZStatus +PTZVector +PanTiltLimits +PrefixedIPv4Address +PrefixedIPv6Address +Profile +ProfileCapabilities +ProfileExtension +Range +RealTimeStreamingCapabilities +ReceiverCapabilities +RecordingCapabilities +Rectangle +RelativeMoveOptions +RemovePresetOptions +ReplayCapabilities +Rotate +RuleEngineConfiguration +SceneOrientation +Scope +SearchCapabilities +SecurityCapabilities +SecurityCapabilitiesExtension +SecurityCapabilitiesExtension2 +SetHomePositionOptions +SetPresetOptions +SetPresetResponse +SetSystemDateAndTimeOptions +Space1DDescription +Space2DDescription +StopOptions +SystemCapabilities +SystemCapabilitiesExtension +ToneCompensation +Vector1D +Vector2D +VideoAnalyticsConfiguration +VideoEncoder2Configuration +VideoEncoderConfiguration +VideoRateControl +VideoRateControl2 +VideoResolution +VideoSource +VideoSourceConfiguration +VideoSourceConfigurationExtension +VideoSourceConfigurationExtension2 +VideoSourceExtension +WhiteBalance +WhiteBalance20 +WideDynamicRange +WideDynamicRange20 +ZoomLimits +

    Type Aliases

    Variables

    \ No newline at end of file diff --git a/docs/types/AnyURI.html b/docs/types/AnyURI.html index 73a337fb..35e4d27c 100644 --- a/docs/types/AnyURI.html +++ b/docs/types/AnyURI.html @@ -1,155 +1 @@ -AnyURI | onvif
    -
    - -
    -
    -
    -
    - -

    Type alias AnyURI

    -
    AnyURI: string
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +AnyURI | onvif

    Type Alias AnyURI

    AnyURI: string
    \ No newline at end of file diff --git a/docs/types/Duration.html b/docs/types/Duration.html index b0e51eca..2aaa84e5 100644 --- a/docs/types/Duration.html +++ b/docs/types/Duration.html @@ -1,155 +1 @@ -Duration | onvif
    -
    - -
    -
    -
    -
    - -

    Type alias Duration

    -
    Duration: string
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Duration | onvif

    Type Alias Duration

    Duration: string
    \ No newline at end of file diff --git a/docs/types/Name.html b/docs/types/Name.html index 68390a9c..779b362d 100644 --- a/docs/types/Name.html +++ b/docs/types/Name.html @@ -1,155 +1 @@ -Name | onvif
    -
    - -
    -
    -
    -
    - -

    Type alias Name

    -
    Name: string
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +Name | onvif

    Type Alias Name

    Name: string
    \ No newline at end of file diff --git a/docs/types/ReferenceToken.html b/docs/types/ReferenceToken.html index 2cc9b1b0..5faedd23 100644 --- a/docs/types/ReferenceToken.html +++ b/docs/types/ReferenceToken.html @@ -1,155 +1 @@ -ReferenceToken | onvif
    -
    - -
    -
    -
    -
    - -

    Type alias ReferenceToken

    -
    ReferenceToken: string
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +ReferenceToken | onvif

    Type Alias ReferenceToken

    ReferenceToken: string
    \ No newline at end of file diff --git a/docs/variables/Discovery.html b/docs/variables/Discovery.html index aa8def18..44eaace4 100644 --- a/docs/variables/Discovery.html +++ b/docs/variables/Discovery.html @@ -1,164 +1,9 @@ -Discovery | onvif
    -
    - -
    -
    -
    -
    - -

    Variable DiscoveryConst

    -
    Discovery: DiscoverySingleton = DiscoverySingleton.getInstance
    -

    Singleton for the discovery to provide probe method -Discovery.probe

    +Discovery | onvif

    Variable DiscoveryConst

    Discovery: DiscoverySingleton = DiscoverySingleton.getInstance

    Singleton for the discovery to provide probe method +Discovery.probe

    +
    import { Discovery } from 'onvif';
    Discovery.on('device', async (cam) => {
    // function would be called as soon as NVT responses
    cam.username = <USERNAME>;
    cam.password = <PASSWORD>;
    await cam.connect();
    })
    Discovery.probe(); +
    -

    Example

    import { Discovery } from 'onvif';
    Discovery.on('device', async (cam) => {
    // function would be called as soon as NVT responses
    cam.username = <USERNAME>;
    cam.password = <PASSWORD>;
    await cam.connect();
    })
    Discovery.probe(); -
    +
    import { Discovery } from 'onvif';
    (async () => {
    const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect());
    console.log(await cams[0]?.getSystemDateAndTime());
    })(); +
    -

    Example

    import { Discovery } from 'onvif';
    (async () => {
    const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect());
    console.log(await cams[0]?.getSystemDateAndTime());
    })(); -
    -
    -
    -
    -

    Generated using TypeDoc

    -
    \ No newline at end of file +
    \ No newline at end of file From 90827772d40eb8e182a357364cabfa752aece6c2 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 29 Jun 2024 23:23:59 +0300 Subject: [PATCH 095/112] chore: update interfaces --- src/interfaces/accesscontrol.ts | 2 +- src/interfaces/accessrules.ts | 8 ++-- src/interfaces/actionengine.ts | 22 ++++----- src/interfaces/advancedsecurity.ts | 6 +-- src/interfaces/analytics.2.ts | 32 ++++--------- src/interfaces/analyticsdevice.ts | 4 +- src/interfaces/appmgmt.ts | 15 +----- src/interfaces/basics.ts | 2 +- src/interfaces/common.ts | 2 +- src/interfaces/credential.ts | 12 ++--- src/interfaces/deviceio.ts | 21 +-------- src/interfaces/devicemgmt.ts | 10 ++-- src/interfaces/doorcontrol.ts | 18 +++---- src/interfaces/event-vs.ts | 50 ++++++-------------- src/interfaces/event.ts | 50 ++++++-------------- src/interfaces/federatedsearch.ts | 18 +++---- src/interfaces/imaging.2.ts | 21 ++++----- src/interfaces/metadatastream.ts | 8 ++-- src/interfaces/onvif.ts | 75 +++++++++++++++--------------- src/interfaces/provisioning.ts | 12 ++--- src/interfaces/ptz.2.ts | 17 +------ src/interfaces/radiometry.2.ts | 2 +- src/interfaces/receiver.ts | 14 +----- src/interfaces/recording.ts | 48 +------------------ src/interfaces/replay.ts | 12 +---- src/interfaces/rules.2.ts | 2 +- src/interfaces/search.ts | 22 ++++----- src/interfaces/thermal.ts | 6 +-- src/interfaces/uplink.ts | 10 +--- 29 files changed, 167 insertions(+), 354 deletions(-) diff --git a/src/interfaces/accesscontrol.ts b/src/interfaces/accesscontrol.ts index bd181bb2..71dedf82 100644 --- a/src/interfaces/accesscontrol.ts +++ b/src/interfaces/accesscontrol.ts @@ -97,7 +97,7 @@ export interface AccessPointInfoBase extends DataEntity { * extensions; it will allow an access point being extended to cover entity types * other than doors as well. */ - entityType?: any; + entityType?: unknown; /** * Reference to the entity used to control access; the entity type * may be specified by the optional EntityType field explained below but is diff --git a/src/interfaces/accessrules.ts b/src/interfaces/accessrules.ts index bfb03990..819cf06c 100644 --- a/src/interfaces/accessrules.ts +++ b/src/interfaces/accessrules.ts @@ -12,11 +12,11 @@ export interface ServiceCapabilities { * request. The device shall never return more than this number of entities in a single * response. */ - maxLimit: any; + maxLimit: unknown; /** Indicates the maximum number of access profiles supported by the device. */ - maxAccessProfiles: any; + maxAccessProfiles: unknown; /** Indicates the maximum number of access policies per access profile supported by the device. */ - maxAccessPoliciesPerAccessProfile: any; + maxAccessPoliciesPerAccessProfile: unknown; /** * Indicates whether or not several access policies can refer to the same access point in an * access profile. @@ -49,7 +49,7 @@ export interface AccessPolicy { * Service Specification. This field is provided for future extensions; it will allow an * access policy being extended to cover entity types other than access points as well. */ - entityType?: any; + entityType?: unknown; extension?: AccessPolicyExtension; } export interface AccessPolicyExtension {} diff --git a/src/interfaces/actionengine.ts b/src/interfaces/actionengine.ts index 334c05e4..c7b91f53 100644 --- a/src/interfaces/actionengine.ts +++ b/src/interfaces/actionengine.ts @@ -11,7 +11,7 @@ export type FileSuffixType = 'none' | 'sequence' | 'dateTime' | 'Extended'; /** Describes the configuration parameters of an action. */ export interface ActionConfigDescription { /** Action type name */ - name: any; + name: unknown; /** Action configuration parameter descriptions */ parameterDescription?: ItemListDescription; } @@ -38,7 +38,7 @@ export interface ActionEngineCapabilitiesExtension {} /** ActionTypeLimits data structure contains maximum and current usage information for a specific action type in the service provider */ export interface ActionTypeLimits { /** Action Type */ - type: any; + type: unknown; /** For the specific action type, the maximum number of actions that could be concurrently supported by the service provider */ maximum: PositiveInteger; /** For the specific action type, the number of actions in use by the service provider */ @@ -49,7 +49,7 @@ export interface ActionConfiguration { /** User given name. */ name: string; /** Denotes the action type. */ - type: any; + type: unknown; /** Action configuration parameter settings. */ parameters?: ItemList; } @@ -63,9 +63,9 @@ export interface Action { /** Action Trigger configuration data type contains mandatory Topic Expression (Section Topic Filter in [Core Specification]), optional Message content expression (Section Message Content Filter in [Core Specification]), and set of actions to be triggered. */ export interface ActionTriggerConfiguration { /** Topic expression, for example, to trigger only for relays. Trigger based on event topic. */ - topicExpression?: any; + topicExpression?: unknown; /** Content expression, for example, to trigger only when the relay value is on. Trigger based on content data in event. */ - contentExpression?: any; + contentExpression?: unknown; /** Reference to actions to be triggered when the conditions are satisfied. */ actionToken?: ReferenceToken[]; extension?: ActionTriggerConfigurationExtension; @@ -109,7 +109,7 @@ export interface UserCredentials { /** Username */ username?: string; /** Password */ - password?: any; + password?: unknown; extension?: UserCredentialsExtension; } export interface UserCredentialsExtension {} @@ -245,9 +245,9 @@ export interface FtpContentConfiguration { } export interface FtpContentConfigurationUploadImages { /** Upload Image action; how long? */ - howLong?: any; + howLong?: unknown; /** Upload Image action; sample interval? */ - sampleInterval?: any; + sampleInterval?: unknown; /** Upload Image action; name of destination file */ fileName?: FtpFileNameConfigurations; } @@ -273,11 +273,11 @@ export interface SMSMessage { } export interface TriggeredRecordingConfiguration { /** Length of recording time before the triggering event */ - preRecordDuration?: any; + preRecordDuration?: unknown; /** Recording after alarm recording duration */ - postRecordDuration?: any; + postRecordDuration?: unknown; /** Record duration */ - recordDuration?: any; + recordDuration?: unknown; /** Recording frame rate */ recordFrameRate?: PositiveInteger; /** Whether Audio recording on/off */ diff --git a/src/interfaces/advancedsecurity.ts b/src/interfaces/advancedsecurity.ts index edd6aff3..08233ec3 100644 --- a/src/interfaces/advancedsecurity.ts +++ b/src/interfaces/advancedsecurity.ts @@ -21,7 +21,7 @@ export type DotDecimalOID = string; export type DNAttributeType = string; export type DNAttributeValue = string; /** A base64-encoded ASN.1 value. */ -export type Base64DERencodedASN1Value = any; +export type Base64DERencodedASN1Value = unknown; /** A list of supported 802.1X authentication methods, such as "EAP-PEAP/MSCHAPv2" and "EAP-MD5". The '/' character is used as a separator between the outer and inner methods. */ export type Dot1XMethods = string[]; export type CRLID = NCName; @@ -393,7 +393,7 @@ export interface CreateRSAKeyPairResponse { /** The key ID of the key pair being generated. */ keyID?: KeyID; /** Best-effort estimate of how long the key generation will take. */ - estimatedCreationTime?: any; + estimatedCreationTime?: unknown; } export interface CreateECCKeyPair { /** The name of the elliptic curve to be used for generating the ECC keypair. */ @@ -405,7 +405,7 @@ export interface CreateECCKeyPairResponse { /** The key ID of the key pair being generated. */ keyID?: KeyID; /** Best-effort estimate of how long the key generation will take. */ - estimatedCreationTime?: any; + estimatedCreationTime?: unknown; } export interface UploadKeyPairInPKCS8 { /** The key pair to be uploaded in a PKCS#8 data structure. */ diff --git a/src/interfaces/analytics.2.ts b/src/interfaces/analytics.2.ts index 5fe7694a..f0f910fc 100644 --- a/src/interfaces/analytics.2.ts +++ b/src/interfaces/analytics.2.ts @@ -1,26 +1,10 @@ -import { StringList, SupportedRules, Config, SupportedAnalyticsModules } from './onvif'; +import { StringList, Capabilities, SupportedRules, Config, SupportedAnalyticsModules } from './onvif'; import { Frame } from './metadatastream'; import { ReferenceToken } from './common'; -export interface Capabilities { - /** Indication that the device supports the rules interface and the rules syntax. */ - ruleSupport?: boolean; - /** Indication that the device supports the scene analytics module interface. */ - analyticsModuleSupport?: boolean; - /** Indication that the device produces the cell based scene description */ - cellBasedSceneDescriptionSupported?: boolean; - /** Indication that the device supports the GetRuleOptions operation on the rules interface */ - ruleOptionsSupported?: boolean; - /** Indication that the device supports the GetAnalyticsModuleOptions operation on the analytics interface */ - analyticsModuleOptionsSupported?: boolean; - /** Indication that the device supports the GetSupportedMetadata operation. */ - supportedMetadata?: boolean; - /** Indication what kinds of method that the device support for sending image, acceptable values are defined in tt:ImageSendingType. */ - imageSendingType?: StringList; -} export interface ConfigOptions { /** The RuleType the ConfigOptions applies to if the Name attribute is ambiguous. */ - ruleType?: any; + ruleType?: unknown; /** * The Name of the SimpleItemDescription/ElementItemDescription * the ConfigOptions applies to. @@ -31,9 +15,9 @@ export interface ConfigOptions { * The Type defines the element contained in this structure. * This attribute is deprecated since its value must be identical to the embedded element. */ - type?: any; + type?: unknown; /** Optional name of the analytics module this constraint applies to. This option is only necessary in cases where different constraints for elements with the same Name exist. */ - analyticsModule?: any; + analyticsModule?: unknown; /** Minimal number of occurrences. Defaults to one. */ minOccurs?: number; /** Maximum number of occurrences. Defaults to one. */ @@ -41,7 +25,7 @@ export interface ConfigOptions { } export interface MetadataInfo { /** Reference to an AnalyticsModule Type. */ - type: any; + type: unknown; /** Sample frame content starting with the tt:Frame node. */ sampleFrame?: Frame; } @@ -85,7 +69,7 @@ export interface GetRulesResponse { } export interface GetRuleOptions { /** Reference to an SupportedRule Type returned from GetSupportedRules. */ - ruleType?: any; + ruleType?: unknown; /** Reference to an existing analytics configuration. */ configurationToken?: ReferenceToken; } @@ -125,7 +109,7 @@ export interface GetAnalyticsModulesResponse { } export interface GetAnalyticsModuleOptions { /** Reference to an SupportedAnalyticsModule Type returned from GetSupportedAnalyticsModules. */ - type?: any; + type?: unknown; /** Reference to an existing AnalyticsConfiguration. */ configurationToken?: ReferenceToken; } @@ -135,7 +119,7 @@ export interface GetAnalyticsModuleOptionsResponse { } export interface GetSupportedMetadata { /** Optional reference to an AnalyticsModule Type returned from GetSupportedAnalyticsModules. */ - type?: any; + type?: unknown; } export interface GetSupportedMetadataResponse { analyticsModule?: MetadataInfo[]; diff --git a/src/interfaces/analyticsdevice.ts b/src/interfaces/analyticsdevice.ts index ace4a32b..148ae65d 100644 --- a/src/interfaces/analyticsdevice.ts +++ b/src/interfaces/analyticsdevice.ts @@ -1,5 +1,5 @@ -import { ReferenceToken } from './common'; import { + Capabilities, AnalyticsEngineInput, AnalyticsEngineControl, AnalyticsEngine, @@ -7,9 +7,9 @@ import { StreamSetup, AnalyticsStateInformation, } from './onvif'; +import { ReferenceToken } from './common'; import { AnyURI } from './basics'; -export interface Capabilities {} export interface GetServiceCapabilities {} export interface GetServiceCapabilitiesResponse { /** The capabilities for the analytics device service is returned in the Capabilities element. */ diff --git a/src/interfaces/appmgmt.ts b/src/interfaces/appmgmt.ts index 4babbae4..b2a528cd 100644 --- a/src/interfaces/appmgmt.ts +++ b/src/interfaces/appmgmt.ts @@ -1,4 +1,4 @@ -import { Date, StringAttrList } from './onvif'; +import { Date, StringAttrList, Capabilities } from './onvif'; import { AnyURI } from './basics'; export type AppState = 'Active' | 'Inactive' | 'Installing' | 'Uninstalling' | 'Removed' | 'InstallationFailed'; @@ -40,19 +40,6 @@ export interface LicenseInfo { /** End time of validity */ validUntil?: Date; } -export interface Capabilities { - /** List of supported app container formats that can be uploaded via this service. */ - formatsSupported?: StringAttrList; - /** Signals support for licensing of applications. */ - licensing?: boolean; - /** - * Path part of the URI to which applications can be uploaded via http POST. - * Clients shall use protocol, hostname and port of the service address since the device may e.g. reside behind NAT translation firewall. - */ - uploadPath?: AnyURI; - /** Optional Event Topic prefix used when delivering app events in eventservice. */ - eventTopicPrefix?: string; -} export interface Uninstall { /** App to be uninstalled. Possible failures during deinstallation will be delivered via an event. */ appID?: string; diff --git a/src/interfaces/basics.ts b/src/interfaces/basics.ts index 3788d385..e04d29c1 100644 --- a/src/interfaces/basics.ts +++ b/src/interfaces/basics.ts @@ -1,4 +1,4 @@ /* eslint-disable import/export, no-tabs */ export type AnyURI = string; -export type FilterType = any; +export type FilterType = object; export type NCName = string; diff --git a/src/interfaces/common.ts b/src/interfaces/common.ts index d5073f5c..1b058875 100644 --- a/src/interfaces/common.ts +++ b/src/interfaces/common.ts @@ -122,7 +122,7 @@ export interface ColorCluster { } export interface ColorDescriptor { colorCluster?: ColorCluster[]; - extension?: any; + extension?: unknown; } export interface Transformation { translate?: Vector; diff --git a/src/interfaces/credential.ts b/src/interfaces/credential.ts index b40ed758..d4226218 100644 --- a/src/interfaces/credential.ts +++ b/src/interfaces/credential.ts @@ -46,7 +46,7 @@ export interface ServiceCapabilities { * the wrong PIN a predetermined number of times). * The time period is defined as an [ISO 8601] duration string (e.g. “PT5M”). */ - defaultCredentialSuspensionDuration?: any; + defaultCredentialSuspensionDuration?: unknown; /** The maximum number of whitelisted credential identifiers supported by the device. */ maxWhitelistedItems?: number; /** The maximum number of blacklisted credential identifiers supported by the device. */ @@ -81,7 +81,7 @@ export interface CredentialInfo extends DataEntity { * reference is a username or used ID in an external system, such as a directory * service. */ - credentialHolderReference?: any; + credentialHolderReference?: unknown; /** * The start date/time validity of the credential. If the * ValiditySupportsTimeValue capability is set to false, then only date is @@ -143,7 +143,7 @@ export interface CredentialIdentifier { */ exemptedFromAuthentication?: boolean; /** The value of the identifier in hexadecimal representation. */ - value?: any; + value?: unknown; } /** * Specifies the name of credential identifier type and its format for the credential @@ -251,7 +251,7 @@ export interface CredentialIdentifierItem { /** Contains the details of the credential identifier type. */ type?: CredentialIdentifierType; /** The value of the identifier in hexadecimal representation. */ - value?: any; + value?: unknown; } /** Contains information about a format type. */ export interface FaultResponse { @@ -459,7 +459,7 @@ export interface GetWhitelist { /** Get only whitelisted credential identifiers with the specified identifier format type. */ formatType?: string; /** Get only whitelisted credential identifiers with the specified identifier value. */ - value?: any; + value?: unknown; } export interface GetWhitelistResponse { /** StartReference to use in next call to get the following items. If absent, no more items to get. */ @@ -495,7 +495,7 @@ export interface GetBlacklist { /** Get only blacklisted credential identifiers with the specified identifier format type. */ formatType?: string; /** Get only blacklisted credential identifiers with the specified identifier value. */ - value?: any; + value?: unknown; } export interface GetBlacklistResponse { /** StartReference to use in next call to get the following items. If absent, no more items to get. */ diff --git a/src/interfaces/deviceio.ts b/src/interfaces/deviceio.ts index daa33f03..9d3c4f95 100644 --- a/src/interfaces/deviceio.ts +++ b/src/interfaces/deviceio.ts @@ -6,6 +6,7 @@ import { DeviceEntity, IntItems, FloatItems, + Capabilities, VideoOutput, AudioSourceConfiguration, AudioOutputConfiguration, @@ -29,24 +30,6 @@ export type SerialPortType = | 'Generic'; /** The parity for the data error detection. */ export type ParityBit = 'None' | 'Even' | 'Odd' | 'Mark' | 'Space' | 'Extended'; -export interface Capabilities { - /** Number of video sources (defaults to none). */ - videoSources?: number; - /** Number of video outputs (defaults to none). */ - videoOutputs?: number; - /** Number of audio sources (defaults to none). */ - audioSources?: number; - /** Number of audio outputs (defaults to none). */ - audioOutputs?: number; - /** Number of relay outputs (defaults to none). */ - relayOutputs?: number; - /** Number of serial ports (defaults to none). */ - serialPorts?: number; - /** Number of digital inputs (defaults to none). */ - digitalInputs?: number; - /** Indicates support for DigitalInput configuration of the idle state (defaults to false). */ - digitalInputOptions?: boolean; -} export interface RelayOutputOptions { /** Token of the relay output. */ token: ReferenceToken; @@ -266,7 +249,7 @@ export interface SendReceiveSerialCommand { /** The serial port data. */ serialData?: SerialData; /** Indicates that the command should be responded back within the specified period of time. */ - timeOut?: any; + timeOut?: unknown; /** This element may be put in the case that data length returned from the connected serial device is already determined as some fixed bytes length. It indicates the length of received data which can be regarded as available. */ dataLength?: number; /** This element may be put in the case that the delimiter codes returned from the connected serial device is already known. It indicates the termination data sequence of the responded data. In case the string has more than one character a device shall interpret the whole string as a single delimiter. Furthermore a device shall return the delimiter character(s) to the client. */ diff --git a/src/interfaces/devicemgmt.ts b/src/interfaces/devicemgmt.ts index 96e3715e..167cbe98 100644 --- a/src/interfaces/devicemgmt.ts +++ b/src/interfaces/devicemgmt.ts @@ -1,5 +1,6 @@ import { AnyURI } from './basics'; import { + Capabilities, OnvifVersion, IntList, StringList, @@ -56,7 +57,6 @@ import { IntRange, ReferenceToken, LocationEntity } from './common'; export type AutoGeoModes = 'Location' | 'Heading' | 'Leveling'; export type StorageType = 'NFS' | 'CIFS' | 'CDMI' | 'FTP' | 'ObjectStorageS3' | 'ObjectStorageAzure'; -export interface Capabilities {} export interface Service { /** Namespace of the service being described. This parameter allows to match the service capabilities to the service. Note that only one set of capabilities is supported per namespace. */ namespace?: AnyURI; @@ -496,7 +496,7 @@ export interface SetDynamicDNS { /** DNS name. */ name?: DNSName; /** DNS record time to live. */ - TTL?: any; + TTL?: unknown; } export interface SetDynamicDNSResponse {} export interface GetNetworkInterfaces {} @@ -728,13 +728,13 @@ export interface GetSystemUrisResponse { export interface StartFirmwareUpgrade {} export interface StartFirmwareUpgradeResponse { uploadUri?: AnyURI; - uploadDelay?: any; - expectedDownTime?: any; + uploadDelay?: unknown; + expectedDownTime?: unknown; } export interface StartSystemRestore {} export interface StartSystemRestoreResponse { uploadUri?: AnyURI; - expectedDownTime?: any; + expectedDownTime?: unknown; } export interface SetHashingAlgorithm { /** Hashing algorithm(s) used in HTTP and RTSP Digest Authentication. */ diff --git a/src/interfaces/doorcontrol.ts b/src/interfaces/doorcontrol.ts index aa023446..ea673b50 100644 --- a/src/interfaces/doorcontrol.ts +++ b/src/interfaces/doorcontrol.ts @@ -98,36 +98,36 @@ export interface Timings { * ReleaseTime is the time from when the latch is unlocked until it is * relocked again (unless the door is physically opened). */ - releaseTime?: any; + releaseTime?: unknown; /** * The time from when the door is physically opened until the door is set in the * DoorOpenTooLong alarm state. */ - openTime?: any; + openTime?: unknown; /** * Some individuals need extra time to open the door before the latch relocks. * If supported, ExtendedReleaseTime shall be added to ReleaseTime if UseExtendedTime * is set to true in the AccessDoor command. */ - extendedReleaseTime?: any; + extendedReleaseTime?: unknown; /** * If the door is physically opened after access is granted, * then DelayTimeBeforeRelock is the time from when the door is physically * opened until the latch goes back to locked state. */ - delayTimeBeforeRelock?: any; + delayTimeBeforeRelock?: unknown; /** * Some individuals need extra time to pass through the door. If supported, * ExtendedOpenTime shall be added to OpenTime if UseExtendedTime is set to true * in the AccessDoor command. */ - extendedOpenTime?: any; + extendedOpenTime?: unknown; /** * Before a DoorOpenTooLong alarm state is generated, a signal will sound to indicate * that the door must be closed. PreAlarmTime defines how long before DoorOpenTooLong * the warning signal shall sound. */ - preAlarmTime?: any; + preAlarmTime?: unknown; extension?: TimingsExtension; } export interface TimingsExtension {} @@ -389,11 +389,11 @@ export interface AccessDoor { */ useExtendedTime?: boolean; /** Optional - overrides ReleaseTime if specified. */ - accessTime?: any; + accessTime?: unknown; /** Optional - overrides OpenTime if specified. */ - openTooLongTime?: any; + openTooLongTime?: unknown; /** Optional - overrides PreAlarmTime if specified. */ - preAlarmTime?: any; + preAlarmTime?: unknown; /** Future extension. */ extension?: AccessDoorExtension; } diff --git a/src/interfaces/event-vs.ts b/src/interfaces/event-vs.ts index 24506fc9..9a6ae95a 100644 --- a/src/interfaces/event-vs.ts +++ b/src/interfaces/event-vs.ts @@ -1,28 +1,8 @@ -import { AnyURI } from './basics'; -import { Date } from './onvif'; +import { AnyURI, FilterType } from './basics'; +import { Capabilities, Date } from './onvif'; export type EventBrokerProtocol = 'mqtt' | 'mqtts' | 'ws' | 'wss'; export type ConnectionStatus = 'Offline' | 'Connecting' | 'Connected'; -export interface Capabilities { - /** Indicates that the WS Subscription policy is supported. */ - WSSubscriptionPolicySupport?: boolean; - /** Indicates that the WS Pull Point is supported. */ - WSPullPointSupport?: boolean; - /** Indicates that the WS Pausable Subscription Manager Interface is supported. */ - WSPausableSubscriptionManagerInterfaceSupport?: boolean; - /** Maximum number of supported notification producers as defined by WS-BaseNotification. */ - maxNotificationProducers?: number; - /** Maximum supported number of notification pull points. */ - maxPullPoints?: number; - /** Indication if the device supports persistent notification storage. */ - persistentNotificationStorage?: boolean; - /** A space separated list of supported event broker protocols as defined by the tev:EventBrokerProtocol datatype. */ - eventBrokerProtocols?: string; - /** Maxiumum number of event broker configurations that can be added to the device. */ - maxEventBrokers?: number; - /** Indicates that metadata streaming over MQTT is supported */ - metadataOverMQTT?: boolean; -} export interface EventBrokerConfig { /** Event broker address in the format "scheme://host:port[/resource]". The supported schemes shall be returned by the EventBrokerProtocols capability. The resource part of the URL is only valid when using websocket. The Address must be unique. */ address?: AnyURI; @@ -35,7 +15,7 @@ export interface EventBrokerConfig { /** Optional certificate ID in the key store pointing to a client certificate to be used for authenticating the device at the message broker. */ certificateID?: string; /** Concrete Topic Expression to select specific event topics to publish. */ - publishFilter?: any; + publishFilter?: FilterType; /** Quality of service level to use when publishing. This defines the guarantee of delivery for a specific message: 0 = At most once, 1 = At least once, 2 = Exactly once. */ qoS?: number; /** Current connection status (see tev:ConnectionStatus for possible values). */ @@ -43,7 +23,7 @@ export interface EventBrokerConfig { /** The ID of the certification path validation policy used to validate the broker certificate. In case encryption is used but no validation policy is specified, the device shall not validate the broker certificate. */ certPathValidationPolicyID?: string; /** Concrete Topic Expression to select specific metadata topics to publish. */ - metadataFilter?: any; + metadataFilter?: FilterType; } export interface GetServiceCapabilities {} export interface GetServiceCapabilitiesResponse { @@ -53,23 +33,23 @@ export interface GetServiceCapabilitiesResponse { export interface SubscriptionPolicy {} export interface CreatePullPointSubscription { /** Optional XPATH expression to select specific topics. */ - filter?: any; + filter?: FilterType; /** Initial termination time. */ - initialTerminationTime?: any; + initialTerminationTime?: unknown; /** Refer to Web Services Base Notification 1.3 (WS-BaseNotification). */ subscriptionPolicy?: SubscriptionPolicy; } export interface CreatePullPointSubscriptionResponse { /** Endpoint reference of the subscription to be used for pulling the messages. */ - subscriptionReference?: any; + subscriptionReference?: unknown; /** Current time of the server for synchronization purposes. */ - urrentTime?: any; + urrentTime?: unknown; /** Date time when the PullPoint will be shut down without further pull requests. */ - erminationTime?: any; + erminationTime?: unknown; } export interface PullMessages { /** Maximum time to block until this method returns. */ - timeout?: any; + timeout?: unknown; /** Upper limit for the number of messages to return at once. A server implementation may decide to return less messages. */ messageLimit?: number; } @@ -79,11 +59,11 @@ export interface PullMessagesResponse { /** Date time when the PullPoint will be shut down without further pull requests. */ terminationTime?: Date; /** List of messages. This list shall be empty in case of a timeout. */ - otificationMessage?: any[]; + otificationMessage?: unknown[]; } export interface PullMessagesFaultResponse { /** Maximum timeout supported by the device. */ - maxTimeout?: any; + maxTimeout?: unknown; /** Maximum message limit supported by the device. */ maxMessageLimit?: number; } @@ -101,9 +81,9 @@ export interface GetEventPropertiesResponse { /** List of topic namespaces supported. */ topicNamespaceLocation?: AnyURI[]; /** True when topicset is fixed for all times. */ - ixedTopicSet?: any; + ixedTopicSet?: unknown; /** Set of topics supported. */ - topicSet?: any; + topicSet?: unknown; /** * Defines the XPath expression syntax supported for matching topic expressions. * The following TopicExpressionDialects are mandatory for an ONVIF compliant device : @@ -112,7 +92,7 @@ export interface GetEventPropertiesResponse { * http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet. * */ - opicExpressionDialect?: any[]; + opicExpressionDialect?: unknown[]; /** * Defines the XPath function set supported for message content filtering. * The following MessageContentFilterDialects should be returned if a device supports the message content filtering: diff --git a/src/interfaces/event.ts b/src/interfaces/event.ts index 24506fc9..9a6ae95a 100644 --- a/src/interfaces/event.ts +++ b/src/interfaces/event.ts @@ -1,28 +1,8 @@ -import { AnyURI } from './basics'; -import { Date } from './onvif'; +import { AnyURI, FilterType } from './basics'; +import { Capabilities, Date } from './onvif'; export type EventBrokerProtocol = 'mqtt' | 'mqtts' | 'ws' | 'wss'; export type ConnectionStatus = 'Offline' | 'Connecting' | 'Connected'; -export interface Capabilities { - /** Indicates that the WS Subscription policy is supported. */ - WSSubscriptionPolicySupport?: boolean; - /** Indicates that the WS Pull Point is supported. */ - WSPullPointSupport?: boolean; - /** Indicates that the WS Pausable Subscription Manager Interface is supported. */ - WSPausableSubscriptionManagerInterfaceSupport?: boolean; - /** Maximum number of supported notification producers as defined by WS-BaseNotification. */ - maxNotificationProducers?: number; - /** Maximum supported number of notification pull points. */ - maxPullPoints?: number; - /** Indication if the device supports persistent notification storage. */ - persistentNotificationStorage?: boolean; - /** A space separated list of supported event broker protocols as defined by the tev:EventBrokerProtocol datatype. */ - eventBrokerProtocols?: string; - /** Maxiumum number of event broker configurations that can be added to the device. */ - maxEventBrokers?: number; - /** Indicates that metadata streaming over MQTT is supported */ - metadataOverMQTT?: boolean; -} export interface EventBrokerConfig { /** Event broker address in the format "scheme://host:port[/resource]". The supported schemes shall be returned by the EventBrokerProtocols capability. The resource part of the URL is only valid when using websocket. The Address must be unique. */ address?: AnyURI; @@ -35,7 +15,7 @@ export interface EventBrokerConfig { /** Optional certificate ID in the key store pointing to a client certificate to be used for authenticating the device at the message broker. */ certificateID?: string; /** Concrete Topic Expression to select specific event topics to publish. */ - publishFilter?: any; + publishFilter?: FilterType; /** Quality of service level to use when publishing. This defines the guarantee of delivery for a specific message: 0 = At most once, 1 = At least once, 2 = Exactly once. */ qoS?: number; /** Current connection status (see tev:ConnectionStatus for possible values). */ @@ -43,7 +23,7 @@ export interface EventBrokerConfig { /** The ID of the certification path validation policy used to validate the broker certificate. In case encryption is used but no validation policy is specified, the device shall not validate the broker certificate. */ certPathValidationPolicyID?: string; /** Concrete Topic Expression to select specific metadata topics to publish. */ - metadataFilter?: any; + metadataFilter?: FilterType; } export interface GetServiceCapabilities {} export interface GetServiceCapabilitiesResponse { @@ -53,23 +33,23 @@ export interface GetServiceCapabilitiesResponse { export interface SubscriptionPolicy {} export interface CreatePullPointSubscription { /** Optional XPATH expression to select specific topics. */ - filter?: any; + filter?: FilterType; /** Initial termination time. */ - initialTerminationTime?: any; + initialTerminationTime?: unknown; /** Refer to Web Services Base Notification 1.3 (WS-BaseNotification). */ subscriptionPolicy?: SubscriptionPolicy; } export interface CreatePullPointSubscriptionResponse { /** Endpoint reference of the subscription to be used for pulling the messages. */ - subscriptionReference?: any; + subscriptionReference?: unknown; /** Current time of the server for synchronization purposes. */ - urrentTime?: any; + urrentTime?: unknown; /** Date time when the PullPoint will be shut down without further pull requests. */ - erminationTime?: any; + erminationTime?: unknown; } export interface PullMessages { /** Maximum time to block until this method returns. */ - timeout?: any; + timeout?: unknown; /** Upper limit for the number of messages to return at once. A server implementation may decide to return less messages. */ messageLimit?: number; } @@ -79,11 +59,11 @@ export interface PullMessagesResponse { /** Date time when the PullPoint will be shut down without further pull requests. */ terminationTime?: Date; /** List of messages. This list shall be empty in case of a timeout. */ - otificationMessage?: any[]; + otificationMessage?: unknown[]; } export interface PullMessagesFaultResponse { /** Maximum timeout supported by the device. */ - maxTimeout?: any; + maxTimeout?: unknown; /** Maximum message limit supported by the device. */ maxMessageLimit?: number; } @@ -101,9 +81,9 @@ export interface GetEventPropertiesResponse { /** List of topic namespaces supported. */ topicNamespaceLocation?: AnyURI[]; /** True when topicset is fixed for all times. */ - ixedTopicSet?: any; + ixedTopicSet?: unknown; /** Set of topics supported. */ - topicSet?: any; + topicSet?: unknown; /** * Defines the XPath expression syntax supported for matching topic expressions. * The following TopicExpressionDialects are mandatory for an ONVIF compliant device : @@ -112,7 +92,7 @@ export interface GetEventPropertiesResponse { * http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet. * */ - opicExpressionDialect?: any[]; + opicExpressionDialect?: unknown[]; /** * Defines the XPath function set supported for message content filtering. * The following MessageContentFilterDialects should be returned if a device supports the message content filtering: diff --git a/src/interfaces/federatedsearch.ts b/src/interfaces/federatedsearch.ts index 4ce62749..2442cc13 100644 --- a/src/interfaces/federatedsearch.ts +++ b/src/interfaces/federatedsearch.ts @@ -1,10 +1,10 @@ import { AnyURI } from './basics'; +import { Capabilities } from './onvif'; /** Corresponds to SimpleTermType definition in ISO/IEC 15938-12 */ export type SimpleTermType = AnyURI; /** Corresponds to mimeType definition in ISO/IEC 15938-12 */ export type mimeType = string; -export interface Capabilities {} /** * Contains features provided by a database, formatted according to * presets defined in ISO/IEC 15938-12 @@ -16,8 +16,8 @@ export interface RegisterDatabaseExtension {} export interface CapabilityType { supportedQFProfile?: TermType; supportedMetadata?: AnyURI[]; - supportedExampleMediaTypes?: any; - supportedResultMediaTypes?: any; + supportedExampleMediaTypes?: unknown; + supportedResultMediaTypes?: unknown; supportedQueryTypes?: TermType[]; supportedExpressions?: TermType[]; } @@ -37,7 +37,7 @@ export interface GetServiceFeatures { * capabilities and may contain the ID for a particular service to * be addressed. */ - inputCapabilities?: any; + inputCapabilities?: unknown; } export interface GetServiceFeaturesResponse { /** @@ -46,7 +46,7 @@ export interface GetServiceFeaturesResponse { * service is available or matches the given capabilities, then an * empty Output element is returned. */ - outputCapabilities?: any; + outputCapabilities?: unknown; } export interface Search { /** @@ -55,7 +55,7 @@ export interface Search { * structure and content of the output query format and a * declaration part. */ - inputQuery?: any; + inputQuery?: unknown; } export interface SearchResponse { /** @@ -63,20 +63,20 @@ export interface SearchResponse { * a requester. It may contain in addition messages such as error * and exception. */ - outputQuery?: any; + outputQuery?: unknown; } export interface GetSearchResults { /** * Allows to request the results of a previous query * issued. */ - results?: any; + results?: unknown; } export interface GetSearchResultsResponse { /** * Describes a single result returned from a * responder. */ - resultItem?: any[]; + resultItem?: unknown[]; } export interface RegisterDatabaseResponse {} diff --git a/src/interfaces/imaging.2.ts b/src/interfaces/imaging.2.ts index 8da99657..fd938ba9 100644 --- a/src/interfaces/imaging.2.ts +++ b/src/interfaces/imaging.2.ts @@ -1,5 +1,13 @@ import { ReferenceToken } from './common'; -import { Name, ImagingSettings20, ImagingOptions20, FocusMove, MoveOptions20, ImagingStatus20 } from './onvif'; +import { + Name, + Capabilities, + ImagingSettings20, + ImagingOptions20, + FocusMove, + MoveOptions20, + ImagingStatus20, +} from './onvif'; /** * Describes standard Imaging Preset types, used to facilitate Multi-language support and client display. @@ -29,17 +37,6 @@ export type ImagingPresetType = | 'Motion' | 'FlickerFree50' | 'FlickerFree60'; -export interface Capabilities { - /** - * Indicates whether or not Image Stabilization feature is supported. - * The use of this capability is deprecated, a client should use GetOption to find out if image stabilization is supported. - */ - imageStabilization?: boolean; - /** Indicates whether or not Imaging Presets feature is supported. */ - presets?: boolean; - /** Indicates whether or not imaging preset settings can be updated. */ - adaptablePreset?: boolean; -} /** Type describing the Imaging Preset settings. */ export interface ImagingPreset { /** Unique identifier of this Imaging Preset. */ diff --git a/src/interfaces/metadatastream.ts b/src/interfaces/metadatastream.ts index 113a0c02..975a3c70 100644 --- a/src/interfaces/metadatastream.ts +++ b/src/interfaces/metadatastream.ts @@ -60,7 +60,7 @@ export interface Appearance { humanFace?: HumanFace; humanBody?: HumanBody; imageRef?: AnyURI; - image?: any; + image?: unknown; barcodeInfo?: BarcodeInfo; sphericalCoordinate?: SphericalCoordinate; } @@ -131,11 +131,11 @@ export interface Frame { source?: string; PTZStatus?: PTZStatus; transformation?: Transformation; - object?: any[]; + object?: unknown[]; objectTree?: ObjectTree; extension?: FrameExtension; sceneImageRef?: AnyURI; - sceneImage?: any; + sceneImage?: unknown; } export interface FrameExtension { motionInCells?: MotionInCells; @@ -182,7 +182,7 @@ export interface MotionInCells { /** Number of rows of the cell grid (y dimension) */ rows: number; /** A “1” denotes a cell where motion is detected and a “0” an empty cell. The first cell is in the upper left corner. Then the cell order goes first from left to right and then from up to down. If the number of cells is not a multiple of 8 the last byte is filled with zeros. The information is run length encoded according to Packbit coding in ISO 12369 (TIFF, Revision 6.0). */ - cells: any; + cells: unknown; } export interface MetadataStream {} export interface MetadataStreamExtension { diff --git a/src/interfaces/onvif.ts b/src/interfaces/onvif.ts index 57f6fad5..7877e3ae 100644 --- a/src/interfaces/onvif.ts +++ b/src/interfaces/onvif.ts @@ -10,7 +10,7 @@ import { Transformation, Color, } from './common'; -import { AnyURI, FilterType } from './basics'; +import { FilterType, AnyURI } from './basics'; /** User readable name. Length up to 64 characters. */ export type Name = string; @@ -60,11 +60,11 @@ export type DNSName = string; export type Domain = string; export type IPAddressFilterType = 'Allow' | 'Deny'; export type DynamicDNSType = 'NoUpdate' | 'ClientUpdates' | 'ServerUpdates'; -export type Dot11SSIDType = any; +export type Dot11SSIDType = unknown; export type Dot11StationMode = 'Ad-hoc' | 'Infrastructure' | 'Extended'; export type Dot11SecurityMode = 'None' | 'WEP' | 'PSK' | 'Dot1X' | 'Extended'; export type Dot11Cipher = 'CCMP' | 'TKIP' | 'Any' | 'Extended'; -export type Dot11PSK = any; +export type Dot11PSK = unknown; export type Dot11PSKPassphrase = string; export type Dot11SignalStrength = 'None' | 'Very Bad' | 'Bad' | 'Good' | 'Very Good' | 'Extended'; export type Dot11AuthAndMangementSuite = 'None' | 'Dot1X' | 'PSK' | 'Extended'; @@ -159,8 +159,8 @@ export interface FloatRange { } /** Range of duration greater equal Min duration and less equal Max duration. */ export interface DurationRange { - min?: any; - max?: any; + min?: unknown; + max?: unknown; } /** List of values. */ export interface IntItems { @@ -363,7 +363,7 @@ export interface VideoEncoderConfiguration extends ConfigurationEntity { /** Defines the multicast settings that could be used for video streaming. */ multicast?: MulticastConfiguration; /** The rtsp session timeout for the related video stream */ - sessionTimeout?: any; + sessionTimeout?: unknown; } export interface VideoResolution { /** Number of the columns of the Video image. */ @@ -526,7 +526,7 @@ export interface AudioEncoderConfiguration extends ConfigurationEntity { /** Defines the multicast settings that could be used for video streaming. */ multicast?: MulticastConfiguration; /** The rtsp session timeout for the related audio stream */ - sessionTimeout?: any; + sessionTimeout?: unknown; } export interface AudioEncoderConfigurationOptions { /** list of supported AudioEncoderConfigurations */ @@ -579,7 +579,7 @@ export interface MetadataConfiguration extends ConfigurationEntity { /** Defines the multicast settings that could be used for video streaming. */ multicast?: MulticastConfiguration; /** The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) */ - sessionTimeout?: any; + sessionTimeout?: unknown; /** * Indication which AnalyticsModules shall output metadata. * Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration. @@ -597,7 +597,7 @@ export interface PTZFilter { export interface SubscriptionPolicy {} /** Subcription handling in the same way as base notification subscription. */ export interface EventSubscription { - filter?: any; + filter?: FilterType; subscriptionPolicy?: SubscriptionPolicy; } export interface MetadataConfigurationOptions { @@ -797,7 +797,7 @@ export interface MediaUri { /** Indicates if the Uri is invalid after a reboot of the device. The value shall be set to "false". */ invalidAfterReboot?: boolean; /** Duration how long the Uri is valid. This parameter shall be set to PT0S to indicate that this stream URI is indefinitely valid even if the profile changes */ - timeout?: any; + timeout?: unknown; } export interface Scope { /** Indicates if the scope is fixed or configurable. */ @@ -967,7 +967,7 @@ export interface DynamicDNSInformation { /** DNS name. */ name?: DNSName; /** Time to live. */ - TTL?: any; + TTL?: unknown; extension?: DynamicDNSInformationExtension; } export interface DynamicDNSInformationExtension {} @@ -1338,13 +1338,13 @@ export interface SupportInformation { string?: string; } export interface BinaryData { - contentType?: any; + contentType?: unknown; /** base64 encoded binary data. */ - data?: any; + data?: unknown; } export interface AttachmentData { - contentType?: any; - clude?: any; + contentType?: unknown; + clude?: unknown; } export interface BackupFile { name?: string; @@ -1392,7 +1392,6 @@ export interface Time { second?: number; } /** - * The time zone in POSIX 1003.1 format * The TZ format is specified by POSIX, please refer to POSIX 1003.1 section 8.3 * Example: Europe, Paris TZ=CET-1CEST,M3.5.0/2,M10.5.0/3 * CET = designation for standard time when daylight saving is not in force @@ -1497,7 +1496,7 @@ export interface RelayOutputSettings { */ mode?: RelayMode; /** Time after which the relay returns to its idle state if it is in monostable mode. If the Mode field is set to bistable mode the value of the parameter can be ignored. */ - delayTime?: any; + delayTime?: unknown; /** * 'open' or 'closed' * @@ -1556,7 +1555,7 @@ export interface PTZConfiguration extends ConfigurationEntity { /** If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds. */ defaultPTZSpeed?: PTZSpeed; /** If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops. */ - defaultPTZTimeout?: any; + defaultPTZTimeout?: unknown; /** The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. If the element is present it signals the support for configurable Pan/Tilt limits. If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. The Pan/Tilt limits are disabled by setting the limits to –INF or +INF. */ panTiltLimits?: PanTiltLimits; /** The Zoom limits element should be present for a PTZ Node that supports absolute zoom. If the element is present it signals the supports for configurable Zoom limits. If limits are enabled the zoom movements shall always stay within the specified range. The Zoom limits are disabled by settings the limits to -INF and +INF. */ @@ -1730,7 +1729,7 @@ export interface PTZPresetTourSpot { /** Optional parameter to specify Pan/Tilt and Zoom speed on moving toward this tour spot. */ speed?: PTZSpeed; /** Optional parameter to specify time duration of staying on this tour sport. */ - stayTime?: any; + stayTime?: unknown; extension?: PTZPresetTourSpotExtension; } export interface PTZPresetTourSpotExtension {} @@ -1750,7 +1749,7 @@ export interface PTZPresetTourStartingCondition { /** Optional parameter to specify how many times the preset tour is recurred. */ recurringTime?: number; /** Optional parameter to specify how long time duration the preset tour is recurred. */ - recurringDuration?: any; + recurringDuration?: unknown; /** Optional parameter to choose which direction the preset tour goes. Forward shall be chosen in case it is omitted. */ direction?: PTZPresetTourDirection; extension?: PTZPresetTourStartingConditionExtension; @@ -2053,7 +2052,7 @@ export interface IrCutFilterAutoAdjustment { /** Adjusts boundary exposure level for toggling Ir cut filter to on/off specified with unitless normalized value from +1.0 to -1.0. Zero is default and -1.0 is the darkest adjustment (Unitless). */ boundaryOffset?: number; /** Delay time of toggling Ir cut filter to on/off after crossing of the boundary exposure levels. */ - responseTime?: any; + responseTime?: unknown; extension?: IrCutFilterAutoAdjustmentExtension; } export interface IrCutFilterAutoAdjustmentExtension {} @@ -2325,7 +2324,7 @@ export interface SimpleItem { /** Item name. */ name: string; /** Item value. The type is defined in the corresponding description. */ - value: any; + value: unknown; } export interface ElementItem { /** Item name. */ @@ -2359,13 +2358,13 @@ export interface MessageDescriptionExtension {} export interface SimpleItemDescription { /** Item name. Must be unique within a list. */ name: string; - type: any; + type: unknown; } export interface ElementItemDescription { /** Item name. Must be unique within a list. */ name: string; /** The type of the item. The Type must reference a defined type. */ - type: any; + type: unknown; } /** * Describes a list of items. Each item in the list shall have a unique name. @@ -2397,7 +2396,7 @@ export interface Config { /** Name of the configuration. */ name: string; /** The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements returned by GetSupportedRules and GetSupportedAnalyticsModules command. */ - type: any; + type: unknown; /** List of configuration parameters as defined in the corresponding description. */ parameters?: ItemList; } @@ -2407,7 +2406,7 @@ export interface Messages extends MessageDescription { } export interface ConfigDescription { /** The Name attribute (e.g. "tt::LineDetector") uniquely identifies the type of rule, not a type definition in a schema. */ - name: any; + name: unknown; /** The fixed attribute signals that it is not allowed to add or remove this type of configuration. */ fixed?: boolean; /** The maxInstances attribute signals the maximum number of instances per configuration. */ @@ -2628,7 +2627,7 @@ export interface FindEventResult { /** The time when the event occured. */ time?: Date; /** The description of the event. */ - event?: any; + event?: unknown; /** If true, indicates that the event is a virtual event generated for this particular search session to give the state of a property at the start time of the search. */ startStateEvent?: boolean; } @@ -2705,7 +2704,7 @@ export interface RecordingEncryption { * Key for encrypting content. * The device shall not include this parameter when reading. */ - key?: any; + key?: unknown; /** * Optional list of track tokens to be encrypted. * If no track tokens are specified, all tracks are encrypted and no other encryption configurations shall exist for the recording. @@ -2726,9 +2725,9 @@ export interface RecordingTargetConfiguration { /** Path postfix to be inserted in the object key. */ postfix?: string; /** Maximum duration of a span. */ - spanDuration?: any; + spanDuration?: unknown; /** Maximum duration of a segment. */ - segmentDuration?: any; + segmentDuration?: unknown; /** * Optional encryption configuration. * See capability trc:EncryptionEntryLimit for the number of supported entries. @@ -2818,7 +2817,7 @@ export interface RecordingConfiguration { * Whatever the value of MaximumRetentionTime, the device may automatically delete * recordings to free up storage space for new recordings. */ - maximumRetentionTime?: any; + maximumRetentionTime?: unknown; /** Optional external storage target configuration. */ target?: RecordingTargetConfiguration; } @@ -2854,7 +2853,7 @@ export interface RecordingJobConfiguration { * This attribute adds an additional requirement for activating the recording job. * If this optional field is provided the job shall only record if the schedule exists and is active. */ - scheduleToken?: any; + scheduleToken?: unknown; /** Identifies the recording to which this job shall store the received data. */ recordingToken?: RecordingReference; /** @@ -2886,9 +2885,9 @@ export interface Filter { export interface RecordingEventFilter { filter?: Filter[]; /** Optional timespan to record before the actual event condition became active. */ - before?: any; + before?: unknown; /** Optional timespan to record after the actual event condition becomes inactive. */ - after?: any; + after?: unknown; } export interface RecordingJobConfigurationExtension {} export interface RecordingJobSource { @@ -2969,7 +2968,7 @@ export interface GetRecordingJobsResponseItem { /** Configuration parameters for the replay service. */ export interface ReplayConfiguration { /** The RTSP session timeout. */ - sessionTimeout?: any; + sessionTimeout?: unknown; } export interface AnalyticsEngine extends ConfigurationEntity { analyticsEngineConfiguration?: AnalyticsDeviceEngineConfiguration; @@ -3029,11 +3028,11 @@ export interface AnalyticsState { /** Action Engine Event Payload data structure contains the information about the ONVIF command invocations. Since this event could be generated by other or proprietary actions, the command invocation specific fields are defined as optional and additional extension mechanism is provided for future or additional action definitions. */ export interface ActionEngineEventPayload { /** Request Message */ - requestInfo?: any; + requestInfo?: unknown; /** Response Message */ - responseInfo?: any; + responseInfo?: unknown; /** Fault Message */ - fault?: any; + fault?: unknown; extension?: ActionEngineEventPayloadExtension; } export interface ActionEngineEventPayloadExtension {} diff --git a/src/interfaces/provisioning.ts b/src/interfaces/provisioning.ts index 532b62e0..0a131d41 100644 --- a/src/interfaces/provisioning.ts +++ b/src/interfaces/provisioning.ts @@ -46,7 +46,7 @@ export interface SourceCapabilities { /** The capabilities of Provisioning Service on the device. */ export interface Capabilities { /** Maximum time before stopping movement after a move operation. */ - defaultTimeout?: any; + defaultTimeout?: unknown; /** Capabilities per video source. */ source?: SourceCapabilities[]; } @@ -61,7 +61,7 @@ export interface PanMove { /** "left" or "right". */ direction?: PanDirection; /** "Operation timeout, if less than default timeout. */ - timeout?: any; + timeout?: unknown; } export interface PanMoveResponse {} export interface TiltMove { @@ -70,7 +70,7 @@ export interface TiltMove { /** "up" or "down". */ direction?: TiltDirection; /** "Operation timeout, if less than default timeout. */ - timeout?: any; + timeout?: unknown; } export interface TiltMoveResponse {} export interface ZoomMove { @@ -79,7 +79,7 @@ export interface ZoomMove { /** "wide" or "telephoto". */ direction?: ZoomDirection; /** "Operation timeout, if less than default timeout. */ - timeout?: any; + timeout?: unknown; } export interface ZoomMoveResponse {} export interface RollMove { @@ -88,7 +88,7 @@ export interface RollMove { /** "clockwise", "counterclockwise", or "auto". */ direction?: RollDirection; /** "Operation timeout, if less than default timeout. */ - timeout?: any; + timeout?: unknown; } export interface RollMoveResponse {} export interface FocusMove { @@ -97,7 +97,7 @@ export interface FocusMove { /** "near", "far", or "auto". */ direction?: FocusDirection; /** "Operation timeout, if less than default timeout. */ - timeout?: any; + timeout?: unknown; } export interface FocusMoveResponse {} export interface Stop { diff --git a/src/interfaces/ptz.2.ts b/src/interfaces/ptz.2.ts index 726c016b..3cffd68d 100644 --- a/src/interfaces/ptz.2.ts +++ b/src/interfaces/ptz.2.ts @@ -1,5 +1,6 @@ import { StringList, + Capabilities, PTZNode, PTZConfiguration, PTZConfigurationOptions, @@ -12,20 +13,6 @@ import { } from './onvif'; import { ReferenceToken, PTZStatus, PTZVector, GeoLocation } from './common'; -export interface Capabilities { - /** Indicates whether or not EFlip is supported. */ - EFlip?: boolean; - /** Indicates whether or not reversing of PT control direction is supported. */ - reverse?: boolean; - /** Indicates support for the GetCompatibleConfigurations command. */ - getCompatibleConfigurations?: boolean; - /** Indicates that the PTZStatus includes MoveStatus information. */ - moveStatus?: boolean; - /** Indicates that the PTZStatus includes Position information. */ - statusPosition?: boolean; - /** Indication of the methods of MoveAndTrack that are supported, acceptable values are defined in tt:MoveAndTrackMethod. */ - moveAndTrack?: StringList; -} export interface GetServiceCapabilities {} export interface GetServiceCapabilitiesResponse { /** The capabilities for the PTZ service is returned in the Capabilities element. */ @@ -140,7 +127,7 @@ export interface ContinuousMove { /** A Velocity vector specifying the velocity of pan, tilt and zoom. */ velocity?: PTZSpeed; /** An optional Timeout parameter. */ - timeout?: any; + timeout?: unknown; } export interface ContinuousMoveResponse {} export interface RelativeMove { diff --git a/src/interfaces/radiometry.2.ts b/src/interfaces/radiometry.2.ts index dc4c91ea..6ebb32c7 100644 --- a/src/interfaces/radiometry.2.ts +++ b/src/interfaces/radiometry.2.ts @@ -135,7 +135,7 @@ export interface RadiometryTemperatureRuleConfig { /** Indicates the temperature reference value the rule shall be checked against. */ thresholdTemperature?: number; /** Indicates the time interval during which the rule condition shall be met to trigger an event. */ - thresholdTime?: any; + thresholdTime?: unknown; /** Indicates the width in Kelvin of the temerature hysteresis band to be considered by the rule. */ hysteresisTemperature?: number; } diff --git a/src/interfaces/receiver.ts b/src/interfaces/receiver.ts index 2521e22c..f6b4d511 100644 --- a/src/interfaces/receiver.ts +++ b/src/interfaces/receiver.ts @@ -1,18 +1,6 @@ -import { Receiver, ReceiverConfiguration, ReceiverMode, ReceiverStateInformation } from './onvif'; +import { Capabilities, Receiver, ReceiverConfiguration, ReceiverMode, ReceiverStateInformation } from './onvif'; import { ReferenceToken } from './common'; -export interface Capabilities { - /** Indicates that the device can receive RTP multicast streams. */ - RTP_Multicast?: boolean; - /** Indicates that the device can receive RTP/TCP streams */ - RTP_TCP?: boolean; - /** Indicates that the device can receive RTP/RTSP/TCP streams. */ - RTP_RTSP_TCP?: boolean; - /** The maximum number of receivers supported by the device. */ - supportedReceivers: number; - /** The maximum allowed length for RTSP URIs (Minimum and default value is 128 octet). */ - maximumRTSPURILength?: number; -} export interface GetServiceCapabilities {} export interface GetServiceCapabilitiesResponse { /** The capabilities for the receiver service is returned in the Capabilities element. */ diff --git a/src/interfaces/recording.ts b/src/interfaces/recording.ts index 1f1c3205..7a389e18 100644 --- a/src/interfaces/recording.ts +++ b/src/interfaces/recording.ts @@ -1,6 +1,7 @@ import { StringList, StringAttrList, + Capabilities, RecordingConfiguration, RecordingReference, GetRecordingsResponseItem, @@ -18,53 +19,6 @@ import { } from './onvif'; import { ReferenceToken } from './common'; -export interface Capabilities { - /** Indication if the device supports dynamic creation and deletion of recordings */ - dynamicRecordings?: boolean; - /** Indication if the device supports dynamic creation and deletion of tracks */ - dynamicTracks?: boolean; - /** Indication which encodings are supported for recording. The list may contain one or more enumeration values of tt:VideoEncoding and tt:AudioEncoding. For encodings that are neither defined in tt:VideoEncoding nor tt:AudioEncoding the device shall use the IANA defintions. Note, that a device without audio support shall not return audio encodings. */ - encoding?: StringList; - /** Maximum supported bit rate for all tracks of a recording in kBit/s. */ - maxRate?: number; - /** Maximum supported bit rate for all recordings in kBit/s. */ - maxTotalRate?: number; - /** Maximum number of recordings supported. (Integer values only.) */ - maxRecordings?: number; - /** Maximum total number of supported recording jobs by the device. */ - maxRecordingJobs?: number; - /** Indication if the device supports the GetRecordingOptions command. */ - options?: boolean; - /** Indication if the device supports recording metadata. */ - metadataRecording?: boolean; - /** - * Indication that the device supports ExportRecordedData command for the listed export file formats. - * The list shall return at least one export file format value. The value of 'ONVIF' refers to - * ONVIF Export File Format specification. - */ - supportedExportFileFormats?: StringAttrList; - /** Indication that the device supports event triggered recording. */ - eventRecording?: boolean; - /** If present a device shall support configuring before event durations up to the given value. */ - beforeEventLimit?: any; - /** If present a device shall support configuring after event durations up to the given value. */ - afterEventLimit?: any; - /** - * List of formats supported by the device for recording to an external target. - * See tt:TargetFormat for a list of definitions. - */ - supportedTargetFormats?: StringAttrList; - /** - * Number of encryption entries supported per recording. - * By specifying multiple encryption entries per recording, different tracks can be encrypted with different configurations. - */ - encryptionEntryLimit?: number; - /** - * Indicates supported encryption modes. - * See tt:EncryptionMode for a list of definitions. - */ - supportedEncryptionModes?: StringAttrList; -} export interface RecordingOptions { job?: JobOptions; track?: TrackOptions; diff --git a/src/interfaces/replay.ts b/src/interfaces/replay.ts index 2c72bf65..5638d86a 100644 --- a/src/interfaces/replay.ts +++ b/src/interfaces/replay.ts @@ -1,17 +1,7 @@ -import { FloatList, StreamSetup, ReplayConfiguration } from './onvif'; +import { FloatList, Capabilities, StreamSetup, ReplayConfiguration } from './onvif'; import { AnyURI } from './basics'; import { ReferenceToken } from './common'; -export interface Capabilities { - /** Indicator that the Device supports reverse playback as defined in the ONVIF Streaming Specification. */ - reversePlayback?: boolean; - /** The list contains two elements defining the minimum and maximum valid values supported as session timeout in seconds. */ - sessionTimeoutRange?: FloatList; - /** Indicates support for RTP/RTSP/TCP. */ - RTP_RTSP_TCP?: boolean; - /** If playback streaming over WebSocket is supported, this shall return the RTSP WebSocket URI as described in Streaming Specification Section 5.1.1.5. */ - RTSPWebSocketUri?: AnyURI; -} export interface GetServiceCapabilities {} export interface GetServiceCapabilitiesResponse { /** The capabilities for the replay service is returned in the Capabilities element. */ diff --git a/src/interfaces/rules.2.ts b/src/interfaces/rules.2.ts index c891f5f5..36b4090b 100644 --- a/src/interfaces/rules.2.ts +++ b/src/interfaces/rules.2.ts @@ -52,7 +52,7 @@ export interface MotionRegionConfig { * element. If the device does not support Polygons, this structure must contain * four points that represent a Rectangle. */ - ygon?: any; + ygon?: unknown; /** Preset position associated with the motion region defined by Polygon. */ presetToken?: ReferenceToken; } diff --git a/src/interfaces/search.ts b/src/interfaces/search.ts index 5b126795..d5e6f570 100644 --- a/src/interfaces/search.ts +++ b/src/interfaces/search.ts @@ -1,4 +1,5 @@ import { + Capabilities, RecordingSummary, RecordingReference, RecordingInformation, @@ -16,11 +17,6 @@ import { SearchState, } from './onvif'; -export interface Capabilities { - metadataSearch?: boolean; - /** Indicates support for general virtual property events in the FindEvents method. */ - generalStartEvents?: boolean; -} export interface GetServiceCapabilities {} export interface GetServiceCapabilitiesResponse { /** The capabilities for the search service is returned in the Capabilities element. */ @@ -49,7 +45,7 @@ export interface FindRecordings { /** The search will be completed after this many matches. If not specified, the search will continue until reaching the endpoint or until the session expires. */ maxMatches?: number; /** The time the search session will be kept alive after responding to this and subsequent requests. A device shall support at least values up to ten seconds. */ - keepAliveTime?: any; + keepAliveTime?: unknown; } export interface FindRecordingsResponse { searchToken?: JobToken; @@ -62,7 +58,7 @@ export interface GetRecordingSearchResults { /** The maximum number of results to return in one response. */ maxResults?: number; /** The maximum time before responding to the request, even if the MinResults parameter is not fulfilled. */ - waitTime?: any; + waitTime?: unknown; } export interface GetRecordingSearchResultsResponse { resultList?: FindRecordingResultList; @@ -79,7 +75,7 @@ export interface FindEvents { /** The search will be completed after this many matches. If not specified, the search will continue until reaching the endpoint or until the session expires. */ maxMatches?: number; /** The time the search session will be kept alive after responding to this and subsequent requests. A device shall support at least values up to ten seconds. */ - keepAliveTime?: any; + keepAliveTime?: unknown; } export interface FindEventsResponse { /** A unique reference to the search session created by this request. */ @@ -93,7 +89,7 @@ export interface GetEventSearchResults { /** The maximum number of results to return in one response. */ maxResults?: number; /** The maximum time before responding to the request, even if the MinResults parameter is not fulfilled. */ - waitTime?: any; + waitTime?: unknown; } export interface GetEventSearchResultsResponse { resultList?: FindEventResultList; @@ -108,7 +104,7 @@ export interface FindPTZPosition { /** The search will be completed after this many matches. If not specified, the search will continue until reaching the endpoint or until the session expires. */ maxMatches?: number; /** The time the search session will be kept alive after responding to this and subsequent requests. A device shall support at least values up to ten seconds. */ - keepAliveTime?: any; + keepAliveTime?: unknown; } export interface FindPTZPositionResponse { /** A unique reference to the search session created by this request. */ @@ -122,7 +118,7 @@ export interface GetPTZPositionSearchResults { /** The maximum number of results to return in one response. */ maxResults?: number; /** The maximum time before responding to the request, even if the MinResults parameter is not fulfilled. */ - waitTime?: any; + waitTime?: unknown; } export interface GetPTZPositionSearchResultsResponse { resultList?: FindPTZPositionResultList; @@ -137,7 +133,7 @@ export interface FindMetadata { /** The search will be completed after this many matches. If not specified, the search will continue until reaching the endpoint or until the session expires. */ maxMatches?: number; /** The time the search session will be kept alive after responding to this and subsequent requests. A device shall support at least values up to ten seconds. */ - keepAliveTime?: any; + keepAliveTime?: unknown; } export interface FindMetadataResponse { /** A unique reference to the search session created by this request. */ @@ -151,7 +147,7 @@ export interface GetMetadataSearchResults { /** The maximum number of results to return in one response. */ maxResults?: number; /** The maximum time before responding to the request, even if the MinResults parameter is not fulfilled. */ - waitTime?: any; + waitTime?: unknown; } export interface GetMetadataSearchResultsResponse { resultList?: FindMetadataResultList; diff --git a/src/interfaces/thermal.ts b/src/interfaces/thermal.ts index 8dbcea01..d6a86f3c 100644 --- a/src/interfaces/thermal.ts +++ b/src/interfaces/thermal.ts @@ -1,5 +1,5 @@ import { ReferenceToken } from './common'; -import { Name, FloatRange } from './onvif'; +import { Name, FloatRange, Capabilities } from './onvif'; export type Polarity = 'WhiteHot' | 'BlackHot'; /** @@ -134,10 +134,6 @@ export interface RadiometryConfigurationOptions { */ radiometryGlobalParameterOptions?: RadiometryGlobalParameterOptions; } -export interface Capabilities { - /** Indicates whether or not radiometric thermal measurements are supported by the thermal device. */ - radiometry?: boolean; -} export interface GetServiceCapabilities {} export interface GetServiceCapabilitiesResponse { /** The capabilities of the thermal service are returned in the Capabilities element. */ diff --git a/src/interfaces/uplink.ts b/src/interfaces/uplink.ts index e5d2855b..f4f29f67 100644 --- a/src/interfaces/uplink.ts +++ b/src/interfaces/uplink.ts @@ -1,18 +1,10 @@ -import { StringList } from './onvif'; +import { StringList, Capabilities } from './onvif'; import { AnyURI } from './basics'; import { ReferenceToken } from './common'; export type Protocols = 'https' | 'wss'; export type AuthorizationModes = 'mTLS' | 'JWT'; export type ConnectionStatus = 'Offline' | 'Connecting' | 'Connected'; -export interface Capabilities { - /** Maximum number of uplink connections that can be configured. */ - maxUplinks?: number; - /** Protocols supported by the device. Defined values are 'https' for native h2c-reverse and 'wss' for h2c-reverse over WebSocket as defined by tup:Protocols. */ - protocols?: StringList; - /** Supported authorization mode [mTLS JWT] as defined by tup:AuthorizationModes. */ - authorizationModes?: StringList; -} export interface Configuration { /** Uniform resource locator by which the remote client can be reached. */ remoteAddress?: AnyURI; From 869c3112f4e4dc8093eec90ca8a4e65c74b8b7c1 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 30 Jun 2024 00:59:19 +0300 Subject: [PATCH 096/112] feat: getCapabilities --- CHECKED.md | 2 +- src/compatibility/cam.ts | 2 +- src/device.ts | 372 +++------------------------------------ 3 files changed, 30 insertions(+), 346 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index 1c876f9d..0f3eff39 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -5,7 +5,7 @@ ONVIF Interfaces - [ ] _requestPart2 - [ ] getSystemDateAndTime - [ ] setSystemDateAndTime -- [ ] getCapabilities +- [x] getCapabilities Capabilities -> GetCapabilitiesResponse - [ ] getServiceCapabilities - [ ] getActiveSources - [x] getServices includeCapability wrapped into object diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index fe26d31d..83b622b8 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -97,7 +97,7 @@ export class Cam extends EventEmitter { } getCapabilities(callback: Callback) { - this.onvif.device.getCapabilities().then((result) => callback(null, result)).catch(callback); + this.onvif.device.getCapabilities().then((result) => callback(null, result.capabilities)).catch(callback); } getServiceCapabilities(callback: Callback) { diff --git a/src/device.ts b/src/device.ts index b30702b3..373041de 100644 --- a/src/device.ts +++ b/src/device.ts @@ -3,8 +3,21 @@ import { Onvif, OnvifServices, ReferenceToken, SetSystemDateAndTimeOptions, } from './onvif'; import { linerase } from './utils'; -import { GetServices, GetServicesResponse, Service, SetNTP } from './interfaces/devicemgmt'; -import { DNSInformation, IPAddress, NTPInformation } from './interfaces/onvif'; +import { + DeviceServiceCapabilities, + GetCapabilities, GetCapabilitiesResponse, + GetServices, + GetServicesResponse, + Service, + SetNTP, +} from './interfaces/devicemgmt'; +import { + Capabilities, CapabilitiesExtension, + DNSInformation, + IPv4Address, + IPv6Address, + NTPInformation, +} from './interfaces/onvif'; export interface OnvifVersion { /** Major version number */ @@ -17,316 +30,6 @@ export interface OnvifVersion { minor: number; } -export interface NetworkCapabilitiesExtension { - dot11Configuration?: boolean; - extension?: any; -} - -/** Network capabilities */ -export interface NetworkCapabilities { - /** Indicates support for IP filtering */ - IPFilter?: boolean; - /** Indicates support for zeroconf */ - zeroConfiguration?: boolean; - /** Indicates support for IPv6 */ - IPVersion6?: boolean; - /** Indicates support for dynamic DNS configuration */ - dynDNS?: boolean; - /** Indicates support for IEEE 802.11 configuration */ - dot11Configuration?: boolean; - /** Indicates the maximum number of Dot1X configurations supported by the device */ - dot1XConfigurations?: number; - /** Indicates support for retrieval of hostname from DHCP */ - hostnameFromDHCP?: boolean; - /** Maximum number of NTP servers supported by the devices SetNTP command */ - NTP: number; - /** Indicates support for Stateful IPv6 DHCP */ - DHCPv6: boolean; - extension: NetworkCapabilitiesExtension; -} - -export interface SystemCapabilitiesExtension { - httpFirmwareUpgrade?: boolean; - httpSystemBackup?: boolean; - httpSystemLogging?: boolean; - httpSupportInformation?: boolean; - extension?: any; -} - -/** System capabilities */ -export interface SystemCapabilities { - /** Indicates whether or not WS Discovery resolve requests are supported */ - discoveryResolve: boolean; - /** Indicates support for WS Discovery resolve requests */ - discoveryBye: boolean; - /** Indicates support for remote discovery */ - remoteDiscovery: boolean; - /** Indicates support for system backup through MTOM */ - systemBackup: boolean; - /** Indicates support for retrieval of system logging through MTOM */ - systemLogging: boolean; - /** Indicates support for firmware upgrade through MTOM */ - firmwareUpgrade: boolean; - /** Indicates support for firmware upgrade through HTTP */ - httpFirmwareUpgrade?: boolean; - /** Indicates support for system backup through HTTP */ - httpSystemBackup?: boolean; - /** Indicates support for retrieval of system logging through HTTP */ - httpSystemLogging?: boolean; - /** Indicates supported ONVIF version(s) */ - supportedVersions: OnvifVersion; - /** Indicates support for retrieving support information through HTTP */ - httpSupportInformation?: boolean; - /** Indicates support for storage configuration interfaces */ - storageConfiguration?: boolean; - /** Indicates maximum number of storage configurations supported */ - maxStorageConfigurations?: number; - /** If present signals support for geo location. The value signals the supported number of entries */ - geoLocationEntries?: number; - /** List of supported automatic GeoLocation adjustment supported by the device. Valid items are defined by tds:AutoGeoMode */ - autoGeo?: string[]; - /** Enumerates the supported StorageTypes, see tds:StorageType */ - storageTypesSupported?: string[]; - /** Indicates no support for network discovery */ - discoveryNotSupported?: boolean; - /** Indicates no support for network configuration */ - networkConfigNotSupported?: boolean; - /** Indicates no support for user configuration */ - userConfigNotSupported?: boolean; - /** List of supported Addons by the device */ - addons?: string[]; - extensions?: SystemCapabilitiesExtension; -} - -export interface IOCapabilitiesExtension { - auxiliary?: boolean; - auxiliaryCommands?: Record; - extension?: any; -} - -export interface IOCapabilities { - /** Number of input connectors */ - inputConnectors?: number; - /** Number of relay outputs */ - relayOutputs?: number; - extension?: IOCapabilitiesExtension; -} - -export interface SecurityCapabilitiesExtension2 { - dot1X: boolean; - /** EAP Methods supported by the device. The int values refer to the IANA EAP Registry */ - supportedEAPMethod?: number; - remoteUserHandling: boolean; -} - -export interface SecurityCapabilitiesExtension { - /** Indicates support for TLS 1.0 */ - 'TLS1.0': boolean; - extension?: SecurityCapabilitiesExtension2; -} - -/** Security capabilities */ -export interface SecurityCapabilities { - /** Indicates support for TLS 1.1 */ - 'TLS1.0'?: boolean; - /** Indicates support for TLS 1.1 */ - 'TLS1.1': boolean; - /** Indicates support for TLS 1.2 */ - 'TLS1.2': boolean; - /** Indicates support for onboard key generation */ - onboardKeyGeneration: boolean; - /** Indicates support for access policy configuration */ - accessPolicyConfig: boolean; - /** Indicates support for the ONVIF default access policy */ - defaultAccessPolicy?: boolean; - /** Indicates support for IEEE 802.1X configuration */ - dot1X?: boolean; - /** Indicates support for remote user configuration. Used when accessing another device */ - remoteUserHandling?: boolean; - /** Indicates support for WS-Security X.509 token */ - 'X.509Token': boolean; - /** Indicates support for WS-Security SAML token */ - SAMLToken: boolean; - /** Indicates support for WS-Security Kerberos token */ - kerberosToken: boolean; - /** Indicates support for WS-Security Username token */ - usernameToken?: boolean; - /** Indicates support for WS over HTTP digest authenticated communication layer */ - httpDigest?: boolean; - /** Indicates support for WS-Security REL token */ - RELToken: boolean; - /** EAP Methods supported by the device. The int values refer to the IANA EAP Registry */ - supportedEAPMethods?: number[]; - /** The maximum number of users that the device supports */ - maxUsers?: number; - /** Maximum number of characters supported for the username by CreateUsers */ - maxUserNameLength?: number; - /** Maximum number of characters supported for the password by CreateUsers and SetUser */ - maxPasswordLength?: number; - /** Indicates which security policies are supported. Options are: ModifyPassword, PasswordComplexity, AuthFailureWarnings */ - securityPolicies?: string[]; - /** Maximum number of passwords that the device can remember for each user */ - maxPasswordHistory: number; - extension?: SecurityCapabilitiesExtension; -} - -/** - * Event capabilities - */ -export interface EventCapabilities { - /** Event service URI */ - XAddr: string; - /** Indicates whether or not WS Subscription policy is supported */ - WSSubscriptionPolicySupport: boolean; - /** Indicates whether or not WS Pull Point is supported */ - WSPullPointSupport: boolean; - /** Indicates whether or not WS Pausable Subscription Manager Interface is supported */ - WSPausableSubscriptionManagerInterfaceSupport: boolean; -} - -export interface ImagingCapabilities { - /** Imaging service URI */ - XAddr: string; -} - -export interface RealTimeStreamingCapabilities { - /** Indicates whether or not RTP multicast is supported */ - RTPMulticast: boolean; - /** Indicates whether or not RTP over TCP is supported */ - RTP_TCP: boolean; - /** Indicates whether or not RTP/RTSP/TCP is supported */ - RTP_RTSP_TCP: boolean; - /** Extensions */ - extension: any; -} - -export interface ProfileCapabilities { - maximumNumberOfProfiles: number; -} - -export interface MediaCapabilitiesExtension { - profileCapabilities: ProfileCapabilities; -} - -export interface MediaCapabilities { - /** Media service URI */ - XAddr: string; - /** Streaming capabilities */ - streamingCapabilities: RealTimeStreamingCapabilities; - extension?: MediaCapabilitiesExtension; -} - -/** PTZ capabilities */ -export interface PTZCapabilities { - /** PTZ service URI */ - XAddr: string; -} - -export interface DeviceIOCapabilities { - /** DeviceIO service URI */ - XAddr: string; - videoSources: number; - videoOutputs: number; - audioSources: number; - audioOutputs: number; - relayOutputs: number; - extensions: { - telexCapabilities: any; - scdlCapabilities: any; - }; -} - -export interface DisplayCapabilities { - XAddr: string; - /** Indication that the SetLayout command supports only predefined layouts */ - fixedLayout: boolean; -} - -export interface RecordingCapabilities { - XAddr: string; - receiverSource: boolean; - mediaProfileSource: boolean; - dynamicRecordings: boolean; - dynamicTracks: boolean; - maxStringLength: number; -} - -export interface SearchCapabilities { - XAddr: string; - metadataSearch: boolean; -} - -export interface ReplayCapabilities { - XAddr: string; -} - -export interface ReceiverCapabilities { - /** The address of the receiver service */ - XAddr: string; - /** Indicates whether the device can receive RTP multicast streams */ - RTP_Multicast: boolean; - /** Indicates whether the device can receive RTP/TCP streams */ - RTP_TCP: boolean; - /** Indicates whether the device can receive RTP/RTSP/TCP streams */ - RTP_RTSP_TCP: boolean; - /** The maximum number of receivers supported by the device */ - supportedReceivers: number; - /** The maximum allowed length for RTSP URIs */ - maximumRTSPURILength: number; -} - -export interface AnalyticsDeviceCapabilities { - XAddr: string; - ruleSupport?: boolean; - extension?: any; -} - -export interface CapabilitiesExtension { - XAddr: string; - /** DeviceIO capabilities */ - deviceIO?: DeviceIOCapabilities; - display?: DisplayCapabilities; - recording?: RecordingCapabilities; - search?: SearchCapabilities; - replay?: ReplayCapabilities; - receiver?: ReceiverCapabilities; - analyticsDevice?: AnalyticsDeviceCapabilities; -} - -/** Device capabilities */ -export interface DeviceCapabilities { - /** Device service URI */ - XAddr: string; - network?: NetworkCapabilities; - system?: SystemCapabilities; - IO?: IOCapabilities; - security?: SecurityCapabilities; - extensions?: any; -} - -/** Analytics capabilities */ -export interface AnalyticsCapabilities { - /** Analytics service URI */ - XAddr: string; - /** Indicates whether rules are supported */ - ruleSupport: boolean; - /** Indicates whether modules are supported */ - analyticsModuleSupport: boolean; -} - -/** - * Capability list - */ -export interface Capabilities { - analytics?: AnalyticsCapabilities; - device?: DeviceCapabilities; - events?: EventCapabilities; - imaging?: ImagingCapabilities; - media?: MediaCapabilities; - ptz?: PTZCapabilities; - extension?: CapabilitiesExtension; -} - export interface HostnameInformation { /** Indicates whether the hostname is obtained from DHCP or not */ fromDHCP: boolean; @@ -355,27 +58,6 @@ export interface Scope { scopeItem: string; } -export interface MiscCapabilities { - /** Lists of commands supported by SendAuxiliaryCommand */ - auxiliaryCommands: string[]; -} - -export interface DeviceServiceCapabilities { - /** Network capabilities */ - network?: NetworkCapabilities; - /** Security capabilities */ - security?: SecurityCapabilities; - /** System capabilities */ - system?: SystemCapabilities; - /** Capabilities that do not fit in any of the other categories */ - misc?: MiscCapabilities; - /** The same as misc field */ - auxiliaryCommands?: string[]; -} - -type IPv4Address = string; -type IPv6Address = string; - export interface NetworkInterfaceInfo { /* Network interface name, for example eth0. */ name?: string; @@ -590,17 +272,20 @@ export class Device { * This method has been replaced by the more generic {@link Device.getServices | GetServices} method. * For capabilities of individual services refer to the GetServiceCapabilities methods. */ - async getCapabilities(): Promise { + async getCapabilities(options?: GetCapabilities): Promise { + if (!options || !options.category) { + options = { category : ['All'] }; + } const [data] = await this.onvif.request({ - body : '' - + 'All' - + '', + body : `${ + options.category!.map((category) => `${category}`).join('') + }`, }); this.onvif.capabilities = linerase(data[0].getCapabilitiesResponse[0].capabilities[0]); - ['PTZ', 'media', 'imaging', 'events', 'device'].forEach((name) => { + ['PTZ', 'media', 'imaging', 'events', 'device', 'analytics'].forEach((name) => { const capabilityName = name as keyof Capabilities; if ('XAddr' in this.onvif.capabilities[capabilityName]!) { - this.onvif.uri[name as keyof OnvifServices] = this.onvif.parseUrl(this.onvif.capabilities[capabilityName]!.XAddr); + this.onvif.uri[name as keyof OnvifServices] = this.onvif.parseUrl(this.onvif.capabilities[capabilityName]!.XAddr as string); } }); // extensions, eg. deviceIO @@ -608,11 +293,10 @@ export class Device { Object.keys(this.onvif.capabilities.extension).forEach((ext) => { const extensionName = ext as keyof CapabilitiesExtension; // TODO think about complex extensions like `telexCapabilities` and `scdlCapabilities` - if (extensionName !== 'XAddr' - && 'XAddr' in this.onvif.capabilities.extension![extensionName]! + if ('XAddr' in this.onvif.capabilities.extension![extensionName]! && this.onvif.capabilities.extension![extensionName]!.XAddr ) { - this.onvif.uri[extensionName] = new URL(this.onvif.capabilities.extension![extensionName]!.XAddr); + this.onvif.uri[extensionName] = new URL(this.onvif.capabilities.extension![extensionName]!.XAddr as string); } }); // HACK for a Profile G NVR that has 'replay' but did not have 'recording' in GetCapabilities @@ -622,7 +306,7 @@ export class Device { this.onvif.uri.recording = new URL(tempRecorderXaddr); } } - return this.onvif.capabilities; + return { capabilities : this.onvif.capabilities }; } /** @@ -692,7 +376,7 @@ export class Device { }; if (capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc) { this.#serviceCapabilities.misc = capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc; - this.#serviceCapabilities.auxiliaryCommands = capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc.AuxiliaryCommands.split(' '); + this.#serviceCapabilities.misc!.auxiliaryCommands = capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc.AuxiliaryCommands.split(' '); } return this.#serviceCapabilities; } From 7de2d41fd3b89c855f138e8497450909ab3f0341 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 30 Jun 2024 00:59:57 +0300 Subject: [PATCH 097/112] chore: onvif type improvements --- {src => fun}/test.ts | 13 +++++++------ package.json | 2 +- src/onvif.ts | 8 +++++--- 3 files changed, 13 insertions(+), 10 deletions(-) rename {src => fun}/test.ts (85%) diff --git a/src/test.ts b/fun/test.ts similarity index 85% rename from src/test.ts rename to fun/test.ts index 68f6f0e6..24a7f1fd 100644 --- a/src/test.ts +++ b/fun/test.ts @@ -1,4 +1,4 @@ -import { Discovery, Onvif } from './index'; +import { Discovery, Onvif } from '../src'; import { Cam as CamJs } from '../promises'; // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -47,15 +47,16 @@ import { Cam as CamJs } from '../promises'; // console.log(cam.activeSource); // console.log(await camJs.getOSDs()); - console.log(await cam.media.getOSDs({ - configurationToken : 'vsconf', - // OSDToken : 'textOSD', - })); + // console.log(await cam.media.getOSDs({ + // configurationToken : 'vsconf', + // // OSDToken : 'textOSD', + // })); // console.log((await camJs.getOSDOptions())); // console.log((await cam.media.getOSDOptions({ }))); - console.log(await cam.device.getServices()); + console.log((await cam.device.getCapabilities()).capabilities.extension); + // console.log((await camJs.getCapabilities())); })().catch((e) => { console.error(e); console.log(e.rawPacket.toString()); diff --git a/package.json b/package.json index c7c755eb..c6982a58 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "pretest": "npm run lint", "test": "nyc mocha", "mockserver": "node startServerMockup.js", - "fun": "tsx src/test.ts" + "fun": "tsx fun/test.ts" }, "contributors": [ { diff --git a/src/onvif.ts b/src/onvif.ts index aa5a28d0..84520617 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -5,9 +5,10 @@ import http from 'http'; import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; -import { Capabilities, Device, DeviceInformation } from './device'; +import { Device, DeviceInformation } from './device'; import { Media, Profile } from './media'; import { PTZ } from './ptz'; +import { Capabilities } from './interfaces/onvif'; // Common types export type AnyURI = string; @@ -51,6 +52,7 @@ export interface OnvifServices { recording?: URL; replay?: URL; search?: URL; + [key: string]: URL | undefined; } export interface OnvifRequestOptions extends RequestOptions{ @@ -288,11 +290,11 @@ export class Onvif extends EventEmitter { private async rawRequest(options: OnvifRequestOptions): Promise<[Record, string]> { return new Promise((resolve, reject) => { let alreadyReturned = false; - const requestOptions = { + const requestOptions: RequestOptions = { ...options, hostname : this.hostname, path : options.service - ? (this.uri[options.service] ? this.uri[options.service]?.pathname : options.service) + ? (this.uri[options.service] ? this.uri[options.service]!.pathname : this.path) : this.path, port : this.port, agent : this.agent, // Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections} From c42c8b68bce77f4687347b4810287cc9df89bed3 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 30 Jun 2024 01:58:13 +0300 Subject: [PATCH 098/112] chore: generated documentation --- docs/assets/highlight.css | 24 +- docs/assets/search.js | 2 +- docs/classes/Device.html | 28 +- docs/classes/DiscoverySingleton.html | 292 +---------------- docs/classes/Media.html | 10 +- docs/classes/Onvif.html | 304 +----------------- docs/index.html | 2 +- docs/interfaces/ActiveSource.html | 4 +- docs/interfaces/AnalyticsCapabilities.html | 8 - .../AnalyticsDeviceCapabilities.html | 4 - .../AnalyticsEngineConfiguration.html | 4 +- .../interfaces/AudioDecoderConfiguration.html | 8 +- .../AudioEncoder2Configuration.html | 16 +- .../interfaces/AudioEncoderConfiguration.html | 18 +- docs/interfaces/AudioOutputConfiguration.html | 14 +- docs/interfaces/AudioSourceConfiguration.html | 10 +- docs/interfaces/BacklightCompensation.html | 6 +- docs/interfaces/BacklightCompensation20.html | 6 +- docs/interfaces/Capabilities.html | 9 - docs/interfaces/CapabilitiesExtension.html | 10 - docs/interfaces/Config.html | 8 +- docs/interfaces/ConfigurationSet.html | 22 +- docs/interfaces/Defogging.html | 8 +- docs/interfaces/DeviceCapabilities.html | 9 - docs/interfaces/DeviceIOCapabilities.html | 9 - docs/interfaces/DeviceInformation.html | 11 - docs/interfaces/DiscoveryOptions.html | 14 +- docs/interfaces/DisplayCapabilities.html | 4 - docs/interfaces/EventCapabilities.html | 10 - docs/interfaces/EventSubscription.html | 4 +- docs/interfaces/Exposure.html | 26 +- docs/interfaces/Exposure20.html | 26 +- docs/interfaces/FocusConfiguration.html | 8 +- docs/interfaces/FocusConfiguration20.html | 10 +- docs/interfaces/H264Configuration.html | 6 +- docs/interfaces/IOCapabilities.html | 6 - docs/interfaces/IOCapabilitiesExtension.html | 4 - docs/interfaces/ImageStabilization.html | 8 +- docs/interfaces/ImagingCapabilities.html | 3 - docs/interfaces/ImagingSettings.html | 22 +- docs/interfaces/ImagingSettings20.html | 22 +- .../ImagingSettingsExtension20.html | 6 +- .../ImagingSettingsExtension202.html | 6 +- .../ImagingSettingsExtension203.html | 8 +- docs/interfaces/IntRectangle.html | 4 +- .../interfaces/IrCutFilterAutoAdjustment.html | 8 +- docs/interfaces/ItemList.html | 6 +- docs/interfaces/LensDescription.html | 10 +- docs/interfaces/LensOffset.html | 6 +- docs/interfaces/LensProjection.html | 8 +- docs/interfaces/MediaCapabilities.html | 6 - .../MediaCapabilitiesExtension.html | 2 - docs/interfaces/MediaProfile.html | 10 +- docs/interfaces/MetadataConfiguration.html | 26 +- docs/interfaces/Mpeg4Configuration.html | 6 +- docs/interfaces/MulticastConfiguration.html | 10 +- docs/interfaces/NetworkCapabilities.html | 21 -- .../NetworkCapabilitiesExtension.html | 3 - docs/interfaces/NoiseReduction.html | 4 +- docs/interfaces/OnvifOptions.html | 12 +- docs/interfaces/OnvifRequestOptions.html | 179 +---------- docs/interfaces/OnvifServices.html | 4 +- docs/interfaces/OnvifVersion.html | 7 - docs/interfaces/PTControlDirection.html | 6 +- docs/interfaces/PTZCapabilities.html | 4 - docs/interfaces/PTZConfiguration.html | 36 +-- .../interfaces/PTZConfigurationExtension.html | 4 +- docs/interfaces/PTZFilter.html | 6 +- docs/interfaces/PTZSpeed.html | 6 +- docs/interfaces/PanTiltLimits.html | 4 +- docs/interfaces/Profile.html | 24 +- docs/interfaces/ProfileCapabilities.html | 2 - docs/interfaces/ProfileExtension.html | 6 +- docs/interfaces/Range.html | 4 +- .../RealTimeStreamingCapabilities.html | 9 - docs/interfaces/ReceiverCapabilities.html | 13 - docs/interfaces/RecordingCapabilities.html | 7 - docs/interfaces/Rectangle.html | 4 +- docs/interfaces/ReplayCapabilities.html | 2 - docs/interfaces/Rotate.html | 6 +- docs/interfaces/RuleEngineConfiguration.html | 4 +- docs/interfaces/SceneOrientation.html | 6 +- docs/interfaces/SearchCapabilities.html | 3 - docs/interfaces/SecurityCapabilities.html | 43 --- .../SecurityCapabilitiesExtension.html | 4 - .../SecurityCapabilitiesExtension2.html | 5 - docs/interfaces/Space1DDescription.html | 6 +- docs/interfaces/Space2DDescription.html | 8 +- docs/interfaces/SystemCapabilities.html | 43 --- .../SystemCapabilitiesExtension.html | 6 - docs/interfaces/ToneCompensation.html | 8 +- .../VideoAnalyticsConfiguration.html | 10 +- .../VideoEncoder2Configuration.html | 24 +- .../interfaces/VideoEncoderConfiguration.html | 26 +- docs/interfaces/VideoRateControl.html | 8 +- docs/interfaces/VideoRateControl2.html | 8 +- docs/interfaces/VideoResolution.html | 6 +- docs/interfaces/VideoSource.html | 12 +- docs/interfaces/VideoSourceConfiguration.html | 14 +- .../VideoSourceConfigurationExtension.html | 6 +- .../VideoSourceConfigurationExtension2.html | 6 +- docs/interfaces/VideoSourceExtension.html | 6 +- docs/interfaces/WhiteBalance.html | 8 +- docs/interfaces/WhiteBalance20.html | 8 +- docs/interfaces/WideDynamicRange.html | 6 +- docs/interfaces/WideDynamicRange20.html | 6 +- docs/interfaces/ZoomLimits.html | 4 +- docs/modules.html | 57 +--- docs/types/AnyURI.html | 1 - docs/types/Duration.html | 2 +- docs/types/Name.html | 1 - docs/types/ReferenceToken.html | 1 - docs/variables/Discovery.html | 6 +- 113 files changed, 423 insertions(+), 1453 deletions(-) delete mode 100644 docs/interfaces/AnalyticsCapabilities.html delete mode 100644 docs/interfaces/AnalyticsDeviceCapabilities.html delete mode 100644 docs/interfaces/Capabilities.html delete mode 100644 docs/interfaces/CapabilitiesExtension.html delete mode 100644 docs/interfaces/DeviceCapabilities.html delete mode 100644 docs/interfaces/DeviceIOCapabilities.html delete mode 100644 docs/interfaces/DeviceInformation.html delete mode 100644 docs/interfaces/DisplayCapabilities.html delete mode 100644 docs/interfaces/EventCapabilities.html delete mode 100644 docs/interfaces/IOCapabilities.html delete mode 100644 docs/interfaces/IOCapabilitiesExtension.html delete mode 100644 docs/interfaces/ImagingCapabilities.html delete mode 100644 docs/interfaces/MediaCapabilities.html delete mode 100644 docs/interfaces/MediaCapabilitiesExtension.html delete mode 100644 docs/interfaces/NetworkCapabilities.html delete mode 100644 docs/interfaces/NetworkCapabilitiesExtension.html delete mode 100644 docs/interfaces/OnvifVersion.html delete mode 100644 docs/interfaces/PTZCapabilities.html delete mode 100644 docs/interfaces/ProfileCapabilities.html delete mode 100644 docs/interfaces/RealTimeStreamingCapabilities.html delete mode 100644 docs/interfaces/ReceiverCapabilities.html delete mode 100644 docs/interfaces/RecordingCapabilities.html delete mode 100644 docs/interfaces/ReplayCapabilities.html delete mode 100644 docs/interfaces/SearchCapabilities.html delete mode 100644 docs/interfaces/SecurityCapabilities.html delete mode 100644 docs/interfaces/SecurityCapabilitiesExtension.html delete mode 100644 docs/interfaces/SecurityCapabilitiesExtension2.html delete mode 100644 docs/interfaces/SystemCapabilities.html delete mode 100644 docs/interfaces/SystemCapabilitiesExtension.html delete mode 100644 docs/types/AnyURI.html delete mode 100644 docs/types/Name.html delete mode 100644 docs/types/ReferenceToken.html diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index 484d2745..87aef72b 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -7,18 +7,18 @@ --dark-hl-2: #9CDCFE; --light-hl-3: #A31515; --dark-hl-3: #CE9178; - --light-hl-4: #0000FF; - --dark-hl-4: #569CD6; - --light-hl-5: #0070C1; - --dark-hl-5: #4FC1FF; - --light-hl-6: #795E26; - --dark-hl-6: #DCDCAA; - --light-hl-7: #098658; - --dark-hl-7: #B5CEA8; - --light-hl-8: #008000; - --dark-hl-8: #6A9955; - --light-hl-9: #267F99; - --dark-hl-9: #4EC9B0; + --light-hl-4: #795E26; + --dark-hl-4: #DCDCAA; + --light-hl-5: #0000FF; + --dark-hl-5: #569CD6; + --light-hl-6: #008000; + --dark-hl-6: #6A9955; + --light-hl-7: #267F99; + --dark-hl-7: #4EC9B0; + --light-hl-8: #0070C1; + --dark-hl-8: #4FC1FF; + --light-hl-9: #098658; + --dark-hl-9: #B5CEA8; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } diff --git a/docs/assets/search.js b/docs/assets/search.js index beffe5fa..981b3e21 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA8SdW5MbN5Lvv4v6Vatl4V7z5rU8O47jsRWWZs6cndhwUN2lFsdskstLW/LE+e6nCmCxgaw/UFlFTpwHhyURyMyqStzylwD++Wq//e3w6g9//+erX1ebh1d/EIvaVlq8frVZPjWv/vDqm83Xv/z8/avXr077dfvX49ddc/j38I9vPh+f1u0v9+vl4dC0Ql69+r+vc3J+bj41+2Zz33zY/tpsiLz0x0lyf+z+l0rr/qksQ5tL/Z82z6tPP+2Oq+3mcJGz2hyb/aflfSss/r0otFoIdZF6OjTvm/vTvmGJvIuLR8Jfv9ot29dypGZmlB68iCnPckerzFf+eXs4buJvUdQblZ6vsn1re77KqPR8lbu24m/b/QNPZVT6CpXb/ZGpLpS85umOn7lP5kvOV3VcPTXbE/PBXgpf4Sz7DdNPfMH5ipaPXVmWqr7oFV9s37Ru/dx88/DQ/onZ6IeVrnja03H77Xazae65z5xUmKR40G2/b59i1arJau4L8Dvudx/+iyftLpQsPMDFutyr2yzXX4+r+8PbpivHVDusdYUJD1M0P9xM4fc/TVLpi1+jdHXYrZdfuTovpa9Q2Ty3hZl+eXcpfIXC1dPycbV5ZGp8KX2FyqfmYbUUTI2XwtcqnKLvOnX75r5ZPTd7psao+HVK2wkD/0vG5a9SO6GFXApfofDQLPf3+clGqvBSeJrCwXjxc/M/p+ZwHJshp8X4Y8chmDBF7t1LncKzEbsz6j9uH/JfEOk+V7hacadxit5Q/mq1u+Pvk9SG8nPUxo70zf2xbeXvt6c9/tLx7xNcx5dPl8YloXdpBfxQianZCeT202o9RTOpMV/18+qh2YYi7YTw0+rxtF92b36CLWMi5hvXbO63uW54aEdUer7K31YPePk11NcXna/sc7N6/Ayn7ENtl7Lz1X3awe52qCsUnK/o4+rYugCvZd69FL6iAeFeCLSbQveTUWS0li89zy+/dOEttrI3l/LjOt90xmUeMBdhKSl9Uwy0UM29pblQwYS+6cWCI7sLwCbEff775vj+6+HYPL1tveWbzcOH1VMpzFYozh8RHtq6XcU5Cu6iyvj5S080YtCHjBOyjfpQ8spZhn1ddx3U++Vz2wXP+iJ3Qxk3M68LXv2+3cx7Z1HlqwwSLp0JX4w5Sw2zJr537pe/nWdLBUl3SanCxKuo5bBrn6UZVXMpNkPPb8soOAgUnH+fIbnZ77f7kui+AE+2rl7Ax337vMf96f5YVpAWm/EIJEYEVHACQ7w1PRDOWMhzhmYgeXQ9wIc7QDoT6UxjOUDPBILDRjdADQ/YsEkNfmEMPsMGM+iDs3AMi8Mg6aP0hYVdoN1jsIVLWYBwFlvhsQ4gnUE4pqIN9IKmAI18FGNVdE//8wy598vd8uNqvTqumuJDkHKzeupPy9P6+C4s0IvKhkWv1sdXN9PXUOAFuVxabpYnFGcDo4BwBH5sPm33Tz5MMT6opoV5OsVCvcz29oxZ2sQpWiL/Ecw/S8oy5WdoPkzUnCk/Q/M94Z141jVOOEuh6r82+0PsITTAef6dP2N/Wv5jm0cZsbi7vmjB9N68nLLVhq3sXHSSsvh1/dgc20H912+j7vO7L8dmk3t9pfITlufbY1UlMcdZuu6gHPwuig+aW39c9Sbu4upXGTXywZjW8T/P9+/+uFofMbvLCb6LKrEfNmfA781+O8c9giWo9tUmff/u3JDMxLcSVbvaiIevm7c/vp9kwKXK9crnNtpbtNWSUX9LpE5qDne4/tVm9Qu+P+63T2//9O27STaBylcb9OOHaTaE8ler7cx/ntZiLlWuVj61+76i186Fvv2UiT24ForzO+/Px+Puj6v902+tuX/ZPe6XDzh4OqLrDsvJxFELz1kwM1T7j+X9r6fdbBuJkH+BgT9sH3PZQRMsfJFyWxNPuy52gtZFk+1Eom5mbLE1jto33ip5JpVbJ8+0CfPc1eF++9zsv/7cHLbrZ2ZDvGTS0brcBx815z++zjMl1LvWjH3ztD02b3uhUywZVr3WmMPkPui8IJ7X7ZTNmNTTxHZM71yyuQZzho5z9sHs0eLmY9kthrDbjlxXD1g3HqeuH56yrhyGkebhvPKZ0qveoco3eUMzh8kbjY7Zd3Xc7pePzeiqKvu6cP1rzXpafnkPJE/6kgUZ15r32Gx/2N57cd9tjvtpA/cdrH2tSd3GjP9stlPseKlyIy/qUkMO7/sGNMONBgJuNuH4cXucZVhOwLWGbc5LOO+Zc40rCbnWwI7nXmddVsLVrv7wMLEruNS4VvVlFTBJfVJrhgnxmuH7n9ir+UxR/uphefrSVl7iGXJJ+l1cEz9w7jnGTPl2+/S03DzA988zKZJwE9OK68qiSeNrynFT8r4xbg7fE1ab3el43ve33XNF3w2rcR4zv2xbL7/+dDq2MtkWkDrXqJ/wned93mz66v1pvzp+hZ4AN3CVa0yjZH+bqeCur5xLfCw+1NjM/rtv3v25OX7e4gGJYR2UdEtTQ6DgL+0Y+Ke2s1nnlkUMU6GkK01l+9dko/ne9eGH99WbxTwFd13lXxbzXsS8AOG4TYwQIdOssc/DNfBf9TFmf4Oi+mqG+up26tldaaQ+vyV2ivrt5uN2uX/4X83X/2w2TWERnjUmI+F605b3reLDu+16df81TOanGQbrX2/WOSPtm0j6NLuwgBsYNmXInDtQ3n7MuclIkzPrb2/0os5uC8yb87dfonrXm/H+mz//MMOKuNr1Rvza7D82++1hhiG06vXG9DnbM4yhVa83pgtxvl09xtmOLEuSeteb8fN3c5wkqnW9CcO56bQBH0xuS1ui+IY9Lb90ncNEa6JaNzOhOyPsh2bziHfcjtqSVL+JUe/OmxNmGjWofgMvOpf1g9vUOeMdqH3T9/SnVRfynThow/rXmzV53n/NdD8zy/+uO0RmbIo/KMSf3/+t21zBl3nXl8cPNrQ2o/Z/v39/+ni436/8BqcwzzqHgicYU5ZytYnvTuv1u21rxhzLQOXrDVqeDsuP6yZ+6j8vN8vHZv99b9IsWyfJnf4YSSwynFE0GpAcFruBU+ekjrg1shk/3c/Nct3tQHh/3DfLJ8ZzFivwn/jnD+/+3C5bVvdLPE0aV3NHROA3UX6+vHG/fMCppjy7zrVvbNLPH95fa1ck4obGFccdhmXjAxDXrNi1z7u8xhwaFJuym+XL6un09OPpqV3R/PRpsOWNoecuLwO/C/Rc+A38uduzzI6G5kvz38eO985HVN1hMfh1FB6S+VZYFt6gM8cyR7ryobXZ1AVmD54xI1f/SrOKfUPGlPH+oKQ+6QM+/Ndo+0+L3OA7I4kjX5naiZ/m7fkYyrFHQuVu8FxZsSMPB83OKI9O0pr2aHek5o1MKVDaEVPGWO0UU5anh9W8t0Jq3siUWW+F1LzelDGMnjeFBdOnmFJOp8kbwkioGTGDezYXx4axo7qgjOgRcqc/NOvmy+w+a2jfGyRwlsUjJ34d7h/Wt7QbyLuR2ckoEQ4OHjV8WOwWY0RG6tgQAWzOptV/aR5+WH7NnNqeNSCtN8eMdN18Pu92fL0MCt7gRefljrxqbHm2iw2HCefPGS3YMah8A4P8MUznFdAso6CAGxj28LX9w+r+UmeiM9yh+rcz68N+ef/rTJMudW/x+bpU9n1bOI8XSt9uUHueSWlWSnem81grHpa6QRPOCB1pv8DgbFs5Lh+Wx+X77BnXOQsGNWeYkvaWnBFpWOom/eSc8QgYnB0HfB/HGAYG5W4zCmCx44PA0OxC6HEkVpszgla9jTHZEGjJjHLQc5oB5UBsyQpG/JVvyoWO95Wmed4drH+9Wed4Zveof/n5+2JHnzEsI2GWacmZ6emdJWNttlD8Bk13TPpICy49S24yd1qXaNuoQWn9m5lVjBCOGjUeK+SZFPsJO2R+ZbQ86xuF0HjZK8bi4OgcOHgJTsGC0ctwphmRvxSnZMPI5TiTTCjedVIwYvzOk0lm5K8iKdgwciXJxPcw40uMXMIy9UNkb7opf4fyjTeTjGBch1WwhXst1hRgxRut/iWD1Lyxid/3nzd+TlH9UuVa5eHAhym6LzWuVY073ZzaQl874WnPOVyTnvelzrXqORHyK+LjU2Z/7Hnfv2rGN3uud8tZ3pXzOxYr6gv/efsw26qskHkG5uZ5Y/38hM3GvQUskXdx8fGxojyX42kcOSef1Zqz9wqCNly+VpCjrnCr4FDf2KWC7DAzT135YgCOsszVPUNVpZsCrl5pzVlaMdrYn85HMI6cFwOK8Vvcp8LZkDnBd5/GzoREluemMd3/pig/V7hacfGLZrWPf9iyCSAnpfx1B4WmZNhtTq2Q42mP1wVY9B2pVsSs46/5afvQwLsFc9rP5a9U2x8DVjiEO2PAsOaVphya/Wq5DjmKE+wg1a404vNy/9A91fdwt3zGhKTSdAMSVnS/zdw51f3A9+lDV/xt86ks6i4qluEv3p6Sku8zCxyq5fvSsoaqSZIpV4f7sWkULTNhKsU5LAWKn3BKyuARSh3d+XpX3mIcFOY/++jSOCeduUJGTzJ76Zi1hbmCnGLMyKo9bwpn8T7BkKfWb2aYca52IyNYLWTEIn5T4ZgHjti/7MnpulhkICo3oaVkZl9ZqeXpFzQ6NyL9Rq8FYumPq11vxJ8//GWa+lBhluLS1z2fj9SOn++b4zGzXhutNGV0OG5/bB63x9XYGfoj2u6GkngvZ/jEuU5r1+Az55gG9vVvbNbDabduvlxh10XA9YaVPOuH1QYOhKjcBP95eFr1hrAa8EX8Ha3Ke3z/GBlj2inWfp4tpOb1ply05q5YzdtCq84yJt3E1fjEze/fPatCVwuKTfGDyXLvliP9N7I7u2eqK5rPk8jaQCrOMSTZ6NqWGD0+d1Bo2kp+CVfRWOjdpUJmk+vA3ozidete3Tm1U3THda5UX4pOZbSPxqbYyicqvo3SZtNtzobjXUbvS43pqqkP094lZwYtx/fkkeeDglmPODA9Y8B99gCrvP778qFVI+ozfbLh9cnmX9Qnm7l9srldn2yu6pOBIcSfDadPNjP75O5Us93x5+2pFfbNw3OD6RxWcAcrZ73L3KDrQFYw2hVPdaGrRHrHukqe0uKgiNSOD4o8xWODItLNGhR56kcGRaSdMyjylf/8zUTVvsK13l08eTfj3+OH7xbU086EOTgOyt1qcMSCWY34JoNjRv/44FhSn4SJu8v53r3/X+2KDIbiXn7mv9JfGxx6JbLuQrlM6C6yKzfotfV2n/fLA95ASrUlxWcrLTaJgc7xxoBVDr7Q5USrscE1X3rCymeLb9sZkX13rld4UPwYucF+/bhtC3/GwfMRW+LKtzKo/UxzTAnVbmVE9qDTMTPKx51ON2S8JRSMYTaMMYMG7YTXPma2i/fvv387QebduXzh+XhzrlJznNUMmc1vtcR4JqO3r3Ct4t1+tc3iu4zuqM616ov0MKN+HBuW1JdCyZw7uYeF+T49OXhKEsjnRVDHt1lsj3KGNedqtzOigmejj1tR5c9Hn2wG5zbbnCnsO22L5pQclGMU3x2PuSOA8Tz4WDz7lzsDLywB5k3/uYpXTL7cN7VP+TvDuCrXTDT1soK+WmUXquOrPJe+WmXp7umhytFrp8edaEornds4Y+XCkVyfi+KzrHMeRbHx6UrEC9HDcX/qbgwqibpLy5UyL+IuxIhKJfl5XYFDUVFUiKllmBQtaBY/UkRLznymLu9s5In6Ile9NZjNVXiBE87wyeuO75FHukr3xo/Jfvvj+6Ls8Ps82Zvmt7QNlV8ZLM7VvFAvbfKxOYa75d4uj803m4fuONCi5kyFOboPU3VnKsx9bk7jTsvN1MRuCcOyMzXm88czalGFmbr7LPcxlVG5uV9wvCuLS831UUaHeaWWFy+b4iq4yqyn9K3q5+bjdlsegkjBmc861klfisz8YmPyD9fI7xrLyEBwKTL3/TRTxoJMBa7uGGVsjj8398fl5nGNEUb0O3+xBDPhBqLu8vluiVkZJfgO0oGSwoWjDCW/rR4wuB4q6ovOV/a5WT1+xuB4oO1SdpK65MSl7bEdU5G28Mv1YflITjn2dzYluyXzcd+MKriUmqOifPB6pIVxwjpVFL/zH9rKP336dMBM6+XXK5saEVRoaJFBU5oZVZBvZFABfSXv9tt/hHTWnLKXEhNyMnKdGhB41xfOP0VkZEbhfvmwOsHINNJ4KX2NyuN+uTk8rY5tS8cRL6SZVppoAP16b5vL3SE5C6IiE3ajdhkS+dQhJPcurZN/sNjmXCJxsZ0ONF+KX6V0N9oSBoqTKlcp/9sfl0mMZUzzS/mpatPNgM2m+Wm/auvk77kkZa4fm6DE8ig1MDTnODOe5S6tNNmA+IX+9eUA9wTslK+IHq/Ff+nr8V6Bqe5uKAq/G8ZDZ/d3jvsf11og6wbmTvq4s8znf9p9dtbIU3J3ETDzxcyawjFtG5/dTTGP89mmGHsDWFUUPQKtso8wcTdh2YZieGiqCadDW+60gYN42Yyo5m1MeV41v/05MxaVTYlq3saUgy+avdO0bE1a+TYGfWzfNN5wW7blUu82ZszqQa7tODL9xTcv142M9he5sjfoL4qiR/qL7CNM7C/KNhT7i6kmlPqLshmj/cVUU0YaadkaTiNlGDQYwH5uDtv1qThuvRThu182yIYkjsTZqJ2TQ21Q50i0La90+ArbyU/7vo/7LdwwQMtMWC3v2/93NX9YtUt7tuy7Qb3SI0bGZ1NW7rfdUa4+MP2Md0VgQ0DN60z5uDrup78PUmuyCcmhLrvmcXwr6LAU/6s/bp/zEZKM4Lu4En4+YHhufd2VPF8DMsUGUm+GGcnhaMKMv+dBoRu9ZiyX8ZaHVmfUdwUL7zhjQFprugmJJ/eXD4x7Myx5kw2LBdGjexYzD5ALw2WO1yxZUEzRmab+w4cfpmoPVW6hvDvD4/1xOf0FxBVnGiIWta30S+bXW+po3XVdh39/y/GqwdD7XTfANHve+hsVvtUCPCubswKHTzFnCZ63YnwNPsWI0UV43hDeKnyKMY+n5X7Z6m8e/tjPe2bYhaXcyMR+HjTDrqjqjYzZj8/48+YklW9k0P+cluvMHogRa15q3urdMKbyhZeT1L6RSX9+991/wpTmEWP6ejcyo5tVzLDiXO1GRjyVrloaseRp9K6lyea0IroAUZfAmLlxccSmgYD5hg0iTdyhMVv4VrGmuUNj/inmRJtmDo2TjRiNN10xNE42pjTujBgzOu5MNua8Cp9hy0vNG5lyWD7t1tmZwog1SeUbGVTs2EbsGe/Ypr+f0Y5t7B3xOjaOYUlq47F5+mGF31L/G7/bOqy6D5k7BjiRd5eUzeTn9ca9qONeQJ3TNXbp9KVeZN7EznFE9Zti7wj0j1wb/bxcn2bZ0Ve8lSHNunlq6/K+flqY/fknnG+Sqhs/1mSoLLm8w7clpCj8wm8jObeJ5JQH0LMpuZlDpkHE4ostoCy+Ldb+4Zi5/TFWkpRkqoIX6Hy3eVxtGICvUH5KOmRy/8ssRfQSmXxnXXrEOU4/btqECwzLRiVJ0u1DMr9SpuiE1JrMVykJvtuXvkLO+llZ0CUrGGnRo6YM4nUvNxCxIna4+K1idgXpnKhd5lnmxO1KloxH7qYZMhq7KxnDi95NM2g5sescNXJE4M0M3/M7klGb87KuMTdpf02X2CvgoTL9b1fuUUjEFHYoXEyZsj8hFV6I+Q2FD19DVXgN1W1eQ8V8DVXO0ncf/ut97mj0/je+pbtluxpbw1afCLt7KYitvpiVUfT7dgtn1KmWcym2imQAX24e8aja/TAhj3yFR8WLlLtQIjP6eStyopfQM2LRy7xjUNFJav2ulSTejqRiD0vxX8tffv5+gsi7UDyT3T40NrdPIftRc3ovNa5V/X8mq/4/V6hOWnhoaj4vBR/nGxeYMOvMPdBQ3t2++CiphQWPrFgeWd3eI4cixz2yuoFHAr0cj8ypjl/of7V9Y94nXn69gUMQYSPeEBmWG7LO+Ovtap/f8jQsxX+S7/64Xu0mCL3rK+RGmoHB06N3RdVjITxQOZg8cfMTx4g3xb1QOUtGAmn75rnZ42NRcza9VPn/8FXOys9P9W/5s9OAgN7wG30baor/PrMsGgt2lqIAOevGAwDF70SmsskSpbizKVuY30tw+6GSojsoJDthzTzfvA9StIvzXcbNKX0ejlE3CMJAkSORl4GpE8MtWGcxxsJVWQqsYLWj0RSu6qftc/Pz8ikzMCLVUY3rVO/2zaE5TlOe1LmF+g/b036OCVG9K92t7bizGzsyPhdVuU75Q/NpeVofv/noU7Oads5+7Cbt77aHVVfNzzv5djGl3dTkbmJ5G3ORpJuY+nOzbos9N+cV0YfuvIX1cr7B4/Juanb3Xm5mc0bYTQzuxtzV5rQ9Hc5v5q/Nenu/On6dZ/KouBsb3b2aW1mMZN3E3JHIYt62qOKtDCnkmIyZMpZdwh5DRsMweAgh1a4z4vfioh9bkNS5Tv2kCenceWh++vnH9kXiy9MvP07I6zkuj/jMnlTY3aVg1vyzXdktJWGgYaiKivKVxS/pu+e23PvTx2KQbVBowl7D7BfAQu8uFfDzDO3Nfa2ozLvtenUP6U/GCFh5ukHJtqjmuHxYHpejKyJY8AbLorzckbURtnziAqmgvbhKmqS8tFQqGDC6XppkxP32qVsF+DzFTAypYMuw9g1Memy23R1i0z3uLq15A1MOn5e7pm1SXx8n20Kq3sCYbt6R7dQLlsT1bmBG03UhU224VLqBAZfMhok2xPVuYEYxW7lgxnim8jQXHc1SLjkpL0N53udhZoVwvtiUpJBpzlya8ZX8eXTaN2bGYKvKT6fj7jS+DTlX9lYbVXKiOftU0CPM2aaStWF8l8oEE0Y3qWTN4O1RmWDK1hctH4qStSatfBuDDs3m4d1+9bTEE9GyQWnlW76hH9pxBO5J5LyhvvJsgwZN9m0zYXcZKnyrRpuVzWm18CnmNNu8FePtdooRow03bwiv5Y4Yk1517c+hKLM8UmZCavuEgQFquStIyCzB6QOVTOM2gIJtGRHXGVcO5EBjGIGcvHLgEQXNt6CGkaQxWHi2Jxvy+JKJgcYq+lKzVGQxZKyhTB/LCp4nHEKZKC1UnGXIcsLpdokhhYrz3wh38/PwlWRqzn8ns0wp1Zz/Vvi7L4bvJVt3ljmsjIPYBlBhluInbnQv0Z6rNcsETg89sWMubbmJjjTLHxIdF+L30f5ytuXm+B+rY/HUlYH0u2HNwjaH5Alyffnko/LOlsw8Ky9ryNQT6s5mzDqirnig9Ln3EKOeni99q41WeeETTkcSrAlycZtVwY7xXVaTzOAekIRMmXRCEs+c4ll3Y/aMH3o33aBdfqY4Zs5L1Zu9nekHSMH3NPMEKZ6R3COkkGWTzpDimcM/RAoZNPEUKaZJS/bZTdCm5bTDm3hGPZ2Oa9aJRcikuPKtDGIetoXMmXLaVtaY3DlF4+NUvvStYkmzx6nCg8yJJs0dp6abwT2taNY4Nd0c7nlFszq56eawT+XBjXfKsTw8g5hHKCFzppyhxDOGf4gSsmfiKUqs/iQp8x5f9ETL8PuOKGLCFnyXVsLPOTB7PMTCNyCtdJ0BcYBk4it4qXWDdzDZBFLrShNKED6jf5S/c5W/+/BffLWh8HUK+9AHX2tU4wbfOgTwJ37qS6UbGHCO0k+04KXWdSbsm/tm9TxFfVRjsuo0D+5htSydAh/9fpOsNyJuNNktMm9qgH+orBzl5yjLJ9RRXSN5dOOq7uMvmMkFokoHdSapjx3jP5b3v667uzO+3T7tms0hO2GHBfmukttNmRdbvusP251Rvs7h9oL2dZGyj6lPTrgo3d98q8ub2Tc3z7u2mX1n8/wLmyfd1nzFVc3T7mkeu6T5uy+77eG0h9+2/+36VpJIKjeMi0HZYN1qu8/EDFI1Ucl5qn5r/2n727iiS7l5ap5Wm75IlwDIeH+DCjMVL79MVDyoMPuJ/3OJz7sZPOm54OwnZCq6FJz9RN/vV3D0GzzRueDsJ2IquhScp6iZ5BnNLdzikfWpHq/5TivWu1tNfHFxh/rH7f1pHGkPS01JRjpuff3cdY8Z4Xe0In4+8ADlfXPZ3Xs5O0i9a83YNMt9lnDmbIgrXWvApxn6P12lPna4/716aN5+bf+yus8eEkTLXD+iQ4nlkX1g6NTZLtZZnugWlCYv8fPq2PzHcp275T7+/QYvj0obeXGxcblV2D430A2VXcpeoe7jBHUf56hLTlp/Wj6uNo/vm+Ox/R/swEkR/jf6yF1AIg13udr4Uelz5EzadxI3mUvKsB1xlauU32/X2/375bEweEELhvWuNGNz3GdgR0b/pcJVipvCgggqjipcpfhT1+Gztfalr1K52n97OuZ3O0PFaZ2r1B8+L/e7SW4e17hK9W+MQRNaACpeZ8jIwIONSCtd6e+lmwCww49eCJBVPRq6Ewt2nEss/kXhu7PgGQG81vqbhPB6C2YE8RITUKQHv+GXX28X7WG9x8isKyI+vSp2zCevbjzq0ytjxn3yqiZEfi7vcmLsp6CcH/25KJ8Y/yk++VhgJnpiVmim+KRsZcw4UPHJxgI00ZOxQjTFJ2MrY8aD8sq4EaFe46SYUF7tWFSoV8eKC+XVjEWGejWs2FC2Ex6u6nF3jMrxO+Zv/sgPDfXPdanDDUfkX+WMAFVvxdwQVd6Y6UGq3paZYaq8KRMDVb0dc0JVeSOmBat6G2aEq0odSWHKmbdhfN45YkQpaoab4bDU7SNnrFkSMPfa6BlvjllUnIugZV5mUoL/IovuAoQyHIUYe0X4Lvv1joeHf1sd/m21+dy0E1Lfg0xUzwvp9QaAoN4NTGCF+S4mDAN9s0ygob/m/XH5cbVe/V6MSKWlrm+nGZnldgrMndpOc3rL7ZSveHTBj5Tz1vxZA5Iv+hJA+qYd7b95+MfpcOwuNIT25ApPCPBuT5uH5f5r7litsoo7Uj3z8NlnGjHqp0+fDjg1mGnWRcCNDNs3h912c8hO8kfMItVvZFTZZcsWMTyXYU7swB+23RFIZVhAy1zfHUGJ5c5oYOjUrgjrLHdEXKXFb4oVj3/KgvL4C75tPm0fHzNbOy4/Xv/NUlHlj/Vi09SvRLSUP8+omuJ3IarGPwhSF3+JH7erQ/Nz83DK3ouQluB/k+zrAgJH3hkxksUoL6eTiIXMDbSZ4lPyl8d7ojFFd0AIK6qfPGF+8Z1vaKOWxbVvZtJm1ONG7RqIuJlxU2DM0K7JYCZjEs+t4fkNheJ8t15NmiGOaLwrSZv6lrIHLcz8cOL6D5c7diFfY5qJEz4be6lW0HQHpUx9KTf+TNd/Jd5HYn2bKZ9kbnJL/8hXpbfkP8OkBJeLLZNTXApxjclJLpcYx7w0l5Ip7ESXFxumpbqMI50JyqemuxQi0cyEl0sMekrKSwn0TEl6ecE+k9Ne8iZMSXzpDZic+lIi3JOTX16Q97z0l4Ix0xJgLobMSIG5zbgwezjIjgJ/fdmWXTy/EpWbNjxnZuJZwXcvlfAjQtPnvOS8CePvecSIzKseseIGu0ipNM75Umfbcl1md5ZP7tCFgbq49GyVjLN1Yp3cw3TKSnm+OtlFr/XMGQ6Z8cP/bI7vj/tm+fSX/eqnXXbnLCjG98vz2VTZ06xzwu9IRfyM6Alyw50vN8mES5WrlbcPc9ze41OYSm+grzTHAPqlN8vd4fP2OP6tBwVv+7WxeP73Hj5HZIxwF1v8vu2LEWd5YRt48YF0JeJ5cesEp/vjdl+QdJcWw6YHc8rv7VBSEpWZoSE6daWohZTjaRIL9fLeH5vjO8bjpMXm6fkr86GGRefpu7S2EWVxuZmaXrx8TFdScp62n96/HXt/5yKz5dM+J6vlpSBTV4xUVof77XOz/1ro4WiZCVOs/K0qUOjdceQmlYG5pdnPM4Y7UPFLhesUP7UrveVj8z3MWcOq4yrXKX9onld4gow1X8pfp3a9OrQzq3Yu9267n/CtabXrjMjd4J7xs1JWQEllNFpeir1fdQc1HKNpaN9Uh0X4bYd8zBGR7G/5YmxuUr3fg6E7p7YvPUOrMKJSKu70vvfnOU946LTOHBvibredLnzk6+5Lz9AqxdCJLnqfl/vV8uM61lx0GnIJ5rvLndTvT7td27KyN7SCkhPQ+fLL6un09OPp6WOz/+nTi6zclZk5bXdFSfjlZh4zN1M8/v5S+qddUziuvWBmVspME8ln+zGTinD+6QZRjVjS2JUXZ3ty0YzumKs/bZ+ad+WrS1/UoRqzVD822z9v8bieKHwpN0uN/9+YjnOhWQoOvUf4y5CX8WQ8pw5WmaUctrhxA7LVZhnxufWGsR7qRTctPUvl8vRltV4t91+/3T49LTcP44+MasxSPXYz8otK1oXIRJXRWr70Jr/8kpsLYUVvLhWK+t40Y4HiFw+99HyTrXiDhTAt6x/ldl+hN+vyD/9WXWMO6fVLl7v73/j9/vKjD+A25xvq+46Wp+FupHb2eUOBEZO6K+hn2oOqzjNm36zbEfu5f8IP++XmsF5OMGlcwHWGdY8636pM7XkmdaB6tTltT4fzw/61WW/vV8evTKNG619rVve0s21ClecZtAtP53eaMc1AVeYp/719jCmaB+XnqR3rQyONrKGMKkuCU+dsjSztTgpMWLzgvTFDaXdPhb2pqXX5uRZX1TJ/eGZOVTqcnC+eeLvaNz7DsRDSyxbmv8Tv/rhe7abLvuvr5Twi9xRzpjvjhoxPfnIywnNMzCyfYNKbYtr5iF3XTYT4NnKa+DWG7pvnZn+Y8ypfav5/d7SzKedHLU4gc3L6p7mtu1HDvMtdY9+/0O0GtvJm5JMNJjP0ZFdysUOFRfndaSvg5+XTbrLwu6hidpCFT5FbxZXCEXkzLtVuYkRb/EOeHY29jw8jFGmyMdSLZhgFRNzEuLH5WN4m1vRsxBSSMXGOCZWzJdJCN82UAKLZWRLE9pEAezF8fJtobSRrPF57tmp6PDPWMhbRLCvpCpQDwrGutDRfJfkaf22STJNUX/hxgoeFxdm4tLuXklnLz5YVVm8MPedifCXk9Xy/2Z2OxXcUlZj0opji7kLR7APEBmaUwQUUUpVfP/EUHfPffqDrOPL1GergwWhIV/5UNJ6igq8NdI05HFaXDAPb4za02tIwQAvdcBiAopnDwMD2rBEhOD3VhrjWlSYccicjZZQfiuchldTGX/d9P1AWPi4tc7tvCyXzPu3A8OKX/TEzYOYMiOrcQv3kFzDuVwUD4Pf9+XwiRNGKvtCUL8x7vkTytAe8WI6f8OfmafvcjDoxKHY7P84J57kyeoJ5r7tgx/gLL5tBh4SY/o8MDKDobYeHnAL+IIGeZk4/nbVkvLcum0DaNPPt45I37b+ve/eZRyls1lgeTyPr0aTMjbdpUMkT9mjEhmfn912SSyiameC9FLjVMohI5CyFIiunT1GpvrEZKlRGuXvplU1+XeVFb/KuGCve8ot6Gvvgsbqk8EyFaTpoXlc5EXRUzel4nzu6iih6KclXldwXfk4t6Pyk0DGAYrfrG3LCed0DeoIZvpk3YsxLJxiQHf2y2ssjX1l1Os8LmREj3xkUu+U8DwvnzvOGT5ALXbykfkyyI613tRnZr501oPy1y6rJrd3n9I6R7w0L3u6L58Xzvjl+jtwOtXMWy0RDomo3MKKwx6dgw9hGnzETkvntcbsrTWpffr7hTJYIZU5fI0unT76GOkemXgx1uYnXQFdx2pVRFG2Wia8c73dWtP92k22lvRzWptLOkOwelM32oRluuLvI73+eITlz2zJ6BM4Ny0VdO5LQPVDyUoAlnWxN/LH8kqISc6R/y3xRqOjV+nJbLrNax7ZelnXTzHukjpFmn9VwiekWNMRlJms49PblFcRFJsvfRyGmvApSatZ7gttZ4NvibmMpvDOesmHBOT5GFovIxcaXiDn5y2g2nldBSs3wgpdZYMkLklKTtdwnM45iD52Wm+4B7WhZ+OzhV57U2lb6ZZD8drled0e/XYR3uU3tNOz8z8XBtpjrBuTcjSROXmwpmLt92rWfrDsx8Pi1tCw/qx8pXt4lWdJdWioC3ZOXjNE86NvoQJX+07f/dpN5UC+HNQ/qDMnPIOKN3APxu9J+7bLc5fFzQW74dYbcz9vDMclxGciOSsyQT9c4A/Gjy5mS9EOz7/ZuDzvpi/ioxAz598udP5bzuCrpIKVm6DmBkzcu4k+FwzaKUovHsFzEsw5hKftm7gSWF/8cO3ylKP98LdH5BJe8lkG5q3UVHmlYcIa25X3XG5LT2QaqSKn57eRbljvjwrPeZSfn+82n7f5pCWds0dscFp2hEa9CL1rKq9ByT1BeXMUDCGdlNdKe8OImak7llQ2RTuZqm+a+0B+/FJgs+5d98z+n5lAQHpWYLL2bbn89HJunt8tj883mIYEeA02Z0pO1HiZpzZSe86x/Gh2Y00Kz3uf9dldqL3GRWW9uRP7hGvldQIHVnw0LznpXU7rQbPk5mr+Juv+yTlpyjrbiMWexMtYhZ6x3ynqRc3W85Q9CmdKznix7eFvyaKNHt41oKRzcluhhHNtW1oQjl7GOcuRypB0zB1d+5HKCvlzkMqt1LHJZ6hP94PBz83G7LYySpNScJ8zFR+OHGouPljTk46MvGsbjo+XRY0zBeHy0IL8YH72oYMVHR95TMWSZvC1WzLL8znjKuPHRsT4OxkfTDq4YHy3IL8ZHX1ZGnPho0QsK8dHICxjx0fKcuxQfjafenPhoyQNQfPTls5fioyP9/4d35d7f/z7HY4uSD7Mld2P5j+/LY73/fdbbaI6/bfe/fn+BvuV3A0rP0QoPTo0VFY9NHZXNGQcZR6Z6Pf/9+lWrpvny6g//fNXtFu46mT+8Em/km7ot+2nVrB/aen9/1a9dtk/n64ketvcn/8f/PhcLG2a6wqH0vy9evf774rVRb5Sr//u/X/+9r+x/8P/Qy3j5F1+xav9WoYrVoGKVVBTt38Rrad84I5OKYlBRJBVl+zeJNMpBRZlUVO3f1Gtdv5GuSiqqQUWVVNTt3zSqqAcVdVLRtH8zr7V5s6hMUtEMKpqkom3/ZpFGO6hok4qu/ZtDFd2goksqth709/q1lm/0Iv0c9aBinTpA5w/VAj1lNXSeiniPd5/qta7eqJpUBg6UelDV+UUl0NNWQyeqUi+qOt+oJKw8dKQq9aSq848K+lI1dKYq9aaq85FKwzYzdKgq9aiq85PKwMpDp6pSr6o6X6nsa+XeyFqnlYeOVaWeVXX+UkHfqobOVaXeVXU+U9WvVf3GCfKdhw5WpR7W3Wb1d7FAmsXQw0TqYaLzGVHBykMPE6SP8p2UQL4tQDeVepjofEZI1KbE0MNE6mGi8xmh0HcWQw8TqYeJzmeEhpqHHiZSDxOdzwjYa4mhh4nUw0TnMwL2XGLoYSL1MNH5jIAeJoYeJlIPE53PiBpWHnqYSD1Mdj4j4fgnhx4mUw+Tnc9IOAbKoYfJ1MNk5zNSwMpDD5NkJPRDIR4LwWCYephU2c5ADj1Mph4mO5+RCjmJHHqYTD1Mdj4jNaw89DCZepjsfEaa16p64xYirTz0MJl6mOx8Rlr4woYeJlMPk53PSIfGKjn0MJl6mPIeBgdYNfQwlXqY6nxGLWDloYep1MNU5zMKuqcaephKPUx1PqNgB6iGHqbIfCvvYQpMuVIPU53PKPlatZolma4NPUylHqZ8H4Yml2roYCp1MNW5jFKvZduRGPLIQwdTqYOpzmUUHNvV0MFU6mCqcxkFx3Y1dDCVOpjuXEZB19ZDB9Opg2nvYA5WHjqYTh1MewerYeWhg+nUwXTnMhr2vHroYDp1MN25jIaurYcOpsmk3s/qYc+rwbw+dTDd+YyGPa8eephOPUx3PqNh56mHHqZTD9Odz2iNeiE99DCdepjOT8P00MN06mFmkZ1VmKGHmdTDTJXtC8zQw0zqYcZ7GBrazdDBTOpgxjsYrDv0L5P6l+k8Bq/fhu5lUvcyncPAiZAZepchy8bOX+A8yICFY+pcpnMXOM6YoW+Z1LeMn+LDpZwZ+pZJfct434JLOTP0LZP6lvWLSLgas0PfsqlvWe9b0D/s0Lds6lu2cxdt0AuzQ+eyqXNZ71wWvTA79C6bepf1vRf8zHboXjZ1L+t7LzjdtUP/sql/WZOdvdmhg1kSmvCLSLjqtiA6kXqY7XzGQA+zQw+zqYfZzmcM7O7t0MNs6mGu8xkDZzJu6GEu9TDX+YyRsPLQw1zqYa7zGQPd0w09zKUe5jqfMXBC4YYe5lIPc77/ghMKN/Qwl3qY63zGwAmFG3qYSz3M+cgXnFC4oYe51MNc5zOmhm976GGOBMA6n7GL16J+Y4VLK4MYWOphrvMZCz3MDT3MpR5Wdz5j4YSiHnpYnXpY3fmMhROKeuhhdephdeczFgYL6qGH1amH1Z3PWOhh9dDD6tTDapX9VPXQw+rUw2o/REL3rIceVqceVnc+Y6F71kMPq1MPq318FXa99dDD6tTDau9hcL5bDz2sJmHWOuueNYi00lBr5zQOzpbDb2n16N/O9Tu/cTAYFn6j9UnAddG5jsMR1wUIuS5IzHXReY/DQdcFiLouSNh10TmQw3HXBQi8LkjkdaGzbz/8RuuT4OvCT8xw6HYBwq8LEn9ddJ7kcPR2ASKwCxKCXfjwPnT68ButT6Kwi86fHOyWw2+0PvE/H7130PUrFOwfRPs7f6qx/8J4P/E/H8OvMW5CIX8a8/dh/Iz/o6g/Dfv7SH7G/1Hgn0b+fTA/4/8o9k+D/z6eX8MhpkLhfxr/9yH9TPtBBIAiAB/Vr+EoVSEIQCmAD+zXcKCqEAcgIKDysf0atz+AAirCAiof3q9x+wM0oCI4oPIR/hq3PwAEKkIEKh/kr3H7A0ygIlCg8nH+Grc/gAUqwgUqH+pvRwUsADggYQOVD/e3wwIWADyQ8IHKh/zbcQHiQoAIKsIIKhHWqNgHASaoCCeofOi/HRmwAOCEhBVUMgBPGAipAC6oCC+oPALIjEKAGFQEGVSeArRjC3wCQA0qgg0qTwLawQULQPST+GFgBwsMAwE9qAg+qGRhIAYAoSIEoZLBD3FLABChIhSh8mCgymBrABIqQhIqDwfaAQpbAPyQ0IRKhngJHkwAUKgIUag8JGiHKGgBgAoVoQqVCvA9g7GBIxKyUHlYkPmKgC1UBC5UnhdUGRQO+EJFAEMVCEPuCRCJJ37ouUGV4emAM1QENFQeHrTjJBYAHJHQhkoFR8RjAgAOFSEOlQqOiJsCgA4VoQ6VBwntUIkFAEck5KHSi0JbAvChIvSh0lWhKQAAURECUemQCYIbI4AQFaEQlQcL7XCNBQBPJCSi8nChHa+xAOCJhEZUHjBUmPhXAEhUhEhUHjK0AzYWADyRUIlKh8AebgsATFSETFQeNrQDNhYAPJHQiSrgCYHbAgAUFSEUlYcO7YCN02OAJxJKUQVMgTMBKgAqKkIqKk8fKpwNUAFaURFcUZmQl4Q9ESCLijCLynOITKcMsEVFuEXlWUSFswoqwC4qAi8qDyTaER8h+goAjIoQjMpTiXbIxxYARyQYowocQ2aypIAjEpRRBZaBEwUqQDMqgjOqM8/AngyIRkWQRhWYRuYlAqpREaxR2eCIuCkAslERtFF5WtHOGbAA4IgEb1Q2JMnh1TYgHBVBHJWnFpXCwwKgHBXBHJUnF5mmAEBHRUhHFVCHwut1ADsqQjsqDzC6PajwHQJHJMSj8hCjwgkFFYAeFaEelQcZuUcA4KMi5KNyAa7htgTgR0XoR+VEwZMBAKkIAalccETcGAEEqQgFqVyhRwQcpCIgpHLBD3FjBiykIjCkcqUeEfCQigCRygVHxI0ZMJGKQJHKuZIFKH2TOKJnHe3EDc7xABupCBypPO+ocLJGBfhIRQBJ5ZlHhRM2KsBIKgJJKs89Kpy0UQFOUhFQUtVh2YxXvYCVVASWVHVYNuPgB+AlFQEmVZ1PiqoAMqkIM6k8BmmnnvgVAEck3KTyKKSdemIBwBEJO6k8DmmnnlgAcETCT6q6LngyQCgVYShiERwRdicCQBRBIIpYBEeE3YEAFEUQiiIWhR5RAIwiCEYRHou0k19sAcgtJhxFeC7STn6xAJBfTECK8GCkwixeAJIiCEkRi5DHDluzAChFEJQiPBppJ79YAMg1JixFeDbSzn6xAJBvTGCKWBQ8UQCaIghNEWHnBIb7AuAUQXCKCLsnMOAXgKcIwlNEVfJEAFQEASoi7KLAWQICEBVBiIoIOylyFgBPJEhFhN0UONVAAKYiCFMRYUcFnqYKAFUEgSoi7KrA01QBqIogVEWEnRUGN2eAVQTBKiLsrrC4OQOuIugGC89JKpz4INAeC7rJQhSWKwLtsxhstPCeaPFLhHstiCd6VIIneQJtt6D7LURIVsb9CdpyQfdcBLaSewXAEem+i7DxAm9zQTsv6NaLsPcC+zHafEF3X4TtF3jvBtp/QTdglHZgoC0YhKsIj0ky2z8AVhEEqwiPSTIbVwBWEQSriIBVMvqBBxKqIgJVwWk4AlAVQaiKkKW+EFAVQaiK8JSkXQXjRwAuSLCKCFjFGiwA+CDBKiJgFZyWIwBWEQSriIBVutQc9BWBFxKsIgJWwXNsAbCKIFhFBKyC83sEwCqCYBWhSn0hwCqCYBWhSn0h4CqCcBURuArOExKAqwjCVYTHJDivVQCsIghWEQGrdIkWSABwRIJVRMAqMFFdAKoiCFURHpJkNu4BqCIIVBGekWT27gGmIghTER6RZHbgAaQiCFIRAanAdHkBiIogREXoPGIWAKgIAlREACoOT88BUBEEqIgAVBxMmRUAqAgCVITnI3h/OMApguAUofOAWQCaIghNER6O4ERlAWCKIDBFBJji8GAAYIogMEUEmIJzzQSAKYLAFBFgCk42EwCmCAJTRIApONtMAJgiCEwRAabgdDMBYIogMEUEmILzzQSAKYLAFBFgCk44EwCmCAJThIcjFc44E4CmCEJTRKApOGVLAJoiCE0RgabgbBMBaIogNEUEmoKTtgSgKYLQFBFoSmZWAWiKIDRFBJqSGdMBTRGEpohAUzLTEkBTBKEpItAUnHgmAE0RhKaIQFMyXwHQFEFoigg0BaeuCUBTBKEpwub7Q8BSBGEpIrAUnPomAEsRhKUIG0Zk3BsAmCIITBEBpuDkNwFgiiAwRQSYgrPfBIApgsAU4dmIWCzQFiUBYIogMEW4cBAB7g0ATBEEpgjPRsQC9wYApggCU4RnIwJnvwkAUwSBKcKzEYGz3wSAKYLAFOHhiFjg3gDQFEFoivBwRODsNQFoiiA0RbiwTsazU0BTBKEpwsMRgeP4AtAUQWiK8HBE4OwzAWiKIDRFeDgiKrzWBzRFEJoiPBwRFV7sA5oiCE0RgaZk5meApghCU4SHIwLn7AhAUwShKcLDEdHt+QOtEdAUQWiK8HBEVNiVAU0RhKYIT0eyFgBPJDhFeDoiKniSgQA4RRCcIuoQssFtAeAUQXCKqF2hLQCcIghOEXVdaAsApwiCU+QieCI+UwHgFElwilyEA1rguCABTpEEp8iFyH9GCXCKJDhFLmTelSXAKZLgFLlQ+eYsAU6RBKfIhc43ZwlwiiQ4RQacgpuzBDhFEpwiF8ETYZcmAU6RBKfIRX7fnQQ0RRKaIj0cETgLUQKaIglNkdWi4AaApkhCU2RV5VuzBDRFEpoiq3BaUOYkGOCIhKZID0cEzkKUgKZIQlOkhyMCZyFKQFMkoSmyyi+bJYApksAU6dmIwFmMEsAUSWCKrELgRr+W7o2TVADwQwJTpGcjAmcxSgBTJIEpsgqOiDs0AFMkgSlSFNJhJYApksAUKfLBGwlYiiQsRXo0gjdlSoBSJEEpMhxchdMwJWApkrAUGQ6vynxEwFIkYSkyHGCF8zglYCmSsBQZWIrMfAPghwSmyLBPBa9ZJaApktAUGWhK5lgogFMkwSky4BQ80ZaAp0h6plXgKZmzpdCxVvRcqwBUcudLAUekZ1vJ/P4AiU63GhxvFU5Qw70JPOGKOKIHJPgsH4kOuaKnXMnCDFGig67oSVcy+CFc9kt02BU97crzEYFTWSU68IqeeCWDH+LuDB16RU+98nxE4FRWiQ6+IkBFej6S8QLAUyThKTLwFMgCJMApkuAU6ekIPjFHApoiCU2RKnghBJsS0BRJaIpU4Sw/PLUBOEUSnCI9HRH4DC8JcIokOEWG87BwioIEPEUSniJVfsO8BDxFEp4iA09RuCsBQEUSoCIDUMGZtBIQFUmIitT58z8kICqSEBWp80eASEBUJCEq0gMSoXB3DoiKJERFekAiFAyCSkBUJCEqMhAVBQG/BExFEqYidXBD7AUAqkgCVaQObohbEqAqklAV6SGJ0HihBaiKJFRFekgiNF5oAaoiCVWROoA93JIAVZGEqsjzKVowIVsCqiIJVZEekggN97xJQFUkoSrSQxKhsScCqiIJVZEeknT3XUMBwBMJVZEekgicgikBVZGEqkgTDjh1cEwAVEUSqiI9JBHd+UlgUABURRKqIj0kwec5SgBVJIEq0jMSfKSjBExFEqYiPSIRBrcEwFQkYSrSI5LcHB0wFUmYirQh3QYPSoCpSMJUpC3MDgFSkQSpSE9IBE4hlQCpSIJUZEAqGS8CUEUSqCKtLngRgCqSQBVpw1m7eFgEUEUSqCI9IxE4iVUCqCIJVJGekQicgyoBVJEEqsgAVXAOqgRQRRKoIgNUMXhYAlBFEqgiA1TBGaASQBVJoIoMUAXnX0oAVSSBKjJAFZx/KQFUkQSqyABVcP6lBFBFEqgiA1TBKUMSQBVJoIoMUCXTHQCoIglUkQGq4PxJCaCKJFBFBqiC0+ckgCqSQBUZoErOkYAnEqgiA1TJvEQAVSSBKtIzEoHP0pIAqkgCVWSAKpleHUAVSaCKrPNZsBIwFUmYigxMBZN2CZiKJExFhh0qeMUNkIokSEXW2ZN7JQAqkgAVGYCKta+VelOR06EBT5GEp8jAUyzuSwBPkYSnSI9HMmdbA5wiCU5RAafg7EMFcIoiOEUt8sFDBWiKIjRFBZrioAsqQFMUoSnKw5HM+ckApigCU9Qim+igAEpRBKWogFKgByhAUhQhKWqRP5xcAZCiCEhRAaQ4fN42ACmKgBTlwUjupHBwhjQBKcpzkcxh4YCjKMJRVOAoOPVPAY6iCEdRgaPgU64U4CiKcBQVOArOnVOAoyjCUVTgKA6ucBTgKIpwFBU4Cs6dU4CjKMJRlOciwkEuqwBIUQSkqABScO6cAiBFEZCiAkjBuXMKgBRFQIoKICX3CMARCUhRAaTg5DsFQIoiIEWFez9w8p0CIEURkKLC3R+YjitAUhQhKSqc9wWbEgApioAUFUAKTv5TAKQoAlJUACk4d08BkKIISFEBpODENwVAiiIgRQWQUuOmBECKIiBFicJx+oCjKMJRVOAocDgAFEURiqICRcHDAYAoikAUFSBKDSdECkAURSCKCreDwFsjFGAoijAU5ZmIqLEPA4iiCERRAaLUMGqnAERRBKIoGZwQRu0UoCiKUBQVLgvBp84pQFEUoSgqXBiC8+4UoCiKUBQVLg3pNoWAlgwoiiIURYWLQxYw/KsARVGEoqhwecgCXz8GKIqi94d4KpJpR+gGEXqFiKciuB2hO0ToJSIeimTaEbpGhN4j4plIphmgm0QGV4l4kocvIoGXiRAfVMEHcT+GLhShN4ooU3AhdKsIvVZE2YILoZtF6NUiKvggnpSg20Xo9SIq+CAMuyp0wwhhKCrcMZK5kwX4IGEoSud9ECAURRCK8kRELvCcCCAURRCK8kRE4rxNBRCKIghF6fxJIgoQFEUIigoEBacYKUBQFCEoSucvtgH8RBF+ojwOkThRTQF+ogg/UR6HSHzqoQL8RBF+ojwOkRVuyICfKMJPlMchEp96qAA/UYSfKFNYIAN8ogg+UZ6GSHzmoAL4RBF8ojwNkfjUQwXwiSL4RBVO+FKAnihCT5SHIbLCcxpATxShJ8rDkMxYBOCJIvBEeRiSuZ4JOCFhJ8q4/FgE2Iki7ESZkg8CdqIIO1F2UXABwE4UYSfKoxCJk2YVYCeKsBNlA8OD6EIBeKIIPFEBnmB0oQA8UQSeKM9CJE7bVQCeKAJPlC0wPAXgiSLwRIVbTHDKqgLwRBF4ojwLkQKHSgA8UQSeKM9CpIB33igATxSBJ8qzEIn3qSoATxSBJ8qzEClwrAXAE0XgifIsRArsygCeKAJPlGchEh87qQA8UQSeKM9C8AU8CrATRdiJ8ihECtybAXaiCDtRHoVInPCpADtRhJ0oj0IkPrlAAXaiCDtRzhbcALATRdiJcsERcVMA7EQRdqI8Csl9BOCHBJ2oelH4CACdKIJOlCchUuKZCUAniqATVYvCOwToRBF0ojwKkRLuWVeAnSjCTpRHIVJCfKQAO1GEnajC6V4KsBNF2ImqCwxPAXqiCD1RnoZIiXsTgE8UwSfK05DcEwA3JPREhd0ouScAfkjwiV7kcw01oCea0BO9CG4I42Ua4BNN8In2NCTjRRrgE03wiV7kCZ4G+EQTfKIXwQvxdeUAoGgCUPQiT/A0ACiaABS9yC5RNOAnmvATvcgTPA3wiSb4RAd8ghNmNeAnmvAT7XmIxAmzGgAUTQCK9jxE4oRZDQCKJgBFV8EJ8Y2aAKBoAlC05yESJ5xqAFA0ASja8xCJE041ACiaABTteYhU+HZNAFA0ASja8xCJE0Y1ACiaABTteYjECaMaABRNAIr2PETio1c1ACiaABTteYjEJ6dqAFA0ASja8xCZudMVABRNAIoWi/zERAOAoglA0aIwKmsAUDQBKFrkc7w0ICiaEBQtgiPitgQIiiYERYvgiJnbaYEjEoKiPRCR+OBTDQiKJgRFiwCUcVsCBEUTgqI9EZGZm2oBQtEEoWjPRGTmtloAUTSBKFqEpAa4SNCAomhCUbTMB681gCiaQBQts4FDDRiKJgxFy3zwWgOEoglC0eGedXzqqQYIRROEoj0RkfjUUw0QiiYIRQeEgjNmNUAomiAUfb5zHXcFAKFoglC0zJ+opAFB0YSg6HCwFz4SSgOCoglB0WeCAgPwGhAUTQiKDlew4wC8BghFE4SiVYja4HcAIIomEEUX7kvRAKJoAlF0gCj41lcNKIomFEWr/H4oDSiKJhRFh40osB0ChqIJQ9FhGwpuhwChaIJQdEAo+NhaDRCKJghFB4SCc5Y1QCiaIBQdEArOOdYAoWh6S7tHItLAJZZGF7XTm9rDVe34E6K72ull7WEfCvyE6LZ2el172IWCPyG6sJ3e2O6JiMQJyxpd2j64tV0X2gC8uJ04oWci2S8AvJDe3u6ZSKYVo/vb6QXugaEYvEJDd7jTS9w9Esm5APBBglB0QCgGBms0QCiaIBRt8sMxICiaEBQdNqDgJFMNCIomBEWHDSg4R1EDgqIJQdFhAwrOatEAoWiCUHRAKBjna4BQNEEo2oTgdeYdAC8kDEWHDSiZdT6gKJpQFG1cYVIHMIomGEV7KpJpB4CiaEJRdKAo+OxoDSiKJhRFB4qCE/81oCiaUBQdKArOVNSAomhCUbQtJBpqQFE0oSg6UBS89UADiqIJRdG2EK0BEEUTiKJtPloDEIomCEXbQrQGEBRNCIq2hSRDDQiKJgRFB4KS6UwBQdGEoGhXSPDSgKBoQlC0yyd4aQBQNAEo2hUSvDQAKJoAFB12n+D8LA0IiiYERQeCgrevaEBQNCEoOuw+wSlmGhAUTQiKDgQF73/RgKBoQlC0y2cZagBQNAEo2mWzDDXAJ5rgE+3yWYYa4BNN8IkO+AT7EKAnmtATHehJZm0E6Ikm9ER7GILTqzSAJ5rAEx3gCU6v0gCeaAJPdIAnFk+sATzRBJ5oD0OkxX05oCea0BNdBx/EM1NATzShJzrQE7z7RwN6ogk90Z6GSIujBACfaIJPdLgbJbPGBvhEE3xiFvljhw3AJ4bgExPwCT7+2wB8Ygg+MQGf4P03BuATQ/CJ8ThE4v0zBvATQ/iJCdtP4CnyBuATQ/CJ8ThE4rO3DeAnhvATs8gn1xgAUAwBKGYRFslwQDOAoBhCUMwi2xcawE8M4Scm8BPshAbwE0P4iQn8xMHOyAB+Ygg/MWEDCqaIBvATQ/iJCfyknRcq+6ZS5B0AfmIIPzGBn+AdLAbwE0P4iakKW5MN4CeG8BNTFbYmG8BPDOEnJvATuPfBAHxiCD4xnobgbUgG0BND6IkJ9MTBVEkD6Ikh9MRUBZZsAD0xhJ6YsP0EnyFlAD0xhJ6YQE8cbomAnhhCT4wIfgh3tBqATwzBJybgEwcnZgbgE0PwiQn4xMG5pQH4xBB8YgI+qeFS3QB8Ygg+MQGf1PDEDgPwiSH4xAR8UsO0DAPwiSH4xAR8UsOZhQH4xBB8YgI+qeFK2wB8Ygg+MR6HSByuMICfGMJPTNiEgk9/NoCgGEJQjCcissaeCBCKIQjFBISClwgGIBRDEIoJCAWvcgxAKIYgFOOJiFpgTwQIxRCEYjwRUQs8sAGEYghCMbJwtqEBDMUQhmLCLpTMuAQYiiEMxciwNxQPrYChGMJQjCqcGmIAQzGEoRiPRNQCNybAUAxhKMYzEYUjbwZAFEMgivFMRC3gNN0AiGIIRDFKFeYngKIYQlGMCp6IxwXAUQzhKEYFT8StEYAUQ0CKUWFwxq0RgBRDQIpRpdEZgBRDQIpRwRNxcwYgxRCQYsJeFLyVwQCQYghIMQGk4DN3DSAphpAUo0WhPwAsxRCWYrQstEYAUwyBKaawHcUAlmIISzEejagKLroNYCmGsBSjCxmHBrAUQ1iKCRtSMj0agCmGwBTj2YjC20EMgCmGwBSjS9NEQFMMoSnGlKaJgKYYQlOMKU0TAU8xhKcYU5omAp5iCE8xpjRNBDzFEJ5iTGmaCHiKITzFmNI0EfAUQ3iKMaVpIuAphvAUY0rTRMBTDOEpxpSmiYCnGMJTjClNEwFQMQSoGFuaJgKgYghQMTZ0iXjZCoCKIUDFeD6i8NYmA4CKIUDFWFmYZwKgYghQMQGoZOaZAKgYAlSM1YV5JiAqhhAVY01hngmYiiFMxdg8XzaAqRjCVIwNXSKe7AOmYghTMbbUJQKmYghTMWFXSqZXB0zFEKZiXHBEHEcEUMUQqGJcPtPGAKZiCFMxgalkXgFgKoYwFeMRSW6eC5iKIUzFuDBJxL0BYCqGMBXjEYnC91kawFQMYSrGlZYrAKoYAlWMKy1XAFYxBKsYlyfMBmAVQ7CKqcMcEbdlwFUM4SrGYxKFLyUwgKsYwlXMmatAsGUAWDEErBjPSRS+EsAAsGIIWDF1YY4IuIohXMWETSl4h5kBXMUQrmJKu1IM4CqGcBVTl+aIgKsYwlVMnb+awgCsYghWMZ6SKLxHzgCsYghWsYvCqtkCrmIJV7GBq+BXYAFXsYSr2EW+P7QAq1iCVWw41EvAqYUFWMUSrGLDtpTcEwz90BKuYsO2FHyvgwVcxRKuYgNXwY5sAVixBKxYz0kybmABWLEErFhPSrIvceiIlqAVu8j3hxaQFUvIivWgROGdjhaQFUvIiq2qfIdqAVmxhKzYquCHAKxYAlZsFfwQ8kELwIolYMV6TpIZFS0AK5aAFVu4IcUCrmIJV7FVcEMIKC0AK5aAFRv2peDwkwVkxRKyYqtw9DBcb1pAViwhK7YKsRs4SbeArFhCVqwHJZnwkwVkxRKyYs9kBYafLCArlpAVK0LsBjsyICuWkBXrQUkm/GQBWbGErFgRHBEuWC0gK5aQFSvCBBGGnywgK5aQFSvCQgU7EiArlpAVK/ILFQvAiiVgxYqwWxTOriwAK5aAFRsO94K3NFvAVSzhKlbmd4tagFUswSo2YBWcc2IBVrEEq1hPSTDrt4CqWEJVrIckCl8yYwFVsYSq2PPZXjD5zAKqYglVseGGFPwJAFSxBKpYz0hynwD4IGEq1iMShS+5sYCpWMJUbGAqBl3WbgFSsQSp2IBU8CU5FiAVS5CKDQd74S3HFiAVS5CKDUgF3zFjAVKxBKlYT0gyrwAQFUuIig0XpMC7cS0AKpYAFRtum4cXtFjAUyzhKTbwFIkHNMBTLOEpNtw2j/f4WcBTLOEpNvAUvGfYAp5iCU+xKnSFeEQEPMUSnmIDT8GX1FjAUyzhKTbwFIUHNMBTLOEp9rwxBQ9ogKdYwlNs4Cn4khoLeIolPMUGnoL3DFvAUyzhKdbzkQoe52IBT7GEp9jAU/CeYwt4iiU8xeqQ+4WbMuAplvAUG66dh3clWYBTLMEpNuAUvGfZApxiCU6x5/O9Mm4E/JDgFGuCH+KmBHCKJTjFmvx1URbQFEtoivVwpNsWAfoCAFMsgSnWBC/ESxQAUyyBKdaETXp4hQBgiiUwxXo2ojSeVwGYYglMseF8L7xl2QKYYglMsZ6NKLxl2QKYYglMseF6FLxl2QKYYglMsZ6NKI2bIoAplsAUa/Nbli1gKZawFBtYCt4zbAFLsYSl2MBS8J5hC1iKJSzFhs0pKI/TApJiCUmxHowovOXYApJiCUmxYWuKxg0BkBRLSIoNJEXjhgBIiiUkxYYr5xd4ZgJQiiUoxdp85NACkmIJSbE2jMroPBwLQIolIMV6LqLwhlcLQIolIMW6/GGHFnAUSziK9VxE4Q2zFoAUS0CK9VxE4Q2zFoAUS0CKDSAFX5FjAUixBKTYAFLwjlMLQIolIMUGkIKvyLEApFgCUmzYnIKvyLEApFgCUqznIgrvlLMApFgCUqwHIwrvlLOApFhCUmwgKXifmgUkxRKSYuuCIwKQYglIsQGk4D1KFoAUS0CKDTtUMuFfAFIsASk27FDJhH8BSbGEpNhAUvAmJwtIiiUkxYYdKviAMQtIiiUkxdY23x0BkGIJSLHhdpQMxwAkxRKSYutCABuAFEtAiluEo5XgR3QApDgCUtyiyr4BBziKIxzFhdtR8BtwAKQ4AlJc4XgvBziKIxzFeSyi8D4pBziKIxzFBY6C72lygKM4wlFc4Ch4n5QDHMURjuICR8H7pBzgKI5wFHc+4gtGPh3gKI5wFFfgKA5wFEc4igscBW/UcoCjOMJRXDjhC0ZcHMAojmAUV4XeEA4IDnAURziKq/KX9DiAURzBKK7KXtLjAERxBKK4KjghHI8coCiOUBQXKAre5uUARXGEoriqcParAxTFEYriqsLZrw5QFEcoigsUBW8Uc4CiOEJRXKAo+KYhByiKIxTFhetR8CYjByiKIxTFBYqCrwpygKI4QlGcKJxC7ABFcYSiuLA/JfMVAEVxhKK4QFEc7g4BRXGEoriwPwU3ZQBRHIEoLtyP4hR0REBRHKEoLlyQ0uWboVcAHJFQFCeCI+L+GGAURzCKC9tT8CsAGMURjOI8FVH4tiUHMIojGMUFjJJ5h4CjOMJRXOAoDvengKM4wlFcuGg+ZwHwQ8JRXNidgu97cgCkOAJSnCz4IQApjoAUJ0t+CECKIyDFeTCi8IVTDpAUR0iKCwd8ZZ4AuCEBKS7sTck0BABSHAEpLoAUfGGVAyDFEZDiCiDFAZDiCEhxYWsKvvDKAZLiCElxYWtKxgDghYSkuEBS8IVVDpAUR0iKC7ekZIZVQFIcISkuHPGV6dABSXGEpLiwMwUfdOcASXGEpLhwxBeGQQ6QFEdIigskBV/a5QBJcYSkOA9GcATaAZDiCEhxAaTgS78cACmOgBQXQEqNRwQAUhwBKU4X/BCAFEdAitOFQzcdACmOgBQXNqZk+gIAUhwBKc6DEYV3TDpAUhwhKU7nubIDIMURkOLCIV81HpIASHEEpDhT6g4BSHEEpDgTukM8JAGS4ghJcabQHQKS4ghJcYGk1HhEASTFEZLiTJ7nOQBSHAEpznMRjS8ucwCkOAJSnCkMyoCjOMJRnCmtUgBHcYSjOFNapQCO4ghHcR6L4BNBHMAojmAU57EIZvsOYBRHMIrzVEQvIFV2AKM4glGcDZujcLAAYBRHMIrzXEQvYNTNAZDiCEhxnotovBXAAZDiCEhxNrghjDw6AFIcASnOcxGNT+dxAKQ4AlKc5yIapww6AFIcASnOgxGNUwYdICmOkBTnyYjGKYMOoBRHUIrzZETjjD8HUIojKMV5NKIx2XaApTjCUpxHIxpn/DnAUhxhKS7clFJhTwQsxRGW4jwa0RX2RMBSHGEpzqMRjS8+coClOMJSnEcjusKeCFiKIyzFeTSi8bmJDrAUR1iK82hE461FDrAUR1iKc3mm5wBKcQSlOE9GNL44yQGU4ghKcXVwRDwsApbiCEtxHo1ovKvFAZbiCEtxHo1kOnWAUhxBKc6TEXi0jAMgxRGQ4jwXqfDkEHAURziK81gEnvDkAEVxhKI4T0UyswpAURyhKC5QFJyq5QBFcYSiOE9FNMzZdICiOEJRag9F8GU/NYAoNYEotYcimXS5GlCUmlCU2kORTMJeDShKTShK7akIPgO4BhSlJhSl9lAErxFrAFFqAlHqcMgXXKHVgKHUhKHU4Y4UnOpWA4ZSE4ZSeyRiMl9g6IM1QSj1wuWnVTVAKDVBKHXplK8aMJSaMJS6WuSnVTVgKDVhKLVnIgYORTVgKDVhKHUVekEYbKkBQ6kJQ6k9EzEwfb4GDKUmDKX2UMTA4+hrAFFqAlHqcMSXwl4MIEpNIEod7phXuBkBiFITiFKHO+Y1nBLVAKLUBKLU4Y55hTsCAFFqAlHqcMiXxn4MIEpNIErtmYjG+ytrAFFqAlFqEYgy/goAotQEotSeiQgFp0Q1gCg1gSh1gCgKzq1rAFFqAlHqsBUFD0g1gCg1gSh1gCg4d7gGEKUmEKUWYYECJ6Y1oCg1oSi1CAsU3BsAilITilKL0CFmvgLwREJR6rAXReP+DFCUmlCUWoYOEbcFgFFqglFqGZbK2A8ARqkJRqk9FcmssWqAUWqCUWoZlsrYkQBGqQlGqWVYoGBHAhilJhillmGBgvsDgFFqglFqGRYo+DMCjlITjlLLsEDBrgw4Sk04Si3DAgW7MuAoNeEotecimTVWDUBKTUBKrcIKBXsiACk1ASl1uGte43cAQEpNQEodbpvHZ9PXgKTUhKTU5y0p+B0AklITklKrcABn5h0ATyQopQ4oBW+HqAFKqQlKqcMhX5k5IkAp/b/99+tXq81zsz82D99vHpovr/7w97+/+uWX49dd8+r1P1/9sgr/2K5gvaJXf/jnq1b1H/75f1+/qurzH7qb28MfLv/SLkL8H7oc1fCHdl3j/9AlSYU/OP9T+6ezneGfewv9b53Jv+yb/zk1h2NsTjcRu9jTTbU4gpYfD9v16dg8bZ+TZ+ua30VYF8Tw1buWNlXqdndcbTeH5MXVOhKu5SSZu+XmuFofd9vDygveLe/Tr9LOJy/Cu1zYKcJ/326fCpJlLFnxJN/fN7vjftsK3y8fOqeKRYrKvYiUwQtYIg+H3Xa9uv96v918Wj3GIquqfhFZKccUeVw9N4ftaZ8+crtAezHv7MfWnJ1hoXmyHx7I968WkadWwnDF7NvHTt5eO1Jf5Ah3tkv07UwJ5vt8eFptDs3xuNo8Evkyls9sUZ+etg+p31SRu3fnNbHEPHZ/i19aZEslz59iwZO1ftzuV8fPT8nDCRN924rpJ+vVMn1FIvI2KZgesVmuvx5X96lTuMgpRN+fdneYhT/UvJ7xIvt+uVt+XK3bptykemwd62G+wV7qQ/O8SptI3IKrs7FCMj9yKjZvcvxqxESTm83jatOEjuK0X3ZdW9LEKxEPY+ehSZnzH7ob2Capa73/tE47kdh1lZlofpB3OO1227TvrNwi/pDMjn7zmBonTNzFWeb4tvl62q9iMZEpzOc7PazafuK+/W+fvKzYPbuj9acKy3/oePjS/fSku5uLraLZAHujbkTXzG4kEibyBsdur910O/OSF9FHb5ft51dhmN1Xp6Id0HenY2qui78cswd4kZW3VkcuoZXsP9xka9NORccDSj3BXDBNsCp2gglfKsjKPrqI27gK77T7UBOaRdBAHl3Ej87s4E7HbWtn25OmvVA0tlfcL3Lcfmr/8UAnCt2pjS8eJM9P2x3QyBX72GxjgbWJ51n859w0j9vjavA1qjoeOi23rR+3h+OSzHvreEgQzKn06Us7OC73X9O5pIqfkTlJ6CV1xZabBzI7jT+pPPeTwvTTS3v+LpY5WHxc3v+6Xj1+bhv4067ZHIbt20Xu2F3FET67Oi+6utOHZuvpYq3xTDTWxOxAPq6ObcNMZ7TxlOHcH6neXs3sS85y16unVeobLnr/qp/qamYr+Lh9SPxDinh+yhRx2jy0zrH99KldFaTPHY1IhvucZ3GD8IFYxMJ4rdMLS2fg8YRBLXizj4/7zlE2ZD3VnWj1YlE/BbfMtcH9cr3ufDANI0Q9WpcHwBOULFR0/J4c86XnptI6sseeXUv0nuuYa4xYePPl2LY12lHaeOHI7N7uPz4uV5v0e6j4e/TjgeO12/vtertvewEwrKp44dwdbX/+0MzHb/uXVqR/A19HQj06Xh51eRiTFeyb9bILTmQV1LECXivqFHTBhFYYbZXdHeUvUxnJ63SGURgRzwtEfX7DsjrH+RSz700mRod00Ii7osV5Cuv6walecL9lrKAhE1oRz+qYXjycIsUrLNfbV3G/1KadPGyOYBDqri19Mc9OkLc/3R+3ySom+ejnRbzsG5y99A920XcUbL84rjanbTfVo/HVOATah65qyf5qkVwYYY2bnWG/m7PUc4z1uVlv79smCCKh0UDR7bWfJr6LshZkx100d8hoZe+XaTy8Ox0x6uTOoXbLDJ/c74e9sYzlVX1vzGsXD633HldP5FGjkZv35Xsxg8lE9NI07wkfll/9dPGwfKaBTxW3LJ7zPDSflqf1MY7SF8P0Ui1iHbxRnSgpRuuliqMHFa/B9gqiCHsyrsdTkYr7yYJMfuuSKl5NV7zV9EBLsZFJFXd4zAXGWcVuv/20SoNocYDC6n4EmvTKz1LTsT1yQ9sjqAWzvZ3FHn8/7JrmIX34OGTFnN2+yOua35aEfpLmx5xGnSX285uzV7Td2OawXmZcOh6Qq0kvolfTuUVZRxwlZEY0zjqGbzoehow8z7eNZVu+fXxs+6Z01RTPieuepC64Lvy4b0j8N+omJHMWAShADN36eOL5/6KfYMt+0OgOjQt/YA7NY3wgeieCOWcNIlebT9v902CBYBbxGHx+DH0Bf9yX7TUkEam4AxV9aIVJAHt52deg4o/AnJUEoYdmX3zBcbhKGKbkz/e7dEkQtV5RnyeXkttNttKeTSwvXvcz4+4Pq8N9O2FMI2jdMXcvH5sZA79I+vg1aQcu6girxUSrNtvjmfOk3Ujci1SC+b56oWh2HPdxlpl/cBHYLhy363Q27+I4K7d19PIOq45JHckKPR5RLJOZtSJ36+XX1Okin6v69sa2sBOXbRQ6fmquB6ZfQsRfQjKTFR62xy4TOZIiYymS2aV2UrLgwcRRhXNnXZ+nIFIwZ6udht3hV7KsFvE3kdyZbyfr0Nyf9u10Lo9L4sFRcmeOregvaQZJPMuV56evemIomSsoLzcfwIi5Yc3sdLZHmX73OLgrmWadduvmSzomxY3EccWA11/HWJGZDNELaudkj2RJF/fLzLjnw9e2xup+39xv9w90WVfFcx3BTN85S2znjPe/EmnxeLZgOtvXDekCbLQSYYZVmk/rVTK0ytgRVN9OLRNENuum+/vq2CRxZ7mIA+vMUaLZLD+u09FLxOkPou6Dzn1aoOyppuzJj5S8L+MpN5keyzifrM/lkH3U8cKO3flfNDMi26tabY7tTGm5TnlN7PXM/qzZ70kELl7zXmbH51fjmEGI5rn9W3a8ikeJijnP8RJJxlMc2j9/zD66pJkJkkHs6ePhfr/aDXl/HLlgTo6bL7vt4bRP13IxSTN9cpJRfR4qkwj3oilLjMNhmjd096JoJEzGE+zu9u9gqeFKBQwm7j3dWWC/XKwWfbpu3zSqPrux6qO+lTl3I1Wf8Fj1abBC9I1Y91MqfWnNffS46v+ln3bJHuhL1Tf0Plov+15BLS6A4KxLmf5fenv0ok/dWfTNufdD3Ruv+yak+zwu0ws09vyTcReg1Jfpe05zSVXuOyfbEwZb9f/SP6AVfXPtWXl3xUT4Q792tH2HY+vLH3pk0T+FYyKLy9cm1D7O6ehNqvonEszI+qflfgCku5sooyiG7t8jr2F+Wq2PJGUqTj/RzMn4p9X+6bflvjntHvfLNG2kjrNpmf1vL65dgAzgZbyaEZr53lZfSOgnRgTa9EkNzMWRF/d5+9T04d10wRp1a5YZsvES29UMidxVMRAWTHr+adux7mbzePychpLiwdcx7eoSgVJvixMAVd/smGsOLy6fSRYnBBnmQmkokg4EcUSO+zl26UNX8cSZJ2Hflh8kpshIkGVGwi6SQCpKnKbUw1vNTOH+tN8+0SBQFUsU+jIZ7McI5jS6E71fprPMOBGb2cwo4pLxAsaIflgwvD7gsdmu25YxnM7EPYHkxX4jWe0/78lULt4/UjGXo61ECmFVbJllftXH5hjvlkiBRTw5rNmGZaesIiYVsveWmoksOsFxs0XZE3Gum7vs7BDzFBDRMfa/UCHmcNeKLgaoRRwfk/3cpmYGBzvpJBAVjymyX3fUzKzyVt7n7eHo6ydGxgNCP0WsmVClFbryyQ+Ej8dCLTMTtpW1aY6/bfe/+hXcpyVxXBG3BGl6R1PcxnrcbB9IU4hpubvQO+ZqppN4TKPncbqy7OcTNXN3Qitve3iAoeB4t5i+fHe2ma1YIjAegfr1Qa3Y37xLTGqO5F2a+F324UhmwOtFJnr+OAznqgkSh7i2u70r4rXsht5OLna034sHswt3YgY0O5FlniPiFbbsE35qJrh9kU+MjruQiysxJ26d0M1yd/i8PZKtJSrOlLB9FLZmhhdTucgDZDyb5rentmc6pjNXHQMu5/pORPK/mhcJ05mi7+X4nfLhuG+WT/R9yjhboZ9g18wszVgqfJtxf8KMBnUyvx6OzVOX3bPcPNDoSBxodX3s4OIIzNSWVsnz6qFB+yGUTBIt+ubADA89bo/b3FJNV0kUpu8NuZNAIhm9bxeDGsmct7RyQ5eY9rJxrnIfuaiZq6QXmdDKeDDkttztM1hjxoBV9SEY1cf2NHNTxuNpuV+2M4HmAS6jRLxOVH1YRzPRyGfRnQIaB9Lj1R2zO+iEFLYFxaF5ZvpSJxHkLok63mLEHAI+L/cPXfhklcQ8Khe1I8FM7fjcdEl4aQQgNujc3E2/qbkPxBnuY7cNCFJ1lWRtMaNZaJobxxTOtl0S6qdJRStmGzn8RHGZtUMV77cRmjc+fz4edw+rR3LmQiWS7V9M81pRhXBenNhd9fHgitnLd7LPXzvz9DGtqRZ9jJvrTJ14P1R1Oz1OyYeK32rVx40rZpbai+D1MOcr7j2rPlxcMZdRn38DJwdUcQcnLE/S6mnZfX8/o/x9uKci3ulg3GVPBe/5O9nkqUUcKbpsVbmwmz4wyISFZwV5OBbn2DDPFTjLREcnqDiwYJgzNiKPhBnjkwYscylAJF7QARUdz3+YLS0vWqSy40URc4GVly1T2XH8isnzu24hdbN42cIcnVebsGG52+qx3RMQE6eAMUOwl6gEzWsXsR8Jd8nA4Q3Trdh9a+Fw038c9ZeG2UST11bF45JgTvQLuYvxEr9iblRMxeGdaHEYpmLG9Va7IbSK9wIxkwZWu2eVelr81plz9U5Ifh4YsxLB3CvSSaTBsDSSHmfTMrc9rUhypkgSMZjwsROSf9Z4K6VkkqpOYvFZ43xcyQSwrdBADdN01OitMZOVVvv703HoaipeNJp+nWuZsd1IaLf1fPnwj9Ph6EskKmLIVvcqmJvSVvtVuhcv5hGmXy4Z7ijaTXpW6bxSxt2BYuZF/trsPzb7du67/bVJO4F4KlFpnkf/2qSJpDHakMwxsl2/Hh4amOQi4m1e8hLVYJ5/1gkebs8WcaBEMjeMd6LaZeE/2nFiYGIccmYukNbNc5OkR8l49mr67AnTn2tk9CUdo/ebPlvF9MfD2X4VYJmbX9arza9pbxSH95mDVSekY3BpslcVpxD2DUcy5x6dmzebdkpDz/JRMeiyzGSip+U/0hyyOOWAuS3vabk50SeMtyj0qTGS+eY7eW0nezzt0z6tipddQvO+wNMyyVOVcXavesmo4Vr2JZt9FcctTL/WMEy21AoecuS4Bxd9xgwz564VuHo6PW1OT1139gkAEZXsDGMu36DY4/a0J6LjAC5zq8dA9BCOVPGmvooZpjvL3R8Pu9N+NYwGVnGSm2DGrjqhgwEsPhekT54y/KffLQ+HdpLx8Llt4FtyQEscEa/4PtWLBE8t4/x0ZpitldiZ1q7g88g6zn6o+G/zcNz7LRwDO+PxQzBTMlp5p0Oz76oBifEauGLuCjlLTL0xXvFWzByvp+ZhleacxGuzvpH3m7oumUvMxb+Xniyd4+6OSWeCEHBYnIiDqpLJtb20/G6zeMXGzPYaSMSLtpgkVnbC1wHxbRkfoWWYA3UsbHjcV2WSXXzcl3k4tK0vjZir+EktM3761ByXD8tj4ooyXo4b5kGqvaDCyWtxVnofctPMtORe/KFZ7u9JzxC3HGZQ6ImMsfGkXvWTR8vcQtEKy88G4lfZpxYbw1vTtYIHs4GY1hjR5xgzwy6twOFwFZ99InroYJjus9qQaWPM/ZjtY3W4T+PJcV/FzIHshOR3nMaMgjtxIufJibiDltV5WJf9F5D2suo6v0JVX/5woUz9ORf9rmbTbwgzfRq76RM0TL/j2fQnXJs+C8D0m+hMr8IuLi57Xu845pmJ3WMmU/bKJQMRs3V2my+XT2QfUZyqyNy+2gkaJkOoeEeDYx7J8bRrHgk6jVkgM9TvpRTYaRxaYOIJLxLB03jloJhB+afjKXX1OJLKXGY/ndbH1f2SRk2Sc+nOHqf67ff6ctAn85ioi5L8y6yTxGXmVz4d10Pb46m8Zq5eKYmN+4zzw/enFvYpkqJPxZOXtt5DQNXvu1Hqsgvl8oe+sOk3liwub7VPi76c2dznPmlzyZjuC19iG/0+GdufwuaYrrhpwBYNGZ9MaeRlqwuvwZwjpOnKKu5S+j0fgjnynwXmOvf4XFtmwAtIhFNHk5z7NEm09/HsFvx44cGcjBcDz8nJ8kxKRAWeAVQ4uexI8GkVnxogmGd1Ug3wHYt4k4FkMhUqmWK4Ko4hC2bskgodxP3iDlEw1yib5rdSpnAcx5DMI5BAdnDcBGyfF8YccTtxgyC3jNP6NDOSv9mu2qVx83AaBH9VPHeyfdKB5VqYJi/HJ0P3QV3JTJBFYe44O5Z5LcF283G73D/82nx9bDbNcCSrknPsubZtnlef0u8afQOeD3sZIGcujr3zBZ3vRUHyEtLFl4hSfat46c/rZb0ssNsuXgkyLyvZ7lox8LqKeBHCFbZftX8dTmziE0wl8yydcMr4kIDEWEYzu4wga9jK49CDZrrpbpk27TjDyjEnbefjudIVeDw579PyXb/Ocv3cyzHjqGcVfnKTum4crVP9Yk1Ps9wfzgVOW4wj6czJyG7ZJY0eSUxRxmhIMVdhXZR393m/PJCFa+x9zIlhHzBOMseiDx2qMYMEuyWJvMYh5wuoO39f5vElNCYZn990ltgvWfqoi2PCHZR7LZPOuI/Puj4u65hH0O72jd8726VNwDt44kw6ZvgkkmmQzLh/FTWz9XiZIGM6PgZU9GEIwTzq2VOi/XODcghjWnA5q50vdZBHq+KVuWPmnQdRw0BGch7ohGelO4/irQf2sgGR2fOcERvpw5VLDgTuu8v+eATXL98cE1S/kLzha0gOMuVavepuS0qzH5LZwyXi2J9gZ5goZrfffiSb+eKkRmZEFAX542mE1pfdANwP7wXmSUecPtKPcxVzN8BZOFxJyfhoaM1MTMFbz+L8gT4QUTMDimeJYLIR53+cW3ifuGH7szZcHyJ1vV+4PgXIycu/9L3updblUGl9+UM/nlyOveEOVjh9JY4oSeZ0sBXVXXOyTl+uil8u87Mf0pVonAYrmWx154+z3W/XD6v98PlkvAxX/Qkqus88d8yl2lAJ3CYZ7+rkjvfH39OQUtyKQp2+q+udoQ+YiT7rzfRRcsfchN8qzbfj5Koy9kPk8VicOqz7MKLmTneJZNxDxL6nmVyPSoYfNNlTx+x5jr+D01ySw7KZSYqtJJ9C/dzQk+hVjGsdu6H8nqMQ8WMyNyG30jb0CsMYhFq+K8LjW+JoiGPu4uhkDXbsqRj6OubJNxdJ3YShW0oPd3LEW80tM+SbiM3st4r7EG7Xfvy9m9QQ343REpPo+4OwB4u/2CJmIAmeqB2n0yomwukEDRxWxpld+jJ8MjNg8encKo7lO2YeTisKNM74zF3HjPz8z2m5ptPJODat+nOxNbNL3i8fVulbE/H0TzKTywYHTso4xVf1CFf1SybFzOruNpOeh9T0mWMf6Qc+zZyX7Je/oSuP44PyeH24F3TYdcggkRSHqJifoVmuO28L28GLe6tieMI8ZqadizSr53Soibf79HNN0eM3wxzEesFZa+N0CMFM9O6FglyheJepYB52fTm+NJ3PxoDk/PRM+nIRmD/MOI4SMOcZcG+RjFe3hv3+PjX7ZnM/XIPEm0GZol7uS0rbSrzqdv0SibkNZ+QWJhXvp3TM9OYJNx+oeKFouf0k88oDFfeelklNO+Ff0bWacbip6ru5ipmW1UoFuzdi2sB+t0/bdv6BznuPUzYqZmgoiOvSSD8vNw9rilrjgz+qfqlbMQ9t3XunQucxxINtn+BWM1lxLBWeyBBPQpmJNftmcLx6Elvse2TeCjlIy3fDcWfPxJlgiEymeNyP7a/XGaS6xCdP9ME63R8iaplneoDT81WMlC179A2D+OBOpXgSY9jNrhu70m48Pi1Y9dDWMffd7bdHeqRGDK5kfyqr5M6pjrtfYMpTFfMbwVxMddK6PQW/HMnhhPFhWFV/ZJtgng3QSR0IjIevPvNIMCfOrUD8zHEud8VMldgPLiWPbxllbkvohIxepx5v0ukjeYq5F3CfuercJodOX06d5jnPYfmERpX4WzNZfStptx6cFiPjPdrqkgXGbHuH+4d1flYWJ8IzQdDhvtk0Wawd7xDsJ0GSuaHZH1SW2BdnNgtmhrSX8tAkeRNVvGFKML3RC6Kn1ldxRqJgEgV0Aluc48QMHA0T3eP9Kn36vGBu3g/S8uNjnOzAjPX6CzTgLaLR6i/U5X6D85UcaWuN++SeF4hLn888AvNy20fuDSRXjzN32SCheA9KfLx7xQz6F6Une3uqeHJXMU+d6MX7i/kGi+x4qOE2xWbzsNuvnpbpNX/SJHEFrm/tV8t12AKY9hHxupUJCs9JR+nAEgOUKVLyp8vGnWGfrVIzjyCGRyDGkQ7Z3zbhmHcDHc438oL79eJTLJS8pCn3uchs9zzmD6qLc4Iut9QyFwZEMFwgx2F95imLB3AKapx92dOimjsR6E8CTZdZ8Uqoj/rVzCNILiLhGiuOu7J7/bNAFKVTcVtyzJXgAZ4wGifHyH4Pfs2c6h7GDmyMA/T9CW6Xs2CZ+UxICXrL8eSL2dA+L3ets66/PtKMoThrhOv7n5f73eAm+bg5mf7JLTNx/LDqppnD+3jiBSgzjTAEJIdkPznt+fyB+j1PitsDdoGk6iFzwIWM5z6KeTaNFynyIpNvzWyhO5rCreKjWhz7YQnzEfHWJNH3G66Pgrh+d5jTlzRIZi99SPeIijjIIpmAFZClONVGcz2x7dfSYSKOc75cDMd8slYaPIQ9HhuYe/3QZvYkuTCevjEPjD/L7M7gOuBdIHEKA/Ng44BH0nySmK8yz0YapyzxifAVEyvFVzANr3uWMQjWTNRweXHNcvfUzQvSI0LjjrFiBt+HIslm/vjJmYm3F5kv1DqNiSc3wDL9+yLzDJvJQBWfhMe8A/gi8kKY0kVgvL7kenkv8pyNnx4BEUdFmHGqMEqnK8A4eNsPMIIZBMoesBkvmZjJjEFWrs3EE7SKOxAMJML1o0sSpqcYCw4AjSfPFTMWHoTtm4/bbbp7Jka9st+xXDOnp8dm3XzJh6vilGDmYbV0V4GKz1F1zE4WrJmSjqZnxP2ZHJecw5eTenkz307R79tNOitPBlaemPWherNIzU3Sqftjb5kndXh5VSovpmbMAJYXk8Ypkqw95rUQw4znOCbcp/7Jy0bc/hTvfpeZ6vG26idRyvSbPvqb6/TlVO4+d1D302zdO7XuQ/j6svu+37Vre4Bj+0MAHBNVH7dd9Ptp1zb5YeZUvG/D9M9lmT1LxGhT90rOZ2C2007W0+o4uD5FmCSplyntSFJZ4kQZ5oyUnmwq4y0l6nLlJfP5yJ0GyUVGPXPoz15Q/SFmNbMfPu3T/VvJ7cpMCQQ2xPPG3vF4kg6tt502aRce5/3Jns2pvmmoPtKs1GUXfJ8Rv7hc1Hm5MrFvWf31SrrPcNf/r7Jry20bBoJ36XdRlA/RylmKfCiukAhQbSN+yA6Qu0eSPfKQotzJAbykKVEc7s7MinKooSz+WD1tGOEb0f8fNlAciBHUbUd/L1imDsTfXbH42ke7ptKjfUqv821u2mFwPKxnVVz2UynFQ+VUtcekMMU0OzXKyPozCb+RA4nQ9RrIJoE4hyGqhU51u10nNQbPbLpSLFaM/T+qTdVeDs36QZdAPjp9wBkiMlbHQcZ+wQlPmlmYhQg3OJhdnjBfAwr18VDoB/4enHEB564Qy2rjEDmOEPMWjVh8HIMtcSsZM3rxapAGtPGScipQvLhcI+bZI6y59SIHl/rVxG8SX8snlCEWRSjo8mPn+5t7moQN4hdkYYS8mQRvCyca0/x3hNhHj/N9TsxELg0xT6VGPr7fjZ1dE89qu5WYd1lqbmQ4028AhVb3cpe65HU389fiQq8Tq1xdFWOjKMekfWK7t+ZQv1TtrDUgqzUDeHgBwGYlNt/j8GmrV7aGE/1Euv7B/L30v2rWM8q5Zx+QgERJKIARRaiUDpHOmjvUiOz4PmSsI+bS5tTAexJsw84oiDmjro+67aL4rP4NaBoeRHvTbr+rjvvqZaAP3VOa//rD/rV+vzu5ZKhFvH+NqOzpRzu27W7bbA7ZkJE9hrje+3kuNhubU1ai0ixyUbbM9HZANw7kND9dn3B5DhB3l2JDtPOv4vdTBmjzoS+C0fOgO4//P8N1ZAUMHHQMKtcGLhEGjlsG5S0LhaRFKymLO5nFX7V4/yx8AyzSFVYsXp8HG+xYPmNZRelEj7NzRqfC+BQ9QbyIo2L+LqsTHJbT4dF7KN4DOq2V4m3/kpk1Q3+Rwv5Rv28XUQrDIBE4DFT4eFIMy9DzrkQ7uRJWkSWyVqW4nYeBMkYmfLB7NL0uxH01xFxyMWEZvfIiPP/8sWt2g2FW/5s/z5+fX4BceVtMWwMA"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA9S9a5PcNpL3+11cbzXawh2YOHEivJZnx/H4orA0s7MzseEodVOtWndX9VZVy9ZsPN/9kABZDSb/AMGLvD4vZtwqApkJMInbLwH8zxen4y/nL/74j//54uf94faLP3KlX3xx2D1UX/zxix8OH/fvf3i87I+H8xcvvng63dc/7g+X6vR+d1Od/yV+/vLD5eG+TnRzvzufq1riF1/83xedULbl8ir16Vy9qW6eTlWRyE2cPBL+4ovH3ak6XKiZCaVnL2JKWTY0y3zlH47ni/+zSG+Uer7KutZO5Sqj1PNVPtYZfzmebstURqkXqDyeLoXqQsolpbt8KC2ZTzlf1WX/UB2fCgv2nHiBs5wOhX7iE85XtLtr0hap6pIueGOnqnbrj9WXt7f1X4Uf/TDTgtI+XY5fHQ+H6qa0zL0MkxQPmu03dSn2tZqk5i5BecP9+u3fy6RtQspMAa7WparusLv/dNnfnF9VTbpCtcNcC0y4naL5djWF3/wwSaVPvkTp/vx4v/tUqvOaeoHK6mOduNAvN9fECxTuH3Z3+8Ndocbn1AtUPlS3+x0v1HhNvFThFH3L1J2qm2r/sToVaoySL1NaDxjK32ScfpHaCV/INfEChedqd7pJDzb6Cq+Jpykc9Bc/Vv/9VJ0vYyPkfrLyvuMcTJgid/OcJ1M2YndC/bvjbfoNIt1thsWKG41T9Ib0i9U+Xv45SW1IP0dt7Ehf3lzqr/zN8emE33T8fILr+PRvjz9XcJQ6ELrpZ8CF6pmaHEAe3+/vp2gmOear/ri/rY4hST0gfL+/ezrtmpqfYMuYiPnGVYebY6oZHtoRpZ6v8pf9LZ5+DfV1Secr+1Dt7z7AIftQ2zXtfHXvH2FzO9QVEs5X9G5/qV2g7MvcPCde8AHhVgh8N5nmJ6FIKyWeW56ffrp8eiwsWa3s5TX9uM6XjXGJAqZWWHJKX2YXWqjmztLUUsGEtunZgktxE4BNiNv8N9XlzafzpXp4VXvLl4fbt/uH3DJbJnl5j3Bb520yzlGwiTLj8udKNGLQ24QTFhv1NueVswz7dN80UG92H+smeNYb2QxlrGZes3j1z+NhXp1FmRcZxG1/JHw1ppUaRk3l3nna/dKOljKSNr1UmYFXVsv5sS5LNarmmmyGnl920eIgUNA+nyG5Op2Op5zoLkGZbMX4VfRNXd7L6enmklfQTzajCGSNCKgoWRgqm9MD4QUT+ZKuGUgenQ+Uwx0gvRDpTGM5QM8EglOMboCaMmBTTGpwhRXwmWIwg154EY4p4jBI+ih9KcIu0O4x2FJKWYDwIrZSxjqA9ALCMRVtoAqaAjTSqxj7rHv6xzPk3uwed+/29/vLvsoWgqSb1VK/3z3dX16HCXpW2TDpYn3l6mb6Glp4QS7XTzfLE7KjgVFAOAI/Du+Ppwe/TDHeqfYTl+nkW/k82jsVjNImDtF68u/A+DOnLJF+hubzRM2J9DM03xDeiUdd44QzMUB/hQdc4efsEL10eBiJKhofthZF1aE5k4OF72GLEyuKEhVqAbTpzdMj7IdjRTTlzDLdHB/HStQlWVRrX+X6B1CBX5X0E2O6v3/7OqsrPJ8n+9X3b7Kyw/N5sg/VL5d6CPfzN9c5dFYVTF6qeXIzF2ue1M7ldRc1dH1HWU13U4ySj7ufbqam4i9hmHamxlejPTJRizLM1P3n1KyLqPzz2Mxr/A2ON2Vxqrk+WtBgLtTy7GVTXAVnmVVK/1X9WL07HvNdEEk4s6xjjfQ1ycw3Nib/vER+87GMdATXJHPrp5rSFyQylOqOcECd/8d6cLc73N3DVd34efmS6q9Foja/Jm3umZVQAgMEhkrSYQElSpIgc6goDzJLlKVB5lDbCMhMqItf/Y/HS4Iuhiflr/vheDsmZ9Omwda2piTnmnenalTBNdUcFdWvl+pwjjvNhJY4YaGiuM6/rTP/8P593RohRc9PF35qRFDmQ4sMmvKZUQXpjwwqoFXy+nT8r9pbE/XfT1FeNclGDQjcdInTpYiMTDKe2/0ThHZI4zX1EpWX0+5wfthf6i8dx/AgzTTTRAPo23tVnW9O+8fc64uSlL+/98eb3X2d+w63wEjupp8nXbDY5oT6Y/Y7HWi+Jl+k9HH0Sxgo7mVZpPxvf9r11ljGND+nn6q2F5FwUx2qH077Os8uVXCaZnnfBCXme6mBoSnHmVGWTT/TZAPiCv1rIpLs667vgoHO47nKK/1+vFUoVLcZisJ1U1DoFJ4s8L9Sa4GsFcyd9HJnmT8hWiI5aixTsrkKmFkxs4ZwhbaNj+6mmFfy2qYYW/6SkmFmWdGbfJxZsggTg+3yNmSXh6aa8HSu0z3hLWx5M6Kc65jycV/98l2iL8qbEuVcx5SRAO28NSXB2lMNelfX9C0cN+dtueZbx4xZLcjShiMVmv90uy9tL1JpV2gvsqJH2otkEaYG52ZtyEfnTjQh117kzRhtL6aaMraLImtN0Y6KcYMGHdiP1fl4/5Ttt56TlLtfcpENSRxZZ6N2Tl5qgzpHVtvSSodVWA9+6vq+nI5woxFNM2G2fKr/2+T8dl9P7Ytlbwb5ckWMjB/ZbOIXpj/uygu5ATmXmdJuiZhYHyTXZBPiN/7dY3UnR9vvYaryt353/JheIUkI3sSZcPmA4an5dZOShk0V2EDyzTAjrug/cz1ez4NEK1UzlltQy0OrE+qbhJk6ThjQzzXdhJ4nP91f9je782Xcm2HKCau26eMfMqI3u5F4yUQBSgJkCy3IhuhMU//27bdTtYcsayhvTrV4c9lNr4A440xD+NYZpp4jv15RR2t2Np3/5VWJVw263q+bDqY6lc2/UeK1JuBJ2SUzcFiKOVPwtBXjc/ApRoxOwtOGlM3Cpxhz97Q77Wr91e2funHPDLuwlJVMzG3XHbFrdO/uZGNO4yP+tDm9zCsZ9N9Pu/v9BULJEWuec65VNwVD+Uzl9HKvZNJ3r7/+NznDmC7fSmY0o4oZVrTZVjLioetsZlgS513JnFpEs0D0Nn1Y2IhNAwHzDRusNJV2jcnEa601ze0a06WYs9o0s2ucbMToetOCrnGyMdljIvLGjJ8ZMdWY3NkHeVtGD0KYasp59/B4nxwpjFjTy7ySQdmGbcSe8YZtev2MNmxjdVTWsJUY1gttvFQP3+5xLXXPyput8755kU2+UXmbXtpEfF5n3LO60hMyUrrGDsm45ovMm9g4jqjOH5UB9I+clvFxd/80y44u41qGVPfVQ5237O33Exe//nIURdSNoiegLP5OwreEFIUn5d9Iym0iOfkOtDUlNXJIfBCx+OwXkBdfJ6v/qKXCtadYSS9loarekKs79/Lrw93+UAD4MumnhEO2Ur473j7hhcRRRZuhkERjnSviHKcfN238Qyg0qhckXRey8C0lkk4IrUm8lZzgzSn3FlLWz4qCzllREBY9aspgve76uspW7HDytdbsMtJLVu0SZZmzbpezZHzlbpoho2t3OWPKVu+mGbSb2HSOGjkicDXDT+UNyajNaVlLzO19f1UT2MtfQfPaZwv3KPTEZHYoXE2Zsj+hLzyz5jcUPqwGlqkGtk41sMJqYClLX7/9+5vHqoKH+XfPyi193NWzsXv41feEbZ4TYquvZiUU/fN4hCPqvpY2VbGKXge+O9zhXrV5MCGOfI97xauUTUiR6P28FSnRO+gZsehd2jGo6F5o/WMtib8aCcUepiqvlr/8+M0EkZuQPBHdPjQ2tU8h+VJTeq85lqr+j8mq/2OB6t4XHj41H5cCZyi9BBNGnakCDeVtTtmi9C3MeCQr8ki2vkcORY57JFvBI4HeEo9MqY4r9O9125j2ieenKzgEETbiDZFhqS6rxV+v9qf0lqdhqvKSfP2n+/3jBKGbLkOqpxkYPH31Lqt6bAkPZA4mT9z8VGLEy+xeqJQlIwtpp+pjdTpPsuk5y//CW2mVt6X6A5tSH53hK70baop/P7MsGlvszK0CpKwbXwDIvicylO1NUbI7m5KJy1uJ0nYop2gDhSQHrInyzXshWbtK3su4ObnXU2LUCoswUOTIysvA1InLLVhndo2lVGVuYQWrHV1NKVX9cPxY/bh7SHSMSHWUY5lqf7jlZZryXp411L89Pp3mmBDlW+hudcOd3NiR8LkoyzLl7fGVX77zoVlVPWa/NIP218fzvsnmx53ldhVKW9XkZmC5jrlI0iqm/ljd75qTO9sZ0dvmvIX73XyDx+WtanZTL6vZnBC2isFNn7s/PB2fzm3N/LW6P97sL5/mmTwqbmWjm6pZy2IkaxVzR1YW07ZFGdcyJBNjMmbKWHRJcR8yugyDuxCSbZkR/8xO+rEFvTzL1E8akM4dh6aHn3+qKxJfZXd9OCGu57K74DN7+sI214RJ81u7kltKQkdToCpKWq4srqSvm1sY3zy9yy6yDRJN2GuYfANY6OaaAZdnaG/qbUVpXh/v9zeQ/iSMgJmnG9TbFlVddre7y250RgQTrjAtSssdmRthyydOkDLas7OkScpzU6WMAaPzpUlG3BwfmlmAj1NMrCFlbBnmXsGku+r47fFmhsdt+jlXMOX8YfdY1Z/Up7vJtpCsKxjTjDuSjXrGkjjfCmakr83N2DByfe4kA66RDRNtiPOtYEY2Wjljxnik8jQXHY1SzjlpWYTyvNdTGBVS8samBIVMc+bciC/nz6PDvjEzBltVfni6PD6Nb0NOpV1ro0pKdMk+FVSEOdtUkjaM71KZYMLoJpWkGWV7VCaYcvRJ84eiJK3pZ17HoHN1uH192j/s8EA0b1A/85o19G3dj8A9iSU11GWebdDgk31VTdhdhhKv9dEmZZd8tbAUcz7btBXj3+0UI0Y/3LQhZV/uiDG9aXs4hyLP8kiaCaHtEzoGqGWTkZCYgtMC5Uwr/QAytiVELDMuv5ADjSlYyEkrBx6R0bwGNYwkjcHC1p7kkseviTXQWEWXapaKJIaMNeTpY15B6orxUaWZjLMM2U043a5nSCbj/Bop3fw8rJJEzvl1MsuUXM75tVK++2JYL8m8s8wpijiIbQAZZil+KF3d62lP5ZplQkkLPbFhzm25iY40Sx8SHScqb6P95Wy7w+Vf95fsqSsD6Zthzsw2h14JUm355KPyWktmnpWXNGTqCXWtGbOOqMseKN22HnzU09Op19polRY+4XQkXjRAzm6zytgxvstqkhmlByQhUyadkFRmTvasuzF7xg+9m27QY3qkOGbOc9bVamf6AVKwnmaeIFVmZOkRUsiySWdIlZlTfogUMmjiKVKFJu2Kz26CNu2mHd5UZtTD0+W+6MQiZFKceS2DCg/bQuZMOW0raUzqnKLxfiqdeq21pNn9VKYgc1aT5vZT080oPa1oVj813ZzS84pmNXLTzSk+lQd/vFOO5SkzqPAIJWTOlDOUyowpP0QJ2TPxFKWi9qSX5g2+6ImmKW87ohWTYsGbfiZczoHZ40ss5Qb0My0zIF4gmVgFz7lWqIPJJpBcC03IQfiE/lH+Xqr89du/l6sNiZcp7JY+yrVGOVZ412EBf+KrvmZawYB2lX6iBc+5lplwqm6q/ccp6qMck1X34+Bu97vcKfDR81Wi3oi40WC3yLypC/xDZflV/hJl6YA6qmskjm5c1U38BhOxQFTpIM8k9bFj/Ovu5uf75u6Mr44Pj9XhnByww4TlrpLaTZkWm7/rD9udUH6fwu0Z7fdZyj6mvnfCRe7+5rUuby6+uXnetc3FdzbPv7B50m3NC65qnnZP89glzV//+ng8P53gu+2eLf9KepLyH8bVoORi3f54SqwZ9NVEKeep+qX+6fjLuKJrunlqHvaHLkkTAFhQf4MMMxXvfp2oeJBhdon/bYfPuxmUtE04u4SFiq4JZ5fom9Me9n6DErUJZ5eoUNE14TxF1STPqNZwi7uiV3W35D3ti+puP7Hi4gb1T8ebp3GkPUw1JRjpcvT5U9c9JoRvaEZcPlCA/L655O69lB0k31IzDtXulCScKRviTEsNeD9D//tF6mOH+/f9bfXqU/2P/U3ykCCaZnmPDiXme/aBoVNHu1hnfqCbUdqrxA/7S/Wvu/vULffx8xUqj0obqbjYuNQs7JTq6IbKrmkXqHs3Qd27Oep6J60/7O72h7s31eVS/wc24CRJ+Tt6VzqBRBo2qdy4qLQcKZNOjcRD4pIybEecZZHym+P98fRmd8l0XtCCYb6FZhwupwTsSOi/ZlikuMpMiKDiKMMixe+bBr9Ya5d6kcr96aunS3q3M1Tcz7NI/fnD7vQ4yc3jHItU/1LQaUILQMZlhox0PNiIfqaF/p67CQA7/OiFAEnVo0t3fFu8zsW3n2n5rhU8YwGvtn6VJbzOghmLeD0T0EoPruHnp+ut9hTVY2TWghWfTlXxmk9a3fiqT6escN0nrWrCys+1Lieu/WSUl6/+XJVPXP/JlnxsYSYqcdHSTLakxcoK14GyJRtboIlKVrREky1ZsbLC9aC0stIVoU7jpDWhtNqxVaFOXdG6UFrN2MpQp6ZobSjZCA9n9bg5RunKG+Yv/1S+NNSV65qndDkiXZUzFqg6K+YuUaWNmb5I1dkyc5kqbcrEharOjjlLVWkjpi1WdTbMWK7KNSSZIWfahvFx54gRuVUz/BkOU62/clY0SgLmLl09KxtjZhWnVtASldlLUV6RWXcBQgschRi7YPku+fYu59s/7M9/2B8+VPWA1LcgE9WXLel1BoBFvRVMKFrmu5owXOibZQJd+qveXHbv9vf7f2ZXpPqpln+nCZn57xSYO/U7TenNf6flikcn/Eh52Zw/aUDvjT4vIH1Z9/Zf3v7X0/nSXGgI7UklnrDAe3w63O5On1LHauVVbEj2ROGTZRox6of37884NLjQrKuAlQw7VefH4+GcHOSPmEWyr2RU3mXzFhV4boE5sQO/PTZHIOVhAU2zvDmCEvON0cDQqU0R1plviEqVZt8pVjz+KjPK4zf4qnp/vLtLbO24Plz+zvqi8i/r2aapb4loyb+eUTXZ90JUjb8QpC5+E98f9+fqx+r2KXkvQj9F+TtJVhcQOFJnxMgiRnk9nYRvRaqjTSSfEr883hKNKdoAIUWr+r0Spiff6Q9t1LI492omHUY9btSugYjVjJsCY4Z2TQYzCZPK3Bqe35BJXu7W+0kjxBGNm5y0qbWUPGhh5ovjy19c6tiFdI5pJk54bcVTtYymDZQytVJWfk3L31LZSyp6N1Neydzglq7Ii8Jb0q9hUoDL1ZbJIS6ZdY3JQS7XNY55YS45U4oDXZ5tmBbqMo50JiifGu6SWYkuDHi5rkFPCXnJgZ4pQS/P2Gdy2EvahCmBL50Bk0NfcoR7cvDLM/KeF/6SMWZaAMzVkBkhMOv0C7O7g2Qv8NfnbdnZ8ytRumndc2IknhS8ec6EiwhNn1PJaRPG63nEiERVj1ixwi5SKq3kfKnWtlST2Zzlkzp0YaAuTj1bZcHZOrHO0sN08krLfHWyiy71zBkOmfDDf6suby6navfwl9P+h8fkzlmQrNwv27OpkqdZp4RvSEZcRlSCVHfn000y4ZplsfK6MJfjDT6FKVcDXaY5BtA3fdg9nj8cL+PvepBw3beNxZe/72E5ImO4vdri921fjWjlhW3g2QIpxuNxce0ETzeX4ykjadNPhk0P5uTr7ZxTEqWZoSE6dSWrhaQr08S38rne76rL64Li9JPN0/PXwkINk87Td/3aRpTF6WZqevbyMV29lPO0/fDm1Vj9tUlmy6dtTlLLc8JCXTFS2Z9vjh+r06dMC0fTTBhipW9VgUI3l5GbVAbm5kY/HzHcgYqfMyxT/FDP9HZ31TcwZg2rjrMsU35bfdzjATLWfE2/TO39/lyPrOqx3OvjacK7ptmWGZG6wT3hZ7mogJzKqLe8Jnuzbw5quETD0O5THSYp/3bIyxwRWfwun41NDapPJ9B1p9R2qWdo5ZozKeNG7xt/nvOEQvfzzLEhbnbr4cK7ct1d6hlaBR860VXvx91pv3t3H2vOOg25BPP19U7qN0+Pj/WXlbyhFaScgM53v+4fnh6+f3p4V51+eP8sK3VlZkrbJisJV26imKmR4uWfz6l/eKwyx7VnzExKmWkieW3fJ0IR2kcrrGrEksauvGjtSa1mNMdc/fn4UL3OX136rA7lmKX6rjp+d8T9ek/hc7pZavx/xnS0iWYpOHce4S9D3sWD8ZQ6mGWWcvjFjRuQzDbLiA+1N4y1UM+6aepZKndPv+7v97vTp6+ODw+7w+14kVGOWarHbkZ+Vll0ITJRpZUSz63JTz+lxkJY0ctrhqy+l9XYQvGzh15bvslWvMRCCi3rirLeW+jMuv7wB7bEHNLq5y5398/K2/3dO7+AW7U31HcNbZmGzUjuZHlDghGTmivoZ9qDss4z5lTd1z32x66Eb0+7w/l+N8GkcQHLDGuKOt+qRO55JjWgen94Oj6d28L+tbo/3uwvnwqNGs2/1KymtLNtQpnnGfQYSud3mhWagbLMU/7PuhhTNA/Sz1M71oZGGou6MqqstzjVRmskaXcvwYTJC94bM5S2ecjsTe1blx5rlarapQ/PTKnqdyftxROv9qfKRzhmlvSSicsr8es/3e8fp8vedPlSHpEqxZzhzrgh44OflIxQjomR5RNMepkNOx+xa9lAqNzGkk98iaGn6mN1Os+pyuec/+uO1prSFjU7gEzJ6UqzrrtRw7zLLbHvM7rdwNayEflkg8kIvbcrOdugwqTlzWkt4Mfdw+Nk4ZsoY7KThaVIzeJyyxFpM67ZVjGiTv42zY7G6uPtCEWabAz1ohlGARGrGDc2HkvbVDQ8GzGFREy0a0L5aIl+olUjJYDo4igJYvvIAnt2+Xid1dpI1vh6bWvV9PXMWMvYimZeSZMgvyAc6+qnLldJ3sZfq16kSV9feDjBw8LkbFza5jll0vLWsszsrUBPm6xcCamebw6PT5dsHUUpJlVUobhNSJosQGxgQhmcQCFV6flTmaJL+t0PdF1G3n6BOngwGtKVPhWtTFHG1wa6xhwOq+t1A8fLMXy1uW6AJlqxG4CiC7uBge1JI8Li9FQb4lwLTTinTkZKKD9nz0PKqY3f7puuo8y8XJpmvXcLJZe92oHh2Tf7faLDTBkQ5VlD/eQKGPerjAHw/f7YngiRtaJLNOUNl5WvJ3laAa+W4xL+WD0cP1ajTgySrefHKeFlroxKMK+6M3aMV3jeDNolxPR/pGMASdftHlIKyjsJVJo57XTSkvHWOm8C+aYLax+nXLX9Xlb3iaJkNmvsLk8j89FempW3aVDJE/ZoxIYnx/dNkEtImhjgPSdYaxpEJJZMhSIrpw9Rqb6xESpURrl7rsomV1d+0turq4IZb76iHsZeeKyul3imwn44aFpXPhB0VM3T5SZ1dBVR9JyyXFXvvvA2tKDxk0zDAJKt1zakhJc1D6gEM3wzbcSYl04wINn7JbXne7686v44L0RGjLxnkGzNcR4WXjrOG5YgtXTxHPoxyY5+vsVmJN920oD8286rJrd2t+EdI+8bJlzvjafFl71zXI7UDrU2imWiIVG2FYzI7PHJ2DC20WfMhN749nJ8zA1qnx+vOJIlQguHr5Gl0wdfQ50jQ68CdamB10BXdtiVUBRtlomvHO92VtS/rbKttJNTtKm0MSS5B+VwvK2GG+6u8rvHMyQnbltGRSi5YTmr65EEdA+UPCcokk62Jn6fr6QoxRzpXxVWFEq6WF9qy2VS69jWy7xuGnmP1BWE2Sc1XNd0MxriNJM1nDv70griJJPln6IlprQKkmpWPcHtLLC2SrexZOqsTNkw4RwfI5NF5GLjU8SU/F00Gk+rIKlmeMHzKDDnBb1Uk7Xc9EYc2Ra6n266B9S9Zea1h6dlUp1h6rmT/Gp3f98c/XYV3sQ21cOw9udsZ5uNdQNyNiOBk1dbMuYeHx7rV9acGHj5lJuWt+pHkud3SeZ056aKQPfkKWM0DvoqOlCle/X1b6uMgzo5ReOgxpD0CCLeyD0Q/5jbr52Xu7t8yMgNT2fI/XA8X3oxLgPZUYoZ8ukcZyB+dDqTk36uTs3e7WEjfRUfpZgh/2b36I/lvOxzOkiqGXqewMkbV/FPmcM2slKzx7BcxRcdwpL3zdQJLM/+OXb4SlZ+ey1Re4JLWssg3WJdmSINE87QtrtpWkNyOttAFUk1/zv5qsidceJZddnI+ebw/nh62MERW1Sbw6QzNOJZ6FVLfhaabwnyk6u4AymZWY18T3hyE31O+ZkNkU7GaofqJtMePyeYLPunU/XfT9U5IzxKMVl6M9z+dL5UD692l+rLw20Pegw0JVJP1nqepDWRek5Z/zzaMfcTzarPm+Nj7nuJk8yquRH55yXymwWFovZsmHBWXU1pQpPp52j+Mmr+8zppyjnassecxcqKDjkrqtOiipyr41V5J5RIPatkycPbekUbPbptREvm4LaenoJj2/Ka8MplrCO/cjnyHRd2ruUrlxP0pVYuk1rHVi5zbaLvHH6s3h2PmV6SpJpTwtT6aFyosfXRnIb0+uizhvH10XzvMaZgfH00Iz+7PnpVUbQ+OlJP2SXLXm0VrVnm66xMWen66FgbB9dH+w1cdn00Iz+7Pvo8MypZH816QWZ9NPKCgvXR/Jg7tz4aD71L1kdzHoDWR59fe259dKT9f/s63/r753M8Niv5PFty05d//ybf1/vns2qjuvxyPP38zRX65usGpJ6jFR6cGivKHps6KrukHyw4MpXouSr5fzwiP+zu/9+rhofj7VNzWt9P3aOf8gvRcdAKGoZHED4SGScF8iPTIxMTzH9XP/x02d9M1rmJc45p72VPmZI+sTRrx8hhlxONqD7W2aZXxjXbKkZkjs7PWjF2jP5EMx56R4CXGtHlWsWEOFSk1ICQZx1vyG2ozjvE6IbqcVNI/PpgJpfblhMZl8u6tPl42B2eaoWXpxO+iWeKGRsibLTasnWSjJm+xVdKTrO0lfJZTHy/Pz38Usv6a3UqcL1xY4fyPovZ5+q0392HEyEX20yEfRaDP+xOt0294PO5J5nbE7WWsf1tO6eCzrFNtfSjbv5zTh0kllC3iTON1kBXnIQBf/vy9nbMh3rKuwxLFUM6WqC/iJeWm/Gx6MvvWfCx/OMeKu95WrN8Paa5SbPUy86NkFfV+2JdmyjHeCF9MXKqv7lUMNo1o7vNMll5/97qpvJza+/YlmS+xV97mMwtUr95FjJaOekKSHYsN0+nRGR7uYWRlM9gol/fXGhgJ2N98x7255tlxrUSVjGtd3f429cIZGAb+4mX+v370/Hh1Z+/ej1d6SbKOlojpIQJY+pUf5pvTz/3eiZ9Vw/Id2Oj5YRB17wrmVM6FUPmTJqMJc3pteLfvyn3237i38hvgdJJfktKmGybd6ebD6+ODzt8jOqIQST7SkbVqQo/JmRTP/d6JhV9TAmDyj+mMnNKPyZkzqSPKWlOrxMgy8ljXzhJvvSDqg7NFStjk0CodfOcd7xdoaVMLf7V9TXLljbjaobc7w9jo0JsSJtxNUO+ef1RzjKkzbimIXquIXpNQ4o7Q+y0k7rDQpOSpxeOmjM8z/Byvv3D/vyH/eFDVQ/Z/ec10TR69AcNy0ku9HQplzYq+8PN/dPt8xB4bPZCVW+QgJKVpWtRRyujfPmY5lg89S9azUop3jxnn1IhIyts/5YIvkvatuYc/GZ3qe6OpwInGU7Norwl1VHGGuJU5X6Cci2vmrkvpe80U5foUpWAq6wLWy2fFIAcv9HMIKV50vQAFTiznDzXpGwo8DxzSvvOpE2Tus+8YeRkrjhyJLXm2yT6jRwlUjbJN9qSLFxXiLVPWk8YqI9r+ZvXDSqozmNtyTXd0rpO3ROQ1JW/jzQq53NRMuPmOaXd9DOuYoiea4heaAjp2HohR8lupEm19MXXMpInhiS0baI8JR2UL0yq34wDfCcbAnPPMAnUfvlwIk69wtsofO/9YUM2Am1Y9PFBJohLy5mT3lM8bRQ1zxt6p74s8YnRwxmf00zyD5JnBS+Z8XIGHjMWUZiqnhHv6W08Lz7kKg5TGhWwtALh+ezTLcgc3x6HTY3XR8LMsYlWqZlFk675ZqYOZJphafbIplWMPR7uP72pDrev04dWzbB7KPU3KMLf16t3IvIzGj92StkM45PnmBUu0M0vTO40uxkFgafcffZCZE7Dm1EGdKzE5yjCcE5a1rn00v4Gs6ahvuKZU79YqRXcx9LZE7Ckn3k1gwpnUdigKTOpIoNuD+fU3Qh5Y54zrmNI6ZIOMGXSYk6RMZMWV3q2wDWWwk+8yLRpSy892/AKzELjVpka/YEtbWyi82K+WjRPak3ZjAlcZdL05aHdfzMBW8A8S6uvJFo3rbg8dhcXOGHU6em+ehOuj59vWl/IugZet0995/eMLbY1KW+x2cPo1clhq7+1uyW0lvsaKOcK4bMrxM2uHI26PAy1xKBvfphpjM+4Zs1MCSVeI4Z4zU1mKaumBWTlzIq/9K+bHY0TPvRB+t/iO8dKyz/zYSETxvz7mzdP7843p73vkl8f7/c3n8qa7ISJeYFrGv766f7+9bHOutBeIGdVM3dP5yaWLq6WesS5u6tO1wCfpSWYpGJR4XrIMezKnfAtgRy/xdeUUlv+PaGi4kr5rtklPKFKBul/iwrBSsurY1jIVL/kj02a5iQJ41Ki1jO2tL9KGDipu8oZRW9nL686kvq3cCWkstyRaPHGj5D4esbO9WuepRXSnn05NupL695EEibtnn8udsq0/fnxfje6rpyx7CpgXcNO1c3xdDvt1AdiWixiXePCPo35ll3zr11ny97lNf/qr7LafxzdBZ9/k52EdU27rhK8mnrYCrFwKGhdQ6+9xJSzWIiNPRmLzYtb2h8OH/fvy85niJMuP23jv/D9ezl9my7XaA30SpXcSnqYY0Kba64J9MT+N+1O8P2hfy5cOKCf7uB+TjjjBYCNShNGGiDHUif45vWf9veX0dYlpXkT5S/d/FEyKvxndTr2Frvn2ocErWnoN69b/yrcyoNqMJKwpmm3nw7xEW8TzbrmXtWk44WxVd4rlLS2qX9LHLw6w9ahqDWN7e6gKN31nbIUyFnTzPGI9KRluWMO5xnTlK90A97QnmvuhSb14yPCgvCEHgFlWdolvP32DXu5nat402T/aVtSM7C8OaPYMqPYZzGKLzOKr23U8fDuuDvd/p/q079Vh6qolU2bmBC2qsG7m9qcc1i0Dq3kbHOhqFWNba81+TJSNNtaLGtdc5uuZ76Bbe5VTWrOjL5UfzlXpz/vDrf342sUafugqFWN/dtLtXUlkRtpI//2UyRiVePefPndt8tsiyWsatrP1eldPfI+LzOPSlnVxKdzk+mhKMQ1bSKVsqqJHy6Xx1f7u/jKmKn29USsatyPXy90vkjAqob91/l4+Pfq3TLjiJBVDTwHKljdfv3l6++qy4fj7exh3gbLWtXch92vTRM738ZIwOcwrAn+/LY63F3GlpRHLexJWtvU17W4eiJwu9zUgaR1vbNN6wckC2YgGyDoc9Xpn/fny/iBB0WV+ixq3aZ8d/5Qj0++vL871lk+PMyvViRpqam9WagP2ZoyBx1kWEz89ueb48fq9OnH6ny8/zgaE44N2AAx4xU1LP2Ykf/6abGBQcSKxoWR8atO/kz7hlJWNDGEBv7r7ubnp8eZ9hERqxv37fGu4OT8vHXPMlY0rzuE+y+Pd6fd7Vz3G0pZ0cRm4PmnVczEklY29c1ybwRiPouRy7wSyVnbzDAmLT+9JmsrErbml1739ru7agqUSH7wWNSKxtbjlDdAycweepMRt6LRd9Xx2+ONl/z14XKaPaDYQEErGrp7uhz/rRo7LjFl3XPu9b3zbUOi33RTvWXuOZD1OcZE3x8vS81NyVrR3Ha/RHD+FUzOyVvR7GbNaTWbk8LW/LBub+c3UtfMywzqhQvXrjVhgkOTL53e7J5+rSXtTp++Oj487A6jqz9Q/wZJGY+ApSXPhqY0x42N2Bal/A12aVNtxXu04wItPt9qYMXEE67KjCncnY2MmbI3u8CYV9+/OYzvzB4Y8pxtDSMmHlL7bMac82mJIek7BkoDoxO5FkaQ9c/DLrUlkWupLT5ysx6XlW6IC0kXNxoFq/wDfeCQ4IQ/9EqVbSuve36+mX7idpNlaUWUf6FDtcUHY8KypmaCv0xqwIBVsYRVTfvu7V9mGxXyLjUn50DfTj8pvcmyeFRy+7A/vKkul/3hbuo7u+rfUCmTK8qXPhXa8lidFltIhKxq4NWWt8VjGWAhlbLUxP6JpR/lxBsSUJalzlZ2S0JS85SbEmCJE2bdlIQfpa26KQ45GjGKvDE9/Y0NsvxmbwxrnvjGhiVe+MYSVk16Yzmjcg168SAxlW/pu1vSLJFdMIvbpvE9dceLWGZjK+GzmMbGYlDHbWNFcaiTjZt7i0dqm9NaRtLdNtflh09f7cg9BYMNN8O0C2cp4AD10q8zl3WOVaRavnnd+zgHVRGeLyz+D29eTQEdNPn/5tFY0JblZ2MNamT+4hS2sHSFqtSQx+N5P/fVbaLM69VM3WK8uZzGiWSifuLsqxnV3F0/7311OVczpbRdxuZMao6LX9ns72327UoZ03INVNkJfolcyzfI/rp/eHoI94b/8L7g0PecIRssbvJLHTsmdnpDNevU04lmdS1PSLbEwIGk1Wuw/uaWm9mTsraJvpFabmNfzNpGzm345p+oOm4gHXVF6/354RdJ+HvY+r38qNL5m7+7s0l/v9u/Owt/zxvAn2vxd7YFvDPss2wCnzhRRXbNmaT+NqHPyz/KxcHP15f3+w1/Hpj4uwuA7iz8/YZAdxb+XoOg+/b9LsOgOxM/ayD0dYdW28bPblM2SNKKhhafe580cNrx96XRWt/8MKFF7idevnD++HSpRw+H6uZyHN0BB3RvhhLGScMPZQ3c/e7TD0+XWvwcu0j2lYwqdSFk0STnSZrzGc7TWN6lzz68ovuwfmfHV/TM+r0eYNEZ+f+bIyw6gz//IRaLTjXozPx9nmvQWfe7PdmgM/Cznm2wYG9+Z9/n2p1ffrtO2raJ1+wUb30dHmdfHFOZzrlwqejHanf/dv9QvZlxqHM279JO7ce3r797ur/sb3ajQeLjdmyItNG3mq+WtMk/vR09Ha3M2lbQ5zP0x7dvVrQ2kvZ5TC79rgvsnfR5lxqbPS6+9DNPZ1z6NbWXI07ZlZK3ZYMlju8QSddNrtGcNElDWZZWYPlFPmjyMfEqn7LZUBScMLtGNkTI+gaWzSFHDJwwk5xi4O7pdr+4BomQ9Q1cWoNEyKoGTlgmSBs4dbFgxMBe6xEOwJ/SeAxz/CZtR0LthKYDFDW5sPlrdfvt7tP4fa9Js/oiFhrXH5C29wJMGoiCPL/FW0srLn9vuMDJ7y2ctR/am/nWDeSsa+ZD08u/DiOEpaZCWeuae/up/mN/c80z3982SNRnMfbtaXfz83JDr2JWdoDm6Icm6q7oOLLc2x8IWmxofw23uetj0gouzfBbtDMJreWNDChn8tO97G53l92bkltUUnYNhCwzsN8/TOzQhxl+m55hYXcOypnsMH1TPq2/HGT5jbpLrHdSbzksbWaZo3wNKWUalbK6iSWLMDnjipddpplVvECUs23aulC5gVdW3WWa7fIbKGpVY9vI3KYu/vLjN6U9YsLchLClBsPLuidfoJzJ+Vu0L2PqZ1zfXX4z7oxLvFNmzr3Ke/1rfEdNnbSYWmbo6C2BY0wZZ1pjE9Xh8u0+6kqGu6hCghVUtYPerLbnNKsp/PJyOZUo7dKtE6jchD1P3MXay7KOFddthm08TS243chfZlI6//ITnS7H76u742U/IVp5xJzNUOjk/ZjDikp114/V6N7uQrM7UZ/P2Nunx/vq13Wsvcpa1Vx64sKUWPZB+uXbmA5Pu/tZWjfXvEUnGhRtPrvfH35ujnGcaVGcfT2j3pddnJWw6f2E67KKTZpvzhqm0BMoJnqwXtWDm4iox8uPx6c63Ze39Rh5bACHLdhAOUUnP6z4xpBhE95YmSml3zwyZtI3X2bOhG8eWTT1my8zqvybRzZN/ObLTfrxy/kG+bzrmVMczostmhbRmzGqBwyPFzGlMRqkXzgWfTX1CsthhqXN4Zs337yap3TTZh3HgcNSplqa4+jGi5QxbdYVjdnd73ej/DhhTZd3RXMeT/vmjo7R8xATFkXZVzSqu5ZlplFR9mVGFZ2YNLaSkM64/KSUH6v3VZ18FI3GSVeY59fi8luR2wTLC/j6eJ54GgzNsbQlKzusAGqdclDBoKDpQwrmWhOyrmnMhO3z2KSpW+czhhHHeVuLnug5gyyLt2adXze74M51GS+N8LkmbICgktoa1sEiH08YN8HJiw263V2qP/kjrGab1ROxbm3tH5Ya1xOxqnHvj4fLm/0/57/OSMDqhn11vD+O8Ze8ZZ2EVU17t7v5+e50fDrcLjNwKGdVMx/vd/vDonYklrCqaRM6goRpU3uCnGmkK/jm4W5iT0BzLO4IHu5e70Z5bUrx5jl7Sc0Mirv8nWGzpr6yjGG587VKoU4y38JR6HeTj9gCORaPQo+X0ZWplNpNl3l8YwUoau54p7kGFR9gN8Gg0tYxadSkxnGCYc1AZK5Nbd41zWmGHrMdKeRdu3a+PNy+XWBVX8RC48A0oviAvyjxbzPrpAqnjsVHTkfrhoI/7g4lJ1UOrKH5VzJr6uSgZ9OsacHYaXwTJwT9VzZnKlDw4iYMZQcvberwdcScWePrnlHzR9brHQA4MGrOkBUc9zcYrBa3N89plzY34bjo4uv7hro3QELhmHDkDTXB+0XzWWrRc8bVDPn3/W3hKJ5a0uVczZQ/V/u7DwXtDbDlmnUdY/xgrnh6Mzzcc9rUZr3vmRozYzoz+jWjoz7nzmdo9nUC1uZsMc9lXdoS3U5ll6PGbKDI0liqsW3max0bucIVB1N2xA9PNit9+ZmcS9/9Gvdxk3pc7WLu0Xe/+IZuYPnyq7onmD33EMWk3YvOUywzfPkt3sj6la7zXq25GLV64aGGY41Ff5d8aUORyLU8jrm9U3aB+k0sZDzsJ1H8MQMLr84tM3TKDboTDZ53IuISFxw3cOyMxOLeKpd3qSv6wwm3iy0IZxRui77dbFUsbWbGLV18qtnYu84elVT60suELBw/v558GhLIsTxuvreW2WqYawi9/iMSN/qyUXUU7QwsfampbCuEM73qb9YYRDOF54v9pfLnnZTf4Q1yLO48Fyne7MrvukXFTYYgNkmLtrQmLSMyFpo3vPjso24CqfG8FNyDBpKv5z6Ft66DHL+5++gV3Ed/FvfRa7kPMC+7MaV4+JzMuEaL1yyJvLl4ud/F0dHDto+kXCM0/TowmBqiDjMu7kMLo8PTyqdFiePSJ6PF75r46g8PCy2M5XwGM1+/+T8LDQwSPoNpzerf3xYa18n4DOaVDs7HTJw0Mi8yM/5s/+qvBhgxMSRa+jmObZqNtGyKNsW2tifUjS0jxOqKVgsG6kYi2ifggGTW5XH2hWDWJ1sc23DaHc5t+gkaN/18JYgmlCphxs3UIm9uJrBnqnosPH2CG6TzLvcDGqM3waxk1oVWfXO4lASgdMkWDwf2oyOzWNMmpB9f8upKkZ7JT1O7K2r8gFr05U+4w/Q59dKanvIB9kjt5O9wLH5ncoPUj+CZ1y6teTUlNWn6lZTQoHQw3MTmamV23aPv05qo35CiF24MXO+koTK+O3qbTibr0qYcr/uPWZTKtrSOcuvTc+4cWmTZ5ElLgQXlE5eRukjt0+2ivb7+8vV31eXDcSxwrMRmKPQzFSBcnfiXc3X68+5we1+AvwsKAIWuVwC8ltPmLlnMiZKutZT01f7xQ3RHL1YcEq2xgPT6zf95U40eO/6ccunn+HNVtBU9UrYJWcpm4m1xUuubtYjHD6fduWiVKrahl3MNUyYtVsSWTF+dGBhStopYfBnSuISFjloyo15lOj3WT0QT2KKuIDtp/o9yZf+xWNnfy5X9fbEyP6moh/GjZynQBYEuzzL19/ufq/v9h+NoFxqp7+WZrH7grGWTwIUzwMzsc1JgLMi2Xs8yqRUhWcqt+M8Xtdjb6tcv/vg/X3wM1+XWKfhL8dLVWd7vq/vbOvs/gn21wOPDQ5hi3h5vnvyf/9km+2t7c+sf/xFS/8v2ixf/2L7Q+qWQ/D//88U/usz+gf+hk/H8i8/I6n+xF5q95EL2MrJBRtbLWI+X/8FRRj7IyHsZRf0v8UKZl1a7XkYxyCh6GWX9L4k0ykFG2cuo6n8plFENMqpeRl3/S79Q6qVQupdRDzLqXkZT/8ugMppBRtPLaOt/2ReKvdSmn9EOMtpextqD/uFQGd0go+s7QOMPbAtdYOg8jHiPdx/sP8CB+h7EGr9gHHktGzoR63sRa3yDCZh56Eis70ms8Q8mX6jtSy5tP/PQmVjfm1jjIwz6Exs6FOt7FGv8hGn0htnQqVjfq1jjK8xAzUPHYn3PYo2/MAszD52L9b2LNT7DHPJoNnQw1vcw3vgM36LviA89jPc9jDc+wxl6z3zoYZy0Ub6R4lAzaKb6HsYbn+GwpeJDD+N9D+ONz3DYWvGhh/G+h/HGZzj0MD70MN73MN74DNcw89DDeN/DeOMz3MDaHnoY73sYb3yGW1hhQw/jfQ/jjc9wBzUPPYz3PUw0PiNg/yeGHib6HiZYsjEQQw8TfQ8Tjc8IBruzoYcJ0hP6rpDDzKAz7HuYaHxGiBeSv3SWmD30MNH3MNH4jJBQ89DDRN/DROMzQr1Qoq5tknnoYaLvYaLxGQE7VTH0MNH3MNH4jDAw89DDRN/DROMzwkInGXqY6HuY9B4GG0A59DDZ9zCZ9jA59DDZ9zDZ+IzcvpD2pXP9Msuhh8m+h8nGZyR7IbcvmeuXWQ49TJLxlh9wcZgZDLn6HiYbn5Gwf5ZDD5N9D5ONz0gJMw89TPY9TDY+IxXMPPQw2fcw2fiM1DDz0MNk38Nk4zMStp5y6GGy72Gq8RkJ3VMNPUz1PUw1PiNh66mGHqb6HqYan1Gw9VRDD1N9D1ONzyjYP6uhh6m+h6nGZxRsANXQwxQZ1fthvUDNkAID+76HqfQ4TA09TPU9TJnksEINPUz1PUzZZGOghh6m+h6m/DgMTmWGDqb6Dqb9MAzl1UP/0n3/0o3HwKGQHrqX7ruX9g0Y1Dv0Lt33Lu29C+YdOpfuO5du3AXP3oa+pfu+pRtvgRM4PXQtTSaNjbPAOZwG08a+Z2k/woeTMT30LN33LO09C3qHHnqW7nuWbpxFSVhdQ9fSfdcyjbcoOCIwQ98yfd8yjbsoOGA1Q+cyfecyvu2CUyIz9C7T9y4jkoM3M3Qv03cv03gMnHGboXuZvnsZ33TBuZgZ+pfp+5dpXEbBtt4MHcyQhYnGZfQWFhmsTfQdzDQuo3F9DR3M9B3MNC6jYftjhg5m+g5mt8nm2g4dzPYdzLJkR2GHDmb7DmYbl9ECmW2HDmb7DmYbl9FwHGOHDmb7DmZ9+wXHMXboYbbvYbbxGQ0/Kjv0MNv3MOvXveBHZYceZvseZr2HwXGMHXqYJctf3sOgb1uwAtb3MOuSvm2HHmb7Hua2Sd92Qw9zfQ9zjc8YqNkNPcz1Pcw1PmOw5qGHub6HucZnDPyq3NDDXN/DXOMzBvq2G3qY63uY810k7Nfd0MNc38Nc4zMGduxu6GGu72HOr65C33ZDD3N9D3ONzxjo227oYY4ssjY+Y2C77cA6K11obZzG4EW0LVpqJWut28ZvbGKlFqy2bsly67ZxHYsXa7dgwXVLVly3jfdYvF67BWuuW7Loum0cyIoXsi6/pfrBsuuWrLtuGx+yEs2EwzOanyy9bv26BRwRhmc0P1l93fqlC7j6EJ7R/GQBdusX9/HC8RYswW7JGuy28Serm/m4drT+wSrslvifX7u3cHrK0FL/YK3f+599wd3LrVQkP1rtJ/7nV/AtbNwZWvCnK/5+ET/hP2jNny76+3X8hP+gZX+67u+X8h2cJzO08k+X/v1qvoNTZYYW/+nqv1/Qd/j7Q+v/FAD4NX2HkQlCAJQB+GV9B1t8higAwQDMr+w7OKBhAAQwQgKYX9x3cG2GARbACAxgfn3fYf8HOIARHsD8Er+DIxsGiAAjSID5VX4HpwwMQAFGqADzC/2J7x9wAUbAAPNr/XWvggsAHJDAAcbD7BR7MOADjAAC5tf8Ex4EEAEjjID5Zf9UDQIPJJiAicA68ScESAEjqID51f9EEw5gASO0gHkAkGhCAS9gBBgwzwDqjhUbgLgn8UGRXtNlABswwg2YRwF4QZkBcsAIOmAi+GDdCKuXzggiAPggwQdMBB/ErQggCIwgBBYYAlxzZAAiMEIRmAcD9dgAGwCckJAE5uFAwgcAS2AEJrBAE7YYAwOewAhQYIEoYB8ASIERpsAyUIEBqsAIVmCeFKR8AJAFRtAC87Qg8QoBXGCELjAZnBC35AAwMEIYmExDLAYYAyOQgck0x2IAMzDCGZgMPoiHUgA1MMIamMcHLBH1AXADI7yBqRD4gbsCgBwYYQ7MYwTG4MyVAezACHdgHiWwRAQIQA+MsAfmcQJjEIIygB8Y4Q/MIwXGcFMEEAQjDIIFCMFwUwIwBCMcgnm0kCwCcETCIliAEQyPiQCOYIRHsAAkGP6UAJNgBEowHTwRz4oBmGCETDBPG/CnCNgEI3CC6RCEhAdFAFAwQiiYpw4MR6gwQCkYwRTMo4d6sIkFAD8krIJ5/lCPNuGnBHgFI8CCeQiR6BAAs2AEWjDPIRIdAsAWjHALFsBFokMA6IIRdsE8jmA43IYBfMEIv2AeSeCQBgYIBiMIg3kqUQ+4oRcDisEIxmAmuCFc1GKAZDCCMpgJbpgIDgNuSHAGM8EN8ZcMkAYjTIOZ4Ia4UwJYgxGuwTyqqIfc8FsGaIMRtsE8rmAY6DCANxjhG8wji3rQjSsROCJhHMxji8SXBCgHI5iDeXKR+JIA6GCEdDDLMl8SgB2M0A7mAUbiQwC8gxHgwTzDwHEyDCAPRpgH8xijnrXgMEXghYR7MI8yUk4E0Acj7INZnXEigD8Y4R/MBi+E1IcBBMIIA2E2eCEeVwAMwggHYR5t4JAhBkgIIyiEuYwXAhjCCA1hHnDUMzdYAABEGCEizEOOeuaGBQA3JFSEedCRmGMBLsIIGGEuuCGMZWSAjTACR5jLzJMBHmGEjzAXvNC9kPqlteRDBoiEEUbCPPao5464CoEXEk7CXIhTwd8BQCWMsBLm8Uc9ecQWoKhhGjacnihzwEs44SV8G8LuYFvCATDhBJhwD0AYjkPjgJhwQkz4Nu2GHBATTogJ34Y4dRwJDJAJJ8iEewSC+yMOkAknyIR7BILdmANkwgky4VuT7o84YCacMBO+zXghB9CEE2jCty7nBCCymFATHvZH4JBADrAJJ9iEB2wCsQUH2IQTbMIDNoHYggNswgk24WGnBA5L5ICbcMJNOEtzOw64CSfchIcNEzi0kQNwwgk44WHThHQwjh+QE07ICQ8bJ9QWxY9wgE44QSc8bJ5Q2A0BO+GEnfCwgQKHOnIATzjdQ+FhCFN4OwLaRkH3UXgawhRuzNBWisFeCh9qBSPEONxNQfzQ4xCmcGOGdlTQLRWehzCFv0S0q4Juq+Bh5w6cI3G0s4JurQgEJeEGaHcF3V4RCIrCnwLaYUG3WHgiknoJwA/pLgvuci8B+CFBKDwgFAUZDAcIhROEwsN2i0QdAobCCUPhnokwHOfDAUThBKLwAFE0DITgAKJwAlF4gChwfM0BROEEonCRBnkcQBROIAoPEAXH0nEAUTiBKNwzkVQBgBcShsI9E0kVAHghYSjcI5HEuAggFE4QCpchHBCu/XLAUDhhKDwwlIQPAYbCCUPhMg3yOGAonDAULoMPJjaIAR8kEIVnNmdwwFA4YShcpicoHDAUThgKlxmQxwFD4YShcM9EGI5v5ACicAJRuIciTOPuAFAUTigKDxRF44ERoCicUBQeKAqOdeSAonBCUXigKDjekQOKwglF4YGiGDjL44CicEJReKAoBu+vBBSFE4rCA0UxcJbHAUXhhKLwQFEM/pYBReGEovBAUQwe2ACKwglF4YGiGOyJgKJwQlF4oCgGeyKgKJxQFB4oSmJgAigKJxSF61yvDCgKJxSF63RsFwcYhROMwgNGMfhbAhiFE4zCA0Yx+FsCGIUTjMIDRjF4kgAwCicYhQeMYvG3BDAKJxiFeyzCLP6WAEfhhKPwsPsDR1hyAFI4ASk8gBSLJ7sApHACUrhOr19zwFE44SjcpFcOOeAonHAUbjLr1xxwFE44Cg8cxeLGAHAUTjgKDxzF4sYAcBROOAoPHMXixgBwFE44Cg8cxeLGAHAUTjgKDxwFrsFzgFE4wSg8YBSLN3IDjMIJRuEtRsE7/gFG4QSjcI9FEmvwHHAUTjgKD/tFEstGAKRwAlK4zbSHgKNwwlG4DX6IG2QAUjgBKdyDkcSXCEAKJyCFey6S+BIBR+GEo/DAURJfIuAonHAUHjgKDpflgKNwwlF44Cg4XpYDjsIJR+GBo+CAWQ44Cicchdtw6gVuTgFI4QSk8ABS8EsEIIUTkMI9F0m8RMBROOEoPHCUxEsEHIUTjsI9F2EON6cApHACUngAKYnvAIAUTkAK92Ak9Q4ASeGEpHAPRhJfMgApnIAUHkCKwysmAKRwAlK45yIpJwBeSDgKDxzF4RM9AEfhhKOIbbpTFoCjCMJRROAoOOhUAI4iCEcRgaPgiEUBOIogHEVsQ3BDwgJwVAYBKSKAFAz2BQApgoAUsQ1r2NALBCApgpAUsQ1rNnDCLwBKEQSliIBS8NhOAJQiCEoRYfsJ/BAEICmCkBQRSAqOnxeApAhCUkQgKTiAXgCSIghJEe1pUzBqUQCUIghKESwTdCgASxGEpYjAUhycsAvAUgRhKYKll20EYCmCsBTB0ss2AqAUQVCKYJllGwFQiiAoRbBMyKEAKEUQlCICSsHtqQAoRRCUIlgm2EsAlCIIShE8HewlAEkRhKQIngn2EoCkCEJSBA/BXrg9BChFEJQiwtFUeCeHAChFEJQiAkrB4WYCoBRBUIoIR1ThrSACoBRBUIrg6ZhDAUiKICRF8HTMoQAgRRCQIngm5lAAkiIISREejKS8CHghPbIqgBQ8SRLo1Cp6bJXnIjjUSqCDq+jJVYGj4FArgQ6vGpxeFbwQjq8FPMCKeKHnIjwxsECHWNFTrETwQjg8FeggK3qSlQcjHO8mEegwK3qalScjHO8GEehAK3qilQhLNnCyLdChVvRUq7AfBR9fhs61IixFyHA6H+7WAUsRhKUIj0Y43k0hAEsRhKUIz0Y43s0gAEwRBKYImT6pTwCWIghLEZ6NcIabUwBTBIEpQqbDbASAKYLAFBFgCh7iCwBTBIEpQmZaQ8BSBGEpwqMRzvA5doClCMJShEcjnOGz7ABLEYSlCI9GMFIUAKUIglKECudECsQ0BUApgqAU4ckIZ7gtAShFEJQiVHp7sgAkRRCSIlR6e7IAIEUQkCI8F0mcrAc4iiAcRXgskjhcD2AUQTCKCKdiMTwsAhhFEIwiVJoqC0BRBKEoQgUf1NgA4IOEoohwQhY+YFUAiiIIRRE6OCE8IEIAjCIIRhE6OCFcLhEAowiCUYSnIpzjKRLAKIJgFOGpCOcwOEIAjCIIRhGeinCO51gAowiCUYSnIjwx2QcYRRCMInQ4ng1PEABGEQSjCE9FOD6AVQCMIghGER6L8MTwGnAUQTiK8FyE44NYBQApgoAU4bkI59gTAUgRBKQIE47OxZ4IQIogIEWY0CljTwQgRRCQIjwX4QJ7IgApgoAU4bkIT5yvCkCKICBFeDCSaJAASBEEpAhjMn0SACmCgBThuQgXeGQDQIogIEWY9JEhAnAUQTiK8FiEC/wpAY4iCEcRnotwgT8lAFIEASnCcxGO9xIIAFIEASnCg5HUyASQFEFIirDBD3GvAFCKIChF2OCH+FsEKEUQlCI8GeECf4sApQiCUoTNdc0ApQiCUoQnI1zijxmgFEFQivBkhEv8MQOUIghKER6NcIm7FcBSBGEpwrFMawBgiiAwRTie+RgBTBEEpojMphQBWIogLEW4cKY4jJQRgKUIwlKES8cdCoBSBEEpwqORVHsGWIogLEV4NMLxhgoBWIogLEW4zBARsBRBWIpwuSEiYCmCsBS5zQwRJYApksAUuc0MESWAKZLAFLnNDBElgCmSwBS5zQwRJYApksAUuc0MESWAKZLAFLnNDBElgCmSwBS5zQwRJYApksAUuc0MESWAKZLAFLnNDBEloCmS0BS5zQwRJaApktAUyUKDiM+5BjRFEpoiPRzhibOuAU2RhKZIxtNjTAloiiQ0RTKRHmNKQFMkoSmSyfQYUwKcIglOkUylx5gS8BRJeIpkabosAU6RBKdIFlpEfGY4wCmS4BTJ0i2iBDRFEpoimUu36RLQFEloigy3e+DdPRLgFElwiuTpUBsJaIokNEV6OJKoAQBTJIEpsr3nA7cFAKZIAlNkuOsDj3ElgCmSwBQZYIrE3wGAKZLAFMnTExUJYIokMEXyzERFApoiCU2RPM2WJYApksAUGW7/UPhDBjRFEpoiPRzh+Bx6CWiKJDRFejrCFYQZEuAUSXCK9HSEK3zjAcApkuAUKdLDQwloiiQ0RQaaorAfA5oiCU2RmW0pEsAUSWCKFJnhoQQwRRKYIj0bSdUA8ELCUqRHIxxvbpKApUjCUqRIT5clYCmSXhISWEqiBtA9IfSiEJlpC9FVIfSukIBS8GHqEl0XQu8LCSglVQLghYM7Q4IX4g4NXhtCvFCqjBujq0Po3SGejaS8AF0fQu8P8XAkWYnAD+kdIjLTGqJbROg1IgGm4F2CEt0kQmCKVNtMcwpoiiQ0RaqMHwKYIglMkQGm4EPqJYApksAU6eFIqksENEUSmiIDTUmUALghoSnS0xGuIROUAKdIglOkCq0hXG+QgKdIwlNk4Cl43UkCniIJT5EqrB7i8TkAKpIAFRmACl53kgCoSAJUZAtU4LqTBEBFEqAiA1DB604SABVJgIoMQAWvO0kAVCQBKjIAFbzuJAFQkQSoyABU8LqTBEBFEqAiA1DB604SABVJgIrUmTkK4CmS8BQZeIrGYyvAUyThKTLwFBjpIgFOkQSnSJ3eLioBTZGEpshAU3CciQQ0RRKaIj0cSdyEBWCKJDBFBpii8eASwBRJYIpsT/fCHxKAKZLAFBlgCn4FgKVIwlKkRyOJVwBQiiQoRXo0wvGOXQlYiiQsRXo0gq+7kwClSIJSZEAp+C4OCVCKJChFejTC8X5VCViKJCxFBpaC96tKwFIkYSnSo5FEFQCUIglKkQGlwGurJCApkpAU6cEIvkdFApAiCUiRAaTge0UkACmSgBQZQIqGsVISgBRJQIoMIAXvt5UApEgCUmQAKQb3RwCkSAJSZAApBvdHAKRIAlJkACn4xg8JQIokIEUGkGJwdwJAiiQgRQaQYuAZFBKAFElAigwgBe+3lQCkSAJSZAAp6DAXCTiKJBxFBo6Ct+tKwFEk4SjScxGON7tKAFIkASkynO4FrzOSgKNIwlFk4Ch4s6wEHEUSjiLD4V74eDEJQIokIEUGkGLwlwRAiiQgRW3TNzopwFEU4SjKY5HE1YEAoyiCUVTAKHi3rwIYRRGMogJGwbt9FcAoimAUFTAK3u2rAEZRBKOogFEs7FMVwCiKYBQVMAreLKsARlEEo6iAUfBmWQUwiiIYRQWMgjfLKoBRFMEoapvesKwARVGEoqhAUfClKApQFEUoigoUxeJ7OwFFUYSiKA9FcOimAhBFEYiiAkTB16ooAFEUgSgqQBS8UVMBiKIIRFEBouCNmgpAFEUgivJQhDv8MQOKoghFUSy9cKgARFEEoigPRfB5OApAFEUgigoQBV+togBEUQSiKJ4+6lABhqIIQ1HhlnS8T1MBiKIIRFHhpnR8OYsCFEURiqICRcG3syhAURShKCpQFLy9TAGKoghFUYGi4O1lClAURSiKCjen481dCmAURTCK8lRE4G05CmAURTCK8lhE4F01CnAURTiKCptS8JYMBTiKIhxFiYwjAoyiCEZRYVPKFn8JAKMoglFU2JWS6NgBRlEEo6hwuhc+KE8BjqIIR1HhYnW8qUQBjqIIR1GeiyTOF1MApCgCUpTnIonmCHAURTiKChwFYgwFOIoiHEWJ9Pq1AhhFEYyiwpYUfD6ZAhxFEY6iPBZJVADAKIpgFBUwCq4AgFEUwSgqc7qXAhRFEYqiPBQReFuRAhRFEYqiZPBB3JoCiqIIRVHhihS8q0cBiqIIRVEeigi8q0cBiqIIRVHt+V7wiDUFKIoiFEVlKIoCFEURiqJkaAtxcw4oiqIXsnsogtdbFLqSnd7J7qGIwNuKFLqWnd7LrtIX9Sh0Mzu9ml2lL+pR6HJ2eju7ZyICX/Ki0AXtgxvavRcy3B3BS9qJF6rMya8KXdROb2pXmZNfFbqsnd7W7pmIwNfMKHRhO72x3TMRgfcVKXRrO4EoyjMRvK9IAYaiCENR4e52fE2NAgxFEYaidPoAYgUQiiIIRYWjvRLvACAURRCK0sEPcWsIEIoiCEV5IpL4kgFBUYSgKE9EBIN7oxRAKIogFOWJiGAWrZ0qgFAUQShKBzfEjRlgKIowFOWZSKoKgBcShqLCDSn4nhwFGIoiDEUZlqlDAFEUgSjKMxGBL9pRAKIoAlFUe917wgLghwSiKA9FBL6pRwGKoghFUSbjh4CiKEJRlMn5IaAoilAUFSgKx60ZwCiKYBTlqUiqBMANCUVRxmU+BEBRFKEoygY/xM0poCiKUBSVoSgKUBRFKIoKN6Rw3JwCjKIIRlHhipSEAcALCUZRNnghbg0BRlEEo6hwtFeiUwUYRRGMosLRXokGHWAURTCKCkd74SPuFMAoimAUFY72woc9KoBRFMEoylMRgTfYKYBRFMEoylORxDQVUBRFKIryUETg65YUoCiKUBTlgh/iHgFQFEUoinIZPwQYRRGMolzmwE0FMIoiGEU5lWkLAEZRBKMoj0WEwH0S4CiKcBTl0lBZAYyiCEZRLrSGuEsCGEURjKJcrjkEGEURjKK3YY4CuyQNOIomHEVv082hBhxFE46iPRYR+BQRDTiKJhxFb5MwTwOKoglF0R6KCHzbkgYURROKorfpPlkDiKIJRNHbzBRFA4iiCUTR28wURQOIoglE0e0dKegEEA0YiiYMRXsmgrm+BgxFE4aiWfBBGHCpAUPRhKHowFDw6RMaMBRNGIpmwQlhxKYGEEUTiKJZaAthh6QBRNEEomgW3BDG2mkAUTSBKJoFN4SxdhpAFE0givZMROBQOQ0giiYQRXsoInConAYURROKoj0VEThUTgOMoglG0Z6KCHxXjwYYRROMosPJXhLGDmvAUTThKNpjEYGP+dOAo2jCUbTHIkJiTwQcRROOoj0WERJ7IuAomnAU7bGIkNgTAUfRhKNoj0UEDr3VgKNowlG0xyICRx9rwFE04Sg6cBS8mUMDjqIJR9E8zfM0wCiaYBTdnu2Fe1WAUTTBKFqEI+bgPEsDjqIJR9GBo+DbejTgKJpwFO2xSKJRBxhFE4yiPRWBh8loAFE0gSjaMxEDG3SAUDRBKNoTEYhwNAAomgAU7YEIHlMAfqIJP9Geh2jcDAF+ogk/0Z6HKHg0nAb8RBN+oj0OwZf8aIBPNMEnOmxDwXFyGvATTfiJDkd64Ug9DQCKJgBFeyCC7zPQAKBoAlC05yF4B4YG/EQTfqIDP8EDCoBPNMEn2tMQndAPHJDQE+1hiMJtMIAnmsATHS6YTwypADzRBJ7o3IFeGtATTeiJDvQkMaQC9EQTeqI9DcEMUAN6ogk90YGeKLjOogE90YSeaE9DMH/SgJ5oQk+0pyEa1yCgJ5rQE+1hiMGtCIAnmsAT7VmIwWMZwE40YSfaoxCDXQigE03QifYkxCTKD1yQkBPtQYjBDgTAiSbgRAdwgq970wCcaAJOdNh9goN1NSAnmpAT7UGIwR4EwIkm4ER7EIJDdTUAJ5qAEx32nuBgYQ3AiSbgRIe9JykLgA8ScKJbcIIbckBONCEnOpCTxLwIkBNNyIkO5CQxLwLkRBNyoj0IMYkSADck4EQHcJKYVwFyogk50YGcJOZVgJxoQk50ICeJeRUgJ5qQEx3ISWJeBciJJuREB3KSmFcBcqIJOdGBnCTmVYCcaEJOdCAniXkVQCeaoBMd0EliXgXQiSboRAd0kphXAXSiCTrRAZ0k5lWAnWjCTnRgJ4l5FWAnmrAT7VGIwSUA6EQTdKI9CjHwxGEN0Ikm6ER7EmKx/YCcaEJOtCchFn9IgJxoQk502ICCtz5oQE40ISc6bEDBWx80ICeakBNtw9QYYgcNyIkm5ER7EJKYWgBwogk40TZz3LAG4EQTcKLDnSgwbl8DbqIJN9EuXAIA9QNuogk30WH3CdzIpgE20QSbaJfeBKUBNdGEmuhwIwpebAXURBNqol16X7IG0EQTaKIDNMF7wzWAJppAEx2gCd6arQE00QSa6ABN8M5oDaiJJtREB2qC95NqQE00oSY6UBO8nVIDaqIJNTGBmuDdiAZQE0OoiQmneMGvyABqYgg1MYGa4N2IBlATQ6iJ8RhEaPVCipf1yJ8IGPqhIdzEeAyCGxIDsIkh2MQEbIJ3MxrATQzhJsZjEIFv3zSAmxjCTcw2+CH8EgzgJoZwE7MNfgi/BAPAiSHgxHgQIvDtmwaQE0PIiQnkBA/wDSAnhpAT40GIMBBDG0BODCEnJpATPEs1gJwYQk5MICf49k0DyIkh5MQEcoJ3AxpATgwhJyaQk3qiCZpkA8iJIeTEBHKCt/MZQE4MIScmkBODmwNATgwhJ4alQ10NACeGgBMTwAnejWcAODEEnJgAThJ1CMCJIeDEBHCCt9MZAE4MAScmgBO8nc4AcGIIODEBnODtdAaAE0PAieHpntkAbmIINzGBm+DteAZwE0O4iQncxMKrdQzgJoZwExO4Cd6OZwA3MYSbmLD/BG/HMwCcGAJOTAAneDudAeDEEHBiAjjB2+kMACeGgBMj0ifXGMBNDOEmRqRjrg3gJoZwE+NBCF4zMgCcGAJOTNh9grfzGYBODEEnJqATvJ3PAHhiCDwx4Rgv3JgBemIIPTEivW5oAD0xhJ4YT0ME3k5oAD4xBJ8Yj0MEvvfRAH5iCD8xHockxkYAnxiCT4wMN/PglgDgE0PwiZE80xwDfmIIPzEyHflvAD8xhJ8YmWkLAT8xhJ8Yz0PwSoEB/MQQfmLC7pNUBQAnJADFyFyXDACKIQDFyOCFeFwDAIohAMWE2+XxFnsDAIohAMWE7ScOnvliAEExhKCYQFAcPOzYAIJiCEEx4RQvvF5iAEIxBKEYj0QE3tNpAEMxhKGYsAPFwSUrAyCKIRDFhB0oeE+nARTFEIpiVNiLh5tTgFEMwSgmHOOF14wM4CiGcBQTdqCk6gB4IgEpxnMRiXeVGgBSDAEpRofteLhBBSDFEJBiPBiReFeoASTFEJJiwhYUuAfGAJJiCEkxHozgLSwGgBRDQIoJl8vjGD0DQIohIMV4LiLxplIDQIohIMXo4Id4bAdAiiEgxeh0rKsBHMUQjmLCDhQc6GkASDEEpJhwiheuQeCEBKOYcLU83hJpAEYxBKOYcLd8okEGGMUQjGICRkk0yACjGIJRTMAoiQYZYBRDMIrxVETii3QNwCiGYBSTOcbLAIpiCEUxJtcvA4piCEUxJtcvA4piCEUx4RyvRHMKKIohFMUEioInWQCiGAJRjA1+iGcogKIYQlFM2ICSWLoDGMUQjGI8FpFbCJIM4CiGcBQT7pbHG1MNACmGgBTTXi6PexQAUgwBKcaqXB0ARyQgxQSQklg5AyDFEJBibHBE3JwBkmIISTEejEi8t9UAkmIISTFhC0pi7Q6gFENQinHpsxoMQCmGoBTT3i6Pe2XAUgxhKSZsQUm8RQBTDIEpxgVHxL0ioCmG0BTjgiPiXhHgFENwivF0ROKtpQbgFENwivF0RDI8xAU4xRCcYlqckqhE4IgEp5hwvzzDDRLAKYbgFNPilIQFwBEJTrHtBfNwkG0BTrEEp9htetHGApxiCU6x27BoAxs0C3CKJTjF5nCKBTjFEpxiPR6ReHOqBTzFEp5iwwXzsGe3AKdYglNs2IYCJwkW0BRLaIoNR3nBCA8LYIolMMWGk7xgfIYFLMUSlmLDfSgwQMQClGIJSrHhIC84VbWApFhCUmy4Wx7rByDFEpBiwzFeeG+wBSDFEpBiPReReGuuBSDFEpBi26vlYWNqAUixBKTYcLc83tlqAUixBKRYz0Uk3plqAUixBKRYz0UkvhjdApBiCUix4SAvfCWNBSTFEpJiWThPDo6tLCAplpAU68GIxFfSWEBSLCEp1oMRia+ksYCkWEJSrAcjEh84bQFJsYSkWA9GpMCeCEiKJSTFejIi8Z48C1CKJSjFejKCw88tICmWkBQbLpcX2JMBSbGEpNhwuzyOfraApFhCUmzYgYIDJy0gKZaQFOvBiMSBkxaQFEtIihXBEbEnA5JiCUmxnoxIHPhoAUqxBKXYgFJw4KMFLMUSlmI9G5ESt6kAplgCU6xnI1LiXgHAFEtgivVsROLARwtgiiUwxYajvHDgowU0xRKaYj0dkTjw0QKcYglOsZ6OSBz4aAFOsQSnWE9HJL7gyQKcYglOseE0L4mHh4CnWMJTrMcjEgc+WsBTLOEp1uMRiTeUWcBTLOEpNvAUvCHMAqBiCVCxHpBIvCHMAqJiCVGx4Yp5vCHMAqRiCVKxnpBIvJ/CAqRiCVKx4Y55HI9vAVKxBKlYT0gkDn60AKlYglSsJyQSx75ZgFQsQSrWExKpcJsIkIolSMV6QiI19kSAVCxBKjYc6YXPBrQAqViCVGw40wvvq7EAqViCVKwnJBLvbrMAqViCVKwnJFLjNhEgFUuQig1IReM2ESAVS5CK9YRE4u1ZFiAVS5CK9YREJgYYAKlYglRsQCoa984AqViCVGxAKhp7IkAqliAVG5AKjj2zAKlYglSsRyTS4DYRMBVLmIr1jEQa3CYCqGIJVLGekUiD20QAVSyBKjZAFRx7ZgFUsQSq2ABVcOyZBVDFEqhiPSSR+Ch5C6iKJVTFekgiceyZBVTFEqpiPSaR+Ch4C7iKJVzFBq6CY8cs4CqWcBUbrprHpzdbwFUs4SrWYxKJY8cs4CqWcBUbbkfBZMcCrmIJV7FhewomOxZwFUu4ig3bUzDZsQCsWAJWrAl4D7dIAKxYAlasSR+BbQFXsYSrWI9JJI6/s4CrWMJVrOckEsffWQBWLAErNoAVHD9nAVixBKxYm76lxwKuYglXsYGr4OPwLeAqlnAVa9NRNxZgFUuwig1YBcfvWYBVLMEq1lMSieP3LMAqlmAV6ymJxPF7FmAVS7CK9ZRE4vg9C7CKJVjFBqyC498swCqWYBXrKYl0eIgGsIolWMV6TCJx/JkFXMUSrmLD0V44jtMCrmIJV7EekzABIakFXMUSrmIDV8ERcBZwFUu4inUyVwTgiYSrWI9JkkUAnki4ig1cBcfQWcBVLOEq1mOSlB8ArmIJV7GBq+AIMAu4iiVcxbrgifhzBlzFEq7itmnA5wBWcQSrOI9JJD6T3wGu4ghXcYGr4PgtB7iKI1zFbYMjwubAAa7iCFdxgavg+C0HuIojXMWFfSrQkR3gKo5wFRe4Ch5bOABWHAErLhzvhY/Jc4CsOEJWnCclCkegOYBWHEErLpzvtYVzTgfYiiNsxbGMHwK24ghbcSzdMTvAVhxhK86jEoXjzxxgK46wFedRicIXADrAVhxhK86jkpQXALbiCFtxHpUoHP/lAFtxhK04j0oUjv9ygK04wlacRyUKx085wFYcYSsus0nFAbTiCFpxLLghbkwAWnEErbiAVjAdcgCtOIJWXEArmA45gFYcQSsuoBVMhxxAK46gFdeiFdgpOYBWHEErrkUr+FsGaMURtOJ4OgLMAbTiCFpxAa3gJTQH0IojaMUFtIKX0BxAK46gFRfQCl5CcwCtOIJWXEAreAnNAbTiCFpxAa3gJTQH0IojaMUFtIKX0BxAK46gFRfQCl5CcwCtOIJWnAgtIu6YAVpxBK04kd4h4ABZcYSsOBEaRNyxA7LiCFlxHpQoHMTmAFlxhKw4D0oUw34EyIojZMVlrklxAKw4AlZcACsYMjoAVhwBKy6AFcwIHQArjoAVF8AKZoQOgBVHwIoLYAUzQgfAiiNgxQWwghmhA2DFEbDiAljBgM0BsOIIWHEBrGDA5gBYcQSsuABWMGBzAKw4AlZcC1YSlQgckYAVl7kpxQGu4ghXcR6TKBzK6ABXcYSrOI9JFI4kdICrOMJVnMckCgcCOsBVHOEqzmMSheN3HOAqjnAV5zGJYtgNAFdxhKu4zIXzDmAVR7CK85RE4UBCB7CKI1jFqdAg4tYAYBVHsIpToUHETTLAKo5gFRd2quAoOgewiiNYxYUL5/HBhQ5gFUewitPhVHbcKQCs4ghWcZ6SKBzH5wBWcQSrOE9JFI4DcwCrOIJVnBaZbglgFUewivOUROFAMgewiiNYxelMcLYDWMURrOI8JVE4Es0BrOIIVnGekigcieYAVnEEqzid80SAVRzBKs5TEoVD2RzAKo5gFWeCJ+LPGWAVR7CKM8ET8QgNYBVHsIozwRPx5wywiiNYxXlKovDx+g5gFUewivOUROHj8R3AKo5gFWdyngiwiiNYxXlKovDx+A5gFUewivOYROFYOAe4iiNcxZmcJwKu4ghXcSaczo4/JsBVHOEqLtyYkrAAcBVHuIrznEThaDoHwIojYMXZXOcMwIojYMXZXOcMyIojZMXZ4In4cwZkxRGy4jwoUQJ/zoCsOEJWnA2eiD9nQFYcISvOZvYJOEBWHCErLpAVvG3IAbLiCFlxHpQkRjgArDgCVly4MkXgBgmAFUfAivOcREncIAGw4ghYcZ6TKIkbJABWHAErznMShSMSHQArjoAV5zmJkrg9AWDFEbDiPCdREjcHAKw4Alac5yRK4q8ZgBVHwIoLG1bwnSUOgBVHwIrznEQlZlwArDgCVpwL52PjjxGAFUfACtt6UqLwYY7t076I+MdORvBG+D21TwcyGJWROeihfTqQwakM75N4+tg+HcgQVEY4DQx+GO3TgQxJZXjPxDGS7dOBDEVl6GxZht4Z/9jJMNl3O3TQ+MdOhs2+26GPxj92Mlz23Q7dNP6xlcHCSSSwuWifUhmM+ilLb65qHw5EUDcNAAYHn7ZPBzKom4b9LXhbQvt0IIO6KQtuCtuu9ulABnVTD1bw3cDtw4EI6qWBxeBI2PbpQAb1Uk9XOIMRQ+3TgQzqpeHCFbyDtH06kEG9NFAZHJTbPh3IoF7Kg5fCsU37lMrg1Es9alH4WMr26UAGdVNPWxQ+mbJ9OpBB3ZRnYsnapwMZ1E09c1H4gMv26UAGddMMp2kfDkRQN/XkReFjMtunAxnUTT18UfikzPbpQAZ1U89f0lWK3JRTN/UIRmFi0j4dyKBu6imMwtCkfUplCOqmHsQofOxl+3Qgg7ppuJoFRx+3TwcyqJsGfoMDkNunAxnUTUVw00QnByBO/GMnI+emAOPEP3YivJviSOb26UAGddPAcnAwc/t0IIO6aQbntA8HIqiXhotbcEh0+3Qgg3ppOHwMxyq0T6kMSb3UYxqFI6vbpwMZ1EvDFS44aqR9OpBBvbS9xiXhYQDvxD92MryX4iDv9ulABvVSj2wUjvNunw5kUDcNV7rgUO/26UAGdVMZ3DTR2QLUE//Yyci2pgD3xD92MoKfJjpsQHziH1sZgfmkWmQAfeIfOxks1yID7hP/2MnItqYA/cQ/djKyrSmgP/GPnYw0/2kfDkRQNw0ICIfit08HMqibBgqEg+nbpwMZ1E0DCMKx4O3TgQzqph7tKBwO3j4dyKBu6umOwhHh7dOBDOqmgQjhoO72KZWhqZvq3AwKQKH4x06E91Ic2t0+HcigXhrIEI7ubp8OZFAvDXtuUrMwQIfiHzsZuT4f8KH4x05E8NJEQwgQUfxjJyOzC6x9OpBBvVRnNoK1TwcyqJfqzF6w9ulABvVSk9kO1j6lMgz1UpPzUgCM4h87EcFLE/0CYEbxj52M4KWJRgxgo/jHToa/qANvKWqfDmRQL80cddY+HIigXhroET5Kt306kEG91ISTBBIeBghS/GMnIzcyBQwp/rET4ZtSvKmhfTqQQZ3UhiiPhKMDkhT/2MnwPT7emdA+HcigXhpwEt4a0D4dyKBeGogSXoNunw5kUC8NUAlvEGifDmRQL/WYiOH7UNqnAxnUTQNacolRFGBL8Y+dDN/l460C7dOBDOqmnhcpvFugfTqQQf00XC+TrA/kp5b6aeBMqfoAoCn+sZMR/DTREgLWFP/YyQh+mmgJAW6Kf+xkNE6ncfB/+3Qgg/ppuHImseIJmFP8YyfCH8iCj5Btnw5kUDf1HEnjKP726UAGddOwqQcf6NE+HcigbupyrSnAT/GPnQjni5JogQCBin8MMljY3AOPtG0fEhGMEigWjk2Dp9q2DwciGBXBfUlwG8YQgGIUQLFt8FE8tmUIQDEKoJinSXqL22OGABSjAIptg5PCW4fbpwMZisoIToq/e4YAFKMAinmapHFoc/t0IMNQGY3LaRzd3D4dyLBUhm9LFR5FMQSgGAVQzNMkpvAHxxCAYhRAMY+TND4ttH06kEH9lPHcu0UEilECxZjI+RgiUIwSKMYys3yGABSjAIp5nKRxtG37dCCDuqnHSRoH3LZPBzKom3qcpHHMbft0IIO6KQtumvj0EYFilEAxj5M0PoKzfTqQQd3U4ySNg2fbp1QGJVAs7A5K9C0MEShGCRTzOEnjszjbpwMZ1E3DHiF85lT7dCCDuqnHSRqH8rZPBzKon4ZD2HAsbft0IIP6qedJGofTtk8HMqifep6kcURt+3Qgg/qp50kax8S2TwcyqJ/ydPhT+3Aggrqpx0kaB8a2T6kMSqCYx0nJlhARKEYJFBPp4/TbhwMR1EtF+kT99uFABHVSD5M0jvJtnw5kUCcVwUkTjQcCUIwCKCaCkyYaDwSgGAVQTAQnTXz4CEAxCqCYCE6a+GgRgWKUQDGPkzSO2W2fDmSEH//zxRf7w8fqdKluvzncVr9+8cd//OOLn366fHqsvnjxP1/8tA8/yu0Lr+uLP/7PF5LX//9/X3zB6imY/6Nurro/TPhD1c19+KOusvCH3IY/6tpq/qj/ag0MP3eW+WeNqT+dqv9+qs6X2IrmXvirGc3N7yWCdu/Ox/unS/Vw/NgrUnMr8LOwui0N5hk9Werx8bI/Hs494fX7vApXjk+S+bg7XPb3l8fjee8FP+5uepZzF1WD4tOE//N4fMhI1rFkUSb55qZ6vJyOtfDT7rbxpVhkExp2Feljv0plns+Px/v9zaeb4+H9/q7njZI9y2zOj/RCmk1iZbIv+4/V+fh06hdeREI7maZzCynLZN/eEk9oDml6tlW7UjGnuvyxnGZ15Lkedfs1+XWh7q9S2Q/7w7m6XPaHu76lNrbUmjJp7x+Ot30fkpEPSVb4kd41/4qLu429pvs2y2Td3x1P+8uHh1hes4oRCXSFbni/35373qxjMaywsTjs7j9d9jf9FxpXNzdtyylE23I2VzBPkn2ze9y929/XH3bVf63bSE9zLcUkqbfVx33/M2FR48Na57Olr7kvNmVyEzB/1dGExM+QXf16qQ7nupHrCXYifn22sOnsJFeHu/2hCu3R02l3IdJZ3Cwx175Ivu3+mFr39Zf1dN+vexk3pq7wg+/LOz89Ph77bbSMv7bm2o8ysXd941xc+tIv4+l2X7cfN/X/Tr1GZBu1dkIWvqdIWPolxS7Ar0OY0gahUVEdgL1RuyBEYUMVCeNJg/m21y9NtzNdFSL2JtO6qdgWdnWNirrTf3y69M218ZsrbBeeZaWttS5+cbx7cZOt7Tc1PKqDZldmsbDhAIJvZewEE95UkJUu+jYaqrJQp82LmmwtKTqLi176pi7H2s66Fex317EnlZp1Ob6vfzwPBhA89iDTllZOEHtXHftDMBEPwUod5nI8VHfHy37wOpptNM8V50pbusvxfNmdSLXFbaYubHiffq37zN3pU8+m+OvwbH2SqCbZ7nDb84+GxD9PBlg7kbPdC/HwvUTJu93Nz3f19OBwe3O8P/aazSb4KrJaiE60KrO/EX2/v/tQtxoPj3V3P2w8Y8cUsm3thW0VSVX28qCeZikxHvZGTiYKW6V3+0v9tfdnIdF77ObMrLNXiLKvtJV7v3/Y9/2t952qtg0VhZ/Wu+Ptp76DRA1y2VjkXeMGtb8d37+vpyA9YfE8UZaWsxVHlyu4YrGwsnGXF9Yfose9erNiUiTm1DjKgUzfuIiacGFl539lI4Wb3f1944P9xZCojJqXCnroy4h6LF1Y6clRe9Qqmm7K9jydaSc4ZtuW3ciy1xKrg4N6GTeitnD0AqXy/iTExa38RGM/3dTfXz0P7X0wMl5eaY5dLBM5FCTisbYRZTPFm3d3u32/dRQqdsqup+WFVUhbc90bprBttzLBWLdiyEpdrBENltV0PDTwa6nF0uo2Gw2u45mm6NZSpCqsUS+YLqI169KxkWXjwKZnqc0LzjO2uhi3lbqw6e0pqIdwl/3h6diMvqCK5treZw8rHBz2VJyq+12z0JYsg4ibnsLPq1bQLIzVwmiTz2zUlHFT1qMNlxZZ7BDMtW2Vdbz7o/RtRkP5fkfA4umc7JpH1n58Wpa6XqyAdKXbeNAjyoZSPYGX48/Vod/gxItIqmvCi7+TwYRBRyaadlimVakXHOqR9OECRk8stlOwCfJOTzcXMjiNHFRdF7raFqIbkeltZ7wodrnoy+sDCRd/1a1GbYrrOP9Fi3i2r7fFVdNKbaHEx+r+eFN/3QAdxMSDl42rn8U3WCIpW2y3sezSVv9Qu0cfIPG4TxdWd819YQt6Gnag8YzfbrsOtOyTuyXO22x3imZDhcihkVJP3S77ByKst1Ity15II+z98fSw6zMc3TOMty7vt/aUSqX2yUjkBOMaMQM4GY1iZJlz3O4++fncefdxgEFifFH27d1W73dP95eY32UBHtPxzKmQYxIlWY7HzDZWUNYydQoi9NZ/YVH7YQt7lVZmeTPC4rUarsp624GWbGvC4s+MF64AtCoeT8f3+3vyoUU9Ge968UlV3krtz6YiNzTXwcGkWn+8/PP8WFW3/cKruPCFX8tVXvP5HfsLvixuaHjhiKCV2I0RW6+o2+vD+X6XcGkWq5lUEZ2axi3yOniso7D9DToGNc3j5RHReYZkxZYf7+7qtqm/rBG3dN3UWpY2n9XdqeqV1/bna4VSBkAw7mi6cI9utbDrEl33YNutDBTi6jwplPFo2tjSN0ZFYlgYL5Y5OcXc+pe65enD9XgNupAEBmH7Q+iRqXm9EXnXQJS6ghd87Dt/DIO611faAAd5yaWhOHjBFbc6jdBzdco5gIh7OrMtfEkfbh77K1e9aIPtdRl6W1idtbyPuve645UVWzgavt2fb+qxe3+ph9t4Fb5wdesq6d2n/khJx0tl3fqvKwzJuko9HC8tRe43eTLuXJpb0yZJBXMWHguUhWFUV4Gnqh4qfSQVsI0rgHUVUOiRneTzvoHfF7KWZOKl+0I4X4t8vN/13jiLVyBs9yEWV2YjLvkd8qgVcoUk7JaswcVRQoX1dji/Px0f6GcnbNx4F8ax1bISDaKI69+wwvrvicPry/EXaE2x3Ifd4Wl33y9wvOpROks8nH2W3uJcPOY03SJVYeji7fHSbLSIl6Xjz7bUcRspN/vHD/1AiCZyPBpTFIYrBGEp/C3jlQvLu8XkLbu206We3Kh5PP9M1st0j8Ky0tb6WRh0myYcN14GnlCt5+rm6RRWaXGN6G2vw3KFnpSUjQvAZa8AhWOWWAlF+7oXxMgKQUMQefGWUonK9bh3aRdRS/y1P7mNh2ddPLPfRhj+ajZ9FEtOr/5KEespbQGOF9H/XmX8vRZ23rWQpD8p1VvgKeTBt0+P91WvGlW8eOK6CDi/ibpMIIh9iQN0WOmH3gqq53p3ZCUxXtQtpFG3n+oc+5tTdXM83dLlIhUjKWcmSaznojc/E2nxQLmQYtTSbqmbxeM8fh3mlNVe9f5+3+uoWTxs5F2UhiokW9V99eAnRFWPPbOYiLPCD7c67N7d9wedIgY/hncTT8e6PwoL3QTLkfl2D4+2gpm5BmV04RN82/1R1sZ3qvaHSz256Q8RWDyhZYVLg9XpRNBFPGdoGzO1bWtEFbLs6mP9r/TEO+aDrtDORmI/wiJuvbtYTNNWtZ5i6Pnp3fnmtH8chg3GS6G60GV/fTyen059wBEHPgvVxWt3cQ1SFxrbiqbRQzFIcGXD6k4UXVrnccctdGfgtlQqGAvYHnfvIsC6XRLsGqjk2raBd8s8vJtMc9G93m7/ENetHN5RNd6tEokuZlp0AmW3siT5NUyhW//qGiTZbT+SXYik7Piq7KZ6svscpO4E6tYw2a2iqG75Q3VfthLXP7qNTV0p1BXhdrDYdJM2w7tfRKvdyO6XTpdxrWTbfZ622wrgujp07PqH7VryNrvrhiquM8x19riupM5eec31zW35dduIeP7r2l+r6wBIX3Poa7ooAvD5t2vea6/f7IFu/yptGDvX6zc18QjAFo5N3u9Og+g33tvh002bJCtrE97v7y//X2fXtty4jQX/ZZ+3UiJI8PItW6kUx+JYzEiilqTs8VTl3xegeKA+IOhp71McJ25RIC7n0t3QuU6G+ashyx3f+/Hy3o7d/fY6tseoOIF5mJRQG7KxLMBv3Riv3hzP75IMGL/3P6PWAbKXTCNcSrLkuMCdhksnTStd5IJYwJKV6AXx3H5E/QiLu1/DvpXBU+y66+t8QixMjDNDPpb7hS5ioXgyr2VHIjk1C9y+OMAgrbD6whMqyPgwwqob+zYGFyxs+b0Y4x3CeXEgW5IedOp/6YyvVI1tMoYXpE1GYCtFQSbL/I+K0ZSsgtpaJedkg/H7Tde1kcdCPtPo/v+YEGOQaFOQCUVAShCI8btZCXxJ+VeyCFipRqcci3LyVnLOVkUpR6dE4odDmE9k4d8/wNjqzFcpwsjJvuGBGJUpyBI/cDvta+fWzUtC8IKtWpLRD1ju12MctWODsyb1Bg4ypioZjAct+fZfuxmltxEbEGZBSfJxHOBeeoLNYuHulRKzVyRvNMIfu+nmuXaaF4cVXXKhelzcfZNkLeSCyaooSQVs/AERdI3QhUBz25SD/rQriRNMYveSlFWlsJODjq3PkmRkenA9EHqbFooFqQl1cKdhmuPKPLJXJB8oSSKBg+wXYmNErMPntKTmy2Fdu/l9GH8sRYbvbbTeaqWGlgVCluk8+HCMFjBWc8osvHn65VxndSzgqSyhZkm2zR3aMB2T7UQknTXhlcuhEzYIknOpPig1UwvUblb8tuZQowfP8cEDhSLwcOlZ4ZHTGxk2z0jelcPzdOxO13RyjHdLydtL0vrgiZnaFlEWbMlYbUHcEqwMkvAKUmTusFzkfIsOG0w4ZKvmh/A3DAeMj6QdUZI0qye6hoQXFFaBZPoVSe0D7PSEQmIGWSr2mNf2Np2G+T72egVgHCsVjZLsB2jc1M5QKtYnvc/4rtQ9mv0YyUizsqz4AVggk54yaPvCn1PTPHbtZTOeqJCTpLSkQ8InanI0cbsi29Ie82Oau8sOoRmZG1IiC/OA3wDf+mOXUkMbXBSFVHVLsqr7OszDXnEjx9puKYlNyQb0EXJyYmBTqyJjRIf72Gj1s2KlSOqgJVlYeGKmnhJ5gpZduMPbtiqTZditDLXKUJLPyBG4t2ProqPumMycM9X+liJxTvJKTsYb6CMadjrI3cCD7JsCKN4lWWXwiAkOc6bIf+ThcmrHoy849rodh2u/ImUmp3Y69dfX4Nyjk1YM92vy0D91nt6vCw1YhVvnzEH6+1I1z9mBdEsyWf0xKM20ZG05lUqgnHxdhnJUk6epoKbKLgUqV2qyMSyAewQstFapSOuPBGaahdXA+2vINOg0z7dj/xrZyBUotKpJGbKH+rR2D6uxlq1ouXuCRV+n087gFhiu1k//L3JrXj5gOV69jvyu5wJWaWsb1kZJ7gMB+rylrBeKLmhDJ4rMBk7vCSu0AgtjNUn67i9tVPjF3Kw5hCcjpRsL3rBpN1u0DGjIk2jBurX6lLO14uSQgcgC5UJIn0n82rYLcOYXJsiduVDEY8eKBGyuC9c/1D+lxVaS/ID1A/Y5B0h7JH1XVsyU4Z3J0bSJDKgjvKhzgkFqQaaAEeLTjUBDW3x1ZLy7D200NizSgjxh97FzjV0hNrtYXzfLoVIlK7KE219fzvfjM7fWLgromVPl5KO57VmDoO0FSSTvrw+nK6+KHsZIKoHJeU5OcinybaSRmIXXki7VJMFkgb1GHGZ8nyVZNnFA514fwharRA27QXhJb9TAK1VLKiN7Lh7JDf7GxK5WbqXkvqjdplA2VJEujp9IZ7Dk1ZCRn4ZLq5sUpedAdgZ3gI1+Icr/gkyY+lvipM+R6VqRatz+tqVqFMjSrJ80GnLa3bbrCuvT7Dy5vRV661DSUXac3orkSOE2JI3ZSmSHNenV5dH3WcLomNyQOgGPGLci9EgiVZVk/PWR3CrHyVyRTHUPkhxJbEgLb6wSJ+CazN09+id8a3WYkaquDeSOx6la2OzO6rB9jrj/yI2iXZDKHw/7+dvHhjSpY3CgD45TJLnDo06C0Ybk2Pfjy33e7hsG62G5nJ8F2dAEUG//1x7/vk/z8n+oAEl5q8tHkNYK/djrmBbNh/JAbST5Ef108yPrcrnr7FUtmnejmBJspOPTwujoz7D2kJEz6e9puL533zbONAUupZpM3n5047duHKYtGm5x9ZNTyYU5PzoVX5ZKupCRI3Z2S/rYJbnMjRLkSMZKqjc97tZ2r9aCHBrpNg5/u/gpfkAVinEb5bl761SEaZBanssGnAeHbCEJFzIChRHer5D0CyEkF6Rjwrn/0Z370zAc9QtUAnkyGD/3V23UV+OBwr4tB+KJPGd9ACux0yHwcMmg97ysbJetxQbQBtvtBZkdXNq/hyjIwppixh1qW5WkLdQBdgilLpLA7hHdOTPfR72X55hBl2T54NIqgVOGdDHzpIeLEpF1UXCwu+x91ETkpfhGkBVPB7wlp+EZVgrtmQw6HOC2lm5rdRaQxAYH1V/ul+v94jff7zHJwaI2q3mKO8kCbYSeICYY3J4sPT8TsPNw11m7wWKdJcXaG+iEC0yj8tGaC+ZW4HGebvex3zbQLPZCmprbpz3oJtjAnToIKvivf2unycWGx5PbmGKvTKwz1GTqB5Dbb12ge0pNHukOcUNA1uQp0s3CA7nv2L52n6hDscZVk0HmAjwuhgTb94w1FrLh7PDuky/7XLrUGOIWX9AzxyNGTT0UwpJlQQf03h/jMrlaIWTv8tId+1ZPZdzX121dwgpR+pWkSnFB1xVWVIqQi3gBSdzWgGZsJGNvwdovq2PyTKpDNog7Fjq40ZD18AU60aQ2WOjL2SkDYFvHfosBXkO20i7dNLllrNvepsIyN8lJvXRze2xnPRHR2yFnz74V6JPLEzBukQZNzkZUK/zUteNLtMMg35dk+lx0fJKhWtVIUG+DWCQjk1cHux9ToZxC+ugF6cB88dSEOKbCuViKAJEsBDrA7VGKnq2itStI/yUHGIfieNaRmdiln140YwKrr6RxmQfZ3WnQoaVml1vk+FCrOlRIgtcRM3n4ITA6RKUine1cFCS5OM/mQtvMRb1YSI24kNOgEGl5IR9R5GGuimC0CClZFqSRpADdf0/dacFmYskmZd6fqL1E8n0UkpAOmR4owW7EDdOSFm6XW/cakaEwwyNL0wvKJ2wozEjIhvYCmaRDqTuuyNUz3zVJAQkhbIx9P8/9SxuXy7CqEtRPwlo34eIesu4dPuSTwcT3w2Z39/m8eXaDRjU5WYuNmVBYgy0kLQyy5fAbEbpnYjqYNeEHGavDOnqmCKMnQnUh0xthROdSechlLedSaMqLcNGlxIp2fYxKnqcmYzP/zbaOxxjkVWTuf+2Somd8A1WQ03OLbq3d61MBNQ0iTa/ITvAKuHtC4P5SC/+0IaW3CfCd3qc6Q0jS82foUQNU1WlJEpDAL4ty32EPdxWSXLYie6ad3qGwYUI2gAErPbRopNSQRx+Axo1Wi+FwQ/aSP+s45RgJV6Q/WQy4Ujce1vtzxImyyPduyFQg/oQdDiQmzWQFcxdZ33ZilVL7/xzomBxTYFmsJhlWMWhcTy+wbV7T+877J3I4xa3kEuCEAg4vJw53lpLhlofbdKMyJE8asiN4HfqpG7vjfdOdMSiyLURYXbBPqAV6ijMqpkvscppvaSk48iHIGyQd1q4fJFIi2ANPwe34QWKVjpQKOtyEHyS2XSo57SoJLipSyrHt6qlePVlvGq7fhnY8/ug+Xrtrl3BhRMJWLY42DdlxHa7nj6m7HlenbwWM1yZWpGJU8LyltwbDl06KmofrW/9dv2Ks5vMYCdkLDNoXgNbLz5MaVtgSyPnhEVM6QJUzcUHQgpWwmCmwFVCzYJ5tkLyJWu3H3Aobxt79a+LuTMyeSG/PYdreVVjizMpYbqAgpS6zUlZvGemiEAHuOHeqrj55P9iCvGfBivLghmwdxoDpgLHSjEsu8IihE8Nr8RakhqQ27ODuZBE4IQ5ku8Z9Qn953adZVcqVgKQcJEDTE+OgJgZZ/n2gp4a4UnwEslCi4NKPqTYm9i7ptOa/wGlQkSoKB3Ub9l2XbKleEulcnQDdeUkqfSSTf4c+dt9d4BfZR1ir2BRkJh335gvcRStSI+dAfJL4yTCqpc/vzRvUnXFUpoVkV3qFT852lSKRYbPG25nuiidGVus98PaaNoygySqoB4qzbqsWNhtBLtdrb/hcGXIYDHuaL1jbjAgpHIbM/VzMqQYJyzOWrG4m4tYM2Vgm3Hwivn1WCrQlOfPWj1gqeDpMw9zchE7H1558uZ8mcbMaqlVJbtqt9XrpOeroZ5gfZGS7wrM1bqex1d4RpVH7P/1YD+aHmsjw7da3wS2KWH6E62oFCoBcNHQ7t774EJNq1UJ7Go+TvMUNNwBKEOvjCeRTPcxCR/dRacsg8ksn/BAyjBqMPJ8VDworvkkNGZ5oZwQdAmIljtxXb+4Y9c6SO0ILq0i4B1J9CqApzYFt1NFC7pEP0ATtR9lWHqQ6kx1IdcXCcRvfusSD6pRlnVD007pcL+7t5NhIt2RL+AG1bXOiPynJGEv5F6EstJQGT0nKIoUgGJ/MyISxQpWzYqVrpTFjSQ7Fk4e4HQY8Lein7r3zgr55CHVcuQ2t8qebMLk+x+Fb5GiGhw6ZSKfatDjPjXgj5Rn75hfA/SurUOFlwxoivYFW9GS8l+EWYkjRS9rCCklH0sAsSeeFFXE7VZHUKWzhKnDhZMYKrcLKQWhFbWKDkba0pm34K7k31zbhBzlPgwWfXBxekf2tHS0CbqlkiuaQ5uFl0HKEUl0vSq6nSbUsyoPKdMjOzW250XIczsd+3H6/DJNQI2wpIwwUS+Yn2w9J+q5hyMwGPPMvHR/CEBSyVtdZFabH+nth1pRiBF+yy2T+td9bxgI2mVZ7vF2aBDbpjfT9czbcj5DTWwWKrgzJBoyRky8UI2M22Jx/JUzQMSs2ZBHMIS0S+LcuvnQ7x9KPJdm8Dm6ProSeU2ysNv+6Rpwzg4QBS6ptHE7SDgxjKEt6g3qsrVkXEmIteVdIQPKxgy/Ab01CsK5p2SAcYdPGSNh4tySx0cH6+Caau/gySB7wchfu5spy3NXIIkfyUl3sFxk2z3BAmwmb1aq9I+coqZFMX9CbYx3MkroHB5VanHivDFnu/e+9jY03MlyWmWjUczKnHNtjr0dNiWTIqHTjI5FZxdFfzx0jrE9DGs17G7n1RNVfWV2vKmcFGZeM7fvaEdRNGXgb7NO9p8w6UYJsyUfq2rOfbA8fyE9ceyzu6A3ZTf0UfUf2ruoTZJzmQp6uf4s033jkyosKrD5S4CfAu6OCGujmi0+bEjKg7RRprhUuNFPfXsU065cmD4EAuH//qMXHpFG3Pi0Gw8mcnrOPe8BjO/sc9+9SvnVJ0i8QNWnljouLDP2/cDG6wUTHsnsoeSO6QTMJS9J7PPjHo4Af7QTouCac+YasyDrUhPgfQ/oicFLYF3cZXJCSunW5wNZULdzehvRoeQB7zdupvR7PsSVeoQRcwmPOSHb0uEy0lHUr7FulyGhKkteJqEmLWTz5Scb+2MVXG+Pylz5GTcp7Hmj7+ymeMvTK3Zyp2PgiS3HLNdP37b2VWISVOl8ebi8j1ZiJO6wNcoALkmIrp/5GGYU6zIK8aupxyZSOnnDBGPFhsCSdYxzmyH1XcyvEkpKNwebbX0kphUWOZkOqqT2al1L/NUe3xmN9tAl7BEn796gbQHw6K7ezk7RZB5j+zpmypye/8z0qteKeZcjaiQfp/DWX3X4JBTctIxVAw24J7gMSAtkCWS5VHcaRS9un9pI4aNDVvQ5HFymAdpC389ZgGresTKq3ObkGp5fu2u1w3tSdyBLOsJfwLfcbqL0fq8wVWd1aUI7ddw2EdFcyphSg/rqppBQY9NYkS2jBi++izbENW5H1ne1FEOr+Pm5f3kpq8UuF22zZR1rQ9s9IjL/IQ/wBeRwukQI2R/VIRRZPlnvBU0EyHh5r4MLlWXLTuHo0pBRW0qas4BpMdjTXq9L3CsrYKKxFG9aQZ14KfSezVWwzMir5FD6SKymXI5IhJvi34dy/xAODQoOajMYXdvjYX9oXXSvCvN6QhTAXefft+WGsotc5zIySdDBcmdO6lonPtM4vOb0qkrT5m3tftKH4uijYAydB9sZOQjC0IG10p27y0yZRXMxwT8mkS5gJ58CQlY3JX6e1d30G6mokfi7p7Wv+7e0ZWAUm27vT9sIqbc21PqX0PSv6xXncJI0VTcRInsQkdynp8cQ1IHXOkry5PkAmb/jAgiRJCwmAyUuE0DfFkqnslLyjSRWe1u9M8lin391Mg4JYsQyUGUCSMFOfkZoGmK2RU+rU3tz8P3+8xpYgGGiwy+nUjrdrRAoyOKNy+eYFWdeZeh8cxxFZhplaxobuS110S2jAxwv6cckp2WH0pbHsuOPMmCHL2pC6nAXS7ENiysUGWLdY2pijgNbSXzbqcOXIhrGitLfin2FFYG+FHdSQBFB3rmjCplWJP6naSzTSUFpn2KnodjX1rbG8WEowXrJnmkNL1oPxOihSSpOyDlP7AspGavJq6RXUk7/TNxkXaABTk8q8R8tGZzR47SIpmPxtX6nA06YmLxp6OKW18zxu/ehRLkSyTVbjtQ0U5lmkZ9h0/xa2gSWm1lEwupwZsnES3mnX3i4+DtLmpsrkg2VIbTGjyB/r5iSvJGA+GQS6B4HEAVKZ/sRcG/+RXaNqnX7xMUMbTifXWA1ks3+BXBWVkYANGYgka/sRROhsGA0PhM5asZnU7p1BmE7IHWwNaUHzQN1d2ViEr4Vn2JD6oC32jnpPUa5JpfAn4FFOrcSibMFh/xYl3IitldEm9/kFduy+DYPapyrlAroebmTY/tQ06SmLYTZZkfNQj41UQ6F3JVn/iiU6Ob4GSx6LcXhvKxWSkCGUR3n4CCisUmHlwduYrMsnMnC82ELe4eOfRbiA+yA/SGOmIikC/vN+DVdtx6ScDjmY85T9oa4zKtCCtpYaSnYgO3cLYKYBcSDERr8hKZMLntF4uAnJi2pIbvW2gYDX10pFPsh9xIsjk1eXSWRthAxt5K+M0KyNcKmNpFxGVnEeCLYStOZieFUEyYF451npNFVCIq6lbNGQovR58D2ey83thFs6IeYxRSCUs8tomCN38EpZT7Pv48lx0LE41hdI69MF69LPm5vaG6Va+wLYrR397/D8OKg7dA4yUTIyVpnniH2GJWSSpBuLQjNcEVlw4Zc5VxXrfKpkhtVCc2vEdq2ReZkdhFnlfgqLn9TsRFcZ4/wKa0NcG42gl2RZ/j5qixZ0T+P2kvuom3FwjMlIcTiTW1N3PS8ypQ2X3TwLO4o4u2Z1aKVWsn+Ekqz8p+Ag2AgDU0SsOSm59BSX3xmWKZ8gHnb5GwSCTWR9o9w0FrBETxdPDHZ6TN2jiaXeCryTdU8l0eaXONrIsbdgydt73trzPVqruH+wKBvCb3lQmy3ZMHngZBFFGonN5C72ADIREJYtSTbmW3ceXuIuIbbfy4OcgeQUTVjg5NixqUiC+3IdeXttzx9z/7LvOJFhE8TIcZB/5UO668twjJiuGK7nZNsKwcz+AyMHIWffN0DvIytxuIjPclJGuHxEipuIJ2RDNp8XsD3Ct7JaIePkGNDoIUVncJIi80BMM9SUPwapC1jwtvxjgxtF/lQNfmEcH6D7r11tRXkQW5Fb284npEVXSq1Hnvq//QT9LtF3gb0Zau8jtg0PxY1eNzbJKJqvbBqPT0uOksG2V0GWJAE0UrLiBUTPdrekXeR5+tZ377FfeKZ8u8iG93urgzjUhpAdvfdTP3ff2nOcJRilrw3mzRKDFWSZHeGjm4IxrilIOse7ezHHD/dX/ctGGWNUA01ESbn4JBclF8/GHxE/NZYVSBHP5jYQdaPz8xL29QcxVsxJ6dK7Qx3e1VMiVyaXW9gLsvvw7jK9+9R+86zFZ7X/4o7/1258OpMmGI1INa1IS1n3affz+TY44CQkGiWSLOL3adumSGKjoyPZS1H3bOn7pUL2KwUP4XSZUOcQ+q2Vd1LJzVlZYGO4v+dShp9/2EOTyBeQ3ie5V0MKEH96Nw09VfEFSIWuCowR2QQr2RkqUcpX0mSt5a8aEU43Eg81kgk2sl6bQE0Qf/SG7AH89Lep6cRA3TFKChd+JiR3GNVKRcCQRFUVzdfKlSVoKqRmJm2PXDoVtgwBf7i7Ldynl5HNlo/EN8LshBTjKJl8qXQDGam1/9WNw35zGO0ga1GGNGTHL3ZYzbApbsS01splSVbG0woHrJQSREUeFP4TUy5YaBskBVlDhuoec88CC6UtzNz789//uvU370vt/uY/f/7zz/8AtFUy7Jg2BAA="; \ No newline at end of file diff --git a/docs/classes/Device.html b/docs/classes/Device.html index 9c4390a7..fe77c7dc 100644 --- a/docs/classes/Device.html +++ b/docs/classes/Device.html @@ -1,5 +1,5 @@ Device | onvif

    Class Device

    Device methods

    -

    Constructors

    Constructors

    Properties

    Accessors

    Constructors

    Properties

    media2Support: boolean = false

    Accessors

    • get DNS(): undefined | NTPInformation
    • Returns undefined | NTPInformation

    • get NTP(): undefined | NTPInformation
    • Returns undefined | NTPInformation

    Methods

    Constructors

    Properties

    media2Support: boolean = false

    Accessors

    Methods

    • This operation gets the DNS settings from a device. The device shall return its DNS configurations through the +

      Parameters

      Returns Promise<GetCapabilitiesResponse>

    • This operation gets the DNS settings from a device. The device shall return its DNS configurations through the GetDNS command.

      -

      Returns Promise<DNSInformation>

    • This operation gets the NTP settings from a device. If the device supports NTP, it shall be possible to get the +

      Returns Promise<DNSInformation>

    • This operation gets the NTP settings from a device. If the device supports NTP, it shall be possible to get the NTP server settings through the GetNTP command.

      -

      Returns Promise<NTPInformation>

    • This operation gets the network interface configuration from a device. The device shall support return of network +

      Returns Promise<NTPInformation>

    • This operation gets the network interface configuration from a device. The device shall support return of network interface configuration settings as defined by the NetworkInterface type through the GetNetworkInterfaces command.

      -

      Returns Promise<NetworkInterface[]>

    • Returns information about services of the device.

      -

      Parameters

      • __namedParameters: GetServices = ...

      Returns Promise<GetServicesResponse>

    • Returns Promise<Date>

    • Set the NTP settings on a device

      -

      Parameters

      • options: SetNTP

      Returns Promise<NTPInformation>

    • Receive the scope parameters of a device

      +

      Returns Promise<Scope[]>

    • Returns Promise<Date>

    • Set the scope parameters of a device

      Parameters

      • scopes: string[]

        Array of scope's uris

        -

      Returns Promise<Scope[]>

    • This operation reboots the device

      -

      Returns Promise<string>

    \ No newline at end of file +

    Returns Promise<Scope[]>

    • This operation reboots the device

      +

      Returns Promise<string>

    \ No newline at end of file diff --git a/docs/classes/DiscoverySingleton.html b/docs/classes/DiscoverySingleton.html index 07d8b72c..77a220e2 100644 --- a/docs/classes/DiscoverySingleton.html +++ b/docs/classes/DiscoverySingleton.html @@ -1,297 +1,25 @@ DiscoverySingleton | onvif

    Class DiscoverySingleton

    Class for Discovery singleton

    -

    Hierarchy

    • EventEmitter
      • DiscoverySingleton

    Properties

    Accessors

    Methods

    Hierarchy

    • EventEmitter
      • DiscoverySingleton

    Accessors

    Methods

    Events

    Properties

    captureRejectionSymbol: typeof captureRejectionSymbol

    Value: Symbol.for('nodejs.rejection')

    -

    See how to write a custom rejection handler.

    -

    v13.4.0, v12.16.0

    -
    captureRejections: boolean

    Value: boolean

    -

    Change the default captureRejections option on all new EventEmitter objects.

    -

    v13.4.0, v12.16.0

    -
    defaultMaxListeners: number

    By default, a maximum of 10 listeners can be registered for any single -event. This limit can be changed for individual EventEmitter instances -using the emitter.setMaxListeners(n) method. To change the default -for allEventEmitter instances, the events.defaultMaxListeners property -can be used. If this value is not a positive number, a RangeError is thrown.

    -

    Take caution when setting the events.defaultMaxListeners because the -change affects all EventEmitter instances, including those created before -the change is made. However, calling emitter.setMaxListeners(n) still has -precedence over events.defaultMaxListeners.

    -

    This is not a hard limit. The EventEmitter instance will allow -more listeners to be added but will output a trace warning to stderr indicating -that a "possible EventEmitter memory leak" has been detected. For any single -EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to -temporarily avoid this warning:

    -
    import { EventEmitter } from 'node:events';
    const emitter = new EventEmitter();
    emitter.setMaxListeners(emitter.getMaxListeners() + 1);
    emitter.once('event', () => {
    // do stuff
    emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
    }); +

    Accessors

    Methods

    • Discover NVT devices in the subnetwork

      +

      Parameters

      Returns Promise<(Onvif | Record<string, unknown>)[]>

      import { Discovery } from 'onvif';
      Discovery.on('device', async (cam) => {
      // function would be called as soon as NVT responses
      cam.username = <USERNAME>;
      cam.password = <PASSWORD>;
      await cam.connect();
      })
      Discovery.probe();
      -

      The --trace-warnings command-line flag can be used to display the -stack trace for such warnings.

      -

      The emitted warning can be inspected with process.on('warning') and will -have the additional emitter, type, and count properties, referring to -the event emitter instance, the event's name and the number of attached -listeners, respectively. -Its name property is set to 'MaxListenersExceededWarning'.

      -

      v0.11.2

      -
    errorMonitor: typeof errorMonitor

    This symbol shall be used to install a listener for only monitoring 'error' events. Listeners installed using this symbol are called before the regular 'error' listeners are called.

    -

    Installing a listener using this symbol does not change the behavior once an 'error' event is emitted. Therefore, the process will still crash if no -regular 'error' listener is installed.

    -

    v13.6.0, v12.17.0

    -

    Accessors

    Methods

    • Type Parameters

      • K

      Parameters

      • error: Error
      • event: string | symbol
      • Rest...args: AnyRest

      Returns void

    • Alias for emitter.on(eventName, listener).

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.26

      -
    • Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments -to each.

      -

      Returns true if the event had listeners, false otherwise.

      -
      import { EventEmitter } from 'node:events';
      const myEmitter = new EventEmitter();

      // First listener
      myEmitter.on('event', function firstListener() {
      console.log('Helloooo! first listener');
      });
      // Second listener
      myEmitter.on('event', function secondListener(arg1, arg2) {
      console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
      });
      // Third listener
      myEmitter.on('event', function thirdListener(...args) {
      const parameters = args.join(', ');
      console.log(`event with parameters ${parameters} in third listener`);
      });

      console.log(myEmitter.listeners('event'));

      myEmitter.emit('event', 1, 2, 3, 4, 5);

      // Prints:
      // [
      // [Function: firstListener],
      // [Function: secondListener],
      // [Function: thirdListener]
      // ]
      // Helloooo! first listener
      // event with parameters 1, 2 in second listener
      // event with parameters 1, 2, 3, 4, 5 in third listener +
      import { Discovery } from 'onvif';
      (async () => {
      const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect());
      console.log(await cams[0]?.getSystemDateAndTime());
      })();
      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • Rest...args: AnyRest

      Returns boolean

      v0.1.26

      -
    • Returns an array listing the events for which the emitter has registered -listeners. The values in the array are strings or Symbols.

      -
      import { EventEmitter } from 'node:events';

      const myEE = new EventEmitter();
      myEE.on('foo', () => {});
      myEE.on('bar', () => {});

      const sym = Symbol('symbol');
      myEE.on(sym, () => {});

      console.log(myEE.eventNames());
      // Prints: [ 'foo', 'bar', Symbol(symbol) ] -
      - -

      Returns (string | symbol)[]

      v6.0.0

      -
    • Returns the current max listener value for the EventEmitter which is either -set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

      -

      Returns number

      v1.0.0

      -
    • Returns the number of listeners listening for the event named eventName. -If listener is provided, it will return how many times the listener is found -in the list of the listeners of the event.

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event being listened for

        -
      • Optionallistener: Function

        The event handler function

        -

      Returns number

      v3.2.0

      -
    • Returns a copy of the array of listeners for the event named eventName.

      -
      server.on('connection', (stream) => {
      console.log('someone connected!');
      });
      console.log(util.inspect(server.listeners('connection')));
      // Prints: [ [Function] ] -
      - -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      v0.1.26

      -
    • Alias for emitter.removeListener().

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v10.0.0

      -
    • Adds the listener function to the end of the listeners array for the event -named eventName. No checks are made to see if the listener has already -been added. Multiple calls passing the same combination of eventName and -listener will result in the listener being added, and called, multiple times.

      -
      server.on('connection', (stream) => {
      console.log('someone connected!');
      }); -
      - -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the -event listener to the beginning of the listeners array.

      -
      import { EventEmitter } from 'node:events';
      const myEE = new EventEmitter();
      myEE.on('foo', () => console.log('a'));
      myEE.prependListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a -
      - -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args: any[]) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.101

      -
    • Adds a one-time listener function for the event named eventName. The -next time eventName is triggered, this listener is removed and then invoked.

      -
      server.once('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); -
      - -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener() method can be used as an alternative to add the -event listener to the beginning of the listeners array.

      -
      import { EventEmitter } from 'node:events';
      const myEE = new EventEmitter();
      myEE.once('foo', () => console.log('a'));
      myEE.prependOnceListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a -
      - -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args: any[]) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.3.0

      -
    • Adds the listener function to the beginning of the listeners array for the -event named eventName. No checks are made to see if the listener has -already been added. Multiple calls passing the same combination of eventName -and listener will result in the listener being added, and called, multiple times.

      -
      server.prependListener('connection', (stream) => {
      console.log('someone connected!');
      }); -
      - -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args: any[]) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v6.0.0

      -
    • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this -listener is removed, and then invoked.

      -
      server.prependOnceListener('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); -
      - -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args: any[]) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v6.0.0

      -
    • Discover NVT devices in the subnetwork

      -

      Parameters

      Returns Promise<(Onvif | Record<string, unknown>)[]>

      import { Discovery } from 'onvif';
      Discovery.on('device', async (cam) => {
      // function would be called as soon as NVT responses
      cam.username = <USERNAME>;
      cam.password = <PASSWORD>;
      await cam.connect();
      })
      Discovery.probe(); -
      - -
      import { Discovery } from 'onvif';
      (async () => {
      const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect());
      console.log(await cams[0]?.getSystemDateAndTime());
      })(); -
      - -
    • Returns a copy of the array of listeners for the event named eventName, -including any wrappers (such as those created by .once()).

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.once('log', () => console.log('log once'));

      // Returns a new Array with a function `onceWrapper` which has a property
      // `listener` which contains the original listener bound above
      const listeners = emitter.rawListeners('log');
      const logFnWrapper = listeners[0];

      // Logs "log once" to the console and does not unbind the `once` event
      logFnWrapper.listener();

      // Logs "log once" to the console and removes the listener
      logFnWrapper();

      emitter.on('log', () => console.log('log persistently'));
      // Will return a new Array with a single function bound by `.on()` above
      const newListeners = emitter.rawListeners('log');

      // Logs "log persistently" twice
      newListeners[0]();
      emitter.emit('log'); -
      - -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      v9.4.0

      -
    • Removes all listeners, or those of the specified eventName.

      -

      It is bad practice to remove listeners added elsewhere in the code, -particularly when the EventEmitter instance was created by some other -component or module (e.g. sockets or file streams).

      -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Parameters

      • OptionaleventName: string | symbol

      Returns this

      v0.1.26

      -
    • Removes the specified listener from the listener array for the event named eventName.

      -
      const callback = (stream) => {
      console.log('someone connected!');
      };
      server.on('connection', callback);
      // ...
      server.removeListener('connection', callback); -
      - -

      removeListener() will remove, at most, one instance of a listener from the -listener array. If any single listener has been added multiple times to the -listener array for the specified eventName, then removeListener() must be -called multiple times to remove each instance.

      -

      Once an event is emitted, all listeners attached to it at the -time of emitting are called in order. This implies that any removeListener() or removeAllListeners() calls after emitting and before the last listener finishes execution -will not remove them fromemit() in progress. Subsequent events behave as expected.

      -
      import { EventEmitter } from 'node:events';
      class MyEmitter extends EventEmitter {}
      const myEmitter = new MyEmitter();

      const callbackA = () => {
      console.log('A');
      myEmitter.removeListener('event', callbackB);
      };

      const callbackB = () => {
      console.log('B');
      };

      myEmitter.on('event', callbackA);

      myEmitter.on('event', callbackB);

      // callbackA removes listener callbackB but it will still be called.
      // Internal listener array at time of emit [callbackA, callbackB]
      myEmitter.emit('event');
      // Prints:
      // A
      // B

      // callbackB is now removed.
      // Internal listener array [callbackA]
      myEmitter.emit('event');
      // Prints:
      // A -
      - -

      Because listeners are managed using an internal array, calling this will -change the position indices of any listener registered after the listener -being removed. This will not impact the order in which listeners are called, -but it means that any copies of the listener array as returned by -the emitter.listeners() method will need to be recreated.

      -

      When a single function has been added as a handler multiple times for a single -event (as in the example below), removeListener() will remove the most -recently added instance. In the example the once('ping') listener is removed:

      -
      import { EventEmitter } from 'node:events';
      const ee = new EventEmitter();

      function pong() {
      console.log('pong');
      }

      ee.on('ping', pong);
      ee.once('ping', pong);
      ee.removeListener('ping', pong);

      ee.emit('ping');
      ee.emit('ping'); -
      - -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.26

      -
    • By default EventEmitters will print a warning if more than 10 listeners are -added for a particular event. This is a useful default that helps finding -memory leaks. The emitter.setMaxListeners() method allows the limit to be -modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.

      -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Parameters

      • n: number

      Returns this

      v0.3.5

      -
    • Experimental

      Listens once to the abort event on the provided signal.

      -

      Listening to the abort event on abort signals is unsafe and may -lead to resource leaks since another third party with the signal can -call e.stopImmediatePropagation(). Unfortunately Node.js cannot change -this since it would violate the web standard. Additionally, the original -API makes it easy to forget to remove listeners.

      -

      This API allows safely using AbortSignals in Node.js APIs by solving these -two issues by listening to the event such that stopImmediatePropagation does -not prevent the listener from running.

      -

      Returns a disposable so that it may be unsubscribed from more easily.

      -
      import { addAbortListener } from 'node:events';

      function example(signal) {
      let disposable;
      try {
      signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
      disposable = addAbortListener(signal, (e) => {
      // Do something when signal is aborted.
      });
      } finally {
      disposable?.[Symbol.dispose]();
      }
      } -
      - -

      Parameters

      • signal: AbortSignal
      • resource: ((event: Event) => void)
          • (event): void
          • Parameters

            • event: Event

            Returns void

      Returns Disposable

      Disposable that removes the abort listener.

      -

      v20.5.0

      -
    • Returns a copy of the array of listeners for the event named eventName.

      -

      For EventEmitters this behaves exactly the same as calling .listeners on -the emitter.

      -

      For EventTargets this is the only way to get the event listeners for the -event target. This is useful for debugging and diagnostic purposes.

      -
      import { getEventListeners, EventEmitter } from 'node:events';

      {
      const ee = new EventEmitter();
      const listener = () => console.log('Events are fun');
      ee.on('foo', listener);
      console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
      }
      {
      const et = new EventTarget();
      const listener = () => console.log('Events are fun');
      et.addEventListener('foo', listener);
      console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
      } -
      - -

      Parameters

      • emitter: EventEmitter<DefaultEventMap> | EventTarget
      • name: string | symbol

      Returns Function[]

      v15.2.0, v14.17.0

      -
    • Returns the currently set max amount of listeners.

      -

      For EventEmitters this behaves exactly the same as calling .getMaxListeners on -the emitter.

      -

      For EventTargets this is the only way to get the max event listeners for the -event target. If the number of event handlers on a single EventTarget exceeds -the max set, the EventTarget will print a warning.

      -
      import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

      {
      const ee = new EventEmitter();
      console.log(getMaxListeners(ee)); // 10
      setMaxListeners(11, ee);
      console.log(getMaxListeners(ee)); // 11
      }
      {
      const et = new EventTarget();
      console.log(getMaxListeners(et)); // 10
      setMaxListeners(11, et);
      console.log(getMaxListeners(et)); // 11
      } -
      - -

      Parameters

      • emitter: EventEmitter<DefaultEventMap> | EventTarget

      Returns number

      v19.9.0

      -
    • A class method that returns the number of listeners for the given eventName registered on the given emitter.

      -
      import { EventEmitter, listenerCount } from 'node:events';

      const myEmitter = new EventEmitter();
      myEmitter.on('event', () => {});
      myEmitter.on('event', () => {});
      console.log(listenerCount(myEmitter, 'event'));
      // Prints: 2 -
      - -

      Parameters

      • emitter: EventEmitter<DefaultEventMap>

        The emitter to query

        -
      • eventName: string | symbol

        The event name

        -

      Returns number

      v0.9.12

      -

      Since v3.2.0 - Use listenerCount instead.

      -
    • import { on, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      });

      for await (const event of on(ee, 'foo')) {
      // The execution of this inner block is synchronous and it
      // processes one event at a time (even with await). Do not use
      // if concurrent execution is required.
      console.log(event); // prints ['bar'] [42]
      }
      // Unreachable here -
      - -

      Returns an AsyncIterator that iterates eventName events. It will throw -if the EventEmitter emits 'error'. It removes all listeners when -exiting the loop. The value returned by each iteration is an array -composed of the emitted event arguments.

      -

      An AbortSignal can be used to cancel waiting on events:

      -
      import { on, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ac = new AbortController();

      (async () => {
      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      });

      for await (const event of on(ee, 'foo', { signal: ac.signal })) {
      // The execution of this inner block is synchronous and it
      // processes one event at a time (even with await). Do not use
      // if concurrent execution is required.
      console.log(event); // prints ['bar'] [42]
      }
      // Unreachable here
      })();

      process.nextTick(() => ac.abort()); -
      - -

      Use the close option to specify an array of event names that will end the iteration:

      -
      import { on, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      ee.emit('close');
      });

      for await (const event of on(ee, 'foo', { close: ['close'] })) {
      console.log(event); // prints ['bar'] [42]
      }
      // the loop will exit after 'close' is emitted
      console.log('done'); // prints 'done' -
      - -

      Parameters

      • emitter: EventEmitter<DefaultEventMap>
      • eventName: string | symbol
      • Optionaloptions: StaticEventEmitterIteratorOptions

      Returns AsyncIterableIterator<any[]>

      An AsyncIterator that iterates eventName events emitted by the emitter

      -

      v13.6.0, v12.16.0

      -
    • Parameters

      • emitter: EventTarget
      • eventName: string
      • Optionaloptions: StaticEventEmitterIteratorOptions

      Returns AsyncIterableIterator<any[]>

    • Creates a Promise that is fulfilled when the EventEmitter emits the given -event or that is rejected if the EventEmitter emits 'error' while waiting. -The Promise will resolve with an array of all the arguments emitted to the -given event.

      -

      This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event -semantics and does not listen to the 'error' event.

      -
      import { once, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ee = new EventEmitter();

      process.nextTick(() => {
      ee.emit('myevent', 42);
      });

      const [value] = await once(ee, 'myevent');
      console.log(value);

      const err = new Error('kaboom');
      process.nextTick(() => {
      ee.emit('error', err);
      });

      try {
      await once(ee, 'myevent');
      } catch (err) {
      console.error('error happened', err);
      } -
      - -

      The special handling of the 'error' event is only used when events.once() is used to wait for another event. If events.once() is used to wait for the -'error' event itself, then it is treated as any other kind of event without -special handling:

      -
      import { EventEmitter, once } from 'node:events';

      const ee = new EventEmitter();

      once(ee, 'error')
      .then(([err]) => console.log('ok', err.message))
      .catch((err) => console.error('error', err.message));

      ee.emit('error', new Error('boom'));

      // Prints: ok boom -
      - -

      An AbortSignal can be used to cancel waiting for the event:

      -
      import { EventEmitter, once } from 'node:events';

      const ee = new EventEmitter();
      const ac = new AbortController();

      async function foo(emitter, event, signal) {
      try {
      await once(emitter, event, { signal });
      console.log('event emitted!');
      } catch (error) {
      if (error.name === 'AbortError') {
      console.error('Waiting for the event was canceled!');
      } else {
      console.error('There was an error', error.message);
      }
      }
      }

      foo(ee, 'foo', ac.signal);
      ac.abort(); // Abort waiting for the event
      ee.emit('foo'); // Prints: Waiting for the event was canceled! -
      - -

      Parameters

      • emitter: EventEmitter<DefaultEventMap>
      • eventName: string | symbol
      • Optionaloptions: StaticEventEmitterOptions

      Returns Promise<any[]>

      v11.13.0, v10.16.0

      -
    • Parameters

      • emitter: EventTarget
      • eventName: string
      • Optionaloptions: StaticEventEmitterOptions

      Returns Promise<any[]>

    • import { setMaxListeners, EventEmitter } from 'node:events';

      const target = new EventTarget();
      const emitter = new EventEmitter();

      setMaxListeners(5, target, emitter); -
      - -

      Parameters

      • Optionaln: number

        A non-negative number. The maximum number of listeners per EventTarget event.

        -
      • Rest...eventTargets: (EventEmitter<DefaultEventMap> | EventTarget)[]

      Returns void

      v15.4.0

      -

    Events

    device: "device" = ...

    Fires when device found

    +

    Events

    device: "device" = ...

    Fires when device found

    Onvif instance Onvif or just information object about found device device

    -
    discovery.on('device', console.log);
    +
    discovery.on('device', console.log);
     
    -
    error: "error" = ...

    Indicates any errors

    +
    error: "error" = ...

    Indicates any errors

    Error instance or array of error instances from Error error

    -
    discovery.on('error', console.error);
    +
    discovery.on('error', console.error);
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/classes/Media.html b/docs/classes/Media.html index badfdffd..a3792b79 100644 --- a/docs/classes/Media.html +++ b/docs/classes/Media.html @@ -1,4 +1,4 @@ -Media | onvif

    Class Media

    Constructors

    constructor +Media | onvif

    Class Media

    Constructors

    Properties

    profiles: Profile[] = []
    videoSources: VideoSource[] = []

    Methods

    • Parameters

      • __namedParameters: GetOSDOptions = {}

      Returns Promise<GetOSDOptionsResponse>

    • Parameters

      • __namedParameters: GetOSDs = {}

      Returns Promise<GetOSDsResponse>

    • Receive snapshot URI

      -

      Parameters

      Returns Promise<{
          uri: string;
      }>

    • This method requests a URI that can be used to initiate a live media stream using RTSP as the control protocol. +

    Constructors

    Properties

    profiles: Profile[] = []
    videoSources: VideoSource[] = []

    Methods

    • Receive snapshot URI

      +

      Parameters

      Returns Promise<{
          uri: string;
      }>

    • This method requests a URI that can be used to initiate a live media stream using RTSP as the control protocol. The returned URI shall remain valid indefinitely even if the profile is changed. Method uses Media2 if device supports it.

      For Media2 you need to provide only protocol parameter ('RTPS' by default). Here is supported values from the @@ -29,4 +29,4 @@

    • RTP over RTSP over HTTP over TCP: StreamType = "RTP_unicast", TransportProtocol = "HTTP"
    • RTP over RTSP over TCP: StreamType = "RTP_unicast", TransportProtocol = "RTSP"
    -

    Parameters

    Returns Promise<{
        invalidAfterConnect?: boolean;
        invalidAfterReboot?: boolean;
        timeout?: string;
        uri: string;
    }>

    \ No newline at end of file +

    Parameters

    Returns Promise<{
        invalidAfterConnect?: boolean;
        invalidAfterReboot?: boolean;
        timeout?: string;
        uri: string;
    }>

    \ No newline at end of file diff --git a/docs/classes/Onvif.html b/docs/classes/Onvif.html index 3b0c1402..689681f7 100644 --- a/docs/classes/Onvif.html +++ b/docs/classes/Onvif.html @@ -1,4 +1,4 @@ -Onvif | onvif

    Class Onvif

    Hierarchy

    • EventEmitter
      • Onvif

    Constructors

    constructor +Onvif | onvif

    Class Onvif

    Hierarchy

    • EventEmitter
      • Onvif

    Constructors

    Properties

    activeSource?: ActiveSource
    agent: boolean | Agent
    capabilities: Capabilities
    defaultProfile?: Profile
    defaultProfiles: Profile[] = []
    device: Device

    Core device namespace for device v1.0 methods

    -
    const date = await onvif.device.getSystemDateAndTime();
    console.log(date.toLocaleString()); +

    Constructors

    Properties

    activeSource?: ActiveSource
    agent: boolean | Agent
    capabilities: Capabilities
    defaultProfile?: Profile
    defaultProfiles: Profile[] = []
    device: Device

    Core device namespace for device v1.0 methods

    +
    const date = await onvif.device.getSystemDateAndTime();
    console.log(date.toLocaleString());
    -
    deviceInformation?: DeviceInformation
    hostname: string
    media: Media
    password?: string
    path: string
    port: number
    preserveAddress: boolean = false
    ptz: PTZ
    secureOptions: SecureContextOptions
    timeout: number
    urn?: string
    useSecure: boolean
    username?: string
    captureRejectionSymbol: typeof captureRejectionSymbol

    Value: Symbol.for('nodejs.rejection')

    -

    See how to write a custom rejection handler.

    -

    v13.4.0, v12.16.0

    -
    captureRejections: boolean

    Value: boolean

    -

    Change the default captureRejections option on all new EventEmitter objects.

    -

    v13.4.0, v12.16.0

    -
    defaultMaxListeners: number

    By default, a maximum of 10 listeners can be registered for any single -event. This limit can be changed for individual EventEmitter instances -using the emitter.setMaxListeners(n) method. To change the default -for allEventEmitter instances, the events.defaultMaxListeners property -can be used. If this value is not a positive number, a RangeError is thrown.

    -

    Take caution when setting the events.defaultMaxListeners because the -change affects all EventEmitter instances, including those created before -the change is made. However, calling emitter.setMaxListeners(n) still has -precedence over events.defaultMaxListeners.

    -

    This is not a hard limit. The EventEmitter instance will allow -more listeners to be added but will output a trace warning to stderr indicating -that a "possible EventEmitter memory leak" has been detected. For any single -EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to -temporarily avoid this warning:

    -
    import { EventEmitter } from 'node:events';
    const emitter = new EventEmitter();
    emitter.setMaxListeners(emitter.getMaxListeners() + 1);
    emitter.once('event', () => {
    // do stuff
    emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
    }); -
    - -

    The --trace-warnings command-line flag can be used to display the -stack trace for such warnings.

    -

    The emitted warning can be inspected with process.on('warning') and will -have the additional emitter, type, and count properties, referring to -the event emitter instance, the event's name and the number of attached -listeners, respectively. -Its name property is set to 'MaxListenersExceededWarning'.

    -

    v0.11.2

    -
    errorMonitor: typeof errorMonitor

    This symbol shall be used to install a listener for only monitoring 'error' events. Listeners installed using this symbol are called before the regular 'error' listeners are called.

    -

    Installing a listener using this symbol does not change the behavior once an 'error' event is emitted. Therefore, the process will still crash if no -regular 'error' listener is installed.

    -

    v13.6.0, v12.17.0

    -

    Methods

    • Type Parameters

      • K

      Parameters

      • error: Error
      • event: string | symbol
      • Rest...args: AnyRest

      Returns void

    • Alias for emitter.on(eventName, listener).

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.26

      -
    • Connect to the camera and fill device information properties

      -

      Returns Promise<Onvif>

    • Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments -to each.

      -

      Returns true if the event had listeners, false otherwise.

      -
      import { EventEmitter } from 'node:events';
      const myEmitter = new EventEmitter();

      // First listener
      myEmitter.on('event', function firstListener() {
      console.log('Helloooo! first listener');
      });
      // Second listener
      myEmitter.on('event', function secondListener(arg1, arg2) {
      console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
      });
      // Third listener
      myEmitter.on('event', function thirdListener(...args) {
      const parameters = args.join(', ');
      console.log(`event with parameters ${parameters} in third listener`);
      });

      console.log(myEmitter.listeners('event'));

      myEmitter.emit('event', 1, 2, 3, 4, 5);

      // Prints:
      // [
      // [Function: firstListener],
      // [Function: secondListener],
      // [Function: thirdListener]
      // ]
      // Helloooo! first listener
      // event with parameters 1, 2 in second listener
      // event with parameters 1, 2, 3, 4, 5 in third listener -
      - -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • Rest...args: AnyRest

      Returns boolean

      v0.1.26

      -
    • Returns an array listing the events for which the emitter has registered -listeners. The values in the array are strings or Symbols.

      -
      import { EventEmitter } from 'node:events';

      const myEE = new EventEmitter();
      myEE.on('foo', () => {});
      myEE.on('bar', () => {});

      const sym = Symbol('symbol');
      myEE.on(sym, () => {});

      console.log(myEE.eventNames());
      // Prints: [ 'foo', 'bar', Symbol(symbol) ] -
      - -

      Returns (string | symbol)[]

      v6.0.0

      -
    • Returns the current max listener value for the EventEmitter which is either -set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

      -

      Returns number

      v1.0.0

      -
    • Receive date and time from cam

      -

      Returns Promise<Date>

    • Returns the number of listeners listening for the event named eventName. -If listener is provided, it will return how many times the listener is found -in the list of the listeners of the event.

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event being listened for

        -
      • Optionallistener: Function

        The event handler function

        -

      Returns number

      v3.2.0

      -
    • Returns a copy of the array of listeners for the event named eventName.

      -
      server.on('connection', (stream) => {
      console.log('someone connected!');
      });
      console.log(util.inspect(server.listeners('connection')));
      // Prints: [ [Function] ] -
      - -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      v0.1.26

      -
    • Alias for emitter.removeListener().

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v10.0.0

      -
    • Adds the listener function to the end of the listeners array for the event -named eventName. No checks are made to see if the listener has already -been added. Multiple calls passing the same combination of eventName and -listener will result in the listener being added, and called, multiple times.

      -
      server.on('connection', (stream) => {
      console.log('someone connected!');
      }); -
      - -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the -event listener to the beginning of the listeners array.

      -
      import { EventEmitter } from 'node:events';
      const myEE = new EventEmitter();
      myEE.on('foo', () => console.log('a'));
      myEE.prependListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a -
      - -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args: any[]) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.101

      -
    • Adds a one-time listener function for the event named eventName. The -next time eventName is triggered, this listener is removed and then invoked.

      -
      server.once('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); -
      - -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener() method can be used as an alternative to add the -event listener to the beginning of the listeners array.

      -
      import { EventEmitter } from 'node:events';
      const myEE = new EventEmitter();
      myEE.once('foo', () => console.log('a'));
      myEE.prependOnceListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a -
      - -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args: any[]) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.3.0

      -
    • Adds the listener function to the beginning of the listeners array for the -event named eventName. No checks are made to see if the listener has -already been added. Multiple calls passing the same combination of eventName -and listener will result in the listener being added, and called, multiple times.

      -
      server.prependListener('connection', (stream) => {
      console.log('someone connected!');
      }); -
      - -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args: any[]) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v6.0.0

      -
    • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this -listener is removed, and then invoked.

      -
      server.prependOnceListener('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); -
      - -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args: any[]) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v6.0.0

      -
    • Returns a copy of the array of listeners for the event named eventName, -including any wrappers (such as those created by .once()).

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.once('log', () => console.log('log once'));

      // Returns a new Array with a function `onceWrapper` which has a property
      // `listener` which contains the original listener bound above
      const listeners = emitter.rawListeners('log');
      const logFnWrapper = listeners[0];

      // Logs "log once" to the console and does not unbind the `once` event
      logFnWrapper.listener();

      // Logs "log once" to the console and removes the listener
      logFnWrapper();

      emitter.on('log', () => console.log('log persistently'));
      // Will return a new Array with a single function bound by `.on()` above
      const newListeners = emitter.rawListeners('log');

      // Logs "log persistently" twice
      newListeners[0]();
      emitter.emit('log'); -
      - -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      v9.4.0

      -
    • Removes all listeners, or those of the specified eventName.

      -

      It is bad practice to remove listeners added elsewhere in the code, -particularly when the EventEmitter instance was created by some other -component or module (e.g. sockets or file streams).

      -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Parameters

      • OptionaleventName: string | symbol

      Returns this

      v0.1.26

      -
    • Removes the specified listener from the listener array for the event named eventName.

      -
      const callback = (stream) => {
      console.log('someone connected!');
      };
      server.on('connection', callback);
      // ...
      server.removeListener('connection', callback); -
      - -

      removeListener() will remove, at most, one instance of a listener from the -listener array. If any single listener has been added multiple times to the -listener array for the specified eventName, then removeListener() must be -called multiple times to remove each instance.

      -

      Once an event is emitted, all listeners attached to it at the -time of emitting are called in order. This implies that any removeListener() or removeAllListeners() calls after emitting and before the last listener finishes execution -will not remove them fromemit() in progress. Subsequent events behave as expected.

      -
      import { EventEmitter } from 'node:events';
      class MyEmitter extends EventEmitter {}
      const myEmitter = new MyEmitter();

      const callbackA = () => {
      console.log('A');
      myEmitter.removeListener('event', callbackB);
      };

      const callbackB = () => {
      console.log('B');
      };

      myEmitter.on('event', callbackA);

      myEmitter.on('event', callbackB);

      // callbackA removes listener callbackB but it will still be called.
      // Internal listener array at time of emit [callbackA, callbackB]
      myEmitter.emit('event');
      // Prints:
      // A
      // B

      // callbackB is now removed.
      // Internal listener array [callbackA]
      myEmitter.emit('event');
      // Prints:
      // A -
      - -

      Because listeners are managed using an internal array, calling this will -change the position indices of any listener registered after the listener -being removed. This will not impact the order in which listeners are called, -but it means that any copies of the listener array as returned by -the emitter.listeners() method will need to be recreated.

      -

      When a single function has been added as a handler multiple times for a single -event (as in the example below), removeListener() will remove the most -recently added instance. In the example the once('ping') listener is removed:

      -
      import { EventEmitter } from 'node:events';
      const ee = new EventEmitter();

      function pong() {
      console.log('pong');
      }

      ee.on('ping', pong);
      ee.once('ping', pong);
      ee.removeListener('ping', pong);

      ee.emit('ping');
      ee.emit('ping'); -
      - -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.26

      -
    • By default EventEmitters will print a warning if more than 10 listeners are -added for a particular event. This is a useful default that helps finding -memory leaks. The emitter.setMaxListeners() method allows the limit to be -modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.

      -

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Parameters

      • n: number

      Returns this

      v0.3.5

      -
    • Experimental

      Listens once to the abort event on the provided signal.

      -

      Listening to the abort event on abort signals is unsafe and may -lead to resource leaks since another third party with the signal can -call e.stopImmediatePropagation(). Unfortunately Node.js cannot change -this since it would violate the web standard. Additionally, the original -API makes it easy to forget to remove listeners.

      -

      This API allows safely using AbortSignals in Node.js APIs by solving these -two issues by listening to the event such that stopImmediatePropagation does -not prevent the listener from running.

      -

      Returns a disposable so that it may be unsubscribed from more easily.

      -
      import { addAbortListener } from 'node:events';

      function example(signal) {
      let disposable;
      try {
      signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
      disposable = addAbortListener(signal, (e) => {
      // Do something when signal is aborted.
      });
      } finally {
      disposable?.[Symbol.dispose]();
      }
      } -
      - -

      Parameters

      • signal: AbortSignal
      • resource: ((event: Event) => void)
          • (event): void
          • Parameters

            • event: Event

            Returns void

      Returns Disposable

      Disposable that removes the abort listener.

      -

      v20.5.0

      -
    • Returns a copy of the array of listeners for the event named eventName.

      -

      For EventEmitters this behaves exactly the same as calling .listeners on -the emitter.

      -

      For EventTargets this is the only way to get the event listeners for the -event target. This is useful for debugging and diagnostic purposes.

      -
      import { getEventListeners, EventEmitter } from 'node:events';

      {
      const ee = new EventEmitter();
      const listener = () => console.log('Events are fun');
      ee.on('foo', listener);
      console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
      }
      {
      const et = new EventTarget();
      const listener = () => console.log('Events are fun');
      et.addEventListener('foo', listener);
      console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
      } -
      - -

      Parameters

      • emitter: EventEmitter<DefaultEventMap> | EventTarget
      • name: string | symbol

      Returns Function[]

      v15.2.0, v14.17.0

      -
    • Returns the currently set max amount of listeners.

      -

      For EventEmitters this behaves exactly the same as calling .getMaxListeners on -the emitter.

      -

      For EventTargets this is the only way to get the max event listeners for the -event target. If the number of event handlers on a single EventTarget exceeds -the max set, the EventTarget will print a warning.

      -
      import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

      {
      const ee = new EventEmitter();
      console.log(getMaxListeners(ee)); // 10
      setMaxListeners(11, ee);
      console.log(getMaxListeners(ee)); // 11
      }
      {
      const et = new EventTarget();
      console.log(getMaxListeners(et)); // 10
      setMaxListeners(11, et);
      console.log(getMaxListeners(et)); // 11
      } -
      - -

      Parameters

      • emitter: EventEmitter<DefaultEventMap> | EventTarget

      Returns number

      v19.9.0

      -
    • A class method that returns the number of listeners for the given eventName registered on the given emitter.

      -
      import { EventEmitter, listenerCount } from 'node:events';

      const myEmitter = new EventEmitter();
      myEmitter.on('event', () => {});
      myEmitter.on('event', () => {});
      console.log(listenerCount(myEmitter, 'event'));
      // Prints: 2 -
      - -

      Parameters

      • emitter: EventEmitter<DefaultEventMap>

        The emitter to query

        -
      • eventName: string | symbol

        The event name

        -

      Returns number

      v0.9.12

      -

      Since v3.2.0 - Use listenerCount instead.

      -
    • import { on, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      });

      for await (const event of on(ee, 'foo')) {
      // The execution of this inner block is synchronous and it
      // processes one event at a time (even with await). Do not use
      // if concurrent execution is required.
      console.log(event); // prints ['bar'] [42]
      }
      // Unreachable here -
      - -

      Returns an AsyncIterator that iterates eventName events. It will throw -if the EventEmitter emits 'error'. It removes all listeners when -exiting the loop. The value returned by each iteration is an array -composed of the emitted event arguments.

      -

      An AbortSignal can be used to cancel waiting on events:

      -
      import { on, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ac = new AbortController();

      (async () => {
      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      });

      for await (const event of on(ee, 'foo', { signal: ac.signal })) {
      // The execution of this inner block is synchronous and it
      // processes one event at a time (even with await). Do not use
      // if concurrent execution is required.
      console.log(event); // prints ['bar'] [42]
      }
      // Unreachable here
      })();

      process.nextTick(() => ac.abort()); -
      - -

      Use the close option to specify an array of event names that will end the iteration:

      -
      import { on, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ee = new EventEmitter();

      // Emit later on
      process.nextTick(() => {
      ee.emit('foo', 'bar');
      ee.emit('foo', 42);
      ee.emit('close');
      });

      for await (const event of on(ee, 'foo', { close: ['close'] })) {
      console.log(event); // prints ['bar'] [42]
      }
      // the loop will exit after 'close' is emitted
      console.log('done'); // prints 'done' -
      - -

      Parameters

      • emitter: EventEmitter<DefaultEventMap>
      • eventName: string | symbol
      • Optionaloptions: StaticEventEmitterIteratorOptions

      Returns AsyncIterableIterator<any[]>

      An AsyncIterator that iterates eventName events emitted by the emitter

      -

      v13.6.0, v12.16.0

      -
    • Parameters

      • emitter: EventTarget
      • eventName: string
      • Optionaloptions: StaticEventEmitterIteratorOptions

      Returns AsyncIterableIterator<any[]>

    • Creates a Promise that is fulfilled when the EventEmitter emits the given -event or that is rejected if the EventEmitter emits 'error' while waiting. -The Promise will resolve with an array of all the arguments emitted to the -given event.

      -

      This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event -semantics and does not listen to the 'error' event.

      -
      import { once, EventEmitter } from 'node:events';
      import process from 'node:process';

      const ee = new EventEmitter();

      process.nextTick(() => {
      ee.emit('myevent', 42);
      });

      const [value] = await once(ee, 'myevent');
      console.log(value);

      const err = new Error('kaboom');
      process.nextTick(() => {
      ee.emit('error', err);
      });

      try {
      await once(ee, 'myevent');
      } catch (err) {
      console.error('error happened', err);
      } -
      - -

      The special handling of the 'error' event is only used when events.once() is used to wait for another event. If events.once() is used to wait for the -'error' event itself, then it is treated as any other kind of event without -special handling:

      -
      import { EventEmitter, once } from 'node:events';

      const ee = new EventEmitter();

      once(ee, 'error')
      .then(([err]) => console.log('ok', err.message))
      .catch((err) => console.error('error', err.message));

      ee.emit('error', new Error('boom'));

      // Prints: ok boom -
      - -

      An AbortSignal can be used to cancel waiting for the event:

      -
      import { EventEmitter, once } from 'node:events';

      const ee = new EventEmitter();
      const ac = new AbortController();

      async function foo(emitter, event, signal) {
      try {
      await once(emitter, event, { signal });
      console.log('event emitted!');
      } catch (error) {
      if (error.name === 'AbortError') {
      console.error('Waiting for the event was canceled!');
      } else {
      console.error('There was an error', error.message);
      }
      }
      }

      foo(ee, 'foo', ac.signal);
      ac.abort(); // Abort waiting for the event
      ee.emit('foo'); // Prints: Waiting for the event was canceled! -
      - -

      Parameters

      • emitter: EventEmitter<DefaultEventMap>
      • eventName: string | symbol
      • Optionaloptions: StaticEventEmitterOptions

      Returns Promise<any[]>

      v11.13.0, v10.16.0

      -
    • Parameters

      • emitter: EventTarget
      • eventName: string
      • Optionaloptions: StaticEventEmitterOptions

      Returns Promise<any[]>

    • import { setMaxListeners, EventEmitter } from 'node:events';

      const target = new EventTarget();
      const emitter = new EventEmitter();

      setMaxListeners(5, target, emitter); -
      - -

      Parameters

      • Optionaln: number

        A non-negative number. The maximum number of listeners per EventTarget event.

        -
      • Rest...eventTargets: (EventEmitter<DefaultEventMap> | EventTarget)[]

      Returns void

      v15.4.0

      -

    Events

    error: "error" = ...

    Indicates any errors

    +
    deviceInformation?: GetDeviceInformationResponse
    hostname: string
    media: Media
    password?: string
    path: string
    port: number
    preserveAddress: boolean = false
    ptz: PTZ
    secureOptions: SecureContextOptions
    timeout: number
    urn?: string
    useSecure: boolean
    username?: string

    Methods

    • Connect to the camera and fill device information properties

      +

      Returns Promise<Onvif>

    • Receive date and time from cam

      +

      Returns Promise<Date>

    • Parameters

      Returns Promise<[Record<string, any>, string]>

    Events

    error: "error" = ...

    Indicates any errors

    Error object error

    -
    onvif.on('error', console.error);
    +
    onvif.on('error', console.error);
     
    -
    rawRequest: "rawRequest" = ...

    Indicates raw xml request to device. +

    rawRequest: "rawRequest" = ...

    Indicates raw xml request to device. rawRequest

    -
    onvif.on('rawRequest', (xml) => { console.log('-> request was', xml); });
    +
    onvif.on('rawRequest', (xml) => { console.log('-> request was', xml); });
     
    -
    rawResponse: "rawResponse" = ...

    Indicates raw xml response from device. +

    rawResponse: "rawResponse" = ...

    Indicates raw xml response from device. rawResponse

    -
    onvif.on('rawResponse', (xml) => { console.log('<- response was', xml); });
    +
    onvif.on('rawResponse', (xml) => { console.log('<- response was', xml); });
     
    -
    warn: "warn" = ...

    Indicates any warnings +

    warn: "warn" = ...

    Indicates any warnings warn

    -
    onvif.on('warn', console.warn);
    +
    onvif.on('warn', console.warn);
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 899c3ccb..1b2e52ff 100644 --- a/docs/index.html +++ b/docs/index.html @@ -12,4 +12,4 @@

    The code, which use the old version of the library (0.6.x), should work using the compatibility class: https://github.com/agsh/onvif/blob/v1/src/compatibility/cam.ts where all methods are located.

    Thanks a lot for your interest and I will be glad to any questions and comments!

    P.S. I still need device access to test the code, any help would be greatly appreciated.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/ActiveSource.html b/docs/interfaces/ActiveSource.html index d74b665e..263ff2a1 100644 --- a/docs/interfaces/ActiveSource.html +++ b/docs/interfaces/ActiveSource.html @@ -1,5 +1,5 @@ ActiveSource | onvif

    Interface ActiveSource

    Information about active video source

    -
    interface ActiveSource {
        bitrate?: number;
        encoding?: string;
        fps?: number;
        height?: number;
        profileToken: string;
        ptz?: {
            name: string;
            token: string;
        };
        sourceToken: string;
        videoSourceConfigurationToken: string;
        width?: number;
    }

    Properties

    interface ActiveSource {
        bitrate?: number;
        encoding?: string;
        fps?: number;
        height?: number;
        profileToken: string;
        ptz?: {
            name: string;
            token: string;
        };
        sourceToken: string;
        videoSourceConfigurationToken: string;
        width?: number;
    }

    Properties

    bitrate?: number
    encoding?: string
    fps?: number
    height?: number
    profileToken: string
    ptz?: {
        name: string;
        token: string;
    }
    sourceToken: string
    videoSourceConfigurationToken: string
    width?: number
    \ No newline at end of file +

    Properties

    bitrate?: number
    encoding?: string
    fps?: number
    height?: number
    profileToken: string
    ptz?: {
        name: string;
        token: string;
    }
    sourceToken: string
    videoSourceConfigurationToken: string
    width?: number
    \ No newline at end of file diff --git a/docs/interfaces/AnalyticsCapabilities.html b/docs/interfaces/AnalyticsCapabilities.html deleted file mode 100644 index 2965e6e8..00000000 --- a/docs/interfaces/AnalyticsCapabilities.html +++ /dev/null @@ -1,8 +0,0 @@ -AnalyticsCapabilities | onvif

    Interface AnalyticsCapabilities

    Analytics capabilities

    -
    interface AnalyticsCapabilities {
        XAddr: string;
        analyticsModuleSupport: boolean;
        ruleSupport: boolean;
    }

    Properties

    XAddr: string

    Analytics service URI

    -
    analyticsModuleSupport: boolean

    Indicates whether modules are supported

    -
    ruleSupport: boolean

    Indicates whether rules are supported

    -
    \ No newline at end of file diff --git a/docs/interfaces/AnalyticsDeviceCapabilities.html b/docs/interfaces/AnalyticsDeviceCapabilities.html deleted file mode 100644 index 81a748ae..00000000 --- a/docs/interfaces/AnalyticsDeviceCapabilities.html +++ /dev/null @@ -1,4 +0,0 @@ -AnalyticsDeviceCapabilities | onvif

    Interface AnalyticsDeviceCapabilities

    interface AnalyticsDeviceCapabilities {
        XAddr: string;
        extension?: any;
        ruleSupport?: boolean;
    }

    Properties

    XAddr: string
    extension?: any
    ruleSupport?: boolean
    \ No newline at end of file diff --git a/docs/interfaces/AnalyticsEngineConfiguration.html b/docs/interfaces/AnalyticsEngineConfiguration.html index 7b30b225..8b239b02 100644 --- a/docs/interfaces/AnalyticsEngineConfiguration.html +++ b/docs/interfaces/AnalyticsEngineConfiguration.html @@ -1,3 +1,3 @@ -AnalyticsEngineConfiguration | onvif

    Interface AnalyticsEngineConfiguration

    interface AnalyticsEngineConfiguration {
        analyticsModule?: Config;
        extension?: any;
    }

    Properties

    analyticsModule? +AnalyticsEngineConfiguration | onvif

    Interface AnalyticsEngineConfiguration

    interface AnalyticsEngineConfiguration {
        analyticsModule?: Config;
        extension?: any;
    }

    Properties

    analyticsModule?: Config
    extension?: any
    \ No newline at end of file +

    Properties

    analyticsModule?: Config
    extension?: any
    \ No newline at end of file diff --git a/docs/interfaces/AudioDecoderConfiguration.html b/docs/interfaces/AudioDecoderConfiguration.html index 00c0c744..cdaa84f7 100644 --- a/docs/interfaces/AudioDecoderConfiguration.html +++ b/docs/interfaces/AudioDecoderConfiguration.html @@ -1,8 +1,8 @@ -AudioDecoderConfiguration | onvif

    Interface AudioDecoderConfiguration

    interface AudioDecoderConfiguration {
        name: string;
        token: string;
        useCount: number;
    }

    Properties

    name +AudioDecoderConfiguration | onvif

    Interface AudioDecoderConfiguration

    interface AudioDecoderConfiguration {
        name: string;
        token: string;
        useCount: number;
    }

    Properties

    Properties

    name: string

    User readable name. Length up to 64 characters

    -
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount: number

    Number of internal references currently using this configuration. +

    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioEncoder2Configuration.html b/docs/interfaces/AudioEncoder2Configuration.html index b495cf63..ff51f067 100644 --- a/docs/interfaces/AudioEncoder2Configuration.html +++ b/docs/interfaces/AudioEncoder2Configuration.html @@ -1,4 +1,4 @@ -AudioEncoder2Configuration | onvif

    Interface AudioEncoder2Configuration

    interface AudioEncoder2Configuration {
        bitrate: number;
        encoding: string;
        multicast?: MulticastConfiguration;
        name: string;
        sampleRate: number;
        token: string;
        useCount: number;
    }

    Properties

    bitrate +AudioEncoder2Configuration | onvif

    Interface AudioEncoder2Configuration

    interface AudioEncoder2Configuration {
        bitrate: number;
        encoding: string;
        multicast?: MulticastConfiguration;
        name: string;
        sampleRate: number;
        token: string;
        useCount: number;
    }

    Properties

    Properties

    bitrate: number

    The output bitrate in kbps

    -
    encoding: string

    Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and IANA Media Types +

    encoding: string

    Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and IANA Media Types https://www.iana.org/assignments/media-types/media-types.xhtml#audio

    -

    Optional multicast configuration of the audio stream

    -
    name: string

    User readable name. Length up to 64 characters

    -
    sampleRate: number

    The output sample rate in kHz

    -
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount: number

    Number of internal references currently using this configuration. +

    Optional multicast configuration of the audio stream

    +
    name: string

    User readable name. Length up to 64 characters

    +
    sampleRate: number

    The output sample rate in kHz

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioEncoderConfiguration.html b/docs/interfaces/AudioEncoderConfiguration.html index 607a5b51..6ebb64a5 100644 --- a/docs/interfaces/AudioEncoderConfiguration.html +++ b/docs/interfaces/AudioEncoderConfiguration.html @@ -1,4 +1,4 @@ -AudioEncoderConfiguration | onvif

    Interface AudioEncoderConfiguration

    interface AudioEncoderConfiguration {
        bitrate: number;
        encoding: "G711" | "G726" | "AAC";
        multicast: MulticastConfiguration;
        name: string;
        sampleRate: number;
        sessionTimeout: string;
        token: string;
        useCount: number;
    }

    Properties

    bitrate +AudioEncoderConfiguration | onvif

    Interface AudioEncoderConfiguration

    interface AudioEncoderConfiguration {
        bitrate: number;
        encoding: "G711" | "G726" | "AAC";
        multicast: MulticastConfiguration;
        name: string;
        sampleRate: number;
        sessionTimeout: string;
        token: string;
        useCount: number;
    }

    Properties

    Properties

    bitrate: number

    The output bitrate in kbps

    -
    encoding: "G711" | "G726" | "AAC"

    Audio codec used for encoding the audio input (either G.711, G.726 or AAC)

    -

    Defines the multicast settings that could be used for video streaming

    -
    name: string

    User readable name. Length up to 64 characters

    -
    sampleRate: number

    The output sample rate in kHz

    -
    sessionTimeout: string

    The rtsp session timeout for the related audio stream

    -
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount: number

    Number of internal references currently using this configuration. +

    encoding: "G711" | "G726" | "AAC"

    Audio codec used for encoding the audio input (either G.711, G.726 or AAC)

    +

    Defines the multicast settings that could be used for video streaming

    +
    name: string

    User readable name. Length up to 64 characters

    +
    sampleRate: number

    The output sample rate in kHz

    +
    sessionTimeout: string

    The rtsp session timeout for the related audio stream

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioOutputConfiguration.html b/docs/interfaces/AudioOutputConfiguration.html index aaeedf1a..90334522 100644 --- a/docs/interfaces/AudioOutputConfiguration.html +++ b/docs/interfaces/AudioOutputConfiguration.html @@ -1,13 +1,13 @@ -AudioOutputConfiguration | onvif

    Interface AudioOutputConfiguration

    interface AudioOutputConfiguration {
        name: string;
        outputLevel: number;
        outputToken: string;
        sendPrimacy?: string;
        token: string;
        useCount: number;
    }

    Properties

    name +AudioOutputConfiguration | onvif

    Interface AudioOutputConfiguration

    interface AudioOutputConfiguration {
        name: string;
        outputLevel: number;
        outputToken: string;
        sendPrimacy?: string;
        token: string;
        useCount: number;
    }

    Properties

    name: string

    User readable name. Length up to 64 characters

    -
    outputLevel: number

    Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRang

    -
    outputToken: string

    Token of the phsycial Audio output

    -
    sendPrimacy?: string

    An audio channel MAY support different types of audio transmission. +

    outputLevel: number

    Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRang

    +
    outputToken: string

    Token of the phsycial Audio output

    +
    sendPrimacy?: string

    An audio channel MAY support different types of audio transmission. While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which direction is currently active. An NVC can switch between different modes by setting the AudioOutputConfiguration. @@ -20,7 +20,7 @@

  • www.onvif.org/ver20/HalfDuplex/Auto It is up to the device how to deal with sending and receiving audio data. Acoustic echo cancellation is out of ONVIF scope.
  • -
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount: number

    Number of internal references currently using this configuration. +

    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioSourceConfiguration.html b/docs/interfaces/AudioSourceConfiguration.html index 54d315d3..ecc4cd6e 100644 --- a/docs/interfaces/AudioSourceConfiguration.html +++ b/docs/interfaces/AudioSourceConfiguration.html @@ -1,10 +1,10 @@ -AudioSourceConfiguration | onvif

    Interface AudioSourceConfiguration

    interface AudioSourceConfiguration {
        name: string;
        sourceToken: string;
        token: string;
        useCount: number;
    }

    Properties

    name +AudioSourceConfiguration | onvif

    Interface AudioSourceConfiguration

    interface AudioSourceConfiguration {
        name: string;
        sourceToken: string;
        token: string;
        useCount: number;
    }

    Properties

    name: string

    User readable name. Length up to 64 characters

    -
    sourceToken: string

    Token of the Audio Source the configuration applies to

    -
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount: number

    Number of internal references currently using this configuration +

    sourceToken: string

    Token of the Audio Source the configuration applies to

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration This informational parameter is read-only. Deprecated for Media2 Service

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/BacklightCompensation.html b/docs/interfaces/BacklightCompensation.html index 7673510b..35ee4a39 100644 --- a/docs/interfaces/BacklightCompensation.html +++ b/docs/interfaces/BacklightCompensation.html @@ -1,9 +1,9 @@ -BacklightCompensation | onvif

    Interface BacklightCompensation

    interface BacklightCompensation {
        level: number;
        mode: "OFF" | "ON";
    }

    Properties

    level +BacklightCompensation | onvif

    Interface BacklightCompensation

    interface BacklightCompensation {
        level: number;
        mode: "OFF" | "ON";
    }

    Properties

    Properties

    level: number

    Optional level parameter (unit unspecified)

    -
    mode: "OFF" | "ON"

    Backlight compensation mode (on/off).

    +
    mode: "OFF" | "ON"

    Backlight compensation mode (on/off).

    • OFF: Backlight compensation is disabled
    • ON: Backlight compensation is enabled
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/BacklightCompensation20.html b/docs/interfaces/BacklightCompensation20.html index 06e02d59..f9869e7f 100644 --- a/docs/interfaces/BacklightCompensation20.html +++ b/docs/interfaces/BacklightCompensation20.html @@ -1,9 +1,9 @@ -BacklightCompensation20 | onvif

    Interface BacklightCompensation20

    interface BacklightCompensation20 {
        level?: number;
        mode: "OFF" | "ON";
    }

    Properties

    level? +BacklightCompensation20 | onvif

    Interface BacklightCompensation20

    interface BacklightCompensation20 {
        level?: number;
        mode: "OFF" | "ON";
    }

    Properties

    Properties

    level?: number

    Optional level parameter (unit unspecified)

    -
    mode: "OFF" | "ON"

    Backlight compensation mode (on/off)

    +
    mode: "OFF" | "ON"

    Backlight compensation mode (on/off)

    • OFF: Backlight compensation is disabled
    • ON: Backlight compensation is enabled
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/Capabilities.html b/docs/interfaces/Capabilities.html deleted file mode 100644 index db1683af..00000000 --- a/docs/interfaces/Capabilities.html +++ /dev/null @@ -1,9 +0,0 @@ -Capabilities | onvif

    Interface Capabilities

    Capability list

    -
    interface Capabilities {
        analytics?: AnalyticsCapabilities;
        device?: DeviceCapabilities;
        events?: EventCapabilities;
        extension?: CapabilitiesExtension;
        imaging?: ImagingCapabilities;
        media?: MediaCapabilities;
        ptz?: PTZCapabilities;
    }

    Properties

    \ No newline at end of file diff --git a/docs/interfaces/CapabilitiesExtension.html b/docs/interfaces/CapabilitiesExtension.html deleted file mode 100644 index ae4b0408..00000000 --- a/docs/interfaces/CapabilitiesExtension.html +++ /dev/null @@ -1,10 +0,0 @@ -CapabilitiesExtension | onvif

    Interface CapabilitiesExtension

    interface CapabilitiesExtension {
        XAddr: string;
        analyticsDevice?: AnalyticsDeviceCapabilities;
        deviceIO?: DeviceIOCapabilities;
        display?: DisplayCapabilities;
        receiver?: ReceiverCapabilities;
        recording?: RecordingCapabilities;
        replay?: ReplayCapabilities;
        search?: SearchCapabilities;
    }

    Properties

    XAddr: string
    analyticsDevice?: AnalyticsDeviceCapabilities

    DeviceIO capabilities

    -
    \ No newline at end of file diff --git a/docs/interfaces/Config.html b/docs/interfaces/Config.html index 4ec7f2f1..38fc0d14 100644 --- a/docs/interfaces/Config.html +++ b/docs/interfaces/Config.html @@ -1,8 +1,8 @@ -Config | onvif

    Interface Config

    interface Config {
        name: string;
        parameters: ItemList[];
        type: string;
    }

    Properties

    name +Config | onvif

    Interface Config

    interface Config {
        name: string;
        parameters: ItemList[];
        type: string;
    }

    Properties

    Properties

    name: string

    Name of the configuration

    -
    parameters: ItemList[]

    List of configuration parameters as defined in the corresponding description

    -
    type: string

    The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements +

    parameters: ItemList[]

    List of configuration parameters as defined in the corresponding description

    +
    type: string

    The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements returned by GetSupportedRules and GetSupportedAnalyticsModules command.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/ConfigurationSet.html b/docs/interfaces/ConfigurationSet.html index 90d78649..6f6018c8 100644 --- a/docs/interfaces/ConfigurationSet.html +++ b/docs/interfaces/ConfigurationSet.html @@ -1,4 +1,4 @@ -ConfigurationSet | onvif

    Interface ConfigurationSet

    Properties

    PTZ? +ConfigurationSet | onvif

    Interface ConfigurationSet

    Properties

    Optional configuration of the pan tilt zoom unit

    -

    Optional configuration of the analytics module and rule engine

    -

    Optional configuration of the Audio decoder

    -

    Optional configuration of the Audio encoder

    -

    Optional configuration of the Audio output

    -

    Optional configuration of the Audio input

    -

    Optional configuration of the metadata stream

    -
    receiver?: any

    Optional configuration of the Receiver

    -

    Optional configuration of the Video encoder

    -

    Optional configuration of the Video input

    -
    \ No newline at end of file +

    Optional configuration of the analytics module and rule engine

    +

    Optional configuration of the Audio decoder

    +

    Optional configuration of the Audio encoder

    +

    Optional configuration of the Audio output

    +

    Optional configuration of the Audio input

    +

    Optional configuration of the metadata stream

    +
    receiver?: any

    Optional configuration of the Receiver

    +

    Optional configuration of the Video encoder

    +

    Optional configuration of the Video input

    +
    \ No newline at end of file diff --git a/docs/interfaces/Defogging.html b/docs/interfaces/Defogging.html index 17cc9bdf..10f33bca 100644 --- a/docs/interfaces/Defogging.html +++ b/docs/interfaces/Defogging.html @@ -1,6 +1,6 @@ -Defogging | onvif

    Interface Defogging

    interface Defogging {
        extension?: any;
        level?: number;
        mode: string;
    }

    Properties

    extension? +Defogging | onvif

    Interface Defogging

    interface Defogging {
        extension?: any;
        level?: number;
        mode: string;
    }

    Properties

    Properties

    extension?: any
    level?: number

    Optional level parameter specified with unitless normalized value from 0.0 to +1.0

    -
    mode: string

    Parameter to enable/disable or automatic Defogging feature. Its options shall be chosen from tt:DefoggingMode Type

    -
    \ No newline at end of file +

    Properties

    extension?: any
    level?: number

    Optional level parameter specified with unitless normalized value from 0.0 to +1.0

    +
    mode: string

    Parameter to enable/disable or automatic Defogging feature. Its options shall be chosen from tt:DefoggingMode Type

    +
    \ No newline at end of file diff --git a/docs/interfaces/DeviceCapabilities.html b/docs/interfaces/DeviceCapabilities.html deleted file mode 100644 index 1db8b666..00000000 --- a/docs/interfaces/DeviceCapabilities.html +++ /dev/null @@ -1,9 +0,0 @@ -DeviceCapabilities | onvif

    Interface DeviceCapabilities

    Device capabilities

    -
    interface DeviceCapabilities {
        IO?: IOCapabilities;
        XAddr: string;
        extensions?: any;
        network?: NetworkCapabilities;
        security?: SecurityCapabilities;
        system?: SystemCapabilities;
    }

    Properties

    XAddr: string

    Device service URI

    -
    extensions?: any
    \ No newline at end of file diff --git a/docs/interfaces/DeviceIOCapabilities.html b/docs/interfaces/DeviceIOCapabilities.html deleted file mode 100644 index 68f56b33..00000000 --- a/docs/interfaces/DeviceIOCapabilities.html +++ /dev/null @@ -1,9 +0,0 @@ -DeviceIOCapabilities | onvif

    Interface DeviceIOCapabilities

    interface DeviceIOCapabilities {
        XAddr: string;
        audioOutputs: number;
        audioSources: number;
        extensions: {
            scdlCapabilities: any;
            telexCapabilities: any;
        };
        relayOutputs: number;
        videoOutputs: number;
        videoSources: number;
    }

    Properties

    XAddr: string

    DeviceIO service URI

    -
    audioOutputs: number
    audioSources: number
    extensions: {
        scdlCapabilities: any;
        telexCapabilities: any;
    }
    relayOutputs: number
    videoOutputs: number
    videoSources: number
    \ No newline at end of file diff --git a/docs/interfaces/DeviceInformation.html b/docs/interfaces/DeviceInformation.html deleted file mode 100644 index 45228a2d..00000000 --- a/docs/interfaces/DeviceInformation.html +++ /dev/null @@ -1,11 +0,0 @@ -DeviceInformation | onvif

    Interface DeviceInformation

    interface DeviceInformation {
        firmwareVersion: string;
        hardwareId: string;
        manufacturer: string;
        model: string;
        serialNumber: string;
    }

    Properties

    firmwareVersion: string

    The firmware version in the device

    -
    hardwareId: string

    The hardware ID of the device

    -
    manufacturer: string

    The manufactor of the device

    -
    model: string

    The device model

    -
    serialNumber: string

    The serial number of the device

    -
    \ No newline at end of file diff --git a/docs/interfaces/DiscoveryOptions.html b/docs/interfaces/DiscoveryOptions.html index ce07150c..9c726f50 100644 --- a/docs/interfaces/DiscoveryOptions.html +++ b/docs/interfaces/DiscoveryOptions.html @@ -1,13 +1,13 @@ -DiscoveryOptions | onvif

    Interface DiscoveryOptions

    interface DiscoveryOptions {
        device?: string;
        listeningPort?: number;
        messageId?: string;
        resolve?: boolean;
        timeout?: number;
        type?: "udp4" | "udp6";
    }

    Properties

    device? +DiscoveryOptions | onvif

    Interface DiscoveryOptions

    interface DiscoveryOptions {
        device?: string;
        listeningPort?: number;
        messageId?: string;
        resolve?: boolean;
        timeout?: number;
        type?: "udp4" | "udp6";
    }

    Properties

    device?: string

    Interface to bind on for discovery ex. eth0

    -
    listeningPort?: number

    Client will listen to discovery data device sent

    -
    messageId?: string

    WS-Discovery message id

    -
    resolve?: boolean

    Set to false if you want to omit creating of Cam objects. Default true

    -
    timeout?: number

    Timeout in milliseconds for discovery responses, Default 5000

    -
    type?: "udp4" | "udp6"

    Socket type

    -
    \ No newline at end of file +
    listeningPort?: number

    Client will listen to discovery data device sent

    +
    messageId?: string

    WS-Discovery message id

    +
    resolve?: boolean

    Set to false if you want to omit creating of Cam objects. Default true

    +
    timeout?: number

    Timeout in milliseconds for discovery responses, Default 5000

    +
    type?: "udp4" | "udp6"

    Socket type

    +
    \ No newline at end of file diff --git a/docs/interfaces/DisplayCapabilities.html b/docs/interfaces/DisplayCapabilities.html deleted file mode 100644 index 28e44f71..00000000 --- a/docs/interfaces/DisplayCapabilities.html +++ /dev/null @@ -1,4 +0,0 @@ -DisplayCapabilities | onvif

    Interface DisplayCapabilities

    interface DisplayCapabilities {
        XAddr: string;
        fixedLayout: boolean;
    }

    Properties

    Properties

    XAddr: string
    fixedLayout: boolean

    Indication that the SetLayout command supports only predefined layouts

    -
    \ No newline at end of file diff --git a/docs/interfaces/EventCapabilities.html b/docs/interfaces/EventCapabilities.html deleted file mode 100644 index f6d02931..00000000 --- a/docs/interfaces/EventCapabilities.html +++ /dev/null @@ -1,10 +0,0 @@ -EventCapabilities | onvif

    Interface EventCapabilities

    Event capabilities

    -
    interface EventCapabilities {
        WSPausableSubscriptionManagerInterfaceSupport: boolean;
        WSPullPointSupport: boolean;
        WSSubscriptionPolicySupport: boolean;
        XAddr: string;
    }

    Properties

    WSPausableSubscriptionManagerInterfaceSupport: boolean

    Indicates whether or not WS Pausable Subscription Manager Interface is supported

    -
    WSPullPointSupport: boolean

    Indicates whether or not WS Pull Point is supported

    -
    WSSubscriptionPolicySupport: boolean

    Indicates whether or not WS Subscription policy is supported

    -
    XAddr: string

    Event service URI

    -
    \ No newline at end of file diff --git a/docs/interfaces/EventSubscription.html b/docs/interfaces/EventSubscription.html index fee8bf59..d03fecfc 100644 --- a/docs/interfaces/EventSubscription.html +++ b/docs/interfaces/EventSubscription.html @@ -1,3 +1,3 @@ -EventSubscription | onvif

    Interface EventSubscription

    interface EventSubscription {
        filter?: string;
        subscriptionPolicy?: any;
    }

    Properties

    filter? +EventSubscription | onvif

    Interface EventSubscription

    interface EventSubscription {
        filter?: string;
        subscriptionPolicy?: any;
    }

    Properties

    filter?: string
    subscriptionPolicy?: any
    \ No newline at end of file +

    Properties

    filter?: string
    subscriptionPolicy?: any
    \ No newline at end of file diff --git a/docs/interfaces/Exposure.html b/docs/interfaces/Exposure.html index e1207dab..e3e69892 100644 --- a/docs/interfaces/Exposure.html +++ b/docs/interfaces/Exposure.html @@ -1,4 +1,4 @@ -Exposure | onvif

    Interface Exposure

    interface Exposure {
        exposureTime: number;
        gain: number;
        iris: number;
        maxExposureTime: number;
        maxGain: number;
        maxIris: number;
        minExposureTime: number;
        minGain: number;
        minIris: number;
        mode: "AUTO" | "MANUAL";
        priority: "LowNoise" | "FrameRate";
        window: Rectangle;
    }

    Properties

    exposureTime +Exposure | onvif

    Interface Exposure

    interface Exposure {
        exposureTime: number;
        gain: number;
        iris: number;
        maxExposureTime: number;
        maxGain: number;
        maxIris: number;
        minExposureTime: number;
        minGain: number;
        minIris: number;
        mode: "AUTO" | "MANUAL";
        priority: "LowNoise" | "FrameRate";
        window: Rectangle;
    }

    Properties

    Properties

    exposureTime: number

    The fixed exposure time used by the image sensor (μs)

    -
    gain: number

    The fixed gain used by the image sensor (dB)

    -
    iris: number

    The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris

    -
    maxExposureTime: number

    Maximum value of exposure time range allowed to be used by the algorithm

    -
    maxGain: number

    Maximum value of the sensor gain range that is allowed to be used by the algorithm

    -
    maxIris: number

    Maximum value of the iris range allowed to be used by the algorithm

    -
    minExposureTime: number

    Minimum value of exposure time range allowed to be used by the algorithm

    -
    minGain: number

    Minimum value of the sensor gain range that is allowed to be used by the algorithm

    -
    minIris: number

    Minimum value of the iris range allowed to be used by the algorithm

    -
    mode: "AUTO" | "MANUAL"

    Exposure Mode

    +
    gain: number

    The fixed gain used by the image sensor (dB)

    +
    iris: number

    The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris

    +
    maxExposureTime: number

    Maximum value of exposure time range allowed to be used by the algorithm

    +
    maxGain: number

    Maximum value of the sensor gain range that is allowed to be used by the algorithm

    +
    maxIris: number

    Maximum value of the iris range allowed to be used by the algorithm

    +
    minExposureTime: number

    Minimum value of exposure time range allowed to be used by the algorithm

    +
    minGain: number

    Minimum value of the sensor gain range that is allowed to be used by the algorithm

    +
    minIris: number

    Minimum value of the iris range allowed to be used by the algorithm

    +
    mode: "AUTO" | "MANUAL"

    Exposure Mode

    • Auto – Enabled the exposure algorithm on the NVT
    • Manual – Disabled exposure algorithm on the NVT
    -
    priority: "LowNoise" | "FrameRate"

    The exposure priority mode (low noise/framerate)

    -
    window: Rectangle

    Rectangular exposure mask

    -
    \ No newline at end of file +
    priority: "LowNoise" | "FrameRate"

    The exposure priority mode (low noise/framerate)

    +
    window: Rectangle

    Rectangular exposure mask

    +
    \ No newline at end of file diff --git a/docs/interfaces/Exposure20.html b/docs/interfaces/Exposure20.html index 4435ea8c..3e81c2ef 100644 --- a/docs/interfaces/Exposure20.html +++ b/docs/interfaces/Exposure20.html @@ -1,4 +1,4 @@ -Exposure20 | onvif

    Interface Exposure20

    interface Exposure20 {
        exposureTime?: number;
        gain?: number;
        iris?: number;
        maxExposureTime?: number;
        maxGain?: number;
        maxIris?: number;
        minExposureTime?: number;
        minGain?: number;
        minIris?: number;
        mode: "AUTO" | "MANUAL";
        priority?: "LowNoise" | "FrameRate";
        window?: Rectangle;
    }

    Properties

    exposureTime? +Exposure20 | onvif

    Interface Exposure20

    interface Exposure20 {
        exposureTime?: number;
        gain?: number;
        iris?: number;
        maxExposureTime?: number;
        maxGain?: number;
        maxIris?: number;
        minExposureTime?: number;
        minGain?: number;
        minIris?: number;
        mode: "AUTO" | "MANUAL";
        priority?: "LowNoise" | "FrameRate";
        window?: Rectangle;
    }

    Properties

    exposureTime?: number

    The fixed exposure time used by the image sensor (μs)

    -
    gain?: number

    The fixed gain used by the image sensor (dB)

    -
    iris?: number

    The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris and positive values map to higher attenuation

    -
    maxExposureTime?: number

    Maximum value of exposure time range allowed to be used by the algorithm

    -
    maxGain?: number

    Maximum value of the sensor gain range that is allowed to be used by the algorithm

    -
    maxIris?: number

    Maximum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation

    -
    minExposureTime?: number

    Minimum value of exposure time range allowed to be used by the algorithm

    -
    minGain?: number

    Minimum value of the sensor gain range that is allowed to be used by the algorithm

    -
    minIris?: number

    Minimum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation

    -
    mode: "AUTO" | "MANUAL"

    Exposure Mode

    +
    gain?: number

    The fixed gain used by the image sensor (dB)

    +
    iris?: number

    The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris and positive values map to higher attenuation

    +
    maxExposureTime?: number

    Maximum value of exposure time range allowed to be used by the algorithm

    +
    maxGain?: number

    Maximum value of the sensor gain range that is allowed to be used by the algorithm

    +
    maxIris?: number

    Maximum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation

    +
    minExposureTime?: number

    Minimum value of exposure time range allowed to be used by the algorithm

    +
    minGain?: number

    Minimum value of the sensor gain range that is allowed to be used by the algorithm

    +
    minIris?: number

    Minimum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation

    +
    mode: "AUTO" | "MANUAL"

    Exposure Mode

    • Auto – Enabled the exposure algorithm on the device
    • Manual – Disabled exposure algorithm on the device
    -
    priority?: "LowNoise" | "FrameRate"

    The exposure priority mode (low noise/framerate)

    -
    window?: Rectangle

    Rectangular exposure mask

    -
    \ No newline at end of file +
    priority?: "LowNoise" | "FrameRate"

    The exposure priority mode (low noise/framerate)

    +
    window?: Rectangle

    Rectangular exposure mask

    +
    \ No newline at end of file diff --git a/docs/interfaces/FocusConfiguration.html b/docs/interfaces/FocusConfiguration.html index b0bc500c..b53d6027 100644 --- a/docs/interfaces/FocusConfiguration.html +++ b/docs/interfaces/FocusConfiguration.html @@ -1,7 +1,7 @@ -FocusConfiguration | onvif

    Interface FocusConfiguration

    interface FocusConfiguration {
        autoFocusMode: "AUTO" | "MANUAL";
        defaultSpeed: number;
        farLimit: number;
        nearLimit: number;
    }

    Properties

    autoFocusMode +FocusConfiguration | onvif

    Interface FocusConfiguration

    interface FocusConfiguration {
        autoFocusMode: "AUTO" | "MANUAL";
        defaultSpeed: number;
        farLimit: number;
        nearLimit: number;
    }

    Properties

    autoFocusMode: "AUTO" | "MANUAL"
    defaultSpeed: number
    farLimit: number

    Parameter to set autofocus far limit (unit: meter). If set to 0.0, infinity will be used

    -
    nearLimit: number

    Parameter to set autofocus near limit (unit: meter)

    -
    \ No newline at end of file +

    Properties

    autoFocusMode: "AUTO" | "MANUAL"
    defaultSpeed: number
    farLimit: number

    Parameter to set autofocus far limit (unit: meter). If set to 0.0, infinity will be used

    +
    nearLimit: number

    Parameter to set autofocus near limit (unit: meter)

    +
    \ No newline at end of file diff --git a/docs/interfaces/FocusConfiguration20.html b/docs/interfaces/FocusConfiguration20.html index 16443488..1f36ad56 100644 --- a/docs/interfaces/FocusConfiguration20.html +++ b/docs/interfaces/FocusConfiguration20.html @@ -1,17 +1,17 @@ -FocusConfiguration20 | onvif

    Interface FocusConfiguration20

    interface FocusConfiguration20 {
        AFMode: string[];
        autoFocusMode: "AUTO" | "MANUAL";
        defaultSpeed?: number;
        extension?: any;
        farLimit?: number;
        nearLimit?: number;
    }

    Properties

    AFMode +FocusConfiguration20 | onvif

    Interface FocusConfiguration20

    interface FocusConfiguration20 {
        AFMode: string[];
        autoFocusMode: "AUTO" | "MANUAL";
        defaultSpeed?: number;
        extension?: any;
        farLimit?: number;
        nearLimit?: number;
    }

    Properties

    AFMode: string[]

    Zero or more modes as defined in enumeration tt:AFModes

    -
    autoFocusMode: "AUTO" | "MANUAL"

    Mode of auto focus

    +
    autoFocusMode: "AUTO" | "MANUAL"

    Mode of auto focus

    • AUTO - The device automatically adjusts focus
    • MANUAL - The device does not automatically adjust focus Note: for devices supporting both manual and auto operation at the same time manual operation may be supported even if the Mode parameter is set to Auto.
    -
    defaultSpeed?: number
    extension?: any
    farLimit?: number

    Parameter to set autofocus far limit (unit: meter)

    -
    nearLimit?: number

    Parameter to set autofocus near limit (unit: meter)

    -
    \ No newline at end of file +
    defaultSpeed?: number
    extension?: any
    farLimit?: number

    Parameter to set autofocus far limit (unit: meter)

    +
    nearLimit?: number

    Parameter to set autofocus near limit (unit: meter)

    +
    \ No newline at end of file diff --git a/docs/interfaces/H264Configuration.html b/docs/interfaces/H264Configuration.html index b768d810..dc72766e 100644 --- a/docs/interfaces/H264Configuration.html +++ b/docs/interfaces/H264Configuration.html @@ -1,8 +1,8 @@ -H264Configuration | onvif

    Interface H264Configuration

    interface H264Configuration {
        H264Profile:
            | "Baseline"
            | "Main"
            | "Extended"
            | "High";
        govLength: number;
    }

    Properties

    H264Profile +H264Configuration | onvif

    Interface H264Configuration

    interface H264Configuration {
        H264Profile:
            | "Baseline"
            | "Main"
            | "Extended"
            | "High";
        govLength: number;
    }

    Properties

    H264Profile:
        | "Baseline"
        | "Main"
        | "Extended"
        | "High"

    The H.264 profile, either baseline, main, extended or high

    -
    govLength: number

    Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. +

    govLength: number

    Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/IOCapabilities.html b/docs/interfaces/IOCapabilities.html deleted file mode 100644 index 9fa809b4..00000000 --- a/docs/interfaces/IOCapabilities.html +++ /dev/null @@ -1,6 +0,0 @@ -IOCapabilities | onvif

    Interface IOCapabilities

    interface IOCapabilities {
        extension?: IOCapabilitiesExtension;
        inputConnectors?: number;
        relayOutputs?: number;
    }

    Properties

    inputConnectors?: number

    Number of input connectors

    -
    relayOutputs?: number

    Number of relay outputs

    -
    \ No newline at end of file diff --git a/docs/interfaces/IOCapabilitiesExtension.html b/docs/interfaces/IOCapabilitiesExtension.html deleted file mode 100644 index ae5266f6..00000000 --- a/docs/interfaces/IOCapabilitiesExtension.html +++ /dev/null @@ -1,4 +0,0 @@ -IOCapabilitiesExtension | onvif

    Interface IOCapabilitiesExtension

    interface IOCapabilitiesExtension {
        auxiliary?: boolean;
        auxiliaryCommands?: Record<string, unknown>;
        extension?: any;
    }

    Properties

    auxiliary?: boolean
    auxiliaryCommands?: Record<string, unknown>
    extension?: any
    \ No newline at end of file diff --git a/docs/interfaces/ImageStabilization.html b/docs/interfaces/ImageStabilization.html index a642faf0..ac1a5817 100644 --- a/docs/interfaces/ImageStabilization.html +++ b/docs/interfaces/ImageStabilization.html @@ -1,6 +1,6 @@ -ImageStabilization | onvif

    Interface ImageStabilization

    interface ImageStabilization {
        extension?: any;
        level?: number;
        mode:
            | "OFF"
            | "ON"
            | "AUTO"
            | "Extended";
    }

    Properties

    extension? +ImageStabilization | onvif

    Interface ImageStabilization

    interface ImageStabilization {
        extension?: any;
        level?: number;
        mode:
            | "OFF"
            | "ON"
            | "AUTO"
            | "Extended";
    }

    Properties

    Properties

    extension?: any
    level?: number

    Optional level parameter (unit unspecified)

    -
    mode:
        | "OFF"
        | "ON"
        | "AUTO"
        | "Extended"

    Parameter to enable/disable Image Stabilization feature

    -
    \ No newline at end of file +

    Properties

    extension?: any
    level?: number

    Optional level parameter (unit unspecified)

    +
    mode:
        | "OFF"
        | "ON"
        | "AUTO"
        | "Extended"

    Parameter to enable/disable Image Stabilization feature

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingCapabilities.html b/docs/interfaces/ImagingCapabilities.html deleted file mode 100644 index 6c65c705..00000000 --- a/docs/interfaces/ImagingCapabilities.html +++ /dev/null @@ -1,3 +0,0 @@ -ImagingCapabilities | onvif

    Interface ImagingCapabilities

    interface ImagingCapabilities {
        XAddr: string;
    }

    Properties

    Properties

    XAddr: string

    Imaging service URI

    -
    \ No newline at end of file diff --git a/docs/interfaces/ImagingSettings.html b/docs/interfaces/ImagingSettings.html index a574cc05..027f1af8 100644 --- a/docs/interfaces/ImagingSettings.html +++ b/docs/interfaces/ImagingSettings.html @@ -1,4 +1,4 @@ -ImagingSettings | onvif

    Interface ImagingSettings

    interface ImagingSettings {
        backlightCompensation?: BacklightCompensation;
        brightness?: number;
        colorSaturation?: number;
        contrast?: number;
        exposure?: Exposure;
        extension?: any;
        focus?: FocusConfiguration;
        irCutFilter?: "OFF" | "ON" | "AUTO";
        sharpness?: number;
        whiteBalance?: WhiteBalance;
        wideDynamicRange?: WideDynamicRange;
    }

    Properties

    backlightCompensation? +ImagingSettings | onvif

    Interface ImagingSettings

    interface ImagingSettings {
        backlightCompensation?: BacklightCompensation;
        brightness?: number;
        colorSaturation?: number;
        contrast?: number;
        exposure?: Exposure;
        extension?: any;
        focus?: FocusConfiguration;
        irCutFilter?: "OFF" | "ON" | "AUTO";
        sharpness?: number;
        whiteBalance?: WhiteBalance;
        wideDynamicRange?: WideDynamicRange;
    }

    Properties

    backlightCompensation?: BacklightCompensation

    Enabled/disabled BLC mode (on/off)

    -
    brightness?: number

    Image brightness (unit unspecified)

    -
    colorSaturation?: number

    Color saturation of the image (unit unspecified)

    -
    contrast?: number

    Contrast of the image (unit unspecified)

    -
    exposure?: Exposure

    Exposure mode of the device

    -
    extension?: any

    Focus configuration

    -
    irCutFilter?: "OFF" | "ON" | "AUTO"

    Infrared Cutoff Filter settings

    -
    sharpness?: number

    Sharpness of the Video image

    -
    whiteBalance?: WhiteBalance

    White balance settings

    -
    wideDynamicRange?: WideDynamicRange

    WDR settings

    -
    \ No newline at end of file +
    brightness?: number

    Image brightness (unit unspecified)

    +
    colorSaturation?: number

    Color saturation of the image (unit unspecified)

    +
    contrast?: number

    Contrast of the image (unit unspecified)

    +
    exposure?: Exposure

    Exposure mode of the device

    +
    extension?: any

    Focus configuration

    +
    irCutFilter?: "OFF" | "ON" | "AUTO"

    Infrared Cutoff Filter settings

    +
    sharpness?: number

    Sharpness of the Video image

    +
    whiteBalance?: WhiteBalance

    White balance settings

    +
    wideDynamicRange?: WideDynamicRange

    WDR settings

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingSettings20.html b/docs/interfaces/ImagingSettings20.html index 23e31edc..ffb20ec6 100644 --- a/docs/interfaces/ImagingSettings20.html +++ b/docs/interfaces/ImagingSettings20.html @@ -1,4 +1,4 @@ -ImagingSettings20 | onvif

    Interface ImagingSettings20

    interface ImagingSettings20 {
        backlightCompensation?: BacklightCompensation20;
        brightness?: number;
        colorSaturation?: number;
        contrast?: number;
        exposure?: Exposure20;
        extension?: ImagingSettingsExtension20;
        focus?: FocusConfiguration20;
        irCutFilter?: "OFF" | "ON" | "AUTO";
        sharpness?: number;
        whiteBalance?: WhiteBalance20;
        wideDynamicRange?: WideDynamicRange20;
    }

    Properties

    backlightCompensation? +ImagingSettings20 | onvif

    Interface ImagingSettings20

    interface ImagingSettings20 {
        backlightCompensation?: BacklightCompensation20;
        brightness?: number;
        colorSaturation?: number;
        contrast?: number;
        exposure?: Exposure20;
        extension?: ImagingSettingsExtension20;
        focus?: FocusConfiguration20;
        irCutFilter?: "OFF" | "ON" | "AUTO";
        sharpness?: number;
        whiteBalance?: WhiteBalance20;
        wideDynamicRange?: WideDynamicRange20;
    }

    Properties

    backlightCompensation?: BacklightCompensation20

    Enabled/disabled BLC mode (on/off)

    -
    brightness?: number

    Image brightness (unit unspecified)

    -
    colorSaturation?: number

    Color saturation of the image (unit unspecified)

    -
    contrast?: number

    Contrast of the image (unit unspecified)

    -
    exposure?: Exposure20

    Exposure mode of the device

    -

    Focus configuration

    -
    irCutFilter?: "OFF" | "ON" | "AUTO"

    Infrared Cutoff Filter settings

    -
    sharpness?: number

    Sharpness of the Video image

    -
    whiteBalance?: WhiteBalance20

    White balance settings

    -
    wideDynamicRange?: WideDynamicRange20

    WDR settings

    -
    \ No newline at end of file +
    brightness?: number

    Image brightness (unit unspecified)

    +
    colorSaturation?: number

    Color saturation of the image (unit unspecified)

    +
    contrast?: number

    Contrast of the image (unit unspecified)

    +
    exposure?: Exposure20

    Exposure mode of the device

    +

    Focus configuration

    +
    irCutFilter?: "OFF" | "ON" | "AUTO"

    Infrared Cutoff Filter settings

    +
    sharpness?: number

    Sharpness of the Video image

    +
    whiteBalance?: WhiteBalance20

    White balance settings

    +
    wideDynamicRange?: WideDynamicRange20

    WDR settings

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingSettingsExtension20.html b/docs/interfaces/ImagingSettingsExtension20.html index ff41776f..8ac54757 100644 --- a/docs/interfaces/ImagingSettingsExtension20.html +++ b/docs/interfaces/ImagingSettingsExtension20.html @@ -1,4 +1,4 @@ -ImagingSettingsExtension20 | onvif

    Interface ImagingSettingsExtension20

    interface ImagingSettingsExtension20 {
        extension?: ImagingSettingsExtension202;
        imageStabilization?: ImageStabilization;
    }

    Properties

    extension? +ImagingSettingsExtension20 | onvif

    Interface ImagingSettingsExtension20

    interface ImagingSettingsExtension20 {
        extension?: ImagingSettingsExtension202;
        imageStabilization?: ImageStabilization;
    }

    Properties

    imageStabilization?: ImageStabilization

    Optional element to configure Image Stabilization feature

    -
    \ No newline at end of file +

    Properties

    imageStabilization?: ImageStabilization

    Optional element to configure Image Stabilization feature

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingSettingsExtension202.html b/docs/interfaces/ImagingSettingsExtension202.html index 9a75aac1..c9f5a230 100644 --- a/docs/interfaces/ImagingSettingsExtension202.html +++ b/docs/interfaces/ImagingSettingsExtension202.html @@ -1,4 +1,4 @@ -ImagingSettingsExtension202 | onvif

    Interface ImagingSettingsExtension202

    interface ImagingSettingsExtension202 {
        extension?: ImagingSettingsExtension203;
        irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment;
    }

    Properties

    extension? +ImagingSettingsExtension202 | onvif

    Interface ImagingSettingsExtension202

    interface ImagingSettingsExtension202 {
        extension?: ImagingSettingsExtension203;
        irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment;
    }

    Properties

    irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment

    An optional parameter applied to only auto mode to adjust timing of toggling Ir cut filter

    -
    \ No newline at end of file +

    Properties

    irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment

    An optional parameter applied to only auto mode to adjust timing of toggling Ir cut filter

    +
    \ No newline at end of file diff --git a/docs/interfaces/ImagingSettingsExtension203.html b/docs/interfaces/ImagingSettingsExtension203.html index d7573688..926a0033 100644 --- a/docs/interfaces/ImagingSettingsExtension203.html +++ b/docs/interfaces/ImagingSettingsExtension203.html @@ -1,8 +1,8 @@ -ImagingSettingsExtension203 | onvif

    Interface ImagingSettingsExtension203

    interface ImagingSettingsExtension203 {
        defogging?: Defogging;
        extension?: any;
        noiseReduction?: NoiseReduction;
        toneCompensation?: ToneCompensation;
    }

    Properties

    defogging? +ImagingSettingsExtension203 | onvif

    Interface ImagingSettingsExtension203

    interface ImagingSettingsExtension203 {
        defogging?: Defogging;
        extension?: any;
        noiseReduction?: NoiseReduction;
        toneCompensation?: ToneCompensation;
    }

    Properties

    defogging?: Defogging

    Optional element to configure Image Defogging

    -
    extension?: any
    noiseReduction?: NoiseReduction

    Optional element to configure Image Noise Reduction

    -
    toneCompensation?: ToneCompensation

    Optional element to configure Image Contrast Compensation

    -
    \ No newline at end of file +
    extension?: any
    noiseReduction?: NoiseReduction

    Optional element to configure Image Noise Reduction

    +
    toneCompensation?: ToneCompensation

    Optional element to configure Image Contrast Compensation

    +
    \ No newline at end of file diff --git a/docs/interfaces/IntRectangle.html b/docs/interfaces/IntRectangle.html index be796d7e..b2eaf105 100644 --- a/docs/interfaces/IntRectangle.html +++ b/docs/interfaces/IntRectangle.html @@ -1,5 +1,5 @@ -IntRectangle | onvif

    Interface IntRectangle

    interface IntRectangle {
        height: number;
        width: number;
        x: number;
        y: number;
    }

    Properties

    height +IntRectangle | onvif

    Interface IntRectangle

    interface IntRectangle {
        height: number;
        width: number;
        x: number;
        y: number;
    }

    Properties

    Properties

    height: number
    width: number
    x: number
    y: number
    \ No newline at end of file +

    Properties

    height: number
    width: number
    x: number
    y: number
    \ No newline at end of file diff --git a/docs/interfaces/IrCutFilterAutoAdjustment.html b/docs/interfaces/IrCutFilterAutoAdjustment.html index 0350bbc2..a2fb3432 100644 --- a/docs/interfaces/IrCutFilterAutoAdjustment.html +++ b/docs/interfaces/IrCutFilterAutoAdjustment.html @@ -1,10 +1,10 @@ -IrCutFilterAutoAdjustment | onvif

    Interface IrCutFilterAutoAdjustment

    interface IrCutFilterAutoAdjustment {
        boundaryOffset?: number;
        boundaryType: string;
        extension?: any;
        responseTime?: string;
    }

    Properties

    boundaryOffset? +IrCutFilterAutoAdjustment | onvif

    Interface IrCutFilterAutoAdjustment

    interface IrCutFilterAutoAdjustment {
        boundaryOffset?: number;
        boundaryType: string;
        extension?: any;
        responseTime?: string;
    }

    Properties

    boundaryOffset?: number

    Adjusts boundary exposure level for toggling Ir cut filter to on/off specified with unitless normalized value from +1.0 to -1.0. Zero is default and -1.0 is the darkest adjustment (Unitless).

    -
    boundaryType: string

    Specifies which boundaries to automatically toggle Ir cut filter following parameters are applied to. +

    boundaryType: string

    Specifies which boundaries to automatically toggle Ir cut filter following parameters are applied to. Its options shall be chosen from tt:IrCutFilterAutoBoundaryType

    -
    extension?: any
    responseTime?: string

    Delay time of toggling Ir cut filter to on/off after crossing of the boundary exposure levels

    -
    \ No newline at end of file +
    extension?: any
    responseTime?: string

    Delay time of toggling Ir cut filter to on/off after crossing of the boundary exposure levels

    +
    \ No newline at end of file diff --git a/docs/interfaces/ItemList.html b/docs/interfaces/ItemList.html index 8f261b58..29a5edd6 100644 --- a/docs/interfaces/ItemList.html +++ b/docs/interfaces/ItemList.html @@ -1,8 +1,8 @@ -ItemList | onvif

    Interface ItemList

    interface ItemList {
        elementItem?: any;
        extension: any;
        simpleItem?: {
            name: string;
            value: any;
        };
    }

    Properties

    elementItem? +ItemList | onvif

    Interface ItemList

    interface ItemList {
        elementItem?: any;
        extension: any;
        simpleItem?: {
            name: string;
            value: any;
        };
    }

    Properties

    elementItem?: any

    Complex value structure

    -
    extension: any
    simpleItem?: {
        name: string;
        value: any;
    }

    Value name pair as defined by the corresponding description

    +
    extension: any
    simpleItem?: {
        name: string;
        value: any;
    }

    Value name pair as defined by the corresponding description

    Type declaration

    • name: string

      Item name

    • value: any

      Item value. The type is defined in the corresponding description

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/LensDescription.html b/docs/interfaces/LensDescription.html index d3c947eb..2fe3ca20 100644 --- a/docs/interfaces/LensDescription.html +++ b/docs/interfaces/LensDescription.html @@ -1,12 +1,12 @@ -LensDescription | onvif

    Interface LensDescription

    interface LensDescription {
        XFactor: number;
        focalLength: number;
        offset: LensOffset;
        projection: LensProjection;
    }

    Properties

    XFactor +LensDescription | onvif

    Interface LensDescription

    interface LensDescription {
        XFactor: number;
        focalLength: number;
        offset: LensOffset;
        projection: LensProjection;
    }

    Properties

    XFactor: number

    Compensation of the x coordinate needed for the ONVIF normalized coordinate system

    -
    focalLength: number

    Optional focal length of the optical system

    -
    offset: LensOffset

    Offset of the lens center to the imager center in normalized coordinates

    -
    projection: LensProjection

    Radial description of the projection characteristics. +

    focalLength: number

    Optional focal length of the optical system

    +
    offset: LensOffset

    Offset of the lens center to the imager center in normalized coordinates

    +
    projection: LensProjection

    Radial description of the projection characteristics. The resulting curve is defined by the B-Spline interpolation over the given elements. The element for Radius zero shall not be provided. The projection points shall be ordered with ascending Radius. Items outside the last projection Radius shall be assumed to be invisible (black)

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/LensOffset.html b/docs/interfaces/LensOffset.html index deb3d473..91fc00d8 100644 --- a/docs/interfaces/LensOffset.html +++ b/docs/interfaces/LensOffset.html @@ -1,5 +1,5 @@ -LensOffset | onvif

    Interface LensOffset

    interface LensOffset {
        x: number;
        y: number;
    }

    Properties

    x +LensOffset | onvif

    Interface LensOffset

    interface LensOffset {
        x: number;
        y: number;
    }

    Properties

    x y

    Properties

    x: number

    Optional horizontal offset of the lens center in normalized coordinates

    -
    y: number

    Optional vertical offset of the lens center in normalized coordinates

    -
    \ No newline at end of file +
    y: number

    Optional vertical offset of the lens center in normalized coordinates

    +
    \ No newline at end of file diff --git a/docs/interfaces/LensProjection.html b/docs/interfaces/LensProjection.html index 226c5b49..186fdd3d 100644 --- a/docs/interfaces/LensProjection.html +++ b/docs/interfaces/LensProjection.html @@ -1,7 +1,7 @@ -LensProjection | onvif

    Interface LensProjection

    interface LensProjection {
        angle: number;
        radius: number;
        transmittance?: number;
    }

    Properties

    angle +LensProjection | onvif

    Interface LensProjection

    interface LensProjection {
        angle: number;
        radius: number;
        transmittance?: number;
    }

    Properties

    angle: number

    Angle of incidence

    -
    radius: number

    Mapping radius as a consequence of the emergent angle

    -
    transmittance?: number

    Optional ray absorption at the given angle due to vignetting. A value of one means no absorption

    -
    \ No newline at end of file +
    radius: number

    Mapping radius as a consequence of the emergent angle

    +
    transmittance?: number

    Optional ray absorption at the given angle due to vignetting. A value of one means no absorption

    +
    \ No newline at end of file diff --git a/docs/interfaces/MediaCapabilities.html b/docs/interfaces/MediaCapabilities.html deleted file mode 100644 index 1917cd2e..00000000 --- a/docs/interfaces/MediaCapabilities.html +++ /dev/null @@ -1,6 +0,0 @@ -MediaCapabilities | onvif

    Interface MediaCapabilities

    interface MediaCapabilities {
        XAddr: string;
        extension?: MediaCapabilitiesExtension;
        streamingCapabilities: RealTimeStreamingCapabilities;
    }

    Properties

    XAddr: string

    Media service URI

    -
    streamingCapabilities: RealTimeStreamingCapabilities

    Streaming capabilities

    -
    \ No newline at end of file diff --git a/docs/interfaces/MediaCapabilitiesExtension.html b/docs/interfaces/MediaCapabilitiesExtension.html deleted file mode 100644 index 81e6819a..00000000 --- a/docs/interfaces/MediaCapabilitiesExtension.html +++ /dev/null @@ -1,2 +0,0 @@ -MediaCapabilitiesExtension | onvif

    Interface MediaCapabilitiesExtension

    interface MediaCapabilitiesExtension {
        profileCapabilities: ProfileCapabilities;
    }

    Properties

    profileCapabilities: ProfileCapabilities
    \ No newline at end of file diff --git a/docs/interfaces/MediaProfile.html b/docs/interfaces/MediaProfile.html index 55d69eab..7f177940 100644 --- a/docs/interfaces/MediaProfile.html +++ b/docs/interfaces/MediaProfile.html @@ -1,9 +1,9 @@ -MediaProfile | onvif

    Interface MediaProfile

    interface MediaProfile {
        configurations: ConfigurationSet;
        fixed: boolean;
        name: string;
        token: string;
    }

    Properties

    configurations +MediaProfile | onvif

    Interface MediaProfile

    interface MediaProfile {
        configurations: ConfigurationSet;
        fixed: boolean;
        name: string;
        token: string;
    }

    Properties

    configurations: ConfigurationSet

    The configurations assigned to the profile

    -
    fixed: boolean

    A value of true signals that the profile cannot be deleted. Default is false

    -
    name: string

    User readable name of the profile

    -
    token: string

    Unique identifier of the profile

    -
    \ No newline at end of file +
    fixed: boolean

    A value of true signals that the profile cannot be deleted. Default is false

    +
    name: string

    User readable name of the profile

    +
    token: string

    Unique identifier of the profile

    +
    \ No newline at end of file diff --git a/docs/interfaces/MetadataConfiguration.html b/docs/interfaces/MetadataConfiguration.html index 32f9da43..d9c55334 100644 --- a/docs/interfaces/MetadataConfiguration.html +++ b/docs/interfaces/MetadataConfiguration.html @@ -1,4 +1,4 @@ -MetadataConfiguration | onvif

    Interface MetadataConfiguration

    interface MetadataConfiguration {
        PTZStatus?: PTZFilter;
        analytics?: boolean;
        analyticsEngineConfiguration?: AnalyticsEngineConfiguration;
        compressionType: string;
        events: EventSubscription;
        extension?: any;
        geoLocation: boolean;
        multicast: MulticastConfiguration;
        name: string;
        sessionTimeout: string;
        shapePolygon: boolean;
        token: string;
        useCount: number;
    }

    Properties

    PTZStatus? +MetadataConfiguration | onvif

    Interface MetadataConfiguration

    interface MetadataConfiguration {
        PTZStatus?: PTZFilter;
        analytics?: boolean;
        analyticsEngineConfiguration?: AnalyticsEngineConfiguration;
        compressionType: string;
        events: EventSubscription;
        extension?: any;
        geoLocation: boolean;
        multicast: MulticastConfiguration;
        name: string;
        sessionTimeout: string;
        shapePolygon: boolean;
        token: string;
        useCount: number;
    }

    Properties

    PTZStatus?: PTZFilter

    Optional element to configure which PTZ related data is to include in the metadata stream

    -
    analytics?: boolean

    Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.)

    -
    analyticsEngineConfiguration?: AnalyticsEngineConfiguration

    Indication which AnalyticsModules shall output metadata. +

    analytics?: boolean

    Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.)

    +
    analyticsEngineConfiguration?: AnalyticsEngineConfiguration

    Indication which AnalyticsModules shall output metadata. Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration

    -
    compressionType: string

    Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType

    -

    Optional element to configure the streaming of events. +

    compressionType: string

    Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType

    +

    Optional element to configure the streaming of events. A client might be interested in receiving all, none or some of the events produced by the device:

    • To get all events: Include the Events element but do not include a filter
    • To get no events: Do not include the Events element
    • To get only some events: Include the Events element and include a filter in the element
    -
    extension?: any
    geoLocation: boolean

    Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target

    -

    Defines the multicast settings that could be used for video streaming

    -
    name: string

    User readable name. Length up to 64 characters

    -
    sessionTimeout: string

    The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored)

    -
    shapePolygon: boolean

    Optional parameter to configure if the generated metadata stream should contain shape information as polygon

    -
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount: number

    Number of internal references currently using this configuration. +

    extension?: any
    geoLocation: boolean

    Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target

    +

    Defines the multicast settings that could be used for video streaming

    +
    name: string

    User readable name. Length up to 64 characters

    +
    sessionTimeout: string

    The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored)

    +
    shapePolygon: boolean

    Optional parameter to configure if the generated metadata stream should contain shape information as polygon

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/Mpeg4Configuration.html b/docs/interfaces/Mpeg4Configuration.html index 850e99e2..1829942c 100644 --- a/docs/interfaces/Mpeg4Configuration.html +++ b/docs/interfaces/Mpeg4Configuration.html @@ -1,7 +1,7 @@ -Mpeg4Configuration | onvif

    Interface Mpeg4Configuration

    interface Mpeg4Configuration {
        govLength: number;
        mpeg4Profile: "SP" | "ASP";
    }

    Properties

    govLength +Mpeg4Configuration | onvif

    Interface Mpeg4Configuration

    interface Mpeg4Configuration {
        govLength: number;
        mpeg4Profile: "SP" | "ASP";
    }

    Properties

    govLength: number

    Determines the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames

    -
    mpeg4Profile: "SP" | "ASP"

    The Mpeg4 profile, either simple profile (SP) or advanced simple profile (ASP)

    -
    \ No newline at end of file +
    mpeg4Profile: "SP" | "ASP"

    The Mpeg4 profile, either simple profile (SP) or advanced simple profile (ASP)

    +
    \ No newline at end of file diff --git a/docs/interfaces/MulticastConfiguration.html b/docs/interfaces/MulticastConfiguration.html index b18e73df..fc7cfcbe 100644 --- a/docs/interfaces/MulticastConfiguration.html +++ b/docs/interfaces/MulticastConfiguration.html @@ -1,14 +1,14 @@ -MulticastConfiguration | onvif

    Interface MulticastConfiguration

    interface MulticastConfiguration {
        TTL: number;
        address: IPAddress;
        autoStart: boolean;
        port: number;
    }

    Properties

    TTL +MulticastConfiguration | onvif

    Interface MulticastConfiguration

    interface MulticastConfiguration {
        TTL: number;
        address: IPAddress;
        autoStart: boolean;
        port: number;
    }

    Properties

    TTL: number

    In case of IPv6 the TTL value is assumed as the hop limit. Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets from (endlessly) circulating and not limiting scope. In these cases the address contains the scope

    -
    address: IPAddress

    The multicast address (if this address is set to 0 no multicast streaming is enaled)

    -
    autoStart: boolean

    Read only property signalling that streaming is persistant. +

    address: IPAddress

    The multicast address (if this address is set to 0 no multicast streaming is enaled)

    +
    autoStart: boolean

    Read only property signalling that streaming is persistant. Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state.

    -
    port: number

    The RTP mutlicast destination port. A device may support RTCP. +

    port: number

    The RTP mutlicast destination port. A device may support RTCP. In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) destination port number as defined in the RTSP specification

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/NetworkCapabilities.html b/docs/interfaces/NetworkCapabilities.html deleted file mode 100644 index 132ff820..00000000 --- a/docs/interfaces/NetworkCapabilities.html +++ /dev/null @@ -1,21 +0,0 @@ -NetworkCapabilities | onvif

    Interface NetworkCapabilities

    Network capabilities

    -
    interface NetworkCapabilities {
        DHCPv6: boolean;
        IPFilter?: boolean;
        IPVersion6?: boolean;
        NTP: number;
        dot11Configuration?: boolean;
        dot1XConfigurations?: number;
        dynDNS?: boolean;
        extension: NetworkCapabilitiesExtension;
        hostnameFromDHCP?: boolean;
        zeroConfiguration?: boolean;
    }

    Properties

    DHCPv6: boolean

    Indicates support for Stateful IPv6 DHCP

    -
    IPFilter?: boolean

    Indicates support for IP filtering

    -
    IPVersion6?: boolean

    Indicates support for IPv6

    -
    NTP: number

    Maximum number of NTP servers supported by the devices SetNTP command

    -
    dot11Configuration?: boolean

    Indicates support for IEEE 802.11 configuration

    -
    dot1XConfigurations?: number

    Indicates the maximum number of Dot1X configurations supported by the device

    -
    dynDNS?: boolean

    Indicates support for dynamic DNS configuration

    -
    hostnameFromDHCP?: boolean

    Indicates support for retrieval of hostname from DHCP

    -
    zeroConfiguration?: boolean

    Indicates support for zeroconf

    -
    \ No newline at end of file diff --git a/docs/interfaces/NetworkCapabilitiesExtension.html b/docs/interfaces/NetworkCapabilitiesExtension.html deleted file mode 100644 index efc2b65d..00000000 --- a/docs/interfaces/NetworkCapabilitiesExtension.html +++ /dev/null @@ -1,3 +0,0 @@ -NetworkCapabilitiesExtension | onvif

    Interface NetworkCapabilitiesExtension

    interface NetworkCapabilitiesExtension {
        dot11Configuration?: boolean;
        extension?: any;
    }

    Properties

    dot11Configuration?: boolean
    extension?: any
    \ No newline at end of file diff --git a/docs/interfaces/NoiseReduction.html b/docs/interfaces/NoiseReduction.html index 81ac04f1..61198a76 100644 --- a/docs/interfaces/NoiseReduction.html +++ b/docs/interfaces/NoiseReduction.html @@ -1,4 +1,4 @@ -NoiseReduction | onvif

    Interface NoiseReduction

    interface NoiseReduction {
        level: number;
    }

    Properties

    level +NoiseReduction | onvif

    Interface NoiseReduction

    interface NoiseReduction {
        level: number;
    }

    Properties

    Properties

    level: number

    Level parameter specified with unitless normalized value from 0.0 to +1.0. Level=0 means no noise reduction or minimal noise reduction

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/OnvifOptions.html b/docs/interfaces/OnvifOptions.html index ca4cc728..41bbd8e8 100644 --- a/docs/interfaces/OnvifOptions.html +++ b/docs/interfaces/OnvifOptions.html @@ -1,5 +1,5 @@ OnvifOptions | onvif

    Interface OnvifOptions

    Cam constructor options

    -
    interface OnvifOptions {
        agent?: boolean | Agent;
        autoConnect?: boolean;
        hostname: string;
        password?: string;
        path?: string;
        port?: number;
        preserveAddress?: boolean;
        secureOptions?: SecureContextOptions;
        timeout?: number;
        urn?: string;
        useSecure?: boolean;
        username?: string;
    }

    Properties

    interface OnvifOptions {
        agent?: boolean | Agent;
        autoConnect?: boolean;
        hostname: string;
        password?: string;
        path?: string;
        port?: number;
        preserveAddress?: boolean;
        secureOptions?: SecureContextOptions;
        timeout?: number;
        urn?: string;
        useSecure?: boolean;
        username?: string;
    }

    Properties

    agent?: boolean | Agent

    Supports things like https://www.npmjs.com/package/proxy-agent which provide SOCKS5 and other connections.

    -
    autoConnect?: boolean

    Set false if the camera should not connect automatically, defaults false.

    -
    hostname: string
    password?: string
    path?: string
    port?: number
    preserveAddress?: boolean

    Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false.

    -
    secureOptions?: SecureContextOptions

    Set options for https like ca, cert, ciphers, rejectUnauthorized, secureOptions, secureProtocol, etc.

    -
    timeout?: number
    urn?: string
    useSecure?: boolean

    Set true if using https protocol, defaults to false.

    -
    username?: string
    \ No newline at end of file +
    autoConnect?: boolean

    Set false if the camera should not connect automatically, defaults false.

    +
    hostname: string
    password?: string
    path?: string
    port?: number
    preserveAddress?: boolean

    Force using hostname and port from constructor for the services (ex.: for proxying), defaults to false.

    +
    secureOptions?: SecureContextOptions

    Set options for https like ca, cert, ciphers, rejectUnauthorized, secureOptions, secureProtocol, etc.

    +
    timeout?: number
    urn?: string
    useSecure?: boolean

    Set true if using https protocol, defaults to false.

    +
    username?: string
    \ No newline at end of file diff --git a/docs/interfaces/OnvifRequestOptions.html b/docs/interfaces/OnvifRequestOptions.html index d4c4e8c6..54791b84 100644 --- a/docs/interfaces/OnvifRequestOptions.html +++ b/docs/interfaces/OnvifRequestOptions.html @@ -1,176 +1,9 @@ -OnvifRequestOptions | onvif

    Interface OnvifRequestOptions

    interface OnvifRequestOptions {
        ALPNCallback?: ((arg: {
            protocols: string[];
            servername: string;
        }) => undefined | string);
        _defaultAgent?: Agent;
        agent?: boolean | Agent;
        auth?: null | string;
        body: string;
        ca?: string | Buffer | (string | Buffer)[];
        cert?: string | Buffer | (string | Buffer)[];
        checkServerIdentity?: ((hostname: string, cert: PeerCertificate) => Error | undefined);
        ciphers?: string;
        clientCertEngine?: string;
        createConnection?: ((options: ClientRequestArgs, oncreate: ((err: null | Error, socket: Duplex) => void)) => undefined | null | Duplex);
        crl?: string | Buffer | (string | Buffer)[];
        defaultPort?: string | number;
        dhparam?: string | Buffer;
        ecdhCurve?: string;
        family?: number;
        headers?: OutgoingHttpHeaders;
        hints?: number;
        honorCipherOrder?: boolean;
        host?: null | string;
        hostname?: null | string;
        insecureHTTPParser?: boolean;
        joinDuplicateHeaders?: boolean;
        key?: string | Buffer | (string | Buffer | KeyObject)[];
        localAddress?: string;
        localPort?: number;
        lookup?: LookupFunction;
        maxHeaderSize?: number;
        maxVersion?: SecureVersion;
        method?: string;
        minVersion?: SecureVersion;
        passphrase?: string;
        path?: null | string;
        pfx?: string | Buffer | (string | Buffer | PxfObject)[];
        port?: null | string | number;
        privateKeyEngine?: string;
        privateKeyIdentifier?: string;
        protocol?: null | string;
        ptz?: boolean;
        rejectUnauthorized?: boolean;
        secureOptions?: number;
        secureProtocol?: string;
        servername?: string;
        service?: keyof OnvifServices;
        sessionIdContext?: string;
        sessionTimeout?: number;
        setHost?: boolean;
        sigalgs?: string;
        signal?: AbortSignal;
        socketPath?: string;
        ticketKeys?: Buffer;
        timeout?: number;
        uniqueHeaders?: (string | string[])[];
        url?: string;
    }

    Hierarchy

    • RequestOptions
      • OnvifRequestOptions

    Properties

    ALPNCallback? -_defaultAgent? -agent? -auth? -body -ca? -cert? -checkServerIdentity? -ciphers? -clientCertEngine? -createConnection? -crl? -defaultPort? -dhparam? -ecdhCurve? -family? -headers? -hints? -honorCipherOrder? -host? -hostname? -insecureHTTPParser? -joinDuplicateHeaders? -key? -localAddress? -localPort? -lookup? -maxHeaderSize? -maxVersion? -method? -minVersion? -passphrase? -path? -pfx? -port? -privateKeyEngine? -privateKeyIdentifier? -protocol? +OnvifRequestOptions | onvif

    Interface OnvifRequestOptions

    interface OnvifRequestOptions {
        body: string;
        ptz?: boolean;
        service?: keyof OnvifServices;
        url?: string;
    }

    Hierarchy

    • RequestOptions
      • OnvifRequestOptions

    Properties

    ALPNCallback?: ((arg: {
        protocols: string[];
        servername: string;
    }) => undefined | string)

    If set, this will be called when a client opens a connection using the ALPN extension. -One argument will be passed to the callback: an object containing servername and protocols fields, -respectively containing the server name from the SNI extension (if any) and an array of -ALPN protocol name strings. The callback must return either one of the strings listed in protocols, -which will be returned to the client as the selected ALPN protocol, or undefined, -to reject the connection with a fatal alert. If a string is returned that does not match one of -the client's ALPN protocols, an error will be thrown. -This option cannot be used with the ALPNProtocols option, and setting both options will throw an error.

    -
    _defaultAgent?: Agent
    agent?: boolean | Agent
    auth?: null | string
    body: string

    SOAP body

    -
    ca?: string | Buffer | (string | Buffer)[]

    Optionally override the trusted CA certificates. Default is to trust -the well-known CAs curated by Mozilla. Mozilla's CAs are completely -replaced when CAs are explicitly specified using this option.

    -
    cert?: string | Buffer | (string | Buffer)[]

    Cert chains in PEM format. One cert chain should be provided per -private key. Each cert chain should consist of the PEM formatted -certificate for a provided private key, followed by the PEM -formatted intermediate certificates (if any), in order, and not -including the root CA (the root CA must be pre-known to the peer, -see ca). When providing multiple cert chains, they do not have to -be in the same order as their private keys in key. If the -intermediate certificates are not provided, the peer will not be -able to validate the certificate, and the handshake will fail.

    -
    checkServerIdentity?: ((hostname: string, cert: PeerCertificate) => Error | undefined)

    Type declaration

      • (hostname, cert): Error | undefined
      • Verifies the certificate cert is issued to hostname.

        -

        Returns Error object, populating it with reason, host, and cert on -failure. On success, returns undefined.

        -

        This function is intended to be used in combination with thecheckServerIdentity option that can be passed to connect and as -such operates on a certificate object. For other purposes, consider using x509.checkHost() instead.

        -

        This function can be overwritten by providing an alternative function as the options.checkServerIdentity option that is passed to tls.connect(). The -overwriting function can call tls.checkServerIdentity() of course, to augment -the checks done with additional verification.

        -

        This function is only called if the certificate passed all other checks, such as -being issued by trusted CA (options.ca).

        -

        Earlier versions of Node.js incorrectly accepted certificates for a givenhostname if a matching uniformResourceIdentifier subject alternative name -was present (see CVE-2021-44531). Applications that wish to acceptuniformResourceIdentifier subject alternative names can use -a custom options.checkServerIdentity function that implements the desired behavior.

        -

        Parameters

        • hostname: string

          The host name or IP address to verify the certificate against.

          -
        • cert: PeerCertificate

          A certificate object representing the peer's certificate.

          -

        Returns Error | undefined

        v0.8.4

        -
    ciphers?: string

    Cipher suite specification, replacing the default. For more -information, see modifying the default cipher suite. Permitted -ciphers can be obtained via tls.getCiphers(). Cipher names must be -uppercased in order for OpenSSL to accept them.

    -
    clientCertEngine?: string

    Name of an OpenSSL engine which can provide the client certificate.

    -
    createConnection?: ((options: ClientRequestArgs, oncreate: ((err: null | Error, socket: Duplex) => void)) => undefined | null | Duplex)
    crl?: string | Buffer | (string | Buffer)[]

    PEM formatted CRLs (Certificate Revocation Lists).

    -
    defaultPort?: string | number
    dhparam?: string | Buffer

    'auto' or custom Diffie-Hellman parameters, required for non-ECDHE perfect forward secrecy. -If omitted or invalid, the parameters are silently discarded and DHE ciphers will not be available. -ECDHE-based perfect forward secrecy will still be available.

    -
    ecdhCurve?: string

    A string describing a named curve or a colon separated list of curve -NIDs or names, for example P-521:P-384:P-256, to use for ECDH key -agreement. Set to auto to select the curve automatically. Use -crypto.getCurves() to obtain a list of available curve names. On -recent releases, openssl ecparam -list_curves will also display the -name and description of each available elliptic curve. Default: -tls.DEFAULT_ECDH_CURVE.

    -
    family?: number
    headers?: OutgoingHttpHeaders
    hints?: number
    honorCipherOrder?: boolean

    Attempt to use the server's cipher suite preferences instead of the -client's. When true, causes SSL_OP_CIPHER_SERVER_PREFERENCE to be -set in secureOptions

    -
    host?: null | string
    hostname?: null | string
    insecureHTTPParser?: boolean
    joinDuplicateHeaders?: boolean
    key?: string | Buffer | (string | Buffer | KeyObject)[]

    Private keys in PEM format. PEM allows the option of private keys -being encrypted. Encrypted keys will be decrypted with -options.passphrase. Multiple keys using different algorithms can be -provided either as an array of unencrypted key strings or buffers, -or an array of objects in the form {pem: <string|buffer>[, -passphrase: ]}. The object form can only occur in an array. -object.passphrase is optional. Encrypted keys will be decrypted with -object.passphrase if provided, or options.passphrase if it is not.

    -
    localAddress?: string
    localPort?: number
    lookup?: LookupFunction
    maxHeaderSize?: number
    16384
    -
    - -
    maxVersion?: SecureVersion

    Optionally set the maximum TLS version to allow. One -of 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Cannot be specified along with the -secureProtocol option, use one or the other. -Default: 'TLSv1.3', unless changed using CLI options. Using ---tls-max-v1.2 sets the default to 'TLSv1.2'. Using --tls-max-v1.3 sets the default to -'TLSv1.3'. If multiple of the options are provided, the highest maximum is used.

    -
    method?: string
    minVersion?: SecureVersion

    Optionally set the minimum TLS version to allow. One -of 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Cannot be specified along with the -secureProtocol option, use one or the other. It is not recommended to use -less than TLSv1.2, but it may be required for interoperability. -Default: 'TLSv1.2', unless changed using CLI options. Using ---tls-v1.0 sets the default to 'TLSv1'. Using --tls-v1.1 sets the default to -'TLSv1.1'. Using --tls-min-v1.3 sets the default to -'TLSv1.3'. If multiple of the options are provided, the lowest minimum is used.

    -
    passphrase?: string

    Shared passphrase used for a single private key and/or a PFX.

    -
    path?: null | string
    pfx?: string | Buffer | (string | Buffer | PxfObject)[]

    PFX or PKCS12 encoded private key and certificate chain. pfx is an -alternative to providing key and cert individually. PFX is usually -encrypted, if it is, passphrase will be used to decrypt it. Multiple -PFX can be provided either as an array of unencrypted PFX buffers, -or an array of objects in the form {buf: <string|buffer>[, -passphrase: ]}. The object form can only occur in an array. -object.passphrase is optional. Encrypted PFX will be decrypted with -object.passphrase if provided, or options.passphrase if it is not.

    -
    port?: null | string | number
    privateKeyEngine?: string

    Name of an OpenSSL engine to get private key from. Should be used -together with privateKeyIdentifier.

    -
    privateKeyIdentifier?: string

    Identifier of a private key managed by an OpenSSL engine. Should be -used together with privateKeyEngine. Should not be set together with -key, because both options define a private key in different ways.

    -
    protocol?: null | string
    ptz?: boolean

    Make request to PTZ uri or not

    -
    rejectUnauthorized?: boolean
    secureOptions?: number

    Optionally affect the OpenSSL protocol behavior, which is not -usually necessary. This should be used carefully if at all! Value is -a numeric bitmask of the SSL_OP_* options from OpenSSL Options

    -
    secureProtocol?: string

    Legacy mechanism to select the TLS protocol version to use, it does -not support independent control of the minimum and maximum version, -and does not support limiting the protocol to TLSv1.3. Use -minVersion and maxVersion instead. The possible values are listed as -SSL_METHODS, use the function names as strings. For example, use -'TLSv1_1_method' to force TLS version 1.1, or 'TLS_method' to allow -any TLS protocol version up to TLSv1.3. It is not recommended to use -TLS versions less than 1.2, but it may be required for -interoperability. Default: none, see minVersion.

    -
    servername?: string
    service?: keyof OnvifServices

    Name of service (ptz, media, etc)

    -
    sessionIdContext?: string

    Opaque identifier used by servers to ensure session state is not -shared between applications. Unused by clients.

    -
    sessionTimeout?: number

    The number of seconds after which a TLS session created by the -server will no longer be resumable. See Session Resumption for more -information. Default: 300.

    -
    setHost?: boolean
    sigalgs?: string

    Colon-separated list of supported signature algorithms. The list -can contain digest algorithms (SHA256, MD5 etc.), public key -algorithms (RSA-PSS, ECDSA etc.), combination of both (e.g -'RSA+SHA384') or TLS v1.3 scheme names (e.g. rsa_pss_pss_sha512).

    -
    signal?: AbortSignal
    socketPath?: string
    ticketKeys?: Buffer

    48-bytes of cryptographically strong pseudo-random data. -See Session Resumption for more information.

    -
    timeout?: number
    uniqueHeaders?: (string | string[])[]
    url?: string

    Defines another url to request

    -
    \ No newline at end of file +

    Properties

    body: string

    SOAP body

    +
    ptz?: boolean

    Make request to PTZ uri or not

    +
    service?: keyof OnvifServices

    Name of service (ptz, media, etc)

    +
    url?: string

    Defines another url to request

    +
    \ No newline at end of file diff --git a/docs/interfaces/OnvifServices.html b/docs/interfaces/OnvifServices.html index b86e99c5..42b3acd1 100644 --- a/docs/interfaces/OnvifServices.html +++ b/docs/interfaces/OnvifServices.html @@ -1,4 +1,4 @@ -OnvifServices | onvif

    Interface OnvifServices

    interface OnvifServices {
        PTZ?: URL;
        analyticsDevice?: URL;
        device?: URL;
        deviceIO?: URL;
        display?: URL;
        events?: URL;
        imaging?: URL;
        media?: URL;
        media2?: URL;
        receiver?: URL;
        recording?: URL;
        replay?: URL;
        search?: URL;
    }

    Properties

    PTZ? +OnvifServices | onvif

    Interface OnvifServices

    interface OnvifServices {
        PTZ?: URL;
        analyticsDevice?: URL;
        device?: URL;
        deviceIO?: URL;
        display?: URL;
        events?: URL;
        imaging?: URL;
        media?: URL;
        media2?: URL;
        receiver?: URL;
        recording?: URL;
        replay?: URL;
        search?: URL;
        [key: string]: URL | undefined;
    }

    Indexable

    • [key: string]: URL | undefined

    Properties

    PTZ?: URL
    analyticsDevice?: URL
    device?: URL
    deviceIO?: URL
    display?: URL
    events?: URL
    imaging?: URL
    media?: URL
    media2?: URL
    receiver?: URL
    recording?: URL
    replay?: URL
    search?: URL
    \ No newline at end of file +

    Properties

    PTZ?: URL
    analyticsDevice?: URL
    device?: URL
    deviceIO?: URL
    display?: URL
    events?: URL
    imaging?: URL
    media?: URL
    media2?: URL
    receiver?: URL
    recording?: URL
    replay?: URL
    search?: URL
    \ No newline at end of file diff --git a/docs/interfaces/OnvifVersion.html b/docs/interfaces/OnvifVersion.html deleted file mode 100644 index 28bb73f2..00000000 --- a/docs/interfaces/OnvifVersion.html +++ /dev/null @@ -1,7 +0,0 @@ -OnvifVersion | onvif

    Interface OnvifVersion

    interface OnvifVersion {
        major: number;
        minor: number;
    }

    Properties

    Properties

    major: number

    Major version number

    -
    minor: number

    Two digit minor version number. -If major version number is less than "16", X.0.1 maps to "01" and X.2.1 maps to "21" where X stands for Major version number. -Otherwise, minor number is month of release, such as "06" for June

    -
    \ No newline at end of file diff --git a/docs/interfaces/PTControlDirection.html b/docs/interfaces/PTControlDirection.html index 4436baba..fca153df 100644 --- a/docs/interfaces/PTControlDirection.html +++ b/docs/interfaces/PTControlDirection.html @@ -1,8 +1,8 @@ -PTControlDirection | onvif

    Interface PTControlDirection

    interface PTControlDirection {
        EFlip?: {
            mode: "OFF" | "ON" | "Extended";
        };
        extension: any;
        reverse: {
            mode:
                | "OFF"
                | "ON"
                | "AUTO"
                | "Extended";
        };
    }

    Properties

    EFlip? +PTControlDirection | onvif

    Interface PTControlDirection

    interface PTControlDirection {
        EFlip?: {
            mode: "OFF" | "ON" | "Extended";
        };
        extension: any;
        reverse: {
            mode:
                | "OFF"
                | "ON"
                | "AUTO"
                | "Extended";
        };
    }

    Properties

    EFlip?: {
        mode: "OFF" | "ON" | "Extended";
    }

    Optional element to configure related parameters for E-Flip

    Type declaration

    • mode: "OFF" | "ON" | "Extended"

      Parameter to enable/disable E-Flip feature

      -
    extension: any
    reverse: {
        mode:
            | "OFF"
            | "ON"
            | "AUTO"
            | "Extended";
    }

    Optional element to configure related parameters for reversing of PT Control Direction

    +
    extension: any
    reverse: {
        mode:
            | "OFF"
            | "ON"
            | "AUTO"
            | "Extended";
    }

    Optional element to configure related parameters for reversing of PT Control Direction

    Type declaration

    • mode:
          | "OFF"
          | "ON"
          | "AUTO"
          | "Extended"

      Parameter to enable/disable Reverse feature

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/PTZCapabilities.html b/docs/interfaces/PTZCapabilities.html deleted file mode 100644 index 020c05ba..00000000 --- a/docs/interfaces/PTZCapabilities.html +++ /dev/null @@ -1,4 +0,0 @@ -PTZCapabilities | onvif

    Interface PTZCapabilities

    PTZ capabilities

    -
    interface PTZCapabilities {
        XAddr: string;
    }

    Properties

    Properties

    XAddr: string

    PTZ service URI

    -
    \ No newline at end of file diff --git a/docs/interfaces/PTZConfiguration.html b/docs/interfaces/PTZConfiguration.html index 43b9b9fe..b46acd19 100644 --- a/docs/interfaces/PTZConfiguration.html +++ b/docs/interfaces/PTZConfiguration.html @@ -1,4 +1,4 @@ -PTZConfiguration | onvif

    Interface PTZConfiguration

    interface PTZConfiguration {
        defaultAbsolutePantTiltPositionSpace?: string;
        defaultAbsoluteZoomPositionSpace?: string;
        defaultContinuousPanTiltVelocitySpace?: string;
        defaultContinuousZoomVelocitySpace?: string;
        defaultPTZSpeed?: PTZSpeed;
        defaultPTZTimeout?: string;
        defaultRelativePanTiltTranslationSpace?: string;
        defaultRelativeZoomTranslationSpace?: string;
        extension?: PTZConfigurationExtension;
        moveRamp?: number;
        name: string;
        nodeToken: string;
        panTiltLimits?: PanTiltLimits;
        presetRamp?: number;
        presetTourRamp?: number;
        token: string;
        useCount: number;
        zoomLimits?: ZoomLimits;
    }

    Properties

    defaultAbsolutePantTiltPositionSpace? +PTZConfiguration | onvif

    Interface PTZConfiguration

    interface PTZConfiguration {
        defaultAbsolutePantTiltPositionSpace?: string;
        defaultAbsoluteZoomPositionSpace?: string;
        defaultContinuousPanTiltVelocitySpace?: string;
        defaultContinuousZoomVelocitySpace?: string;
        defaultPTZSpeed?: PTZSpeed;
        defaultPTZTimeout?: string;
        defaultRelativePanTiltTranslationSpace?: string;
        defaultRelativeZoomTranslationSpace?: string;
        extension?: PTZConfigurationExtension;
        moveRamp?: number;
        name: string;
        nodeToken: string;
        panTiltLimits?: PanTiltLimits;
        presetRamp?: number;
        presetTourRamp?: number;
        token: string;
        useCount: number;
        zoomLimits?: ZoomLimits;
    }

    Properties

    defaultAbsolutePantTiltPositionSpace?: string

    If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default

    -
    defaultAbsoluteZoomPositionSpace?: string

    If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default

    -
    defaultContinuousPanTiltVelocitySpace?: string

    If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default

    -
    defaultContinuousZoomVelocitySpace?: string

    If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default

    -
    defaultPTZSpeed?: PTZSpeed

    If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds

    -
    defaultPTZTimeout?: string

    If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops

    -
    defaultRelativePanTiltTranslationSpace?: string

    If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default

    -
    defaultRelativeZoomTranslationSpace?: string

    If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default

    -
    moveRamp?: number

    The optional acceleration ramp used by the device when moving

    -
    name: string

    User readable name. Length up to 64 characters

    -
    nodeToken: string

    A mandatory reference to the PTZ Node that the PTZ Configuration belongs to

    -
    panTiltLimits?: PanTiltLimits

    The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. +

    defaultAbsoluteZoomPositionSpace?: string

    If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default

    +
    defaultContinuousPanTiltVelocitySpace?: string

    If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default

    +
    defaultContinuousZoomVelocitySpace?: string

    If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default

    +
    defaultPTZSpeed?: PTZSpeed

    If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds

    +
    defaultPTZTimeout?: string

    If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops

    +
    defaultRelativePanTiltTranslationSpace?: string

    If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default

    +
    defaultRelativeZoomTranslationSpace?: string

    If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default

    +
    moveRamp?: number

    The optional acceleration ramp used by the device when moving

    +
    name: string

    User readable name. Length up to 64 characters

    +
    nodeToken: string

    A mandatory reference to the PTZ Node that the PTZ Configuration belongs to

    +
    panTiltLimits?: PanTiltLimits

    The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. If the element is present it signals the support for configurable Pan/Tilt limits. If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. The Pan/Tilt limits are disabled by setting the limits to –INF or +INF

    -
    presetRamp?: number

    The optional acceleration ramp used by the device when recalling presets

    -
    presetTourRamp?: number

    The optional acceleration ramp used by the device when executing PresetTours

    -
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount: number

    Number of internal references currently using this configuration. +

    presetRamp?: number

    The optional acceleration ramp used by the device when recalling presets

    +
    presetTourRamp?: number

    The optional acceleration ramp used by the device when executing PresetTours

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    zoomLimits?: ZoomLimits

    The Zoom limits element should be present for a PTZ Node that supports absolute zoom. +

    zoomLimits?: ZoomLimits

    The Zoom limits element should be present for a PTZ Node that supports absolute zoom. If the element is present it signals the supports for configurable Zoom limits. If limits are enabled the zoom movements shall always stay within the specified range. The Zoom limits are disabled by settings the limits to -INF and +INF

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/PTZConfigurationExtension.html b/docs/interfaces/PTZConfigurationExtension.html index b095c5d8..c4876df6 100644 --- a/docs/interfaces/PTZConfigurationExtension.html +++ b/docs/interfaces/PTZConfigurationExtension.html @@ -1,4 +1,4 @@ -PTZConfigurationExtension | onvif

    Interface PTZConfigurationExtension

    interface PTZConfigurationExtension {
        PTControlDirection: PTControlDirection;
        extension: any;
    }

    Properties

    PTControlDirection +PTZConfigurationExtension | onvif

    Interface PTZConfigurationExtension

    interface PTZConfigurationExtension {
        PTControlDirection: PTControlDirection;
        extension: any;
    }

    Properties

    PTControlDirection: PTControlDirection

    Optional element to configure PT Control Direction related features

    -
    extension: any
    \ No newline at end of file +
    extension: any
    \ No newline at end of file diff --git a/docs/interfaces/PTZFilter.html b/docs/interfaces/PTZFilter.html index 681087cb..834a42d8 100644 --- a/docs/interfaces/PTZFilter.html +++ b/docs/interfaces/PTZFilter.html @@ -1,5 +1,5 @@ -PTZFilter | onvif

    Interface PTZFilter

    interface PTZFilter {
        position: boolean;
        status: boolean;
    }

    Properties

    position +PTZFilter | onvif

    Interface PTZFilter

    interface PTZFilter {
        position: boolean;
        status: boolean;
    }

    Properties

    Properties

    position: boolean

    true if the metadata stream shall contain the PTZ position

    -
    status: boolean

    true if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN)

    -
    \ No newline at end of file +
    status: boolean

    true if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN)

    +
    \ No newline at end of file diff --git a/docs/interfaces/PTZSpeed.html b/docs/interfaces/PTZSpeed.html index 6e97e65f..371ea61a 100644 --- a/docs/interfaces/PTZSpeed.html +++ b/docs/interfaces/PTZSpeed.html @@ -1,6 +1,6 @@ -PTZSpeed | onvif

    Interface PTZSpeed

    interface PTZSpeed {
        panTilt?: Vector2D;
        zoom?: Vector1D;
    }

    Properties

    panTilt? +PTZSpeed | onvif

    Interface PTZSpeed

    interface PTZSpeed {
        panTilt?: Vector2D;
        zoom?: Vector1D;
    }

    Properties

    Properties

    panTilt?: Vector2D

    Pan and tilt speed. The x component corresponds to pan and the y component to tilt. If omitted in a request, the current (if any) PanTilt movement should not be affected

    -
    zoom?: Vector1D

    A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected

    -
    \ No newline at end of file +
    zoom?: Vector1D

    A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected

    +
    \ No newline at end of file diff --git a/docs/interfaces/PanTiltLimits.html b/docs/interfaces/PanTiltLimits.html index 7035bb27..72778d95 100644 --- a/docs/interfaces/PanTiltLimits.html +++ b/docs/interfaces/PanTiltLimits.html @@ -1,3 +1,3 @@ -PanTiltLimits | onvif

    Interface PanTiltLimits

    interface PanTiltLimits {
        range: Space2DDescription;
    }

    Properties

    range +PanTiltLimits | onvif

    Interface PanTiltLimits

    interface PanTiltLimits {
        range: Space2DDescription;
    }

    Properties

    Properties

    A range of pan tilt limits

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/Profile.html b/docs/interfaces/Profile.html index 478c897e..f43965e3 100644 --- a/docs/interfaces/Profile.html +++ b/docs/interfaces/Profile.html @@ -1,4 +1,4 @@ -Profile | onvif

    Interface Profile

    Properties

    PTZConfiguration? +Profile | onvif

    Interface Profile

    Properties

    PTZConfiguration?: PTZConfiguration

    Optional configuration of the pan tilt zoom unit

    -
    audioEncoderConfiguration?: AudioEncoderConfiguration

    Optional configuration of the Audio encoder

    -
    audioSourceConfiguration?: AudioSourceConfiguration

    Optional configuration of the Audio input

    -
    extension?: ProfileExtension

    Extensions defined in ONVIF 2.0

    -
    fixed: boolean

    A value of true signals that the profile cannot be deleted. Default is false

    -
    metadataConfiguration?: MetadataConfiguration

    Optional configuration of the metadata stream

    -
    name: string

    User readable name of the profile

    -
    token: string

    Unique identifier of the profile

    -
    videoAnalyticsConfiguration?: VideoAnalyticsConfiguration

    Optional configuration of the video analytics module and rule engine

    -
    videoEncoderConfiguration?: VideoEncoderConfiguration

    Optional configuration of the Video encoder

    -
    videoSourceConfiguration?: VideoSourceConfiguration

    Optional configuration of the Video input

    -
    \ No newline at end of file +
    audioEncoderConfiguration?: AudioEncoderConfiguration

    Optional configuration of the Audio encoder

    +
    audioSourceConfiguration?: AudioSourceConfiguration

    Optional configuration of the Audio input

    +
    extension?: ProfileExtension

    Extensions defined in ONVIF 2.0

    +
    fixed: boolean

    A value of true signals that the profile cannot be deleted. Default is false

    +
    metadataConfiguration?: MetadataConfiguration

    Optional configuration of the metadata stream

    +
    name: string

    User readable name of the profile

    +
    token: string

    Unique identifier of the profile

    +
    videoAnalyticsConfiguration?: VideoAnalyticsConfiguration

    Optional configuration of the video analytics module and rule engine

    +
    videoEncoderConfiguration?: VideoEncoderConfiguration

    Optional configuration of the Video encoder

    +
    videoSourceConfiguration?: VideoSourceConfiguration

    Optional configuration of the Video input

    +
    \ No newline at end of file diff --git a/docs/interfaces/ProfileCapabilities.html b/docs/interfaces/ProfileCapabilities.html deleted file mode 100644 index c48d7e87..00000000 --- a/docs/interfaces/ProfileCapabilities.html +++ /dev/null @@ -1,2 +0,0 @@ -ProfileCapabilities | onvif

    Interface ProfileCapabilities

    interface ProfileCapabilities {
        maximumNumberOfProfiles: number;
    }

    Properties

    maximumNumberOfProfiles: number
    \ No newline at end of file diff --git a/docs/interfaces/ProfileExtension.html b/docs/interfaces/ProfileExtension.html index 3b5bcd9d..b4e7d7a9 100644 --- a/docs/interfaces/ProfileExtension.html +++ b/docs/interfaces/ProfileExtension.html @@ -1,6 +1,6 @@ -ProfileExtension | onvif

    Interface ProfileExtension

    Properties

    audioDecoderConfiguration +ProfileExtension | onvif

    Interface ProfileExtension

    Properties

    audioDecoderConfiguration: AudioDecoderConfiguration

    Optional configuration of the Audio decoder

    -
    audioOutputConfiguration: AudioOutputConfiguration

    Optional configuration of the Audio output

    -
    extension?: any
    \ No newline at end of file +
    audioOutputConfiguration: AudioOutputConfiguration

    Optional configuration of the Audio output

    +
    extension?: any
    \ No newline at end of file diff --git a/docs/interfaces/Range.html b/docs/interfaces/Range.html index 398a3f4b..87427639 100644 --- a/docs/interfaces/Range.html +++ b/docs/interfaces/Range.html @@ -1,3 +1,3 @@ -Range | onvif

    Interface Range

    interface Range {
        max: number;
        min: number;
    }

    Properties

    max +Range | onvif

    Interface Range

    interface Range {
        max: number;
        min: number;
    }

    Properties

    Properties

    max: number
    min: number
    \ No newline at end of file +

    Properties

    max: number
    min: number
    \ No newline at end of file diff --git a/docs/interfaces/RealTimeStreamingCapabilities.html b/docs/interfaces/RealTimeStreamingCapabilities.html deleted file mode 100644 index ef2669df..00000000 --- a/docs/interfaces/RealTimeStreamingCapabilities.html +++ /dev/null @@ -1,9 +0,0 @@ -RealTimeStreamingCapabilities | onvif

    Interface RealTimeStreamingCapabilities

    interface RealTimeStreamingCapabilities {
        RTPMulticast: boolean;
        RTP_RTSP_TCP: boolean;
        RTP_TCP: boolean;
        extension: any;
    }

    Properties

    RTPMulticast: boolean

    Indicates whether or not RTP multicast is supported

    -
    RTP_RTSP_TCP: boolean

    Indicates whether or not RTP/RTSP/TCP is supported

    -
    RTP_TCP: boolean

    Indicates whether or not RTP over TCP is supported

    -
    extension: any

    Extensions

    -
    \ No newline at end of file diff --git a/docs/interfaces/ReceiverCapabilities.html b/docs/interfaces/ReceiverCapabilities.html deleted file mode 100644 index 5a58e288..00000000 --- a/docs/interfaces/ReceiverCapabilities.html +++ /dev/null @@ -1,13 +0,0 @@ -ReceiverCapabilities | onvif

    Interface ReceiverCapabilities

    interface ReceiverCapabilities {
        RTP_Multicast: boolean;
        RTP_RTSP_TCP: boolean;
        RTP_TCP: boolean;
        XAddr: string;
        maximumRTSPURILength: number;
        supportedReceivers: number;
    }

    Properties

    RTP_Multicast: boolean

    Indicates whether the device can receive RTP multicast streams

    -
    RTP_RTSP_TCP: boolean

    Indicates whether the device can receive RTP/RTSP/TCP streams

    -
    RTP_TCP: boolean

    Indicates whether the device can receive RTP/TCP streams

    -
    XAddr: string

    The address of the receiver service

    -
    maximumRTSPURILength: number

    The maximum allowed length for RTSP URIs

    -
    supportedReceivers: number

    The maximum number of receivers supported by the device

    -
    \ No newline at end of file diff --git a/docs/interfaces/RecordingCapabilities.html b/docs/interfaces/RecordingCapabilities.html deleted file mode 100644 index 363e40e7..00000000 --- a/docs/interfaces/RecordingCapabilities.html +++ /dev/null @@ -1,7 +0,0 @@ -RecordingCapabilities | onvif

    Interface RecordingCapabilities

    interface RecordingCapabilities {
        XAddr: string;
        dynamicRecordings: boolean;
        dynamicTracks: boolean;
        maxStringLength: number;
        mediaProfileSource: boolean;
        receiverSource: boolean;
    }

    Properties

    XAddr: string
    dynamicRecordings: boolean
    dynamicTracks: boolean
    maxStringLength: number
    mediaProfileSource: boolean
    receiverSource: boolean
    \ No newline at end of file diff --git a/docs/interfaces/Rectangle.html b/docs/interfaces/Rectangle.html index e7a5c432..9bef291f 100644 --- a/docs/interfaces/Rectangle.html +++ b/docs/interfaces/Rectangle.html @@ -1,5 +1,5 @@ -Rectangle | onvif

    Interface Rectangle

    interface Rectangle {
        height: number;
        width: number;
        x: number;
        y: number;
    }

    Properties

    height +Rectangle | onvif

    Interface Rectangle

    interface Rectangle {
        height: number;
        width: number;
        x: number;
        y: number;
    }

    Properties

    Properties

    height: number
    width: number
    x: number
    y: number
    \ No newline at end of file +

    Properties

    height: number
    width: number
    x: number
    y: number
    \ No newline at end of file diff --git a/docs/interfaces/ReplayCapabilities.html b/docs/interfaces/ReplayCapabilities.html deleted file mode 100644 index 090bf7c6..00000000 --- a/docs/interfaces/ReplayCapabilities.html +++ /dev/null @@ -1,2 +0,0 @@ -ReplayCapabilities | onvif

    Interface ReplayCapabilities

    interface ReplayCapabilities {
        XAddr: string;
    }

    Properties

    Properties

    XAddr: string
    \ No newline at end of file diff --git a/docs/interfaces/Rotate.html b/docs/interfaces/Rotate.html index 57f887f1..04a91edf 100644 --- a/docs/interfaces/Rotate.html +++ b/docs/interfaces/Rotate.html @@ -1,6 +1,6 @@ -Rotate | onvif

    Interface Rotate

    interface Rotate {
        degree?: number;
        extension: any;
        mode: "OFF" | "ON" | "AUTO";
    }

    Properties

    degree? +Rotate | onvif

    Interface Rotate

    interface Rotate {
        degree?: number;
        extension: any;
        mode: "OFF" | "ON" | "AUTO";
    }

    Properties

    degree?: number

    Optional parameter to configure how much degree of clockwise rotation of image for On mode. Omitting this parameter for On mode means 180 degree rotation.

    -
    extension: any
    mode: "OFF" | "ON" | "AUTO"

    Parameter to enable/disable Rotation feature

    -
    \ No newline at end of file +
    extension: any
    mode: "OFF" | "ON" | "AUTO"

    Parameter to enable/disable Rotation feature

    +
    \ No newline at end of file diff --git a/docs/interfaces/RuleEngineConfiguration.html b/docs/interfaces/RuleEngineConfiguration.html index 08c31c08..3d8b78f4 100644 --- a/docs/interfaces/RuleEngineConfiguration.html +++ b/docs/interfaces/RuleEngineConfiguration.html @@ -1,3 +1,3 @@ -RuleEngineConfiguration | onvif

    Interface RuleEngineConfiguration

    interface RuleEngineConfiguration {
        extension?: any;
        rule?: Config;
    }

    Properties

    extension? +RuleEngineConfiguration | onvif

    Interface RuleEngineConfiguration

    interface RuleEngineConfiguration {
        extension?: any;
        rule?: Config;
    }

    Properties

    Properties

    extension?: any
    rule?: Config
    \ No newline at end of file +

    Properties

    extension?: any
    rule?: Config
    \ No newline at end of file diff --git a/docs/interfaces/SceneOrientation.html b/docs/interfaces/SceneOrientation.html index fd3fd886..980925d3 100644 --- a/docs/interfaces/SceneOrientation.html +++ b/docs/interfaces/SceneOrientation.html @@ -1,7 +1,7 @@ -SceneOrientation | onvif

    Interface SceneOrientation

    interface SceneOrientation {
        mode: "AUTO" | "MANUAL";
        orientation?: string;
    }

    Properties

    mode +SceneOrientation | onvif

    Interface SceneOrientation

    interface SceneOrientation {
        mode: "AUTO" | "MANUAL";
        orientation?: string;
    }

    Properties

    Properties

    mode: "AUTO" | "MANUAL"

    Parameter to assign the way the camera determines the scene orientation

    -
    orientation?: string

    Assigned or determined scene orientation based on the Mode. +

    orientation?: string

    Assigned or determined scene orientation based on the Mode. When assigning the Mode to AUTO, this field is optional and will be ignored by the device. When assigning the Mode to MANUAL, this field is required and the device will return an InvalidArgs fault if missing

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/SearchCapabilities.html b/docs/interfaces/SearchCapabilities.html deleted file mode 100644 index a233d558..00000000 --- a/docs/interfaces/SearchCapabilities.html +++ /dev/null @@ -1,3 +0,0 @@ -SearchCapabilities | onvif

    Interface SearchCapabilities

    interface SearchCapabilities {
        XAddr: string;
        metadataSearch: boolean;
    }

    Properties

    Properties

    XAddr: string
    metadataSearch: boolean
    \ No newline at end of file diff --git a/docs/interfaces/SecurityCapabilities.html b/docs/interfaces/SecurityCapabilities.html deleted file mode 100644 index 600b5f7f..00000000 --- a/docs/interfaces/SecurityCapabilities.html +++ /dev/null @@ -1,43 +0,0 @@ -SecurityCapabilities | onvif

    Interface SecurityCapabilities

    Security capabilities

    -
    interface SecurityCapabilities {
        RELToken: boolean;
        SAMLToken: boolean;
        TLS1.0?: boolean;
        TLS1.1: boolean;
        TLS1.2: boolean;
        X.509Token: boolean;
        accessPolicyConfig: boolean;
        defaultAccessPolicy?: boolean;
        dot1X?: boolean;
        extension?: SecurityCapabilitiesExtension;
        httpDigest?: boolean;
        kerberosToken: boolean;
        maxPasswordHistory: number;
        maxPasswordLength?: number;
        maxUserNameLength?: number;
        maxUsers?: number;
        onboardKeyGeneration: boolean;
        remoteUserHandling?: boolean;
        securityPolicies?: string[];
        supportedEAPMethods?: number[];
        usernameToken?: boolean;
    }

    Properties

    RELToken: boolean

    Indicates support for WS-Security REL token

    -
    SAMLToken: boolean

    Indicates support for WS-Security SAML token

    -
    TLS1.0?: boolean

    Indicates support for TLS 1.1

    -
    TLS1.1: boolean

    Indicates support for TLS 1.1

    -
    TLS1.2: boolean

    Indicates support for TLS 1.2

    -
    X.509Token: boolean

    Indicates support for WS-Security X.509 token

    -
    accessPolicyConfig: boolean

    Indicates support for access policy configuration

    -
    defaultAccessPolicy?: boolean

    Indicates support for the ONVIF default access policy

    -
    dot1X?: boolean

    Indicates support for IEEE 802.1X configuration

    -
    httpDigest?: boolean

    Indicates support for WS over HTTP digest authenticated communication layer

    -
    kerberosToken: boolean

    Indicates support for WS-Security Kerberos token

    -
    maxPasswordHistory: number

    Maximum number of passwords that the device can remember for each user

    -
    maxPasswordLength?: number

    Maximum number of characters supported for the password by CreateUsers and SetUser

    -
    maxUserNameLength?: number

    Maximum number of characters supported for the username by CreateUsers

    -
    maxUsers?: number

    The maximum number of users that the device supports

    -
    onboardKeyGeneration: boolean

    Indicates support for onboard key generation

    -
    remoteUserHandling?: boolean

    Indicates support for remote user configuration. Used when accessing another device

    -
    securityPolicies?: string[]

    Indicates which security policies are supported. Options are: ModifyPassword, PasswordComplexity, AuthFailureWarnings

    -
    supportedEAPMethods?: number[]

    EAP Methods supported by the device. The int values refer to the IANA EAP Registry

    -
    usernameToken?: boolean

    Indicates support for WS-Security Username token

    -
    \ No newline at end of file diff --git a/docs/interfaces/SecurityCapabilitiesExtension.html b/docs/interfaces/SecurityCapabilitiesExtension.html deleted file mode 100644 index 5be82838..00000000 --- a/docs/interfaces/SecurityCapabilitiesExtension.html +++ /dev/null @@ -1,4 +0,0 @@ -SecurityCapabilitiesExtension | onvif

    Interface SecurityCapabilitiesExtension

    interface SecurityCapabilitiesExtension {
        TLS1.0: boolean;
        extension?: SecurityCapabilitiesExtension2;
    }

    Properties

    Properties

    TLS1.0: boolean

    Indicates support for TLS 1.0

    -
    \ No newline at end of file diff --git a/docs/interfaces/SecurityCapabilitiesExtension2.html b/docs/interfaces/SecurityCapabilitiesExtension2.html deleted file mode 100644 index 63d98581..00000000 --- a/docs/interfaces/SecurityCapabilitiesExtension2.html +++ /dev/null @@ -1,5 +0,0 @@ -SecurityCapabilitiesExtension2 | onvif

    Interface SecurityCapabilitiesExtension2

    interface SecurityCapabilitiesExtension2 {
        dot1X: boolean;
        remoteUserHandling: boolean;
        supportedEAPMethod?: number;
    }

    Properties

    dot1X: boolean
    remoteUserHandling: boolean
    supportedEAPMethod?: number

    EAP Methods supported by the device. The int values refer to the IANA EAP Registry

    -
    \ No newline at end of file diff --git a/docs/interfaces/Space1DDescription.html b/docs/interfaces/Space1DDescription.html index e1aed27f..9796b544 100644 --- a/docs/interfaces/Space1DDescription.html +++ b/docs/interfaces/Space1DDescription.html @@ -1,5 +1,5 @@ -Space1DDescription | onvif

    Interface Space1DDescription

    interface Space1DDescription {
        URI: string;
        XRange: Range;
    }

    Properties

    URI +Space1DDescription | onvif

    Interface Space1DDescription

    interface Space1DDescription {
        URI: string;
        XRange: Range;
    }

    Properties

    Properties

    URI: string

    A URI of coordinate systems

    -
    XRange: Range

    A range of x-axis

    -
    \ No newline at end of file +
    XRange: Range

    A range of x-axis

    +
    \ No newline at end of file diff --git a/docs/interfaces/Space2DDescription.html b/docs/interfaces/Space2DDescription.html index a072500f..bec5b485 100644 --- a/docs/interfaces/Space2DDescription.html +++ b/docs/interfaces/Space2DDescription.html @@ -1,7 +1,7 @@ -Space2DDescription | onvif

    Interface Space2DDescription

    interface Space2DDescription {
        URI: string;
        XRange: Range;
        YRange: Range;
    }

    Properties

    URI +Space2DDescription | onvif

    Interface Space2DDescription

    interface Space2DDescription {
        URI: string;
        XRange: Range;
        YRange: Range;
    }

    Properties

    Properties

    URI: string

    A URI of coordinate systems

    -
    XRange: Range

    A range of x-axis

    -
    YRange: Range

    A range of y-axis

    -
    \ No newline at end of file +
    XRange: Range

    A range of x-axis

    +
    YRange: Range

    A range of y-axis

    +
    \ No newline at end of file diff --git a/docs/interfaces/SystemCapabilities.html b/docs/interfaces/SystemCapabilities.html deleted file mode 100644 index 6b1d41c6..00000000 --- a/docs/interfaces/SystemCapabilities.html +++ /dev/null @@ -1,43 +0,0 @@ -SystemCapabilities | onvif

    Interface SystemCapabilities

    System capabilities

    -
    interface SystemCapabilities {
        addons?: string[];
        autoGeo?: string[];
        discoveryBye: boolean;
        discoveryNotSupported?: boolean;
        discoveryResolve: boolean;
        extensions?: SystemCapabilitiesExtension;
        firmwareUpgrade: boolean;
        geoLocationEntries?: number;
        httpFirmwareUpgrade?: boolean;
        httpSupportInformation?: boolean;
        httpSystemBackup?: boolean;
        httpSystemLogging?: boolean;
        maxStorageConfigurations?: number;
        networkConfigNotSupported?: boolean;
        remoteDiscovery: boolean;
        storageConfiguration?: boolean;
        storageTypesSupported?: string[];
        supportedVersions: OnvifVersion;
        systemBackup: boolean;
        systemLogging: boolean;
        userConfigNotSupported?: boolean;
    }

    Properties

    addons?: string[]

    List of supported Addons by the device

    -
    autoGeo?: string[]

    List of supported automatic GeoLocation adjustment supported by the device. Valid items are defined by tds:AutoGeoMode

    -
    discoveryBye: boolean

    Indicates support for WS Discovery resolve requests

    -
    discoveryNotSupported?: boolean

    Indicates no support for network discovery

    -
    discoveryResolve: boolean

    Indicates whether or not WS Discovery resolve requests are supported

    -
    firmwareUpgrade: boolean

    Indicates support for firmware upgrade through MTOM

    -
    geoLocationEntries?: number

    If present signals support for geo location. The value signals the supported number of entries

    -
    httpFirmwareUpgrade?: boolean

    Indicates support for firmware upgrade through HTTP

    -
    httpSupportInformation?: boolean

    Indicates support for retrieving support information through HTTP

    -
    httpSystemBackup?: boolean

    Indicates support for system backup through HTTP

    -
    httpSystemLogging?: boolean

    Indicates support for retrieval of system logging through HTTP

    -
    maxStorageConfigurations?: number

    Indicates maximum number of storage configurations supported

    -
    networkConfigNotSupported?: boolean

    Indicates no support for network configuration

    -
    remoteDiscovery: boolean

    Indicates support for remote discovery

    -
    storageConfiguration?: boolean

    Indicates support for storage configuration interfaces

    -
    storageTypesSupported?: string[]

    Enumerates the supported StorageTypes, see tds:StorageType

    -
    supportedVersions: OnvifVersion

    Indicates supported ONVIF version(s)

    -
    systemBackup: boolean

    Indicates support for system backup through MTOM

    -
    systemLogging: boolean

    Indicates support for retrieval of system logging through MTOM

    -
    userConfigNotSupported?: boolean

    Indicates no support for user configuration

    -
    \ No newline at end of file diff --git a/docs/interfaces/SystemCapabilitiesExtension.html b/docs/interfaces/SystemCapabilitiesExtension.html deleted file mode 100644 index ef5ce371..00000000 --- a/docs/interfaces/SystemCapabilitiesExtension.html +++ /dev/null @@ -1,6 +0,0 @@ -SystemCapabilitiesExtension | onvif

    Interface SystemCapabilitiesExtension

    interface SystemCapabilitiesExtension {
        extension?: any;
        httpFirmwareUpgrade?: boolean;
        httpSupportInformation?: boolean;
        httpSystemBackup?: boolean;
        httpSystemLogging?: boolean;
    }

    Properties

    extension?: any
    httpFirmwareUpgrade?: boolean
    httpSupportInformation?: boolean
    httpSystemBackup?: boolean
    httpSystemLogging?: boolean
    \ No newline at end of file diff --git a/docs/interfaces/ToneCompensation.html b/docs/interfaces/ToneCompensation.html index a1f33923..c5690ca9 100644 --- a/docs/interfaces/ToneCompensation.html +++ b/docs/interfaces/ToneCompensation.html @@ -1,6 +1,6 @@ -ToneCompensation | onvif

    Interface ToneCompensation

    interface ToneCompensation {
        extension?: any;
        level?: number;
        mode: string;
    }

    Properties

    extension? +ToneCompensation | onvif

    Interface ToneCompensation

    interface ToneCompensation {
        extension?: any;
        level?: number;
        mode: string;
    }

    Properties

    Properties

    extension?: any
    level?: number

    Optional level parameter specified with unitless normalized value from 0.0 to +1.0

    -
    mode: string

    Parameter to enable/disable or automatic ToneCompensation feature. Its options shall be chosen from tt:ToneCompensationMode Type

    -
    \ No newline at end of file +

    Properties

    extension?: any
    level?: number

    Optional level parameter specified with unitless normalized value from 0.0 to +1.0

    +
    mode: string

    Parameter to enable/disable or automatic ToneCompensation feature. Its options shall be chosen from tt:ToneCompensationMode Type

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoAnalyticsConfiguration.html b/docs/interfaces/VideoAnalyticsConfiguration.html index b4ac87bb..4ab31556 100644 --- a/docs/interfaces/VideoAnalyticsConfiguration.html +++ b/docs/interfaces/VideoAnalyticsConfiguration.html @@ -1,10 +1,10 @@ -VideoAnalyticsConfiguration | onvif

    Interface VideoAnalyticsConfiguration

    interface VideoAnalyticsConfiguration {
        analyticsEngineConfiguration: AnalyticsEngineConfiguration;
        name: string;
        ruleEngineConfiguration: RuleEngineConfiguration;
        token: string;
        useCount: number;
    }

    Properties

    analyticsEngineConfiguration +VideoAnalyticsConfiguration | onvif

    Interface VideoAnalyticsConfiguration

    interface VideoAnalyticsConfiguration {
        analyticsEngineConfiguration: AnalyticsEngineConfiguration;
        name: string;
        ruleEngineConfiguration: RuleEngineConfiguration;
        token: string;
        useCount: number;
    }

    Properties

    analyticsEngineConfiguration: AnalyticsEngineConfiguration
    name: string

    User readable name. Length up to 64 characters

    -
    ruleEngineConfiguration: RuleEngineConfiguration
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount: number

    Number of internal references currently using this configuration. +

    Properties

    analyticsEngineConfiguration: AnalyticsEngineConfiguration
    name: string

    User readable name. Length up to 64 characters

    +
    ruleEngineConfiguration: RuleEngineConfiguration
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/VideoEncoder2Configuration.html b/docs/interfaces/VideoEncoder2Configuration.html index 3683c74f..3e2bc74b 100644 --- a/docs/interfaces/VideoEncoder2Configuration.html +++ b/docs/interfaces/VideoEncoder2Configuration.html @@ -1,4 +1,4 @@ -VideoEncoder2Configuration | onvif

    Interface VideoEncoder2Configuration

    interface VideoEncoder2Configuration {
        encoding: string;
        govLength: number;
        guaranteedFrameRate: boolean;
        mutlicast?: MulticastConfiguration;
        name: string;
        profile: string;
        quality: number;
        rateControl?: VideoRateControl2;
        resolution: VideoResolution;
        token: string;
        useCount?: number;
    }

    Properties

    encoding +VideoEncoder2Configuration | onvif

    Interface VideoEncoder2Configuration

    interface VideoEncoder2Configuration {
        encoding: string;
        govLength: number;
        guaranteedFrameRate: boolean;
        mutlicast?: MulticastConfiguration;
        name: string;
        profile: string;
        quality: number;
        rateControl?: VideoRateControl2;
        resolution: VideoResolution;
        token: string;
        useCount?: number;
    }

    Properties

    encoding: string

    Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types https://www.iana.org/assignments/media-types/media-types.xhtml#video

    -
    govLength: number

    Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. +

    govLength: number

    Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames

    -
    guaranteedFrameRate: boolean

    A value of true indicates that frame rate is a fixed value rather than an upper limit, +

    guaranteedFrameRate: boolean

    A value of true indicates that frame rate is a fixed value rather than an upper limit, and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. Default is false.

    -

    Defines the multicast settings that could be used for video streaming

    -
    name: string

    User readable name. Length up to 64 characters

    -
    profile: string

    The encoder profile as defined in tt:VideoEncodingProfiles

    -
    quality: number

    Relative value for the video quantizers and the quality of the video. +

    Defines the multicast settings that could be used for video streaming

    +
    name: string

    User readable name. Length up to 64 characters

    +
    profile: string

    The encoder profile as defined in tt:VideoEncodingProfiles

    +
    quality: number

    Relative value for the video quantizers and the quality of the video. A high value within supported quality range means higher quality

    -
    rateControl?: VideoRateControl2

    Optional element to configure rate control related parameters.

    -
    resolution: VideoResolution

    Configured video resolution

    -
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount?: number

    Number of internal references currently using this configuration. +

    rateControl?: VideoRateControl2

    Optional element to configure rate control related parameters.

    +
    resolution: VideoResolution

    Configured video resolution

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount?: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/VideoEncoderConfiguration.html b/docs/interfaces/VideoEncoderConfiguration.html index e468c19f..bacba315 100644 --- a/docs/interfaces/VideoEncoderConfiguration.html +++ b/docs/interfaces/VideoEncoderConfiguration.html @@ -1,4 +1,4 @@ -VideoEncoderConfiguration | onvif

    Interface VideoEncoderConfiguration

    interface VideoEncoderConfiguration {
        H264?: H264Configuration;
        MPEG4?: Mpeg4Configuration;
        encoding: "JPEG" | "MPEG4" | "H264";
        guaranteedFrameRate: boolean;
        multicast: MulticastConfiguration;
        name: string;
        quality: number;
        rateControl?: VideoRateControl;
        resolution: VideoResolution;
        sessionTimeout: string;
        token: string;
        useCount: number;
    }

    Properties

    H264? +VideoEncoderConfiguration | onvif

    Interface VideoEncoderConfiguration

    interface VideoEncoderConfiguration {
        H264?: H264Configuration;
        MPEG4?: Mpeg4Configuration;
        encoding: "JPEG" | "MPEG4" | "H264";
        guaranteedFrameRate: boolean;
        multicast: MulticastConfiguration;
        name: string;
        quality: number;
        rateControl?: VideoRateControl;
        resolution: VideoResolution;
        sessionTimeout: string;
        token: string;
        useCount: number;
    }

    Properties

    Properties

    Optional element to configure H.264 related parameters.

    -

    Optional element to configure Mpeg4 related parameters

    -
    encoding: "JPEG" | "MPEG4" | "H264"

    Used video codec, either Jpeg, H.264 or Mpeg4

    -
    guaranteedFrameRate: boolean

    A value of true indicates that frame rate is a fixed value rather than an upper limit, +

    Optional element to configure Mpeg4 related parameters

    +
    encoding: "JPEG" | "MPEG4" | "H264"

    Used video codec, either Jpeg, H.264 or Mpeg4

    +
    guaranteedFrameRate: boolean

    A value of true indicates that frame rate is a fixed value rather than an upper limit, and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. Default is false.

    -

    Defines the multicast settings that could be used for video streaming

    -
    name: string

    User readable name. Length up to 64 characters

    -
    quality: number

    Relative value for the video quantizers and the quality of the video. +

    Defines the multicast settings that could be used for video streaming

    +
    name: string

    User readable name. Length up to 64 characters

    +
    quality: number

    Relative value for the video quantizers and the quality of the video. A high value within supported quality range means higher quality

    -
    rateControl?: VideoRateControl

    Optional element to configure rate control related parameters.

    -
    resolution: VideoResolution

    Configured video resolution

    -
    sessionTimeout: string

    The rtsp session timeout for the related video stream

    -
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount: number

    Number of internal references currently using this configuration. +

    rateControl?: VideoRateControl

    Optional element to configure rate control related parameters.

    +
    resolution: VideoResolution

    Configured video resolution

    +
    sessionTimeout: string

    The rtsp session timeout for the related video stream

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration. This informational parameter is read-only. Deprecated for Media2 Service.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/VideoRateControl.html b/docs/interfaces/VideoRateControl.html index 805e534f..316a6097 100644 --- a/docs/interfaces/VideoRateControl.html +++ b/docs/interfaces/VideoRateControl.html @@ -1,7 +1,7 @@ -VideoRateControl | onvif

    Interface VideoRateControl

    interface VideoRateControl {
        bitrateLimit: number;
        encodingInterval: number;
        frameRateLimit: number;
    }

    Properties

    bitrateLimit +VideoRateControl | onvif

    Interface VideoRateControl

    interface VideoRateControl {
        bitrateLimit: number;
        encodingInterval: number;
        frameRateLimit: number;
    }

    Properties

    bitrateLimit: number

    the maximum output bitrate in kbps

    -
    encodingInterval: number

    Interval at which images are encoded and transmitted. (A value of 1 means that every frame is encoded, a value of 2 means that every 2nd frame is encoded ...)

    -
    frameRateLimit: number

    Maximum output framerate in fps. If an EncodingInterval is provided the resulting encoded framerate will be reduced by the given factor

    -
    \ No newline at end of file +
    encodingInterval: number

    Interval at which images are encoded and transmitted. (A value of 1 means that every frame is encoded, a value of 2 means that every 2nd frame is encoded ...)

    +
    frameRateLimit: number

    Maximum output framerate in fps. If an EncodingInterval is provided the resulting encoded framerate will be reduced by the given factor

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoRateControl2.html b/docs/interfaces/VideoRateControl2.html index 307e6864..e46a79d6 100644 --- a/docs/interfaces/VideoRateControl2.html +++ b/docs/interfaces/VideoRateControl2.html @@ -1,7 +1,7 @@ -VideoRateControl2 | onvif

    Interface VideoRateControl2

    interface VideoRateControl2 {
        bitrateLimit: number;
        constantBitRate: boolean;
        frameRateLimit: number;
    }

    Properties

    bitrateLimit +VideoRateControl2 | onvif

    Interface VideoRateControl2

    interface VideoRateControl2 {
        bitrateLimit: number;
        constantBitRate: boolean;
        frameRateLimit: number;
    }

    Properties

    bitrateLimit: number

    the maximum output bitrate in kbps

    -
    constantBitRate: boolean

    Enforce constant bitrate

    -
    frameRateLimit: number

    Desired frame rate in fps. The actual rate may be lower due to e.g. performance limitations

    -
    \ No newline at end of file +
    constantBitRate: boolean

    Enforce constant bitrate

    +
    frameRateLimit: number

    Desired frame rate in fps. The actual rate may be lower due to e.g. performance limitations

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoResolution.html b/docs/interfaces/VideoResolution.html index 4022deeb..7f599f10 100644 --- a/docs/interfaces/VideoResolution.html +++ b/docs/interfaces/VideoResolution.html @@ -1,5 +1,5 @@ -VideoResolution | onvif

    Interface VideoResolution

    interface VideoResolution {
        height: number;
        width: number;
    }

    Properties

    height +VideoResolution | onvif

    Interface VideoResolution

    interface VideoResolution {
        height: number;
        width: number;
    }

    Properties

    Properties

    height: number

    Number of the lines of the Video image

    -
    width: number

    Number of the columns of the Video image

    -
    \ No newline at end of file +
    width: number

    Number of the columns of the Video image

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoSource.html b/docs/interfaces/VideoSource.html index 531ffee3..324c7e87 100644 --- a/docs/interfaces/VideoSource.html +++ b/docs/interfaces/VideoSource.html @@ -1,10 +1,10 @@ -VideoSource | onvif

    Interface VideoSource

    interface VideoSource {
        extension?: VideoSourceExtension;
        framerate: number;
        imaging?: ImagingSettings;
        resolution: VideoResolution;
        token: string;
    }

    Properties

    extension? +VideoSource | onvif

    Interface VideoSource

    interface VideoSource {
        extension?: VideoSourceExtension;
        framerate: number;
        imaging?: ImagingSettings;
        resolution: VideoResolution;
        token: string;
    }

    Properties

    framerate: number

    Frame rate in frames per second

    -
    imaging?: ImagingSettings

    Optional configuration of the image sensor

    -
    resolution: VideoResolution

    Horizontal and vertical resolution

    -
    token: string

    Unique identifier referencing the physical entity

    -
    \ No newline at end of file +

    Properties

    framerate: number

    Frame rate in frames per second

    +
    imaging?: ImagingSettings

    Optional configuration of the image sensor

    +
    resolution: VideoResolution

    Horizontal and vertical resolution

    +
    token: string

    Unique identifier referencing the physical entity

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoSourceConfiguration.html b/docs/interfaces/VideoSourceConfiguration.html index 37798b18..942a84db 100644 --- a/docs/interfaces/VideoSourceConfiguration.html +++ b/docs/interfaces/VideoSourceConfiguration.html @@ -1,4 +1,4 @@ -VideoSourceConfiguration | onvif

    Interface VideoSourceConfiguration

    interface VideoSourceConfiguration {
        bounds: IntRectangle;
        extension?: VideoSourceConfigurationExtension;
        name: string;
        sourceToken: string;
        token: string;
        useCount: number;
        viewMode: string;
    }

    Properties

    bounds +VideoSourceConfiguration | onvif

    Interface VideoSourceConfiguration

    interface VideoSourceConfiguration {
        bounds: IntRectangle;
        extension?: VideoSourceConfigurationExtension;
        name: string;
        sourceToken: string;
        token: string;
        useCount: number;
        viewMode: string;
    }

    Properties

    Properties

    bounds: IntRectangle

    Rectangle specifying the Video capturing area. The capturing area shall not be larger than the whole Video source area

    -
    name: string

    User readable name. Length up to 64 characters

    -
    sourceToken: string

    Reference to the physical input

    -
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    -
    useCount: number

    Number of internal references currently using this configuration +

    name: string

    User readable name. Length up to 64 characters

    +
    sourceToken: string

    Reference to the physical input

    +
    token: string

    Token that uniquely references this configuration. Length up to 64 characters

    +
    useCount: number

    Number of internal references currently using this configuration This informational parameter is read-only. Deprecated for Media2 Service

    -
    viewMode: string

    Readonly parameter signalling Source configuration's view mode, for devices supporting different view modes as defined in tt:viewModes

    -
    \ No newline at end of file +
    viewMode: string

    Readonly parameter signalling Source configuration's view mode, for devices supporting different view modes as defined in tt:viewModes

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoSourceConfigurationExtension.html b/docs/interfaces/VideoSourceConfigurationExtension.html index 35be0ef2..e07a80b5 100644 --- a/docs/interfaces/VideoSourceConfigurationExtension.html +++ b/docs/interfaces/VideoSourceConfigurationExtension.html @@ -1,7 +1,7 @@ -VideoSourceConfigurationExtension | onvif

    Interface VideoSourceConfigurationExtension

    interface VideoSourceConfigurationExtension {
        extension?: VideoSourceConfigurationExtension2;
        rotate: Rotate;
    }

    Properties

    extension? +VideoSourceConfigurationExtension | onvif

    Interface VideoSourceConfigurationExtension

    interface VideoSourceConfigurationExtension {
        extension?: VideoSourceConfigurationExtension2;
        rotate: Rotate;
    }

    Properties

    Properties

    rotate: Rotate

    Optional element to configure rotation of captured image. What resolutions a device supports shall be unaffected by the Rotate parameters. +

    Properties

    rotate: Rotate

    Optional element to configure rotation of captured image. What resolutions a device supports shall be unaffected by the Rotate parameters. If a device is configured with Rotate=AUTO, the device shall take control over the Degree parameter and automatically update it so that a client can query current rotation. The device shall automatically apply the same rotation to its pan/tilt control direction depending on the following condition: if Reverse=AUTO in PTControlDirection or if the device doesn’t support Reverse in PTControlDirection

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/VideoSourceConfigurationExtension2.html b/docs/interfaces/VideoSourceConfigurationExtension2.html index f567e02d..29345b7e 100644 --- a/docs/interfaces/VideoSourceConfigurationExtension2.html +++ b/docs/interfaces/VideoSourceConfigurationExtension2.html @@ -1,5 +1,5 @@ -VideoSourceConfigurationExtension2 | onvif

    Interface VideoSourceConfigurationExtension2

    interface VideoSourceConfigurationExtension2 {
        lensDescription?: LensDescription;
        sceneOrientation: SceneOrientation;
    }

    Properties

    lensDescription? +VideoSourceConfigurationExtension2 | onvif

    Interface VideoSourceConfigurationExtension2

    interface VideoSourceConfigurationExtension2 {
        lensDescription?: LensDescription;
        sceneOrientation: SceneOrientation;
    }

    Properties

    lensDescription?: LensDescription

    Optional element describing the geometric lens distortion. Multiple instances for future variable lens support

    -
    sceneOrientation: SceneOrientation

    Optional element describing the scene orientation in the camera’s field of view

    -
    \ No newline at end of file +
    sceneOrientation: SceneOrientation

    Optional element describing the scene orientation in the camera’s field of view

    +
    \ No newline at end of file diff --git a/docs/interfaces/VideoSourceExtension.html b/docs/interfaces/VideoSourceExtension.html index b71c71a8..fc2d7471 100644 --- a/docs/interfaces/VideoSourceExtension.html +++ b/docs/interfaces/VideoSourceExtension.html @@ -1,4 +1,4 @@ -VideoSourceExtension | onvif

    Interface VideoSourceExtension

    interface VideoSourceExtension {
        extension?: any;
        imaging?: ImagingSettings20;
    }

    Properties

    extension? +VideoSourceExtension | onvif

    Interface VideoSourceExtension

    interface VideoSourceExtension {
        extension?: any;
        imaging?: ImagingSettings20;
    }

    Properties

    Properties

    extension?: any

    Optional configuration of the image sensor. To be used if imaging service 2.00 is supported

    -
    \ No newline at end of file +

    Properties

    extension?: any

    Optional configuration of the image sensor. To be used if imaging service 2.00 is supported

    +
    \ No newline at end of file diff --git a/docs/interfaces/WhiteBalance.html b/docs/interfaces/WhiteBalance.html index 93719f6a..feffa097 100644 --- a/docs/interfaces/WhiteBalance.html +++ b/docs/interfaces/WhiteBalance.html @@ -1,7 +1,7 @@ -WhiteBalance | onvif

    Interface WhiteBalance

    interface WhiteBalance {
        cbGain: number;
        crGain: number;
        mode: "AUTO" | "MANUAL";
    }

    Hierarchy (view full)

    Properties

    cbGain +WhiteBalance | onvif

    Interface WhiteBalance

    interface WhiteBalance {
        cbGain: number;
        crGain: number;
        mode: "AUTO" | "MANUAL";
    }

    Hierarchy (view full)

    Properties

    Properties

    cbGain: number

    Bgain (unitless)

    -
    crGain: number

    Rgain (unitless)

    -
    mode: "AUTO" | "MANUAL"

    Auto whitebalancing mode (auto/manual)

    -
    \ No newline at end of file +
    crGain: number

    Rgain (unitless)

    +
    mode: "AUTO" | "MANUAL"

    Auto whitebalancing mode (auto/manual)

    +
    \ No newline at end of file diff --git a/docs/interfaces/WhiteBalance20.html b/docs/interfaces/WhiteBalance20.html index 5b7bfa78..64952dee 100644 --- a/docs/interfaces/WhiteBalance20.html +++ b/docs/interfaces/WhiteBalance20.html @@ -1,8 +1,8 @@ -WhiteBalance20 | onvif

    Interface WhiteBalance20

    interface WhiteBalance20 {
        cbGain: number;
        crGain: number;
        extension: any;
        mode: "AUTO" | "MANUAL";
    }

    Hierarchy (view full)

    Properties

    cbGain +WhiteBalance20 | onvif

    Interface WhiteBalance20

    interface WhiteBalance20 {
        cbGain: number;
        crGain: number;
        extension: any;
        mode: "AUTO" | "MANUAL";
    }

    Hierarchy (view full)

    Properties

    cbGain: number

    Bgain (unitless)

    -
    crGain: number

    Rgain (unitless)

    -
    extension: any
    mode: "AUTO" | "MANUAL"

    Auto whitebalancing mode (auto/manual)

    -
    \ No newline at end of file +
    crGain: number

    Rgain (unitless)

    +
    extension: any
    mode: "AUTO" | "MANUAL"

    Auto whitebalancing mode (auto/manual)

    +
    \ No newline at end of file diff --git a/docs/interfaces/WideDynamicRange.html b/docs/interfaces/WideDynamicRange.html index af4584d6..446fd10f 100644 --- a/docs/interfaces/WideDynamicRange.html +++ b/docs/interfaces/WideDynamicRange.html @@ -1,5 +1,5 @@ -WideDynamicRange | onvif

    Interface WideDynamicRange

    interface WideDynamicRange {
        level: number;
        mode: "OFF" | "ON";
    }

    Properties

    level +WideDynamicRange | onvif

    Interface WideDynamicRange

    interface WideDynamicRange {
        level: number;
        mode: "OFF" | "ON";
    }

    Properties

    Properties

    level: number

    Optional level parameter (unitless)

    -
    mode: "OFF" | "ON"

    White dynamic range (on/off)

    -
    \ No newline at end of file +
    mode: "OFF" | "ON"

    White dynamic range (on/off)

    +
    \ No newline at end of file diff --git a/docs/interfaces/WideDynamicRange20.html b/docs/interfaces/WideDynamicRange20.html index 2da51776..9492f735 100644 --- a/docs/interfaces/WideDynamicRange20.html +++ b/docs/interfaces/WideDynamicRange20.html @@ -1,5 +1,5 @@ -WideDynamicRange20 | onvif

    Interface WideDynamicRange20

    interface WideDynamicRange20 {
        level?: number;
        mode?: "OFF" | "ON";
    }

    Properties

    level? +WideDynamicRange20 | onvif

    Interface WideDynamicRange20

    interface WideDynamicRange20 {
        level?: number;
        mode?: "OFF" | "ON";
    }

    Properties

    Properties

    level?: number

    Optional level parameter (unit unspecified)

    -
    mode?: "OFF" | "ON"

    Wide dynamic range mode (on/off)

    -
    \ No newline at end of file +
    mode?: "OFF" | "ON"

    Wide dynamic range mode (on/off)

    +
    \ No newline at end of file diff --git a/docs/interfaces/ZoomLimits.html b/docs/interfaces/ZoomLimits.html index 7f4a892d..322d6c7b 100644 --- a/docs/interfaces/ZoomLimits.html +++ b/docs/interfaces/ZoomLimits.html @@ -1,2 +1,2 @@ -ZoomLimits | onvif

    Interface ZoomLimits

    interface ZoomLimits {
        range: Space1DDescription;
    }

    Properties

    Properties

    \ No newline at end of file +ZoomLimits | onvif

    Interface ZoomLimits

    interface ZoomLimits {
        range: Space1DDescription;
    }

    Properties

    Properties

    \ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html index e6df809e..e50da703 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,4 +1,5 @@ -onvif

    onvif

    Index

    Classes

    Cam +onvif

    onvif

    Index

    Modules

    Classes

    Interfaces

    AbsoluteMoveOptions ActiveSource -AnalyticsCapabilities -AnalyticsDeviceCapabilities AnalyticsEngineConfiguration AudioDecoderConfiguration AudioEncoder2Configuration @@ -16,23 +15,12 @@ AudioSourceConfiguration BacklightCompensation BacklightCompensation20 -Capabilities -CapabilitiesExtension Config ConfigurationSet ContinuousMoveOptions Defogging -DeviceCapabilities -DeviceIOCapabilities -DeviceInformation -DeviceServiceCapabilities DiscoveryOptions -DisplayCapabilities -Dot11Configuration -Dot11PSKSet -Dot11SecurityConfiguration DurationRange -EventCapabilities EventSubscription Exposure Exposure20 @@ -45,15 +33,7 @@ GotoHomePositionOptions GotoPresetOptions H264Configuration -HostnameInformation -IOCapabilities -IOCapabilitiesExtension -IPv4Configuration -IPv4NetworkInterface -IPv6Configuration -IPv6NetworkInterface ImageStabilization -ImagingCapabilities ImagingSettings ImagingSettings20 ImagingSettingsExtension20 @@ -65,28 +45,16 @@ LensDescription LensOffset LensProjection -MediaCapabilities -MediaCapabilitiesExtension MediaProfile MetadataConfiguration -MiscCapabilities Mpeg4Configuration MulticastConfiguration -NetworkCapabilities -NetworkCapabilitiesExtension -NetworkInterface -NetworkInterfaceConnectionSetting -NetworkInterfaceExtension -NetworkInterfaceInfo -NetworkInterfaceLink NoiseReduction OnvifOptions OnvifRequestOptions OnvifServices -OnvifVersion PTControlDirection PTControlDirectionOptions -PTZCapabilities PTZConfiguration PTZConfigurationExtension PTZConfigurationOptions @@ -101,27 +69,15 @@ PTZStatus PTZVector PanTiltLimits -PrefixedIPv4Address -PrefixedIPv6Address Profile -ProfileCapabilities ProfileExtension Range -RealTimeStreamingCapabilities -ReceiverCapabilities -RecordingCapabilities Rectangle RelativeMoveOptions RemovePresetOptions -ReplayCapabilities Rotate RuleEngineConfiguration SceneOrientation -Scope -SearchCapabilities -SecurityCapabilities -SecurityCapabilitiesExtension -SecurityCapabilitiesExtension2 SetHomePositionOptions SetPresetOptions SetPresetResponse @@ -129,8 +85,6 @@ Space1DDescription Space2DDescription StopOptions -SystemCapabilities -SystemCapabilitiesExtension ToneCompensation Vector1D Vector2D @@ -150,12 +104,9 @@ WideDynamicRange WideDynamicRange20 ZoomLimits -

    Type Aliases

    Type Aliases

    Variables

    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/types/AnyURI.html b/docs/types/AnyURI.html deleted file mode 100644 index 35e4d27c..00000000 --- a/docs/types/AnyURI.html +++ /dev/null @@ -1 +0,0 @@ -AnyURI | onvif

    Type Alias AnyURI

    AnyURI: string
    \ No newline at end of file diff --git a/docs/types/Duration.html b/docs/types/Duration.html index 2aaa84e5..b9b68d8a 100644 --- a/docs/types/Duration.html +++ b/docs/types/Duration.html @@ -1 +1 @@ -Duration | onvif

    Type Alias Duration

    Duration: string
    \ No newline at end of file +Duration | onvif

    Type Alias Duration

    Duration: string
    \ No newline at end of file diff --git a/docs/types/Name.html b/docs/types/Name.html deleted file mode 100644 index 779b362d..00000000 --- a/docs/types/Name.html +++ /dev/null @@ -1 +0,0 @@ -Name | onvif

    Type Alias Name

    Name: string
    \ No newline at end of file diff --git a/docs/types/ReferenceToken.html b/docs/types/ReferenceToken.html deleted file mode 100644 index 5faedd23..00000000 --- a/docs/types/ReferenceToken.html +++ /dev/null @@ -1 +0,0 @@ -ReferenceToken | onvif

    Type Alias ReferenceToken

    ReferenceToken: string
    \ No newline at end of file diff --git a/docs/variables/Discovery.html b/docs/variables/Discovery.html index 44eaace4..6923b2c1 100644 --- a/docs/variables/Discovery.html +++ b/docs/variables/Discovery.html @@ -1,9 +1,9 @@ Discovery | onvif

    Variable DiscoveryConst

    Discovery: DiscoverySingleton = DiscoverySingleton.getInstance

    Singleton for the discovery to provide probe method Discovery.probe

    -
    import { Discovery } from 'onvif';
    Discovery.on('device', async (cam) => {
    // function would be called as soon as NVT responses
    cam.username = <USERNAME>;
    cam.password = <PASSWORD>;
    await cam.connect();
    })
    Discovery.probe(); +
    import { Discovery } from 'onvif';
    Discovery.on('device', async (cam) => {
    // function would be called as soon as NVT responses
    cam.username = <USERNAME>;
    cam.password = <PASSWORD>;
    await cam.connect();
    })
    Discovery.probe();
    -
    import { Discovery } from 'onvif';
    (async () => {
    const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect());
    console.log(await cams[0]?.getSystemDateAndTime());
    })(); +
    import { Discovery } from 'onvif';
    (async () => {
    const cams = Promise.all((await Discovery.probe()).map(camera => camera.connect());
    console.log(await cams[0]?.getSystemDateAndTime());
    })();
    -
    \ No newline at end of file +
    \ No newline at end of file From 867b898835d544782d483a3a0bf11d5f5905d825 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 30 Jun 2024 01:58:55 +0300 Subject: [PATCH 099/112] chore: improve types --- package-lock.json | 11 +++ package.json | 3 +- src/compatibility/cam.ts | 3 +- src/device.ts | 188 +------------------------------------- src/interfaces/basics.ts | 1 - src/interfaces/display.ts | 14 ++- src/onvif.ts | 10 +- src/ptz.ts | 4 +- 8 files changed, 36 insertions(+), 198 deletions(-) diff --git a/package-lock.json b/package-lock.json index 773c7fc0..b50c4432 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "prettier": "^3.2.5", "tsx": "^4.15.8", "typedoc": "^0.26.2", + "typedoc-plugin-missing-exports": "^3.0.0", "typescript": "^5.5.2" }, "engines": { @@ -6057,6 +6058,16 @@ "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" } }, + "node_modules/typedoc-plugin-missing-exports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-3.0.0.tgz", + "integrity": "sha512-R7D8fYrK34mBFZSlF1EqJxfqiUSlQSmyrCiQgTQD52nNm6+kUtqwiaqaNkuJ2rA2wBgWFecUA8JzHT7x2r7ePg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typedoc": "0.26.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", diff --git a/package.json b/package.json index c6982a58..3e3cfe5c 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "build": "tsc --build", "watch": "tsc --build --watch", - "typedoc": "typedoc src", + "typedoc": "typedoc --excludeExternals --plugin typedoc-plugin-missing-exports src", "jsdoc": "jsdoc ./lib/*.js --readme ./README.md --destination ./docs", "gh-pages": "jsdoc ./lib/*.js --readme ./README.md --destination ./", "lint-js": "eslint lib/*.js", @@ -79,6 +79,7 @@ "prettier": "^3.2.5", "tsx": "^4.15.8", "typedoc": "^0.26.2", + "typedoc-plugin-missing-exports": "^3.0.0", "typescript": "^5.5.2" } } diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 83b622b8..5f4009cd 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -4,7 +4,7 @@ import { EventEmitter } from 'events'; import { - Onvif, OnvifRequestOptions, ReferenceToken, SetSystemDateAndTimeOptions, + Onvif, OnvifRequestOptions, SetSystemDateAndTimeOptions, } from '../onvif'; import { GetSnapshotUriOptions, GetStreamUriOptions } from '../media'; import { @@ -18,6 +18,7 @@ import { import { SetNTP } from '../interfaces/devicemgmt'; import { NetworkHostType } from '../interfaces/onvif'; import { GetOSDs } from '../interfaces/media.2'; +import { ReferenceToken } from '../interfaces/common'; export type Callback = (error: any, result?: any) => void; export type CompatibilityAbsoluteMoveOptions = AbsoluteMoveOptions & { x?: number; y?: number; zoom?: number }; diff --git a/src/device.ts b/src/device.ts index 373041de..bf7105eb 100644 --- a/src/device.ts +++ b/src/device.ts @@ -1,11 +1,11 @@ import url from 'url'; import { - Onvif, OnvifServices, ReferenceToken, SetSystemDateAndTimeOptions, + Onvif, OnvifServices, SetSystemDateAndTimeOptions, } from './onvif'; import { linerase } from './utils'; import { DeviceServiceCapabilities, - GetCapabilities, GetCapabilitiesResponse, + GetCapabilities, GetCapabilitiesResponse, GetDeviceInformationResponse, GetServices, GetServicesResponse, Service, @@ -13,188 +13,10 @@ import { } from './interfaces/devicemgmt'; import { Capabilities, CapabilitiesExtension, - DNSInformation, - IPv4Address, - IPv6Address, - NTPInformation, + DNSInformation, HostnameInformation, NetworkInterface, + NTPInformation, Scope, } from './interfaces/onvif'; -export interface OnvifVersion { - /** Major version number */ - major: number; - /** - * Two digit minor version number. - * If major version number is less than "16", X.0.1 maps to "01" and X.2.1 maps to "21" where X stands for Major version number. - * Otherwise, minor number is month of release, such as "06" for June - */ - minor: number; -} - -export interface HostnameInformation { - /** Indicates whether the hostname is obtained from DHCP or not */ - fromDHCP: boolean; - /** Indicates the hostname */ - name?: string; - extension?: any; -} - -export interface DeviceInformation { - /** The manufactor of the device */ - manufacturer: string; - /** The device model */ - model: string; - /** The firmware version in the device */ - firmwareVersion: string; - /** The serial number of the device */ - serialNumber: string; - /** The hardware ID of the device */ - hardwareId: string; -} - -export interface Scope { - /** Indicates if the scope is fixed or configurable */ - scopeDef: 'Fixed' | 'Configurable'; - /** Scope item URI */ - scopeItem: string; -} - -export interface NetworkInterfaceInfo { - /* Network interface name, for example eth0. */ - name?: string; - /* Network interface MAC address. */ - hwAddress: string; - /* Maximum transmission unit. */ - MTU?: number; -} - -export interface NetworkInterfaceConnectionSetting { - /* Auto negotiation on/off. */ - autoNegotiation: boolean; - /* Speed. */ - speed: number; - /* Duplex type, Half or Full. */ - duplex: 'Full' | 'Half'; -} - -export interface NetworkInterfaceLink { - /* Configured link settings. */ - adminSettings: NetworkInterfaceConnectionSetting; - /* Current active link settings. */ - operSettings: NetworkInterfaceConnectionSetting; - /* Integer indicating interface type, for example: 6 is ethernet. */ - interfaceType: number; -} - -export interface PrefixedIPv4Address { - /** IPv4 address */ - address: IPv4Address; - // Prefix/submask length - prefixLength: number; -} - -export interface IPv4Configuration { - /** List of manually added IPv4 addresses. */ - manual?: PrefixedIPv4Address[]; - /** Link local address. */ - linkLocal?: PrefixedIPv4Address; - /** IPv4 address configured by using DHCP. */ - fromDHCP?: PrefixedIPv4Address; - /** Indicates whether or not DHCP is used. */ - DHCP?: boolean; - /** Indicates whether or not IPv4 is enabled. */ - enabled?: boolean; -} - -export interface IPv4NetworkInterface { - /** Indicates whether or not IPv4 is enabled. */ - enabled: boolean; - /** IPv4 configuration. */ - config?: IPv4Configuration; -} - -export interface PrefixedIPv6Address { - /** IPv6 address */ - address: IPv6Address; - /** Prefix/submask length */ - prefixLength: number; -} - -export interface IPv6Configuration { - /** Indicates whether router advertisment is used. */ - acceptRouterAdvert?: boolean; - /** Indicates whether or not IPv6 is enabled. */ - enabled?: boolean; - /** DHCP configuration. */ - DHCP: 'Auto' | 'Stateful' | 'Stateless' | 'Off'; - /** List of manually entered IPv6 addresses. */ - manual?: PrefixedIPv6Address[]; - /** List of link local IPv6 addresses. */ - linkLocal?: PrefixedIPv6Address[]; - /** List of IPv6 addresses configured by using DHCP. */ - fromDHCP?: PrefixedIPv6Address[]; - /** List of IPv6 addresses configured by using router advertisment. */ - fromRA?: PrefixedIPv6Address[]; - extension?: any; -} - -export interface IPv6NetworkInterface { - /* Indicates whether or not IPv6 is enabled. */ - enabled: boolean; - /* IPv4 configuration. */ - config: IPv6Configuration; -} - -export interface Dot11PSKSet { - /* According to IEEE802.11-2007 H.4.1 the RSNA PSK consists of 256 bits, or 64 octets when represented in hex - Either Key or Passphrase shall be given, if both are supplied Key shall be used by the device and Passphrase ignored. */ - key?: number; - /* According to IEEE802.11-2007 H.4.1 a pass-phrase is a sequence of between 8 and 63 ASCII-encoded characters and - each character in the pass-phrase must have an encoding in the range of 32 to 126 (decimal),inclusive. - If only Passpharse is supplied the Key shall be derived using the algorithm described in IEEE802.11-2007 section H.4 */ - passphrase?: string; - extension?: any; -} - -export interface Dot11SecurityConfiguration { - mode: 'None' | 'WEP' | 'PSK' | 'Dot1X' | 'Extended'; - algorithm?: 'CCMP' | 'TKIP' | 'Any' | 'Extended'; - PSK?: Dot11PSKSet; - dot1X?: ReferenceToken; - extension?: any; -} - -export interface Dot11Configuration { - SSID: number; - mode: 'Ad-hoc' | 'Infrastructure' | 'Extended'; - alias: string; - priority: number; - security: Dot11SecurityConfiguration; -} - -export interface NetworkInterfaceExtension { - interfaceType: number; - /* Extension point prepared for future 802.3 configuration. */ - dot3?: any; - dot11?: Dot11Configuration; - extension?: any; -} - -export interface NetworkInterface { - /* Unique identifier referencing the physical entity. */ - token: ReferenceToken; - /* Indicates whether or not an interface is enabled. */ - enabled: boolean; - /* Network interface information */ - info?: NetworkInterfaceInfo; - /* Link configuration. */ - link?: NetworkInterfaceLink; - // IPv4 network interface configuration. - IPv4?: IPv4NetworkInterface; - // IPv6 network interface configuration. - IPv6?: IPv6NetworkInterface; - extension?: NetworkInterfaceExtension; -} - /** * Device methods */ @@ -312,7 +134,7 @@ export class Device { /** * Receive device information */ - async getDeviceInformation(): Promise { + async getDeviceInformation(): Promise { const [data] = await this.onvif.request({ body : '' }); this.onvif.deviceInformation = linerase(data).getDeviceInformationResponse; return this.onvif.deviceInformation!; diff --git a/src/interfaces/basics.ts b/src/interfaces/basics.ts index e04d29c1..027a7abb 100644 --- a/src/interfaces/basics.ts +++ b/src/interfaces/basics.ts @@ -1,4 +1,3 @@ -/* eslint-disable import/export, no-tabs */ export type AnyURI = string; export type FilterType = object; export type NCName = string; diff --git a/src/interfaces/display.ts b/src/interfaces/display.ts index 30a6823c..337ac593 100644 --- a/src/interfaces/display.ts +++ b/src/interfaces/display.ts @@ -1,6 +1,11 @@ +import { Capabilities, Layout, LayoutOptions, CodingCapabilities, PaneConfiguration } from './onvif'; import { ReferenceToken } from './common'; -import { Layout, LayoutOptions, CodingCapabilities, PaneConfiguration } from './onvif'; +export interface GetServiceCapabilities {} +export interface GetServiceCapabilitiesResponse { + /** The capabilities for the display service is returned in the Capabilities element. */ + capabilities?: Capabilities; +} export interface GetLayout { /** Token of the Video Output whose Layout is requested */ videoOutput?: ReferenceToken; @@ -10,7 +15,7 @@ export interface GetLayoutResponse { layout?: Layout; } export interface SetLayout { - /** Token of the Video Output whose Layout shall be changed */ + /** Token of the Video Output whose Layout shall be changed. */ videoOutput?: ReferenceToken; /** Layout to be set */ layout?: Layout; @@ -67,7 +72,10 @@ export interface CreatePaneConfiguration { /** Configuration of the pane to be created. */ paneConfiguration?: PaneConfiguration; } -export interface CreatePaneConfigurationResponse {} +export interface CreatePaneConfigurationResponse { + /** Token of the new pane configuration. */ + paneToken?: ReferenceToken; +} export interface DeletePaneConfiguration { /** Token of the video output where the pane shall be deleted. */ videoOutput?: ReferenceToken; diff --git a/src/onvif.ts b/src/onvif.ts index 84520617..ac4d46ac 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -5,15 +5,11 @@ import http from 'http'; import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; -import { Device, DeviceInformation } from './device'; +import { Device } from './device'; import { Media, Profile } from './media'; import { PTZ } from './ptz'; import { Capabilities } from './interfaces/onvif'; - -// Common types -export type AnyURI = string; -export type ReferenceToken = string; -export type Name = string; +import { GetDeviceInformationResponse } from './interfaces/devicemgmt'; /** * Cam constructor options @@ -178,7 +174,7 @@ export class Onvif extends EventEmitter { private activeSources: ActiveSource[] = []; public activeSource?: ActiveSource; public readonly urn?: string; - public deviceInformation?: DeviceInformation; + public deviceInformation?: GetDeviceInformationResponse; constructor(options: OnvifOptions) { super(); diff --git a/src/ptz.ts b/src/ptz.ts index 702facb7..a28a4738 100644 --- a/src/ptz.ts +++ b/src/ptz.ts @@ -1,9 +1,9 @@ -import { type } from 'os'; -import { Onvif, ReferenceToken } from './onvif'; +import { Onvif } from './onvif'; import { linerase } from './utils'; import { Duration, PTZConfiguration, PTZSpeed, Space1DDescription, Space2DDescription, Vector1D, Vector2D, } from './media'; +import { ReferenceToken } from './interfaces/common'; export interface PTZPresetTourSupported { /** Indicates number of preset tours that can be created. Required preset tour operations shall be available for this From e883a5daf878ea948f0e199a6817605a2faea63b Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 30 Jun 2024 14:32:10 +0300 Subject: [PATCH 100/112] feat: getServiceCapabilities --- CHECKED.md | 2 +- src/compatibility/cam.ts | 2 +- src/device.ts | 17 ++++++----------- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index 0f3eff39..d1579401 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -6,7 +6,7 @@ ONVIF Interfaces - [ ] getSystemDateAndTime - [ ] setSystemDateAndTime - [x] getCapabilities Capabilities -> GetCapabilitiesResponse -- [ ] getServiceCapabilities +- [x] getServiceCapabilities - [ ] getActiveSources - [x] getServices includeCapability wrapped into object - [ ] getDeviceInformation diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 5f4009cd..704991c5 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -103,7 +103,7 @@ export class Cam extends EventEmitter { getServiceCapabilities(callback: Callback) { this.onvif.device.getServiceCapabilities() - .then((result) => callback(null, result)).catch(callback); + .then((result) => callback(null, result.capabilities)).catch(callback); } getActiveSources(callback: Callback) { diff --git a/src/device.ts b/src/device.ts index bf7105eb..0a02e665 100644 --- a/src/device.ts +++ b/src/device.ts @@ -5,7 +5,7 @@ import { import { linerase } from './utils'; import { DeviceServiceCapabilities, - GetCapabilities, GetCapabilitiesResponse, GetDeviceInformationResponse, + GetCapabilities, GetCapabilitiesResponse, GetDeviceInformationResponse, GetServiceCapabilitiesResponse, GetServices, GetServicesResponse, Service, @@ -186,21 +186,16 @@ export class Device { /** * Returns the capabilities of the device service. The result is returned in a typed answer */ - async getServiceCapabilities() { + async getServiceCapabilities(): Promise { const [data] = await this.onvif.request({ body : '', }); - const capabilitiesResponse = linerase(data); - this.#serviceCapabilities = { - network : capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.network, - security : capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.security, - system : capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.system, - }; + const capabilitiesResponse = linerase(data).getServiceCapabilitiesResponse; + this.#serviceCapabilities = capabilitiesResponse.capabilities; if (capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc) { - this.#serviceCapabilities.misc = capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc; - this.#serviceCapabilities.misc!.auxiliaryCommands = capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc.AuxiliaryCommands.split(' '); + this.#serviceCapabilities.misc!.auxiliaryCommands = capabilitiesResponse.getServiceCapabilitiesResponse.capabilities.misc.auxiliaryCommands.split(' '); } - return this.#serviceCapabilities; + return capabilitiesResponse; } /** From 238a9a5a64b9bf374a647c7a5bf71db75a304a70 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 30 Jun 2024 14:54:01 +0300 Subject: [PATCH 101/112] feat: getVideoSources --- CHECKED.md | 4 ++-- fun/test.ts | 2 +- src/compatibility/cam.ts | 2 +- src/media.ts | 12 +++++------- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index d1579401..70a2c463 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -6,7 +6,7 @@ ONVIF Interfaces - [ ] getSystemDateAndTime - [ ] setSystemDateAndTime - [x] getCapabilities Capabilities -> GetCapabilitiesResponse -- [x] getServiceCapabilities +- [x] getServiceCapabilities DeviceServiceCapabilities -> GetServiceCapabilitiesResponse - [ ] getActiveSources - [x] getServices includeCapability wrapped into object - [ ] getDeviceInformation @@ -44,7 +44,7 @@ ONVIF Interfaces - [ ] _eventPull - [ ] _restartEventRequest - [ ] parseEventXML -- [ ] getVideoSources +- [x] getVideoSources - [ ] getVideoSourceConfigurations - [ ] getVideoEncoderConfiguration - [ ] getVideoEncoderConfigurationOptions diff --git a/fun/test.ts b/fun/test.ts index 24a7f1fd..9075bbfc 100644 --- a/fun/test.ts +++ b/fun/test.ts @@ -55,7 +55,7 @@ import { Cam as CamJs } from '../promises'; // console.log((await camJs.getOSDOptions())); // console.log((await cam.media.getOSDOptions({ }))); - console.log((await cam.device.getCapabilities()).capabilities.extension); + console.log((await cam.media.getVideoSources())); // console.log((await camJs.getCapabilities())); })().catch((e) => { console.error(e); diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 704991c5..58c27e32 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -113,7 +113,7 @@ export class Cam extends EventEmitter { } getVideoSources(callback: Callback) { - this.onvif.media.getVideoSources().then((result) => callback(null, result)).catch(callback); + this.onvif.media.getVideoSources().then((result) => callback(null, result.videoSources)).catch(callback); } getServices(includeCapability: boolean | Callback, callback: Callback) { diff --git a/src/media.ts b/src/media.ts index 50c1c0e6..a1c992f0 100644 --- a/src/media.ts +++ b/src/media.ts @@ -4,6 +4,7 @@ import { IPAddress, Name } from './interfaces/onvif'; import { ReferenceToken } from './interfaces/common'; import { AnyURI } from './interfaces/basics'; import { GetOSDOptions, GetOSDOptionsResponse, GetOSDs, GetOSDsResponse } from './interfaces/media.2'; +import { GetVideoSourcesResponse } from './interfaces/media'; export interface IntRectangle { x: number; @@ -1006,17 +1007,14 @@ export class Media { return this.profiles; } - async getVideoSources() { + async getVideoSources(): Promise { const [data] = await this.onvif.request({ service : 'media', body : '', }); - const a = linerase(data); - this.videoSources = linerase(data).getVideoSourcesResponse.videoSources; - // videoSources is an array of video sources, but linerase remove the array if there is only one element inside, - // so we convert it back to an array - if (!Array.isArray(this.videoSources)) { this.videoSources = [this.videoSources]; } - return this.videoSources; + const videoSourcesResponse = linerase(data, { array : ['videoSources'] }).getVideoSourcesResponse; + this.videoSources = videoSourcesResponse.videoSources; + return videoSourcesResponse; } /** From 177c3dbf96ff06e13ec190bd4290e3b7f1286b66 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 30 Jun 2024 19:58:56 +0300 Subject: [PATCH 102/112] chore: specs update --- src/interfaces/humanbody.2.ts | 6 +++--- src/interfaces/humanface.2.ts | 13 +++++++++--- src/interfaces/media.2.ts | 35 +++++++++++++++++++++++++++++++- src/interfaces/metadatastream.ts | 1 - 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/interfaces/humanbody.2.ts b/src/interfaces/humanbody.2.ts index 7e64d398..93dbe34c 100644 --- a/src/interfaces/humanbody.2.ts +++ b/src/interfaces/humanbody.2.ts @@ -1,12 +1,12 @@ import { ColorDescriptor } from './common'; export type BodyShape = 'Fat' | 'Thin' | 'Other'; -export type TopsCategory = 'LongSleeve' | 'ShortSleeve' | 'Other'; +export type TopsCategory = 'LongSleeve' | 'ShortSleeve' | 'Sleeveless' | 'Other'; export type Grain = 'Stria' | 'Plaid' | 'PureColour' | 'Decal' | 'Other'; -export type TopsStyle = 'Tailor' | 'Jacket' | 'Sweater' | 'Overcoat' | 'Dress' | 'Other'; +export type TopsStyle = 'Tailor' | 'Jacket' | 'Shirt' | 'Sweater' | 'Overcoat' | 'Dress' | 'Vest' | 'Other'; export type BottomsCategory = 'Trousers' | 'Shorts' | 'Skirt' | 'Other'; export type BottomsStyle = 'FornalPants' | 'Jeans' | 'Other'; -export type ShoesCategory = 'LeatherShoes' | 'Sneakers' | 'Sandal' | 'Slipper' | 'Other'; +export type ShoesCategory = 'Boots' | 'LeatherShoes' | 'Sneakers' | 'Sandal' | 'Slipper' | 'Other'; export type KnapsackCategory = 'SingleShoulderBag' | 'Backpack' | 'Other'; export type CartCategory = 'BabyCarriage' | 'TwoWheelVehicle' | 'Tricyle' | 'Other'; export type Smoking = 'NoSmoking' | 'Cigar' | 'ElectronicCigarettes' | 'Other'; diff --git a/src/interfaces/humanface.2.ts b/src/interfaces/humanface.2.ts index e2e557a9..7d0a45ba 100644 --- a/src/interfaces/humanface.2.ts +++ b/src/interfaces/humanface.2.ts @@ -10,7 +10,7 @@ export type EyebrowSpace = 'Joint' | 'Separate'; export type EyeShape = 'Almond' | 'Round' | 'Other'; export type Eyelid = 'Single' | 'Double' | 'Other'; export type Eyeball = 'Black' | 'Blue' | 'Brown' | 'Gray' | 'Green' | 'Pink' | 'Other'; -export type Ear = 'Round' | 'Pointed' | 'Narrow' | 'BroadLobe' | 'Other'; +export type EarShape = 'Round' | 'Pointed' | 'Narrow' | 'BroadLobe' | 'Other'; export type NoseLength = 'Short' | 'Long'; export type NoseBridge = 'Straight' | 'Arch'; export type NoseWing = 'Narrow' | 'Broad'; @@ -18,6 +18,8 @@ export type NoseEnd = 'Snub' | 'Turnedup' | 'Flat' | 'Hooked' | 'Other'; export type Lip = 'Full' | 'Medium' | 'Thin'; export type Chin = 'Double' | 'Pointed' | 'Round'; export type Expression = 'Natural' | 'Smile' | 'RaisedEyebrows' | 'Squint' | 'Frown' | 'Other'; +export type HatType = 'Cap'; +export type HelmetType = 'ConstructionCap' | 'CycleCap' | 'RidingHat'; export type FrecklesType = 'AroundCheek' | 'Nose' | 'forehead' | 'Other'; export interface Hair { /** @@ -84,6 +86,11 @@ export interface AccessoryDescription { wear?: boolean; /** Describe the Color of the accessory. */ color?: ColorDescriptor; + /** + * Optional subtype of the accessory. For definitions refer enumerations starting with + * the accessory name followed by 'Type' like fc:HatType or fc:HelmetType. + */ + subtype?: string; } export interface Accessory { /** Describe if the object wear opticals. */ @@ -130,8 +137,8 @@ export interface HumanFace { eyebrow?: Eyebrow; /** Describe the eye of the face. */ eye?: Eye; - /** Describe the Ear of the face. */ - ear?: Ear; + /** Describe the Ear of the face. For definitions see fc:EarShape. */ + ear?: string; /** Describe the nose of the face. */ nose?: Nose; /** Describe the facial hair of the face. */ diff --git a/src/interfaces/media.2.ts b/src/interfaces/media.2.ts index 7a0f3df6..c0d63334 100644 --- a/src/interfaces/media.2.ts +++ b/src/interfaces/media.2.ts @@ -226,14 +226,17 @@ export interface WebRTCConfiguration { defaultProfile?: ReferenceToken; /** Enables/disables the configuration. */ enabled?: boolean; - /** Enables/disables the configuration. */ + /** Indicates if the device is connected to the server. This parameter is read-only. */ connected?: boolean; + /** Optional user readable error information (readonly). */ + error?: string; } export interface GetServiceCapabilities {} export interface GetServiceCapabilitiesResponse { /** The capabilities for the media service is returned in the Capabilities element. */ capabilities?: Capabilities2; } +export interface Capabilities extends Capabilities2 {} export interface CreateProfile { /** friendly name of the profile to be created */ name?: Name; @@ -278,34 +281,42 @@ export interface DeleteProfile { token?: ReferenceToken; } export interface DeleteProfileResponse {} +export interface GetVideoEncoderConfigurations extends GetConfiguration {} export interface GetVideoEncoderConfigurationsResponse { /** This element contains a list of video encoder configurations. */ configurations?: VideoEncoder2Configuration[]; } +export interface GetVideoSourceConfigurations extends GetConfiguration {} export interface GetVideoSourceConfigurationsResponse { /** This element contains a list of video source configurations. */ configurations?: VideoSourceConfiguration[]; } +export interface GetAudioEncoderConfigurations extends GetConfiguration {} export interface GetAudioEncoderConfigurationsResponse { /** This element contains a list of audio encoder configurations. */ configurations?: AudioEncoder2Configuration[]; } +export interface GetAudioSourceConfigurations extends GetConfiguration {} export interface GetAudioSourceConfigurationsResponse { /** This element contains a list of audio source configurations. */ configurations?: AudioSourceConfiguration[]; } +export interface GetAnalyticsConfigurations extends GetConfiguration {} export interface GetAnalyticsConfigurationsResponse { /** This element contains a list of Analytics configurations. */ configurations?: VideoAnalyticsConfiguration[]; } +export interface GetMetadataConfigurations extends GetConfiguration {} export interface GetMetadataConfigurationsResponse { /** This element contains a list of metadata configurations */ configurations?: MetadataConfiguration[]; } +export interface GetAudioOutputConfigurations extends GetConfiguration {} export interface GetAudioOutputConfigurationsResponse { /** This element contains a list of audio output configurations */ configurations?: AudioOutputConfiguration[]; } +export interface GetAudioDecoderConfigurations extends GetConfiguration {} export interface GetAudioDecoderConfigurationsResponse { /** This element contains a list of audio decoder configurations */ configurations?: AudioDecoderConfiguration[]; @@ -314,53 +325,67 @@ export interface SetVideoEncoderConfiguration { /** Contains the modified video encoder configuration. The configuration shall exist in the device. */ configuration?: VideoEncoder2Configuration; } +export interface SetVideoEncoderConfigurationResponse extends SetConfigurationResponse {} export interface SetVideoSourceConfiguration { /** Contains the modified video source configuration. The configuration shall exist in the device. */ configuration?: VideoSourceConfiguration; } +export interface SetVideoSourceConfigurationResponse extends SetConfigurationResponse {} export interface SetAudioEncoderConfiguration { /** Contains the modified audio encoder configuration. The configuration shall exist in the device. */ configuration?: AudioEncoder2Configuration; } +export interface SetAudioEncoderConfigurationResponse extends SetConfigurationResponse {} export interface SetAudioSourceConfiguration { /** Contains the modified audio source configuration. The configuration shall exist in the device. */ configuration?: AudioSourceConfiguration; } +export interface SetAudioSourceConfigurationResponse extends SetConfigurationResponse {} export interface SetMetadataConfiguration { /** Contains the modified metadata configuration. The configuration shall exist in the device. */ configuration?: MetadataConfiguration; } +export interface SetMetadataConfigurationResponse extends SetConfigurationResponse {} export interface SetAudioOutputConfiguration { /** Contains the modified audio output configuration. The configuration shall exist in the device. */ configuration?: AudioOutputConfiguration; } +export interface SetAudioOutputConfigurationResponse extends SetConfigurationResponse {} export interface SetAudioDecoderConfiguration { /** Contains the modified audio decoder configuration. The configuration shall exist in the device. */ configuration?: AudioDecoderConfiguration; } +export interface SetAudioDecoderConfigurationResponse extends SetConfigurationResponse {} +export interface GetVideoSourceConfigurationOptions extends GetConfiguration {} export interface GetVideoSourceConfigurationOptionsResponse { /** This message contains the video source configuration options. If a video source configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ options?: VideoSourceConfigurationOptions; } +export interface GetVideoEncoderConfigurationOptions extends GetConfiguration {} export interface GetVideoEncoderConfigurationOptionsResponse { options?: VideoEncoder2ConfigurationOptions[]; } +export interface GetAudioSourceConfigurationOptions extends GetConfiguration {} export interface GetAudioSourceConfigurationOptionsResponse { /** This message contains the audio source configuration options. If a audio source configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ options?: AudioSourceConfigurationOptions; } +export interface GetAudioEncoderConfigurationOptions extends GetConfiguration {} export interface GetAudioEncoderConfigurationOptionsResponse { /** This message contains the audio encoder configuration options. If a audio encoder configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ options?: AudioEncoder2ConfigurationOptions[]; } +export interface GetMetadataConfigurationOptions extends GetConfiguration {} export interface GetMetadataConfigurationOptionsResponse { /** This message contains the metadata configuration options. If a metadata configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ options?: MetadataConfigurationOptions; } +export interface GetAudioOutputConfigurationOptions extends GetConfiguration {} export interface GetAudioOutputConfigurationOptionsResponse { /** This message contains the audio output configuration options. If a audio output configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ options?: AudioOutputConfigurationOptions; } +export interface GetAudioDecoderConfigurationOptions extends GetConfiguration {} export interface GetAudioDecoderConfigurationOptionsResponse { /** This message contains the audio decoder configuration options. If a audio decoder configuration is specified, the options shall concern that particular configuration. If a media profile is specified, the options shall be compatible with that media profile. If no tokens are specified, the options shall be considered generic for the device. */ options?: AudioEncoder2ConfigurationOptions[]; @@ -396,6 +421,10 @@ export interface GetSnapshotUriResponse { /** Stable Uri to be used for requesting snapshot images. */ uri?: AnyURI; } +export interface StartMulticastStreaming extends StartStopMulticastStreaming {} +export interface StartMulticastStreamingResponse extends SetConfigurationResponse {} +export interface StopMulticastStreaming extends StartStopMulticastStreaming {} +export interface StopMulticastStreamingResponse extends SetConfigurationResponse {} export interface GetVideoSourceModes { /** Contains a video source reference for which a video source mode is requested. */ videoSourceToken?: ReferenceToken; @@ -428,6 +457,7 @@ export interface SetOSD { /** Contains the modified OSD configuration. */ OSD?: OSDConfiguration; } +export interface SetOSDResponse extends SetConfigurationResponse {} export interface GetOSDOptions { /** Video Source Configuration Token that specifies an existing video source configuration that the options shall be compatible with. */ configurationToken?: ReferenceToken; @@ -448,6 +478,7 @@ export interface DeleteOSD { /** This element contains a reference to the OSD configuration that should be deleted. */ OSDToken?: ReferenceToken; } +export interface DeleteOSDResponse extends SetConfigurationResponse {} export interface GetMasks { /** Optional mask token of an existing mask. */ token?: ReferenceToken; @@ -462,6 +493,7 @@ export interface SetMask { /** Mask to be updated. */ mask?: Mask; } +export interface SetMaskResponse extends SetConfigurationResponse {} export interface GetMaskOptions { /** Video Source Configuration Token that specifies an existing video source configuration that the options shall be compatible with. */ configurationToken?: ReferenceToken; @@ -482,6 +514,7 @@ export interface DeleteMask { /** This element contains a reference to the Mask configuration that should be deleted. */ token?: ReferenceToken; } +export interface DeleteMaskResponse extends SetConfigurationResponse {} export interface GetWebRTCConfigurations {} export interface GetWebRTCConfigurationsResponse { /** Video Source Configuration Token that specifies an existing video source configuration that the options shall be compatible with. */ diff --git a/src/interfaces/metadatastream.ts b/src/interfaces/metadatastream.ts index 975a3c70..d0c9975a 100644 --- a/src/interfaces/metadatastream.ts +++ b/src/interfaces/metadatastream.ts @@ -33,7 +33,6 @@ export type BarcodeType = | 'ISBN-10' | 'ITF-14' | 'EAN-2' - | 'EAN-2' | 'EAN-8' | 'EAN-13' | 'EAN-14' From 5beeb1800efc013e7e6c21130892550e893bcaea Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 30 Jun 2024 20:04:33 +0300 Subject: [PATCH 103/112] feat: getVideoSourceConfigurations --- CHECKED.md | 2 +- fun/test.ts | 6 ++++-- src/compatibility/cam.ts | 4 ++++ src/media.ts | 25 +++++++++++++++++++++++-- src/onvif.ts | 2 +- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index 70a2c463..82771e12 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -45,7 +45,7 @@ ONVIF Interfaces - [ ] _restartEventRequest - [ ] parseEventXML - [x] getVideoSources -- [ ] getVideoSourceConfigurations +- [x] getVideoSourceConfigurations - [ ] getVideoEncoderConfiguration - [ ] getVideoEncoderConfigurationOptions - [ ] getVideoEncoderConfigurations diff --git a/fun/test.ts b/fun/test.ts index 9075bbfc..3c74cf06 100644 --- a/fun/test.ts +++ b/fun/test.ts @@ -55,8 +55,10 @@ import { Cam as CamJs } from '../promises'; // console.log((await camJs.getOSDOptions())); // console.log((await cam.media.getOSDOptions({ }))); - console.log((await cam.media.getVideoSources())); - // console.log((await camJs.getCapabilities())); + console.log((await camJs.getVideoSourceConfigurations())); + console.log((await cam.media.getVideoSourceConfigurations({ + configurationToken : 'VideoSourceConfigVideoSourceConfig', + }))); })().catch((e) => { console.error(e); console.log(e.rawPacket.toString()); diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index 58c27e32..f01ced4b 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -116,6 +116,10 @@ export class Cam extends EventEmitter { this.onvif.media.getVideoSources().then((result) => callback(null, result.videoSources)).catch(callback); } + getVideoSourceConfigurations(callback: Callback) { + this.onvif.media.getVideoSourceConfigurations().then((result) => callback(null, result.configurations)).catch(callback); + } + getServices(includeCapability: boolean | Callback, callback: Callback) { if (callback) { this.onvif.device.getServices({ includeCapability : includeCapability as boolean }) diff --git a/src/media.ts b/src/media.ts index a1c992f0..d59a97f0 100644 --- a/src/media.ts +++ b/src/media.ts @@ -3,8 +3,14 @@ import { linerase } from './utils'; import { IPAddress, Name } from './interfaces/onvif'; import { ReferenceToken } from './interfaces/common'; import { AnyURI } from './interfaces/basics'; -import { GetOSDOptions, GetOSDOptionsResponse, GetOSDs, GetOSDsResponse } from './interfaces/media.2'; -import { GetVideoSourcesResponse } from './interfaces/media'; +import { + GetOSDOptions, + GetOSDOptionsResponse, + GetOSDs, + GetOSDsResponse, + GetVideoSourceConfigurations, +} from './interfaces/media.2'; +import { GetVideoSourceConfigurationsResponse, GetVideoSourcesResponse } from './interfaces/media'; export interface IntRectangle { x: number; @@ -1017,6 +1023,21 @@ export class Media { return videoSourcesResponse; } + async getVideoSourceConfigurations({ configurationToken, profileToken }: GetVideoSourceConfigurations = {}): + Promise { + const body = `${ + configurationToken ? `${configurationToken}` : '' + }${ + profileToken ? `${profileToken}` : '' + }`; + const service = (this.onvif.device.media2Support ? 'media2' : 'media'); + + const [data] = await this.onvif.request({ service, body }); + return linerase(data, { array : ['configurations'] }).getVideoSourceConfigurationsResponse; + } + /** * This method requests a URI that can be used to initiate a live media stream using RTSP as the control protocol. * The returned URI shall remain valid indefinitely even if the profile is changed. diff --git a/src/onvif.ts b/src/onvif.ts index ac4d46ac..ff14bc47 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -356,7 +356,7 @@ export class Onvif extends EventEmitter { } }); - this.emit('rawRequest', options.body); + this.emit('rawRequest', options.body, requestOptions); request.write(options.body); request.end(); }); From 1c1a67de766bd8e18476db2f2e8db528e45b095e Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 30 Jun 2024 20:13:49 +0300 Subject: [PATCH 104/112] feat: getVideoSourceConfigurationOptions --- CHECKED.md | 1 + fun/test.ts | 4 ++-- src/media.ts | 17 ++++++++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index 82771e12..d5ecf009 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -46,6 +46,7 @@ ONVIF Interfaces - [ ] parseEventXML - [x] getVideoSources - [x] getVideoSourceConfigurations +- [x] getVideoSourceConfigurationOptions new - [ ] getVideoEncoderConfiguration - [ ] getVideoEncoderConfigurationOptions - [ ] getVideoEncoderConfigurations diff --git a/fun/test.ts b/fun/test.ts index 3c74cf06..e0a28ec9 100644 --- a/fun/test.ts +++ b/fun/test.ts @@ -55,8 +55,8 @@ import { Cam as CamJs } from '../promises'; // console.log((await camJs.getOSDOptions())); // console.log((await cam.media.getOSDOptions({ }))); - console.log((await camJs.getVideoSourceConfigurations())); - console.log((await cam.media.getVideoSourceConfigurations({ + // console.log((await camJs.getVideoSourceConfigurations())); + console.log((await cam.media.getVideoSourceConfigurationOptions({ configurationToken : 'VideoSourceConfigVideoSourceConfig', }))); })().catch((e) => { diff --git a/src/media.ts b/src/media.ts index d59a97f0..529aba13 100644 --- a/src/media.ts +++ b/src/media.ts @@ -7,7 +7,7 @@ import { GetOSDOptions, GetOSDOptionsResponse, GetOSDs, - GetOSDsResponse, + GetOSDsResponse, GetVideoSourceConfigurationOptions, GetVideoSourceConfigurationOptionsResponse, GetVideoSourceConfigurations, } from './interfaces/media.2'; import { GetVideoSourceConfigurationsResponse, GetVideoSourcesResponse } from './interfaces/media'; @@ -1038,6 +1038,21 @@ export class Media { return linerase(data, { array : ['configurations'] }).getVideoSourceConfigurationsResponse; } + async getVideoSourceConfigurationOptions({ configurationToken, profileToken }: GetVideoSourceConfigurationOptions = {}): + Promise { + const body = `${ + configurationToken ? `${configurationToken}` : '' + }${ + profileToken ? `${profileToken}` : '' + }`; + const service = (this.onvif.device.media2Support ? 'media2' : 'media'); + + const [data] = await this.onvif.request({ service, body }); + return linerase(data, { array : ['videoSourceTokensAvailable'] }).getVideoSourceConfigurationOptionsResponse; + } + /** * This method requests a URI that can be used to initiate a live media stream using RTSP as the control protocol. * The returned URI shall remain valid indefinitely even if the profile is changed. From 9185a7f146416d5a5a7136c499b31318060ebd4b Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sun, 30 Jun 2024 22:23:22 +0300 Subject: [PATCH 105/112] feat: getVideoEncoderConfigurations --- CHECKED.md | 2 +- README.md | 10 +- fun/test.ts | 3 +- src/compatibility/cam.ts | 4 + src/media.ts | 994 +++------------------------------------ 5 files changed, 69 insertions(+), 944 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index d5ecf009..631e79f4 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -49,7 +49,7 @@ ONVIF Interfaces - [x] getVideoSourceConfigurationOptions new - [ ] getVideoEncoderConfiguration - [ ] getVideoEncoderConfigurationOptions -- [ ] getVideoEncoderConfigurations +- [x] getVideoEncoderConfigurations - [ ] setVideoEncoderConfiguration - [ ] getAudioSources - [ ] getAudioEncoderConfigurations diff --git a/README.md b/README.md index f688c8f4..dd4f21b4 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,17 @@ The library uses NodeJS. And works on the server-side. [![ONVIF](https://www.onvif.org/wp-content/themes/onvif-public/images/logo.png)](http://onvif.org) -This is a new version of the ONVIF library. Previous version was written in JS, and this the typescript library with interfaces desbring ONVIF data structures. Right now some of the methods from the v.0.6.x were implemented, the list of supportrted ONVIF commands you can find here: https://github.com/agsh/onvif/blob/v1/IMPLEMENTED.md +This is a new version of the ONVIF library. Previous version was written in JS, and this the typescript library with +interfaces descbring ONVIF data structures. Right now some of the methods from the v.0.7.x were implemented, +the list of supportrted ONVIF commands you can find here: https://github.com/agsh/onvif/blob/v1/IMPLEMENTED.md The library will be updated because other methods are currently under development. -The documentation for the new library was generated by typedoc and you can find it here: https://htmlpreview.github.io/?https://github.com/agsh/onvif/blob/v1/docs/index.html +The documentation for the new library was generated by typedoc and you can find it here: +https://htmlpreview.github.io/?https://github.com/agsh/onvif/blob/v1/docs/index.html -The code, which use the old version of the library (0.6.x), should work using the compatibility class: https://github.com/agsh/onvif/blob/v1/src/compatibility/cam.ts where all methods are located. +The code, which use the old version of the library (0.6.x), should work using the compatibility class: +https://github.com/agsh/onvif/blob/v1/src/compatibility/cam.ts where all methods are located. Thanks a lot for your interest and I will be glad to any questions and comments! diff --git a/fun/test.ts b/fun/test.ts index e0a28ec9..4e458cca 100644 --- a/fun/test.ts +++ b/fun/test.ts @@ -56,9 +56,10 @@ import { Cam as CamJs } from '../promises'; // console.log((await cam.media.getOSDOptions({ }))); // console.log((await camJs.getVideoSourceConfigurations())); - console.log((await cam.media.getVideoSourceConfigurationOptions({ + console.log((await cam.media.getVideoEncoderConfigurations({ configurationToken : 'VideoSourceConfigVideoSourceConfig', }))); + console.log(await cam.media.getProfiles()); })().catch((e) => { console.error(e); console.log(e.rawPacket.toString()); diff --git a/src/compatibility/cam.ts b/src/compatibility/cam.ts index f01ced4b..304bbea4 100644 --- a/src/compatibility/cam.ts +++ b/src/compatibility/cam.ts @@ -120,6 +120,10 @@ export class Cam extends EventEmitter { this.onvif.media.getVideoSourceConfigurations().then((result) => callback(null, result.configurations)).catch(callback); } + getVideoEncoderConfigurations(callback: Callback) { + this.onvif.media.getVideoEncoderConfigurations().then((result) => callback(null, result.configurations)).catch(callback); + } + getServices(includeCapability: boolean | Callback, callback: Callback) { if (callback) { this.onvif.device.getServices({ includeCapability : includeCapability as boolean }) diff --git a/src/media.ts b/src/media.ts index 529aba13..06074ec4 100644 --- a/src/media.ts +++ b/src/media.ts @@ -1,933 +1,30 @@ import { Onvif } from './onvif'; import { linerase } from './utils'; -import { IPAddress, Name } from './interfaces/onvif'; +import { + AudioEncoderConfiguration, MediaUri, + Profile, + VideoEncoderConfiguration, + VideoSource, +} from './interfaces/onvif'; import { ReferenceToken } from './interfaces/common'; import { AnyURI } from './interfaces/basics'; import { + ConfigurationSet, GetOSDOptions, GetOSDOptionsResponse, GetOSDs, - GetOSDsResponse, GetVideoSourceConfigurationOptions, GetVideoSourceConfigurationOptionsResponse, - GetVideoSourceConfigurations, + GetOSDsResponse, + GetVideoEncoderConfigurations, GetVideoEncoderConfigurationsResponse as GetVideoEncoder2ConfigurationsResponse, + GetVideoSourceConfigurationOptions, + GetVideoSourceConfigurationOptionsResponse, + GetVideoSourceConfigurations, MediaProfile, } from './interfaces/media.2'; -import { GetVideoSourceConfigurationsResponse, GetVideoSourcesResponse } from './interfaces/media'; - -export interface IntRectangle { - x: number; - y: number; - width: number; - height: number; -} - -export interface Rotate { - /** Parameter to enable/disable Rotation feature */ - mode: 'OFF' | 'ON' | 'AUTO'; - /** Optional parameter to configure how much degree of clockwise rotation of image for On mode. Omitting this parameter for On mode means 180 degree rotation. */ - degree?: number; - extension: any; -} - -export interface LensOffset { - /** Optional horizontal offset of the lens center in normalized coordinates */ - x: number; - /** Optional vertical offset of the lens center in normalized coordinates */ - y: number; -} - -export interface LensProjection { - /** Angle of incidence */ - angle: number; - /** Mapping radius as a consequence of the emergent angle */ - radius: number; - /** Optional ray absorption at the given angle due to vignetting. A value of one means no absorption */ - transmittance?: number; -} - -export interface LensDescription { - /** Optional focal length of the optical system */ - focalLength: number; - /** Offset of the lens center to the imager center in normalized coordinates */ - offset: LensOffset; - /** - * Radial description of the projection characteristics. - * The resulting curve is defined by the B-Spline interpolation over the given elements. - * The element for Radius zero shall not be provided. The projection points shall be ordered with ascending Radius. - * Items outside the last projection Radius shall be assumed to be invisible (black) - */ - projection: LensProjection; - /** Compensation of the x coordinate needed for the ONVIF normalized coordinate system */ - XFactor: number; -} - -export interface SceneOrientation { - /** Parameter to assign the way the camera determines the scene orientation */ - mode: 'MANUAL' | 'AUTO'; - /** - * Assigned or determined scene orientation based on the Mode. - * When assigning the Mode to AUTO, this field is optional and will be ignored by the device. - * When assigning the Mode to MANUAL, this field is required and the device will return an InvalidArgs fault if missing - */ - orientation?: string; -} - -export interface VideoSourceConfigurationExtension2 { - /** Optional element describing the geometric lens distortion. Multiple instances for future variable lens support */ - lensDescription?: LensDescription; - /** Optional element describing the scene orientation in the camera’s field of view */ - sceneOrientation: SceneOrientation; -} - -export interface VideoSourceConfigurationExtension { - /** - * Optional element to configure rotation of captured image. What resolutions a device supports shall be unaffected by the Rotate parameters. - * If a device is configured with Rotate=AUTO, the device shall take control over the Degree parameter and automatically update it so that a client can query current rotation. - * The device shall automatically apply the same rotation to its pan/tilt control direction depending on the following condition: - * if Reverse=AUTO in PTControlDirection or if the device doesn’t support Reverse in PTControlDirection - */ - rotate: Rotate; - extension?: VideoSourceConfigurationExtension2; -} - -export interface VideoSourceConfiguration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration - * This informational parameter is read-only. Deprecated for Media2 Service - * */ - useCount: number; - /** Readonly parameter signalling Source configuration's view mode, for devices supporting different view modes as defined in tt:viewModes */ - viewMode: string; - /** Reference to the physical input */ - sourceToken: string; - /** Rectangle specifying the Video capturing area. The capturing area shall not be larger than the whole Video source area */ - bounds: IntRectangle; - extension?: VideoSourceConfigurationExtension; -} - -export interface AudioSourceConfiguration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration - * This informational parameter is read-only. Deprecated for Media2 Service - */ - useCount: number; - /** Token of the Audio Source the configuration applies to */ - sourceToken: string; -} - -export interface VideoResolution { - /** Number of the columns of the Video image */ - width: number; - /** Number of the lines of the Video image */ - height: number; -} - -export interface VideoRateControl { - /** Maximum output framerate in fps. If an EncodingInterval is provided the resulting encoded framerate will be reduced by the given factor */ - frameRateLimit: number; - /** Interval at which images are encoded and transmitted. (A value of 1 means that every frame is encoded, a value of 2 means that every 2nd frame is encoded ...) */ - encodingInterval: number; - /** the maximum output bitrate in kbps */ - bitrateLimit: number; -} - -export interface Mpeg4Configuration { - /** - * Determines the interval in which the I-Frames will be coded. An entry of 1 indicates I-Frames are continuously generated. - * An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. - * The frames in between are coded as P or B Frames - */ - govLength: number; - /** The Mpeg4 profile, either simple profile (SP) or advanced simple profile (ASP) */ - mpeg4Profile: 'SP' | 'ASP'; -} - -export interface H264Configuration { - /** - * Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. - * An entry of 1 indicates I-Frames are continuously generated. - * An entry of 2 indicates that every 2nd image is an I-Frame, and 3 only every 3rd frame, etc. - * The frames in between are coded as P or B Frames - */ - govLength: number; - /** The H.264 profile, either baseline, main, extended or high */ - H264Profile: 'Baseline' | 'Main' | 'Extended' | 'High'; -} - -export interface MulticastConfiguration { - /** The multicast address (if this address is set to 0 no multicast streaming is enaled) */ - address: IPAddress; - /** - * The RTP mutlicast destination port. A device may support RTCP. - * In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) - * destination port number as defined in the RTSP specification - */ - port: number; - /** - * In case of IPv6 the TTL value is assumed as the hop limit. - * Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets - * from (endlessly) circulating and not limiting scope. In these cases the address contains the scope - */ - TTL: number; - /** - * Read only property signalling that streaming is persistant. - * Use the methods StartMulticastStreaming and StopMulticastStreaming to switch its state. - */ - autoStart: boolean; -} - -export type Duration = string; - -export interface VideoEncoderConfiguration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration. - * This informational parameter is read-only. Deprecated for Media2 Service. - */ - useCount: number; - /** - * A value of true indicates that frame rate is a fixed value rather than an upper limit, - * and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. - * Default is false. - */ - guaranteedFrameRate: boolean; - /** Used video codec, either Jpeg, H.264 or Mpeg4 */ - encoding: 'JPEG' | 'MPEG4' | 'H264'; - /** Configured video resolution */ - resolution: VideoResolution; - /** - * Relative value for the video quantizers and the quality of the video. - * A high value within supported quality range means higher quality - */ - quality: number; - /** Optional element to configure rate control related parameters. */ - rateControl?: VideoRateControl; - /** Optional element to configure Mpeg4 related parameters */ - MPEG4?: Mpeg4Configuration; - /** Optional element to configure H.264 related parameters. */ - H264?: H264Configuration; - /** Defines the multicast settings that could be used for video streaming */ - multicast: MulticastConfiguration; - /** The rtsp session timeout for the related video stream */ - sessionTimeout: Duration; -} - -export interface AudioEncoderConfiguration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration. - * This informational parameter is read-only. Deprecated for Media2 Service. - */ - useCount: number; - /** Audio codec used for encoding the audio input (either G.711, G.726 or AAC) */ - encoding: 'G711' | 'G726' | 'AAC'; - /** The output bitrate in kbps */ - bitrate: number; - /** The output sample rate in kHz */ - sampleRate: number; - /** Defines the multicast settings that could be used for video streaming */ - multicast: MulticastConfiguration; - /** The rtsp session timeout for the related audio stream */ - sessionTimeout: Duration; -} - -export interface ItemList { - /** Value name pair as defined by the corresponding description */ - simpleItem?: { - /** Item name */ - name: string; - /** Item value. The type is defined in the corresponding description */ - value: any; - }; - /** Complex value structure */ - elementItem?: any; - extension: any; -} - -export interface Config { - /** Name of the configuration */ - name: string; - /** - * The Type attribute specifies the type of rule and shall be equal to value of one of Name attributes of ConfigDescription elements - * returned by GetSupportedRules and GetSupportedAnalyticsModules command. - */ - type: string; - /** List of configuration parameters as defined in the corresponding description */ - parameters: ItemList[]; -} - -export interface AnalyticsEngineConfiguration { - analyticsModule?: Config; - extension?: any; -} - -export interface RuleEngineConfiguration { - rule?: Config; - extension?: any; -} - -export interface VideoAnalyticsConfiguration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration. - * This informational parameter is read-only. Deprecated for Media2 Service. - */ - useCount: number; - analyticsEngineConfiguration: AnalyticsEngineConfiguration; - ruleEngineConfiguration: RuleEngineConfiguration; -} - -export interface Vector2D { - x: number; - y: number; -} - -export interface Vector1D { - x: number; -} - -export interface PTZSpeed { - /** - * Pan and tilt speed. The x component corresponds to pan and the y component to tilt. - * If omitted in a request, the current (if any) PanTilt movement should not be affected - */ - panTilt?: Vector2D; - /** A zoom speed. If omitted in a request, the current (if any) Zoom movement should not be affected */ - zoom?: Vector1D; -} - -export interface Range { - min: number; - max: number; -} - -export interface Space2DDescription { - /** A URI of coordinate systems */ - URI: AnyURI; - /** A range of x-axis */ - XRange: Range; - /** A range of y-axis */ - YRange: Range; -} - -export interface PanTiltLimits { - /** A range of pan tilt limits */ - range: Space2DDescription; -} - -export interface Space1DDescription { - /** A URI of coordinate systems */ - URI: string; - /** A range of x-axis */ - XRange: Range; -} - -export interface ZoomLimits { - range: Space1DDescription; -} - -export interface PTControlDirection { - /** Optional element to configure related parameters for E-Flip */ - EFlip?: { - /** Parameter to enable/disable E-Flip feature */ - mode: 'OFF' | 'ON' | 'Extended'; - }; - /** Optional element to configure related parameters for reversing of PT Control Direction */ - reverse: { - /** Parameter to enable/disable Reverse feature */ - mode: 'OFF' | 'ON' | 'AUTO' | 'Extended'; - }; - extension: any; -} - -export interface PTZConfigurationExtension { - /** Optional element to configure PT Control Direction related features */ - PTControlDirection: PTControlDirection; - extension: any; -} - -export interface PTZConfiguration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration. - * This informational parameter is read-only. Deprecated for Media2 Service. - */ - useCount: number; - /** The optional acceleration ramp used by the device when moving */ - moveRamp?: number; - /** The optional acceleration ramp used by the device when recalling presets */ - presetRamp?: number; - /** The optional acceleration ramp used by the device when executing PresetTours */ - presetTourRamp?: number; - /** A mandatory reference to the PTZ Node that the PTZ Configuration belongs to */ - nodeToken: string; - /** If the PTZ Node supports absolute Pan/Tilt movements, it shall specify one Absolute Pan/Tilt Position Space as default */ - defaultAbsolutePantTiltPositionSpace?: string; - /** If the PTZ Node supports absolute zoom movements, it shall specify one Absolute Zoom Position Space as default */ - defaultAbsoluteZoomPositionSpace?: string; - /** If the PTZ Node supports relative Pan/Tilt movements, it shall specify one RelativePan/Tilt Translation Space as default */ - defaultRelativePanTiltTranslationSpace?: string; - /** If the PTZ Node supports relative zoom movements, it shall specify one Relative Zoom Translation Space as default */ - defaultRelativeZoomTranslationSpace?: string; - /** If the PTZ Node supports continuous Pan/Tilt movements, it shall specify one Continuous Pan/Tilt Velocity Space as default */ - defaultContinuousPanTiltVelocitySpace?: string; - /** If the PTZ Node supports continuous zoom movements, it shall specify one Continuous Zoom Velocity Space as default */ - defaultContinuousZoomVelocitySpace?: string; - /** If the PTZ Node supports absolute or relative PTZ movements, it shall specify corresponding default Pan/Tilt and Zoom speeds */ - defaultPTZSpeed?: PTZSpeed; - /** If the PTZ Node supports continuous movements, it shall specify a default timeout, after which the movement stops */ - defaultPTZTimeout?: Duration; - /** - * The Pan/Tilt limits element should be present for a PTZ Node that supports an absolute Pan/Tilt. - * If the element is present it signals the support for configurable Pan/Tilt limits. - * If limits are enabled, the Pan/Tilt movements shall always stay within the specified range. - * The Pan/Tilt limits are disabled by setting the limits to –INF or +INF - */ - panTiltLimits?: PanTiltLimits; - /** - * The Zoom limits element should be present for a PTZ Node that supports absolute zoom. - * If the element is present it signals the supports for configurable Zoom limits. - * If limits are enabled the zoom movements shall always stay within the specified range. - * The Zoom limits are disabled by settings the limits to -INF and +INF - */ - zoomLimits?: ZoomLimits; - extension?: PTZConfigurationExtension; -} - -export interface PTZFilter { - /** `true` if the metadata stream shall contain the PTZ status (IDLE, MOVING or UNKNOWN) */ - status: boolean; - /** `true` if the metadata stream shall contain the PTZ position */ - position: boolean; -} - -export interface EventSubscription { - filter?: string; - subscriptionPolicy?: any; -} - -export interface MetadataConfiguration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration. - * This informational parameter is read-only. Deprecated for Media2 Service. - */ - useCount: number; - /** Optional parameter to configure compression type of Metadata payload. Use values from enumeration MetadataCompressionType */ - compressionType: string; - /** Optional parameter to configure if the metadata stream shall contain the Geo Location coordinates of each target */ - geoLocation: boolean; - /** Optional parameter to configure if the generated metadata stream should contain shape information as polygon */ - shapePolygon: boolean; - /** Optional element to configure which PTZ related data is to include in the metadata stream */ - PTZStatus?: PTZFilter; - /** - * Optional element to configure the streaming of events. - * A client might be interested in receiving all, none or some of the events produced by the device: - * - To get all events: Include the Events element but do not include a filter - * - To get no events: Do not include the Events element - * - To get only some events: Include the Events element and include a filter in the element - */ - events: EventSubscription; - /** Defines whether the streamed metadata will include metadata from the analytics engines (video, cell motion, audio etc.) */ - analytics?: boolean; - /** Defines the multicast settings that could be used for video streaming */ - multicast: MulticastConfiguration; - /** The rtsp session timeout for the related audio stream (when using Media2 Service, this value is deprecated and ignored) */ - sessionTimeout: Duration; - /** - * Indication which AnalyticsModules shall output metadata. - * Note that the streaming behavior is undefined if the list includes items that are not part of the associated AnalyticsConfiguration - */ - analyticsEngineConfiguration?: AnalyticsEngineConfiguration; - extension?: any; -} - -export interface AudioOutputConfiguration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration. - * This informational parameter is read-only. Deprecated for Media2 Service. - */ - useCount: number; - /** Token of the phsycial Audio output */ - outputToken: ReferenceToken; - /** - * An audio channel MAY support different types of audio transmission. - * While for full duplex operation no special handling is required, in half duplex operation the transmission direction needs to be switched. - * The optional SendPrimacy parameter inside the AudioOutputConfiguration indicates which direction is currently active. - * An NVC can switch between different modes by setting the AudioOutputConfiguration. - * The following modes for the Send-Primacy are defined: - * - www.onvif.org/ver20/HalfDuplex/Server The server is allowed to send audio data to the client. - * The client shall not send audio data via the backchannel to the NVT in this mode. - * - www.onvif.org/ver20/HalfDuplex/Client The client is allowed to send audio data via the backchannel to the server. - * The NVT shall not send audio data to the client in this mode. - * - www.onvif.org/ver20/HalfDuplex/Auto It is up to the device how to deal with sending and receiving audio data. - * Acoustic echo cancellation is out of ONVIF scope. - */ - sendPrimacy?: AnyURI; - /** Volume setting of the output. The applicable range is defined via the option AudioOutputOptions.OutputLevelRang */ - outputLevel: number; -} - -export interface AudioDecoderConfiguration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration. - * This informational parameter is read-only. Deprecated for Media2 Service. - */ - useCount: number; -} - -export interface ProfileExtension { - /** Optional configuration of the Audio output */ - audioOutputConfiguration: AudioOutputConfiguration; - /** Optional configuration of the Audio decoder */ - audioDecoderConfiguration: AudioDecoderConfiguration; - extension?: any; -} - -export interface Profile { - /** Unique identifier of the profile */ - token: ReferenceToken; - /** A value of true signals that the profile cannot be deleted. Default is false */ - fixed: boolean; - /** User readable name of the profile */ - name: string; - /** Optional configuration of the Video input */ - videoSourceConfiguration?: VideoSourceConfiguration; - /** Optional configuration of the Audio input */ - audioSourceConfiguration?: AudioSourceConfiguration; - /** Optional configuration of the Video encoder */ - videoEncoderConfiguration?: VideoEncoderConfiguration; - /** Optional configuration of the Audio encoder */ - audioEncoderConfiguration?: AudioEncoderConfiguration; - /** Optional configuration of the video analytics module and rule engine */ - videoAnalyticsConfiguration?: VideoAnalyticsConfiguration; - /** Optional configuration of the pan tilt zoom unit */ - PTZConfiguration?: PTZConfiguration; - /** Optional configuration of the metadata stream */ - metadataConfiguration?: MetadataConfiguration; - /** Extensions defined in ONVIF 2.0 */ - extension?: ProfileExtension; -} - -export interface VideoRateControl2 { - /** Enforce constant bitrate */ - constantBitRate: boolean; - /** Desired frame rate in fps. The actual rate may be lower due to e.g. performance limitations */ - frameRateLimit: number; - /** the maximum output bitrate in kbps */ - bitrateLimit: number; -} - -export interface VideoEncoder2Configuration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration. - * This informational parameter is read-only. Deprecated for Media2 Service. - */ - useCount?: number; - /** - * Group of Video frames length. Determines typically the interval in which the I-Frames will be coded. - * An entry of 1 indicates I-Frames are continuously generated. An entry of 2 indicates that every 2nd image is an I-Frame, - * and 3 only every 3rd frame, etc. The frames in between are coded as P or B Frames - */ - govLength: number; - /** The encoder profile as defined in tt:VideoEncodingProfiles */ - profile: string; - /** - * A value of true indicates that frame rate is a fixed value rather than an upper limit, - * and that the video encoder shall prioritize frame rate over all other adaptable configuration values such as bitrate. - * Default is false. - */ - guaranteedFrameRate: boolean; - /** - * Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types - * https://www.iana.org/assignments/media-types/media-types.xhtml#video - */ - encoding: string; - /** Configured video resolution */ - resolution: VideoResolution; - /** Optional element to configure rate control related parameters. */ - rateControl?: VideoRateControl2; - /** Defines the multicast settings that could be used for video streaming */ - mutlicast?: MulticastConfiguration; - /** - * Relative value for the video quantizers and the quality of the video. - * A high value within supported quality range means higher quality - */ - quality: number; -} - -export interface AudioEncoder2Configuration { - /** Token that uniquely references this configuration. Length up to 64 characters */ - token: ReferenceToken; - /** User readable name. Length up to 64 characters */ - name: Name; - /** - * Number of internal references currently using this configuration. - * This informational parameter is read-only. Deprecated for Media2 Service. - */ - useCount: number; - /** - * Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and IANA Media Types - * https://www.iana.org/assignments/media-types/media-types.xhtml#audio - */ - encoding: string; - /** Optional multicast configuration of the audio stream */ - multicast?: MulticastConfiguration; - /** The output bitrate in kbps */ - bitrate: number; - /** The output sample rate in kHz */ - sampleRate: number; -} - -export interface ConfigurationSet { - /** Optional configuration of the Video input */ - videoSource?: VideoSourceConfiguration; - /** Optional configuration of the Audio input */ - audioSource?: AudioSourceConfiguration; - /** Optional configuration of the Video encoder */ - videoEncoder?: VideoEncoder2Configuration; - /** Optional configuration of the Audio encoder */ - audioEncoder?: AudioEncoder2Configuration; - /** Optional configuration of the analytics module and rule engine */ - analytics?: VideoAnalyticsConfiguration; - /** Optional configuration of the pan tilt zoom unit */ - PTZ?: PTZConfiguration; - /** Optional configuration of the metadata stream */ - metadata?: MetadataConfiguration; - /** Optional configuration of the Audio output */ - audioOutput?: AudioOutputConfiguration; - /** Optional configuration of the Audio decoder */ - audioDecoder?: AudioDecoderConfiguration; - /** Optional configuration of the Receiver */ - receiver?: any; -} - -export interface MediaProfile { - /** Unique identifier of the profile */ - token: ReferenceToken; - /** A value of true signals that the profile cannot be deleted. Default is false */ - fixed: boolean; - /** User readable name of the profile */ - name: Name; - /** The configurations assigned to the profile */ - configurations: ConfigurationSet; -} - -export interface BacklightCompensation { - /** - * Backlight compensation mode (on/off). - * - OFF: Backlight compensation is disabled - * - ON: Backlight compensation is enabled - */ - mode: 'ON' | 'OFF'; - /** Optional level parameter (unit unspecified) */ - level: number; -} - -export interface Rectangle { - x: number; - y: number; - width: number; - height: number; -} - -export interface Exposure { - /** - * Exposure Mode - * - Auto – Enabled the exposure algorithm on the NVT - * - Manual – Disabled exposure algorithm on the NVT - */ - mode: 'AUTO' | 'MANUAL'; - /** The exposure priority mode (low noise/framerate) */ - priority: 'LowNoise' | 'FrameRate'; - /** Rectangular exposure mask */ - window: Rectangle; - /** Minimum value of exposure time range allowed to be used by the algorithm */ - minExposureTime: number; - /** Maximum value of exposure time range allowed to be used by the algorithm */ - maxExposureTime: number; - /** Minimum value of the sensor gain range that is allowed to be used by the algorithm */ - minGain: number; - /** Maximum value of the sensor gain range that is allowed to be used by the algorithm */ - maxGain: number; - /** Minimum value of the iris range allowed to be used by the algorithm */ - minIris: number; - /** Maximum value of the iris range allowed to be used by the algorithm */ - maxIris: number; - /** The fixed exposure time used by the image sensor (μs) */ - exposureTime: number; - /** The fixed gain used by the image sensor (dB) */ - gain: number; - /** The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris */ - iris: number; -} - -export interface FocusConfiguration { - autoFocusMode: 'AUTO' | 'MANUAL'; - defaultSpeed: number; - /** Parameter to set autofocus near limit (unit: meter) */ - nearLimit: number; - /** Parameter to set autofocus far limit (unit: meter). If set to 0.0, infinity will be used */ - farLimit: number; -} - -export interface WideDynamicRange { - /** White dynamic range (on/off) */ - mode: 'OFF' | 'ON'; - /** Optional level parameter (unitless) */ - level: number; -} - -export interface WhiteBalance { - /** Auto whitebalancing mode (auto/manual) */ - mode: 'AUTO' | 'MANUAL'; - /** Rgain (unitless) */ - crGain: number; - /** Bgain (unitless) */ - cbGain: number; -} - -export interface ImagingSettings { - /** Enabled/disabled BLC mode (on/off) */ - backlightCompensation?: BacklightCompensation; - /** Image brightness (unit unspecified) */ - brightness?: number; - /** Color saturation of the image (unit unspecified) */ - colorSaturation?: number; - /** Contrast of the image (unit unspecified) */ - contrast?: number; - /** Exposure mode of the device */ - exposure?: Exposure; - /** Focus configuration */ - focus?: FocusConfiguration; - /** Infrared Cutoff Filter settings */ - irCutFilter?: 'ON' | 'OFF' | 'AUTO'; - /** Sharpness of the Video image */ - sharpness?: number; - /** WDR settings */ - wideDynamicRange?: WideDynamicRange; - /** White balance settings */ - whiteBalance?: WhiteBalance; - extension?: any; -} - -export interface BacklightCompensation20 { - /** - * Backlight compensation mode (on/off) - * - OFF: Backlight compensation is disabled - * - ON: Backlight compensation is enabled - */ - mode: 'OFF' | 'ON'; - /** Optional level parameter (unit unspecified) */ - level?: number; -} - -export interface Exposure20 { - /** - * Exposure Mode - * - Auto – Enabled the exposure algorithm on the device - * - Manual – Disabled exposure algorithm on the device - */ - mode: 'AUTO' | 'MANUAL'; - /** The exposure priority mode (low noise/framerate) */ - priority?: 'LowNoise' | 'FrameRate'; - /** Rectangular exposure mask */ - window?: Rectangle; - /** Minimum value of exposure time range allowed to be used by the algorithm */ - minExposureTime?: number; - /** Maximum value of exposure time range allowed to be used by the algorithm */ - maxExposureTime?: number; - /** Minimum value of the sensor gain range that is allowed to be used by the algorithm */ - minGain?: number; - /** Maximum value of the sensor gain range that is allowed to be used by the algorithm */ - maxGain?: number; - /** Minimum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation */ - minIris?: number; - /** Maximum value of the iris range allowed to be used by the algorithm. 0dB maps to a fully opened iris and positive values map to higher attenuation */ - maxIris?: number; - /** The fixed exposure time used by the image sensor (μs) */ - exposureTime?: number; - /** The fixed gain used by the image sensor (dB) */ - gain?: number; - /** The fixed attenuation of input light affected by the iris (dB). 0dB maps to a fully opened iris and positive values map to higher attenuation */ - iris?: number; -} - -export interface FocusConfiguration20 { - /** Zero or more modes as defined in enumeration tt:AFModes */ - AFMode: string[]; - /** - * Mode of auto focus - * - AUTO - The device automatically adjusts focus - * - MANUAL - The device does not automatically adjust focus - * Note: for devices supporting both manual and auto operation at the same time manual operation may be supported - * even if the Mode parameter is set to Auto. - */ - autoFocusMode: 'AUTO' | 'MANUAL'; - defaultSpeed?: number; - /** Parameter to set autofocus near limit (unit: meter) */ - nearLimit?: number; - /** Parameter to set autofocus far limit (unit: meter) */ - farLimit?: number; - extension?: any; -} - -export interface WideDynamicRange20 { - /** Wide dynamic range mode (on/off) */ - mode?: 'OFF' | 'ON'; - /** Optional level parameter (unit unspecified) */ - level?: number; -} - -export interface WhiteBalance20 extends WhiteBalance { - extension: any; -} - -export interface ImageStabilization { - /** Parameter to enable/disable Image Stabilization feature */ - mode: 'OFF' | 'ON' | 'AUTO' | 'Extended'; - /** Optional level parameter (unit unspecified) */ - level?: number; - extension?: any; -} - -export interface IrCutFilterAutoAdjustment { - /** - * Specifies which boundaries to automatically toggle Ir cut filter following parameters are applied to. - * Its options shall be chosen from tt:IrCutFilterAutoBoundaryType - */ - boundaryType: string; - /** - * Adjusts boundary exposure level for toggling Ir cut filter to on/off specified with unitless normalized value - * from +1.0 to -1.0. Zero is default and -1.0 is the darkest adjustment (Unitless). - */ - boundaryOffset?: number; - /** Delay time of toggling Ir cut filter to on/off after crossing of the boundary exposure levels */ - responseTime?: Duration; - extension?: any; -} - -export interface ToneCompensation { - /** Parameter to enable/disable or automatic ToneCompensation feature. Its options shall be chosen from tt:ToneCompensationMode Type */ - mode: string; - /** Optional level parameter specified with unitless normalized value from 0.0 to +1.0 */ - level?: number; - extension?: any; -} - -export interface Defogging { - /** Parameter to enable/disable or automatic Defogging feature. Its options shall be chosen from tt:DefoggingMode Type */ - mode: string; - /** Optional level parameter specified with unitless normalized value from 0.0 to +1.0 */ - level?: number; - extension?: any; -} - -export interface NoiseReduction { - /** - * Level parameter specified with unitless normalized value from 0.0 to +1.0. - * Level=0 means no noise reduction or minimal noise reduction - */ - level: number; -} - -export interface ImagingSettingsExtension203 { - /** Optional element to configure Image Contrast Compensation */ - toneCompensation?: ToneCompensation; - /** Optional element to configure Image Defogging */ - defogging?: Defogging; - /** Optional element to configure Image Noise Reduction */ - noiseReduction?: NoiseReduction; - extension?: any; -} - -export interface ImagingSettingsExtension202 { - /** An optional parameter applied to only auto mode to adjust timing of toggling Ir cut filter */ - irCutFilterAutoAdjustment?: IrCutFilterAutoAdjustment; - extension?: ImagingSettingsExtension203; -} - -export interface ImagingSettingsExtension20 { - /** Optional element to configure Image Stabilization feature */ - imageStabilization?: ImageStabilization; - extension?: ImagingSettingsExtension202; -} - -export interface ImagingSettings20 { - /** Enabled/disabled BLC mode (on/off) */ - backlightCompensation?: BacklightCompensation20; - /** Image brightness (unit unspecified) */ - brightness?: number; - /** Color saturation of the image (unit unspecified) */ - colorSaturation?: number; - /** Contrast of the image (unit unspecified) */ - contrast?: number; - /** Exposure mode of the device */ - exposure?: Exposure20; - /** Focus configuration */ - focus?: FocusConfiguration20; - /** Infrared Cutoff Filter settings */ - irCutFilter?: 'ON' | 'OFF' | 'AUTO'; - /** Sharpness of the Video image */ - sharpness?: number; - /** WDR settings */ - wideDynamicRange?: WideDynamicRange20; - /** White balance settings */ - whiteBalance?: WhiteBalance20; - extension?: ImagingSettingsExtension20; -} - -export interface VideoSourceExtension { - /** Optional configuration of the image sensor. To be used if imaging service 2.00 is supported */ - imaging?: ImagingSettings20; - extension?: any; -} - -export interface VideoSource { - /** Unique identifier referencing the physical entity */ - token: ReferenceToken; - /** Frame rate in frames per second */ - framerate: number; - /** Horizontal and vertical resolution */ - resolution: VideoResolution; - /** Optional configuration of the image sensor */ - imaging?: ImagingSettings; - extension?: VideoSourceExtension; -} +import { + GetVideoSourceConfigurationsResponse, + GetVideoSourcesResponse, + GetVideoEncoderConfigurationsResponse, + GetSnapshotUri, +} from './interfaces/media'; export interface GetStreamUriOptions { profileToken?: ReferenceToken; @@ -937,10 +34,6 @@ export interface GetStreamUriOptions { 'UDP'| 'TCP' | 'HTTP'; // for Media1 } -export interface GetSnapshotUriOptions { - profileToken?: ReferenceToken; -} - export class Media { private onvif: Onvif; public profiles: Profile[] = []; @@ -967,6 +60,7 @@ export class Media { // Generate a reply that looks like a Media1 reply for existing library users this.profiles = data[0].getProfilesResponse[0].profiles.map((profile: Record) => { const tmp = linerase(profile) as MediaProfile; + const conf = tmp.configurations as ConfigurationSet; const newProfile: Profile = { token : tmp.token, name : tmp.name, @@ -982,21 +76,21 @@ export class Media { // Metadata configuration // Audio output configuration // Audio decoder configuration - if (tmp.configurations.videoSource) { newProfile.videoSourceConfiguration = tmp.configurations.videoSource; } - if (tmp.configurations.audioSource) { newProfile.audioSourceConfiguration = tmp.configurations.audioSource; } - if (tmp.configurations.videoEncoder) { - newProfile.videoEncoderConfiguration = tmp.configurations.videoEncoder as unknown as VideoEncoderConfiguration; + if (conf.videoSource) { newProfile.videoSourceConfiguration = conf.videoSource; } + if (conf.audioSource) { newProfile.audioSourceConfiguration = conf.audioSource; } + if (conf.videoEncoder) { + newProfile.videoEncoderConfiguration = conf.videoEncoder as unknown as VideoEncoderConfiguration; } - if (tmp.configurations.audioEncoder) { - newProfile.audioEncoderConfiguration = tmp.configurations.audioEncoder as AudioEncoderConfiguration; + if (conf.audioEncoder) { + newProfile.audioEncoderConfiguration = conf.audioEncoder as AudioEncoderConfiguration; } - if (tmp.configurations.PTZ) { newProfile.PTZConfiguration = tmp.configurations.PTZ; } - if (tmp.configurations.analytics) { newProfile.videoAnalyticsConfiguration = tmp.configurations.analytics; } - if (tmp.configurations.metadata) { newProfile.metadataConfiguration = tmp.configurations.metadata; } - if (tmp.configurations.audioOutput || tmp.configurations.audioDecoder) { + if (conf.PTZ) { newProfile.PTZConfiguration = conf.PTZ; } + if (conf.analytics) { newProfile.videoAnalyticsConfiguration = conf.analytics; } + if (conf.metadata) { newProfile.metadataConfiguration = conf.metadata; } + if (conf.audioOutput || conf.audioDecoder) { newProfile.extension = { - audioOutputConfiguration : tmp.configurations.audioOutput!, - audioDecoderConfiguration : tmp.configurations.audioDecoder!, + audioOutputConfiguration : conf.audioOutput!, + audioDecoderConfiguration : conf.audioDecoder!, }; } // TODO - Add Audio @@ -1053,6 +147,28 @@ export class Media { return linerase(data, { array : ['videoSourceTokensAvailable'] }).getVideoSourceConfigurationOptionsResponse; } + /** + * If device supports Media 2.0 returns an array of VideoEncoder2Configuration. Otherwise VideoEncoderConfiguration + * @param configurationToken + * @param profileToken + */ + async getVideoEncoderConfigurations({ configurationToken, profileToken }: GetVideoEncoderConfigurations = {}): + Promise { + const body = `${ + configurationToken ? `${configurationToken}` : '' + }${ + profileToken ? `${profileToken}` : '' + }`; + const service = (this.onvif.device.media2Support ? 'media2' : 'media'); + + const [data] = await this.onvif.request({ service, body }); + + const { getVideoEncoderConfigurationsResponse } = linerase(data, { array : ['configurations'] }); + return getVideoEncoderConfigurationsResponse; + } + /** * This method requests a URI that can be used to initiate a live media stream using RTSP as the control protocol. * The returned URI shall remain valid indefinitely even if the profile is changed. @@ -1074,7 +190,7 @@ export class Media { * - RTP over RTSP over TCP: StreamType = "RTP_unicast", TransportProtocol = "RTSP" */ async getStreamUri(options: GetStreamUriOptions = {}): - Promise<{uri: AnyURI; invalidAfterConnect?: boolean; invalidAfterReboot?: boolean; timeout?: Duration}> { + Promise { const { profileToken, stream = 'RTP-Unicast', @@ -1123,7 +239,7 @@ export class Media { * Receive snapshot URI * @param profileToken */ - async getSnapshotUri({ profileToken }: GetSnapshotUriOptions = {}): Promise<{uri: AnyURI}> { + async getSnapshotUri({ profileToken }: GetSnapshotUri = {}): Promise<{uri: AnyURI}> { if (this.onvif.device.media2Support) { // Profile T request using Media2 const [data] = await this.onvif.request({ From 5f1db148a4e8eb401ca4fb529d50ceeed81f28b3 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 9 Aug 2024 13:49:58 +0300 Subject: [PATCH 106/112] chorus: update checklist and docs --- CHECKED.md | 12 ++++++------ src/onvif.ts | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index 631e79f4..a8cd3c41 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -1,10 +1,10 @@ ONVIF Interfaces -- [ ] connect -- [ ] _request -- [ ] _requestPart2 -- [ ] getSystemDateAndTime -- [ ] setSystemDateAndTime +- [x] connect +- [x] _request +- [x] _requestPart2 +- [x] getSystemDateAndTime +- [x] setSystemDateAndTime accepts SetSystemDateAndTimeOptions - [x] getCapabilities Capabilities -> GetCapabilitiesResponse - [x] getServiceCapabilities DeviceServiceCapabilities -> GetServiceCapabilitiesResponse - [ ] getActiveSources @@ -43,7 +43,7 @@ ONVIF Interfaces - [ ] _eventRequest - [ ] _eventPull - [ ] _restartEventRequest -- [ ] parseEventXML +- [x] parseEventXML - [x] getVideoSources - [x] getVideoSourceConfigurations - [x] getVideoSourceConfigurationOptions new diff --git a/src/onvif.ts b/src/onvif.ts index ff14bc47..91842a90 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -6,9 +6,9 @@ import { Buffer } from 'buffer'; import crypto from 'crypto'; import { linerase, parseSOAPString } from './utils'; import { Device } from './device'; -import { Media, Profile } from './media'; +import { Media } from './media'; import { PTZ } from './ptz'; -import { Capabilities } from './interfaces/onvif'; +import { Capabilities, Profile } from './interfaces/onvif'; import { GetDeviceInformationResponse } from './interfaces/devicemgmt'; /** @@ -397,10 +397,10 @@ export class Onvif extends EventEmitter { // The ONVIF spec says this should work without a Password as we need to know any difference in the // remote NVT's time relative to our own time clock (called the timeShift) before we can calculate the // correct timestamp in nonce SOAP Authentication header. - // But.. Panasonic and Digital Barriers both have devices that implement ONVIF that only work with + // But... Panasonic and Digital Barriers both have devices that implement ONVIF that only work with // authenticated getSystemDateAndTime. So for these devices we need to do an authenticated getSystemDateAndTime. // As 'timeShift' is not set, the local clock MUST be set to the correct time AND the NVT/Camera MUST be set - // to the correct time if the camera implements Replay Attack Protection (eg Axis) + // to the correct time if the camera implements Replay Attack Protection (e.g. Axis) const [data, xml] = await this.rawRequest({ // Try the Unauthenticated Request first. Do not use this._envelopeHeader() as we don't have timeShift yet. body : @@ -501,8 +501,8 @@ export class Onvif extends EventEmitter { if (this.defaultProfiles[idx].videoEncoderConfiguration) { const configuration = this.defaultProfiles[idx].videoEncoderConfiguration; this.activeSources[idx].encoding = configuration?.encoding; - this.activeSources[idx].width = configuration?.resolution.width; - this.activeSources[idx].height = configuration?.resolution.height; + this.activeSources[idx].width = configuration?.resolution?.width; + this.activeSources[idx].height = configuration?.resolution?.height; this.activeSources[idx].fps = configuration?.rateControl?.frameRateLimit; this.activeSources[idx].bitrate = configuration?.rateControl?.bitrateLimit; } @@ -513,7 +513,7 @@ export class Onvif extends EventEmitter { if (this.defaultProfiles[idx].PTZConfiguration) { this.activeSources[idx].ptz = { - name : this.defaultProfiles[idx].PTZConfiguration!.name, + name : this.defaultProfiles[idx].PTZConfiguration!.name as string, token : this.defaultProfiles[idx].PTZConfiguration!.token, }; /* From e1718272967834ba609e6e3fd36818c21f23da1d Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 9 Aug 2024 14:01:28 +0300 Subject: [PATCH 107/112] chorus: update checklist --- CHECKED.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHECKED.md b/CHECKED.md index a8cd3c41..1a075cad 100644 --- a/CHECKED.md +++ b/CHECKED.md @@ -15,10 +15,10 @@ ONVIF Interfaces - [ ] setScopes - [ ] systemReboot - [ ] setSystemFactoryDefault -- [ ] _passwordDigest -- [ ] _envelopeHeader -- [ ] _envelopeFooter -- [ ] _parseUrl +- [x] _passwordDigest +- [x] _envelopeHeader +- [x] _envelopeFooter +- [x] _parseUrl - [x] getNTP cam.device.getNTP - [x] setNTP cam.device.setNTP - [ ] getNetworkInterfaces From e6004d2f32069123eed151a07b6310b966704828 Mon Sep 17 00:00:00 2001 From: momoAmch Date: Thu, 3 Oct 2024 12:20:10 +0200 Subject: [PATCH 108/112] SetNTP is not working with DNS due to a missing schema version URL SetNTP is not working with DNS due to a missing schema version URL --- lib/device.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/device.js b/lib/device.js index d4bcfc8d..432576e9 100644 --- a/lib/device.js +++ b/lib/device.js @@ -89,8 +89,8 @@ module.exports = function(Cam) { `${ NTPManual.type }${ NTPManual.IPv4Address ? `${ NTPManual.IPv4Address }` : '' }${NTPManual.IPv6Address ? `${ NTPManual.IPv6Address }` : '' - }${NTPManual.DNSname ? `${ NTPManual.DNSname }` : '' - }${NTPManual.extension ? `${ NTPManual.extension }` : '' + }${NTPManual.DNSname ? `${ NTPManual.DNSname }` : '' + }${NTPManual.extension ? `${ NTPManual.extension }` : '' }` : ''); }); } From 8db51d54c0bdfb8b468cef1435ef589257ca7b2e Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Fri, 25 Oct 2024 10:28:28 +0300 Subject: [PATCH 109/112] fix: add namespaces to `setNTP` --- src/device.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/device.ts b/src/device.ts index 0a02e665..a7a5c4db 100644 --- a/src/device.ts +++ b/src/device.ts @@ -235,8 +235,8 @@ export class Device { + `${NTPManual.type}${ NTPManual.IPv4Address ? `${NTPManual.IPv4Address}` : '' }${NTPManual.IPv6Address ? `${NTPManual.IPv6Address}` : '' - }${NTPManual.DNSname ? `${NTPManual.DNSname}` : '' - }${NTPManual.extension ? `${NTPManual.extension}` : '' + }${NTPManual.DNSname ? `${NTPManual.DNSname}` : '' + }${NTPManual.extension ? `${NTPManual.extension}` : '' }` : ''); }); } From 937b7cc0364860e1f01d5f40a56331687fd1d5c6 Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 26 Oct 2024 21:54:25 +0300 Subject: [PATCH 110/112] feat: setVideoSourceConfiguration --- src/media.ts | 74 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/src/media.ts b/src/media.ts index 06074ec4..a6f143b6 100644 --- a/src/media.ts +++ b/src/media.ts @@ -2,9 +2,9 @@ import { Onvif } from './onvif'; import { linerase } from './utils'; import { AudioEncoderConfiguration, MediaUri, - Profile, + Profile, VideoEncoder2Configuration, VideoEncoderConfiguration, - VideoSource, + VideoSource, VideoSourceConfiguration, } from './interfaces/onvif'; import { ReferenceToken } from './interfaces/common'; import { AnyURI } from './interfaces/basics'; @@ -17,7 +17,7 @@ import { GetVideoEncoderConfigurations, GetVideoEncoderConfigurationsResponse as GetVideoEncoder2ConfigurationsResponse, GetVideoSourceConfigurationOptions, GetVideoSourceConfigurationOptionsResponse, - GetVideoSourceConfigurations, MediaProfile, + GetVideoSourceConfigurations, MediaProfile, SetVideoSourceConfigurationResponse, } from './interfaces/media.2'; import { GetVideoSourceConfigurationsResponse, @@ -147,6 +147,74 @@ export class Media { return linerase(data, { array : ['videoSourceTokensAvailable'] }).getVideoSourceConfigurationOptionsResponse; } + /** Common setVideoSourceConfiguration for media and media2 profiles. It depends on media2support flag */ + async setVideoSourceConfiguration(configuration: VideoSourceConfiguration | VideoEncoder2Configuration, forcePersistence: boolean = true): + Promise { + const service = this.onvif.device.media2Support ? 'media2' : 'media'; + const xmlns = this.onvif.device.media2Support + ? 'http://www.onvif.org/ver20/media/wsdl' + : 'http://www.onvif.org/ver10/media/wsdl'; + const body = `` + + `${ + configuration.name ? `${configuration.name}` : '' + }${configuration.useCount ? `${configuration.useCount}` : '' + }${'encoding' in configuration && configuration.encoding + ? `${configuration.encoding}` : '' + }${'resolution' in configuration && configuration.resolution + ? `${ + configuration.resolution.width ? `${configuration.resolution.width}` : '' + }${configuration.resolution.height ? `${configuration.resolution.height}` : '' + }` : '' + }${'quality' in configuration ? `${configuration.quality}` : '' + }${'rateControl' in configuration && configuration.rateControl + ? `${ + configuration.rateControl.frameRateLimit}${configuration.rateControl.bitrateLimit + }` : '' + }${'multicast' in configuration && configuration.multicast + ? `${ + configuration.multicast.address + ? `
    ${ + configuration.multicast.address.type ? `${configuration.multicast.address.type}` : '' + }${configuration.multicast.address.IPv4Address ? `${configuration.multicast.address.IPv4Address}` : '' + }${configuration.multicast.address.IPv6Address ? `${configuration.multicast.address.IPv6Address}` : '' + }
    ` : '' + }${configuration.multicast.port !== undefined ? `${configuration.multicast.port}` : '' + }${configuration.multicast.TTL !== undefined ? `${configuration.multicast.TTL}` : '' + }${configuration.multicast.autoStart !== undefined ? `${configuration.multicast.autoStart}` : '' + }
    ` : '' + }${'quality' in configuration ? `${configuration.quality}` : '' + }${'sourceToken' in configuration ? `${configuration.sourceToken}` : '' + }${'bounds' in configuration + ? `` : '' + }${'extension' in configuration && configuration.extension + ? `${ + 'rotate' in configuration.extension && configuration.extension.rotate ? `${ + configuration.extension.rotate.mode}${ + configuration.extension.rotate.degree ? `${configuration.extension.rotate.degree}` : '' + }` : '' + }` : '' + }
    ${ + (!this.onvif.device.media2Support ? `${forcePersistence}` : '') + }` + + '
    '; + const [data] = await this.onvif.request({ service, body }); + return data; + } + /** * If device supports Media 2.0 returns an array of VideoEncoder2Configuration. Otherwise VideoEncoderConfiguration * @param configurationToken From 10d932f9bd66142a15f5353832ca6be4c125458b Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Wed, 30 Oct 2024 10:41:20 +0300 Subject: [PATCH 111/112] chore: npm audit fix --- package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b50c4432..767f3805 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4379,10 +4379,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" From 64f8ba47a5390ac3a3cc1519b530e7c5a7b59e8e Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Wed, 30 Oct 2024 22:54:51 +0300 Subject: [PATCH 112/112] feat: Digest Auth --- src/onvif.ts | 94 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 4 deletions(-) diff --git a/src/onvif.ts b/src/onvif.ts index 91842a90..b7f3ec4b 100644 --- a/src/onvif.ts +++ b/src/onvif.ts @@ -19,6 +19,8 @@ export interface OnvifOptions { useSecure?: boolean; /** Set options for https like ca, cert, ciphers, rejectUnauthorized, secureOptions, secureProtocol, etc. */ secureOptions?: SecureContextOptions; + /** Use WS-Security SOAP headers */ + useWSSecurity?: boolean; hostname: string; username?: string; password?: string; @@ -51,7 +53,7 @@ export interface OnvifServices { [key: string]: URL | undefined; } -export interface OnvifRequestOptions extends RequestOptions{ +export interface OnvifRequestOptions extends RequestOptions { /** Name of service (ptz, media, etc) */ service?: keyof OnvifServices; /** SOAP body */ @@ -157,6 +159,8 @@ export class Onvif extends EventEmitter { public readonly ptz: PTZ; public useSecure: boolean; public secureOptions: SecureContextOptions; + public useWSSecurity: boolean; + private nc: number = 0; public hostname: string; public username?: string; public password?: string; @@ -180,6 +184,7 @@ export class Onvif extends EventEmitter { super(); this.useSecure = options.useSecure ?? false; this.secureOptions = options.secureOptions ?? {}; + this.useWSSecurity = options.useWSSecurity ?? true; this.hostname = options.hostname; this.username = options.username; this.password = options.password; @@ -222,7 +227,7 @@ export class Onvif extends EventEmitter { let header = '' + ''; // Only insert Security if there is a username and password - if (this.username && this.password) { + if (this.useWSSecurity && this.username && this.password) { const req = this.passwordDigest(); header += '' + '' @@ -297,8 +302,9 @@ export class Onvif extends EventEmitter { timeout : this.timeout, }; requestOptions.headers = { + ...options.headers, 'Content-Type' : 'application/soap+xml', - 'Content-Length' : Buffer.byteLength(options.body, 'utf8'), + 'Content-Length' : Buffer.byteLength(options.body, 'utf8').toString(), charset : 'utf-8', }; requestOptions.method = 'POST'; @@ -306,7 +312,21 @@ export class Onvif extends EventEmitter { if (this.useSecure) { Object.assign(requestOptions, this.secureOptions); } - const request = httpLibrary.request(requestOptions, (response) => { + const request = httpLibrary.request(requestOptions, async (response) => { + const wwwAuthenticate = response.headers['www-authenticate']; + const { statusCode } = response; + if (statusCode === 401 && wwwAuthenticate !== undefined) { + // Re-request with digest auth header + response.destroy(); + try { + options.headers!.Authorization = this.digestAuth(wwwAuthenticate, requestOptions.path!); + const digestResponse = await this.rawRequest(options); + return resolve(digestResponse); + } catch (e) { + return reject(e); + } + } + const bufs: Buffer[] = []; let length = 0; @@ -329,6 +349,7 @@ export class Onvif extends EventEmitter { this.emit('rawResponse', xml); resolve(parseSOAPString(xml)); }); + return undefined; }); request.setTimeout(this.timeout, () => { @@ -362,16 +383,81 @@ export class Onvif extends EventEmitter { }); } + private digestAuth(wwwAuthenticate: string, path: string) { + const challenge = this.parseChallenge(wwwAuthenticate); + const ha1 = crypto.createHash('md5'); + ha1.update([this.username, challenge.realm, this.password].join(':')); + const ha2 = crypto.createHash('md5'); + ha2.update(['POST', path].join(':')); + + let cnonce = null; + let nc = null; + if (typeof challenge.qop === 'string') { + const cnonceHash = crypto.createHash('md5'); + cnonceHash.update(Math.random().toString(36)); + cnonce = cnonceHash.digest('hex').substring(0, 8); + nc = this.updateNC(); + } + + const response = crypto.createHash('md5'); + const responseParams = [ + ha1.digest('hex'), + challenge.nonce, + ]; + if (cnonce) { + responseParams.push(nc); + responseParams.push(cnonce); + } + + responseParams.push(challenge.qop); + responseParams.push(ha2.digest('hex')); + response.update(responseParams.join(':')); + + const authParams: { [key: string]: string } = { + username : this.username!, + realm : challenge.realm, + nonce : challenge.nonce, + uri : path, + qop : challenge.qop, + response : response.digest('hex'), + }; + if (challenge.opaque) { + authParams.opaque = challenge.opaque; + } + if (cnonce && nc) { + authParams.nc = nc; + authParams.cnonce = cnonce; + } + return `Digest ${Object.entries(authParams).map(([key, value]) => `${key}="${value}"`).join(',')}`; + } + public request(options: OnvifRequestOptions) { if (!options.body) { throw new Error("There is no 'body' field in request options"); } + options.headers = options.headers ?? {}; return this.rawRequest({ ...options, body : `${this.envelopeHeader()}${options.body}${this.envelopeFooter()}`, }); } + private parseChallenge(digest: string) { + const prefix = 'Digest '; + const challenge = digest.substring(digest.indexOf(prefix) + prefix.length); + const parts = challenge.split(',') + .map((part) => part.match(/^\s*?([a-zA-Z0-9]+)="?([^"]*)"?\s*?$/)!.slice(1)); + return Object.fromEntries(parts); + } + + private updateNC() { + this.nc += 1; + if (this.nc > 99999999) { + this.nc = 1; + } + return String(this.nc).padStart(8, '0'); + } + /** * Parse url with an eye on `preserveAddress` property * @param address