diff --git a/.eslintrc.js b/.eslintrc.js index a266e17..8c54941 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,13 +1,13 @@ module.exports = { root: true, - env: {node: true, es2020: true}, + env: {node: true, es2020: true, jest: true}, extends: [ 'eslint:recommended' ], ignorePatterns: ['dist', '.eslintrc.cjs', 'tests'], parserOptions: {ecmaVersion: 'latest', sourceType: 'module'}, parser: '@typescript-eslint/parser', - plugins: ['jsdoc'], + plugins: ['jsdoc', 'jest'], rules: { 'prefer-const': ['error', { 'destructuring': 'any', @@ -50,7 +50,7 @@ module.exports = { // 'jsdoc/require-example': 1, // 'jsdoc/require-file-overview': 1, 'jsdoc/require-hyphen-before-param-description': 1, - 'jsdoc/require-jsdoc': 1, // Recommended + 'jsdoc/require-jsdoc': [1, { contexts: ['ClassDeclaration', 'ClassProperty', 'FunctionDeclaration', 'MethodDefinition'] }], 'jsdoc/require-param': 1, // Recommended 'jsdoc/require-param-description': 1, // Recommended 'jsdoc/require-param-name': 1, // Recommended diff --git a/.gitignore b/.gitignore index ba2aef2..ac9821b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* - +.idea/ # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -108,4 +108,6 @@ src/config/authentication_map.ts src/utils/rsp.ts src/utils/DecentralizedFileStreamer.ts src/utils/UpdateLDES.ts -aggregation-data \ No newline at end of file +aggregation-data +logs/ +scratch/ \ No newline at end of file diff --git a/README.md b/README.md index b410455..1ad9ae1 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ We employ [Type Indexes](https://solid.github.io/type-indexes/) to store the loc npm run start-solid-server ``` The command will start a Solid Server on the port 3000 with a Solid Pod named `aggregation_pod` which can be accessed at `http://localhost:3000/aggregation_pod/`. The aggregation results are stored in the aggregator's Solid Pod in form of the LDES stream using the [LDES in LDP](https://woutslabbinck.github.io/LDESinLDP/) specification. - +- Create a folder and a file named `logs/aggregation.log` in the root directory of the project. The logs of the Solid Stream Aggregator are stored in this file. - Now, start the Solid Stream Aggregator with the command ```bash npm run start aggregation @@ -60,4 +60,4 @@ This code is copyrighted by [Ghent University - imec](https://www.ugent.be/ea/id ## Contact -For any questions, please contact [Kush](mailto:kushagrasingh.bisen@ugent.be) or create an issue in the repository [here])(https://github.com/SolidLabResearch/solid-stream-aggregator/issues) . +For any questions, please contact [Kush](mailto:kushagrasingh.bisen@ugent.be) or create an issue in the repository [here](https://github.com/SolidLabResearch/solid-stream-aggregator/issues) . diff --git a/esdoc.json b/esdoc.json new file mode 100644 index 0000000..b6896ab --- /dev/null +++ b/esdoc.json @@ -0,0 +1,6 @@ +{ + "source": "./src", + "destination": "./docs", + "plugins": [{"name": "esdoc-standard-plugin"}] + } + \ No newline at end of file diff --git a/logs/aggregation.log b/logs/aggregation.log deleted file mode 100644 index af064f3..0000000 --- a/logs/aggregation.log +++ /dev/null @@ -1,3 +0,0 @@ -{"name":"solid-stream-aggregator","hostname":"pop-os","pid":54529,"level":30,"msg":"http_server_started","time":"2024-02-05T14:14:16.179Z","v":0} -{"name":"solid-stream-aggregator","hostname":"pop-os","pid":57046,"level":30,"msg":"http_server_started","time":"2024-02-05T14:29:17.584Z","v":0} -{"name":"solid-stream-aggregator","hostname":"pop-os","pid":31659,"level":30,"msg":"http_server_started","time":"2024-02-07T10:38:01.323Z","v":0} diff --git a/logs/module_processing_time.csv b/logs/module_processing_time.csv deleted file mode 100644 index a901067..0000000 --- a/logs/module_processing_time.csv +++ /dev/null @@ -1,46 +0,0 @@ -Message 1,Message 2,Time Difference (seconds) -http_server_started,new_query_received_from_client_ws,161.075 -new_query_received_from_client_ws,isomorphic_check_done,0.025 -isomorphic_check_done,query_is_unique,0 -query_is_unique,stream_credentials_retrieved,0.006 -stream_credentials_retrieved,unique_query_registered,0.009 -unique_query_registered,file_streamer_started for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0 -file_streamer_started for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,file_streamer_ended for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.467 -file_streamer_ended for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.19 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.034 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.043 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.037 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.035 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.03 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.033 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.028 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.029 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.029 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.028 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.031 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.029 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.083 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.028 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.028 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.027 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.03 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.024 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.024 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,aggregation_event_sent_to_client,0.224 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.026 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.02 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.263 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.024 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.041 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.037 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.011 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.035 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.011 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.029 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.013 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.026 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.007 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.026 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.004 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.003 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.002 diff --git a/logs/process.ipynb b/logs/process.ipynb deleted file mode 100644 index 58b1c87..0000000 --- a/logs/process.ipynb +++ /dev/null @@ -1,75 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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//79hZmZmZDJZCpNTb5w4ULh4OAg8uTJIwoWLCh69+6tMA3195yOPO05k9F+yyimrVu3iurVqwsDAwNhYGAgHBwcRN++fUVUVFSmsaZsJ+Whra0tLCwsRN26dcW8efPEu3fvFNb51unIhUiebn769OmidOnSQkdHR+TNm1dUqFBB+Pv7i5iYGKkeANG3b990Y3/27Jno27evsLa2Fnny5BEWFhaiTp06YtmyZVKdjPbv3bt3Fc5tIYQ4ceKEqFu3rjAyMhIGBgaibNmyYsGCBXJ1bt++LXx8fISFhYXIkyePsLKyEo0aNRJbtmyR6kyePFlUrlxZmJqaCj09PeHg4CCmTJmS7q0SiOjHJxNCjSsmiYiIiIiI/oN4jRMREREREZESTJyIiIiIiIiUYOJERERERESkBBMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISIn/3A1wk5KS8PjxYxgZGUEmk+V0OERERERElEOEEHj//j0KFSoEDY3M+5T+c4nT48ePYW1tndNhEBERERFRLvHgwQMULlw40zr/ucTJyMgIQPLOMTY2zuFoiIiIiIgop7x79w7W1tZSjpCZ/1zilDI8z9jYmIkTERERERGpdAkPJ4cgIiIiIiJSgokTERERERGREkyciIiIiIiIlGDiREREREREpAQTJyIiIiIiIiWYOBERERERESnBxImIiIiIiEgJJk5ERERERERKMHEiIiIiIiJSgokTERERERGREkyciIiIiIiIlGDiREREREREpAQTJyIiIiIiIiWYOBERERERESnBxImIiIiIiEgJJk5ERERERERKMHEiIiIiIiJSgokTERERERGREkyciIiIiIiIlNDK6QCIcjOnVU45HUK2iewUmdMhEBEREf0w2ONERERERESkBBMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkREREREREowcSIiIiIiIlKCiRMREREREZESTJyIiIiIiIiUYOJERERERESkBBMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkREREREREowcSIiIiIiIlKCiRMREREREZESTJyIiIiIiIiUYOJERERERESkBBMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkREREREREowcSIiIiIiIlKCiRMREREREZESTJyIiIiIiIiUYOJERERERESkBBMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkRERERERErkeOK0aNEi2NraQldXF1WqVMGZM2cyrT937lyULFkSenp6sLa2xuDBg/Hp06fvFC0REREREf0X5WjitHHjRgwZMgTjx49HeHg4nJ2d4eHhgefPn6dbf926dRgxYgTGjx+Pa9eu4c8//8TGjRsxatSo7xw5ERERERH9l+Ro4hQYGIju3bvD19cXjo6OWLp0KfT19fHXX3+lW//kyZOoVq0a2rdvD1tbW9SrVw/t2rVT2ktFRERERET0LXIscYqPj8f58+fh7u7+bzAaGnB3d8epU6fSXadq1ao4f/68lCjduXMHe/fuhaen53eJmYiIiIiI/pu0cmrDL1++RGJiIgoWLChXXrBgQVy/fj3dddq3b4+XL1+ievXqEEIgISEBvXr1ynSo3ufPn/H582fp+bt377LmBRARERER0X9Gjk8OoY7Q0FBMnToVixcvRnh4OLZt24Y9e/Zg0qRJGa4TEBAAExMT6WFtbf0dIyYiIiIiop9BjvU4FShQAJqamnj27Jlc+bNnz2BhYZHuOmPHjkXHjh3RrVs3AICTkxM+fPiAHj16YPTo0dDQUMwDR44ciSFDhkjP3717x+SJiIiIiIjUkmM9Ttra2qhQoQIOHz4slSUlJeHw4cNwdXVNd524uDiF5EhTUxMAIIRIdx0dHR0YGxvLPYiIiIiIiNSRYz1OADBkyBB06tQJFStWROXKlTF37lx8+PABvr6+AAAfHx9YWVkhICAAAODl5YXAwEC4uLigSpUquHXrFsaOHQsvLy8pgSIiIiIiIspqOZo4tWnTBi9evMC4cePw9OlTlCtXDsHBwdKEEffv35frYRozZgxkMhnGjBmDR48ewczMDF5eXpgyZUpOvQQiIiIiIvoPkImMxrj9pN69ewcTExPExMRw2B4p5bTKKadDyDaRnSJzOgQiIiKiHKVObvBDzapHRERERESUE5g4ERERERERKcHEiYiIiIiISAkmTkREREREREowcSIiIiIiIlKCiRMREREREZESTJyIiIiIiIiUYOJERERERESkBBMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkREREREREowcSIiIiIiIlKCiRMREREREZESTJyIiIiIiIiUYOJERERERESkBBMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkREREREREowcSIiIiIiIlKCiRMREREREZESTJyIiIiIiIiUYOJERERERESkBBMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkREREREREowcSIiIiIiIlKCiRMREREREZESTJyIiIiIiIiUYOJERERERESkhFZOB/CfMMEkpyPIPhNicjoCIiIiIqJsxx4nIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkREREREREowcSIiIiIiIlKCiRMREREREZESTJyIiIiIiIiUYOJERERERESkBBMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkREREREREowcSIiIiIiIlKCiRMREREREZESTJyIiIiIiIiUYOJERERERESkBBMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkREREREREowcSIiIiIiIlKCiRMREREREZESTJyIiIiIiIiUYOJERERERESkhFZOB0CUm0XevZ/TIRARERFRLsAeJyIiIiIiIiWYOBERERERESnBxImIiIiIiEgJJk5ERERERERKMHEiIiIiIiJSgokTERERERGREkyciIiIiIiIlGDiREREREREpAQTJyIiIiIiIiWYOBERERERESnBxImIiIiIiEgJJk5ERERERERKMHEiIiIiIiJSgokTERERERGREkyciIiIiIiIlGDiREREREREpAQTJyIiIiIiIiWYOBERERERESnBxImIiIiIiEgJJk5ERERERERKMHEiIiIiIiJSQkudyteuXcOGDRtw/Phx3Lt3D3FxcTAzM4OLiws8PDzQokUL6OjoZFesREREREREOUKlHqfw8HC4u7vDxcUFJ06cQJUqVTBo0CBMmjQJHTp0gBACo0ePRqFChTB9+nR8/vw5u+MmIiIiIiL6blTqcWrRogWGDRuGLVu2wNTUNMN6p06dwrx58zB79myMGjUqq2IkIiIiIiLKUSolTjdu3ECePHmU1nN1dYWrqyu+fPnyzYERERERERHlFioN1VOWNL19+1at+kRERERERD8StWfVmz59OjZu3Cg9b926NfLnzw8rKytcvHgxS4MjIiIiIiLKDdROnJYuXQpra2sAwMGDB3Hw4EHs27cPDRo0wLBhw7I8QCIiIiIiopym1nTkAPD06VMp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m+yIj4iIiIiIKMd91X2cAMDW1hZCCBQvXlzqeSIiIiIiIvoZqX2NU1xcHLp27Qp9fX2ULl1amkmvf//+mDZtWpYHSERERERElNPUTpxGjhyJixcvIjQ0FLq6ulK5u7s7Nm7cmKXBERERERER5QZqj7HbsWMHNm7ciF9++QUymUwqL126NG7fvp2lwREREREREeUGavc4vXjxAubm5grlHz58kEukiIiIiIiIfhZqJ04VK1bEnj17pOcpydIff/wBV1fXrIuMiIiIiIgol1B7qN7UqVPRoEEDXL16FQkJCZg3bx6uXr2KkydP4ujRo9kRIxERERERUY5Su8epevXquHDhAhISEuDk5IQDBw7A3Nwcp06dQoUKFbIjRiIiIiIiohz1VTdgKl68OJYvX57Vsfy0bD+ty+kQsk10TgdARERERPQdqN3jFB4ejsjISOn5zp070bRpU4waNQrx8fFZGhwREREREVFuoHbi1LNnT9y4cQMAcOfOHbRp0wb6+vrYvHkzfvvttywPkIiIiIiIKKepnTjduHED5cqVAwBs3rwZbm5uWLduHVauXImtW7dmdXxEREREREQ5Tu3ESQiBpKQkAMChQ4fg6ekJALC2tsbLly+zNjoiIiIiIqJc4Kvu4zR58mSsWbMGR48eRcOGDQEAd+/eRcGCBbM8QCIiIiIiopymduI0d+5chIeHo1+/fhg9ejRKlCgBANiyZQuqVq2a5QESERERERHlNLWnIy9btqzcrHopZs6cCU1NzSwJioiIiIiIKDdRKXESQkAmk2VaR1dXN0sCIiIiIiIiym1UGqpXunRpbNiwQel9mm7evInevXtj2rRpWRIcERERERFRbqBSj9OCBQswfPhw9OnTB3Xr1kXFihVRqFAh6Orq4s2bN7h69SpOnDiBK1euoF+/fujdu3d2x01ERERERPTdqJQ41alTB+fOncOJEyewceNGrF27Fvfu3cPHjx9RoEABuLi4wMfHB97e3sibN292x0xERERERPRdqTU5RPXq1VG9evXsioWIiIiIiChXUns6ciIiIiIiov8aJk5ERERERERKMHEiIiIiIiJSgokTERERERGREkyciIiIiIiIlPiqxOn27dsYM2YM2rVrh+fPnwMA9u3bhytXrmRpcERERERERLmB2onT0aNH4eTkhNOnT2Pbtm2IjY0FAFy8eBHjx4/P8gCJiIiIiIhymtqJ04gRIzB58mQcPHgQ2traUvmvv/6Kf/75J0uDIyIiIiIiyg3UTpwiIyPRrFkzhXJzc3O8fPkyS4IiIiIiIiLKTdROnExNTfHkyROF8oiICFhZWWVJUERERERERLmJ2olT27ZtMXz4cDx9+hQymQxJSUkICwuDn58ffHx8siNGIiIiIiKiHKV24jR16lQ4ODjA2toasbGxcHR0RM2aNVG1alWMGTMmO2IkIiIiIiLKUVrqrqCtrY3ly5dj3LhxiIyMRGxsLFxcXGBnZ5cd8REREREREeU4tROnFNbW1rC2ts7KWIiIiIiIiHIltYfqtWjRAtOnT1conzFjBlq1apUlQREREREREeUmaidOx44dg6enp0J5gwYNcOzYsSwJioiIiIiIKDdRO3GKjY2Vu/Ftijx58uDdu3dZEhQREREREVFuonbi5OTkhI0bNyqUb9iwAY6OjlkSFBERERERUW6i9uQQY8eORfPmzXH79m38+uuvAIDDhw9j/fr12Lx5c5YHSERERERElNPUTpy8vLywY8cOTJ06FVu2bIGenh7Kli2LQ4cOwc3NLTtiJCIiIiIiylFfNR15w4YN0bBhw6yOhYiIiIiIKFf66vs4xcfH4/nz50hKSpIrL1KkyDcHRURERERElJuonTjdvHkTXbp0wcmTJ+XKhRCQyWRITEzMsuCIiIiIiIhyA7UTp86dO0NLSwu7d++GpaUlZDJZdsRFRERERESUa6idOF24cAHnz5+Hg4NDdsRDRERERESU66h9HydHR0e8fPkyO2IhIiIiIiLKldROnKZPn47ffvsNoaGhePXqFd69eyf3ICIiIiIi+tmoPVTP3d0dAFCnTh25ck4OQUREREREPyu1E6eQkJDsiIOIiIiIiCjXUjtxcnNzy444iIiIiIiIci21r3ECgOPHj6NDhw6oWrUqHj16BABYs2YNTpw4kaXBERERERER5QZqJ05bt26Fh4cH9PT0EB4ejs+fPwMAYmJiMHXq1CwPkIiIiIiIKKepnThNnjwZS5cuxfLly5EnTx6pvFq1aggPD8/S4IiIiIiIiHIDtROnqKgo1KxZU6HcxMQEb9++zYqYiIiIiIiIchW1EycLCwvcunVLofzEiRMoVqxYlgRFRERERESUm6idOHXv3h0DBw7E6dOnIZPJ8PjxY6xduxZ+fn7o3bt3dsRIRERERESUo9SejnzEiBFISkpCnTp1EBcXh5o1a0JHRwd+fn7o379/dsRIRERERESUo9RKnBITExEWFoa+ffti2LBhuHXrFmJjY+Ho6AhDQ8PsipGIiIiIiChHqZU4aWpqol69erh27RpMTU3h6OiYXXERERERERHlGmpf41SmTBncuXMnO2IhIiIiIiLKlb7qPk5+fn7YvXs3njx5gnfv3sk9iIiIiIiIfjZqTw7h6ekJAGjcuDFkMplULoSATCZDYmJi1kVHRERERESUC6idOIWEhGRHHERERERERLmW2omTm5tbdsRBRJRlrjmUyukQslWp69dyOgQiIqL/HLWvcQKA48ePo0OHDqhatSoePXoEAFizZg1OnDiRpcERERERERHlBmonTlu3boWHhwf09PQQHh6Oz58/AwBiYmIwderULA+QiIiIiIgop33VrHpLly7F8uXLkSdPHqm8WrVqCA8Pz9LgiIiIiIiIcgO1E6eoqCjUrFlTodzExARv3779qiAWLVoEW1tb6OrqokqVKjhz5oxK623YsAEymQxNmzb9qu0SERERERGpQu3EycLCArdu3VIoP3HiBIoVK6Z2ABs3bsSQIUMwfvx4hIeHw9nZGR4eHnj+/Hmm60VHR8PPzw81atRQe5tERERERETqUDtx6t69OwYOHIjTp09DJpPh8ePHWLt2Lfz8/NC7d2+1AwgMDET37t3h6+sLR0dHLF26FPr6+vjrr78yXCcxMRHe3t7w9/f/qmSNiIiIiIhIHWpPRz5ixAgkJSWhTp06iIuLQ82aNaGjowM/Pz/0799frbbi4+Nx/vx5jBw5UirT0NCAu7s7Tp06leF6EydOhLm5Obp27Yrjx49nuo3Pnz9LE1gAwLt379SKkYiIiIiISKUep0uXLiEpKQkAIJPJMHr0aLx+/RqXL1/GP//8gxcvXmDSpElqb/zly5dITExEwYIF5coLFiyIp0+fprvOiRMn8Oeff2L58uUqbSMgIAAmJibSw9raWu04iYiIiIjov02lHicXFxc8efIE5ubmKFasGM6ePYv8+fPD0dExu+OT8/79e3Ts2BHLly9HgQIFVFpn5MiRGDJkiPT83bt3KiVPiYmJ+PLly1fHmpqVkWaWtJMbffr0KadDyF6GP3Gi/RMfuyRLy5wOIVv99O87IiL6Jnny5IGm5s/7/TOnqJQ4mZqa4u7duzA3N0d0dLTU+/StChQoAE1NTTx79kyu/NmzZ7CwsFCof/v2bURHR8PLy0sqS4lFS0sLUVFRKF68uNw6Ojo60NHRUTkmIQSePn361TMEpmdCbfMsayu3uXv3bk6HkL2qzc7pCLLPT3zsEseMzukQstVP/74jIqJvZmpqCgsLC8hkspwO5aehUuLUokULuLm5wdLSEjKZDBUrVswwi71z547KG9fW1kaFChVw+PBhaUrxpKQkHD58GP369VOo7+DggMjISLmyMWPG4P3795g3b16WDMNLSZrMzc2hr6+fJSdbvN7Pe11VUQvjnA4hez3/mNMRZB/zojkdQbb5lEW9xbmVbtGf99gREdG3EUIgLi5OmqHa8icfhfE9qZQ4LVu2DM2bN8etW7cwYMAAdO/eHUZGRlkSwJAhQ9CpUydUrFgRlStXxty5c/Hhwwf4+voCAHx8fGBlZYWAgADo6uqiTJkycuubmpoCgEL510hMTJSSpvz5839zeylkWj/vsBpdXd2cDiF7af3Ev9L8xMdOaKg9YegP5ad/3xER0TfR09MDADx//hzm5uYctpdFVEqcLl26hHr16qF+/fo4f/48Bg4cmGWJU5s2bfDixQuMGzcOT58+Rbly5RAcHCxNGHH//n1ofKcvQSnXNOnr63+X7RERERERZYeU77Nfvnxh4pRF1J4c4ujRo4iPj8/SIPr165fu0DwACA0NzXTdlStXZmksADgWlIiIiIh+aPw+m/VU6spJmRwCQJZODkFERERERPQjyNHJIYiIiIiIiH4EOT45BBERZb/OnTtj1apV6NmzJ5YuXSq3rG/fvli8eDE6deqULcOfc4srV65g3LhxOH/+PO7du4c5c+Zg0KBBOR0WERH9IFRKnACgfv36AJDlk0MQEdH3YW1tjQ0bNmDOnDnSjEufPn3CunXrUKRIkRyOLvvFxcWhWLFiaNWqFQYPHpzT4RAR0Q9G7enqVqxYwaSJiOgHVL58eVhbW2Pbtm1S2bZt21CkSBG4uLjI1U1KSkJAQACKFi0KPT09ODs7Y8uWLdLyN2/ewNvbG2ZmZtDT04OdnR1WrFgBAIiPj0e/fv1gaWkJXV1d2NjYICAgQFo3MDAQTk5OMDAwgLW1Nfr06YPY2Fi57S9fvhzW1tbQ19dHs2bNEBgYKN1+IsXOnTtRvnx56OrqolixYvD390dCQkKGr79SpUqYOXMm2rZtq9aN0YmIiAAVe5yaN2+OlStXwtjYGM2bN8+0bup/yERElLt06dIFK1asgLe3NwDgr7/+gq+vr8IMpgEBAfj777+xdOlS2NnZ4dixY+jQoQPMzMzg5uaGsWPH4urVq9i3bx8KFCiAW7du4ePH5BtGz58/H0FBQdi0aROKFCmCBw8e4MGDB1LbGhoamD9/PooWLYo7d+6gT58++O2337B48WIAQFhYGHr16oXp06ejcePGOHToEMaOHSsX3/Hjx+Hj44P58+ejRo0auH37Nnr06AEAGD9+fHbtPiIi+g9TKXEyMTGRpjQ0MTHJ1oCIiCj7dOjQASNHjsS9e/cAJCcpGzZskEucPn/+jKlTp+LQoUNwdXUFABQrVgwnTpzA77//Djc3N9y/fx8uLi6oWLEiAMDW1lZa//79+7Czs0P16tUhk8lgY2MjF0Pq64psbW0xefJk9OrVS0qcFixYgAYNGsDPzw8AYG9vj5MnT2L37t3Sev7+/hgxYgQ6deokxTdp0iT89ttvTJyIiChbqJQ4pQy/SPs3ERH9WMzMzNCwYUOsXLkSQgg0bNgQBQoUkKtz69YtxMXFoW7dunLl8fHx0pC+3r17o0WLFggPD0e9evXQtGlTVK1aFUDyRBR169ZFyZIlUb9+fTRq1Aj16tWT2jl06BACAgJw/fp1vHv3DgkJCfj06RPi4uKgr6+PqKgoNGvWTG7blStXlkucLl68iLCwMEyZMkUqS0xMlGuHiIgoK6k8OURqL1++RHR0NGQyGWxtbZE/f/6sjouIiLJJly5dpJuOL1q0SGF5yvVGe/bsgZWVldyylGuDGjRogHv37mHv3r04ePAg6tSpg759+2LWrFkoX7487t69i3379uHQoUNo3bo13N3dsWXLFkRHR6NRo0bo3bs3pkyZgnz58uHEiRPo2rUr4uPjVU54YmNj4e/vn+7wcV1dXbX2BxERkSrUSpyuXLmC3r17IywsTK7czc0NixcvhoODQ5YGR0REWa9+/fqIj4+HTCaDh4eHwnJHR0fo6Ojg/v37cHNzy7AdMzMzdOrUCZ06dUKNGjUwbNgwzJo1CwBgbGyMNm3aoE2bNmjZsiXq16+P169f4/z580hKSsLs2bOhoZE8P9GmTZvk2i1ZsiTOnj0rV5b2efny5REVFYUSJUp81T4gIiJSl8qJ09OnT+Hm5gYzMzMEBgbCwcEBQghcvXoVy5cvR82aNXH58mWYm5tnZ7xERPSNNDU1ce3aNenvtIyMjODn54fBgwcjKSkJ1atXR0xMDMLCwmBsbIxOnTph3LhxqFChAkqXLo3Pnz9j9+7dKFWqFIDkWfMsLS3h4uICDQ0NbN68GRYWFjA1NUWJEiXw5csXLFiwAF5eXggLC1O4r1T//v1Rs2ZNBAYGwsvLC0eOHMG+ffuka20BYNy4cWjUqBGKFCmCli1bQkNDAxcvXsTly5cxefLkdF93fHw8rl69Kv396NEjXLhwAYaGhkzAiIhIKZWnI58zZw5sbGwQERGBgQMHwsPDA/Xr18eQIUMQHh4Oa2trzJkzJztjJSKiLGJsbAxjY+MMl0+aNAljx45FQEAASpUqhfr162PPnj0oWrQoAEBbWxsjR45E2bJlUbNmTWhqamLDhg0AkhOvGTNmoGLFiqhUqRKio6Oxd+9eaGhowNnZGYGBgZg+fTrKlCmDtWvXyk1VDgDVqlXD0qVLERgYCGdnZwQHB2Pw4MFyQ/A8PDywe/duHDhwAJUqVcIvv/wi/Z/KyOPHj+Hi4gIXFxc8efIEs2bNgouLC7p16/Ytu5KIiP4jZEIIoUrF8uXLY8SIEWjdunW6yzds2IAZM2YgPDw8SwPMau/evYOJiQliYmIUvjR8+vQJd+/eRdGiRbN0jPylh2+zrK3cpmxh05wOIXs9jsjpCLJPIRfldX5QHy9fzukQspVemTI5HcJ31717d1y/fh3Hjx/P6VCIiH4I2fW99meTWW6QlspD9e7cuYPy5ctnuLxixYq4c+eO6lESERFlYNasWahbty4MDAywb98+rFq1SpqunIiIKCeonDi9f/8+0yzMyMhI4c7vREREX+PMmTOYMWMG3r9/j2LFimH+/PkcUkdERDlKrVn13r9/n2FX37t376DiqD8iIqJMpZ1pj4iIKKepnDgJIWBvb5/p8tQzHhEREREREf0sVE6cQkJCsjMOIiIiIiKiXEvlxCmzmyASERERERH9zFS+jxMREREREdF/FRMnIiIiIiIiJZg4ERERERERKcHEiX54K1euhKmpaU6HQT+IY2fPQt/JCW/fvQMArNmxA5ZVq+ZwVERERJTbqXUfp9Ru3bqF27dvo2bNmtDT0/vppyO3HbHnu24vqF+177q9H4WtrS0GDRqEQYMGSWVt2rSBp6dnzgWVQ0JPnkPtVj3w5upRmJoY5XQ4AJKT2EGDBuHt27cqr5PeMf2eWtavD48aNbK0zWNnz6J+ly54HBYG00xuHE5EREQ/DrV7nF69egV3d3fY29vD09MTT548AQB07doVQ4cOzfIAKXdLTExEUlJSjsagp6cHc3PzHI2Bflx6urowz58/p8MgIiKiXE7txGnw4MHQ0tLC/fv3oa+vL5W3adMGwcHBWRocqScs5BA6Na+P6qVtUNOpGPp1boMH0Xel5RfOnUZrjxqoVMIC7Txr40jwHjhb58X1K5FSndADe+FVowIqlbBA19ZeCNq8Hs7WefEuJgYAsHPTOlQvbYPQA3vR7NdfoKOjg/v37+Pz58/w8/ODlZUVDAwMUKVKFYSGhsrFt3z5clhbW0NfXx/NmjVDYGCg3BC727dvo0mTJihYsCAMDQ1RqVIlHDp0SFpeq1Yt3Lt3D4MHD4ZMJpN6ONMbqrdkyRIUL14c2traKFmyJNasWSO3XCaT4Y8//kCzZs2gr68POzs7BAUFqbyvL1+/hQYd+sHQrhoKOrujY/8xePn6DQBg2d9bUah8PYWEsonvYHQZMkF6vnN/KMp7tIdusV9QzNUL/oG/IyEh4d8Yrcrjj3Xb0azrUOgXrwq7ak0QdOAoACD6wWPUbtUDAJDX0Q0yq/LoPGi80ri37D4EpzqtoVfcFfnz54e7uzs+fPggLf/jjz9QqlQp6OrqwsHBAYsXL5aWRUdHQyaTYdu2bahduzb09fXh7OyMU6dOAQBCQ0Ph6+uLmJgY6fhMmDAhbQhyMjqmALB161aULl0aOjo6sLW1xezZs5W+vhSf4+MxJjAQdu7uMC1fHmU8PbFy27Z066Y3VG/XkSNwbd0aeStUgGP9+piyZIncsdF3csKKrVvRZuBA5K9UCU4NG2L3/+91d+/RI9Tv0gUAUKhaNeg7OaHH6NEqx05ERES5k9qJ04EDBzB9+nQULlxYrtzOzg737t3LssBIfR8/xqFj975YtzsEyzbshIZMA4O7d0BSUhJi37/DAN92KOHgiA17Q9F32CjMDZggt/7D+/cwtFdn1PbwxOb9x9HSuzMWzJicznY+YsWSeRg/Yx6uXLkCc3Nz9OvXD6dOncKGDRtw6dIltGrVCvXr18fNmzcBAGFhYejVqxcGDhyICxcuoG7dupgyZYpcu7GxsfD09MThw4cRERGB+vXrw8vLC/fv3wcAbNu2DYULF8bEiRPx5MkTqbczre3bt2PgwIEYOnQoLl++jJ49e8LX11fhJs7+/v5o3bo1Ll26BE9PT3h7e+P169dK9/PbmPf4tXVPuJQuiXP7/kbw2oV49vI1WvccDgBo1aguXr2JQUjYWWmd129iEBx6Et7NGgAAjp8Oh8/AcRjYtR2uhmzB79NHY+WmXZgy/0/5GAOXobVXXVw6tAGedarDu99ovH4TA+tCBbF1+UwAQNSx7XgScQDzJvplGveTZy/Qru8odGnTGNdCtyI0NBTNmzeHEAIAsHbtWowbNw5TpkzBtWvXMHXqVIwdOxarVq2Sa2f06NHw8/PDhQsXYG9vj3bt2iEhIQFVq1bF3LlzYWxsLB0fP7/MY8romJ4/fx6tW7dG27ZtERkZiQkTJmDs2LFYuXKlkqOTrNuoUdi0bx9mjRyJiJ07sWDcOBim+qEnM2Hnz6P76NHo6+2N8B07sGDcOPy9cyemL18uV2/qkiVo4eGBM1u3wqNGDXQZMQKvY2JQ2MIC6+bMAQBc3LULd0JCMHPECJW2TURERLmX2tc4ffjwQa6nKcXr16+ho6OTJUHR13H3bCz33H/2QtRyLoHbN64j4uw/kMlkGD99HnR0dVHc3gHPnz6B/28Dpfpb1q6AbbESGDJmEgDAtrgdbkddw/IF8r/0J3z5glFTZqGkoxNKFjbF/fv3sWLFCty/fx+FChUCAPj5+SE4OBgrVqzA1KlTsWDBAjRo0ED6Im1vb4+TJ09i9+7dUrvOzs5wdnaWnk+aNAnbt29HUFAQ+vXrh3z58kFTUxNGRkawsLDIcD/MmjULnTt3Rp8+fQAAQ4YMwT///INZs2ahdu3aUr3OnTujXbt2AICpU6di/vz5OHPmDOrXr5/pfl64YiNcypTE1JH9pbK/Zo+HdaUGuHH7HuyL26BB7WpYtyMYdWpUSd63ew6hQD5T1K5WKfnYBC7DiL6d0am1FwCgmE1hTBrWG79NmYfxQ3r+G2NrL7RrmhzP1BH9MP/P9Thz4TLq166GfKYmAADzAvlUusbpyfOXSEhIQHPPX2FTuBBQyAlOTk7S8vHjx2P27Nlo3rw5AKBo0aK4evUqfv/9d3Tq1Emq5+fnh4YNGya/Dn9/lC5dGrdu3YKDgwNMTEwgk8kyPT6pZXRMAwMDUadOHYwdOxZA8vly9epVzJw5E507d860zRs3bmDr/v3YvWwZfnV1TX4t1tYqxQMkJ0RDu3ZFhyZNpHXH9e2L0XPmYHTv3lK9Dk2aoPX/r63zHzAAi9euxbnISNSrXh35TJKPjVm+fLzGiYiI6CehduJUo0YNrF69GpMmJX+5lslkSEpKwowZM+S+lNL3d+/ubSyeNRWRF87j7evX0lCxp48f4t7tW7ArVRo6urpS/TLlysutH337Fko7y5elrQMAebS1YV+qjPQ8MjISiYmJsLe3l6v3+fNn5P//tSNRUVFo1qyZ3PLKlSvLJU6xsbGYMGEC9uzZgydPniAhIQEfP36UepxUde3aNfTo0UOurFq1apg3b55cWdmyZaW/DQwMYGxsjOfPnytt/+LVGwg5eQ6GdooTeNy+9xD2xW3g3awBuv82CYunjoSOjjbWbt+Hto09oKGhIbURdu6iXA9TYlISPn36jLiPH6Gvp5ccYym7f2PU14OxkSGev3yjwl5Q5OxojzrVK8OpTht4uLmiXpPWaNmyJfLmzYsPHz7g9u3b6Nq1K7p37y6tk5CQAJP/JwEpUu83S0tLAMDz58/h4ODwVXGl59q1a2jy/8QlRbVq1TB37lwkJiZCU1Mzw3UvXLgATU1N1KhY8au2HXnjBk5duIAZy5ZJZYlJSfj0Wf7YOKU63w309WFsaIgXKvRYEhER0Y9J7cRpxowZqFOnDs6dO4f4+Hj89ttvuHLlCl6/fo2wsLDsiJFUNMC3HSytrDF++jyYFbRAUlISWrhXxZf4L1m6HV1dXblrUWJjY6GpqYnz588rfKE1NDRUuV0/Pz8cPHgQs2bNQokSJaCnp4eWLVsiPj4+y2JPLU+ePHLPU34EUCY2Lg5edWti+qgBCsssC5oBALzq1oQQwJ7Dx1HJuTSOn47AnAlDU7XxEf5De6J5g18V2tBN1XObJ4/8W1Qmw1dPxqGpqYmDG5bg5LmLOHD0FBYsWIDRo0fj9OnTUi/y8uXLUaVKFYX1Uku931LOg5yeICQ1vf8nNl8rNi4OY/r0QRN3d4VlqY+NllbaY6Pa+UNEREQ/JrUTpzJlyuDGjRtYuHAhjIyMEBsbi+bNm6Nv377Sr8/0/b198xrRt29i/PS5KF8l+UL38DOnpOU2xUtgz/ZNiP/8Gdr///J3+WKEXBu2xUvgxJGDcmVp66THxcUFiYmJeP78OWpkMK1zyZIlcfbsWbmytM/DwsLQuXNnqWcqNjYW0dHRcnW0tbWRmJiYaTylSpVCWFiY3PCysLAwODo6Kn0tqihfxgFb9x6BrXUhhS/PKXR1ddC8QW2s3b4Pt6IfoGRxG5R3KiXXRtTteyhRtMhXx6H9/wRG2f5ITSaToVqlcqhWqRzGzVwCGxsbbN++HUOGDEGhQoVw584deHt7f31MKhwfVdZJOYaphYWFwd7ePtPeJgBwcnJCUlISjp87Jw3VU0e5UqVwIzoaxYtkwbFhIkVERPTT+Kr7OJmYmGA0Z4nKVYxNTGGaNx+2rFuFAuYWePL4IeYF+EvLPZu2xMIZkzFxxCB06TMITx49xOrfFwJI7sUAgJbevlizfDHmTB2PZm07IupKJII2r5Orkx57e3t4e3vDx8cHs2fPhouLC168eIHDhw+jbNmyaNiwIfr374+aNWsiMDAQXl5eOHLkCPbt2yfXc2VnZ4dt27bBy8sLMpkMY8eOVfgF39bWFseOHUPbtm2ho6ODAgUKKMQzbNgwtG7dGi4uLnB3d8euXbuwbds2uRn6vkXfzm2wfN12tOszCr/16YR8psa4Ff0AG3buxx+zxklf7L2beaJR54G4EnUHHZrL32dq3ODuaNRpEIpYWaBlQ3doaMhw8epNXL5+C5OH91UpDpvClpDJZNh96Dg861SHnq4ODA0yngDhdHgkDp84g3purjAvkBenw27hxYsXKFUqOaHz9/fHgAEDYGJigvr16+Pz5884d+4c3rx5gyFDhqgUk62tLWJjY3H48GE4OztDX18/3Wsi066T9pgOHToUlSpVwqRJk9CmTRucOnUKCxculJvlL7P2vBs3Rq9x4zBrxAiULVkS9588wYtXr9BCyfVrADCyVy+06NcP1paWaFa3LjQ0NBAZFYUrN29iwgDFXsb0WFsmH5t9R4/Co0YN6Onqqjw5BREREeVOas+qBwCfPn3CmTNnsHv3bgQFBck9KGdoaGhg+qI/cS3yIlrUrYpZ/qMwZPREabmhkTHmr1iPqCuRaF2/JhbOmIyeA4cBAHR0kq97KlzEBrOXrsSRfbvRql51bFrzF7r1Tx5epq2d+cQfK1asgI+PD4YOHYqSJUuiadOmOHv2LIr8/1f7atWqYenSpQgMDISzszOCg4MxePBg6Ka65iowMBB58+ZF1apV4eXlBQ8PD5QvL3+N1cSJExEdHY3ixYvDzMws3ViaNm2KefPmYdasWShdujR+//13rFixArVq1VJvp2agkIUZwnasQGJSIuq17wOnOm0waPwsmBobSdcwAcCv1Sshn6kxom5Ho30z+S/sHrWqYvequThw9B9U8uyIX7w6Y87ytbAprHqvrZWlOfyH9sKIgAUo6OyOfqOnZ1rf2MgAx06Hw7Njf9jXaIYxY8Zg9uzZaNAgeaa/bt264Y8//sCKFSvg5OQENzc3rFy5EkWLFlU5pqpVq6JXr15o06YNzMzMMGPGDKXrpHdMy5cvj02bNmHDhg0oU6YMxo0bh4kTJyqdGCLF/LFj0axuXQyaMgXlGjdG3wkT8OHjR5XWrVutGrYuXIjDJ0+iRrt2qOXtjQVr1qDI/yc+UYVVwYIY06cPxs6dC9tatTAkzQySRERE9OORiZS5iFUUHBwMHx8fvHz5UrExmUztYTrf27t372BiYoKYmBgYp5nt6tOnT7h79y6KFi0q94X+W116+DbL2spKe7Zvwrih/RB25R50M7guZPn8Wdj89wocOHMl3eVlC5t+9fa7d++O69ev4/jx41/dRrZ7rHyo4g+rkEtOR5BtPl6+nNMhZCu9MmWUVyIiov+07Ppe+7PJLDdIS+2hev3790erVq0wbtw4FCxY8KuDpO9v15YNsCpiA3OLQrhx9TLmTvVHvUZN5ZKmjav+QGnn8jDNmw8R5/7Bqt8XoG2n7pm0qrpZs2ahbt26MDAwwL59+7Bq1SqVhl4REREREeU0tROnZ8+eYciQIUyafkAvXzzD4tlT8fLFcxQwL4h6DZug3/AxcnXu372D5fNnIybmDSwKFUbH7v3Qtd/gLNn+mTNnMGPGDLx//x7FihXD/Pnz0a1btyxpOyv16tULf//9d/ITIX+NVYfmnlg6PXde33f/0RM41mqZ4fKroVtQxOr7TuBy/PhxaShgemJjY3NFm0RERETKqD1Ur0uXLqhWrRq6du2aXTFlKw7Vy1rfMlQvt3r+/DnevXuX/OSZ/BBFYyNDmBfIlwNRKZeQkIDoB48zXK4wC+B3GKr38eNHPHr0KMPlJUqUyJY2OVSPiIj+6zhUTzXZOlRv4cKFaNWqFY4fPw4nJyeFe+EMUHHWKaLcytzcHObm5slP9N/nbDBq0NLS+qbpzbODnp7eVyVH37tNIiIiImXUTpzWr1+PAwcOQFdXF6GhoXLTSctkMiZORERERET001E7cRo9ejT8/f0xYsQIuamXiYiIiIiIflZqZz7x8fFo06YNkyYiIiIiIvrPUDv76dSpEzZu3JgdsRAREREREeVKag/VS0xMxIwZM7B//36ULVtWYXKIwMDALAuOiIiIiIgoN1C7xykyMhIuLi7Q0NDA5cuXERERIT0uXLiQDSESKercuTOaNm2aaZ1atWph0KBB37SdlRuDYFqq5je1QelT5Rhmhag7d+Dm7Y28FSqgSsuM73P1NSYvXpzlbdKPLWXSpLdv3wIAVq5cCVNT029qM20bEyZMQLly5dRqQyaTYceOHd8UB6D4+r6Wra0t5s6dm6OxZEUMpJy652tWnas5iefWz0vtxCkkJCTDx5EjR7IjxtxhgslXP8r+YaP240eVFcnKj2rC7KUoV7dtTofxw5g3bx5WrlyZ7duZvHgxDPT0cHHXLuz9449s315aHr6+GDZ9ulzZsbNnoe/khLcp9wvLAvfu3YOenp7cDYD9/f3RoUMHldu4f/8+GjZsCH19fZibm2PYsGFISEiQq/P582eMHj0aNjY20NHRga2tLf766y9p+ZUrV9CiRQvY2tpCJpOp/OVh27ZtqFevHvLnzw+ZTJbpD3FCCDRo0OCH/IK1bds21K1bF2ZmZjA2Noarqyv279+f6Tpt2rTBjRs3sjWu6OhopfsdAKpWrYonT57AxMTkm7Z39uxZ9OjR45vayK0mTJgABwcHGBgYIG/evHB3d8fp06fl6rx+/Rre3t4wNjaGqakpunbtqnDz7kuXLqFGjRrQ1dWFtbU1ZsyYobCtzZs3w8HBAbq6unBycsLevXvTjal27dr44zt8/qX3nvTz88Phw4dVbuPJkyeZ3uQ8u2SU7AghMGvWLNjb20NHRwdWVlaYMmWKQr1Vq1ahevXq3yFSRd/r+NJXJE5ElHPi47/kdAhZxsTE5Jt/iVfFnQcP4OrigiKFCiH/V24v/kvu3+87d+5E7dq1YWhoKFfWuHFjldZPTExEw4YNER8fj5MnT2LVqlVYuXIlxo0bJ1evdevWOHz4MP78809ERUVh/fr1KFmypLQ8Li4OxYoVw7Rp02BhYaFy/B8+fED16tUxPU2SmZ65c+fK3QrjR3Ls2DHUrVsXe/fuxfnz51G7dm14eXkhIiIiw3X09PT+vbdcDtPW1oaFhcU3738zMzPo6+tnUVS5i729PRYuXIjIyEicOHECtra2qFevHl68eCHV8fb2xpUrV3Dw4EHs3r0bx44dk0sk3717h3r16sHGxgbnz5/HzJkzMWHCBCxbtkyqc/LkSbRr1w5du3ZFREQEmjZtiqZNm+JymhuAv379GmFhYfDy8sq21xwfH5/hMkNDQ+TPn1/ltiwsLKCjo5MVYWWJgQMH4o8//sCsWbNw/fp1BAUFoXLlygr11Pm8zUrf4/hSKkIFzZo1EzExMdLfmT1yu5iYGAFAej2pffz4UVy9elV8/PhRccXxxt/1cfHBG7UeEfdeiQHDx4pC1kWEjo6usC9VWsxaulJaZm5RSIyeMktunQ37jgqZTCb2nbooLj54I45fjhbN2nYUefPlFwaGRqJS1Rpi0/5jUv1eg4eLko5lxOS5S0ShwtbC0MhItGnTRrx7904IIUSnTp0EALnH3bt3Mz0eCQkJokuXLsLW1lbo6uoKe3t7MXfuXIU6gwcPFiYmJiJfvnxi2LBhwsfHRzRp0kSqExsbKzp27CgMDAyEhYWFmDVrlnBzcxMDBw6U6nz69EkMHTpUFCpUSOjr64vKlSuLkJAQuW2tWLFCWFtbCz09PdG0aVMxa+xgYWJsKMSj8EwfKwInKLz2FYEThHgULu6d2SMa13MTBvp6wsjQQLRqVFc8vXBQaZviUbgYP6SHcHa0F8tnjhW21oWETCYT4lG42Pz7DFHGoYTQ1dUR+UxNRJ3qlUXszTAhHoWLTq28RBOPWmLC0J6iQD5TYWRoIHp2aCE+3z0t334GEhMTxdSpU6VjUrZsWbF582ZpeUhIiAAgDh06JCpUqCD09PSEq6uruH79ulw7kyZNEmZmZsLQ0FB07dpVDB8+XDg7O0vLO3XqJHcM3dzcRP/+/cWwYcNE3rx5RcGCBcX48ePl2nzz5o3o2rWrKFCggDAyMhK1a9cWFy5cUHgNcZGRIi4yUuGYjOrdW8RFRoozW7cKt8qVha6OjshnYiJ8W7QQz0+fltbr0LixaFS7thjfv7+wMDMTNlZW0rLUj1G9ewunkiXFH1OniiKFCgljQ0PRsn598eyff6R20sZwLThYoaxD48YiLjJS1KhYUfRs21b0bNtWGBsaivympmJ4jx7iw6VLcttNz6+//iqWLFkiPb9//77Q1taWPusAiOXLl4umTZsKPT09UaJECbFz506p/t69e4WGhoZ4+vSpVLZkyRJhbGwsPn/+LIQQYt++fcLExES8evUqg7NHno2NjZgzZ45KdVPcvXtXABARERHpLo+IiBBWVlbiyZMnAoDYvn27tEyVz5O0KlSoIGbOnCk9b9KkidDS0hLv378XQgjx4MEDAUDcvHlTCCHE6tWrRYUKFYShoaEoWLCgaNeunXj27Jm0fsr7482bN0KI5M8UExOTTGNwdHQU/v7+GS5P28b48ePl3ktnzpwR7u7uIn/+/MLY2FjUrFlTnD9/Xq4NAGLx4sWifv36QldXVxQtWlTufZ32nHRzc0s3loxe365du4S9vb3Q09MTLVq0EB8+fBArV64UNjY2wtTUVPTv318kJCRI7aQ9N5Sdn0IIsWfPHmFnZyd0dXVFrVq1xIoVK+RiiY6OFo0aNRKmpqZCX19fODo6ij179mS4X21sbMTEiRNF27Zthb6+vihUqJBYuHChXB1VP3Myk/K949ChQ0IIIa5evSoAiLNnz0p19u3bJ2QymXj06JEQQojFixeLvHnzSu89IYQYPny4KFmypPS8devWomHDhnLbqlKliujZs6dc2erVq0WVKlWEEP8ev927dwsnJyeho6MjqlSpIiJTfa68fPlStG3bVhQqVEjo6emJMmXKiHXr1sm16ebmJvr27SsGDhwo8ufPL2rVqiVsbGzkziEbGxshhOL5KoQQf/75p3B0dBTa2trCwsJC9O3bV1qW+n2d8nmwfv164erqKnR0dETp0qVFaGioVF+V933K/5uZM2cKCwsLkS9fPtGnTx8RHx8vvZ6074GUY6WlpaXw/y2tjx8/CgMDA3Ht2jUhhPJzq127dqJ169ZybcTHx4v8+fOLVatWye3jvn37CmNjY5E/f34xZswYkZSUJLde6uObXlwZfq8lSWa5QVoq9TiZmJhIvy6ZmJhk+qCc8efCQOzauhFjpgZi2+FT6NCtD0YN7Ilzp8KgoaGBBk2aY++OLXLr7N2+GeUqVkGhwkUAAMN6d8brly+waPVmrN8bglJlnNGjbVPEvHkjrfPgXjRC9u/F/BUbsGDFBhw9ehTTpk0DkDz0ytXVFd27d8eTJ0/w5MkTWFtbZxp3UlISChcujM2bN+Pq1asYN24cRo0ahU2bNkl1Zs+ejZUrV+Kvv/7CiRMn8Pr1a2zfvl2unWHDhuHo0aPYuXMnDhw4gNDQUISHh8vV6devH06dOoUNGzbg0qVLaNWqFerXr4+bN28CAE6fPo2uXbuiX79+uHDhAmrXro3J81Xr+m7TuB6G9uyI0iWL40nEATyJOIA2jeshKSkJTXyH4PXbGBzduhwH1y/GnfsP0ab3CJXaBYBb0Q+wde9hbPtjFi4cWI8nz16gXd9R6NKmMa6FbkXolmVo3uBXCCGkdQ6fOINrN+8idMtyrF80Fdv2HYF/4O8qbS8gIACrV6/G0qVLceXKFQwePBgdOnTA0aNH5eqNHj0as2fPxrlz56ClpYUuXbpIy9auXYspU6Zg+vTpOH/+PIoUKYIlS5Yo3faqVatgYGCA06dPY8aMGZg4cSIOHjwoLW/VqhWeP3+Offv24fz58yhfvjzq1KmD169fp9venZAQOJYogYGdOuFOSAgGde6MD3FxaNyrF0yNjXF8/Xr8PXs2Qv75B0PSDL0IPX0aN6OjsXvZMmxduDDDmO8+eIBdR45g68KF2LpwIY6fO4dZf/4JAJg5YgSqODvDt0UL3AkJwZ2QEBS2sMC6OXMAABd37cKdkBDMHPHv+bA2KAhaWlo4tm4dZg4fjgVr1mDF1q3S8smLF8PW1lYuhrdv3+LEiRNyv3YGBQWhVq1aMDY2lsr8/f3RunVrXLp0CZ6envD29pb23alTp+Dk5ISCBQtK9T08PPDu3TtcuXJFarNixYqYMWMGrKysYG9vDz8/P3z8+DHD/ZOV4uLi0L59eyxatCjd3ixVPk/ScnNzQ2hoKIDkITnHjx+HqakpTpw4AQA4evQorKysUKJECQDAly9fMGnSJFy8eBE7duxAdHQ0Onfu/NWvKSkpCe/fv0e+fPm+uo3379+jU6dOOHHiBP755x/Y2dnB09MT79+/l6s3duxYtGjRAhcvXoS3tzfatm2La9euAQDOnDkDADh06BCePHmCbdu2qbz9uLg4zJ8/Hxs2bEBwcDBCQ0PRrFkz7N27F3v37sWaNWvw+++/Y8uWLZm2k9n5+eDBAzRv3hxeXl64cOECunXrhhEj5D9H+/bti8+fP+PYsWOIjIzE9OnT5Xpg0zNz5kw4OzsjIiICI0aMwMCBA9X6zEkZ4phyDqUVHx+PZcuWwcTEBM7OzgCS32umpqaoWLGiVM/d3R0aGhrSkL5Tp06hZs2a0NbWlup4eHggKioKb/7/P/nUqVNwd3eX256HhwdOnTolVxYUFIQmTZrIlQ0bNgyzZ8/G2bNnYWZmBi8vL3z5f8/6p0+fUKFCBezZsweXL19Gjx490LFjR+kcSbFq1Spoa2sjLCwMS5cuxdmzZwEAK1aswJMnT6TnaS1ZsgR9+/ZFjx49EBkZiaCgIOn9lZFhw4Zh6NChiIiIgKurK7y8vPDq1SsAqr/vQ0JCcPv2bYSEhEg96inDxbdt24bChQtj4sSJ0vcXANi1axeKFSuG3bt3o2jRorC1tUW3bt0U/uccPnwYVlZWcHBwkMoyO7e8vb2xa9cuueGZ+/fvR1xcHJo1aya3j7W0tHDmzBnMmzcPgYGBCkPy0ju+lI1Uzcb8/f3Fhw8fviGfyx1+xh6ns7eeCl09fbF6x3658mZtO4oGTVqIiw/eiI3Bx4RMJhPB/1yS74WaOltcfPBGrNi6VxgaGYmzt57KtWFtU1SMnTZH6nHS1dMXJ6/dl5YPGzZM7peOtL08X6Nv376iRYsW0nNLS0sxY8YM6fmXL19E4cKFpd6K9+/fC21tbbFp0yapzqtXr4Senp4Uy71794Smpqb0a16KOnXqiJEjRwohkn8B8vT0lFvepnE9lXqcUvcOpS47sH6x0NTUFPfP7JXKroRsEQDEmT1rVGozTx4t8fzSYansfPBaAUBEn96d7jqdWnmJfKYm4sOtMKlsScAoYWigLxIfnMu0x+nTp09CX19fnDx5Uq68a9euol27dkII+R6nFHv27BEApPdOlSpV5H5BFEKIatWqKe1xql69utw6lSpVEsOHDxdCCHH8+HFhbGwsPn36JFenePHi4vfff5crS90741SypNTTFBcZKRaOHy/yGhuLF6l6mLYtWiQ0NDTE3ZAQqafIPH9+8TY8PN2eptQ9Tvp6elIPU1xkpBjs6ysqlS0rPa9RsaLo26GD3HrBf/0lAIjHYWFy5TUqVhQOxYrJ9TAN7dJFOBQrJj2fPXKk+PXXX+Ve79q1a0XFihXlyurWrSv3CycAMWbMGOl5bGysACD27dsnhBCie/fuol69enJtfPjwQQAQe/fuFUII4eHhIXR0dETDhg3F6dOnxZ49e4SNjY3o3LmzSE9W9zj16NFDdO3aVe41pe5xSk/az5O0goKChImJiUhISBAXLlwQFhYWYuDAgdJ5161bN9G+ffsM1z979qwAIPVQqdvjNH36dJE3b165Xqu0lPU4pZWYmCiMjIzErl27pDIAolevXnL1qlSpInr37i2EUN7TlyK91wdA3Lp1S6rTs2dPoa+vL+0TIZLPndQ9Ien1OGV2fo4cOVI4OjrKxTJ8+HC5WJycnMSECRMyjT81GxsbUb9+fbmyNm3aiAYNGgghVPvMefjwoShZsqQ4ffq0XJ1du3YJAwMDIZPJRKFChcSZM2ekZVOmTBH29vYK8ZiZmYnFixcLIZLfvz169JBbfuXKFQFAXL16VQghRJ48eRR6ghYtWiTMzc2l558+fRKGhobi8uXLQoh/j9+GDRukOin/Lzdu3JjRrhINGzYUQ4cOlZ67ubkJFxcXhXrpvSfTnq+FChUSo0ePznBbSKfHadq0adLylO8A06dPz7CNtO/7Tp06CRsbG7lez1atWok2bdpIz9P7vOrZs6fUK3fs2DEREhIiypUrJ2rXri1Xr3v37sLPz0+urczOrS9fvogCBQqI1atXS8vbtWsnF4+bm5soVaqUXA/T8OHDRalSpaTnaY9vWuxxUk2W9zgByb8Epb1wkXKH+9F38OljHHq2b45fShaWHru2bsCDe9EAAIfSTihqV1LqdTr3Txhev3qBeo2aAgBuXL2MuA8fULNscbk2Hj24hwf37krbKmRdBAaGRtJzS0tLPH/+/JviX7RoESpUqAAzMzMYGhpi2bJluH//PgAgJiYGT548QZUqVaT6Wlpacr/U3b59G/Hx8XJ18uXLJ3fdRWRkJBITE2Fvbw9DQ0PpcfToUdy+fRsAcO3aNbk2AMC1Qtlvem3Xbt6FdaGCsLb699dxR/tiMDUxwrWbdzNZ8182VpYwy59Xeu7saI861SvDqU4btOrxG5av3YY3b+UnGXB2tIO+np7c64j9EIcHj59muq1bt24hLi4OdevWldtPq1evlvZTirJl/903lpaWACCdC1FRUQpjwNMbE55W6jZT2k1p8+LFi4iNjUX+/PnlYrt7965CbJmJunMHTiVLwiDV9RWuLi5ISkrCzehoqayMnR2009xuIT02hQrByMBAem5RoABe/P+X0K9RqWxZuetHKjs749b9+0hMTAQA9G7fXuFC67Rj69+9e4ejR48qjLdPvX8NDAxgbGys1vs3KSkJMpkMa9euReXKleHp6YnAwECsWrVK5V6ntWvXyh2/48ePq7ReUFAQjhw5onSyicw+T9JTo0YNvH//HhERETh69Cjc3NxQq1YtqQfh6NGjqFWrllT//Pnz8PLyQpEiRWBkZAQ3NzcAyHQbGVm3bh38/f2xadOmb7qG6dmzZ+jevTvs7OxgYmICY2NjxMbGKsTk6uqq8Dylx+lb6Ovro3jx4tLzggULwtbWVq63p2DBgkrPtczOz3Q/n9O8ngEDBmDy5MmoVq0axo8fj0uXLimNPbN9ospnjpWVFa5fv67w+Va7dm1cuHABJ0+eRP369dG6detv/l/5NY4cOQJzc3OULl1arjz16075f5nyuhMTEzFp0iQ4OTkhX758MDQ0xP79+xXOpwoVKqgdz/Pnz/H48WPUqVNHrfVSx5vyHSD1uavK+7506dLQ1NSUnqvy/SUpKQmfP3/G6tWrUaNGDdSqVQt//vknQkJCEBUVBSC5p3rXrl0Kn7eZnVtaWlpo3bo11q5dCyD5Gs+dO3fC29tbbp1ffvlF7v+Bq6srbt68Kf0/yOj4UvZR+T5OItUwIMpd4uI+AAAWrtwIcwtLuWXaOv928zds2hL7dmxB176DsW/HFlRzqwPTvPmkNgqYW+DPTbsU2jdKNQQzj5b8KSOTyZCUlPTVsW/YsAF+fn6YPXs2XF1dYWRkhJkzZyrMQPStYmNjoampifPnz8t9cAJQOpQjpxno68k919TUxMENS3Dy3EUcOHoKC1ZswOjpi3B692oULWL1TdtK+XFkz549sLKSbyvtxbqp7+GW8sH+LedC2jZT2k1pMzY2FpaWlukOicmOSSZSJ56Z0UrvPfEdPy/j4+MRHByMUaNGSWX79u2Do6OjwlDZzPavhYWFwlCcZ8+eScuA5C8aVlZWcsOyS5UqBSEEHj58CDs7O6XxNm7cWO4LcNrzLCNHjhzB7du3FY51ixYtUKNGDYSGhn7V54mpqSmcnZ0RGhqKU6dOoW7duqhZs6Y0k93Nmzel5OjDhw/w8PCAh4cH1q5dCzMzM9y/fx8eHh6ZXhyfng0bNqBbt27YvHmzwnArdXXq1AmvXr3CvHnzpNkOXV1d1Y7pa6V3XmV2rqnTjjqfKd26dYOHhwf27NmDAwcOICAgALNnz0b//v1VbiO1b/nMMTAwQIkSJVCiRAn88ssvsLOzw59//omRI0fCwsJC4Qt7QkICXr9+Lb3XLCwspPdfirTvx4zqpB7GGhQUpPaEBTNnzsS8efMwd+5cODk5wcDAAIMGDVI4nwxS/WCkKj0VP1fVoer7/mvOL0tLS2hpacHe3l4qK1WqFIDkH0tKliyJM2fOICEhAVWrVlUrbm9vb7i5ueH58+c4ePAg9PT0UL9+fbXa+JrjS99GrVn1ftRZjH52xe1KQltHB08eP0CRosXkHhaFCkv1GjRthVtR13D10gUc3LsTns1aSctKlXHGqxfPoKmlpdBG3nyqz4ajra0t/RKiirCwMFStWhV9+vSBi4sLSpQoIdd7YGJiAktLS7kPwISEBJw/f/7f11+8OPLkySNX582bN3LT97q4uCAxMRHPnz+X/pmlPFL+yZQqVUrhg/af8EjVX3uePEhM8yFcyq4oHjx+hgeP/u3puXrjDt7GvIejfTGV205LJpOhWqVy8PfrjYj966GdJw+27wuRll+8ehMfP35K9TouwdBAH9aFMp/lzNHRETo6Orh//77CflJ2vVpqJUuWVBjfntF4d1WVL18eT58+hZaWlkJsBQoUUD22YsUQGRWFD3FxUtmpiAhoaGjALs21Q1lBO08ehfdESk9W2vMFAM5Fyp9zZy9dQokiRRQS/hShoaHImzevdP0EkNwDpe6Yd1dXV0RGRsp9oTt48CCMjY3h6OgIAKhWrRoeP34sN/rgxo0b0NDQQOHChRXaTI+RkZHcsVP1i9SIESNw6dIlXLhwQXoAwJw5c7BixQoAyj9PMuLm5oaQkBAcO3YMtWrVQr58+VCqVClMmTIFlpaW0pem69ev49WrV5g2bRpq1KgBBweHr+pFWL9+PXx9fbF+/Xo0bNhQ7fXTCgsLw4ABA+Dp6YnSpUtDR0cHL1++VKj3zz//KDxP+RKYci2NOp/f31OpUqUUEvu0rwcArK2t0atXL2zbtg1Dhw7F8uXLM203s32SVZ85wL89F0Dye+3t27dy/8eOHDmCpKQk6UcFV1dXHDt2TLruCEh+P5YsWRJ58+aV6qTtfT548KDU05HSE5LeZ0Hq153y/zLldYeFhaFJkybo0KEDnJ2dUaxYMZWnw8+TzuddakZGRrC1tVVrevK08aZ8B0gd79e879NK7/tLtWrVkJCQINdeyr6wsUm+dczOnTvRsGFDhc/ozM4tIHlqf2tra2zcuBFr165Fq1atFJI7he8k/7+GUVNTM9PjS9lHrcTJ3t4e+fLly/RB35+BoRE69eiHWf6jEbR5PR5E38W1yItYt2IZgjavl+pZWReBc8XKmDCsP5ISk1Cr7r/3SfilRi2ULV8Jg7t54+TRI3j04D4unDuNBdMn4crFjKfJTcvW1hanT59GdHQ0Xr58qfTXHDs7O5w7dw779+/HjRs3MHbsWIUv2AMHDsS0adOwY8cOXL9+HX369JG74aGhoSG6du2KYcOG4ciRI7h8+TI6d+4MDY1/T297e3t4e3vDx8cH27Ztw927d3HmzBkEBARgz549AJKHeQQHB2PWrFm4efMmFi5ciODQk6q/dutCuHv/ES5cjsLL12/w+XM83GtUgZNDCXj3H43wyGs4E3EZPgPHws21Aio6O6rcdmqnwyMxdf6fOHfxKu4/eoJte4/gxes3KGVXVKoT/+ULuvpNxNUbd7D38AmMn/07+vm2kdsn6TEyMoKfnx8GDx6MVatW4fbt2wgPD8eCBQuwatUqlWPs378//vzzT6xatQo3b97E5MmTcenSpW/68cXd3R2urq5o2rQpDhw4gOjoaJw8eRKjR4/GuXPnVG6nbcOG0NHRQfcxY3Dl5k0cPXMGQwMC0L5RIxRU88uQKooUKoSzkZG49+gRXr55g6SkJFhbWkImk2Hf0aN48fo1YlMlcQ+ePMHwGTNw4+5dbNq7F0vWrUOfVMM3lqxbJzfMJe0vjgkJCdi3b5/av0LWq1cPjo6O6NixIy5evIj9+/djzJgx6Nu3r9Tb2L59e+TPnx++vr64evUqjh07hmHDhqFLly5SAhQfHy8lNvHx8Xj06BEuXLiAW7duZbr9169f48KFC7h69SqA5OGeFy5cwNOnyT86WFhYoEyZMnIPAChSpAiKFk0+91X5PNm+fbvcBdxA8v3n9u/fDy0tLWlZrVq1sHbtWqm3KWVb2traWLBgAe7cuYOgoCBMmjRJrf28bt06+Pj4YPbs2ahSpQqePn2Kp0+fIiYmRqqzcOFCtYYy2dnZYc2aNbh27RpOnz4Nb2/vdBPSzZs346+//sKNGzcwfvx4nDlzBv369QMAmJubQ09PD8HBwXj27JkUT3r7Kyf06tULN2/exLBhwxAVFYV169Yp3Adu0KBB2L9/P+7evYvw8HCEhITIfVF1cHBQmFgoLCwMM2bMwI0bN7Bo0SJs3rwZAwcOBKDaZ86jR4/g4OAgJXUfPnzAqFGj8M8//+DevXs4f/48unTpgkePHqFVq+QfK0uVKoX69euje/fuOHPmDMLCwtCvXz+0bdsWhQoVApD8XtPW1kbXrl1x5coVbNy4EfPmzcOQIUOk2AcOHIjg4GDMnj0b169fx4QJE3Du3DnpmJ4/fx5xcXHp3lto4sSJOHz4sPT/skCBAtINye3s7HDw4EGcPHkS165dQ8+ePRV6tjKSkhQ9ffpUmsQirQkTJmD27NmYP38+bt68Kf2PycyiRYuwfft2XL9+HX379sWbN2+kCYlUed+rGvuxY8fw6NEj6YcHd3d3lC9fHl26dEFERATOnz+Pnj17om7dutIPKhn1+mR2bqVo3749li5dioMHDyoM0wOSe7WGDBki3fphwYIFUhuZHV/KPmolTv7+/pgzZ06mD8oZfYeNRo+Bw/Dnojlo+msV9O7YEscPH4CVdRG5eg2btkLU1cv4tX5D6Kb6xyqTybBo9SaUr1IV44b2Q2O3ihjetyseP3qA/GZmKsfh5+cHTU1NODo6SsNYMtOzZ080b94cbdq0QZUqVfDq1Sv06dNHrs7QoUPRsWNHdOrUSeqGTz3rDJA8tKBGjRrw8vKCu7s7qlevrjD+esWKFfDx8cHQoUNRsmRJNG3aFGfPnkWRIsn76JdffsHy5csxb948ODs748CBAxgzoJvKr72FZx3Ur1UVtVv3gJlTHazfEQyZTIadKwKR18QYNZt3g3vb3ihWpDA2LpmmcrtpGRsZ4NjpcHh27A/7Gs0wZsZizB43GA1+rSbVqVO9MuyKWqNm825o03sEGteriQlDeqrU/qRJkzB27FgEBARI/+D37NkjfTlVhbe3N0aOHAk/Pz+UL18ed+/eRefOnaGrq6v2600hk8mwd+9e1KxZE76+vrC3t0fbtm1x7949uZnglNHX00PQ0qV4ExODGu3awXvIENSqUgWBo0d/dWyZGdS5MzQ1NFC+aVMUqVkTD548gVXBghjTpw/Gzp0L21q15Gb0a+/lhY+fP6Nm+/YYPGUK+nTogK6t/u0dfvX2rdyvn2n/aR89ehSGhoYoX768WnFqampi9+7d0NTUhKurKzp06AAfHx9MnDhRqmNoaIiDBw/i7du3qFixIry9veHl5YX58+dLdR4/fgwXFxe4uLjgyZMnmDVrFlxcXNCtW+bvpaCgILi4uEg9MG3btoWLiwuWLl2q8mtQ5fMkJiZGujYhRY0aNZCUlCSXJNWqVQuJiYly1zeZmZlh5cqV2Lx5MxwdHTFt2jTMmjVL5fgAYNmyZUhISEDfvn1haWkpPVJ/oXr58qVav5j/+eefePPmDcqXL4+OHTtiwIAB6V4z5e/vjw0bNqBs2bJYvXo11q9fL/UmamlpYf78+fj9999RqFAh6Vfs9PZXTihSpAi2bt2KHTt2wNnZGUuXLsXUqVPl6iQmJqJv377S55a9vT0WL14sLY+KipJLUIHk/y/nzp2Di4sLJk+ejMDAQHh4eABQ7TPny5cviIqKQtz/f/zQ1NTE9evX0aJFC9jb20uzvx0/flzuOpS1a9fCwcEBderUgaenJ6pXry53jyYTExMcOHAAd+/eRYUKFTB06FCMGzdO7l5PVatWxbp167Bs2TI4Oztjy5Yt2LFjh/Sjws6dO+Hp6akwnBgApk2bhoEDB6JChQp4+vQpdu3aJfU6jhkzBuXLl4eHhwdq1aoFCwsLKalSZvbs2Th48CCsra3h4uKSbp1OnTph7ty5WLx4MUqXLo1GjRpJs9tmZNq0aZg2bRqcnZ1x4sQJBAUFSb1+qrzvVTFx4kRER0ejePHiMPv/9x4NDQ3s2rULBQoUQM2aNdGwYUOUKlUKGzZsAJB8jfWtW7ekcya1zM6tFN7e3rh69SqsrKxQrVo1hTZ8fHzw8eNHVK5cGX379sXAgQOlcyCz40vZRyZUvHhJQ0MDT58+zTU34fta7969g4mJCWJiYuSm6QWSp+C8e/cuihYt+k1f8NK69PBtlrWV25QtbJrTIWSvx6r3tuUWnQeNx9t377Hjr8DMKxZK/59adqlbty4sLCywZs2abN/WxzQ3gPxRePj6oqyDA2YOH55pPb3/fzEKDw/Hr7/+ihcvXkhDPAYMGICEhAS5L4xE9N9TtmxZjBkzBq1bt5bKQkNDUbt2bbx58+a73ID8W0VHR6No0aKIiIhAuXLlcjocBYGBgTh06BD27t2b5W3XqlUL5cqVy3BCnPSOb1rZ9b32Z5NZbpCWymkqr28iIlXFxcVh6dKl8PDwgKamJtavX49Dhw7J3R+Fvl1CQgIWLFggNy6+TJkyCrM5EdF/S3x8PFq0aIEGDRoor0xfrXDhwhg5cuR33y6Pb87hrHqUrXr16oW///473WUdOnRQaxhOTitduyXuPXyS7rLfp4+Gd3PPXNFmZu4/egLHWi2Tn8gUR+pevXpVGrr4LVKGuEyZMgWfPn1CyZIlsXXr1m+ePYzkVa5cWWEa5NRDeYjov0lbWxvjx4/P6TB+epn19mQnHt+co/JQvZ8Fh+plLWVD9Z4/f453796lu8zY2Dj3D/1MNVTv3sPH+PIlId1qBc3yw8hQ/alZs6PNzCQkJCD6weP/b0Dxvg+2trY/xXjpH3WonqpShuoRERFlhEP1VJMtQ/WIvoa5uXnuT45UZFO40A/RZma0tLRQouj/e5QKlfiu2yYiIiL6kak1qx4REREREdF/ERMnIiIiIiIiJZg4ERERERERKcHEiYiIiIiISAkmTkREREREREowcfpJCCEwcfgg1ChTFM7WeXH9SiS6tmqEGRP+vTFbA9ey+PuPJTkYJX2t0JPnILMqj7cx77+pHdsqDTF3+dpM60yYMAEFCxaETCbDjh07vml7aWVHm/Rjq1WrFgYNGiQ9t7W1xdy5c7+pzbRtqHveTZgwAeXKlfumGFKkfX1fY+XKlTA1Nc3RWLIqBlJOnfM1K8/VnMJzi34kTJxU5LTK6asf3odrqP1QV1joIezcvA4LVm7A4fPXUaJkKQQuW4O+fqOyYW9kjh+CP65r167B398fv//+O548efLd70oeGhoKmUyGt2/fypVnxZfPtHqMGYMJ8+dLzz9++oQClSvj9v37KrexdP16OHh4IG+FCqjZvj3ORkYq1Dl94QIadO2KApUro+Avv6Bup074+OmTtHz6smWo3aED8leqBMuqVVXa7qdPn9C5c2c4OTlBS0sLTZs2zbR+WFgYtLS0frgvWK9fv0b//v1RsmRJ6OnpoUiRIhgwYABiYmIyXe/s2bPZfiPgzp07K93vALBt2zZMmjTpm7bVpk0b3Lhx45vayK2ioqJQu3ZtFCxYELq6uihWrBjGjBmDL1++yNXbvHkzHBwcoKurCycnJ+zdu1duuRAC48aNg6WlJfT09ODu7o6bN2/K1Xn9+jW8vb1hbGwMU1NTdO3aFbGxsQoxHT16FNbW1ln/YtPIKOlR57PXz88Phw8fzuLIlMvs//y1a9fQuHFjmJiYwMDAAJUqVcL9dD5XixYtikOHDmVzpIq+1/GlnxMTp5/Eg3t3YWZeEOUqVkEB84LQ0tKCSd68MDA0yunQMhQfH5/TIahFCIGEhPRvVvuzuH37NgCgSZMmsLCwgI6Ozle1k/ZLT26TmJiI4GPH0LB2bans8KlTKGJpieJFiqjUxpbgYIyYOROjevXCyU2b4GRvjyY9e+L5q1dSndMXLqBJ796o4+qKY+vW4fj69ejVrh00NP796I3/8gXN69VDdzXuQJ+YmAg9PT0MGDAA7u7umdZ9+/YtfHx8UKdOHZXbzy0eP36Mx48fY9asWbh8+TJWrlyJ4OBgdO3aNdP1zMzMoK+v/52izFy+fPlgZPRtn8N6eno/zf3w0sqTJw98fHxw4MABREVFYe7cuVi+fDnGjx8v1Tl58iTatWuHrl27IiIiAk2bNkXTpk1xOdWNrmfMmIH58+dj6dKlOH36NAwMDODh4YFPqX6k8Pb2xpUrV3Dw4EHs3r0bx44dSzfB3rlzJ7y8vLLtNSv7X6LOZ6+hoSHy58+fVaF9s9u3b6N69epwcHBAaGgoLl26hLFjxyrcfPXSpUt48+YN3NzcvnuM2X186efGxOknMHZwH0wbOxxPHj2Es3VeNHAtCwAKQ/XSehcTgwnDBqCWcwlULVUE3do0RtRVxV/M0xN1NRJdW3vByMgIxsbGqFChAs6dO4fQ0FD4+voiJiYGMpkMMpkMEyZMAJA8fGbSpEnw8fGBsbGx9A/rxIkTqFGjBvT09GBtbY0BAwbgw4cP0rbWrFmDihUrwsjICBYWFmjfvj2eP38uLU/ppdi/fz9cXFygp6eHX3/9Fc+fP8e+fftQqlQpGBsbo3379oiLi5PWS0pKQkBAAIoWLQo9PT04Oztjy5Yt8u1alce+I2GoUL89dIpWwYkzF5Tum537Q1Heoz10i/2CYq5e8A/8Xe6fpMyqPP5Ytx3Nug6FfvGqsKvWBEEHjsq1sffwCdhXbwq94q6o3bIHoh88VtjOiTMRqNGsC/SKu8K6YgMMGDsDH+I+Ssufv3wNr04DoVfcFUV/aYS12/YqtJHahAkTpH8mGhoakMlk0n6aOHEiChcuDB0dHZQrVw7BwcHSetHR0ZDJZNi4cSPc3Nygq6uLtWszHg748uVLNGvWDPr6+rCzs0NQUJDUTu3/JzJ58+aFTCZD586d0blzZxw9ehTz5s2Tzqno6GjpuO/Zswdly5aFrq4ufvnlF7kvUxn558IFaGlpoWKZMlLZ7pAQNKxVCwAwefFiVGnZEut27YKDhwcsXF3hM2wY3qc6L+evXg3fFi3g06wZShUvjgXjxkFPTw+rt2+X6vw2cyZ6t28Pv27d4FiiBOyLFkWL+vWho60t1Rnbty/6+/igtJ2d0rhTGBgYYMmSJejevTssLCwyrdurVy+0b98erq6uCsuCg4NRvXp1mJqaIn/+/GjUqJGUPKdn9+7dMDU1RWJiIgDgwoULkMlkGDFihFSnW7du6NChAwDg1atXaNeuHaysrKCvrw8nJyesX79e5ddZpkwZbN26FV5eXihevDh+/fVXTJkyBbt27cr0i6ey4X7Dhw+Hvb099PX1UaxYMYwdOzbdZP/333+HtbU19PX10bp1a6mna8KECVi1ahV27twpnZOhoaHpbiu9oYiTJ0+Gj48PDA0NYWNjg6CgILx48QJNmjSBoaEhypYti3PnzknrpP11P6WnYs2aNbC1tYWJiQnatm2L9+//Hcr74cMHaRuWlpaYPXu2QmyLFy+GnZ0ddHV1UbBgQbRs2TLDfZZix44d0joeHh548OCB3PKdO3eifPnyUu+Rv79/pseqWLFi8PX1hbOzM2xsbNC4cWN4e3vj+PHjUp158+ahfv36GDZsGEqVKoVJkyahfPnyWLhwIYDkRGTu3LkYM2YMmjRpgrJly2L16tV4/PixNOTt2rVrCA4Oxh9//IEqVaqgevXqWLBgATZs2IDHj+U/X4OCgtC4cWMAycevX79+6NevH0xMTFCgQAGMHTsWQgipvqr/o/bt24cKFSpAR0cHf//9N/z9/XHx4kXpHFq5ciUAxaF6Dx8+RLt27ZAvXz4YGBigYsWKOH36NADFXquUnlB/f3+YmZnB2NgYvXr1kvuhUtn7PuUzfdu2bahduzb09fXh7OyMU6dOSa8no//zo0ePhqenJ2bMmAEXFxcUL14cjRs3Vkj8d+7cifr16yNPnjxSWUbn1o0bNyCTyXD9+nW5NubMmYPixYvL7WNV/h+kPr5E6mLi9BP4zT8AfYaOQkHLQjh8/jrW7j6i0nrDenfG65cvsGj1ZqzfG4JSZZzRo21TxLx5o3Tdkf17oKBlIZw9exbnz5/HiBEjkCdPHlStWhVz586FsbExnjx5gidPnsDPz09ab9asWXB2dkZERATGjh2L27dvo379+mjRogUuXbqEjRs34sSJE+jXr5+0zpcvXzBp0iRcvHgRO3bsQHR0NDp37qwQ04QJE7Bw4UKcPHkSDx48QOvWrTF37lysW7cOe/bswYEDB7BgwQKpfkBAAFavXo2lS5fiypUrGDx4MDp06ICjR+WTmBFT52PaqAG4FroVZUtl/uX2+Olw+Awch4Fd2+FqyBb8Pn00Vm7ahSnz/5Sr5x+4DK296uLSoQ3wrFMd3v1G4/Wb5C9lDx49RfPufvCqWxMX9q9Ht/ZNMSJggdz6t6MfoL53P7TwrINLBzdi45JpOHHmAvqNnibV6Tx4PB48foaQTb9jy7IZWLxqM56/zPjY+vn5YcWKFQAgHTsg+UvL7NmzMWvWLFy6dAkeHh5o3LixwjCYESNGYODAgbh27Ro8PDwy3I6/vz9at26NS5cuwdPTE97e3nj9+jWsra2xdetWAMnDd548eYJ58+Zh3rx5cHV1Rffu3aW4Ug+zGDZsGGbPno2zZ8/CzMwMXl5ecl+C9Z2csCbN9QJ7QkPh6eYmlxwGHz2KRql6oO4+eIBdR45g68KF2LpwIY6fO4dZfyYfx/gvXxBx9Spq//KLVF9DQwO//vILTl+8CAB4/uoVzl66BPN8+VC7QwfYurmhXufOOBkenuG+yWorVqzAnTt35H69T+3Dhw8YMmQIzp07h8OHD0NDQwPNmjVDUlJSuvVr1KiB9+/fIyIiAkDykJcCBQrIJQ1Hjx5Frf8noJ8+fUKFChWwZ88eXL58GT169EDHjh1x5syZr35NMTExMDY2hpaW1le3YWRkhJUrV+Lq1auYN28eli9fjjlz5sjVuXXrFjZt2oRdu3YhODgYERER6NOnD4Dk90rr1q1Rv3596ZysquIwSyD5C1+1atUQERGBhg0bomPHjvDx8UGHDh0QHh6O4sWLw8fHR+7LeVq3b9/Gjh07sHv3buzevRtHjx7FtGn/vv+HDRuGo0ePYufOnThw4ABCQ0MRnurcO3fuHAYMGICJEyciKioKwcHBqFmzZqZxx8XFYcqUKVi9ejXCwsLw9u1btG3bVlp+/Phx+Pj4YODAgbh69Sp+//13rFy5ElOmTJHqdO7cWTo/0nPr1i0EBwfL9UScOnVKoWfVw8ND+iJ/9+5dPH36VK6OiYkJqlSpItU5deoUTE1NUbFiRamOu7s7NDQ0pCQEAK5cuYLnz5/j119/lcpWrVoFLS0tnDlzBvPmzUNgYCD++OMPabmq/6NGjBiBadOm4dq1a6hbty6GDh2K0qVLS+dQmzZtFNaJjY2Fm5sbHj16hKCgIFy8eBG//fZbhu9RADh8+DCuXbuG0NBQrF+/Htu2bYO/v7+0XNX3/ejRo+Hn54cLFy7A3t4e7dq1Q0JCQob/55OSkrBnzx7Y29vDw8MD5ubmqFKlSrrXawUFBaFJkybS88zOLXt7e1SsWFHhB7m1a9eiffv2cmXK/h+kd3yJ1CL+Y2JiYgQAERMTo7Ds48eP4urVq+Ljx48Ky8qsLPNdHxcfvFHrMWz8VFGosLVcWcVfqgnvrr2k54UKW4th46eKiw/eiBVb9wpDIyNx9tZTuXWsbYqKsdPmKN2egaGRmBS4ON19vGLFCmFiYqJQbmNjI5o2bSpX1rVrV9GjRw+5suPHjwsNDY10j4MQQpw9e1YAEO/fvxdCCBESEiIAiEOHDkl1AgICBABx+/Ztqaxnz57Cw8NDCCHEp0+fhL6+vjh58qRCPO3atZNrd8dfgUI8ClfpUad6ZTF1RD+5sjXzJwnLggWk5wDEmIHdpOexN8MEALHv7wVCPAoXI/v5Ckf7YnJtDO/bWQAQb/7H3n3H1fT/cQB/Xe09tJSmhtIWySpCyche2XskisiIMip7k/FVIfLFF1l9EYXsUUapJBL5WiUVaZzfH+n8us2bdSvv5+PRg3PO53zO+4x77/mczzjx0Qzz8i4zbmgfZqJLP640l4/+VXLcUq4xiZeOMgCYm6f2sssToo8wAJh1PrNK5lXi6NGS9cpSVVVlli9fzjWvVatWzNSpUxmGYZjU1FQGALN+/fpK8ywLALNw4UJ2Oicnp2Tfz5zhOuaZmZlc69na2jIzZszgmleaNiwsjJ33/v17RkxMjNm7ahWT9+ABk/fgAaOvpcUcWL+enc578IDR1dRkjmzZwk5f2LuXUZKXZ3Li4pi8Bw+Y+VOmMOJiYsx/16+zadzHjGFamZoyeQ8eME8iIxkAzMW9e7nydR8zhrEyMWHyHjxgovbtYwAw8jIyTOCSJczVv/9mXIcPZ4SFhJj7J09yrZf34AGzfelSRkZKqsL8yv7KGjVqFOPs7FzhWCclJTFKSkpMYmIiwzAMs3jxYsbMzKza8/P27VsGAPOg3DbKsrS0ZFatWsUwDMP06dOHWb58OSMsLMx8+vSJSU9PZwAwSUlJVa7fo0cPZtasWex0+XOrqanJrFu3rsr4NDQ0mPnz51e7H+XzAMAcPXq0yvSrVq1iWrZsyU4vXryYERAQYNLT09l5Z86cYRo1asRkZGQwDFP1cS+vsv0bPnw4O52RkcEAYLy9vdl5165dYwCw2yr/nbp48WJGXFycyc7OZud5enoy1tbWDMMwzKdPnxhhYWHm77//ZpeXfjZKYzly5AgjLS3NlUd1goKCGADM9evX2XkJCQkMAObGjRsMwzCMvb094+fnx7Xe3r17mSZNmrDTXl5ezIgRIyrkb2Njw4iIiDAAmIkTJzJFRUXsMiEhIWb//v1c6bds2cIoKSkxDMMwMTEl36GvXr3iSjNw4EBm0KBBDMMwzPLlyxl9ff0K21VUVGS2bv3/b9ny5cuZAQMGsNO2traMoaEhU1xczM6bO3cuY2hoWCGvUlX9Rh07dowrXVWfybLX6/bt2xkpKSnm/fv3lW6rfB6jRo1i5OXlmdzcXHbetm3bGElJSa5jWlb5z33pd/quXbvYNI8ePWIAMAkJCQzDVP47X3oti4uLM2vXrmXu3bvH+Pv7MxwOh4mKimLTpaenM8LCwuz3PC/X1rp165hmzZqxyxMTE7niqe734ODBg+y88ue3oavuvpb8X3Vlg/KoxukPlRT/EHm5ueho2gxtDJqyfy9fPMeL56k1rj9iwlT4zinpXxEQEFBt856yyj7tA4C4uDgEBwdDUlKS/XNwcEBxcTFSU0viuHPnDnr16gUNDQ1ISUmxTyLLdzY1NTVl/6+srMw2wyk7r7T5xJMnT5CXl4euXbtybXvPnj0V9sXK1IinfQOAuPgkLFm/E5J67di/CXOWIeO/d8j7/P9mdGVrriTExSAtJcnWBiU8eQZrC2OufG1amnJNx8UnIfjQCa7tOAybVnLcXrxEwpNUCAoKoqWpIbtOc11tyMrUrq9FdnY2Xr16hXbt2nHNb9euHRISErjmlT+3VSl7niQkJCAtLc3VrKW2yjZBk5eXh4GBAR6n/v8ajj1xAs5l+vc8fvoUGW/eoJO1NTvv5IULcLS15ep7pKmqCikJCXZaRUEBb8v0X6pJ8bfagrEDB2Jk374wNzTEyrlzoa+lxdWcryYt+/SBYuvWUGzdGs6TJ/O0TlFREYYNGwZfX1/o6+tXmS45ORlDhw6Fjo4OpKWloaWlBaDiZ6ssW1tbREVFgWEYXL58Gf369YOhoSGuXLmC6OhoqKqqQu9bs8OioiIsXboUJiYmkJeXh6SkJP79999q869KdnY2evToASMjI7ZZ0Pc6ePAg2rVrBxUVFUhKSmLhwoUVYtLQ0ICamho7bWNjg+LiYiQmJv7QtoGK31UAYGJiUmFedZ8LLS0trr5TTZo0YdOnpKTg69evsC5zjZd+Nkp17doVmpqa0NHRwYgRIxAaGsrVlLkygoKCaNWqFTvdvHlzyMrKst8FcXFxWLJkCdd3amlNcWnepTX95R08eBB3795lWwisXr262lh+lePHj1doxtWmTRu2dhoouRaSk5PZJqu8/kbx+h1ZVmxsLCwsLCAvL8/zOmZmZlx9/GxsbJCTk8M2feP1c1/2Om3SpAmA6q/J0horZ2dnuLu7w9zcHF5eXujZsycCAwPZdOHh4WxTwVI1XVtDhgzBs2fPcP36dQAltU2WlpZo3rw5VwyV/R6U/a2q7PwSUhvf39aB1Gt5eblQUFLBX3+fqLBMSkamxvWneHihe58BSLlzGWfOnMHixYsRFhaGvn37VrueRJkbUaCkGcKkSZPg5uZWIa2GhgZyc3Ph4OAABwcHhIaGQlFREWlpaXBwcKgwuETZttIcDodrunRe6Rd76UhKp06d4ro5AlChU66EuFi1+8S1P3mf4TtrEvp1r9gMQLRMvkJC3B89DgfVNr2osJ3cPEwa3h9uY4dUWKah1gRJT2t/Y/qjyp/bqlR3Xn6HUxcvorONDdf5OBUVhSXlRu0r3xSMw+GwhSEFOTkICAjgv3IFqTfv30P5W0dtFQUFAIBhmcI7ABjo6ODFt2aQvDi6dSsKvvUREeWxw/inT59w+/Zt3Lt3j232WlxcDIZhICgoiLNnz6Jz587o1asXNDU1sXPnTqiqqqK4uBjGxsbVDtxiZ2eH3bt3Iy4uDkJCQmjevDns7OwQFRVVobP3qlWrsGHDBqxfvx4mJiaQkJDAzJkzaz0wzKdPn+Do6AgpKSkcPXq0wjVUG9euXYOLiwt8fX3h4OAAGRkZhIWFVdoH6Fcp/11V1bzqPhc/+jmSkpLC3bt3ERUVhbNnz2LRokXw8fHBrVu3vntU1JycHPj6+qJfv34VlpUfHKC80ua3RkZGKCoqwsSJEzFr1iwICAhARUUF//33H1f6//77j+3fV/rvf//9x97gl06X9v9RUVGpcNNfWFiIDx8+sOtnZGSwzSd5VZvfKF6/I8sSE+P994dXvH7ua3tNKigoQFBQEEZG3A8bSx+slPqePkYqKiro3Lkz9u/fjzZt2mD//v2YMmVKrfL4nvNLSHlU4/SHMjQ2w/u3/0FAUBAa2jpcf3LyvI3Qo6WjC3d3d5w9exb9+vVj+8cICwuzT+JqYmlpifj4eOjq6lb4ExYWxuPHj/H+/XsEBASgQ4cOaN68+Q/VTpQyMjKCiIgI0tLSKmz3R4YptTRujsSU59DV1qjwV7Y2ozqGulq4GfuIa971u9yDdliaGCI+6Wml2xEWFkLzZlooLCzEnfv/f9KW+ORZrd8DJS0tDVVVVcTExHDNj4mJqfDj+DMIfxs0ofz1U901VfoEEgAyMzORlJSE5traVW7j5MWLXH2Znjx/jrSMDNhXMnhClXEKCcHCyAhRZfpGFBcX4+L167A2MwMAaKqpoYmSEpKePeNaN/n5c6irqvK8LQ1VVTTT0EAzDQ2ofauJqIm0tDQePHiA2NhY9m/y5MkwMDBAbGwsrK2t8f79eyQmJmLhwoWwt7eHoaEhMnno31jaz2ndunVsIam04BQVFcXVfyUmJgbOzs4YPnw4zMzMoKOjU+thtbOzs9GtWzcICwsjPDy8xhvwmly9ehWamppYsGABrKysoKenh+fPn1dIl5aWxjVowPXr19GoUSO21qY233O/W7NmzSAkJMTVd6f0s1GWoKAgunTpgpUrV+L+/ft49uwZLlyouo9sYWEh16AViYmJyMrKgqFhSc22paUlEhMTK/0+5/X7Dyj5LBUUFLA36TY2NhWG3D537hxbu6CtrQ0VFRWuNNnZ2bhx4wabxsbGBllZWbhz5w6b5sKFCyguLmZr5k6cOIG2bdtWqN0pexyBkmtBT08PAgICP/Qbxcs1ZGpqitjYWHz48IGnPIGSmr/PZVo4XL9+HZKSklBXV//uzz0vsQsLC6NVq1YVamWTkpKgqakJoKRwffHiRa7+TUDN1xZQMiriwYMHce3aNTx9+pSrf13ZfS1Ves2X5lHV+SWkNqjg9Idq08EOppat4D7eBVejL+DlizTE3r6BTSuW4lHcvWrX/fL5M/wWeuLWtSt4/vw5YmJicOvWLfbLSUtLCzk5OYiMjMS7d++qbf4xd+5cXL16Fa6uroiNjUVycjKOHz/OPiXX0NCAsLAwNm3ahKdPnyI8PPyH34kClDxtnT17Ntzd3RESEoKUlBTcvXsXmzZtQkhIyHfnu8h9AvYcPgXftdvxKDEFCclPEXb8XyxcsYXnPCaPHIDk1DR4Ll2HxCfPsP/oGQSXqxmcO3UUrt6+D9cFAYh9mIjkp2k4/m8UOziEga4WHDu1xaS5y3Hj7gPcuR+P8Z5LIPYdN52enp5YsWIFDh48iMTERHh5eSE2NhYzZsyodV410dTUBIfDwcmTJ/H27Vu2ZlBLSws3btzAs2fP8O7dO66nnkuWLEFkZCQePnyI0aNHQ0FBAb3KNM0z79ULx7/dUL15/x53Hz1C9zK1IicvXkSnNm0gXssnu24jRyLoyBHsO34cj58+hdvSpcj7/Bkjvr3bh8PhwH30aGzbvx9Hz55FSloafDdtQlJqKkaXeSL/IiMDcY8f40VGBoqKihD3+DHiHj9GTg3NpuLj49kbqo8fP7IFJKBkoApjY2OuPyUlJYiKisLY2BgSEhKQk5ND48aNsWPHDjx58gQXLlyAh4dHhe3Y29uzo5cBJSMempqaIjQ0lC0kdezYEXfv3kVSUhJXjZOenh7OnTuHq1evIiEhAZMmTapQc1Cd0kJTbm4u/vrrL2RnZ+P169d4/fo1101b8+bNcZTH5o96enpIS0tDWFgYUlJSsHHjxkrXFRUVxahRoxAXF4fLly/Dzc0NgwYNYmsntLS0cP/+fSQmJuLdu3dsB/Tyx4sfJCUlMW7cOHh6euLChQvsZ6Ns4eXkyZPYuHEjYmNj8fz5c+zZswfFxcVswXDz5s0VhrAXEhLC9OnTcePGDdy5cwejR49GmzZt0Lp1awDAokWLsGfPHvj6+uLRo0dISEhAWFgYFi5cyOYxb948jBw5kp0ODQ3F33//jYSEBDx9+hR///035s2bh8GDB7M1HjNmzEBERATWrFmDx48fw8fHB7dv32Z/JzgcDmbOnIlly5YhPDwcDx48wMiRI6Gqqsq+a8vQ0BCOjo6YMGECbt68iZiYGLi6umLIkCFQ/fYgo6qakLS0NHh4eCAxMREHDhzApk2b2O+/H/mN0tLSQmpqKmJjY/Hu3Tvk5+dXSDN06FCoqKigT58+iImJwdOnT3HkyBF20IvKfP36FePGjUN8fDxOnz6NxYsXw9XVFY0aNeL5c89L7JX9znt6euLgwYPYuXMnnjx5gs2bN+PEiRPswCoRERHQ19dnmweWqunaAoB+/frh06dPmDJlCjp16sSet7Iq+z0ovQZoND3yM1DB6Q/F4XCwZc/fsLRui0WzXNHb1gpzp43Dq5cv0FhRsdp1BQQE8DHzAxbOnAx9fX0MGjQI3bt3Z0ftadu2LSZPnozBgwdDUVERK1eurDIvU1NTREdHIykpCR06dICFhQUWLVrEfiEqKioiODgYhw4dgpGREQICAn5a2/elS5fC29sb/v7+7I/qqVOnoF1NbUVNHOza4mTIepyNvo5WTiPQptdorNsZCs2mTWpe+RsNtSY4smMVjkVEwazbEATuPQw/r2lcaUyN9BF9ZCeSnqahQ79xsHAYikWrtkFV+f/nLmitD1SVFWA7YAL6jZ+NiS79oKQgV+t9cnNzg4eHB2bNmgUTExNEREQgPDyc7cfyM6mpqcHX1xdeXl5QVlZmb4xmz54NAQEBGBkZsU1hSgUEBGDGjBlo2bIlXr9+jRMnTkC4TBOTpGfPkP1tmObT0dGwMjGBgtz/j0PZYchrY4CjI/xmzcLSLVvQZsAA3E9MxLHAQCh/a6IHAK4jRmD2uHGYs3IlrAcMQNSNGzi5Ywd0ytRqLt28GTYDB2LZ1q3IycuDzcCBsBk4EHcfPapssywnJydYWFjgxIkTiIqKgoWFBSwsLHiOv1GjRggLC8OdO3dgbGwMd3d3rFq1qkK6lJQUvHv3jmuera0tioqK2IKTvLw8jIyMoKKiwtWPZuHChbC0tISDgwPs7OzYG0Be3b17Fzdu3MCDBw+gq6uLJk2asH9lh8FOTEys8aW4pXr37g13d3e4urrC3NwcV69ehbe3d4V0urq66NevH5ycnNCtWzeYmppi69at7PIJEybAwMAAVlZWUFRUZGtlKzte/LBq1Sp06NABvXr1QpcuXdC+fXu0bNmSXS4rK4t//vkHnTt3hqGhIQIDA3HgwAG0aNECQMlrA8r39xQXF8fcuXMxbNgwtGvXDpKSkjh48CC73MHBASdPnsTZs2fRqlUrtGnTBuvWrWNrG4CS5lJlP7+CgoJYsWIFWrduDVNTU/j6+sLV1ZVr1Lq2bdti//792LFjB/vaiGPHjsG4zOsE5syZg+nTp2PixIlo1aoVcnJyEBERwVVDGRoaiubNm8Pe3h5OTk5o3749duzYAaCkyV1kZGSlN9YjR47E58+f0bp1a0ybNg0zZsxgX6fxI79R/fv3h6OjIzp16gRFRcVKh+oXFhbG2bNnoaSkBCcnJ5iYmCAgIAACAgJV5mtvbw89PT107NgRgwcPRu/evdl+gbx+7mtS1e983759ERgYiJUrV8LExAS7du3CkSNH0L59ewBV9zGq6doCSh549urVC3FxcXBxcak0rkp/D4SFqz2/hNQGh2GqGe+0AcrOzoaMjAw7pG1ZX758QWpqKrS1tX+4OUhZ99OzflpedY1pU1l+h/Brvaq+9q1eU+X9JrsuioqKQqdOnZCZmVmhT8bnKt7lNGD6dLS1sIDH2LEAgHeZmdDp3BnJ585xFXjqOjFj45oTEUJ49s8//2DhwoWIj4/nmm9nZwdzc/Nq3wtWl4wePRpZWVmVDgHOb4WFhVBWVsaZM2e4apJ+hup+D4Cqz29D96vuaxua6soG5VGNEyHkj9HWwgKDnJzY6cyPH7Fi9ux6VWgihPx8kpKSWLFiBb/DaNA+fPgAd3d3rtHzfhc6v+RnoVH1SKX62tsgI/1Fpcu8A9aiR99BvzmiuqFFpwF4nl75iGjbVyyASz+nSpeRuqG0pqmUnpYW9Mq1tSeE/Hm6devG7xAaPCUlJa7+br8TnV/ys1DBiVRqS8hBFBYUVrqspj5QDdnpvRtRUMVxUVbkbTRC8nPY2dnhD2tpTAj5zaKiovgdQq0EBwfzOwS+oN8D8rtQwYlUSrWpBr9DqJM0m/I+jDQhhBBCCGk4qI8TIYQQQgghhNSACk6EEEIIIYQQUgMqOBFCCCGEEEJIDajgRAghhBBCCCE1oIITIYQQQgghhNSACk4NBMMwWDJ3JjoYa8NMXQ6PHz3AuIE9sdJnHpumu40p9u3axscoSV3l4+MDc3PzatPExMTAxMQEQkJC6NOnz0/d/ujRo396nqR+Cw4OhqysLDvNyzVak/J51Pa6e/bsGTgcDmJjY38oDqDi/n0vDoeDY8eO8TWWnxEDqVltrtefea3yE11bpK6hglMDERN1HscP7cem4DBE3nkMXQNDrN2xF9Nmz//tsfysG4KGJvhgOGQNO/60/HzWBMK865Cfll9NPDw8YG5ujtTUVL68K0RLSwvr16/nmvcrrrXLt25Br0sXrnkTFy6Ez8aNPOfxIDERXUaNglzLltDr0gVrd++ukCYrOxszly2DdqdOkLW0hGnPnoi4dIldfuX2bfR3dYVO584QNzFBeGQkT9vesWMH7OzsIC0tDQ6Hg6ysrCrT5ufnw9zcvF7eYO3cuRMdOnSAnJwc5OTk0KVLF9y8ebPadWbPno1IHo/j94qKiqrxuAPA4MGDkZSU9MPby8jIQPfu3X84n7po0qRJaNasGcTExKCoqAhnZ2c8fvyYK01aWhp69OgBcXFxKCkpwdPTE4WF3O/ai4qKgqWlJURERKCrq1vp99eWLVugpaUFUVFRWFtbV3ktaWtr4/z58z9tHytTVaFnw4YNPH/3qqurIyMjA8bGxj8/wBpUVdjJz8/HggULoKmpCREREWhpaWF3Jd+Nvr6+GD58+G+ItKLfcX5J/UbvceJRQnPD715X6DvWKTh/rVbpXzxPhaKSMsytrNl5MnJy37Hl3+fr168QFhbmdxg8YxgGRUVFEBTk78emNI7fLSUlBZMnT0bTpk2/O4/6cM5PXrwIJzs7drqoqAgRly7hyJYtPK2fnZODXpMmoXObNtjo7Y1HycmYvGgRZKSkMG7gQADA14IC9Jw4EYry8ti/di1UlZSQ9uoVZKSl2XxyP3+Gib4+Rvbti6EzZ/Icf15eHhwdHeHo6Ih58+ZVm3bOnDlQVVVFXFwcz/nXFVFRURg6dCjatm0LUVFRrFixAt26dcOjR4+gpqZW6TqSkpKQlJT8zZFWTkxMDGJiYj+cj4qKyk+Ipm5q2bIlXFxcoKGhgQ8fPsDHxwfdunVDamoqBAQEUFRUhB49ekBFRQVXr15FRkYGRo4cCSEhIfj5+QEAUlNT0aNHD0yePBmhoaGIjIzE+PHj0aRJEzg4OAAADh48CA8PDwQGBsLa2hrr16+Hg4MDEhMToaSkxMZz//59ZGZmwtbW9pft89evX6tcJiMjw3M+AgICde7aGDRoEP777z/89ddf0NXVRUZGBoqLiyukO378OLy8vH57fL/j/JL6j2qcGgBv96kI8J6LjJfpMFOXQ3cbUwCo0FSvvOyPH+Hj6QY7M120NdTA+MG9kRj/gKdtJsY/wLhBvSAlJQVpaWm0bNkSt2/fRlRUFMaMGYOPHz+Cw+GAw+HAx8cHQEmNwdKlSzFy5EhIS0tj4sSJAIArV66gQ4cOEBMTg7q6Otzc3JCbm8tua+/evbCysoKUlBRUVFQwbNgwvHnzhl1e+oT333//hYWFBcTExNC5c2e8efMGZ86cgaGhIaSlpTFs2DDk5eWx6xUXF8Pf3x/a2toQExODmZkZDh8+zJ2vmiXOXIhBS8dhENG2xpWbsdUel7hHSeg0YCKk9NtD2qADWjoOw+24eERdvY0xHj74mJ0DjpolOGqW8FkTWLJ/h0/CqrsLpPTbQ8W8K4ZNm4837z78P46rtyvEse/Iafiu3YG4+CQ2v+CD4QCArI+fMH72EiiadIa0QQd0HjgRcY+4n2wHbA6CsrIypKSkMG7cOHz58qXKfSp9+vn+/XuMHTsWHA6HfeoZHR2N1q1bQ0REBE2aNIGXlxfX0147Ozu4urpi5syZUFBQYG9UqrJ69Wo0adIEjRs3xrRp01BQUMDm8/z5c7i7u7PXVXXXWnMHB/gHBmLUnDlQaN0azeztEXjgQLXbLnUqKgo9yhScrsfGQlBQEFbGxnj+8iXETUxw7Px5OI4di8atWsG6f3/cKPNkOOzUKRQUFCBw6VIY6epiYPfumDpsGDbt2cOmCTl6FJkfP+LvDRtgY2EBTTU1dGjVCqYGBmwahw4d4OPmBmd7e57iLjVz5kx4eXmhTZs21aY7c+YMzp49i9WrV1dY9v79ewwdOhRqamoQFxeHiYkJDlRz/BiGgaKiItfnx9zcHE2aNGGnr1y5AhEREfYzuHbtWpiYmEBCQgLq6uqYOnUqcnJyeN7P0NBQTJ06Febm5mjevDl27dqF4uLiamuUamruFxERgfbt20NWVhaNGzdGz549kZKSUiHd48eP2QKbsbExoqOjAZR8Vjp16gQAkJOTA4fDwejRoyvdVlVNEXfv3g0NDQ1ISkpi6tSpKCoqwsqVK6GiogIlJSUsX76cK5+yT/dLP6v//PMPOnXqBHFxcZiZmeHaNe4HccHBwdDQ0IC4uDj69u2L9+/fcy2Pi4tDp06dKny/V6e05ktMTAw6Ojpc1wIAvHjxAoMGDYKsrCzk5eXh7OyMZ8+eVZvnxIkT0bFjR2hpacHS0hLLli3Dixcv2PXOnj2L+Ph47Nu3D+bm5ujevTuWLl2KLVu2sAWQwMBAaGtrY82aNTA0NISrqysGDBiAdevWsdtZu3YtJkyYgDFjxsDIyAiBgYEQFxevUBty/PhxODo6QkhIiD1/x44dg56eHkRFReHg4IAXL16w6VNSUuDs7AxlZWVISkqiVatWFWozKvtd1NbWBgBYWFiAw+HA7tv3UfmmesXFxVi5ciV0dXUhIiICDQ0N9vooX2tV+jt56tQpmJqaQlRUFG3atMHDhw/Z/Hj53NvZ2cHNzQ1z5syBvLw8VFRU2O/d0v0BgL59+4LD4bDTERERiI6OxunTp9GlSxdoaWnBxsYG7dq148r/xYsXePToERwdHdl51V1bbdu2xdy5c7nyePv2LYSEhHDpWw1+6TEeOnQoJCQkoKamhi2VPAgre34JqQoVnBqAOb7+mDprPpSbqCLyzmOEnrzA03qeU0bjw7u32LLnEA6cvghDYzNMHNIHHzMza1x33vSJUG6iilu3buHOnTvw8vKCkJAQ2rZti/Xr10NaWhoZGRnIyMjA7Nmz2fVWr14NMzMz3Lt3D97e3khJSYGjoyP69++P+/fv4+DBg7hy5QpcXV3ZdQoKCrB06VLExcXh2LFjePbsWaU3Iz4+Pti8eTOuXr3K/kivX78e+/fvx6lTp3D27Fls2rSJTe/v7489e/YgMDAQjx49gru7O4YPH87eBJXy8tuIgPluSIg6AlNDvWqPi8v0BWjaRAm3Tu/FnTOh8Jo2BkKCgmhrZYb1vrMhLSWJjHtnkXHvLGZPHlmyf4WFWOo5FXHnwnDsrzV49uIVRrsvrpB32Ti6dmyDWZNGoIVBMza/wb27AQAGTpqDN+8+4My+zbhzJhSWJoawHzwZHzI/AgD+Dj8Ln7Xb4efnh9u3b6NJkybYunVrlftU2uRDWloa69evR0ZGBgYPHoyXL1/CyckJrVq1QlxcHLZt24a//voLy5Yt41o/JCQEwsLCiImJQWBgYJXbuXjxIlJSUnDx4kWEhIQgODiYLaD9888/aNq0KZYsWcJeVzVda+uDg2Gir49rf/+N2WPHwnPFCkRevcoun7hgARzGjOGKIf7JE7z98AF21v+vuT0VFQUnW1twOBx2nu/GjZgxejSuHzoEXU1NjJo7ly0w3oyLQ7uWLSFc5se3S7t2SHr2DJkfS87BqYsXYW1mhpnLl0PL1hZWffti5c6dv60m8b///sOECROwd+9eiIuLV1j+5csXtGzZEqdOncLDhw8xceJEjBgxosrmSxwOBx07dkRUVBQAIDMzEwkJCfj8+TPbtCo6OhqtWrVit9eoUSNs3LgRjx49QkhICC5cuIA5c+Z89z7l5eWhoKAA8vLy351Hbm4uPDw8cPv2bURGRqJRo0bo27dvhafinp6emDVrFu7duwcbGxv06tUL79+/h7q6Oo4cOQIASExMREZGBjZs2MDz9lNSUnDmzBlERETgwIED+Ouvv9CjRw+kp6cjOjoaK1aswMKFC3Hjxo1q81mwYAFmz56N2NhY6OvrY+jQoez1eePGDYwbNw6urq6IjY1Fp06dKnxmXVxc0LRp0wrf79Xx9vZG//79ERcXBxcXFwwZMgQJCQkASr7DHRwcICUlhcuXLyMmJgaSkpJwdHRkCzilN/ZVFaZyc3MRFBQEbW1tqKurAwCuXbsGExMTKCsrs+kcHByQnZ2NR48esWm6lGt66+DgwBYmv379ijt37nCladSoEbp06VKhwBkeHg5nZ2d2Oi8vD8uXL8eePXsQExODrKwsDBny/+bTOTk5cHJyQmRkJO7duwdHR0f06tULaWlpXPmW/10s/ZydP38eGRkZ+Oeffyo9JvPmzUNAQAC8vb0RHx+P/fv3cx2Lynh6emLNmjW4desWFBUV0atXL/YBFa+f+5CQEEhISODGjRtYuXIllixZgnPnzgEAbt26BQAICgpCRkYGOx0eHg4rKyusXLkSampq0NfXx+zZs/H58+cKx7i0qXGp6q4tFxcXhIWFgWEYNv3BgwehqqqKDh06sPNWrVrFHmMvLy/MmDGDjbnstsueX0IqxdQBmzdvZjQ1NRkRERGmdevWzI0bN6pMu2PHDqZ9+/aMrKwsIysry9jb21ebvryPHz8yAJiPHz9WWPb582cmPj6e+fz5c4Vl8QbNf+tf3IvMWv15LvZjVJuqc82zatOOcRk3mZ1WbarOeC72Y+JeZDJBR04zklJSzK0nr7nWUdfUZrwD1tW4PQlJKWbp2q2VHuOgoCBGRkamwnxNTU2mT58+XPPGjRvHTJw4kWve5cuXmUaNGlV6HhiGYW7dusUAYD59+sQwDMNcvHiRAcCcP3+eTePv788AYFJSUth5kyZNYhwcHBiGYZgvX74w4uLizNWrVyvEM3ToUK58j+1eyzAv7/L0JyUpwQSv8610WdBaH0ZGWrLGPG6d3leyf0lXGOblXebioR2VxrHYYyJjZqTPNe/y0b8YaSlJ5svT61zzm2k1ZbavWMAwL+8yNi1NmamjBnLtt7W1NWNmZlbp8S4lIyPDBAUFsdPz589nDAwMmOLiYnbeli1bGElJSaaoqIhhGIaxtbVlLCwsqs2XYRhm1KhRjKamJlNYWMjOGzhwIDN48GB2WlNTk1m3bh3XelVdaxqqqkzXdu2YvAcP2L8Bjo5Mt/bt2enZ48Yxw3r14krj4+bG9O3alWuerqYmc2TLFibvwQMmISKCAcBs9fVll985dowBwNw7fpzJe/CAsbexYcYOGMCVR2mau9/S6GtpMSLCwszIvn2ZK2FhzJ5Vqxh5GRlmwdSpXOuV/gFgwtavZ6d5UXr9ZmZmcs0vLi5mHB0dmaVLlzIMwzCpqakl8d+7V21+PXr0YGbNmlXl8o0bNzItWrRgGIZhjh07xlhbWzPOzs7Mtm3bGIZhmC5dujDz58+vcv1Dhw4xjRs3ZqfLn9vFixdXe41OmTKF0dHRqfJ7o7I8Ro0axTg7O1eZ/u3btwwA5sG3Y156rAICAtg0BQUFTNOmTZkVK1YwDFP1cS+vsv0TFxdnsrOz2XkODg6MlpYW+3liGIYxMDBg/P392WkAzNGjR7ni27VrF7v80aNHDAAmISGBYRiGGTp0KOPk5MQVy+DBg7likZKSYoKDg6uNvywAzOTJk7nmWVtbM1OmTGEYhmH27t1b4bsiPz+fERMTY/7991+GYRjmxo0bjIGBAZOens6Vz5YtWxgJCQkGAGNgYMA8efKEXTZhwgSmW7duXOlzc3MZAMzp06cZhmEYPT09xs/PjyvNqVOnGABMXl4e8/LlSwZAhd8CT09PpnXr1ux0eno6IywszJ7XoKAgBgBz/fp1Nk1CQgIDoNp7khYtWjCbNm1ipyv7XazqM1n2es3OzmZERESYnTt3Vrqd8nmUXpdhYWFsmvfv3zNiYmLMwYMHq4y3/Ofe1taWad++PVeaVq1aMXPnzmWny16TpRwcHBgRERGmR48ezI0bN5hTp04xmpqazOjRo7nSde3aldm8eTNXXtVdW2/evGEEBQWZS5cuscttbGy44tHU1GQcHR258hg8eDDTvXt3drr8+W0oqruvJf9XXdmgPL7XOJW2LV68eDHu3r0LMzMzODg4cDXFKqu0XfvFixdx7do1qKuro1u3bnj58uVvjrx+S4p/iLzcXHQ0bYY2Bk3Zv5cvnuPF89Qa1x8xYSp857ihS5cuCAgIqLQ5S2WsrKy4puPi4hAcHMz2PZCUlISDgwOKi4uRmloSx507d9CrVy9oaGhASkqKbX9c/qmdqakp+39lZWWIi4tDR0eHa17pdfXkyRPk5eWha9euXNves2dPhX2xMjXiad8AwGOiC8Z7LkWXwZMRsDkIKc9e1LjOnfvx6DVqBjRaOUFKvz1s+48v2b+Xr2sdR1x8EnJy89DYuBMk9dqxf6lpr5DyPB0AkPAkFdYWJlzr2djY8LqLrISEBNjY2HDVxLRr1w45OTlIT09n57Vs2ZKn/Fq0aAEBAQF2ukmTJlV+D/DC2syswnRi6v+v7SUzZ2LXt34QpU5evIge35paAcDjp0+R8eYNOpWpgQIAY3199v8qCgoAgLcfPoBXxQwDRXl5bFm8GJYtWmCAoyPmTJiAXX//zXMefn5+XNdu+c9DVTZt2oRPnz5V2/+pqKgIS5cuhYmJCeTl5SEpKYl///232m3Y2toiPj4eb9++RXR0NOzs7GBnZ4eoqCgUFBTg6tWrbJMjoORpur29PdTU1CAlJYURI0bg/fv3XM1peRUQEICwsDAcPXoUoqKitV6/VHJyMoYOHQodHR1IS0uzzYzK73fZz4ugoCCsrKzYJ+A/QktLC1JSUuy0srIyjIyM0KhRI655NX0uyn4XljaXLF0nISEB1uWu5/Kffw8PD4wfP75W3+/l87CxsWGPSVxcHJ48eQIpKSn2epWXl8eXL1/YvFu3bo3Hjx9X6J/m4uKCe/fuITo6Gvr6+hg0aFC1TYt/lfDwcLYZZylBQUG0atWKnW7evDlkZWXZ/c7JycHs2bNhaGgIWVlZSEpKIiEhocL1VP53kRcJCQnIz8+HfS2b8pY9T/Ly8jAwMGDj5fVzX/b6Anj7ri4uLgaHw0FoaChat24NJycnrF27FiEhIWytU3Z2NqKjo9G7d+8qYy6dLo1ZUVER3bp1Q2hoKICSPm3Xrl2Di4sLz3kAlZ9fQirD98EhyrYtBkraI586dQq7d++utHNg6Yej1K5du3DkyBFERkZi5MiRvyXmhiAvLxcKSir46+8TFZZJ8dABdYqHF7r3GYCUO5dx5swZLF68GGFhYejbt2+160lISHBN5+TkYNKkSXBzc6uQVkNDA7m5uXBwcICDgwNCQ0OhqKiItLQ0ODg4VOhEW7YpCYfDqdC0hMPhsE1uSvtSnDp1qsIPtYiICHfM4rx34PaZNRnD+nTHqcjLOHPxKhavCUTYVn/07d650vS5eZ/hMMwVDnY2CN28DIqN5ZD28jUchk3D168FtY4jJ/czmigpIOrwjgrLZGWkKlnj1yt/zqtS3fn6HTLevkVcQgIcO/5/5MNTFy+is40NRMtdE0JlBggpLTgWf2sqoqyggDfl+oyUTis3bgygpLAlJCjIVVA00NHBf+/e4WtBAVczv6pMnjwZgwYNYqdVVVV52s8LFy7g2rVrFa5zKysruLi4ICQkBKtWrcKGDRuwfv16th/SzJkzq+24XnqzFR0djejoaCxfvhwqKipYsWIFbt26hYKCArRt2xZASf+Lnj17YsqUKVi+fDnk5eVx5coVjBs3Dl+/fq20+WBVVq9ejYCAAJw/f77CDV1t9erVC5qamti5cydUVVVRXFwMY2Pjavf7Z6rsM/A9n4vy34UAavVZ8vHxwbBhw3Dq1Klafb9XJScnBy1btqzw+w2U3PhWR0ZGBjIyMtDT00ObNm0gJyeHo0ePYujQoVBRUanQjOy///4D8P9BM1RUVNh5ZdNIS0tDTEwMAgICEBAQqDRN2cEVwsPDK9zQ12T27Nk4d+4cVq9eDV1dXYiJiWHAgAEVridevyPL+hkDi5TH6+f+e67JJk2aQE1NjWuAC0NDQzAMg/T0dOjp6eHMmTMwMjJim2LyysXFBW5ubti0aRP2798PExMTmJiY1LxiGd9zfsmfia81TrVpW1yVn9Gu/U9kaGyG92//g4CgIDS0dbj+5OQb85SHlo4u3N3dcfbsWfTr1w9BQUEAAGFhYZ77alhaWiI+Ph66uroV/oSFhfH48WO8f/8eAQEB6NChA5o3b/5DtRCljIyMICIigrS0tArbre2Xdnn6zTThPnE4zh7Yin7dOyPo26ANwsJCKCri/nF5/CQV7zOzEDBvOjpYW6K5rjbXwBDVERYSQlG5HytLk+Z4/fY9BAUFoautwfWnIF8yyqKhrjZu3OMeBOT69eu13k9DQ0Ncu3aNq215TEwMpKSkfmjkvapUdl1Vd63dvH+/wrTBt07XlTkdFYU25uaQL/PDfvLiRfQsUwPFi9ZmZoi5c4ftNwAAkdeuQV9LC3Lf8m5jYYGUFy+4bjaePH8OFUVFngpNQMnT4rLXLa+jPW7cuBFxcXGIjY1FbGwsTp8+DaCk9r+0Y3lMTAycnZ0xfPhwmJmZQUdHp8ahszkcDjp06IDjx4/j0aNHaN++PUxNTZGfn4/t27fDysqKvUG8c+cOiouLsWbNGrRp0wb6+vp49eoVT/GXtXLlSixduhQRERHf9dS+rPfv3yMxMRELFy6Evb09DA0NkVlFf8+yn5fCwkLcuXMHhoYlI6+WjhrJj5EveWFoaFihj1Rln399ff1Kv9+rUj6P69evs8fE0tISycnJUFJSqvB9W5uR4hiGAcMwyM/PB1BSa/DgwQOu34Rz585BWloaRkZGbJryA4acO3eOrYEQFhZGy5YtudKUDjJSmiYnJwcXL16s0P+lsLCQa9CMxMREZGVlsfsdExOD0aNHo2/fvjAxMYGKikqNA2KUxgRUfw3p6elBTEys1sPrlz1PmZmZSEpK4oq3tp/7yggJCVWIvV27dnj16hXXADBJSUlo1KgR+3tx/PjxSvsYVXdtAYCzszO+fPmCiIgI7N+/v0JtU015VHV+CakMXwtO7969Q1FRUYXOjMrKynj9+nUVa3GbO3cuVFVVK3T+LJWfn4/s7GyuPwK06WAHU8tWcB/vgqvRF/DyRRpib9/AphVL8SjuXrXrfvn8GX4LPXHr2hU8f/4cMTExuHXrFvslpKWlhZycHERGRuLdu3fVNr2ZO3curl69ynZUTk5OxvHjx9nBITQ0NCAsLIxNmzbh6dOnCA8Px9KlS394/6WkpDB79my4u7sjJCQEKSkpuHv3LjZt2oSQkJDvyvPz5y9wXRCAqKu38Tz9FWJuxeJW3CMY6pXcrGs1VUVObh4iL9/Auw+ZyPv8GRpqTSAsLIRNQWF4+jwd4WejsXT9Lp62p6WuitS0l4h9mIh3HzKRn/8VXTpYw6alCfqM9cDZ6Gt49uIVrt6Kw4KAzbgdFw8AmDFuKHYfDEdQUBCSkpKwePFitiN1bUydOhUvXrzA9OnT8fjxYxw/fhyLFy+Gh4cHV9Oin0VLSwuXLl3Cy5cv8e7dO3ZeVdfa9dhYrN29G8nPniHwwAH8c/YsppV5N8ii9esxfv7/33NWfjS9N+/f4+6jR+hey6FpBzs5QUhICFMWL0b8kyc4HBGBraGhmF6mRnzi4MHI/PgRswMCkPzsGc5cuoRVO3diUtmO5Xl5iHv8GHHfBld4/vIl4h4/xouMjGq3//r1a8TGxuLJkycAgAcPHiA2NhYfvjUl1NDQgLGxMfun/63ZYbNmzdgbGD09PZw7dw5Xr15FQkICJk2aVOGJ/ObNmys0E7Kzs8OBAwdgbm4OSUlJNGrUCB07dkRoaCjXEL+6urooKChgP9d79+6tduCQyqxYsQLe3t7YvXs3tLS08Pr1a7x+/ZrrxmzevHk8t0SQk5ND48aNsWPHDjx58gQXLlyAh4dHpWm3bNmCo0eP4vHjx5g2bRoyMzMxduxYAICmpiY4HA5OnjyJt2/fsvFUdrz4wc3NDREREVi9ejWSk5OxefNmREREsMs/f/4MV1dXREVFVfr9/vLlSzRv3rxCTc+hQ4ewe/du9jvl5s2b7Pe4i4sLFBQU4OzsjMuXLyM1NRVRUVFwc3Njm/XevHkTzZs3Z5vdP336FP7+/rhz5w7S0tJw9epVDBw4EGJiYnBycgIAdOvWDUZGRhgxYgTi4uLw77//YuHChZg2bRpbozp58mQ8ffoUc+bMwePHj7F161b8/fffcHd3Z2P38PDAzp07ERISgoSEBEyZMgW5ublsS5iIiAjo6+uzTTdLCQkJYfr06bhx4wbu3LmD0aNHo02bNmjdujWAks/RP//8g9jYWMTFxWHYsGE81fwpKSlBTEwMERER+O+///Dx26AyZYmKimLu3LmYM2cO28T8+vXr+Ouvv6rNe8mSJYiMjMTDhw8xevRoKCgosCP18fK554WWlhYiIyPx+vVr9uHDsGHD0LhxY4wZMwbx8fG4dOkSPD09MXbsWIiJiaGwsBBnzpyptNanumsLKKmx69OnD7y9vZGQkIChQ4dWyCMmJgYrV65EUlIStmzZgkOHDmHGjBkAqj6/hFSG732cfgQv7dr9/f3Zqn4ZGZkfrk1oKDgcDrbs+RuW1m2xaJYrettaYe60cXj18gUa19B0QkBAAB8zP2DhzMlsm/Pu3bvD19cXQMnwoJMnT8bgwYOhqKiIlStXVpmXqakpoqOjkZSUhA4dOsDCwgKLFi1imx0pKioiODgYhw4dgpGREQICAiodPvl7LF26FN7e3vD394ehoSEcHR1x6tQpdijY2hIQEMD7zI8YOWMR9Dv0xaDJc9G9Uzv4zpoMAGjbygyTRwzA4CnzoGhij5VbQ6DYWA7B63xx6OR5GHUagIDNQVjtPZOn7fV3soejXVt0GjQRiib2OHAsAhwOB6f3bkLHNpYY4+ED/Q59MGTqPDx/mQFlhZJa2cHODvCeMR5z5sxBy5Yt8fz5c0yZMqXW+6umpobTp0/j5s2bMDMzw+TJkzFu3DgsXLiw1nnxYsmSJXj27BmaNWvGNu+p7lpzGzkSdx89gs2gQVixYwdWeHqia5mhb1+/fcsWQnLz8hB14wZX/6bT0dGwMjGBQi3fhyYjJYUT27fj2cuXaDd4MLxWrcK8SZPYdzgBQFMVFYQHBuLOo0do3b8/Zvv7Y+rw4Zg9bhyb5u6jR7AZOBA239abu2oVbAYOxNLNm6vdfmBgICwsLDBhwgQAQMeOHWFhYYHw8HCe92HhwoWwtLSEg4MD7OzsoKKiwjUMMlDy4Kt83xdbW1sUFRVx9WWys7OrMM/MzAxr167FihUrYGxsjNDQUPj7+/McHwBs27YNX79+xYABA9CkSRP2r+z3Q0ZGBs99vxo1aoSwsDDcuXMHxsbGcHd3x6pVqypNGxAQgICAAJiZmeHKlSsIDw+Hwre+bmpqavD19YWXlxeUlZXZG7zKjhc/tGnTBjt37sSGDRtgZmaGs2fPcn1mBQQE8P79e4wcObLS7/eCggIkJiZWeCDm6+uLsLAwmJqaYs+ePThw4ABb6yMuLo5Lly5BQ0MD/fr1g6GhIfsahNLR0/Ly8pCYmMjW1IqKiuLy5ctwcnKCrq4uBg8eDCkpKVy9epV9t5KAgABOnjwJAQEB2NjYYPjw4Rg5ciSWLFnCxqWtrY1Tp07h3LlzMDMzw5o1a7Br1y6uVyMMHjwYq1evxqJFi2Bubo7Y2FhERESwD3WPHz9e6Q29uLg45s6di2HDhqFdu3aQlJTEwYMH2eVr166FnJwc2rZti169esHBwQGWlpY1niNBQUFs3LgR27dvh6qqapU1Id7e3pg1axYWLVoEQ0NDDB48uMYWGQEBAZgxYwZatmyJ169f48SJE2wNFy+fe16sWbMG586dg7q6OiwsLACUvEPt3LlzyMrKYpsF9+rVCxu/vVg8OjoakpKSlR6f6q6tUi4uLoiLi0OHDh2goaFRIY9Zs2bh9u3bsLCwwLJly7B27Vr2Gqjq/BJSGQ5Ttp3Nb1balv3w4cNcH85Ro0YhKysLx48fr3Ld1atXY9myZTh//ny1TTTy8/PZan2gpPOhuro6Pn78yDXcJVAyFGdqaiq0tbV/qINxeffTs35aXnWNaVNZfofwa72qvvatXlO14HcEv4ymmhpchw+H64gRPKU/dv48lmzahLtlvnMGTJ+OthYW8PhWk1CXiBkb8zsEQv4IhYWFUFZWxpkzZ9iaJKDkXVgzZ85EVlYW/4KrhaioKHTq1AmZmZl1cgAENzc3FBYWVvtqjO+lpaWFmTNnYmYlLxKv6vw2FL/qvrahyc7OhoyMTKVlg/L4WuPES9viytSmXbuIiAikpaW5/gghpCxJcXEsLdN0BwDaWlhg0LcmQYSQP9OHDx/g7u7ONXoe+fmMjY2/q+XDj6LzS2qL76PqeXh4YNSoUbCyskLr1q2xfv16rrbFI0eOhJqaGtuMY8WKFVi0aBH279/PtmsHwA5xSn6OvvY2yEivfCht74C16NF3UKXLGroWnQbgeXrlfUy2r1gAl350o10fdfk22ltZdbGmiRDyeykpKf2y5sfk/yZOnMiX7dL5JbXF94LT4MGD8fbtWyxatAivX7+Gubk5V9vitLQ0ro7mZdu1l7V48WL4+Pj8ztAbtC0hB1FYUFjpspr6QDVkp/duREEVx0VZkbfRCMmv9/jff/kdAiGkARs9ejRGjx7N7zB4ZmdnBz72zOArXkYyJIRXfC84AYCrqyvXCCllRUVFcU3TB+D3UG1asXMlATSb8vauHEIIIYQQ0rDU61H1CCGEEEIIIeR3oIITIYQQQgghhNSACk6EEEIIIYQQUgMqOBFCCCGEEEJIDajgRAghhBBCCCE1oIITIYQQQgghhNSACk4NxLiBPbHSZx6/w/glRo8ejT59+lSbRktLC+vXr//lsdgNmICZi1b90m1oWffA+p2hPy2/3xEzIYQQQkhDVyfe41QfbJl84bdur8NCy1qlX7tjLwSF/tzTeevWLUhISPA7DEIIIYQQ0kD9uXfaDYyMnBy/Q6gVhmFQVFQEQcGfcwkqKir+lHwIIYQQQgipDDXVayDKNtU7GLILvTq0RCtdFXSy0MesSaPYdF/z8xGwaC7szPXQSlcFo/o54mHsXXb5rWtXYKYuh5ioSAxy7IjWuk0wfnBvvH/3FlcunkOfTtZoa6gBL9fx+Pw5j10vPz8fbm5uUFJSgqioKNq3b49bt26xy6OiosDhcHDmzBm0bNkSIiIiuHLlCnx8fGBubo7t27dDXV0d4uLiGDRoED5+/FhhH1evXo0mTZqgcePGmDZtGgoKCthl5ZvqZWVlYdKkSVBWVoaoqCiMjY1x8uRJno5lTEwM7OzsIC4uDjkjWzgMm4rMrGx2eTHDYM6y9ZBvYQcV867wWRPItX7Wx08YP3sJFE06Q9qgAzoPnIi4R0lcaU6cjUYrp+EQ1WkDBePO6DtuVpXx7Np/FLKGHRF5+UaNsefmfcZIN29I6rVDE4tuWBO4t0KazKxsjHTzhpycHMTFxdG9e3ckJyezy4ODgyErK4t///0XhoaGkJSUhKOjIzIyMrjj2rULhoaGEBUVRfPmzbF169Ya4yOEEEIIqa+o4NTAPIq7hxWLvTB11jwcj7qJrXsPw9K6Lbt8nd9inD99AsvWbUXY6ShoaOpgyvD++JiZyZVP4LoVmLd0JUKO/Yv/Xr3EnCljsG9XIPw37cTm4DBcu3QRB4J2sOnnzJmDI0eOICQkBHfv3oWuri4cHBzw4cMHrny9vLwQEBCAhIQEmJqaAgCePHmCv//+GydOnEBERATu3buHqVOncq138eJFpKSk4OLFiwgJCUFwcDCCg4MrPQbFxcXo3r07YmJisG/fPsTHxyMgIAACAgI1Hr/Y2FjY29vDyMgI165dw5Wju9Gra0cUFRexaUIOnYSEuBhunNiDlQtmYMm6nTh36Tq7fOCkOXjz7gPO7NuMO2dCYWliCPvBk/Ehs6QweOr8ZfQdPxtOndvh3r/7EXkwEK3NW1Qaz8qtwfDy24Sz+7fCvoN1jfF7Ll2P6Ot3cHz3WpzdvwVR127j7oPHXGlGuy/G7fvxCA8Px7Vr18AwDJycnLgKonl5eVi9ejX27t2LS5cuIS0tDbNnz2aXh4aGYtGiRVi+fDkSEhLg5+cHb29vhISE1BgjIYQQQkh9RE31GpiMV+kQExdHxy4OkJCUgmpTDRgalxRQ8vJy8ffe3Vi6Zgvad+oKAFi0cgOu2UTh6MG9GD3Zjc3H1XMBLFq1AQD0GTIcGwOW4NSVe2iqqQUA6NKjN25dvQIAyM3NxbZt2xAcHIzu3bsDAHbu3Ilz587hr7/+gqenJ5vvkiVL0LVrV66Yv3z5gj179kBNTQ0AsGnTJvTo0QNr1qyBiooKAEBOTg6bN2+GgIAAmjdvjh49eiAyMhITJkyocAzOnz+PmzdvIiEhAfr6+gAAHR0dno7fypUrYWVl9f/ak1fFaGHQjCuNqaEuFntMAgDo6Whgc/BBRF65ia4d2+DKzXu4GfsIb+LOQ0REGACwepE7jv17EYdPncfE4f2xfONfGOLcDb6zp7B5mrXQrxDL3OUbsPfIKUQf2Vkhhsrk5Obhr7Bj2LdxGVvIClm/BE2turNpkp+mIfxsNGKOBaFthw4ASgpB6urqOHbsGAYOHAgAKCgoQGBgIJo1K9muq6srlixZwuazePFirFmzBv369QMAaGtrIz4+Htu3b8eoUf+v4SSEEEIIaSio4NTA2HSwQxM1dfRoZ4G2dvZoZ2ePzo49ISYmjvTnqSgsKIB5q//XXAgJCcHY3BJPk7mbkukZ/r8GpLGCEkTFxNlCU+m80iZ+KSkpKCgoQLt27bjybd26NRISErjytbKyqhCzhoYGW2gCABsbGxQXFyMxMZEtOLVo0YKrxqhJkyZ48OBBpccgNjYWTZs2ZQtNtREbG8sWHqpiaqjHNd1ESQFv3pXUrMXFJyEnNw+NjTtxpfn8JR8pz9NLtvEoCRNc+la7jTXb9yH382fcPr0POppNeYo95Vk6vn4tgLWlMTtPXk4GBs002emEJ6kQFBTkStO4cWMYGBhwnStxcXG20ASUHO83b94AKCkop6SkYNy4cVwF18LCQsjIyPAUKyGEEEJIfUMFpwZGQlIKYWeicfvaFVy7dAFbV/sjcO0KhJ6s3aiAgoJC7P85HA6Eyo3Yx+FwwBQX1z6+7xz5TkhIiGuaw+GguIrti4mJfdc2eF1XSLDisSguZgAAObmf0URJAVGHd1RYT1ZGqmQboiI1bqODtQVORV7B3yfOwct1DC+h/1SVHW+G+baPOTkASmoVra25mw/y0hySEEIIIaQ+oj5ODZCgoCDadLCD+4IlOHTuCl6lp+Hm1UtoqqkNIWFhxN76/yADBQUFeBR3D830DL57e82aNYOwsDBiYmK48r116xaMjIxqXD8tLQ2vXr1ip69fv45GjRrBwOD7YjI1NUV6ejqSkpJqTlzJupGRkd+1XQCwNGmO12/fQ1BQELraGlx/CvIlIx+aGuoh8srNavNpbd4CZ/Zugt+m3VgduIenbTfTagohIUHcuPuQnZeZlY2kp8/ZaUNdbRQWFnKlef/+PRITE3k6VwCgrKwMVVVVPH36FLq6ulx/2traPOVBCCGEEFLfUI1TAxN9PgLpac/R0rotpGVkcOXCORQXF0NLRxfi4hIYNGIs1i5fDBlZOaioNUXwto348jkPfYeM+O5tSkhIYMqUKfD09IS8vDw0NDSwcuVK5OXlYdy4cTWuLyoqilGjRmH16tXIzs6Gm5sbBg0axDbTqy1bW1t07NgR/fv3x9q1a6Grq4vHjx+Dw+HA0dGx2nXnzZsHExMTTJ06FZMnT4ZwViouxtzGwF5d2IJPdbp0sIZNSxP0GeuBlQtnQF9HE69ev8WpyMvo270zrMyMsNhjIuwHT0YzzaYY4uyAwsIinL4Qg7nTRnPl1baVGU7v3Yjuw6dDUEAAMye4VLttSQlxjBvSB57L1qOxnAyUFOSxYMUWNGr0/+cjejoacHaww4Q5S7G9sS6kpKTg5eUFNTU1ODs717h/pXx9feHm5gYZGRk4OjoiPz8ft2/fRmZmJjw8PHjOhxBCCCGkvqCCE4+mBXb+7nXvp2f9vEBqICUtgwtnTiBwbQC+5udDQ1sHAZt3QdfAEAAww2sxiouLsWDmZOTm5sDI1Bzb9h2BtKzsD203ICAAxcXFGDFiBD59+gQrKyv8+++/kOPh/VK6urro168fnJyc8OHDB/Ts2fOHh7Y+cuQIZs+ejaFDhyI3Nxe6uroICAiocT19fX2cPXsW8+fPR+vWrSEmKgxrC2MM7VN9gasUh8PB6b2bsGDFFozx8MHb95lQUVRAxzYWUFaQBwDYtbXCoe0rsHT9LgRsCYa0pAQ6tqn8hcftW1vg1J4NcBrhBgEBAUwfO6Ta7a/ynomc3Dz0Gj0TUpISmDVpOD5+yuFKE7TWBzMWrULPnj3x9etXdOzYEadPn67QPK8648ePh7i4OFatWgVPT09ISEjAxMQEM2fO5DkPQgghhJD6hMOUdlz4Q2RnZ0NGRgYfP36EtLQ017IvX74gNTUV2traEBUV/Wnb/J0Fp9/NtKnsD63v4+ODY8eOITY29qfE89O9usfvCH4dVQt+R/DLfH74sOZE9ZiYsXHNiQghhPzRftV9bUNTXdmgPOrjRAghhBBCCCE1oKZ65I/SvXt3XL58udJl8+fPx/z5839zRLxLe5kBI7sBVS6PjzoMDbUmvzEiQgghhJA/BxWcCF/5+PjAx8fnt21v165d+Pz5c6XL5OXlf1sc30NVWRGxZw9Uu5wQQgghhPwaVHAif5SyL9qtb0qHOCeEEEIIIb8f9XEihBBCCCGEkBpQwYkQQgghhBBCakAFJ0IIIYQQQgipARWcCCGEEEIIIaQGVHAihBBCCCGEkBpQwYnw1ejRo9GnTx9+hwEAePbsGTgcDmJjY/kdCiGEEEIIqWNoOHIerRnc87dur+uafb91e/yyYcMGMAzD7zAAAOrq6sjIyICCggK/QyGEEEIIIXUMFZzIdyv4+vWH85CRkfkJkfwcAgICUFFR4XcYhBBCCCGkDqKmeg1EXl4uFsycjDYGTWHfsjlCtm/GuIE9sdJnHgDATF0OFyJOca3TvoUmjv+9n51+/SodnlPGoH0LTXQw1saMscPw8kUau9zbfSpmjnPBzo2r0aWlIXrbtcKSJUtgbGxcIR5zc3N4e3vXGHf5pnqHDx+GiYkJxMTE0LhxY3Tp0gW5ubk15mNnZ4eZM2dyzevTpw9Gjx7NTmtpacHPzw9jx46FlJQUNDQ0sGPHDnZ5ZU31TkdegX77PhBrZoNOAyYi+GA4OGqWyPr4CQDgsyYQ5l2HcG13/c5QaFn34Jq3a/9RGNr2g6hOGzTv2A9bg/+ucZ8IIYQQQkjdQQWnBmLdskW4cz0GG/4KReC+I7h9/QoSHt7nef2CggJMGT4A4hKSCDp8GiFHIyAuIYGpIwZw1SzdiLmEZ0+fIHD/P9gUFIaxY8ciISEBt27dYtPcu3cP9+/fx5gxY2q1DxkZGRg6dCibZ1RUFPr16/dTm/KtWbMGVlZWuHfvHqZOnYopU6YgMTGx0rQvXrxAvwmz0atrR8T+ewDjh/WBl/+mWm8z9J/TWLR6G5bPnYaEqCPw85oG71XbEPL3iR/dHUIIIYQQ8ptQU70GIC83B0cP7oPfhu2wbm8LAFi2dhu6tW7Bcx7/nvgHxcXF8Fm1ERwOBwCwZM0WtG+hhVvXrqCtbWcAgJi4OHxWboSQsDAAoGlTWTg4OCAoKAitWrUCAAQFBcHW1hY6Ojq12o+MjAwUFhaiX79+0NTUBACYmJjUKo+aODk5YerUqQCAuXPnYt26dbh48SIMDAwqpN22bRuaaTbFmsUeAAADXS08ePwEK7YE12qbi9cEYs0iD/RzsgcAaGuoIT4pFdv3HcGoQb1+bIcIIYQQQshvQQWnBuDF81QUfP0KE4uW7DwZOTloNtPlOY+k+Id48ewpbJqrc83Pz/+C9Oep7LRecyO20FRqwoQJGDt2LNauXYtGjRph//79WLduXa33w8zMDPb29jAxMYGDgwO6deuGAQMGQE5OrtZ5VcXU1JT9P4fDgYqKCt68eVNp2oSEBFhbcDdDtGlpWmnaquTmfUbKs3SMm7UEEzyXsvMLi4ogIyVZq7wIIYQQQgj/UMHpD8HhcCo0eSsoKGT/n5ebC0MTc/hv3FF+Vcg1bsz+X0xMvMLyXr16QUREBEePHoWwsDAKCgowYMCAWscoICCAc+fO4erVqzh79iw2bdqEBQsW4MaNG9DW1q523UaNGlWyfwUV0gkJCXFNczgcFBcX1zrWardb+P/jmpObBwDYuWphhUKYgIDAd2+XEEIIIYT8XtTHqQFQ19SGoJAQHty7w87LzsrC86cp7LRcYwW8e/OanX6emoIvn/PYaUMTM6SlpkBeQQEa2jpcf1LS1Y98JygoiFGjRiEoKAhBQUEYMmQIxMTEvmtfOBwO2rVrB19fX9y7dw/CwsI4evRojespKioiIyODnS4qKsLDhw+/K4ZShoaGuBn7iGve9bsPuLcrL4fXb99zFZ5iHyWx/1dWbAxVFUU8ff4SutoaXH/aGmo/FB8hhBBCCPl9qMapARCXkETfwcOxbvkiyMjJQ76xAjavXIZGjf5fLm7dtgPCQnbBtGVrFBcVYb2/DwTL1L449R2I4MBNmDHOBdNmzYNSEzVkvHyByDMnMGaKG5SbVH+TP378eBgaGgIAYmJivms/bty4gcjISHTr1g1KSkq4ceMG3r59y+Zbnc6dO8PDwwOnTp1Cs2bNsHbtWmRlZX1XHKUmT56MNWtWw3PpOowf2hd3HiQguNyADnZtW+Ltgkys3BqCAT3sERF1FWcuxkBaUoJN4ztrMty8V0FGWhKOdm2R//Urbt+PR2bWJ3hMGv5DMRJCCCGEkN+DCk48mnXw5Hevez896+cFUgWPhUuQl5cLtzFDISEpiZETpyHnUza7fJb3Miya5Yox/Z2gqKyCub7+SHgQyy4XExNH0OFTWO/vA4+JI5GbmwMl5Sawbm8LCUmpGrevp6eHtm3b4sOHD7C2tv6ufZCWlsalS5ewfv16ZGdnQ1NTE2vWrEH37t1rXHfs2LGIi4vDyJEjISgoCHd3d3Tq1Om74iiloaGBIztWwd1nDTYFHURr8xbw85qGsR6+bBpDPR1s9ZsHv027sXT9TvR3ssfsSSOwI/QfNs34YX0hLiaKVdv2wHPZekiIi8GkuS5mjh/2Q/ERQgghhJDfh8P8zLGe64Hs7GzIyMjg48ePkJaW5lr25csXpKamQltbG6Kioj9tm7+j4FSZcQN7wqCFCeb4+P+ybZg2lQUAMAwDPT09TJ06FR4eHr9se7/dq3tck1FXb6PTwInIjI+GrEzNBco6TdWC3xH8Mp9/sJlmXSdWybvTCCGEkLJ+1X1tQ1Nd2aA8qnEiP+zt27cICwvD69eva/3uJkIIIYQQQuoDKjiRH6akpAQFBQXs2LGjwtDhkpJVD7l95swZdOjQgadt/Kx8CCGEEEII+R5UcGrA/jr0/f2yaqO61p6xsbFVLlNT431UuZ+Vz4+ya2sF5uXd37Y9QgghhBBSN1DBifxSurq8v4T3d+RDCCGEEELI96D3OBFCCCGEEEJIDajgRAghhBBCCCE1oIITIYQQQgghhNSACk6EEEIIIYQQUgMqOBFCCCGEEEJIDajgRMg3wcHBkJWV/S3bshswATMXreI5fdTV2+CoWSLr46dfGNXPw+FwcOzYMX6HgeYODti8dy+/wyCEEEJIA0DDkfMo3evyd68r/x3rfHA1+e7tleXtPhWfsj9i/V+hPyU/UjtRV2+j08CJyIyPhqyMFDv/n52rISRUfz5+UVFR6NSpEzIzM3kqXGZkZFR4GTIhhBBCSH1Wf+7cyC9VUFAAISEhfofxw4qKisDhcNCoUd2uTJWXk+F3CABKXl5cVFQEQcGf81Xw9etXCAsLQ0VF5afkRwghhBBSV9Ttu0vCs3OnjqN/l7ZordsEHU10MHFoH6xd5o3wwwdw8expmKnLwUxdDreuXcHLF2kwU5dDRPg/GDugB1rpquD00UMAgH8O7EGfTtZopasCZ7vWOBiyi2s76/wWo1dHK1jrqcKpnTm8vb1RUFDALvfx8YG5uTl2794NDQ0NSEpKYurUqSgqKsLKlSuhoqICJSUlLF++nOd9y8rKwqRJk6CsrAxRUVEYGxvj5MmTAP7fvC48PBxGRkYQERFBWloa8vPzMXv2bKipqUFCQgLW1taIioriyjc4OBgaGhoQFxdH37598f79+wrbPv5vFCwdhkFUpw10bHrBd+12FBYWsss5apbYtf8o+o6bBfFmbaHXzhnhZ6MBAM9evEKngRMBAHJGtuCoWWL0zMUAKjbV23v4JKy6u0BKvz1UzLti2LT5ePPuQ5XH5Hn6K/QaNQNyRraQ0G2LFp0G4HTklRqPZWmTvzMXYtCyZUuIiIjgypUrKC4uhr+/P7S1tSEmJgYzMzMcPny4ZD+ePUOnTp1K9kNODhwOB6NHjy7ZDzs7uLq6YubMmVBQUICDg0PJcSnXVO/FixcYNGgQZGVlIS8vD2dnZzx79gwAcPbsWYiKiiIrK4sr1hkzZqBz587s9JUrV9ChQweIiYlBXV0dbm5uyM3NZZe/efMGvXr1gpiYGAwdHRH27RohhBBCCPkZqMapAXj732t4uY7HzPm+6OzYE3k5n3D35jX0GjAEGS9fIjcnG0vWbAEAyMjK4c1/rwEAGwJ8Mct7GZq3MIWIiAhOHf0bW1f7w2vZSjRvYYrHj+5jyZwZEBOXQO+BQwEAEhJSWLp2CxSVmyD58SP4zXOHlJQU5syZw8aTkpKCM2fOICIiAikpKRgwYACePn0KfX19REdH4+rVqxg7diy6dOkCa2vravetuLgY3bt3x6dPn7Bv3z40a9YM8fHxEBAQYNPk5eVhxYoV2LVrFxo3bgwlJSW4uroiPj4eYWFhUFVVxdGjR+Ho6IgHDx5AT08PN27cwLhx4+Dv748+ffogIiICixcv5tr25cuXMXLGImxc4okO1hZIeZ6OiXOWAQAWe0xi0/mu3YGVC2dg1cIZ2BR0EC6uC/D8ximoqyrjyM5V6D/BE4mXjkJaSgJioiKV7mdBYSGWek6FQTNNvHn3AR6+azHafTFO791Uafpp8wPwtaAQl47sgoS4GOKTnkJSQqzaY1mWl99GrN6wBTo6OpCTk4O/vz/27duHwMBA6Onp4dKlSxg+fDgUFRXRvn17HDlyBP3790diYiKkpaUhJvb/bYWEhGDKlCmIiYmpfN8KCuDg4AAbGxtcvnwZgoKCWLZsGRwdHXH//n3Y29tDVlYWR44cwbhx4wCU1BwePHiQLWCnpKTA0dERy5Ytw+7du/H27Vu4urrC1dUVQUFBAIDRo0fj1atXuHjxIoqeP8fsgAC8/VB14ZMQQgghpDao4NQAvHvzHwoLC2HfvSdUm2oAAPQMWwAAREVFUfA1HwpKyhXWGz5uCrp078VOb1sTgFneS9l5TTU08TQpEYdDg9iC08QZs9n0auoa+Pr+JcLCwrgKTsXFxdi9ezekpKRgZGSETp06ITExEadPn0ajRo1gYGCAFStW4OLFizUWnM6fP4+bN28iISEB+vr6AAAdHR2uNAUFBdi6dSvMzMwAAGlpaQgKCkJaWhpUVVUBALNnz0ZERASCgoLg5+eHDRs2wNHRkY1bX18fV69eRUREBJuvr68vvKaNxqhBJcdDR7MplnpOwZzlG7gKTqMH9cLQPo4AAD8vV2z86wBuxj6EY6d2kJctaZKnpCDP1cepvLFD+rD/19Fsio1L56CV03Dk5OZBUkK8Qvq0V6/R38keJoZ67Dq1scRzCrp27QoAyM/Ph5+fH86fPw8bG5uS/HR0cOXKFWzfvh22traQly/pqaekpFShj5Oenh5WrlxZ5bYOHjyI4uJi7Nq1CxwOBwAQFBQEWVlZREVFoVu3bhgyZAj279/PFpwiIyORlZWF/v37AwD8/f3h4uKCmTNnstvcuHEjbG1tsW3bNqSlpeHMmTO4efMmWrVqhc+Sktjm6wsLZ+daHRdCCCGEkKpQwakB0DcyhnV7Wwzo2h5tbTvDpmMndHVyhnQNnfiNTM3Z/+fl5eLF81T4eLrBd+5Mdn5RUSEkpaTZ6Yjwf3AgaDtePH+GvNxcFBcVQlpaGmVpaWlBSur/hQRlZWUICAhw9TtSVlbGmzdvaty32NhYNG3alC00VUZYWBimpqbs9IMHD1BUVFRhnfz8fDRu3BgAkJCQgL59+3Itt7Gx4So4xcXFISbmCpZv/IudV1RcjC9f8pH3+TPEv9W6mH4rvACAhLgYpKUk8eZdZo37Vtad+/HwWbMdcfHJyPyYjeLiYgBA2svXMNLXqZDebexQTJnnj7PR19GlQ2v0d7KHqVHVx6g8K1Mj9v9PnjxBXl4eW5Aq9fXrV1hYWNSYV8uWLatdHhcXhydPnnBdEwDw5csXpKSkAABcXFzQpk0bvHr1CqqqqggNDUWPHj3YQlpcXBzu37+P0ND/D3LCMAyKi4uRmpqKpKQkCAoKcsVioKMDWamqC6uEEEIIIbVBBacGQEBAANv3H0Xs7Ru4dukiDgTtwKaVy7Av/Hy164mJS7D///ytr8iilethYm7Fla7Rt2ZxcXduYr7bREzx8EJbW3tISksjNuo01qxZw5W+/CATHA6n0nmlhYNqYxSrufmZmJgYW5MBADk5ORAQEMCdO3e4mvQBgKSkZI35lc3Hd9Yk9OveucIyUZH/N7krPzoehwOe9q1Ubt5nOAxzhYOdDUI3L4NiYzmkvXwNh2HT8PVrQaXrjB/WFw62NjgVeQVnL12D/+YgrFnkgeljh/C0TQnx/x/XnJwcAMCpU6egpqbGlU5EpPKmhVx5SUhUuzwnJwctW7bkKvSUUlRUBAC0atUKzZo1Q1hYGKZMmYKjR48iODiYK49JkybBzc2tQh4aGhpISkqqMU5CCCGEkB9BBacGgsPhwKJVG1i0aoNJM+fAsY0pLkSchJCwMIqKi2pcv7GiEhSVmyD9+XP06Duo0jSxt2+iiZo6Jrj9v7ne8ZDnP20fKmNqaor09HQkJSVVW+tUloWFBYqKivDmzRt06NCh0jSGhoa4ceMG17zr169zTVtaWiIx5Tl0tTW+L3gAwt8KjEVFVZ+Dx09S8T4zCwHzpkNdrWQ0uttx8TXmra6mgskjB2DyyAGY578JO/f/w3PBqayyg2rY2tpWvh/CwjXuR1UsLS1x8OBBKCkpVaidLMvFxQWhoaFo2rQpGjVqhB49enDlER8fD11d3UrXbd68OQoLC3Hnzh20atUKAJCUmoqsT/XjvVeEEEIIqftoVL0G4P6929i1aQ0exd1DxssXiDxzApkf3kFHTx+qTdWRnPAIz1KSkfnhPdcIeOVNneWF3VvWIXT3djx7+gTJCY9w7GAo9uwoGVhCU1sHr1+l48zxI3jxLBWhu7fj6NGjv3TfbG1t0bFjR/Tv3x/nzp1DamoqO/BEVfT19eHi4oKRI0fin3/+QWpqKm7evAl/f3+cOnUKAODm5oaIiAisXr0aycnJ2Lx5c4U8Fy1ahD2HT8F37XY8SkxBQvJThB3/FwtXbOE5fs2mTcDhcHDy/GW8fZ+JnNy8Cmk01JpAWFgIm4LC8PR5OsLPRmPp+l2V5PZ/Mxetwr9RV5Ga9hJ3HyTgYswtGOpq8xxXWVJSUpg9ezbc3d0REhKClJQU3L17F5s2bUJISEjJfmhqluzHyZN4+/YtW0vFCxcXFygoKMDZ2RmXL19GamoqoqKi4ObmhvT0dK50d+/exfLlyzFgwACu2q65c+fi6tWrcHV1RWxsLJKTk3H8+HG4uroCAAwMDODo6IhJkybhxo0buPvoEab6+EBMVPS7jgkhhBBCSHlU48SjpgGV11zw4n561s8LpBKSklK4c+Ma9v0ViNycT2iipo5Z3kvRvlNXGJla4Na1GAzt0Rl5uTnY9fcJdgCJ8voNHQlRUTEEb9+EdcsXQUxMHHrNjeAybgoAwK6bE4aPn4IA7zn4+vUrOnTuCm9vb/j4+PzS/Tty5Ahmz56NoUOHIjc3F7q6uggICKh2naCgICxbtgyzZs3Cy5cvoaCggDZt2qBnz54AgDZt2mDnzp1YvHgxFi1ahC5dumDhwoVYunQpm4eDgwNOhqzHknU7sWJLCISEBNFcVwvjh/bhOXa1JkrwnTUZXv6bMMbDByMH9ETwel+uNIqN5RC8zhfzAzZj4+4wWBo3x2rvmeg9xr3KfIuKizFtQQDSM95AWlICjnZtsc5nFs9xlbd06VIoKirC398fT58+haysLCwtLTF//vyS/VBTKxksw8sLY8aMwciRI7ma0lVHXFwcly5dwty5c9GvXz98+vQJampqsLe356qB0tXVRevWrXHz5k2sX7+eKw9TU1NER0djwYIF6NChAxiGQbNmzTB48GA2TVBQEMaPHw9bW1soyctj8fTpWLJ583cfE0IIIYSQsjgMwzD8DuJ3ys7OhoyMDD5+/Fih2dCXL1+QmpoKbW1tiP7EJ9W/uuDET6ZNZfkdwq/16h6/I/h1VGse+KG++vzwIb9D+KXEjI35HQIhhJA67lfd1zY01ZUNyqOmeoQQQgghhBBSAyo4Eb4KDQ2FpKRkpX8tWrTgd3j1zuS5yyGp167Sv8lzl/M7PEIIIYSQeov6OBG+6t27d5UvwS0/hDmp2RLPKZg9eUSly6SleB+KnRBCCCGEcKOCE+ErKSmpCi9GJd9PSUEeSgry/A6DEEIIIaTBoaZ6hBBCCCGEEFIDKjgRQgghhBBCSA2o4EQIIYQQQgghNaCCEyGEEEIIIYTUgApOhBBCCCGEEFIDKjgRAMCta1dgpi6H7I8f+R0KqUHU1dvgqFki6+MnfofCk6ioKHA4HGRlZfE7FEIIIYSQ70bDkfPIx8fnt26v3/iZv3V75i1bI/LOY0hJS//W7ZLaa2tlhox7ZyEjXfN7maKu3kangRORGR8NWRka9p0QQggh5HtRjRMBAAgJC0NBSRkcDoffodQJBQUFdTZPYWEhqCgp/NZzxTAMCgsLf9v2CCGEEELqGio4NRDdbUyxb9c2rnmDHDpg29oAAICZuhz+ObAHM8cPh7WeKnp1aImos6fZtJU11Tv+9344WBvDWk8VM8cPR8j2zWjfQpNd7u0+FX369OHa5syZM2FnZ8dOFxcXw9/fH9ra2hATE4OZmRkOHz7M836dPn0a+vr6EBMTQ6dOnRAcHMzV7MvHxwfm5uZc66xfvx5aWlpc83bt2gVDQ0OIioqiefPm2Lp1K7vs2bNn4HA4OHjwIGxtbSEqKoodO3ZAWloah0+e58rnWMRFSOi2xaec3GrjfvbiFThqljh4/F/Y9h8PUZ02CP3nTEks+4/C0LYfRHXaoHnHftga/DfXuldvxcG86xCI6rSBVXcXHIu4CI6aJWIfJgKo2FTvefor9Bo1A3JGtpDQbYsWnQbgdOQVPHvxCp0GTgQAyBnZgqNmidEzFwOo+byUNq87c+YMWrZsCREREVy5coWn81n+nD179qzaY0UIIYQQUh9QU70/SOC6FXCf7wuPBUtwIHgH5rlNQsS1+5CRk6uQ9v692/DxnA43r0Xo5NADMVGR2LbWv9bb9Pf3x759+xAYGAg9PT1cunQJw4cPh6KiImxtbatd98WLF+jXrx+mTZuGiRMn4vbt25g1a1atYwgNDcWiRYuwefNmWFhY4N69e5gwYQIkJCQwatQoNp2XlxfWrFkDCwsLiIqKIi4uDkEHwzGgZxc2TdDBcAzo0QVSkhI8bdvLfxPWLHKHhXFziIoII/Sf01i0ehs2L5sLC+PmuPfwMSZ4LoOEuBhGDeqF7E856DV6Jpw6t8P+LX54np6BmYtXV7uNafMD8LWgEJeO7IKEuBjik55CUkIM6qrKOLJzFfpP8ETipaOQlpKAmKgIAMB/027sC79Q43nx8vLC6tWroaOjAzk5uRrP5886Z4QQQgghdQ0VnP4gvQcOQ/c+AwAA0+d6Y//u7XgYewftOnWpkHb/X4FoZ2ePMVNmAAC0dHQRd/sGrkZH8ry9/Px8+Pn54fz587CxsQEA6Ojo4MqVK9i+fXuNBadt27ahWbNmWLNmDQDAwMAADx48wIoVK3iOAQAWL16MNWvWoF+/fgAAbW1txMfHY/v27VwFp5kzZ7JpAGD8+PFo27YtMv57iybKinjz7gNOX4jB+bBtFbZRlZnjh6Gfk/3/Y1kTiDWLPNh52hpqiE9KxfZ9RzBqUC/sPxoBDoeDnau8ISoqAiN9Hbx8/QYTPJdWuY20V6/R38keJoZ6AAAdzabsMnlZGQCAkoI828cpP/8r/DbtxvnICzWelyVLlqBr167f1qv5fP6sc0YIIYQQUtdQwekPom/Ygv2/uLgEJKWk8OH9u0rTPn2ShM6OPbnmmbVsXauC05MnT5CXl8feeJf6+vUrLCwsalw/ISEB1tbWXPNKb9h5lZubi5SUFIwbNw4TJkxg5xcWFkJGRoYrrZWVFdd069at0UJfByGHTsLLdQz2HTkNzaYq6NjGkuftW5kZ/T+WvM9IeZaOcbOWcBWECouKICNVMtBDYsozmBrqQvRbzRAAtDb//3mrjNvYoZgyzx9no6+jS4fW6O9kD1Mj/SrTP3n2Anmfv/B0XsoeE17O5884Z4QQQgghdREVnBoITqNGYBiGa15Buc78goJC3OtwOCguLv652ywzAEJOTg4A4NSpU1BTU+NKJyIigp+hEY8x7Ny5s8INvYCAANe0hETF5nfjh/XFluC/4eU6BkF/h2PMoN61GpRBQkzs/7Hk5pXEsmohrC2Mq42lNsYP6wsHWxuciryCs5euwX9zENYs8sD0sUMqTV8aBy/npewx+R3nkxBCCCGkrqKCUwMhJ6+Ad29es9M5n7LxKu35d+eno6uPh/duc827f/cW9zYbN8aj20lc82JjYyEkVFJAMzIygoiICNLS0mpsllcZQ0NDhIeHc827fv0617SioiJev34NhmHYAk1sbCy7XFlZGaqqqnj69ClcXFxqHcPwfk6Ys3wDNv51APFJTzFqYK9a58HGotgYqiqKePr8JVz6OVWaxqCZFvb9cxr5+V8hIiIMALgVF19j3upqKpg8cgAmjxyAef6bsHP/P5g+dgiEv52LoqIiNq2Rvg5ERIRrfV54OZ+8nDNCCCGEkPqICk4NROt2HRB+6ABsuzhCSloGW9b4o9EP1GIMGzsJo/o6IiRwE+wcnHA1OhIx5ZrptW7bESGBm7Bnzx7Y2Nhg3759ePjwIdtsS0pKCrNnz4a7uzuKi4vRvn17fPz4ETExMZCWlubqX1SZyZMnY82aNfD09MT48eNx584dBAcHc6Wxs7PD27dvsXLlSgwYMAARERE4c+YMpMu8j8rX1xdubm6QkZGBo6Mj8vPzcfv2bWRmZsLDw6PaGORkpdGve2d4LluPbrZt0FRVuRZHsSLfWZPh5r0KMtKScLRri/yvX3H7fjwysz7BY9JwDOvriAUrtmDinGXwch2NtJevsTpwDwBUWdM1c9EqdO/cDvo6msj8mI2LMbdgqKsNANBs2gQcDgcnz1+Gk317iImKQEpSArMnjaj1eeHlfPJyzgghhBBC6iMajryBGDfNHS2t22L6mCFwHT0YnR16QF1T67vzM7VshUUrNiB0dyAGdeuAa9EXMWH6bK407ezs4e3tjTlz5qBVq1b49OkTRo4cyZVm6dKl8Pb2hr+/PwwNDeHo6IhTp05BW1u7xhg0NDRw5MgRHDt2DGZmZggMDISfnx9XGkNDQ2zduhVbtmyBmZkZbt68idmzueMcP348du3ahaCgIJiYmMDW1hbBwcE8xQAA44Y44+vXAowd7MxT+uqMH9YXu1Z7I+hgOEy6DILtgAkI/vsEtDVUAQDSUpI4EbwesY8SYd5tKBas2IJF7iVDiot+q4Eqr6i4GNMWBMDQrj8cXVyhr6OJrX7zAABqTZTgO2syvPw3QdmsC1wXlAzSsHTO1O86LzWdT17OGSGEEEJIfcRhyncQaeCys7MhIyODjx8/ctVKAMCXL1+QmpoKbW1tiIqK/rRt3k/P+ml58dPxv/djle88XHn0/yaApk1lf2sMUVFR6NSpEzIzMyEr+xu2/eoe9h4+CXeftXh1918ICwvVvM5PFvrPaYzx8MHHhEsQE/t51yVUax6go776/PAhv0P4pcSMjWtORAgh5I/2q+5rG5rqygblUVM9QqqQl5eHjGcvELAlGJOG9/tthaY9h05CR1MNaipKiItPwtzlGzGoV9efW2gihBBCCCG1Qk31CN9MnjwZkpKSlf5NnjyZ3+Fh5cqVaG7bHyqKjTFv+liuZX4b/4KkXrtK/7oPd/2h7b5++w7Dpy+EoV1/uPuswcCeXbBj5cIfypMQQgghhPwYaqpXBjXVq70faar35s0bZGdnV7pMWloaSkpK3533T/PqXqWzP2R+xIesj5UuExMVhVqTOhB7TaipXr1FTfUIIYTUhJrq8Yaa6pF6QUlJqW4Ujr6DvJwM5OVkak5ICCGEEEIaBGqqV4k/rBKOEEIIIYQ0MHQ/+/NRwamM0he35uXl8TkSQgghhBBCvl/p/Wzp/S35cdRUrwwBAQHIysrizZs3AABxcfEqXzpaG0zh1x/Oo6768uULv0P4tQob8NOaBnzu8ouL+R3CL8VpwOeOEELIj2EYBnl5eXjz5g1kZWUhICDA75AaDCo4laOiogIAbOHpZ3iT+fmn5VXXCH8W43cIv1bWW35H8OvkpvI7gl+m4G0DPm+gp4eEEEJqJisry97Xkp+DCk7lcDgcNGnSBEpKSigoKPgpeY7/J+qn5FMXRc6y43cIv9bmgfyO4Ndxvc3vCH6ZlKnT+B3CL6V95jS/QyCEEFKHCQkJUU3TL0AFpyoICAj8tAvu5aein5JPXdTgh7fMecHvCH6dBnzuGmVk8DuEX6rBf+4IIYSQOqhOFJy2bNmCVatW4fXr1zAzM8OmTZvQunXrKtMfOnQI3t7eePbsGfT09LBixQo4OTn9xogJIYQQQgjhn3Svy/wO4ZdqGtCB3yFUwPeC08GDB+Hh4YHAwEBYW1tj/fr1cHBwQGJiYqXv+Ll69SqGDh0Kf39/9OzZE/v370efPn1w9+5dGNNLIQkhhBBCamXN4J78DuGXmXXwJL9DIA0I34cjX7t2LSZMmIAxY8bAyMgIgYGBEBcXx+7duytNv2HDBjg6OsLT0xOGhoZYunQpLC0tsXnz5t8cOSGEEEIIIeRPwdcap69fv+LOnTuYN28eO69Ro0bo0qULrl27Vuk6165dg4eHB9c8BwcHHDt2rNL0+fn5yM/PZ6c/fvwIAMjOzv7B6HlXnN9w3wv1O48jX+Q34OHIG/C5yylquP0KgT/gc0cI+a2+/KTBsOqihvx9+Sk/l98h/FK/69yVboeXFwbzteD07t07FBUVQVlZmWu+srIyHj9+XOk6r1+/rjT969evK03v7+8PX1/fCvPV1dW/M2pSlsx6fkdAvluADL8jIN9Lhs4dIYTwYuFR+r6st9b/3s19+vQJMjX8vvK9j9OvNm/ePK4aquLiYnz48AGNGzf+KS+3rWuys7Ohrq6OFy9eQFpamt/hEB7Reau/6NzVX3Tu6ic6b/UXnbv6qyGfO4Zh8OnTJ6iqqtaYlq8FJwUFBQgICOC///7jmv/ff/9V+cIuFRWVWqUXERGBiIgI1zxZWdnvD7qekJaWbnAX9p+Azlv9Reeu/qJzVz/Reau/6NzVXw313NVU01SKr4NDCAsLo2XLloiMjGTnFRcXIzIyEjY2NpWuY2Njw5UeAM6dO1dlekIIIYQQQgj5UXxvqufh4YFRo0bBysoKrVu3xvr165Gbm4sxY8YAAEaOHAk1NTX4+/sDAGbMmAFbW1usWbMGPXr0QFhYGG7fvo0dO3bwczcIIYQQQgghDRjfC06DBw/G27dvsWjRIrx+/Rrm5uaIiIhgB4BIS0tDo0b/rxhr27Yt9u/fj4ULF2L+/PnQ09PDsWPH6B1O34iIiGDx4sUVmieSuo3OW/1F567+onNXP9F5q7/o3NVfdO5KcBhext4jhBBCCCGEkD8Y31+ASwghhBBCCCF1HRWcCCGEEEIIIaQGVHAihBBCCCGEkBpQwYkQQkiDduHCBRQVFfE7DEIIIfUcFZwI+Y12796Nd+/e8TsM8h00NDTg6uqKs2fPorCwkN/hkFoYP348FBUVMWzYMBw8eBDZ2dn8DokQQkg9RAWnBmDs2LH49OlThfm5ubkYO3YsHyIiVdm3bx+aNm2Ktm3bYsWKFUhISOB3SIRHe/fuhYiICKZNmwYFBQUMHjwYoaGhyMrK4ndopAZPnz5FVFQUjIyMsGbNGigrK6Nr167YtGkT0tLS+B0eIYSQeoKGI28ABAQEkJGRASUlJa757969g4qKCj0dr2MyMzNx6tQphIeHs+8s6927N5ydndG+fXuu95aRuunRo0cIDw/H8ePHERsbi7Zt26J3797o3bs3dHR0+B0eqcGrV68QHh6O8PBwXLx4EQYGBuz5s7Ky4nd4pAp79+5FYGAgUlNTce3aNWhqamL9+vXQ1taGs7Mzv8MjZWzcuJHntG5ubr8wElJbtamRl5aW/oWR1E1UcKrHsrOzwTAM5OTkkJycDEVFRXZZUVERTpw4AS8vL7x69YqPUZLqfP36FRcuXEB4eDhOnDiBz58/w8nJCb1790b37t0hISHB7xBJDTIyMnDy5EmEh4cjMjISOjo6WLFiBXr06MHv0AgPcnJy8O+//+L48eM4ffo0PDw8MH/+fH6HRcrZtm0bFi1ahJkzZ2L58uV4+PAhdHR0EBwcjJCQEFy8eJHfIZIytLW1uabfvn2LvLw8yMrKAgCysrIgLi4OJSUlPH36lA8Rkqo0atQIHA6Hp7R/Yt9RKjjVYzVd3BwOB76+vliwYMFvjIr8iNu3b7M1GQMGDIC3tze/QyK1kJeXh3///RdSUlLo0qULv8MhtVRUVIQPHz5wPYQidYORkRH8/PzQp08fSElJIS4uDjo6Onj48CHs7Oyo72gdtn//fmzduhV//fUXDAwMAACJiYmYMGECJk2aBBcXFz5HSMqKjo5m///s2TN4eXlh9OjRsLGxAQBcu3YNISEh8Pf3x6hRo/gVJt9Qwakei46OBsMw6Ny5M44cOQJ5eXl2mbCwMDQ1NaGqqsrHCAkvSj+C5QvBBQUFEBIS4kdIpAZFRUU4evQo20fNyMgIzs7OEBQU5HNkpCaRkZFYt24de+4MDQ0xc+ZMKujWcWJiYnj8+DE0NTW5Ck7JyckwNTXF58+f+R0iqUKzZs1w+PBhWFhYcM2/c+cOBgwYgNTUVD5FRmpib2+P8ePHY+jQoVzz9+/fjx07diAqKoo/gfERdaaox2xtbWFnZ4fU1FQ4OzvD1taW/bOxsaFCUx33119/wdjYGKKiohAVFYWxsTF27drFLqdCU9306NEj6OvrY9SoUTh69CiOHj2KUaNGQU9PDw8fPuR3eKQaW7duhaOjI6SkpDBjxgzMmDED0tLScHJywpYtW/gdHqmGtrY2YmNjK8yPiIiAoaHh7w+I8CwjI6PSvtZFRUX477//+BAR4dW1a9cq7fdpZWWFmzdv8iEi/qPHow2ApqYmsrKycPPmTbx58wbFxcVcy0eOHMmnyEhVFi1ahLVr12L69Olc1d/u7u5IS0vDkiVL+Bwhqcr48ePRokUL3L59G3JycgBKBvwYPXo0Jk6ciKtXr/I5QlIVPz8/rFu3Dq6uruw8Nzc3tGvXDn5+fpg2bRofoyPV8fDwwLRp0/DlyxcwDIObN2/iwIED8Pf353rgROoee3t7TJo0Cbt27YKlpSWAktqmKVOmUE1vHaeuro6dO3di5cqVXPN37doFdXV1PkXFX9RUrwE4ceIEXFxckJOTA2lpaa4mXxwOBx8+fOBjdKQyioqK2LhxY4Xq7wMHDmD69OnUXr8OExMTw+3bt9GiRQuu+Q8fPkSrVq2oyVAdJikpidjYWOjq6nLNT05OhoWFBXJycvgUGeFFaGgofHx8kJKSAgBQVVWFr68vxo0bx+fISHXevn2LUaNGISIigm1JUVhYCAcHBwQHB1cYEZjUHadPn0b//v2hq6sLa2trAMDNmzeRnJyMI0eOwMnJic8R/n5UcGoA9PX14eTkBD8/P4iLi/M7HMIDWVlZ3Lp1C3p6elzzk5KS0Lp1a3o3UB1mZmaGdevWoXPnzlzzL1y4gBkzZuDBgwd8iozUZNiwYbCwsICnpyfX/NWrV+P27dsICwvjU2SkNvLy8pCTk0M33PVMUlISHj9+DABo3rw59PX1+RwR4cWLFy+wbds29twZGhpi8uTJVONE6i8JCQk8ePCA3h9Tj0yfPh1CQkJYu3Yt1/zZs2fj8+fP1N+iDjt9+jTmzJkDHx8ftGnTBgBw/fp1LFmyBAEBAWjfvj2b9k98x0VdtmzZMqxevRrt2rVjm8hev34dMTExmDVrFtf5onfLEPJzff36FampqWjWrBkNpEPqLSo4NQD9+vXDkCFDMGjQIH6HQng0ffp07NmzB+rq6uzN940bN5CWloaRI0dyDQxRvnBF+KvsC4pLm8WWHxmRYRhwOJw/8h0XdVn5d8tUhcPh0Ltl6hhtbe1qX79B56vuysvLw/Tp0xESEgKgpOZJR0cH06dPh5qaGry8vPgcIanO5cuXsX37djx9+hSHDh2Cmpoa9u7dC21tba4HhX8KKvI3AD169ICnpyfi4+NhYmJSYTS23r178ykyUpWHDx+ynWRL2+srKChAQUGBa2Q2Xl9CR36fCxcu0Hmpp2jY4/pr5syZXNMFBQW4d+8eIiIiKjS9JHXLvHnzEBcXh6ioKDg6OrLzu3TpAh8fHyo41WFHjhzBiBEj4OLigrt37yI/Px8A8PHjR/j5+eH06dN8jvD3oxqnBqDsE/Dy6Kk3IYSUuHLlyh/5hLQh27JlC27fvo2goCB+h0KqoKmpiYMHD6JNmzZc7+B68uQJLC0tkZ2dze8QSRUsLCzg7u6OkSNHcp27e/fuoXv37nj9+jW/Q/zt6D1ODUBxcXGVf1Roqpv27duHvLw8fodBvoOenh58fHyQnJzM71BILXXu3Bna2tqYP38+Hj16xO9wyE/QvXt3HDlyhN9hkGq8ffu20oE8cnNzqfa+jktMTETHjh0rzJeRkfljB7GiglMD8+XLF36HQHjg7u4OJSUlDBs2DKdPn6YCbj0ydepUnDp1Cs2bN0erVq2wYcOGP/KpW3306tUrzJo1C9HR0TAxMYG5uTlWrVqF9PR0fodGvtPhw4chLy/P7zBINaysrHDq1Cl2urSwtGvXLnaQFlI3qaio4MmTJxXmX7ly5Y8dkIya6jUARUVF8PPzQ2BgIP777z+246W3tze0tLToHRd1UGFhISIiInDgwAEcP34c4uLiGDhwIFxcXNC2bVt+h0d4kJSUhNDQUBw4cACpqano1KkThg8fTi+cridSU1Oxf/9+HDhwAI8fP0bHjh1x4cIFfodFqmBhYcFVO8EwDF6/fo23b99i69atmDhxIh+jI9W5cuUKunfvjuHDhyM4OBiTJk1CfHw8rl69iujoaLRs2ZLfIZIq+Pv7Y9++fdi9eze6du2K06dP4/nz53B3d4e3tzemT5/O7xB/Oyo4NQBLlixBSEgIlixZggkTJuDhw4fQ0dHBwYMHsX79ely7do3fIZJq5OXl4ejRo9i/fz/Onz+Ppk2bsgNGkPrh+vXrmDJlCu7fv0+1h/VIUVERzpw5A29vbzp3dZyvry/XdKNGjaCoqAg7Ozs0b96cT1ERXqWkpCAgIABxcXHIycmBpaUl5s6dCxMTE36HRqrBMAz8/Pzg7+/Pdi8QERHB7NmzsXTpUj5Hxx9UcGoAdHV1sX37dtjb23N13nv8+DFsbGyQmZnJ7xBJDd69e4ewsDAEBgYiISGBbuDqiZs3b2L//v04ePAgsrOz0atXL3qJaj0QExOD0NBQHD58GF++fIGzszNcXFy4RvwihJA/WVFREWJiYmBqagpxcXE8efIEOTk5MDIygqSkJL/D4xsajrwBePnyJXR1dSvMLy4uRkFBAR8iIrworWkKDQ1FZGQk1NXVMXToUBw+fJjfoZFqlG+i17lzZ6xYsQL9+vX7o39M6oN58+YhLCwMr169QteuXbFhwwY4OztDXFyc36GRGtRm5DV68XTd0qVLFwwfPhz9+vWjc1OPCAgIoFu3bkhISICsrCyMjIz4HVKdQAWnBsDIyAiXL1+GpqYm1/zDhw/DwsKCT1GR6gwZMgQnT56EuLg4Bg0aBG9vb+okW0+UDgoxbdo0DBkyBMrKyvwOifDo0qVL8PT0xKBBg6CgoMDvcEgtyMrK1jgCG714um5q0aIF5s2bh6lTp6JHjx4YPnw4nJycKrxzktQ9xsbGePr0Kc8vD/8TUMGpAVi0aBFGjRqFly9fori4GP/88w8SExOxZ88enDx5kt/hkUoICAjg77//hoODAwQEBPgdDqmFxMRE6Onp8TsM8h1iYmL4HQL5TkFBQfDy8sLo0aPZh0zXrl1DSEgI/P39oaWlxd8ASZU2bNiAdevW4fz589i/fz9GjhwJAQEBDBgwAC4uLrC1teV3iKQKy5YtY/sztWzZEhISElzL/8QaROrj1EBcvnwZS5Ys4ep4uWjRInTr1o3foRHSIN2+fRsJCQkAAENDQ1hZWfE5IsKLxMREbNq0ievcTZ8+HQYGBnyOjFTH3t4e48ePx9ChQ7nm79+/Hzt27EBUVBR/AiO19uXLF5w4cQLLly/HgwcPqIawDmvU6P9vLSo/quWfWrtLBSdC+CQyMhLr1q3juoGbOXMmunTpwufISHXS09MxdOhQxMTEQFZWFgCQlZWFtm3bIiwsDE2bNuVvgKRKR44cwZAhQ2BlZcXWWly/fh23bt1CWFgY+vfvz+cISVXExcURFxdXobY3KSkJ5ubm9ELxeuL169cICwvDvn37cPfuXbRuVjtblwAAyKNJREFU3RrXr1/nd1ikCtHR0dUu/xNrC6ngRAgfbN26FTNmzMCAAQO4buAOHz6MdevWYdq0aXyOkFTF0dERWVlZCAkJYWspEhMTMWbMGEhLSyMiIoLPEZKqNGvWDC4uLliyZAnX/MWLF2Pfvn30GoA6zMDAAM7Ozli5ciXX/Dlz5uD48eNITEzkU2SkJtnZ2Thy5Aj279+PqKgo6OjowMXFBS4uLmjWrBm/wyOkVqjgVE/Jy8sjKSkJCgoKkJOTq7bT7IcPH35jZIQXTZs2hZeXF1xdXbnmb9myBX5+fnj58iWfIiM1ERMTw9WrVysMvHLnzh106NCBnnzXYeLi4rh//36FUUiTk5NhZmZG564OO336NPr37w9dXV1YW1sDKHkdQHJyMo4cOQInJyc+R0iqIiYmBjk5OQwePBguLi7UrLmeuXz5MrZv346nT5/i0KFDUFNTw969e6GtrY327dvzO7zfjgaHqKfWrVsHKSkpAMD69ev5GwyptaysrErfGdOtWzfMnTuXDxERXqmrq1c6zH9RURFUVVX5EBHhlZ2dHS5fvlyh4HTlyhV06NCBT1ERXjg5OSEpKQnbtm3D48ePAQC9evXC5MmToa6uzufoSHXCw8Nhb2/P1V+G1A9HjhzBiBEj4OLigrt37yI/Px8A8PHjR/j5+eH06dN8jvD3oxonQvhg2LBhsLCwgKenJ9f81atX4/bt2/QS1Trs+PHj8PPzw5YtW9gnp7dv38b06dMxd+5c9OnTh78BEi7h4eHs/1+9eoVFixZh0KBBaNOmDYCSJrKHDh2Cr68vJk+ezK8wCWnQCgsLERUVhZSUFAwbNgxSUlJ49eoVpKWl6f13dZiFhQXc3d0xcuRISElJIS4uDjo6Orh37x66d++O169f8zvE344KTvUUvQyw/tm4cSP7/+zsbKxevRrt2rXj6uMUExODWbNmYeHChfwKk1SifHPY3NxcFBYWQlCwpNK+9P8SEhLUNLaO4fUp9586QlRddv/+fRgbG6NRo0a4f/9+tWlNTU1/U1Sktp4/fw5HR0ekpaUhPz8fSUlJ0NHRwYwZM5Cfn4/AwEB+h0iqIC4ujvj4eGhpaXEVnJ4+fQojIyN8+fKF3yH+dtRUr56ilwHWP+vWreOalpOTQ3x8POLj49l5srKy2L17NxWc6hhqDlt/FRcX8zsE8p3Mzc3x+vVrKCkpwdzcHBwOB5U966XfubptxowZsLKyQlxcHBo3bszO79u3LyZMmMDHyEhNVFRU8OTJkwrvSbty5Qp0dHT4ExSfUcGpnrp48SK/QyC1lJqayu8QyHcaNWoULly4AFtbW3phcT00cuRIODs7w9HRscILHEndlZqaCkVFRfb/pH66fPkyrl69CmFhYa75WlpaNBBSHTdhwgTMmDEDu3fvBofDwatXr3Dt2jXMnj0b3t7e/A6PL6jgVE/9iWPnNwQdO3aEs7MzevfuXeF9JKRuGz9+PDuoh7OzM7p3707NYOsJXV1d+Pn5Yfjw4bCzs0Pv3r3Ru3dvqKmp8Ts0Ug1NTc1K/0/ql+Li4kprBNPT09lBrkjd5OXlheLiYtjb2yMvLw8dO3aEiIgIZs+ejenTp/M7PL6gPk4NQFBQECQlJTFw4ECu+YcOHUJeXh5GjRrFp8hIeSEhIQgPD8fZs2fRtGlT9gaubdu2NTa9JPx3//59hIeHIzw8HA8ePED79u3Ru3dvODs7Q0NDg9/hkRqkp6cjPDwcx48fR3R0NFq0aME+yDA3N+d3eKQGycnJuHjxIt68eVOhCeaiRYv4FBWpyeDBgyEjI4MdO3ZASkoK9+/fh6KiIvu9GRQUxO8QSQ2+fv2KJ0+eICcnB0ZGRn/0gB5UcGoA9PX1sX37dnTq1IlrfnR0NCZOnEgvBqyD8vPzERkZiePHj+PEiRMoKipCjx490Lt3bzg4OEBMTIzfIZIavHr1ii1EXbx4EQYGBmxBmN5TUvd9+vQJZ86cwfHjx3HmzBlISUmhV69emDJlClq0aMHv8Eg5O3fuxJQpU6CgoAAVFRWuB00cDgd3797lY3SkOunp6XBwcADDMEhOToaVlRWSk5OhoKCAS5cuQUlJid8hkiqMHTsWGzZsqFAzmJubi+nTp2P37t18iox/qODUAIiKiuLx48cVOu89e/YMhoaG+Pz5M38CIzy7ceMGexOekpKCzp07Y968eWjXrh2/QyM8yMnJwb///ovjx4/j9OnT8PDwwPz58/kdFuFRUVERoqKiEB4eDhMTE4wfP57fIZFyNDU1MXXqVHrPXT1VWFiIsLAw3L9/Hzk5ObC0tISLiws9JKzjBAQEkJGRUaFw++7dO6ioqKCwsJBPkfEPFZwaAA0NDWzevBm9e/fmmn/8+HFMmzYN6enpfIqMfI+UlBSEh4dDXV0dAwYM4Hc4pJaKiorw4cMHtlM7qZvy8/ORnp6Opk2bQkREhN/hkBpIS0sjNjb2jx3Ji5DfKTs7GwzDQE5ODsnJyVy/Z0VFRThx4gS8vLzw6tUrPkbJHzQ4RAMwdOhQuLm5QUpKCh07dgRQ0kxvxowZGDJkCJ+jIzVJTk5GWloaNDU1oauri2bNmsHd3Z3fYZFy0tPTISoqCgUFBQAlI0UFBgay527atGmwsbGBgIAAFZrqmODgYBgYGMDGxgZfvnzBtGnTEBISAoZh0KhRI4wbNw4bNmygAlQdNnDgQJw9e5ZeUlxPhIeHo3v37hASEuJ6CXVlyj/0JfxX+sobDocDfX39Css5HA58fX35EBn/UY1TA/D161eMGDEChw4dYl/IWVxcjJEjRyIwMLDCEKCEf/z9/dG6dWvY29sjMzMTAwcOxIULFwCUfBF169YNBw4cgKysLH8DJRVYW1vD29sbPXv2xPHjx9GvXz/07NkThoaGSEpKwsmTJ/HPP/+gZ8+e/A6VlKOjo4MDBw7A2toanp6eOHz4MNauXQtDQ0MkJiZizpw5cHZ2xsqVK/kdKqmCv78/1q5dix49esDExARCQkJcy93c3PgUGalMo0aN2HdwVfcSanoHV90UHR0NhmHQuXNnHDlyBPLy8uwyYWFhaGpqQlVVlY8R8g8VnBqQ5ORkxMbGQkxMDCYmJjR8ax2krq6O8PBwWFhYYMKECbhz5w7++usv9gZu8uTJaNGiBXbt2sXvUEk5kpKSePDgAbS1tdGmTRv07duXq7/F5s2bsXv3buqkXgeJiooiKSkJGhoaMDAwwIYNG+Do6Mguv3TpEkaMGIHnz5/zMUpSHW1t7SqXcTgcPH369DdGQ8if4fnz59DQ0KBRf8uo+jEAqXf09PQwcOBA9OzZs9JCk7S0NP248Nnbt2/ZJzfnz5/H+vXrYWFhAVFRUZiZmWHz5s04ffo0n6MklREUFMSnT58AlLyMs3v37lzLu3fvTiNY1lEqKipISUkBUDIaVGlzy1KKiop4//49P0IjPEpNTa3yj37X6q6CggLY29sjOTmZ36GQ75CQkICYmBh2esuWLTA3N8ewYcOQmZnJx8j4hwpOfxCqXOQ/TU1NPHz4EEDJU9LSppWlBAQEkJuby4/QSA1sbW1x4MABAICFhQWioqK4ll+8eJFeqFpHubi4YMGCBcjKysKIESOwZMkS5OTkAADy8vLg4+NDI1gS8gsICQnh/v37/A6DfCdPT09kZ2cDAB48eAAPDw84OTkhNTUVHh4efI6OP2hwCEJ+owkTJsDT0xMGBgZwdXXF7NmzsXfvXjRr1gypqalwd3dHt27d+B0mqURAQAA6dOiAV69eoX379liwYAFu3brFNrM8ePAgAgMD+R0mqcTixYvx8OFD6OjowMrKCpcvX4aysjLU1NT+x96dh9Wc/v8Df55SVFqRJbTYI2v2fc1almGskWXGWijMQpTdjNAwGFthbGMra4yQJZJSIWspSyEJlaVO5/eHr/NztPuM7nNOz8d1uabu9/njeV3vqd6v933frxtPnjxBmTJlcPLkSdExKQ+jR4/O83pxPE9GVQwfPhybNm3CkiVLREehQoqNjYW1tTUAYN++fejTpw8WLVqEsLAw9OzZU3A6MVg4ERUhNzc3xMfHw9raGtWqVcODBw9Qs2ZNlChRApmZmWjcuLF8VoOUS506dXD58mX8+uuvWLZsGdLS0vD333+jRIkSaNq0KXbt2oW+ffuKjkk50NbWhp+fH44fP45Dhw5BU1MTWVlZqFixIlq3bo2hQ4dCT09PdEzKw5fLgjIyMnD9+nWkpKSgU6dOglJRQWRmZmLz5s34999/0aRJk2w/a15eXoKSUX60tbWRnp4O4OP2AkdHRwCAiYmJfCaquGFziGJEX18fERERPAdDCURHR+Pw4cOIiYlReIDr0qULN2GqAJlMhmfPniErKwtly5bN1uGLiL69rKwsTJgwAdWqVcPMmTNFx6FcdOzYMc/rp0+fLqIkVFj29vb48OEDWrdujfnz5yM2NhZmZmY4ceIEJk+ejDt37oiOWORYOBUjPECQ6H/n6ekJNzc36OrqKoy/ffsWv/32G9zd3QUlo/xYWVnhypUrKFOmjMJ4SkoKGjduzCYDKuj27dvo0KEDEhISREchUjvx8fGYOHEiHj58CGdnZ4wZMwYAMG3aNEilUnh7ewtOWPRYOBUjnHFSHpqamkhISICpqanC+IsXL2BqaspzLZQY753q+vxsmc89ffoUVatWxfv37wUlo6919OhRjBw5Es+fPxcdhXIxevRorFq1Cvr6+grjaWlpmDJlCvenkUrhHic186kOzmm517Fjx9j1S0nk9r7i/fv3PLBYyclkshx/viIiIhQOCSTl4e/vL/86ICAAhoaG8u+lUilOnToFCwsLAcmooL7s4CWTyZCQkIAjR45g5MiRglJRQfj6+mLJkiXZCqe3b99i69atLJyUzOvXr2FgYCD/Oi+fPlecsHBSE1u3bsVvv/0mPyuhZs2amDFjBkaMGCH/TJs2bUTFo//zaVpbIpFg48aNKF26tPyaVCpFUFAQateuLSoe5cHY2BgSiQQSiQQ1a9ZUKJ6kUilSU1Mxfvx4gQkpN5+adkgkkmwP2VpaWrCwsMDy5csFJKOCCg8PV/heQ0MD5cqVw/Lly/PtuEdivH79GjKZDDKZDG/evEGpUqXk16RSKY4ePZpt9pfEMzY2lq+qMDIyyvFF4acXiMVxhQULJzXg5eWFOXPmYPLkyfKzSM6fP4/x48cjKSkJ06ZNE5yQPlmxYgWAj7901q1bB01NTfk1bW1tWFhYsKW1klq5ciVkMhlGjx4NDw8PhVmLT/euZcuWAhNSbrKysgAAlpaWuHLlSrYDcEn5FbSBwIULF2Bra4uSJUt+40SUn08P3Z9eNn1JIpHAw8NDQDLKS2BgoHz1BBt3ZMc9TmrA0tISHh4e8jaRn/j6+mLevHmIjY0VlIxy07FjR+zfvx/Gxsaio1AhnT17Fq1atWInPSIlxCZIyuPs2bOQyWTo1KkT9u3bp7CUWVtbG+bm5qhUqZLAhESFx8JJDZQqVQrXr19H9erVFcbv3r0LGxsbvHv3TlAyIvWUlZWFe/fuyVuSf65du3aCUlFBnDp1CqdOncrx3nGvhepjEyTlExcXh6pVq/KoDRUUGRmZ47hEIkGpUqVQtWrVYje7y6V6aqB69erYs2cPfvnlF4Xx3bt3o0aNGoJSUV6kUil8fHxyfYALDAwUlIzyc+nSJQwdOhRxcXHZmnwU1zXfqsLDwwOenp6wtbVFxYoV+SBHVATMzc1x7tw5rF+/HjExMfjnn39gZmaGbdu2wdLSkvuvlVjDhg3z/D2ppaWF77//HuvXr1fYw6bOWDipAQ8PD3z//fcICgqS73G6cOECTp06hT179ghORzlxcXGBj48PevXqhXr16vEBToWMHz8etra2OHLkCB++Vcy6devg4+Oj0DSHiL6tffv2YcSIERg2bBjCwsLkbf9fvXqFRYsW4ejRo4ITUm4OHDiAWbNmYcaMGWjWrBkAICQkBMuXL8fcuXORmZmJn376CbNnz8bvv/8uOG3R4FI9NXH16lWsWLEC0dHRAIA6derA1dUVjRo1EpyMclK2bFls3boVPXv2FB2FCklPTw8RERHZlsaS8itTpgxCQkJQrVo10VHoG+FSPeXTqFEjTJs2DY6Ojgr3Jzw8HD169EBiYqLoiJSLZs2aYf78+bCzs1MYDwgIwJw5cxASEoKDBw/C1dUV9+/fF5SyaHHGSU00adIE27dvFx2DCkhbW5sP3iqqefPmuHfvHu+fCho7dix27NiBOXPmiI5C3whngJXP7du3c9z7aWhoiJSUlKIPRAUWFRUFc3PzbOPm5uaIiooC8HE5X0JCQlFHE4aFkxrQ1NSU99z/3IsXL2Bqaso9F0rI1dUVq1atwurVq/mHXsVMmTIFrq6uSExMhI2NTbbuevXr1xeUjPLz7t07/PXXX/j3339Rv379bPfOy8tLUDL6r3ARjfKpUKEC7t27l+2Q6fPnz3NmUMnVrl0bS5YswV9//QVtbW0AQEZGBpYsWSI/c/Lx48coX768yJhFioWTGsjtD8X79+/l/6OTcjl//jxOnz6NY8eOoW7dutke4Pbv3y8oGeVnwIABAKBw6KZEIinWBwKqisjISDRs2BAAcP36dYVrfIGh3N6+fQuZTAZdXV0AHzu1HThwANbW1ujWrZv8c2/evBEVkXIxbtw4uLi4YPPmzZBIJHjy5AmCg4Ph5ubG2V8lt2bNGtjb26Ny5cryl4JRUVGQSqU4fPgwACAmJgYTJ04UGbNIsXBSYd7e3gA+/sHfuHEjSpcuLb8mlUoRFBQkfyNAysXIyAj9+vUTHYO+As9FU108zFF1OTg4oH///hg/fjxSUlLQvHlzaGlpISkpCV5eXpgwYYLoiJSLn376CVlZWejcuTPS09PRrl07lCxZEm5ubpgyZYroeJSHVq1aITY2Fn///Tfu3LkDABg4cCCGDh0KfX19ACh2zXbYHEKFWVpaAvj45q1y5crQ1NSUX9PW1oaFhQU8PT3RvHlzURGJiIj+Z2XLlsXZs2dRt25dbNy4EX/88QfCw8Oxb98+uLu7yxsjkXKRSqW4cOEC6tevD11dXdy7dw+pqamwtrZWeNlLpCo446TCPr357tixI/bv3w9jY2PBiYiKj5s3byI+Ph4fPnxQGLe3txeUiAoiNDQUe/bsyfHecYms8kpPT5e/4T5x4gT69+8PDQ0NtGjRAnFxcYLTUW40NTXRrVs3REdHw8jICNbW1qIjUSFt27ZNfgZXcHAwzM3NsWLFClhZWcHBwUF0vCKnIToA/e9Onz5doKLJwMAAMTExRZCICmLv3r0YNGgQWrRogcaNGyv8I+UVExODBg0aoF69eujVqxf69u2Lvn37ol+/flx+qeR27dqFVq1aITo6GgcOHEBGRgZu3LiBwMBAGBoaio5HeahevToOHjyIhw8fIiAgQL6v6dmzZzAwMBCcjvJSr149PnuoqLVr12L69Ono0aMHXr58Kd/Da2xsjJUrV4oNJwgLp2KEqzKVh7e3N5ycnFC+fHmEh4ejWbNmKFOmDGJiYtCjRw/R8SgPLi4usLS0xLNnz6Crq4sbN24gKCgItra2OHPmjOh4lIdFixZhxYoVOHToELS1tbFq1SrcunULgwYNQtWqVUXHozy4u7vDzc0NFhYWaN68OVq2bAng4+wTzytUbgsWLICbmxsOHz6MhIQEvH79WuEfKa8//vgDGzZswK+//ooSJf7/IjVbW1t5O/LihnucihEeDKg8ateujblz52LIkCEK98Xd3R3JyclYvXq16IiUi7JlyyIwMBD169eHoaEhQkJCUKtWLQQGBsLV1RXh4eGiI1Iu9PT0cOPGDVhYWKBMmTI4c+YMbGxsEB0djU6dOhWrs0hUUWJiIhISEtCgQQNoaHx87xsSEgIDAwM2QlJin+4VoNi9kp1IlZ+Ojg5u3boFc3NzhWeVu3fvon79+nj79q3oiEWOe5yIBIiPj0erVq0AfPzF9KmF7ogRI9CiRQsWTkpMKpXK91qULVsWT548Qa1atWBubo7bt28LTkd5MTY2lv+smZmZ4fr167CxsUFKSgrS09MFp6P8VKhQARUqVFAYa9asmaA0VFDsZqm6LC0tce3atWyH4B4/fhx16tQRlEosFk5EAlSoUAHJyckwNzdH1apVcenSJTRo0ACxsbFcUqnk6tWrh4iICFhaWqJ58+ZYtmwZtLW18ddff3E2V8m1a9cOJ0+ehI2NDQYOHAgXFxcEBgbi5MmT6Ny5s+h49IX+/fvDx8cHBgYG6N+/f56fZWMP5dW+ffsCfW7ixInw9PRE2bJlv3EiKqjp06dj0qRJePfuHWQyGUJCQrBz504sXrwYGzduFB1PCBZOxQgPeFQenTp1gr+/Pxo1agQnJydMmzYNe/fuRWhoaL4PCCTW7NmzkZaWBgDw9PRE79690bZtW5QpUwa7d+8WnI7ysnr1arx79w4A8Ouvv0JLSwsXL17EgAEDMHv2bMHp6EuGhobyv1ts3qH+tm/fDjc3NxZOSmTs2LHQ0dHB7NmzkZ6ejqFDh6JSpUpYtWoVBg8eLDqeENzjVIxwj5PyyMrKQlZWlnyz5a5du3Dx4kXUqFEDP/74I7S1tQUnpMJITk6GsbExX04QCXbhwgXY2tqiZMmSoqNQIfEZRblkZmZix44dsLOzQ/ny5ZGeno7U1FSYmpqKjiYUCyc14OnpCTc3N+jq6iqMv337Fr/99hvc3d0BAOfPn0fTpk35B4XoP/Lw4UMAQJUqVQQnoYKSSqU4cOCA/MBUa2trODg4KHSMItVlYGCAa9eu8eFbBbFwUj66urqIjo7OtsepOGPhpAY0NTWRkJCQ7S3AixcvYGpqyo41Surly5fYtGmTwgOck5MTTExMBCejvGRmZsLDwwPe3t5ITU0FAJQuXRpTpkzB3LlzoaWlJTgh5ebGjRuwt7dHYmIiatWqBQC4c+cOypUrh0OHDqFevXqCE9L/ig/fqov3Tvl06NABU6dORd++fUVHURp8xaYGPrX0/FJERAQfwpVUUFAQ7O3tYWBgAFtbWwAfz3by9PTEoUOH0K5dO8EJKTdTpkzB/v37sWzZMvlZMsHBwZg3bx5evHiBtWvXCk5IuRk7dizq1q2L0NBQ+aHhL1++xKhRo/DDDz/g4sWLghMSESmPiRMnwtXVFY8ePUKTJk2gp6encL1+/fqCkonDGScV9mlPxatXr2BgYKBQPEmlUqSmpmL8+PFYs2aNwJSUExsbG7Rs2RJr166FpqYmgI/3bOLEibh48WKxPVhOFRgaGmLXrl3ZDio+evQohgwZglevXglKRvnR0dFBaGgo6tatqzB+/fp1NG3atFieSaJuOGuhunjvlM/nZ3B9IpFIivUZXJxxUmErV66ETCbD6NGj4eHhodB1SFtbGxYWFvI34qRc7t27h71798qLJuDjksvp06dj69atApNRfkqWLAkLC4ts45aWlmzqoeRq1qyJp0+fZiucnj17hurVqwtKRUQAMHz4cBgYGIiOQZ+JjY0VHUHpsHBSYSNHjgTw8YGtVatW3FuhQho3bozo6Gj5PotPoqOj0aBBA0GpqCAmT56M+fPnY8uWLfJGK+/fv8fChQsxefJkwekoL4sXL4azszPmzZuHFi1aAAAuXboET09PLF26FK9fv5Z/lg9wqomdLZXP8ePHUbp0abRp0wYAsGbNGmzYsAHW1tZYs2aNfNkslzkrn4I2hejVqxc2btyIihUrfuNE4nGpnprIysrCvXv38OzZM2RlZSlc434Z5bN7927MnDkTU6ZMUXiAW7NmDZYsWaJwIndxXEOszPr164dTp06hZMmS8iI3IiICHz58yHaIKg/lVC6fLzv59ID96U/g598X1yUo6oDLvZSPjY0Nli5dip49eyIqKgpNmzbF9OnTcfr0adSuXRtbtmwRHZH+R8Xp546Fkxq4dOkShg4diri4OHx5O/kAoJxyWjf8ueK+hliZOTk5FfizfCBQLmfPni3wZ9u3b/8Nk1BhzZ07F6NHj2ZbZBVUunRpXL9+HRYWFpg3bx6uX7+OvXv3IiwsDD179kRiYqLoiPQ/Kk6FE5fqqYHx48fD1tYWR44cQcWKFblUQQVw3bDqYjGkulgMqS4/Pz8sXLgQ7du3x5gxYzBgwACeSagitLW1kZ6eDgD4999/4ejoCAAwMTFRWB5LpAo446QG9PT0EBERwc3NRERfiIyMRL169aChoYHIyMg8P8tlscotPDwcW7Zswc6dO5GZmYnBgwdj9OjRaNq0qeholAd7e3t8+PABrVu3xvz58xEbGwszMzOcOHECkydPxp07d0RHpP9RcZpxYuGkBjp16oSZM2eie/fuoqNQHvz9/dGjRw9oaWnB398/z8/a29sXUSoqiMaNG+PUqVMwNjZGo0aN8pzVDQsLK8JklB8NDQ0kJibC1NQUGhoa8mWwX+KyWNWRkZGBQ4cOYcuWLQgICEDt2rUxZswYjBo1SqG7LCmH+Ph4TJw4EQ8fPoSzszPGjBkDAJg2bRqkUim8vb0FJ6T/VXEqnLhUTw1MmTIFrq6uSExMhI2NTbbuenyLqhz69u0rf4DL6xRuPsApHwcHB/myIJ6grlpiY2NRrlw5+dek+mQyGTIyMvDhwwfIZDIYGxtj9erVmDNnDjZs2IDvv/9edET6TNWqVXH48OFs4ytWrBCQhuh/wxknNcADyoiISN1dvXpVvlSvZMmScHR0xNixY+XL1P/44w8sWLAAT58+FZyUCrN3ia3/lVdaWhr09PTy/dzixYsxYcIEGBkZfftQgrFwUgNxcXF5XmcXIqL/zpUrV5CVlYXmzZsrjF++fBmampqwtbUVlIzys3jxYpQvXx6jR49WGN+8eTOeP3+OWbNmCUpG+bGxscGtW7fQrVs3jBs3Dn369FE4QBwAkpKSYGpqmu1IDip6n5bF5oUvd5Vf6dKlMWjQIIwePVp+Dldxx8KJSABnZ2dUr14dzs7OCuOrV6/GvXv3sHLlSjHBKF/NmjXDzJkz8d133ymM79+/H0uXLsXly5cFJaP8WFhYYMeOHWjVqpXC+OXLlzF48GAu5VNi8+fPx+jRo2FmZiY6ChUAW/+rh4MHD8LHxwdHjx6FhYUFRo8eDUdHR1SqVEl0NGFYOKmJbdu2Yd26dYiNjUVwcDDMzc2xcuVKWFpawsHBQXQ8+oKZmRn8/f3RpEkThfGwsDDY29vj0aNHgpJRfkqXLo3IyMhsm2BjY2NRv359vHnzRlAyyk+pUqUQHR0NS0tLhfGYmBhYW1vj3bt3gpJRXjIyMlC7dm0cPnxY4XBwIioaz58/x7Zt2+Dj44Po6GjY2dlh9OjRsLe3R4kSxatdQt6ncJJKWLt2LaZPn46ePXsiJSVFPu1tZGTEmQsl9eLFixy7PxkYGCApKUlAIiqokiVL5riHIiEhodj9AVE1VapUwYULF7KNX7hwoVi/QVV2WlpaLGrVQHp6Om7duoXIyEiFf6T8ypUrh+nTpyMyMhJeXl74999/8d1336FSpUpwd3eXn9NVHLBwUgN//PEHNmzYgF9//VVhzbetrS2ioqIEJqPcVK9eHcePH882fuzYsWLRzlOVdevWDT///DNevXolH0tJScEvv/yCrl27CkxG+Rk3bhymTp2KLVu2IC4uDnFxcdi8eTOmTZuGcePGiY5HeZg0aRKWLl2KzMxM0VGokJ4/f47evXtDX18fdevWRaNGjRT+kfJ7+vQpli1bBmtra/z000/47rvvcOrUKSxfvhz79+8vVt1m+XpUDcTGxub4y6dkyZJIS0sTkIjyM336dEyePBnPnz9Hp06dAED+S4izhMrt999/R7t27WBubi7/ubt27RrKly+Pbdu2CU5HeZkxYwZevHiBiRMn4sOHDwA+Lt+bNWsWfv75Z8HpKC9XrlzBqVOncOLECdjY2GTr9LV//35BySg/U6dORUpKCi5fvowOHTrgwIEDePr0KRYsWIDly5eLjkd52L9/v/y8NGtra0ycOBHDhw9X6J7XqlWrYrWEloWTGrC0tMS1a9eydc87fvx4sfqfWZWMHj0a79+/x8KFCzF//nwAHzeur127Fo6OjoLTUV7MzMwQGRmJv//+GxEREdDR0YGTkxOGDBmS7Qw1Ui4SiQRLly7FnDlzEB0dDR0dHdSoUUN+RhcpLyMjIwwYMEB0DPoKgYGB8PPzg62tLTQ0NGBubo6uXbvCwMAAixcvRq9evURHpFx8+tt24cIFNG3aNMfPVKpUCb/++msRJxOHzSHUwMaNGzFv3jwsX74cY8aMwcaNG3H//n0sXrwYGzduxODBg0VHpDw8f/4cOjo6KF26tOgoRERE/ykDAwNERkbCwsIC5ubm2LFjB1q3bo3Y2FjUrVu3WO2PUSWZmZn466+/MGDAAJQvX150HKXBGSc1MHbsWOjo6GD27NlIT0/H0KFDUalSJaxatYpFkwooV66c6AiUD39/f/To0QNaWlrw9/fP87P29vZFlIoKon///vDx8YGBgQH69++f52e53Eu5ZWZm4syZM7h//z6GDh0KfX19PHnyBAYGBnzxpMRq1aqF27dvw8LCAg0aNMD69ethYWGBdevWoWLFiqLjUS5KlCgBNzc3zgh+gYWTmhg2bBiGDRuG9PR0pKamwtTUVHQk+kLjxo1x6tQpGBsbo1GjRnkeDhgWFlaEySg/ffv2RWJiIkxNTfPcBMvDHJWPoaGh/GfNwMAg30M5STnFxcWhe/fuiI+Px/v379G1a1fo6+tj6dKleP/+PdatWyc6IuXCxcUFCQkJAIC5c+eie/fu+Pvvv6GtrQ0fHx+x4ShPzZo1Q3h4eLatIMUZCyc18PbtW8hkMujq6kJXVxfPnz/HypUrYW1tjW7duomOR//HwcFBvpfCwcGBD3AqJCsrK8evSflt2bJF/jUf0lSXi4sLbG1tERERgTJlysjH+/Xrx46ISm748OHyr5s0aYK4uDjcunULVatWRdmyZQUmo/xMnDgRrq6uePToEZo0aZKtKUv9+vUFJROHe5zUQLdu3dC/f3+MHz8eKSkpqFWrFrS1tZGUlAQvLy9MmDBBdEQitbF161Z8//332RoKfPjwAbt27WJzDyXWqVMn7N+/X6EjFAC8fv0affv2RWBgoJhglK8yZcrg4sWLqFWrFvT19REREQErKys8ePAA1tbW3CdD9A1oaGQ/tUgikUAmkxXbFRaccVIDYWFhWLFiBQBg7969qFChAsLDw7Fv3z64u7uzcFJCVlZWuHLlisKbU+DjeUCNGzdGTEyMoGSUHycnJ3Tv3j3bctg3b97AycmJhZMSO3PmjLwN+efevXuHc+fOCUhEBZWVlZXjQ9qjR4+gr68vIBHlZfr06Zg/fz709PQwffr0PD/r5eVVRKmosGJjY0VHUDosnNRAenq6/A/HiRMn0L9/f2hoaKBFixaIi4sTnI5y8uDBgxwfAt6/f49Hjx4JSEQF9elN25cePXoEQ0NDAYkoP5GRkfKvb968icTERPn3UqkUx48fh5mZmYhoVEDdunXDypUr8ddffwH4+NY7NTUVc+fORc+ePQWnoy+Fh4cjIyND/jWpJu5tyo6FkxqoXr06Dh48iH79+iEgIADTpk0DADx79gwGBgaC09HnPu/IFhAQoPCgLZVKcerUKVhaWoqIRvn41NBDIpGgc+fOKFHi///6lEqliI2NRffu3QUmpNw0bNhQfu8+HTj9OR0dHfzxxx8CklFBLV++HHZ2drC2tsa7d+8wdOhQ3L17F2XLlsXOnTtFx6MvnD59OsevSfVs27YN69atQ2xsLIKDg2Fubo6VK1fC0tISDg4OouMVORZOasDd3R1Dhw7FtGnT0LlzZ7Rs2RLAx9mnRo0aCU5Hn/u8I9vIkSMVrmlpacHCwoInqSupT/fu2rVrsLOzU2h/rK2tDQsLCx7QqaRiY2Mhk8lgZWWFkJAQhSMAtLW1YWpqCk1NTYEJKT+VK1dGREQEdu3ahcjISKSmpmLMmDEYNmwYdHR0RMejPIwePRqrVq3KtqQyLS0NU6ZMwebNmwUlo/ysXbsW7u7umDp1KhYuXChfKWNkZISVK1cWy8KJzSHURGJiIhISEtCgQQP5Zr6QkBAYGBigdu3aAD4uJapUqVKOm/2oaFlaWiI0NDTbHidSblKpFNu3b0e3bt14/oiKycjIwA8//AB3d3fO6hIVIU1NTSQkJGTbF5qUlIQKFSogMzNTUDLKj7W1NRYtWoS+ffsqNGW5fv06OnTogKSkJNERixxnnNREhQoVUKFCBYWxZs2aKXxvbW2Na9euwcrKqiij0RcyMjJgZWWF5ORkFk4qRlNTEz/++COio6NFR6FC0tLSwoEDB+Du7i46Cn2FrVu35nmdTVmUz+vXryGTySCTyfDmzRuUKlVKfk0qleLo0aM8c1LJxcbG5rhyqWTJkkhLSxOQSDwWTsUIJxeVg5aWlsJmdVIt9erVQ0xMDGctVJCDgwMOHjwo3wdKqsPFxUXh+4yMDKSnp0NbWxu6urosnJSQkZGRfG9hzZo1s12XSCTw8PAQkIwKytLSEteuXcvWJOL48eOoU6eOoFRisXAiEmD48OHYtGkTlixZIjoKFdKCBQvg5uaG+fPn53ggIBuyKK8aNWrA09MTFy5cyPHeOTs7C0pG+Xn58mW2sbt372LChAmYMWOGgESUn9OnT0Mmk6FTp07Yt28fTExM5Ne0tbVhbm6OSpUqCUxI+Zk+fTomTZqEd+/eQSaTISQkBDt37sTixYuxceNG0fGE4B6nYuTz9akk1pQpU7B161bUqFEjxwc4nmuhvD7fI/h5W/LifCCgqshrllAikfD8NBUUGhqK4cOH49atW6KjUC7i4uJQpUoV7q9WUX///TfmzZuH+/fvAwAqVaoEDw8PjBkzRnAyMTjjRCTA9evX0bhxYwDAnTt3FK7ldEYQKQ+21lVdPMxR/ZQoUQJPnjwRHYPyYG5ujpSUFISEhODZs2fIyspSuM5llspt2LBhGDZsGNLT05Gamlrs96VxxqkYMTAwYHMIIiJSOZ+fgQd8nOFNSEjA6tWrUaVKFRw7dkxQMsrPoUOHMGzYMKSmpsLAwEDh5aBEIkFycrLAdESFw8KpGOFSPaL/Tnp6OuLj4/HhwweF8fr16wtKRAXx6NEj+Pv753jvuERWeX25zEsikaBcuXLo1KkTli9fzuMBlFjNmjXRs2dPLFq0CLq6uqLjUCFYWlrmuQqmOC5v5lI9NVDQw+Vu3rzJjZhKJDQ0FHv27MnxAW7//v2CUlF+nj9/Dicnp1zfcHOPk/I6deoU7O3tYWVlhVu3bqFevXp48OABZDKZfOksKacvl3eR6nj8+DGcnZ1ZNKmgqVOnKnyfkZGB8PBwHD9+vNg2ZeGMkxrg4XKqZ9euXXB0dISdnR1OnDiBbt264c6dO3j69Cn69euHLVu2iI5IuRg2bBji4uKwcuVKdOjQAQcOHMDTp0+xYMECLF++HL169RIdkXLRrFkz9OjRAx4eHvIZeFNTUwwbNgzdu3fHhAkTREekXEyfPr3An+XMoXLp378/Bg8ejEGDBomOQv+RNWvWIDQ0tFg+q3DGSYXxcDnVtWjRIqxYsQKTJk2Cvr4+Vq1aBUtLS/z4449ccqLkAgMD4efnB1tbW2hoaMDc3Bxdu3aFgYEBFi9ezMJJiUVHR2Pnzp0APjYVePv2LUqXLg1PT084ODiwcFJi4eHhCAsLQ2ZmJmrVqgXgY2MdTU1NhdlCNtdRPr169cKMGTNw8+ZN2NjYQEtLS+G6vb29oGT0tXr06IGff/6ZhROpFh4up7ru378vf8DW1tZGWloaJBIJpk2bhk6dOvG+KbG0tDT5CwljY2M8f/4cNWvWhI2NDcLCwgSno7zo6enJl8VWrFgR9+/fR926dQF8nKEn5dWnTx/o6+vD19cXxsbGAD6e7eTk5IS2bdvC1dVVcELKzbhx4wAAnp6e2a7xCAfVtHfvXoVzuYoTFk4qjIfLqS5jY2O8efMGAGBmZobr16/DxsYGKSkpSE9PF5yO8lKrVi3cvn0bFhYWaNCgAdavXw8LCwusW7eOs4VKrkWLFjh//jzq1KmDnj17wtXVFVFRUdi/fz9atGghOh7lYfny5Thx4oS8aAI+/h5dsGABunXrxsJJiXF/mupq1KhRtvMKExMT8fz5c/z5558Ck4nDwkmFtW/fHsDHs0l4uJxqadeuHU6ePAkbGxsMHDgQLi4uCAwMxMmTJ9G5c2fR8SgPLi4uSEhIAADMnTsX3bt3x99//w1tbW34+PiIDUd58vLyQmpqKgDAw8MDqamp2L17N2rUqMF9MUru9evXeP78ebbx58+fy19CkfJ79+6dwrYCUm59+/ZV+F5DQwPlypVDhw4dULt2bTGhBGNzCDXBw+VUS3JyMt69e4dKlSohKysLy5Ytw8WLF1GjRg3Mnj1b4a0qKbf09HTcunULVatWRdmyZUXHIVJLjo6OOHfuHJYvX45mzZoBAC5fvowZM2agbdu28PX1FZyQciOVSrFo0SKsW7cOT58+xZ07d2BlZYU5c+bAwsICY8aMER2RqMBYOKkBHi5HJManX5/ckK5aQkNDER0dDQCwtrZGkyZNBCei/KSnp8PNzQ2bN29GRkYGgI8NPsaMGYPffvsNenp6ghNSbjw9PeHr6wtPT0+MGzcO169fh5WVFXbv3o2VK1ciODhYdETKxevXrwv8WQMDg2+YRHmwcFIDPFxONUmlUhw4cEDhAc7BwQElSnAFrbLbtGkTVqxYgbt37wIAatSogalTp2Ls2LGCk1FeHj16hCFDhuDChQswMjIC8HG2vlWrVti1axcqV64sNiDlKy0tDffv3wcAVKtWjQWTCqhevTrWr1+Pzp07y48B+HSWWsuWLfHy5UvRESkXGhoa+b4YlMlkxarJB5/Q1AAPl1M9N27cgL29PRITE+WtdZcuXYpy5crh0KFDqFevnuCElBt3d3d4eXlhypQpaNmyJQAgODgY06ZNQ3x8fI6do0g5jB07FhkZGYiOjpb/3N2+fRtOTk4YO3Ysjh8/Ljgh5UdPTw/169cXHYMK4fHjx6hevXq28aysLPnsISmnLVu24KeffsKoUaMU/t75+vpi8eLFsLCwEBtQAM44qQEeLqd6WrZsiXLlymVrrTtq1Cg8f/4cFy9eFJyQclOuXDl4e3tjyJAhCuM7d+7ElClT2NZaieno6ODixYto1KiRwvjVq1fRtm1bdrQk+gaaNGmCadOmYfjw4QozTp6enjh58iTOnTsnOiLlonPnzhg7dmy2v3c7duzAX3/9hTNnzogJJhBnnNQAD5dTPdeuXUNoaGi21roLFy5E06ZNBSaj/GRkZMDW1jbbeJMmTZCZmSkgERVUlSpVcnzDLZVKeXQD0Tfi7u6OkSNH4vHjx8jKysL+/ftx+/ZtbN26FYcPHxYdj/IQHByMdevWZRu3tbUttkvT2b9aDYwbNw4PHz6Ep6cnBg4ciL59+8r/9evXT3Q8ykHNmjXx9OnTbOPPnj3LcUkDKY8RI0Zg7dq12cb/+usvDBs2TEAiKqjffvsNU6ZMQWhoqHwsNDQULi4u+P333wUmI1JfDg4OOHToEP7991/o6enB3d0d0dHROHToELp27So6HuWhSpUq2LBhQ7bxjRs3okqVKgISicelekQCHD16FDNnzsS8efPkB29eunQJnp6eWLJkCdq0aSP/bHHpVKMqpkyZgq1bt6JKlSrye3f58mXEx8fD0dFRYcaXZwMpF2NjY6SnpyMzM1PehOXT1182GWA3UiIq7o4ePYoBAwagevXqaN68OQAgJCQEd+/exb59+9CzZ0/BCYseCyc1w8PlVMPnhxV/6ljzZWvr4tapRlV07NixQJ+TSCQIDAz8xmmoMHx8fArcOn7kyJHfOA0RkfJ79OgR1q5dK+8AXKdOHYwfP54zTqS6eLic6jlz5kyBH+Dat2//jdMQqbfAwEC0b98empqaoqMQFQvGxsYF/hvH2V3VN3HiRHh6ehaLQ+BZOKkBHi6nOjZv3gx7e/ti8ctF3VStWhX29vZwcHBAx44ded6WCrGyskJKSgq6d+8OBwcH9OjRg0tgib4hX19f+dcvXrzAggULYGdnp9DSOiAgAHPmzMG0adNExaT/iIGBAa5duwYrKyvRUb45Fk5qgIfLqY5OnTrh4sWLaNy4MRwcHGBvb486deqIjkUFcPbsWfj7+8Pf3x/Pnz+HnZ0d7O3t0atXL/lhqqS8IiMj5fcvKioKbdq0kRfCVatWFR2PSG0NGDAAHTt2xOTJkxXGV69ejX///RcHDx4UE4z+M58/e6o7Fk5qQEdHB7du3YK5ubnC/7w3b95Es2bNkJqaKjoifebly5c4cuQI/P39cfz4cZQvX17+ANemTRuF/U+knG7cuAF/f3/4+fnh2rVraNWqFezt7WFvb18s/nCouidPnsiLqNOnT6NWrVry+5dTq3ki+nqlS5fGtWvXsnWMvXfvHho2bMhnFDVQnAonPqGpAWtr6xwPkNu7d2+2gx5JPGNjYwwfPhx79uxBUlIS/vjjD7x9+xbDhg2DqakpHB0dsXfvXqSlpYmOSrmoW7cufv75Z1y6dAmxsbEYMmQITp06hXr16qFevXo4cuSI6IiUh0qVKmH8+PE4evQokpKSMGfOHDx48ADdu3fHokWLRMcjUitlypSBn59ftnE/Pz+UKVNGQCKir8cZJzXg5+eHkSNH4ueff4anpyc8PDwUDpfjOQmqIzQ0VD6T8d1332HOnDmiI1EhpKenIyAgAPr6+ujSpYvoOFRIUqkUycnJKFeunOgoRGrDx8cHY8eORY8ePeQtrS9fvozjx49jw4YNGDVqlNiA9D8rTjNOLJzUxLlz5+Dp6YmIiAikpqaicePGcHd3R7du3URHo6+UkZGhcCYQKYfExERcvnwZiYmJAIAKFSqgefPmqFChguBklJekpCRs3rwZwcHBCveuZcuWcHJyYrFE9A1dvnwZ3t7eCi2tnZ2d5YUUqTYWTkT0zdy8eROrV6/O8QFuypQpbBahpNLS0vDjjz9i165dkEgkMDExAfCxla5MJsOQIUOwfv166OrqCk5KX7py5Qrs7Oygq6uLLl26oHz58gCAp0+f4tSpU/KZQu5vIiIqvAkTJmD+/PnFomMwCyc1MHbsWAwfPhwdOnQQHYXycezYMfTt2xeNGzeGnZ2dwgPcyZMncfXqVfj5+cHOzk5wUvrS2LFjERQUhD/++ANdunSRnwkklUpx6tQpTJkyBe3atcOGDRsEJ6UvtWjRAg0aNMC6deuynS0jk8kwfvx4REZG8ugGom/k/v372LJlC2JiYrBy5UqYmpri2LFjqFq1KurWrSs6HuXh3LlzWL9+Pe7fv4+9e/fCzMwM27Ztg6WlJdq0aSM6XpFj4aQGHBwcEBAQgHLlymHw4MEYNmwYGjZsKDoW5aBBgwZwcHCAp6dnjtfnzZuH/fv3IzIysoiTUX6MjY1x5MgRtGrVKsfrFy5cQO/evdn+Xwnp6OggPDwctWvXzvH6rVu30KhRI7x9+7aIkxGpv7Nnz6JHjx5o3bo1goKCEB0dDSsrKyxZsgShoaHYu3ev6IiUi3379mHEiBEYNmwYtm3bhps3b8LKygqrV6/G0aNHcfToUdERixy76qkBPz8/JCQkYM6cObhy5QqaNGmCunXrYtGiRXjw4IHoePSZO3fuYNiwYbleHzJkCO7evVuEiaigsrKyoK2tnet1bW1tZGVlFWEiKqgKFSogJCQk1+shISHy2V8i+m/99NNPWLBgAU6ePKnwO7RTp064dOmSwGSUnwULFmDdunXYsGGDwp7r1q1bIywsTGAycVg4qQljY2P88MMPOHPmDOLi4jBq1Chs27Yt27kJJJaFhUWeraqPHDkCc3PzIkxEBdW7d2/88MMPCA8Pz3YtPDwcEyZMQJ8+fQQko/y4ubnhhx9+gIuLC/z9/XH58mVcvnwZ/v7+cHFxwfjx4zFz5kzRMYnUUlRUFPr165dt3NTUFElJSQISUUHdvn0b7dq1yzZuaGiIlJSUog+kBEqIDkD/rYyMDISGhuLy5ct48OAB36IqGU9PTwwdOhRnzpzJcZP68ePHsWPHDsEpKSerV6/G0KFD0aRJExgbG8PU1BQA8OzZM6SkpMDOzg6rV68WnJJyMmnSJJQtWxYrVqzAn3/+CalUCgDQ1NREkyZN4OPjg0GDBglOSaSejIyMkJCQAEtLS4Xx8PBwmJmZCUpFBVGhQgXcu3cPFhYWCuPnz58vFh30csLCSU2cPn0aO3bswL59+5CVlYX+/fvj8OHD6NSpk+ho9JmBAwfCzMwM3t7eWL58ebauemfOnEHLli0Fp6ScGBsb49ixY4iOjsalS5ey3bvc9s+Qcvj+++/x/fffIyMjQ/6Wu2zZsmz5T/SNDR48GLNmzcI///wDiUSCrKwsXLhwAW5ubnB0dBQdj/Iwbtw4uLi4YPPmzZBIJHjy5AmCg4Ph5uZWbM+ZZHMINWBmZobk5GR0794dw4YNQ58+fVCyZEnRsYiIlNL79+8BgL8niYrAhw8fMGnSJPj4+EAqlaJEiRKQSqUYOnQofHx85B1KSfnIZDIsWrQIixcvRnp6OoCPvzfd3Nwwf/58wenEYOGkBjZs2ICBAwfCyMhIdBQqhFevXinMWhgaGgpORPn58OEDDh48mO0MrlatWsHBwSHP5hEk1smTJ7FixQoEBwfj9evXAAADAwO0bNkS06dPR5cuXQQnJFI/MpkMDx8+RLly5ZCUlISoqCikpqaiUaNGqFGjhuh4VEAfPnzAvXv3kJqaCmtra5QuXVp0JGFYOKmRe/fu4f79+2jXrh10dHQgk8mynVlC4m3cuBFeXl64ffs2AMjvU61ateDq6ooxY8YITkg5uXfvHuzs7PDkyRM0b95cYX/a5cuXUblyZRw7dowNWZSQr68vxo4di++++y7b+WknTpzA3r17sWnTJowYMUJwUiL1kpWVhVKlSuHGjRsslEgtsHBSAy9evMCgQYNw+vRpSCQS3L17F1ZWVhg9ejSMjY2xfPly0RHp//z222+YN28enJ2dc3yA8/b2xrx58+Dm5iY4KX2pa9eu0NPTw9atW2FgYKBw7fXr13B0dMTbt28REBAgKCHlpmbNmnBxccGkSZNyvP7nn39ixYoVPAqA6BuoW7cuNm3ahBYtWoiOQoXUsWPHPF/ABwYGFmEa5cDCSQ04Ojri2bNn2LhxI+rUqYOIiAhYWVkhICAA06dPx40bN0RHpP9jbm6O3377LdcOXrt378aMGTMQHx9fxMkoP7q6uggJCUG9evVyvB4VFYXmzZvL14GT8ihVqhQiIiJQq1atHK/fvn0bDRs25AG4RN/AoUOHsGzZMqxduzbX35+knKZNm6bwfUZGBq5du4br169j5MiRWLVqlaBk4rCrnho4ceIEAgICULlyZYXxGjVqIC4uTlAqysmzZ89gY2OT63UbGxuea6GkjIyM8ODBg1z/8D948ID7DJXUpzfey5Yty/H65s2bYW1tXcSpiIoHR0dHpKeno0GDBtDW1oaOjo7C9eTkZEHJKD8rVqzIcXzevHlITU0t4jTKgYWTGkhLS4Ourm628eTkZHaNUjJNmzbFkiVLsGnTJpQoofjjJ5VKsXTpUjRt2lRQOsrL2LFj4ejoiDlz5qBz587ZzuBasGABpkyZIjgl5WT58uXo3bs3jh8/nuP5aTExMXkeTE1EX2/lypWiI9B/bPjw4WjWrBl+//130VGKHJfqqYGePXuiSZMmmD9/PvT19REZGQlzc3MMHjwYWVlZ2Lt3r+iI9H8iIyNhZ2eHjIwMtGvXTuEBLigoCNra2jhx4gSXMyippUuXYtWqVUhMTJSv+5bJZKhQoQKmTp2KmTNnCk5IuXnw4AHWrl2b4xlc48ePz3bAIxER5Wzbtm2YNWsWnjx5IjpKkWPhpAauX7+Ozp07o3HjxggMDIS9vT1u3LiB5ORkXLhwAdWqVRMdkT7z5s0bbN++PccHuKFDh2ZrPEDKJyYmBk+fPgXw8d5ZWloKTkREpJyOHj0KTU1N2NnZKYyfOHECUqkUPXr0EJSM8tO/f3+F72UyGRISEhAaGoo5c+Zg7ty5gpKJw8JJTbx69QqrV69GREQEUlNT0bhxY0yaNAkVK1YUHY2ISClkZmbixo0b8hcWFStWRJ06daClpSU4GZH6ql+/PpYsWYKePXsqjB8/fhyzZs1CRESEoGSUHycnJ4XvNTQ0UK5cOXTq1AndunUTlEosFk7FyMSJE+Hp6YmyZcuKjlLsJSYm4vLlywoPcM2aNUOFChUEJ6O83Lx5E6tXr852AG7Lli0xefJkNhhQUllZWXB3d8eaNWvw6tUrhWuGhoaYPHkyPDw8oKGhISghkfrS0dFBdHR0tuWwDx48QN26dZGWliYmGNFXYHOIYmT79u1wc3Nj4SRQWloafvzxR+zatQsSiQQmJiYAPjbykMlkGDJkCNavX59jsw8S69ixY+jbty8aN24MBwcHhf1pJ0+eROPGjeHn55dtOQqJ99NPP8HHxwdLlizJ8fy0OXPm4MOHD1i6dKngpETqx9DQEDExMdkKp3v37kFPT09MKKKvxBmnYkRfX19+xhOJMXbsWAQFBeGPP/5Aly5doKmpCeBjR71Tp05hypQpaNeuHTZs2CA4KX2pQYMGcHBwgKenZ47X582bh/379yMyMrKIk1F+KlSoAF9f31yL2oCAADg6Osr3rRHRf+fHH39EcHAwDhw4IN9zfe/ePQwYMABNmzbFxo0bBSek3BgbG+d5AO7niktbeRZOxQgLJ/GMjY1x5MgRtGrVKsfrFy5cQO/evfHy5csiTkb50dHRwbVr13iIqgrS09PDpUuXcj1DLTIyEq1atSq255IQfUuvXr1C9+7dERoaKj9v8tGjR2jbti3279/P8++UmJeXFxYsWAA7Ozu0bNkSABAcHIyAgADMmTNHvmoGAEaOHCkqZpHiUj2iIpSVlQVtbe1cr2trayMrK6sIE1FBWVhY4MiRI7kWTkeOHIG5uXkRp6KC6NChA9zc3PD3339nW6qclJSEWbNmoUOHDmLCEak5Q0NDXLx4ESdPnkRERAR0dHRQv359tGvXTnQ0yseFCxfg6emJyZMny8ecnZ2xevVq/Pvvvzh48KC4cIJwxqkY4YyTeMOGDUN0dDQ2bdqERo0aKVwLDw/HuHHjULt2bWzfvl1QQsrNP//8g6FDh6JHjx45HqJ6/Phx7NixAwMGDBCclL708OFD9OzZE7du3YKNjY3CvYuKioK1tTUOHz6MKlWqCE5KVHzZ2Njg6NGj/DlUIqVLl8a1a9dQvXp1hfF79+6hYcOGxXKWnjNOREVo9erVGDp0KJo0aQJjY2OYmpoCAJ49e4aUlBTY2dlh9erVglNSTgYOHAgzMzN4e3tj+fLl2brqnTlzRr6UgZRLlSpVEBERgYCAAIXz05o1a4ZFixahW7du7KhHJNiDBw+QkZEhOgZ9pkyZMvDz84Orq6vCuJ+fH8qUKSMolViccSpGJkyYgPnz57OrnhKIjo7O8QDc2rVrC05GRERU9LgqRvn4+Phg7Nix6NGjB5o3bw4AuHz5Mo4fP44NGzZg1KhRYgMKwMJJTaSkpCAkJATPnj3LtkfG0dFRUCoi9SeTyZCVlSXvkEjKSSaT4cGDB6hSpQpKlCiBDx8+4MCBA3j//j169uzJF0pEgrFwUk6XL1+Gt7c3oqOjAQB16tSBs7OzvJAqblg4qYFDhw5h2LBhSE1NhYGBgULrSIlEUmxaRKqKFy9eIDIyEg0aNICJiQmSkpKwadMmvH//HgMHDkSdOnVER6QcZGZmYt68eTh37hw6dOgADw8P/Pbbb5g3bx4yMzMxePBgbNiwIc/mHyTG7du3YWdnh4cPH8LKygonTpzAwIEDcevWLchkMujq6uLixYuoUaOG6KhExRYLJ1IFLJzUQM2aNdGzZ08sWrSIB6cquZCQEHTr1g2vX7+GkZERTp48iYEDB6JEiRLIysrCkydPcP78eTRu3Fh0VPrCnDlzsGHDBgwbNgzHjx9Hu3btcOTIESxevBhSqRS//PILnJ2dMXPmTNFR6Qt9+/aFTCbDggULsHnzZgQEBKBmzZr4559/kJWVhYEDB8LQ0BDbtm0THZWo2GLhpBxev34NAwMD+dd5+fS54oSFkxrQ09NDVFQUf9mogK5du8LCwgJeXl5Yv349Vq1ahe7du8sPvB09ejRevnyJAwcOCE5KX6pWrRpWrVqF3r174969e6hVqxZ27NiB77//HgCwZ88ezJ8/H1FRUYKT0pdMTU1x4sQJNGzYEGlpadDX10dQUBDatGkDALh48SKGDBmCuLg4wUmJii8WTspBU1MTCQkJMDU1hYaGRo4H4MpkMkgkEkilUgEJxWJXPTVgZ2eH0NBQ/rJRAVevXoW3tzf09fXh4uKCWbNmYdy4cfLrkydPhr29vcCElJsnT56gQYMGAIDq1atDW1tb/j0ANG3alA/eSio1NVV+UKOenh709PRQsWJF+fUqVarg6dOnouIREYD169fLjwogcQIDA+W/L0+fPi04jfJh4aQGevXqhRkzZuDmzZuwsbGBlpaWwnU+iCuPDx8+QEdHBwCgpaUFXV1dhU3pZcuWxYsXL0TFozwYGhoiJSVFfsZI48aNoa+vL7/+/v37HN/MkXiVKlVCfHw8qlatCgBYtmyZ/CgAAHj+/DmMjY1FxSNSe1euXMHp06dzbGDl5eUFABg6dKiIaPSF9u3b5/g1fcTCSQ18mrHw9PTMdq24TqUqqypVqiAmJgYWFhYAgF27dim8+U5ISGB3LyVlbW2NsLAw2NjYAPh4ovrnoqKi2FxASXXp0gW3bt2SL82bMGGCwvUTJ05wXyHRN7Jo0SLMnj0btWrVQvny5bM1sCLlxq7NirjHiagIeXh4oFatWhg8eHCO13/99VfcunUL+/btK+JklJ87d+5AS0sLlpaWOV7fsWMHSpQogUGDBhVxMvpfxcbGolSpUgovMYjov1G+fHksXbq0WJ75o+rYtTk7Fk5ESiQ9PR2ampooWbKk6ChERET/s4oVKyIoKIgz8iqIXZuz0xAdgP4bZ8+eRZ8+fVC9enVUr14d9vb2OHfunOhYVEi6urosmoi+ofj4eCQkJCiMJSQkID4+XlAiIvU2bdo0rFmzRnQM+gqPHz+Gs7Mzi6bPcMZJDWzfvh1OTk7o378/WrduDeDj/osDBw7Ax8eHGy6VVFBQEHR1dWFraysfCw0NRXp6Otq1aycwGeWnY8eOMDc3h4+Pj3xs5MiRePjwIQIDA8UFo3xpaGigdu3auHnzpnysTp06uHPnDveDEn0DWVlZ6NWrF+7cuQNra+tsDaz2798vKBnlp3///hg8eDCXoH+GzSHUwMKFC7Fs2TJMmzZNPubs7AwvLy/Mnz+fhZOS6tChQ7YHuBEjRvABTgVYWFhk2w9jZmYGDQ1O4iu706dPZ3t7unXrVqSnpwtKRKTenJ2dcfr0aXTs2BFlypRhQwgVwq7N2XHGSQ2ULFkSN27cQPXq1RXG7927h3r16uHdu3eCklFe4uLioKWlhUqVKsnHnjx5goyMDJibmwtMRkRE9N/Q19fHrl270KtXL9FRqJDyehlYXLs28/WoGqhSpQpOnTqVbfzff/+VnzlDysfc3FyhaAI+njfDokl18KWE6snMzMS///6L9evX482bNwA+vrBITU0VnIxIPZmYmKBatWqiY9BXyMrKyvVfcSyaAC7VUwuurq5wdnbGtWvX0KpVKwAf9zj5+Phg1apVgtNRblJSUrB3717cv38fM2bMgImJCcLCwlC+fHmYmZmJjke5yMrKwsKFC7Fu3To8ffoUd+7cgZWVFebMmQMLCwuMGTNGdETKRVxcHLp37474+Hi8f/8eXbt2hb6+PpYuXYr3799j3bp1oiMSqZ158+Zh7ty52LJlC5sMqJiczgf9RCKRYM6cOUWYRjlwqZ6aOHDgAJYvX47o6GgAHzc7z5gxAw4ODoKTUU4iIyPRpUsXGBoa4sGDB7h9+zasrKwwe/ZsxMfHY+vWraIjUi48PT3h6+sLT09PjBs3DtevX4eVlRV2796NlStXIjg4WHREykXfvn2hr6+PTZs2oUyZMoiIiICVlRXOnDmDcePG4e7du6IjEqmdRo0a4f79+5DJZLCwsMi2TyYsLExQMspPo0aNFL7PyMhAbGwsSpQogWrVqhXLe8cZJzXRr18/9OvXT3QMKqDp06dj1KhRWLZsGfT19eXjPXv2ZDMPJbd161b89ddf6Ny5M8aPHy8fb9CgAW7duiUwGeXn3LlzuHjxIrS1tRXGLSws8PjxY0GpiNRb3759RUegrxQeHp5t7PXr1xg1alSxfeZk4UQkwJUrV7B+/fps42ZmZkhMTBSQiArq8ePH2RqxAB+X8GVkZAhIRAWV27r8R48eKbzAIKL/zty5c0VHoP+QgYEBPDw80KdPH4wYMUJ0nCLH5hAqysTEBElJSQAAY2NjmJiY5PqPlE/JkiXx+vXrbON37txBuXLlBCSigrK2ts7xcOm9e/dmW9ZAyqVbt25YuXKl/HuJRILU1FTMnTsXPXv2FBeMiEiFvHr1Cq9evRIdQwjOOKmoFStWyN+QrlixguciqBh7e3t4enpiz549AD4+wMXHx2PWrFkYMGCA4HSUF3d3d4wcORKPHz9GVlYW9u/fj9u3b2Pr1q04fPiw6HiUh+XLl8POzg7W1tZ49+4dhg4dirt376Js2bLYuXOn6HhEakkqlWLFihXYs2cP4uPj8eHDB4XrycnJgpJRfry9vRW+l8lkSEhIwLZt29CjRw9BqcRicwgiAV69eoXvvvsOoaGhePPmDSpVqoTExES0bNkSR48ehZ6enuiIlIdz587B09MTERERSE1NRePGjeHu7o5u3bqJjkb5yMzMxK5duxAZGSm/d8OGDYOOjo7oaERqyd3dHRs3boSrqytmz56NX3/9FQ8ePMDBgwfh7u4OZ2dn0REpF5aWlgrfa2hooFy5cujUqRN+/vnnYrnEmYWTGtDU1ERCQgJMTU0Vxl+8eAFTU9Ni22tfFZw/f17hAa5Lly6iIxEREf1nqlWrBm9vb/Tq1Qv6+vq4du2afOzSpUvYsWOH6IhEBcalemogt9r3/fv32bpHkXJp06YN2rRpIzoGfYXQ0FB5+39ra2s0adJEcCIqiNu3b+OPP/5QOLph8uTJqF27tuBkROopMTERNjY2AIDSpUvL98b07t27WJ4DRKqNhZMK+7T2VCKRYOPGjShdurT8mlQqRVBQEB8GlNipU6ewYsUKhQe4qVOnctZJyT169AhDhgzBhQsXYGRkBODjYcatWrXCrl27ULlyZbEBKVf79u3D4MGDYWtri5YtWwIALl26BBsbG+zatYv7C4m+gcqVKyMhIQFVq1ZFtWrVcOLECTRu3BhXrlxByZIlRccjKhQu1VNhn9aexsXFoXLlytDU1JRf09bWhoWFBTw9PdG8eXNRESkXf/75J1xcXPDdd98pPMDt3bsXK1aswKRJkwQnpNx0794dKSkp8PX1Ra1atQB8nMVwcnKCgYEBjh8/Ljgh5aZatWoYNmwYPD09Fcbnzp2L7du34/79+4KSEamvn376CQYGBvjll1+we/duDB8+HBYWFoiPj8e0adOwZMkS0RGJCoyFkxro2LEj9u/fD2NjY9FRqIAqV66Mn376CZMnT1YYX7NmDRYtWsTDOJWYjo4OLl68mK31+NWrV9G2bVukp6cLSkb50dXVRWRkZLZzuO7evYsGDRrw3hEVgeDgYAQHB6NGjRro06eP6DhEhcKlemrg9OnToiNQIaWkpKB79+7Zxrt164ZZs2YJSEQFVaVKlRwPupVKpahUqZKARFRQHTp0wLlz57IVTufPn0fbtm0FpSIqXlq2bClfaUGkalg4qYlHjx7B398/xzMSvLy8BKWi3Njb2+PAgQOYMWOGwrifnx969+4tKBUVxG+//YYpU6ZgzZo1sLW1BfCxUYSLiwt+//13wenoS/7+/vKv7e3tMWvWLFy9ehUtWrQA8HGJ7D///AMPDw9REYnU3rZt27Bu3TrExsYiODgY5ubmWLlyJSwtLeHg4CA6HlGBcameGjh16hTs7e1hZWWFW7duoV69enjw4AFkMhkaN26MwMBA0REJigfJvX79Gr///jtat26tsMfpwoUL8rMuSHkYGxsrHDKdlpaGzMxMlCjx8d3Tp6/19PR4mKOS0dDQKNDnJBIJj24g+gbWrl0Ld3d3TJ06FQsXLsT169dhZWUFHx8f+Pr6ctUMqRQWTmqgWbNm6NGjBzw8PKCvr4+IiAiYmppi2LBh6N69OyZMmCA6IiH7QXK5kUgkiImJ+cZpqDB8fX0L/NmRI0d+wyRERKrF2toaixYtQt++feXPKFZWVrh+/To6dOiApKQk0RGJCoyFkxr4/EA5Y2NjnD9/HnXr1kVERAQcHBzw4MED0RGJiIioGNLR0cGtW7dgbm6uUDjdvXsX9evXx9u3b0VHJCqwgq1hIKWmp6cn39dUsWJFhZa6fJNDRJS30NBQBAUFiY5BpJYsLS1x7dq1bOPHjx9HnTp1ij4Q0f+AzSHUQIsWLXD+/HnUqVMHPXv2hKurK6KiorB//375BmhSDX5+fnj16hUcHR1FR6FC6tKlC2JiYrjMUgWNGDECd+7c4R4nom9g+vTpmDRpEt69eweZTIaQkBDs3LkTixcvxsaNG0XHIyoULtVTAzExMUhNTUX9+vWRlpYGV1dXXLx4ETVq1ICXlxfMzc1FR6QCql27Nu7evcsHOBW0evVqvHjxAnPnzhUdhQrpyZMnyMjI4O9Kom/k77//xrx58+QrYipVqgQPDw+MGTNGcDKiwmHhRERERET/uczMTOzYsQN2dnYoX7480tPTkZqaClNTU9HRiL4K9zgREf0PXr9+jYMHDyI6Olp0FMpHWFgYoqKi5N/7+fmhb9+++OWXX7Kdf0dE/7sSJUpg/PjxePfuHQBAV1eXRROpNBZOasDY2BgmJibZ/pUpUwZmZmZo3749tmzZIjomfeb48eM4f/68/Ps1a9agYcOGGDp0KF6+fCkwGeVn0KBBWL16NQDg7du3sLW1xaBBg1C/fn3s27dPcDrKy48//og7d+4A+LjEefDgwdDV1cU///yDmTNnCk5HpJ6aNWuG8PBw0TGI/hMsnNSAu7s7NDQ00KtXL3h4eMDDwwO9evWChoYGJk2ahJo1a2LChAnYsGGD6Kj0f2bMmIHXr18DAKKiouDq6oqePXsiNjYW06dPF5yO8hIUFIS2bdsCAA4cOACZTIaUlBR4e3tjwYIFgtNRXu7cuYOGDRsCAP755x+0a9cOO3bsgI+PD4teom9k4sSJcHV1xerVqxEcHIzIyEiFf0SqhF311MD58+exYMECjB8/XmF8/fr1OHHiBPbt24f69evD29sb48aNE5SSPhcbGwtra2sAwL59+9C7d28sWrQIYWFh6Nmzp+B0lJdXr17BxMQEwMeZwwEDBkBXVxe9evXCjBkzBKejvMhkMmRlZQEA/v33X/Tu3RsAUKVKFR7dQPSNDB48GADg7OwsH5NIJJDJZJBIJGyGRCqFM05qICAgAF26dMk23rlzZwQEBAAAevbsyTbJSkRbWxvp6ekAPj7AdevWDQBgYmIin4ki5VSlShUEBwcjLS0Nx48fl9+7ly9folSpUoLTUV5sbW2xYMECbNu2DWfPnkWvXr0AfHyRUb58ecHpiNRTbGxstn8xMTHy/xKpEhZOasDExASHDh3KNn7o0CH5m/G0tDTo6+sXdTTKRZs2bTB9+nTMnz8fISEh8ge4O3fuoHLlyoLTUV6mTp2KYcOGoXLlyqhUqRI6dOgA4OMSPhsbG7HhKE8rV65EWFgYJk+ejF9//RXVq1cHAOzduxetWrUSnI5IPcXFxcHMzAzm5uYK/8zMzBAXFyc6HlGhsB25GtiwYQMmTJiAnj17olmzZgCAK1eu4OjRo1i3bh3GjBmD5cuXIyQkBLt37xaclgAgPj4eEydOxMOHD+Hs7Cw/y2LatGmQSqXw9vYWnJDyEhoaiocPH6Jr164oXbo0AODIkSMwMjJC69atBaejwnr37h00NTWhpaUlOgqR2tHU1ERCQkK2bnovXryAqakpl+qRSmHhpCYuXLiA1atX4/bt2wCAWrVqYcqUKXyLSkRERMJoaGjg6dOnKFeunML4nTt3YGtry+XppFJYOBEVkcL8cTAwMPiGSaiwCtPp0MvL6xsmocIyNjaGRCIp0GeTk5O/cRqi4qN///4APp6X1r17d5QsWVJ+TSqVIjIyErVq1cLx48dFRSQqNHbVUxP379/Hli1bEBMTg5UrV8LU1BTHjh1D1apVUbduXdHxCICRkVGBH+C4dEG5fHkGSVhYGDIzM1GrVi0AH9+campqokmTJiLiUR5Wrlwp//rFixdYsGAB7Ozs0LJlSwBAcHAwAgICMGfOHEEJidSToaEhgI/dLPX19aGjoyO/pq2tjRYtWrDTL6kczjipgbNnz6JHjx5o3bo1goKCEB0dDSsrKyxZsgShoaHYu3ev6IiEj/fpkwcPHuCnn37CqFGjFB7gfH19sXjxYowcOVJUTMqHl5cXzpw5A19fXxgbGwP42FHPyckJbdu2haurq+CElJsBAwagY8eOmDx5ssL46tWr8e+//+LgwYNighGpsZkzZ2LevHnQ1dUF8PHv38GDB1GnTh3Y2dkJTkdUOCyc1EDLli0xcOBATJ8+Hfr6+oiIiICVlRVCQkLQv39/PHr0SHRE+kLnzp0xduxYDBkyRGF8x44d+Ouvv3DmzBkxwShfZmZmOHHiRLaZ3OvXr6Nbt2548uSJoGSUn9KlS+PatWvybnqf3Lt3Dw0bNkRqaqqgZETqq2vXrhgwYADGjx+PlJQU1K5dG1paWkhKSoKXlxcmTJggOiJRgbEduRqIiopCv379so2bmpryUEclFRwcDFtb22zjtra2CAkJEZCICur169d4/vx5tvHnz5/jzZs3AhJRQZUpUwZ+fn7Zxv38/FCmTBkBiYjUX3h4ONq2bQvgY+v/8uXLIy4uDlu3bmUHWVI53OOkBoyMjJCQkABLS0uF8fDwcJiZmQlKRXmpUqUKNmzYgGXLlimMb9y4EVWqVBGUigqiX79+cHJywvLly+Xt/y9fvowZM2bIN0OTcvLw8MDYsWNx5swZNG/eHMDHe3f8+HFs2LBBcDoi9ZSeni4/R/LEiRPo378/NDQ00KJFC57jRCqHhZMaGDx4MGbNmoV//vkHEokEWVlZuHDhAtzc3ODo6Cg6HuVgxYoVGDBgAI4dOyZ/gAsJCcHdu3exb98+wekoL+vWrYObmxuGDh2KjIwMAECJEiUwZswY/Pbbb4LTUV5GjRqFOnXqwNvbG/v37wcA1KlTB+fPn5f/HBLRf6t69eo4ePAg+vXrh4CAAEybNg0A8OzZM3aQJZXDPU5q4MOHD5g0aRJ8fHwglUpRokQJSKVSDB06FD4+PtDU1BQdkXLw6NEj/Pnnn7h16xaAjw9w48eP54yTikhLS8P9+/cBANWqVYOenp7gREREymfv3r0YOnQopFIpOnfujBMnTgAAFi9ejKCgIBw7dkxwQqKCY+Gk4mQyGR4+fIhy5cohKSkJUVFRSE1NRaNGjVCjRg3R8YiIlEpWVhbu3buHZ8+eISsrS+Fau3btBKUiUm+JiYlISEhAgwYNoKHxcXt9SEgIDAwMULt2bcHpiAqOhZOKy8rKQqlSpXDjxg0WSiomJSUFISEhOT7AcYml8kpLS8OSJUtw6tSpHO9dTEyMoGSUn0uXLmHo0KGIi4vDl3/6JBIJz08jIqI8cY+TitPQ0ECNGjXw4sULFk4q5NChQxg2bBhSU1NhYGCgcDCuRCJh4aTExo4di7Nnz2LEiBGoWLFigQ81JvHGjx8PW1tbHDlyhPeOiIgKjTNOauDQoUNYtmwZ1q5di3r16omOQwVQs2ZN9OzZE4sWLZIfCkiqwcjICEeOHEHr1q1FR6FC0tPTQ0RERLZznIiIiAqCM05qwNHREenp6WjQoAG0tbWho6OjcD05OVlQMsrN48eP4ezszKJJBRkbG8PExER0DPoKzZs3x71791g4ERHRV2HhpAZWrlwpOgIVkp2dHUJDQ2FlZSU6ChXS/Pnz4e7uDl9fXxa+KmbKlClwdXVFYmIibGxsoKWlpXC9fv36gpIREZEq4FI9IgE2bdoET09PODk55fgAZ29vLygZ5adRo0a4f/8+ZDIZLCwsst27sLAwQckoP5+6eX1OIpFAJpOxOQQREeWLhZMaeP36dY7jEokEJUuWhLa2dhEnovzk9AD3CR/glJuHh0ee1+fOnVtESaiw4uLi8rxubm5eREmIiEgVsXBSAxoaGnl2h6pcuTJGjRqFuXPn5vnATkREREREOeMeJzXg4+ODX3/9FaNGjUKzZs0AfDxYztfXF7Nnz8bz58/x+++/o2TJkvjll18EpyUiKjr+/v7o0aMHtLS04O/vn+dnuUSWiIjywhknNdC5c2f8+OOPGDRokML4nj17sH79epw6dQrbtm3DwoULcevWLUEpydvbGz/88ANKlSoFb2/vPD/r7OxcRKmoIExMTHDnzh2ULVsWxsbGec7wsoulctHQ0EBiYiJMTU25RJaIiP4nLJzUgI6ODiIjI7MdgHv37l00aNAA6enpiI2NRd26dZGeni4oJVlaWiI0NBRlypSBpaVlrp+TSCSIiYkpwmSUH19fXwwePBglS5aEr69vnp8dOXJkEaUiIiKiosTCSQ3UrFkT/fv3x5IlSxTGf/rpJxw4cAC3b99GaGgoHBwc8PjxY0EpiYiIiIhUF/c4qYHff/8dAwcOxLFjx9C0aVMAQGhoKG7duoW9e/cCAK5cuYLvv/9eZEwitfLs2TM8e/YMWVlZCuM8C0i5XblyBadPn87x3nl5eQlKRUREqoAzTmoiNjYWf/31F27fvg0AqFWrFn788UdYWFiIDUY5kslk2Lt3b64PcPv37xeUjPJz9epVjBw5EtHR0fjy1yf3ySi3RYsWYfbs2ahVqxbKly+vsFdNIpEgMDBQYDoiIlJ2LJyIBHBxccH69evRsWPHbA9wALBlyxZBySg/DRo0QLVq1TBr1qwc7x3PAlJe5cuXx9KlSzFq1CjRUYiISAWxcFIDkZGROY5LJBKUKlUKVatWRcmSJYs4FeXFxMQE27dvR8+ePUVHoULS19dHeHg4qlevLjoKFVLFihURFBSUrZEOERFRQXCPkxpo2LCh/K33pzr487fgWlpa+P7777F+/XqUKlVKSEZSZGhoCCsrK9Ex6Ct07twZERERLJxU0LRp07BmzRqsXLlSdBQiIlJBnHFSA35+fpg1axZmzJihcADu8uXLMXfuXGRmZuKnn37C999/j99//11wWgI+trc+fvw4Nm/eDB0dHdFxqBCSkpIwcuRINGvWDPXq1YOWlpbCdR6iqryysrLQq1cv3LlzB9bW1tnuHfcWEhFRXjjjpAYWLlyIVatWwc7OTj5mY2ODypUrY86cOQgJCYGenh5cXV1ZOCmJQYMGYefOnTA1NYWFhUW2B7iwsDBBySg/wcHBuHDhAo4dO5btGptDKDdnZ2ecPn0aHTt2RJkyZfI8yJiIiOhLLJzUQFRUVI4b0s3NzREVFQXg43K+hISEoo5GuRg5ciSuXr2K4cOH59hggJTXlClTMHz4cMyZMwfly5cXHYcKwdfXF/v27UOvXr1ERyEiIhXEwkkN1K5dG0uWLMFff/0FbW1tAEBGRgaWLFmC2rVrAwAeP37MhzwlcuTIEQQEBKBNmzaio1AhvXjxAtOmTePPkwoyMTFBtWrVRMcgIiIVxcJJDaxZswb29vaoXLmy/PDNqKgoSKVSHD58GAAQExODiRMnioxJn6lSpQoMDAxEx6Cv0L9/f5w+fZoP4Cpo3rx5mDt3LrZs2QJdXV3RcYiISMWwOYSaePPmDf7++2/cuXMHwMcDcIcOHQp9fX3BySgnR44cwR9//IF169bxkGIVs3DhQqxcuRK9evWCjY1Ntv1pzs7OgpJRfho1aoT79+9DJpNxbyERERUaCyc1cvPmTcTHx+PDhw8K4+zypXyMjY2Rnp6OzMxM6OrqZnuAS05OFpSM8mNpaZnrNYlEgpiYmCJMQ4Xh4eGR5/W5c+cWURIiIlJFLJzUQExMDPr164eoqChIJBLIZDKFZgPs8qV8fH1987w+cuTIIkpCRERERAXBwkkN9OnTB5qamti4cSMsLS1x+fJlJCcny9uPt23bVnREIiIiIiKVxsJJDZQtWxaBgYGoX78+DA0NERISglq1aiEwMBCurq4IDw8XHZEAvH79Wt4Q4vXr13l+lo0jlMv06dMxf/586OnpYfr06Xl+1svLq4hSUUGYmJjgzp07KFu2LIyNjfNs/c8lskRElBd21VMDUqlU3gSibNmyePLkCWrVqgVzc3Pcvn1bcDr6xNjYGAkJCTA1NYWRkVGOD3CflllyeaVyCQ8PR0ZGhvzr3PA8LuWzYsUK+e/HlStXig1DREQqjYWTGqhXrx4iIiJgaWmJ5s2bY9myZdDW1sZff/0FKysr0fHo/wQGBsLExAQAcPr0acFpqDA+v1+8d6rl8/2C3DtIRET/Cy7VUwMBAQFIS0tD//79ce/ePfTu3Rt37txBmTJlsHv3bnTq1El0RCIiIiIilcbCSU0lJyfnu56fiP47f/75J5KSkuDu7i46ChVSly5dEBMTw1byRESUJw3RAejbMDExYdGkgurUqQNNTU3RMegr7Nu3Dz4+PqJj0Ffo168fl/EREVG+OONEpEQOHjyIV69e8SGOiIiISMlwxolIifTt25dFk5ILCgpCZmZmtvHMzEwEBQUJSEQFNXr0aLx58ybbeFpaGkaPHi0gERERqRLOOBEJ0KlTJ+zfvx9GRkYK469fv0bfvn0RGBgoJhjlS1NTU95W/nMvXryAqakpW8krsdzuXVJSEipUqJBjQUxERPQJ25ETCXDmzBl8+PAh2/i7d+9w7tw5AYmooD6dtfWlFy9eQE9PT0Aiys/r168hk8kgk8nw5s0blCpVSn5NKpXi6NGj2YopIiKiL7FwIipCkZGR8q9v3ryJxMRE+fdSqRTHjx+HmZmZiGiUj/79+wP4eMjtqFGjULJkSfk1qVSKyMhItGrVSlQ8ysOnA6clEglq1qyZ7bpEIoGHh4eAZEREpEpYOBEVoYYNG8of4HI6X0tHRwd//PGHgGSUH0NDQwAfZ5z09fWho6Mjv6atrY0WLVpg3LhxouJRHk6fPg2ZTIZOnTph37598oOogY/3ztzcHJUqVRKYkIiIVAH3OBEVobi4OMhkMlhZWSEkJATlypWTX9PW1oapqSnbkSs5Dw8PuLm5cVmeCoqLi0OVKlWgocG+SEREVHgsnIiIvsKzZ89w+/ZtAECtWrW4R0ZFvHz5Eps2bUJ0dDQAwNraGk5OTgqzUERERDlh4UQkyO3bt/HHH3/IH+Dq1KmDyZMno3bt2oKTUV7evHmDiRMnYteuXfIOepqamvj++++xZs0a+ZI+Uj5BQUHo06cPDA0NYWtrCwC4evUqUlJScOjQIbRr105wQiIiUmZcr0AkwL59+1CvXj1cvXoVDRo0QIMGDRAWFgYbGxvs27dPdDzKw9ixY3H58mUcPnwYKSkpSElJweHDhxEaGooff/xRdDzKw6RJk/D9998jNjYW+/fvx/79+xETE4PBgwdj0qRJouMREZGS44wTkQDVqlXDsGHD4OnpqTA+d+5cbN++Hffv3xeUjPKjp6eHgIAAtGnTRmH83Llz6N69O9LS0gQlo/zo6Ojg2rVrqFWrlsL47du30bBhQ7x9+1ZQMiIiUgWccSISICEhAY6OjtnGhw8fjoSEBAGJqKDKlCmT43I8Q0NDGBsbC0hEBdW4cWP50tjPRUdHo0GDBgISERGRKmE7ciIBOnTogHPnzqF69eoK4+fPn0fbtm0FpaKCmD17NqZPn45t27ahQoUKAIDExETMmDEDc+bMEZyOvvT52WnOzs5wcXHBvXv30KJFCwDApUuXsGbNGixZskRURCIiUhFcqkdURPz9/eVfP3nyBO7u7hg0aJDCA9w///wDDw8PjB8/XlRMykGjRo0gkUjk39+9exfv379H1apVAQDx8fEoWbIkatSogbCwMFExKQcaGhqQSCTI70+dRCKRN/sgIiLKCQsnoiJS0LNj+ACnfDw8PAr82blz537DJFRYcXFxBf6subn5N0xCRESqjoUTERERERFRPrjHiYiIipWbN28iPj4eHz58UBi3t7cXlIiIiFQBCyciQdLS0nD27NkcH+CcnZ0FpaL8SKVSrFixAnv27Mnx3iUnJwtKRvmJiYlBv379EBUVpbDv6dP+NS6RJSKivLBwIhIgPDwcPXv2RHp6OtLS0mBiYoKkpCTo6urC1NSUhZMS8/DwwMaNG+Hq6orZs2fj119/xYMHD3Dw4EG4u7uLjkd5cHFxgaWlJU6dOgVLS0uEhITgxYsXcHV1xe+//y46HhERKTnucSISoEOHDqhZsybWrVsHQ0NDREREQEtLC8OHD4eLiwv69+8vOiLlolq1avD29kavXr2gr6+Pa9euyccuXbqEHTt2iI5IuShbtiwCAwNRv359GBoaIiQkBLVq1UJgYCBcXV0RHh4uOiIRESkxHoBLJMC1a9fg6uoKDQ0NaGpq4v3796hSpQqWLVuGX375RXQ8ykNiYiJsbGwAAKVLl8arV68AAL1798aRI0dERqN8SKVS6OvrA/hYRD158gTAx256t2/fFhmNiIhUAAsnIgG0tLTk7clNTU0RHx8PADA0NMTDhw9FRqN8VK5cGQkJCQA+zj6dOHECAHDlyhWULFlSZDTKR7169RAREQEAaN68OZYtW4YLFy7A09MTVlZWgtMREZGy4x4nIgEaNWqEK1euoEaNGmjfvj3c3d2RlJSEbdu2oV69eqLjUR769euHU6dOoXnz5pgyZQqGDx+OTZs2IT4+HtOmTRMdj/Iwe/ZspKWlAQA8PT3Ru3dvtG3bFmXKlMHu3bsFpyMiImXHPU5EAoSGhuLNmzfo2LEjnj17BkdHR1y8eBE1atTA5s2b0aBBA9ERqYCCg4MRHByMGjVqoE+fPqLjUCElJyfD2NhY3lmPiIgoNyyciIiIiIiI8sGlekRE+fD39y/wZ3mIqnIpTIfK/fv3f8MkRESk6lg4ERWRRo0aFXg5UFhY2DdOQ4XRt2/fAn1OIpHwEFUlY2hoKDoCERGpCRZOREWkoA/fpHyysrJER6CvtGXLFtERiIhITXCPExERERERUT4440RElA9vb2/88MMPKFWqFLy9vfP8rLOzcxGlooJo3LgxTp06BWNj43yXy3KJLBER5YWFE1ERMTExwZ07d1C2bNl82x8nJycXYTLKz4oVKzBs2DCUKlUKK1asyPVzEomEhZOScXBwkB9MzOWyRET0v+BSPaIi4uvri8GDB6NkyZLw9fXN87MjR44solREREREVBAsnIiIiIiIiPKhIToAEZE68PPzw9atW0XHoK8wcuRIdOrUSXQMIiJSciyciJRIly5dYGVlJToGfYVZs2bByclJdAz6CmZmZjA3Nxcdg4iIlByX6hEpkTVr1iApKQlz584VHYWIiIiIPsPCiYiIiIiIKB9cqkdEVAhZWVm5jsfHxxdxGiqohIQEbN++HUePHsWHDx8UrqWlpcHT01NQMiIiUhUsnIiKWEREBBYsWIA///wTSUlJCtdev36N0aNHC0pGeXn9+jUGDRoEPT09lC9fHu7u7pBKpfLrz58/h6WlpcCElJsrV67A2toakyZNwnfffYe6devixo0b8uupqanw8PAQmJCIiFQBCyeiInTixAk0a9YMu3btwtKlS1G7dm2cPn1afv3t27f5nvFEYsyZMwcRERHYtm0bFi5ciK1bt8LBwUFh9oIrn5XTL7/8gn79+uHly5d4+vQpunbtivbt2yM8PFx0NCIiUiHc40RUhFq1aoWOHTti4cKFkMlk+O233zB//nz8888/6N69O54+fYpKlSopzGSQcjA3N4evry86dOgAAEhKSkKvXr1gZGQEf39/pKSk8N4pKRMTE1y6dAk1a9aUjy1ZsgTLli1DQEAAqlatyntHRET54owTURG6ceOGfCmeRCLBzJkzsX79enz33Xc4fPiw4HSUl+fPnyu0rC5btiz+/fdfvHnzBj179kR6errAdJSfd+/eKXz/008/4ZdffkG3bt1w8eJFQamIiEiVlBAdgKg4KVmyJFJSUhTGhg4dCg0NDXz//fdYvny5mGCUr6pVqyI6OlphH5O+vj5OnDiBbt26oV+/fgLTUV7q1auHixcvon79+grjbm5uyMrKwpAhQwQlIyIiVcIZJ6Ii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e/Zs/qrFr125cqXAxaqwLcOHD1d6erokafz48QoLC9OSJUvyOyICAFAUuuoBBixevFjdu3dX+fLlrcazs7O1dOlS9e7d21AyFKd169b67//+b0VERMjV1VVJSUmqWbOmIiIi9MMPP2jt2rWmI6KE6IgIALgbFE6AAfb29kpPTy+wcnH+/Hl5eXnRFtmGxcfH64knnlCvXr0UHR2t8PBwHThwQNu3b9eWLVvUtGlT0xFRjOzsbB09elS1atVSuXJsvAAAlAxnnAAD8vLyCt3WdeLECbm7uxtIhJJ69NFHlZiYqBs3bqhx48Zav369vLy8tGPHDoomG0dHRADA/eBHbUApCgoKksVikcViUUhIiNVPu3NycnT06FGFhYUZTIiiXL9+XeHh4Ro7dqzmz59vOg7u0q87Iv7631loaKj+85//aPTo0QbTAQBsHYUTUIo6d+4sSdq3b586dOigihUr5s85OjrK19dXXbt2NZQOxXFwcNDy5cs1duxY01FwDz7//HN9+umneuSRR+iICAC4axROQCkaP368JMnX11fdu3e3ugeoMJ988ok6deokFxeX0oiHEujcubM+//xzjRgxwnQU3CU6IgIA7geFE2BAnz59SvRceHi4/vrXv8rPz+93ToSSqlOnjqKiorRt2zY1bdq0QFE7bNgwQ8lQnGbNmunLL79URESEJOUXSwsWLFCLFi1MRgMAlAF01QNsmKurqxITEymcbEjNmjXvOGexWJSamlqKaXA36IgIALgfFE6ADaNwAn5bqampmjp1qhITE5WZmang4GC9/PLLaty4seloAAAbRztyALgLUVFRysrKKjB+9epVRUVFGUiEkrh+/br69+8vi8Wi+fPn69tvv9WBAwf08ccfUzQBAEqEFSfAhrHiZHu4vLjscnd31759+4rcbgkAwJ2w4gQAd+FOlxcnJibK09PTQCKU1K2OiAAA3Au66gE2rEaNGnJwcDAdA5IqVaqUf3lx3bp1rYqnnJwcZWZmavDgwQYTojh0RAQA3A+26gFACSxatEh5eXnq37+/Zs6cKXd39/y5W5cX09LattEREQBwPyicgFJya8WiJC5cuPA7p8G92rJli1q1aqVy5ViwBwDgz4T/+YFSMnPmzPz3z58/r0mTJqlDhw75qxQ7duzQunXrNHbsWEMJURKurq46ePBgfie2lStX6sMPP5S/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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import io\n", - "\n", - "# Your CSV data as a string\n", - "csv_data = \"\"\"isomorphic_check_done,query_is_unique,0\n", - "query_is_unique,stream_credentials_retrieved,0.006\n", - "stream_credentials_retrieved,unique_query_registered,0.008\n", - "unique_query_registered,file_streamer_started for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.001\n", - "file_streamer_started for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,file_streamer_ended for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.417\n", - "file_streamer_ended for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.192\n", - "event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.6760000000000002\n", - "event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,aggregation_event_sent_to_client,0.198\n", - "aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.527\n", - "\"\"\"\n", - "\n", - "# Create a DataFrame from the CSV data\n", - "df = pd.read_csv(io.StringIO(csv_data), header=None, names=[\"Message 1\", \"Message 2\", \"Time Difference (seconds)\"])\n", - "\n", - "# Pivot the DataFrame to get a suitable format for stacked bar plot\n", - "pivot_df = df.pivot(index=\"Message 2\", columns=\"Message 1\", values=\"Time Difference (seconds)\").fillna(0)\n", - "\n", - "# Create a stacked bar plot\n", - "ax = pivot_df.plot(kind=\"bar\", stacked=True, figsize=(10, 6))\n", - "\n", - "# Set labels and title\n", - "ax.set_ylabel(\"Time Difference (seconds)\")\n", - "plt.title(\"Stacked Bar Plot of Time Differences\")\n", - "\n", - "# Show the plot\n", - "plt.show()\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/logs/processCSV.ts b/logs/processCSV.ts deleted file mode 100644 index c9a0a28..0000000 --- a/logs/processCSV.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as fs from 'fs'; - -// Read the CSV file -const csvFilePath = 'module_processing_time.csv'; -const csvContent = fs.readFileSync(csvFilePath, 'utf-8'); - -// Parse the CSV content into rows -const rows = csvContent.trim().split('\n').map(row => row.split(',')); - -// Initialize a Map to store cumulative time differences -const cumulativeTimes = new Map(); - -// Iterate through each row of the CSV -for (const row of rows) { - // Extract values from the row - const message1 = row[0].trim(); - const message2 = row[1].trim(); - const timeDifference = parseFloat(row[2]); - - // Create a key for the Map based on Message 1 and Message 2 - const key = `${message1},${message2}`; - - // Check if the key exists in the Map - if (cumulativeTimes.has(key)) { - // If the key exists, add the time difference to the existing value - cumulativeTimes.set(key, cumulativeTimes.get(key)! + timeDifference); - } else { - // If the key doesn't exist, set the time difference as the initial value - cumulativeTimes.set(key, timeDifference); - } -} - -// Prepare the content for the new CSV file -const newCsvContent = Array.from(cumulativeTimes.entries()).map(([key, value]) => `${key},${value}`).join('\n'); - -// Write the content to a new CSV file -const newCsvFilePath = 'new-file.csv'; -fs.writeFileSync(newCsvFilePath, newCsvContent, 'utf-8'); - -console.log(`Cumulative times written to ${newCsvFilePath}`); diff --git a/logs/processLog.ts b/logs/processLog.ts deleted file mode 100644 index 4d796ab..0000000 --- a/logs/processLog.ts +++ /dev/null @@ -1,74 +0,0 @@ -import * as fs from 'fs'; -import * as readline from 'readline'; -import * as csv from 'csv-writer'; - -interface LogEntry { - msg: string; - time: string; -} - -interface TimeDiffData { - msg1: string; - time1: string; - msg2: string; - time2: string; - time_difference_seconds: number; -} - -/** - * - * @param logFilePath - * @param outputCsvPath - */ -function processLog(logFilePath: string, outputCsvPath: string): void { - const logs: LogEntry[] = []; - const lineReader = readline.createInterface({ - input: fs.createReadStream(logFilePath), - }); - - lineReader.on('line', (line: string) => { - const logEntry: LogEntry = JSON.parse(line); - logs.push(logEntry); - }); - - lineReader.on('close', () => { - // Sort logs by time - logs.sort((a, b) => new Date(a.time).getTime() - new Date(b.time).getTime()); - - const timeDiffData: TimeDiffData[] = []; - - for (let i = 1; i < logs.length; i++) { - const time1 = new Date(logs[i - 1].time); - const time2 = new Date(logs[i].time); - const timeDiff = (time2.getTime() - time1.getTime()) / 1000; // Convert milliseconds to seconds - - // Add relevant information to the timeDiffData array - timeDiffData.push({ - msg1: logs[i - 1].msg, - time1: logs[i - 1].time, - msg2: logs[i].msg, - time2: logs[i].time, - time_difference_seconds: timeDiff, - }); - } - - // Write the time differences to a CSV file - const csvWriter = csv.createObjectCsvWriter({ - path: outputCsvPath, - header: [ - { id: 'msg1', title: 'Message 1' }, - { id: 'msg2', title: 'Message 2' }, - { id: 'time_difference_seconds', title: 'Time Difference (seconds)' }, - ], - }); - - csvWriter.writeRecords(timeDiffData) - .then(() => console.log('CSV file written successfully')) - .catch((err) => console.error(err)); - }); -} - -const logFilePath = './aggregation.log'; -const outputCsvPath = './module_processing_time.csv'; - -processLog(logFilePath, outputCsvPath); diff --git a/module_processing_time.csv b/module_processing_time.csv deleted file mode 100644 index b6669f6..0000000 --- a/module_processing_time.csv +++ /dev/null @@ -1,45 +0,0 @@ -Message 1,Message 2,Time Difference (seconds) -http_server_started,isomorphic_check_done,7.277 -isomorphic_check_done,query_is_unique,0 -query_is_unique,stream_credentials_retrieved,0.006 -stream_credentials_retrieved,unique_query_registered,0.008 -unique_query_registered,file_streamer_started for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.001 -file_streamer_started for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,file_streamer_ended for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.417 -file_streamer_ended for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.192 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.034 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.043 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.038 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.03 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.028 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.028 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.034 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.034 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.036 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.039 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.039 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.029 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.091 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.03 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.029 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.032 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.029 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.028 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,0.025 -event_added_to_rsp_engine for http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/,aggregation_event_sent_to_client,0.198 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.037 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.028 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.016 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.018 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.017 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.015 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.011 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.017 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.264 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.01 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.008 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.046 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.007 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.024 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.004 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.003 -aggregation_event_sent_to_client,aggregation_event_sent_to_client,0.002 diff --git a/package-lock.json b/package-lock.json index f681108..1fcfbe0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@treecg/ldes-snapshot": "^0.1.1", "@treecg/versionawareldesinldp": "^0.3.0", "@types/luxon": "^3.4.1", + "buffer": "^6.0.3", "bunyan": "^1.8.15", "cors": "^2.8.5", "css-auth-login": "^1.0.8", @@ -21,6 +22,7 @@ "csv-writer": "^1.6.0", "express": "^4.18.2", "luxon": "^3.4.4", + "mock-socket": "^9.3.1", "perf_hooks": "^0.0.1", "rate-limited-ldp-communication": "^1.0.5", "rdf-isomorphic": "^1.3.1", @@ -37,7 +39,10 @@ "@types/node-fetch": "^2.6.0", "@types/websocket": "^1.0.6", "@typescript-eslint/parser": "^6.21.0", + "esdoc": "^1.1.0", + "esdoc-standard-plugin": "^1.0.0", "eslint": "^8.56.0", + "eslint-plugin-jest": "^27.8.0", "eslint-plugin-jsdoc": "^48.0.6", "jest": "^29.3.1", "ldfetch": "^1.2.8", @@ -69,12 +74,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -82,30 +87,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -130,12 +135,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.3", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -145,14 +150,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -277,9 +282,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -295,32 +300,32 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -332,9 +337,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -521,9 +526,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -532,47 +537,56 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -624,12 +638,12 @@ } }, "node_modules/@comunica/actor-abstract-path": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-abstract-path/-/actor-abstract-path-2.10.0.tgz", - "integrity": "sha512-cfVzA4inMufpFcLIlwMCFhRFAzxPvoJPwEd4NTr0k9VLMFLL070bUEEa03uFf6VC2dXiEgB1dZ51QTTj6FPX0g==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-abstract-path/-/actor-abstract-path-2.10.1.tgz", + "integrity": "sha512-+k1ltuUuIyn4iUm5oRMObyt2zhu68h7ymzxuKU4ezATlgwfwj6EM7/3W2n2/gxjg9tcFMr5GC6aNnFQmq3Iuig==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", @@ -670,12 +684,12 @@ } }, "node_modules/@comunica/actor-dereference-http": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-dereference-http/-/actor-dereference-http-2.10.0.tgz", - "integrity": "sha512-q+sJDjiyO/pwY9OwfzK6lS/gROhaqwFgWQNEjz1IuXLalqcFOjIiYqBuzhKLbtcFmXM+cnqWS2ZBtSFD4JLDhg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-dereference-http/-/actor-dereference-http-2.10.2.tgz", + "integrity": "sha512-gdDo83W1TAgD2jx0kVbzZKzzt++L4Y4fbyTOH3duy6vx1EMGGZlNCp6I1uguepKEjNX4N0zhAcZzdJcv8A3XMA==", "dependencies": { "@comunica/bus-dereference": "^2.10.0", - "@comunica/bus-http": "^2.10.0", + "@comunica/bus-http": "^2.10.2", "@comunica/core": "^2.10.0", "cross-fetch": "^4.0.0", "relative-to-absolute-iri": "^1.0.7", @@ -781,11 +795,11 @@ } }, "node_modules/@comunica/actor-http-fetch": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-http-fetch/-/actor-http-fetch-2.10.0.tgz", - "integrity": "sha512-4rcRFQ7HQ1qCNNnlSYl1gE58M2AsJZsUg7CoKT2NM2TvvnB1A4KaRQVfM185t9dhrbs595bIcA8WUUVIY+ofCw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-http-fetch/-/actor-http-fetch-2.10.2.tgz", + "integrity": "sha512-siHGx0TMVNb2gXvOroq0B3JE6uuS+4s+MsDkntqdBNVigwVYqLpNSKEaL5is8pputFfohJfDQY06lAHbfDNEcw==", "dependencies": { - "@comunica/bus-http": "^2.10.0", + "@comunica/bus-http": "^2.10.2", "@comunica/context-entries": "^2.10.0", "@comunica/mediatortype-time": "^2.10.0", "abort-controller": "^3.0.0", @@ -793,22 +807,22 @@ } }, "node_modules/@comunica/actor-http-proxy": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-http-proxy/-/actor-http-proxy-2.10.0.tgz", - "integrity": "sha512-WpwjGRZcIPcnR8OVumrlmLPfYR5livQsUbOPqmYFDxjI+xDfuOYvCPc/uLyYyBpMH10dejmaRWeCUsIguZz5ZQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-http-proxy/-/actor-http-proxy-2.10.2.tgz", + "integrity": "sha512-3yUF8BCh4nwq8J6NRILEsyNrQNStkE9ggJ7hYwRfA1XcMgz1pANNaWJ2P2TEKH1jNinr23bL3JeuUZCm9Kz9dA==", "dependencies": { - "@comunica/bus-http": "^2.10.0", + "@comunica/bus-http": "^2.10.2", "@comunica/context-entries": "^2.10.0", "@comunica/mediatortype-time": "^2.10.0", "@comunica/types": "^2.10.0" } }, "node_modules/@comunica/actor-http-wayback": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-http-wayback/-/actor-http-wayback-2.10.0.tgz", - "integrity": "sha512-dwSTkXgXhWrVeBURJWvRrdRnPiCa0ywhSq58+UPE+6w6y4MgHH3v1Ee7SuC3zVl39vLx1i0LtiyA8Oi1qqRGBg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-http-wayback/-/actor-http-wayback-2.10.2.tgz", + "integrity": "sha512-wjYNXRrJvMqt9paO3HawyM+O5/14ofSHFuMAwGr/UyZQ5pCSFkY0YPd+qp9y8C4xvypPgsvT3PtiRyKgjD4FWw==", "dependencies": { - "@comunica/bus-http": "^2.10.0", + "@comunica/bus-http": "^2.10.2", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", "cross-fetch": "^4.0.0", @@ -816,16 +830,16 @@ } }, "node_modules/@comunica/actor-init-query": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-init-query/-/actor-init-query-2.10.0.tgz", - "integrity": "sha512-YKazN0RIpRXWuFK2YYEWE1XJSKvFIsdoUH//8BakbGbDoewrXYF0rMRRfaHMZdxl83rqM/M5cQ+kQqfhX2A4mQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-init-query/-/actor-init-query-2.10.2.tgz", + "integrity": "sha512-7A4bXdKCjXRdUThvMOOyg+U17DPeBAsyDYz1SA8F4lPUR06NapcG5TmZF+YWUTN/2EG5fZPUnD3etKuPXreGUw==", "dependencies": { - "@comunica/actor-http-proxy": "^2.10.0", + "@comunica/actor-http-proxy": "^2.10.2", "@comunica/bus-context-preprocess": "^2.10.0", "@comunica/bus-http-invalidate": "^2.10.0", "@comunica/bus-init": "^2.10.0", "@comunica/bus-optimize-query-operation": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/bus-query-parse": "^2.10.0", "@comunica/bus-query-result-serialize": "^2.10.0", "@comunica/context-entries": "^2.10.0", @@ -890,33 +904,33 @@ } }, "node_modules/@comunica/actor-query-operation-ask": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-ask/-/actor-query-operation-ask-2.10.0.tgz", - "integrity": "sha512-3VxOBLa9W8D76S0UJ8kvEsBv58uu2uDcOurxdPrcP7rFP2+NJRcR7U4U6173CBZ7JOF3kz6iOX2CJQfTncTSDQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-ask/-/actor-query-operation-ask-2.10.1.tgz", + "integrity": "sha512-7oktqE4fkMhi6Hs9XCcwwoZRsEismVqJZ5wp9lXXOPaxnHEiFyj5gb/B6baCstoCvCt6LcU8fVvfHSitbFCpeQ==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-bgp-join": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-bgp-join/-/actor-query-operation-bgp-join-2.10.0.tgz", - "integrity": "sha512-U/ZMvuhhCQYFFqqp4m0Ww5hoj/qcxPnlskh8O0TMgSVk4ozkhYE5wbpXRvFN1DyqkFTvMqOm/FbnoJbVPOw8wg==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-bgp-join/-/actor-query-operation-bgp-join-2.10.1.tgz", + "integrity": "sha512-eNpnvgFyKlZEHkMzubYL8ndADSsAQH4rwXvh22CGnf0FwyndHr6TEpmE6j77m9vXiSJ/lda0U3Zv4vIXvtREOw==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-construct": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-construct/-/actor-query-operation-construct-2.10.0.tgz", - "integrity": "sha512-7boEkt3MHlfHe5hxDJzolrSps+uCFvIZPWRiSQ1EJhT4el8WES9kWhveo8guJuMMHanVLC42FfHwUA+xF879RA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-construct/-/actor-query-operation-construct-2.10.1.tgz", + "integrity": "sha512-S+Nt1+1psv01QRnfytZjiog2NBNHIbjr7XIv+MO3p6aVmLCoZ6lmjxSGNdbX+EmcGr7tbbafXK5z3zRM+ke8Mw==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*", @@ -927,12 +941,12 @@ } }, "node_modules/@comunica/actor-query-operation-describe-subject": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-describe-subject/-/actor-query-operation-describe-subject-2.10.0.tgz", - "integrity": "sha512-hN/kY1C9P9xwo4p+LAqVme70spr+MIyojzf6sh0kYHyA+Ea57QS8cX4diWU3LYJXcHg5Eqxq/9M8bgThORctcA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-describe-subject/-/actor-query-operation-describe-subject-2.10.1.tgz", + "integrity": "sha512-E8i0M6haJ5iZVeHMn5PbvA4G+l87mcZKqIxVpYAnJVpD667F74Dkx3IMbk+ohRmyRmnkOEmztUrjeyixHHzUEQ==", "dependencies": { - "@comunica/actor-query-operation-union": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/actor-query-operation-union": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "asynciterator": "^3.8.1", @@ -941,24 +955,24 @@ } }, "node_modules/@comunica/actor-query-operation-distinct-hash": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-distinct-hash/-/actor-query-operation-distinct-hash-2.10.0.tgz", - "integrity": "sha512-KxMhQbc0sSexlORdAdOe20juVHruWHWsPDMnImj8vkIU4RheVq5H+jz7sQcDPGCH0jBL6UJUA2wo/n9PNhMoFw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-distinct-hash/-/actor-query-operation-distinct-hash-2.10.1.tgz", + "integrity": "sha512-exvJbgcJ0Pe4EGbLJD5LuGpvaGcFeckCxwB5pyd9OewNke+tLLP7nbEjB8KFEPpCO9LE7zt4faB1HvpJdEHQKQ==", "dependencies": { "@comunica/bus-hash-bindings": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-extend": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-extend/-/actor-query-operation-extend-2.10.0.tgz", - "integrity": "sha512-db3qX4bf9xgSd/s65ZTjiQJDxVJ6pnCBQBdI/qIgoR2e24z/+maNkvbp2g6WWdks82q6/yJhd33EzVjjJ/bOKA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-extend/-/actor-query-operation-extend-2.10.1.tgz", + "integrity": "sha512-wkZxUfDu8T5lXD+OFLItmjjbnEBqtv0z8pxVKgI/gX8mOeu5KcPWLH0dJODTWoIzIYrJhV25FmCgBks1rt6K8w==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/expression-evaluator": "^2.10.0", "@comunica/types": "^2.10.0", @@ -966,12 +980,12 @@ } }, "node_modules/@comunica/actor-query-operation-filter-sparqlee": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-filter-sparqlee/-/actor-query-operation-filter-sparqlee-2.10.0.tgz", - "integrity": "sha512-TK2CAcceJQFpleksSGGsVbIM+NepBTcfKex1r9TjbJ8LXsyB5pdNCd+iRGdyzDFGGuha80gkoYUVfis2z/1lsA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-filter-sparqlee/-/actor-query-operation-filter-sparqlee-2.10.1.tgz", + "integrity": "sha512-w2PnDNnlf+9B947ZdeSs7NpW9qGJjRiuODZYwhh0e6cx89GPDhEDVuJwawF6VP3m/oLcgXOAdif0Wwo3d8KNAA==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/expression-evaluator": "^2.10.0", "@comunica/types": "^2.10.0", @@ -979,11 +993,11 @@ } }, "node_modules/@comunica/actor-query-operation-from-quad": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-from-quad/-/actor-query-operation-from-quad-2.10.0.tgz", - "integrity": "sha512-SoSwY2M83JudywsiaK7KqUCbeFdwhrD7sInu+35SiLOCUY24cFImyuwAVGCzujuawJlDROfV/fp2vAz9wcn01w==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-from-quad/-/actor-query-operation-from-quad-2.10.1.tgz", + "integrity": "sha512-7D4R8ONNJJPzoRu96dwIToOEk6/3O/T26FRzCqQKrbjFHNkX2v92KA/SiDzNz59VmDNWjYF1rsV31Ade6J89MA==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*", @@ -991,13 +1005,13 @@ } }, "node_modules/@comunica/actor-query-operation-group": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-group/-/actor-query-operation-group-2.10.0.tgz", - "integrity": "sha512-epiCodZm1573luWbw3sN3ELniPhVRz/8Gu7Y1tLFE2ogEWtwQIAR7YtsnrGFlrG95ZxOiFEUldjy1g4TpvciVQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-group/-/actor-query-operation-group-2.10.1.tgz", + "integrity": "sha512-Od5s9Vb6uDPzXa6OAUC1WSMF96spNPJI2Zqf0Ixejw4zCNevOK/VwHivYfF0vHIUZxjRrOl3Al1ZU9L8n5Wxlw==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", "@comunica/bus-hash-bindings": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/expression-evaluator": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1008,24 +1022,24 @@ } }, "node_modules/@comunica/actor-query-operation-join": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-join/-/actor-query-operation-join-2.10.0.tgz", - "integrity": "sha512-xO+fgRqZIf/O4+Jn97cp00PbZ5gPoYrXKL00K+V7/fKS9cBIsEqMMyV0qXIPAM3Zxuj7QBJiqLxW/JvtpjjqSQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-join/-/actor-query-operation-join-2.10.1.tgz", + "integrity": "sha512-CGed1nSPvKsM8rvj/4KFME0lLnzlDMMEU+xGczu+BZW4FK+Z6RyBtHIUmy8SgFvNP1GXz83q8KnoecF5z8IpjA==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-leftjoin": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-leftjoin/-/actor-query-operation-leftjoin-2.10.0.tgz", - "integrity": "sha512-Q8Omkn3FB6kx9h40PHv+lX639SH9PcR1eEAJazIWvnA2ilSgy0IsZWDnTQFfWtR1SrIyGJVg9GaxzxAY5QflZw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-leftjoin/-/actor-query-operation-leftjoin-2.10.1.tgz", + "integrity": "sha512-j0RwdoiV2WsCQnxcSa//m5FZ+ZHDRBm6ObsgpqS44WxzpV8rIB6Dq/3UxGgE7D2vK400JaiiHa3dFiHTwDF18w==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/expression-evaluator": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1033,24 +1047,24 @@ } }, "node_modules/@comunica/actor-query-operation-minus": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-minus/-/actor-query-operation-minus-2.10.0.tgz", - "integrity": "sha512-2e/1kGrT/bgfNf6k8wLMhn13dK3XzRWMNSvjXOTFtvbPC3/xc8WJ9hYWZ1LEyaAufNBck3nWFqsvyuhYox/7UA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-minus/-/actor-query-operation-minus-2.10.1.tgz", + "integrity": "sha512-rUvHbc5/EUWMSJUgOEtxabCJ9IT9YThuG0FhcQk+BGRPGmsv2oz8uri5urKgCjfVXMH/09hRZksiDMqrmkQmZw==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-nop": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-nop/-/actor-query-operation-nop-2.10.0.tgz", - "integrity": "sha512-uI2lk5NNKJ/yOUmIuuCTMlv2N9XUqh7AgoLU+Nwg7cgN+Bi71SNVYatYi7v32C8NNAbC28Tqt35ww71k5eLOHg==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-nop/-/actor-query-operation-nop-2.10.1.tgz", + "integrity": "sha512-l/Z8Uuoq3AlSoxkgYjrP7O7Xc9h8Y3ZOh0f7UKCuAST3U5vPQ3k1YJckrRtdli8s0NHptN9TfZjwviEHuYbDFQ==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/metadata": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1059,11 +1073,11 @@ } }, "node_modules/@comunica/actor-query-operation-orderby-sparqlee": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-orderby-sparqlee/-/actor-query-operation-orderby-sparqlee-2.10.0.tgz", - "integrity": "sha512-EJsHAaAspedG5ZSk/Dx8Xtrn9JSnQVuelRIVxtTnVLfIkCO59N/gvE1FBrenof583PQEzZOmxaweSuEyeCnhgQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-orderby-sparqlee/-/actor-query-operation-orderby-sparqlee-2.10.1.tgz", + "integrity": "sha512-8D2JmCsBtqJC29zfiaAXNzZdsKybhDFo2F8iTHul3nQHxBC2CeKDrBnY70B/HpbWxkDE+pwMfSTEFc/CvNZN6A==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/expression-evaluator": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1072,84 +1086,84 @@ } }, "node_modules/@comunica/actor-query-operation-path-alt": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-alt/-/actor-query-operation-path-alt-2.10.0.tgz", - "integrity": "sha512-vDDfR4VX8r6iCqoeBfwYB1Y+Ljypw/fJe+6Qj0ZwfuvCllmmNwNASAUKPraEjZXpBEGr3RW2BSPBPhOdN50Wzw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-alt/-/actor-query-operation-path-alt-2.10.1.tgz", + "integrity": "sha512-y1AHtkibThqHve79wAriXqrZ6hdLBhcdwyOpVqqEhY19a32P97Xv58bOwOkNeLguYdn/5CFlCTHz6dnzxUIoXg==", "dependencies": { - "@comunica/actor-abstract-path": "^2.10.0", - "@comunica/actor-query-operation-union": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/actor-abstract-path": "^2.10.1", + "@comunica/actor-query-operation-union": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/types": "^2.10.0", "asynciterator": "^3.8.1", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-path-inv": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-inv/-/actor-query-operation-path-inv-2.10.0.tgz", - "integrity": "sha512-m2ilqayHTt4io4+0nuaW6c9KjbyXltHQbIqlvaRJS0ZAkJLoZhiSbbOtff83W/RmezaafikdNt0ELVJuxhbTYg==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-inv/-/actor-query-operation-path-inv-2.10.1.tgz", + "integrity": "sha512-pd30Ug7bOAZ5amfA3I6v+cpitlDn2i5fE1BA006LYJISCAHSfKEgLmU2Q4ZPbwi4s1A8WKKLV7Q389Ru3Xtziw==", "dependencies": { - "@comunica/actor-abstract-path": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/actor-abstract-path": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-path-link": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-link/-/actor-query-operation-path-link-2.10.0.tgz", - "integrity": "sha512-jtc9AWO826Qq2GWYRv4r8T1AD/BulWHrUFTD5znxV4Z8WoULv3MbCtIZIt/ckTaFBTzNCfbJaFkX3FjJGFSdvQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-link/-/actor-query-operation-path-link-2.10.1.tgz", + "integrity": "sha512-akujCHvCLmxaZ3gw9b1odDcqqAQnbbr9E8dTWLZyMJ4Mei8q/FmfWTF5MjGuQOas4UmQ3mm6gcqAKRZnJqlXNg==", "dependencies": { - "@comunica/actor-abstract-path": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/actor-abstract-path": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-path-nps": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-nps/-/actor-query-operation-path-nps-2.10.0.tgz", - "integrity": "sha512-Xthe3I1CbEY8GcYgRaZOD4waIdE0Hrl8+uEO3CEpDLYPm0Ppt/oieV6ZktwhRccnoFCkNrK0lWtq6KbtqnbDTg==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-nps/-/actor-query-operation-path-nps-2.10.1.tgz", + "integrity": "sha512-5X3EUzn6Cygz94gNn1XWQQUZVp+de59sw8/rxPQqgwzdi1Y1O9zrLv+/7GqMJoLz6MHmDSgsceTIY4eC1qmmOQ==", "dependencies": { - "@comunica/actor-abstract-path": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/actor-abstract-path": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-path-one-or-more": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-one-or-more/-/actor-query-operation-path-one-or-more-2.10.0.tgz", - "integrity": "sha512-EyTLkwvp1xe9Kw3LRP5W93rgyKjzsJ8KdTo/zd2WYqII5B90NID91k5hR//FTB/GR1a0Brqyq69cSbqcA0gRTQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-one-or-more/-/actor-query-operation-path-one-or-more-2.10.1.tgz", + "integrity": "sha512-SkQeKESQqZOlzuMIsipcZ3ni7YfeyYMZCOtxC01HFbeyq+SDVbyfYUZ4Dd9uAi/g3InyzJRfou4csxHS8g7sHw==", "dependencies": { - "@comunica/actor-abstract-path": "^2.10.0", - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/actor-abstract-path": "^2.10.1", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/types": "^2.10.0", "asynciterator": "^3.8.1", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-path-seq": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-seq/-/actor-query-operation-path-seq-2.10.0.tgz", - "integrity": "sha512-vBxmaT96abaaPtGNsedEMHSv0iRRqTlFhy5pI/k6MnyD8d6Y8jPAvhWrxNHCNIctPdb/y4N9liGkNoaZYmSptw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-seq/-/actor-query-operation-path-seq-2.10.1.tgz", + "integrity": "sha512-8TYLdVYaq9oMd9cuLFay78103bOfvygQU/C8NtPdLI9kkRWFsBatvaKmykHOHQAvaLgNhniOlrIJNEpepZGnAQ==", "dependencies": { - "@comunica/actor-abstract-path": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/actor-abstract-path": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-path-zero-or-more": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-zero-or-more/-/actor-query-operation-path-zero-or-more-2.10.0.tgz", - "integrity": "sha512-+esvBhyji/+0hHOTtupDYIYzKdja5u7qE5kObJrGV4jhcJBpR4npOrkcA3cptN2jGe4+5/ePmWpWdZc+OEjv+w==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-zero-or-more/-/actor-query-operation-path-zero-or-more-2.10.1.tgz", + "integrity": "sha512-DtqBSw4LV1KI3q1YYAwgXlWrz1PO4EUpe/bVri0UB3JSQnxjBMHuJlHn2crC9Z93tmizneXxfvtWlLSXRrehsw==", "dependencies": { - "@comunica/actor-abstract-path": "^2.10.0", - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/actor-abstract-path": "^2.10.1", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/types": "^2.10.0", "asynciterator": "^3.8.1", "rdf-string": "^1.6.1", @@ -1157,13 +1171,13 @@ } }, "node_modules/@comunica/actor-query-operation-path-zero-or-one": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-zero-or-one/-/actor-query-operation-path-zero-or-one-2.10.0.tgz", - "integrity": "sha512-W338CAj8RFFve6UYm43nlWXlRhnZCa6ASVvggnMxJ49g68QOkaWpjbUqP3+lOSLYuSxyp0GK6zBmdrGzP4/e+w==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-path-zero-or-one/-/actor-query-operation-path-zero-or-one-2.10.1.tgz", + "integrity": "sha512-qePX+7iW5DXDwaYO210y7jhSU32Zk82S5UHuLLvd4q4HS1Z7j8e4KhukbeZKzQmOsO8S5JOHHM9vwvsOc3GPlw==", "dependencies": { - "@comunica/actor-abstract-path": "^2.10.0", - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/actor-abstract-path": "^2.10.1", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/metadata": "^2.10.0", "@comunica/types": "^2.10.0", "asynciterator": "^3.8.1", @@ -1171,11 +1185,11 @@ } }, "node_modules/@comunica/actor-query-operation-project": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-project/-/actor-query-operation-project-2.10.0.tgz", - "integrity": "sha512-u7z/2njFQC+GqI3/SYthYgG69Wr3PzlIR/7GkelIXNYQW4RAkwGyfIBvC6fgncnVsyhXHBkI/iS5tE1L8HmboA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-project/-/actor-query-operation-project-2.10.1.tgz", + "integrity": "sha512-KAaPl4GFIQMWR8I8OoJroktGssPKGbEEJHyGzTuYXrmJrcXgknOxf5IUSVJNpaFfS6dshT6nqW+ciT+wRzz0Tg==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/data-factory": "^2.7.0", "@comunica/types": "^2.10.0", @@ -1185,12 +1199,12 @@ } }, "node_modules/@comunica/actor-query-operation-quadpattern": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-quadpattern/-/actor-query-operation-quadpattern-2.10.0.tgz", - "integrity": "sha512-XSJ+hu5DqDUl/NhRYAuKdbG7iGBkK+QpHBpClb/x2DXwqIDdAw2Yh0iYhSObEHVu1rhDjjp9W7gx6SZqo3c0og==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-quadpattern/-/actor-query-operation-quadpattern-2.10.1.tgz", + "integrity": "sha512-RZj1TXW+VDU4aYJVnSzgs8q0340e+YUeGLtoY9sl0Xzc8YNaIus4nXRUz/KfOXDknxm1q+a4Bof4yHNgXtb1Hw==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/bus-rdf-resolve-quad-pattern": "^2.10.0", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", @@ -1204,12 +1218,12 @@ } }, "node_modules/@comunica/actor-query-operation-reduced-hash": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-reduced-hash/-/actor-query-operation-reduced-hash-2.10.0.tgz", - "integrity": "sha512-cLAW1gi8MJIMtruWRCd879X769PSJ3Rlsxm/xxLp/rQj3qaBcyJpw5Z8Y9z4F43LZIebYDcRzjijCM6Ri8j6Tg==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-reduced-hash/-/actor-query-operation-reduced-hash-2.10.1.tgz", + "integrity": "sha512-9hX25ztkbNxnaUd7Gtilok+9WJkr/s3a3y4axLoYX4/nOogYN+nZRKChvNSn4qn/lWvpG5VWv4+q0en1fP+AGA==", "dependencies": { "@comunica/bus-hash-bindings": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "lru-cache": "^10.0.0", @@ -1217,12 +1231,12 @@ } }, "node_modules/@comunica/actor-query-operation-service": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-service/-/actor-query-operation-service-2.10.0.tgz", - "integrity": "sha512-2IdqDBEMkxEzopR1+nC51OHCxTqEoVD/diVtItKu5+uOcmj7lvIi3pChCzqDCL+dG2yhnfFW3DPpWsCcf4R1fA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-service/-/actor-query-operation-service-2.10.1.tgz", + "integrity": "sha512-GvpvhUmhkVFOCLrmcblgIPqi91XPRog5WkC9NFMRCToaSNAMQq82DX2dvwzn3IFItcmyZrmy+GYoaQ9miK2uVQ==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", "@comunica/metadata": "^2.10.0", @@ -1232,11 +1246,11 @@ } }, "node_modules/@comunica/actor-query-operation-slice": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-slice/-/actor-query-operation-slice-2.10.0.tgz", - "integrity": "sha512-QXfEthQG1AlNhhnEHBSwC8P2p048QJVL5QByYm7fWy2F+WmEpxF3zN4JCqNi5JsD/lAH8B81UeAWagyoh+PaRA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-slice/-/actor-query-operation-slice-2.10.1.tgz", + "integrity": "sha512-KOBnTIUvwf28WB7oHevUC/xciEdH5gLg7MN8DvamkAkUiUjviEsRpkswUiD8lFe1dAs0ekA4pC0NoZ8BWp3uqA==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1244,15 +1258,15 @@ } }, "node_modules/@comunica/actor-query-operation-sparql-endpoint": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-sparql-endpoint/-/actor-query-operation-sparql-endpoint-2.10.0.tgz", - "integrity": "sha512-9/QDHzFpEGK3P7n5NcYqFOn63szwCcgxStPbGuWwEwKQpUX6fXCiu1q1ul859nruBvK6HTIIeoa1dXaB/sYZGw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-sparql-endpoint/-/actor-query-operation-sparql-endpoint-2.10.2.tgz", + "integrity": "sha512-nbBzVHhYHUu/9qg9ZzTw7rKvsRb3ViBvM+Fye0oMXojZUbyu2WI6eLFUc2Ze1/LYDNf/1KHNpkg6OdsiEi8HFQ==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-http": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-http": "^2.10.2", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/bus-rdf-resolve-quad-pattern": "^2.10.0", - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", "@comunica/mediatortype-httprequests": "^2.10.0", @@ -1266,11 +1280,11 @@ } }, "node_modules/@comunica/actor-query-operation-union": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-union/-/actor-query-operation-union-2.10.0.tgz", - "integrity": "sha512-YMnLa7cqlDFl5bXWJDE/zYaZbFuQTjh2vxvTYMOy7ieK559VpndQX5OBRna9liFYfjS8zgImyFn5lPTrHhen4g==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-union/-/actor-query-operation-union-2.10.1.tgz", + "integrity": "sha512-Ezi2bAa9r6yyffXDDUPLlKoszsXnuhDUeQSQuU3c7JEAcwip3wC3zMNkavowwfRZ/1D5doitmUEdw2lAd+xloA==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/metadata": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1281,11 +1295,11 @@ } }, "node_modules/@comunica/actor-query-operation-update-add-rewrite": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-add-rewrite/-/actor-query-operation-update-add-rewrite-2.10.0.tgz", - "integrity": "sha512-JgnydGXz7ep+8J53H/gvlVxJv1NjmuRpcxYbUN3sZe6KqV1fhUnNuVr+5ZKZeniIZFMwWD2hNder/afsrF7jZA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-add-rewrite/-/actor-query-operation-update-add-rewrite-2.10.1.tgz", + "integrity": "sha512-is3mrCPciExrlny5JbCvB011kUNYE9/fzQc/zmA3h24S5hHZbygA9mSS+dI85IwwqdKPYlrEqfn8c0kCVWMKyw==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "rdf-data-factory": "^1.1.1", @@ -1293,12 +1307,12 @@ } }, "node_modules/@comunica/actor-query-operation-update-clear": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-clear/-/actor-query-operation-update-clear-2.10.0.tgz", - "integrity": "sha512-bvgg74cLu28zj0m9roPPvpe2tXQEUyqbpVJ2K+aLkqfzl9OSedam5EoL+DkCW6OkojpI7+vzGKr+c94ucLZG7g==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-clear/-/actor-query-operation-update-clear-2.10.2.tgz", + "integrity": "sha512-+sf6+LvXdKBv2pCuBH/ad5QdpheZSPEvw19UoaPQRQyQVBzIskOtfs4rwJHSn/YmoqhbstKZszakad3oxWwTTg==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*", @@ -1307,48 +1321,48 @@ } }, "node_modules/@comunica/actor-query-operation-update-compositeupdate": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-compositeupdate/-/actor-query-operation-update-compositeupdate-2.10.0.tgz", - "integrity": "sha512-e6SMmk5TIkXhmVNFGLqSbD+cgbJL9Kw+jX/18Fzw6AuR1bku4Z6tbznBJi41GnDNHbhRNEpZLbtroXKyCfl2KQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-compositeupdate/-/actor-query-operation-update-compositeupdate-2.10.1.tgz", + "integrity": "sha512-IVNouBPFQLOczhW3qHyEoyxWrc7wnVT2vPwRHEaGlfnSiYAX42XSNLb9jR0XjB70wh3Civue4Ovs3upOXdrN3Q==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-update-copy-rewrite": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-copy-rewrite/-/actor-query-operation-update-copy-rewrite-2.10.0.tgz", - "integrity": "sha512-/yIixdqQfSIDI1l5lLKAspENxTFXmIHE7wYnHflQ1UPKEG0kjOyu3v5O7RFTJixHlaqXJhm6baByWYwU5olEXA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-copy-rewrite/-/actor-query-operation-update-copy-rewrite-2.10.1.tgz", + "integrity": "sha512-l/3AM35hjahyHmiLoB3FPm0Jlhdmd/vqgOGj7V3Ra+TfHo5h8XOB3uzG78Q06HQNw4iyONBZc5lLlYXkzRd5lg==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-update-create": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-create/-/actor-query-operation-update-create-2.10.0.tgz", - "integrity": "sha512-lmOzf21okmwCVkCzmJYmcuD/xXRcej7BCdoWp9cVbajLeSHNeaDFyjfM0hWOFWAm9bW8lhpVkMgNaSt7JpXJFw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-create/-/actor-query-operation-update-create-2.10.2.tgz", + "integrity": "sha512-g3DwLkYFTU8uZoIOV7oNPWStBmqvnBBPvLngG19MQQezuVoh8w88efxhbN0B/khi5/v4qcLsr7C0ffAaPF8Fbg==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-update-deleteinsert": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-deleteinsert/-/actor-query-operation-update-deleteinsert-2.10.0.tgz", - "integrity": "sha512-FSwHDqihRlELg93JFq9/sfU53fZeeuCMh7yjYkztfmefZf8aDtUQ4S1K99ivfuGAlbg36mSahW4s8ZZplC8pWg==", - "dependencies": { - "@comunica/actor-query-operation-construct": "^2.10.0", - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-update-quads": "^2.10.0", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-deleteinsert/-/actor-query-operation-update-deleteinsert-2.10.2.tgz", + "integrity": "sha512-FiRCLUAxkDoFpOe9jKC5llI7njbFdb1N8McRvZjBazUS4XDutjTZEkcKLs6AcRyG3esfHt6gNm6PqCuZ+aP8TA==", + "dependencies": { + "@comunica/actor-query-operation-construct": "^2.10.1", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*", @@ -1357,12 +1371,12 @@ } }, "node_modules/@comunica/actor-query-operation-update-drop": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-drop/-/actor-query-operation-update-drop-2.10.0.tgz", - "integrity": "sha512-ErOkzlyoO9t32QhrFdjYMJTeEnH/Gkb7ldEvpUtmOIFnsYvH8e2TpPiVOEicbhgQitiOATKpYpgG07vvqvTTyg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-drop/-/actor-query-operation-update-drop-2.10.2.tgz", + "integrity": "sha512-N/878InwoyQfysjCyo9r+H82eUlNeEGODJ95gCvzF/QGRc11N3dfcd3XijyHQ9OKAoQ9oR5gcS829LB3BDtKHg==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*", @@ -1371,12 +1385,12 @@ } }, "node_modules/@comunica/actor-query-operation-update-load": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-load/-/actor-query-operation-update-load-2.10.0.tgz", - "integrity": "sha512-Rt3b/zfuvYJiBXAh/ORePbnEkouC5zzJbMJCPUyngXhqzVcMIIzuI/uTmXBVUdnSGuxi6IEg5Q03Hs8Sy5QalA==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-load/-/actor-query-operation-update-load-2.10.2.tgz", + "integrity": "sha512-lQb5fxb1+ZFbQkylmepze+e+LtVmVNvAvFBvjxUSfCT62uIKKHMeh1So5kTrGD0Co4ABCs1h6o9WB+8yQzFtQw==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1385,23 +1399,23 @@ } }, "node_modules/@comunica/actor-query-operation-update-move-rewrite": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-move-rewrite/-/actor-query-operation-update-move-rewrite-2.10.0.tgz", - "integrity": "sha512-YNHbN9zRoKEFikgZGTt8VzO86hxXa8/s4aVR6t3xRfjTgn5Y7OOlMOotijWXYjBkdW4kGCcJye6Kp8zxP8fNOQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-update-move-rewrite/-/actor-query-operation-update-move-rewrite-2.10.1.tgz", + "integrity": "sha512-GDLSHG2++EAAyUKhDu+mM6QfMTuzM8dS24HqeQL5Wzbkdc2KTmNKyJuhJw6SfXr6EiF/kxf1GPY6zwjcwACx/w==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "sparqlalgebrajs": "^4.2.0" } }, "node_modules/@comunica/actor-query-operation-values": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-values/-/actor-query-operation-values-2.10.0.tgz", - "integrity": "sha512-v59HOc2Xn4Hmn75VfjBRoIg8q5Klf9aPDLbpJ7FHqj4CKwevAiDCwFpENe04o0fJdv4Nfivh8oPQIX8cxyLKYQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-operation-values/-/actor-query-operation-values-2.10.1.tgz", + "integrity": "sha512-++9IgCVCQPIF8fzZLmrVpxPj8eI9TvkLshHAugQQBnhSijrDMUudW9eoA+eFmCaD/Ru7YtlKe3OJzRGV8FCG+Q==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/core": "^2.10.0", "@comunica/metadata": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1479,11 +1493,11 @@ } }, "node_modules/@comunica/actor-query-result-serialize-sparql-json": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-result-serialize-sparql-json/-/actor-query-result-serialize-sparql-json-2.10.0.tgz", - "integrity": "sha512-Y0z9qy30tkVWZVwSAfYOhhbfwoPO15s6XHTY8iPIZw9w/5CrbAD0wo9L0XAUimiiB6xx2mbtdexpuzu/2qVeYA==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-result-serialize-sparql-json/-/actor-query-result-serialize-sparql-json-2.10.2.tgz", + "integrity": "sha512-+J7SWXc4nXHzmQMk6q8MScrLNKdqX+/xQe6XCk0zDbDAt3/8EJh/2ROYFp4fEQyPDFWOwN4xpALgHRIh8PQRAQ==", "dependencies": { - "@comunica/bus-http": "^2.10.0", + "@comunica/bus-http": "^2.10.2", "@comunica/bus-http-invalidate": "^2.10.0", "@comunica/bus-query-result-serialize": "^2.10.0", "@comunica/core": "^2.10.0", @@ -1516,11 +1530,11 @@ } }, "node_modules/@comunica/actor-query-result-serialize-stats": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-query-result-serialize-stats/-/actor-query-result-serialize-stats-2.10.0.tgz", - "integrity": "sha512-Aa2ijQLLgnMFefmyrEBE1CZjlyDIPFDQXfMJfphCjEzN5nOOsZax2E5DK31tEaJyOQV/8Af5X1YamiOoNMZSWw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-query-result-serialize-stats/-/actor-query-result-serialize-stats-2.10.2.tgz", + "integrity": "sha512-jhj/vLDRxLuRMonBaqICt4saM9/UO9wJBT3Jxk7Rp73aQWLo+lILXKzcWpuxkh/EFx8raLUBmbjWCduamU1DzQ==", "dependencies": { - "@comunica/bus-http": "^2.10.0", + "@comunica/bus-http": "^2.10.2", "@comunica/bus-http-invalidate": "^2.10.0", "@comunica/bus-query-result-serialize": "^2.10.0", "@comunica/core": "^2.10.0", @@ -1581,23 +1595,23 @@ } }, "node_modules/@comunica/actor-rdf-join-inner-hash": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-hash/-/actor-rdf-join-inner-hash-2.10.0.tgz", - "integrity": "sha512-kgbCQsuvXke+dSY+J2YMdMnFLGx5XPaeV++l+Wy6lCVrSltCi06O874b68i4sHxPC4B49KczTBAvnzfC31lWHw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-hash/-/actor-rdf-join-inner-hash-2.10.1.tgz", + "integrity": "sha512-nUtdS3NJGKSJQC8KjDVz4TEDmkXHBYQi0/bwnAXCDl1phhq8lgv+YEmRDNe/kuCze7HyqEt98rlSJ+ZhvcHXVQ==", "dependencies": { - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/mediatortype-join-coefficients": "^2.10.0", "@comunica/types": "^2.10.0", "asyncjoin": "^1.1.1" } }, "node_modules/@comunica/actor-rdf-join-inner-multi-bind": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-multi-bind/-/actor-rdf-join-inner-multi-bind-2.10.0.tgz", - "integrity": "sha512-T5fLuQ4SStX6xAwwBHJG+1Fv//0Z2zzXrqPeg3zkJxfQzFkB5KZ15hLUUPZ//w9QFnsheQdUbTe8XKhF4QKOWA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-multi-bind/-/actor-rdf-join-inner-multi-bind-2.10.1.tgz", + "integrity": "sha512-tNZ2Q7z44Yr0iIFkvtTVAsts4v0IoC4b0FYaIUeYav4y5JOlR74hWWijTAzVfb31dTMsAp3r+y0xGIdd75LRHQ==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/bus-rdf-join-entries-sort": "^2.10.0", "@comunica/context-entries": "^2.10.0", "@comunica/mediatortype-join-coefficients": "^2.10.0", @@ -1607,11 +1621,11 @@ } }, "node_modules/@comunica/actor-rdf-join-inner-multi-empty": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-multi-empty/-/actor-rdf-join-inner-multi-empty-2.10.0.tgz", - "integrity": "sha512-WoadMgBFKYzQoWsyqqITO7rORkVuTjP+O2nm37nQAW3rVo6DqVDwboki106p2PdJpnGQonAgE3eoBHzMAEyfEw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-multi-empty/-/actor-rdf-join-inner-multi-empty-2.10.1.tgz", + "integrity": "sha512-z6a3qENwuvSU0PvqOySrsHsWSUvzfWd1xIYwEvKuEIJ9vYPoefIUgggx08E95ZF/k+PxZ0vKEywFpBSUKUzGYA==", "dependencies": { - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/mediatortype-join-coefficients": "^2.10.0", "@comunica/metadata": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1619,12 +1633,12 @@ } }, "node_modules/@comunica/actor-rdf-join-inner-multi-smallest": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-multi-smallest/-/actor-rdf-join-inner-multi-smallest-2.10.0.tgz", - "integrity": "sha512-l6slyNdG2Add1Gpw/nkjsncUUD8G9qJbbfK3glJh7AtsaZ9H2uxVlGWQ3grP5yBbGtQU5Mvzmk0U9Wh+jLQHKA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-multi-smallest/-/actor-rdf-join-inner-multi-smallest-2.10.1.tgz", + "integrity": "sha512-MXwIvq+viDCmsxJwD4+fwMhwZINWva3jtQ3j5ne6DXgZYUJUFOw3VujvCP4/cl075RuSxYlXgy6ETHLa1TNr7g==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/bus-rdf-join-entries-sort": "^2.10.0", "@comunica/mediatortype-join-coefficients": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1632,67 +1646,67 @@ } }, "node_modules/@comunica/actor-rdf-join-inner-nestedloop": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-nestedloop/-/actor-rdf-join-inner-nestedloop-2.10.0.tgz", - "integrity": "sha512-G/1ePePut3NeNx1+umeM8oiw2RjMMpmhzTDmnuz+ULcoW3dIhHQYZax/mSpN7T195jTFSS/CfNSFUFfOF5Rghg==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-nestedloop/-/actor-rdf-join-inner-nestedloop-2.10.1.tgz", + "integrity": "sha512-nFjGMrAIrRjRcsaU8UQXLbsDODVdf4LDpVNVQIrjfoWzhOIy13ApDQrqtuObaGVfryiFgt34zVEOwMWezWzl0A==", "dependencies": { - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/mediatortype-join-coefficients": "^2.10.0", "@comunica/types": "^2.10.0", "asyncjoin": "^1.1.1" } }, "node_modules/@comunica/actor-rdf-join-inner-none": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-none/-/actor-rdf-join-inner-none-2.10.0.tgz", - "integrity": "sha512-vyl0ZxTWgdX0XQEO34Ih5FKhegMP6v+baILjToFRacMP56w4TviG0F6EAInW2WFdj8MhecD7C7ZQlgpCZ7BnGg==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-none/-/actor-rdf-join-inner-none-2.10.1.tgz", + "integrity": "sha512-4mqsuqvLSuXMbgY0PghqK5hmBGH5YkRTwUOpGpBE0EVQaiAoQOME0uVslkt2TBzUx5IQJC+trr/80sbA9mAhMw==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/mediatortype-join-coefficients": "^2.10.0", "@comunica/metadata": "^2.10.0", "asynciterator": "^3.8.1" } }, "node_modules/@comunica/actor-rdf-join-inner-single": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-single/-/actor-rdf-join-inner-single-2.10.0.tgz", - "integrity": "sha512-uH9AqJ5AVSYBBUns29PMl5zvXuWHpZr2C2XW/uoV2rYItGgqOGWpKM88v+uI9AaAPgUhBpVtcUkN1ssn6mXCkw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-single/-/actor-rdf-join-inner-single-2.10.1.tgz", + "integrity": "sha512-RfnwTEsuXNdR0cNRWaCvNPlfD5KyuScsc/55j/9mr8yqGUTE9h9Om1Is5u7xnpRMxGOEqwVP6apK3ZxsZqlL/w==", "dependencies": { - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/mediatortype-join-coefficients": "^2.10.0" } }, "node_modules/@comunica/actor-rdf-join-inner-symmetrichash": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-symmetrichash/-/actor-rdf-join-inner-symmetrichash-2.10.0.tgz", - "integrity": "sha512-0ZFOwx86k3bbSSBkA+nvyQBxZDnadCeSLXHPnF/pEOKNt2IKOZp9lFWVS8fqjfbOwLuXWEIg9mGG5TUWxauEqw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-inner-symmetrichash/-/actor-rdf-join-inner-symmetrichash-2.10.1.tgz", + "integrity": "sha512-beFGkMUe3pTADtMXXPU8ab/IMULj+Hkg3Iah0zgrVZgwWH1Kgfkj/2qp32Ll5y9qcRbio4ruruKlHNXJJUU46Q==", "dependencies": { - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/mediatortype-join-coefficients": "^2.10.0", "@comunica/types": "^2.10.0", "asyncjoin": "^1.1.1" } }, "node_modules/@comunica/actor-rdf-join-minus-hash": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-minus-hash/-/actor-rdf-join-minus-hash-2.10.0.tgz", - "integrity": "sha512-vHe3xz+DVtZ7GeGQU7EsXb7cnUaOqQ3WYuDINCffY3ht7JLiUXHPw/nPs3uODgqeNa29qwIs54Na+2IfQJlauQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-minus-hash/-/actor-rdf-join-minus-hash-2.10.1.tgz", + "integrity": "sha512-wIaB/EpuySaARhimoLzrE0cTH0TgVkL43IAtYX7ECwH9Qcv8blO4zbL4q2KUkY7OKZRM892aqMfo3kO1vMIK7w==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/mediatortype-join-coefficients": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*" } }, "node_modules/@comunica/actor-rdf-join-minus-hash-undef": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-minus-hash-undef/-/actor-rdf-join-minus-hash-undef-2.10.0.tgz", - "integrity": "sha512-JQAz8KI8SsUlYyup8oLzUJRZ5O9bBBmn+myQ/J5bgV1k0WB0/F3NiW2dQN9ew7usFvHEQulg2sv0/4KBCAR8MQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-minus-hash-undef/-/actor-rdf-join-minus-hash-undef-2.10.1.tgz", + "integrity": "sha512-tz5LdeAHnylEQIq4bRfFqaH89WZXkkdFxEshqxWijFBp5wprUYiotMDrBo9zDFaPquhs42fILtTzLY9yaalc9w==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/mediatortype-join-coefficients": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*", @@ -1700,13 +1714,13 @@ } }, "node_modules/@comunica/actor-rdf-join-optional-bind": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-optional-bind/-/actor-rdf-join-optional-bind-2.10.0.tgz", - "integrity": "sha512-YcEgDP6k1E+ymSGcCJVotWALnpu4KT1QbSlry/4TFS2AVFOVpfkNEaJ9g7sojq4bC83KlQ1kEm0zIVdeKUBdVA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-optional-bind/-/actor-rdf-join-optional-bind-2.10.1.tgz", + "integrity": "sha512-6dOoI/rzRZ0RUyv2WlToClE42Z2YJE5xcSrot7haT2eMdxbzr1KjyasHBcIIkSK+WViDO006lXZ1Hi4tJm9uuA==", "dependencies": { - "@comunica/actor-rdf-join-inner-multi-bind": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/actor-rdf-join-inner-multi-bind": "^2.10.1", + "@comunica/bus-query-operation": "^2.10.1", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/context-entries": "^2.10.0", "@comunica/mediatortype-join-coefficients": "^2.10.0", "@comunica/types": "^2.10.0", @@ -1714,11 +1728,11 @@ } }, "node_modules/@comunica/actor-rdf-join-optional-nestedloop": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-optional-nestedloop/-/actor-rdf-join-optional-nestedloop-2.10.0.tgz", - "integrity": "sha512-ImvAeYAbafIuyc1i0Yzm/UkFI7MRhkb0rRkgj5KxTtA4bd22zPvNIt4DBsSiBTtdlWxL1UsaAQ5pfbFxRFLVQg==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-join-optional-nestedloop/-/actor-rdf-join-optional-nestedloop-2.10.1.tgz", + "integrity": "sha512-d7KUDjEKZszizd4SBvYkK2A6lScrq9ciEgzdrrp6IYZhIGAhJLTgPNg3Js3NEjpE7oj4KWl2WwKJe2sWcJbKJg==", "dependencies": { - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/mediatortype-join-coefficients": "^2.10.0", "@comunica/types": "^2.10.0", "asyncjoin": "^1.1.1" @@ -1929,11 +1943,11 @@ } }, "node_modules/@comunica/actor-rdf-parse-jsonld": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-jsonld/-/actor-rdf-parse-jsonld-2.10.0.tgz", - "integrity": "sha512-A6TczotUsFyceQf2Nqp4+99c28ZnfkCqUrm7IXPhYUSA6p+KyMew52dr1nC0H7AJ6hRozqY3ZeOrvTjHOWytNg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-jsonld/-/actor-rdf-parse-jsonld-2.10.2.tgz", + "integrity": "sha512-K4fvD0zMU22KkQCqIFVT5Oy2FREEZ9CAo9u6kOcsMxEvg9aHGIM6hkaXR8I+1JCx1mDuEj3zQ8joR4tQh8fYCw==", "dependencies": { - "@comunica/bus-http": "^2.10.0", + "@comunica/bus-http": "^2.10.2", "@comunica/bus-rdf-parse": "^2.10.0", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", @@ -2055,9 +2069,9 @@ } }, "node_modules/@comunica/actor-rdf-resolve-hypermedia-none/node_modules/rdf-store-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rdf-store-stream/-/rdf-store-stream-2.0.0.tgz", - "integrity": "sha512-FKRsA5XUdhFVMx+jg4JCBM76B4ZcXVKyilr8GJrlfkHB2IZSIgLxY2XHIsewkDfm/yAtXHvPT0PaeQg4Mbqa6g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rdf-store-stream/-/rdf-store-stream-2.0.1.tgz", + "integrity": "sha512-znGaibHLvbRE0BrDcXHRleRcLKlHYP6ADr1RFJ3yA28QBmhOjxxgbBFTvCMzgsxvBIqdaFS8Vd2FG4NefJL4Mg==", "dependencies": { "@rdfjs/types": "*", "rdf-stores": "^1.0.0" @@ -2083,12 +2097,12 @@ } }, "node_modules/@comunica/actor-rdf-resolve-hypermedia-sparql": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-resolve-hypermedia-sparql/-/actor-rdf-resolve-hypermedia-sparql-2.10.0.tgz", - "integrity": "sha512-pg4ZzmeeqoUhNS9xT6w8A9eKg3fBbGD01mAc9Dqn3qm0lNhHLgPczKuYy4TQuzkVmBlkce5GD8xBK+2c5WeqwQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-resolve-hypermedia-sparql/-/actor-rdf-resolve-hypermedia-sparql-2.10.2.tgz", + "integrity": "sha512-UFsTuzHvjK/XhRGqfHr3WAVr+iBv6XTuU1fV9EuOaB+odclQ+H6TGtmW6/38CSufj86Y691VBXMk29zdWfrmGA==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", - "@comunica/bus-http": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", + "@comunica/bus-http": "^2.10.2", "@comunica/bus-rdf-resolve-hypermedia": "^2.10.0", "@comunica/bus-rdf-resolve-quad-pattern": "^2.10.0", "@comunica/types": "^2.10.0", @@ -2102,11 +2116,11 @@ } }, "node_modules/@comunica/actor-rdf-resolve-quad-pattern-federated": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-resolve-quad-pattern-federated/-/actor-rdf-resolve-quad-pattern-federated-2.10.0.tgz", - "integrity": "sha512-j1JtNhxknP2iKxAqeRP6Atq+m3yX1MPZ6kttfNWOjaDW0zDhw1I3PItYFvP2HgNQK4aN6S7uGFWy45UR7rc3gg==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-resolve-quad-pattern-federated/-/actor-rdf-resolve-quad-pattern-federated-2.10.1.tgz", + "integrity": "sha512-OBRTTUWkXKa0ibDzcYLG7aKf3BfQp2j75xm65brRvwstNLmye9ZEq1PrNhbP5UDqQQeCgzPBrb0eGC8Vxek2RA==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/bus-rdf-metadata-accumulate": "^2.10.0", "@comunica/bus-rdf-resolve-quad-pattern": "^2.10.0", "@comunica/context-entries": "^2.10.0", @@ -2122,13 +2136,13 @@ } }, "node_modules/@comunica/actor-rdf-resolve-quad-pattern-hypermedia": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-resolve-quad-pattern-hypermedia/-/actor-rdf-resolve-quad-pattern-hypermedia-2.10.0.tgz", - "integrity": "sha512-D4yIQcr937/Z4Z3dJ0Cjo978xz52FuN126tB+bST0griDI5jV/o0VKuLGpjRKHbjUWJrBxS9MQLeHa4Zbeqe+Q==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-resolve-quad-pattern-hypermedia/-/actor-rdf-resolve-quad-pattern-hypermedia-2.10.1.tgz", + "integrity": "sha512-XkJOYu0bizWHsvgiaGyNAnRZsqv2risREK5SY14VCMXDYqmOWJLDppveGEUZAoEKEJuo4ZLDlP2gLDGzc0krxQ==", "dependencies": { "@comunica/bus-dereference-rdf": "^2.10.0", "@comunica/bus-http-invalidate": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/bus-rdf-metadata": "^2.10.0", "@comunica/bus-rdf-metadata-accumulate": "^2.10.0", "@comunica/bus-rdf-metadata-extract": "^2.10.0", @@ -2181,9 +2195,9 @@ } }, "node_modules/@comunica/actor-rdf-resolve-quad-pattern-string-source/node_modules/rdf-store-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rdf-store-stream/-/rdf-store-stream-2.0.0.tgz", - "integrity": "sha512-FKRsA5XUdhFVMx+jg4JCBM76B4ZcXVKyilr8GJrlfkHB2IZSIgLxY2XHIsewkDfm/yAtXHvPT0PaeQg4Mbqa6g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rdf-store-stream/-/rdf-store-stream-2.0.1.tgz", + "integrity": "sha512-znGaibHLvbRE0BrDcXHRleRcLKlHYP6ADr1RFJ3yA28QBmhOjxxgbBFTvCMzgsxvBIqdaFS8Vd2FG4NefJL4Mg==", "dependencies": { "@rdfjs/types": "*", "rdf-stores": "^1.0.0" @@ -2222,13 +2236,13 @@ } }, "node_modules/@comunica/actor-rdf-update-hypermedia-patch-sparql-update": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-update-hypermedia-patch-sparql-update/-/actor-rdf-update-hypermedia-patch-sparql-update-2.10.0.tgz", - "integrity": "sha512-dKy4qFjxdcBk1E41OzvuiiCsMYAX0S3rToDivpMSX8fV1m6tjXxVndmX5c/7Zlc8CckimGRmChienkaI3tIjHg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-update-hypermedia-patch-sparql-update/-/actor-rdf-update-hypermedia-patch-sparql-update-2.10.2.tgz", + "integrity": "sha512-z/fOzYlA5fPtauTUISYhCWMKtEpkvKkSZIdvcgeGvetLnvw4fytfVHdtPhirZYmPya10GCeTG7m2iHvK53lOsQ==", "dependencies": { - "@comunica/bus-http": "^2.10.0", - "@comunica/bus-rdf-update-hypermedia": "^2.10.0", - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-http": "^2.10.2", + "@comunica/bus-rdf-update-hypermedia": "^2.10.2", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*", @@ -2239,14 +2253,14 @@ } }, "node_modules/@comunica/actor-rdf-update-hypermedia-put-ldp": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-update-hypermedia-put-ldp/-/actor-rdf-update-hypermedia-put-ldp-2.10.0.tgz", - "integrity": "sha512-iKrXqyKvulP0kL14gxQra3E3zt57IR9fGFXpkFRdmACyMaVOaBnc/vRI/YKAhKauXT6VWacPRH5iI8BEeywf4A==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-update-hypermedia-put-ldp/-/actor-rdf-update-hypermedia-put-ldp-2.10.2.tgz", + "integrity": "sha512-Tof/mU0Lkt7HP3SwHXODczxvAFelWzAHdP+ap4Upr47K6Zg5GRPwJv//2AcPvT3p42Li6wuMz/4nh/A3pcnCKA==", "dependencies": { - "@comunica/bus-http": "^2.10.0", + "@comunica/bus-http": "^2.10.2", "@comunica/bus-rdf-serialize": "^2.10.0", - "@comunica/bus-rdf-update-hypermedia": "^2.10.0", - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-rdf-update-hypermedia": "^2.10.2", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*", @@ -2255,13 +2269,13 @@ } }, "node_modules/@comunica/actor-rdf-update-hypermedia-sparql": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-update-hypermedia-sparql/-/actor-rdf-update-hypermedia-sparql-2.10.0.tgz", - "integrity": "sha512-eVVqB4rHTBR4axV/Y4OMGQ0t5pvGjJHhuYq80gLBh4jvBVN9FD9ZlGiVRUTzHA2akXwEK18Mxwhm/vGVI52e9A==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-update-hypermedia-sparql/-/actor-rdf-update-hypermedia-sparql-2.10.2.tgz", + "integrity": "sha512-uw1NIAoxuAechsjTQ6b53XpGOMx3Mp5uEL5LtUwNC6COJE6tzWH8wG54Dwj+0VNxsgqsSircKu2xwGl1uOsOPg==", "dependencies": { - "@comunica/bus-http": "^2.10.0", - "@comunica/bus-rdf-update-hypermedia": "^2.10.0", - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-http": "^2.10.2", + "@comunica/bus-rdf-update-hypermedia": "^2.10.2", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*", @@ -2272,27 +2286,27 @@ } }, "node_modules/@comunica/actor-rdf-update-quads-hypermedia": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-update-quads-hypermedia/-/actor-rdf-update-quads-hypermedia-2.10.0.tgz", - "integrity": "sha512-redFnJhn6QpN6TyTztV+oKz1RsWO4kyKhFcNZss//55Klg9u4VqhPmOYhlxEtOIyYAdgfR0vNv7TNT0KrtdB6A==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-update-quads-hypermedia/-/actor-rdf-update-quads-hypermedia-2.10.2.tgz", + "integrity": "sha512-kzGfDv0PqcOIIULJLG8jtA/dOcrNUodu98J08ruSuYQBbnFgAZ07MG1TkWhEI/AM6D0w7hXkgQaC1sGWn4gVmA==", "dependencies": { "@comunica/bus-dereference-rdf": "^2.10.0", "@comunica/bus-http-invalidate": "^2.10.0", "@comunica/bus-rdf-metadata": "^2.10.0", "@comunica/bus-rdf-metadata-extract": "^2.10.0", - "@comunica/bus-rdf-update-hypermedia": "^2.10.0", - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-rdf-update-hypermedia": "^2.10.2", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "lru-cache": "^10.0.0" } }, "node_modules/@comunica/actor-rdf-update-quads-rdfjs-store": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-update-quads-rdfjs-store/-/actor-rdf-update-quads-rdfjs-store-2.10.0.tgz", - "integrity": "sha512-iurPiRo8N1+Wb+arvMjZCJAY+CosjpkiVOSIW5VA5ara11a3BLomwCX7jc/CqwmSf5jGes+cqfZgxyTq1Lv4UQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-update-quads-rdfjs-store/-/actor-rdf-update-quads-rdfjs-store-2.10.2.tgz", + "integrity": "sha512-anX3SovvY2H8KwuWu8G9EqtITmCsz12jfqunNn5Efcch/bm4HyHTC1GThx77m6qpCdg4OMx8TLhNrH1II1UM1w==", "dependencies": { - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", "@rdfjs/types": "*", @@ -2302,9 +2316,9 @@ } }, "node_modules/@comunica/bindings-factory": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/bindings-factory/-/bindings-factory-2.10.0.tgz", - "integrity": "sha512-RmjOPg3wAGKH3Pe6FyRu9ydUU6wXlnF1N5hEIoFd0ENO5Y0Oo5V5fABsoNjosZn4UNKTupIvZ1+Zw4FP4fox9A==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/bindings-factory/-/bindings-factory-2.10.1.tgz", + "integrity": "sha512-AUD3VWlCYljgk5jfaMejSIL9CiX3aV/cAn314e/dYP/rrnVgachcCwyaD8hKHWTBHDs5rcGxr/iwruBOfsERvQ==", "dependencies": { "@rdfjs/types": "*", "immutable": "^4.1.0", @@ -2365,14 +2379,14 @@ } }, "node_modules/@comunica/bus-http": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/bus-http/-/bus-http-2.10.0.tgz", - "integrity": "sha512-wITLxYFvAuFsml4txgxYfxzgroVtWCi+Ja3TTN1l+MpeN1CyDfcA3oL30W8jLMJStjxt1SUmtuOoUjM1lzsbFA==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/bus-http/-/bus-http-2.10.2.tgz", + "integrity": "sha512-MAYRF6uEBAuJ9dCPW2Uyne7w3lNwXFXKfa14XuPG5DFTDpgo/Z2pWupPrBsA1eIWMNJ6WOG6QyEv4rllSIBqlg==", "dependencies": { "@comunica/core": "^2.10.0", + "@smessie/readable-web-to-node-stream": "^3.0.3", "is-stream": "^2.0.1", "readable-stream-node-to-web": "^1.0.1", - "readable-web-to-node-stream": "^3.0.2", "web-streams-ponyfill": "^1.4.2" } }, @@ -2404,11 +2418,11 @@ } }, "node_modules/@comunica/bus-query-operation": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/bus-query-operation/-/bus-query-operation-2.10.0.tgz", - "integrity": "sha512-OSPjD5BO9dfnbkY6oNBZ4/ofqNvczwTs6fgJG2GdcCP4WKJQmhv5wTuDYa9ksQkaYcqs0WiIYMiMABbILLrjjQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/bus-query-operation/-/bus-query-operation-2.10.1.tgz", + "integrity": "sha512-PoUSJeKaMZtZu+ZtB+5ABjPOiW1YjxOdLE1N5znxX2oiDKCQHmAXVaVkbVx1jPDLGYFNcOlOSzpRMqLQ/L4JIw==", "dependencies": { - "@comunica/bindings-factory": "^2.10.0", + "@comunica/bindings-factory": "^2.10.1", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", "@comunica/data-factory": "^2.7.0", @@ -2441,11 +2455,11 @@ } }, "node_modules/@comunica/bus-rdf-join": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/bus-rdf-join/-/bus-rdf-join-2.10.0.tgz", - "integrity": "sha512-PkfemBRaODavpp7qlUho7cvu+LyTSZqpvxby9pPx1+h4AJe3BvH1/i0hjLvsM5IBR16rWeWPYOBBx5YtUkEZfw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/bus-rdf-join/-/bus-rdf-join-2.10.1.tgz", + "integrity": "sha512-pPFoJVHY5p931jIKt+9sqRCGiuuf8yFqrlOOAd3un72cwuyhwNHvn52xwvcPlNUAySz/kDmW+U0syflqI6VdAw==", "dependencies": { - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/bus-rdf-join-selectivity": "^2.10.0", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", @@ -2576,21 +2590,21 @@ } }, "node_modules/@comunica/bus-rdf-update-hypermedia": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/bus-rdf-update-hypermedia/-/bus-rdf-update-hypermedia-2.10.0.tgz", - "integrity": "sha512-UfQ2rDRnkoX8kkpqnsxSnyg+09AdnqL9ma/RVXP622w8V9A8bcZgr2FuXBFx7ltLbBNuXo2oY6mKHcNmLEov4g==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/bus-rdf-update-hypermedia/-/bus-rdf-update-hypermedia-2.10.2.tgz", + "integrity": "sha512-GbRMxXN4kx+4UPsnGxWjyn770m675yy2gWK/xy/5qQIxxRTcuGk4wm/994FZQXpwLX1E0xJ+YKxMgXTIlEWmQA==", "dependencies": { - "@comunica/bus-rdf-update-quads": "^2.10.0", + "@comunica/bus-rdf-update-quads": "^2.10.2", "@comunica/core": "^2.10.0" } }, "node_modules/@comunica/bus-rdf-update-quads": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/bus-rdf-update-quads/-/bus-rdf-update-quads-2.10.0.tgz", - "integrity": "sha512-tu1fBdtbBkQfQJiLaAbOZgsQdJDehGNP13Itinmvx/JsgRp40rrUYXg53HLB8CpssCRtHTzMlnSQiPQdwiYpBw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/bus-rdf-update-quads/-/bus-rdf-update-quads-2.10.2.tgz", + "integrity": "sha512-+iVpAHps8ytGq8AZF4xTZbLyskS40JPn64MO+OAuYovqXLlezp6vh9eJ5qETuP9NP+BpZDk3nOU3Ky3fb0QCUw==", "dependencies": { - "@comunica/actor-rdf-resolve-quad-pattern-federated": "^2.10.0", - "@comunica/bus-http": "^2.10.0", + "@comunica/actor-rdf-resolve-quad-pattern-federated": "^2.10.1", + "@comunica/bus-http": "^2.10.2", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", "@comunica/types": "^2.10.0", @@ -2733,11 +2747,11 @@ } }, "node_modules/@comunica/mediator-join-coefficients-fixed": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/mediator-join-coefficients-fixed/-/mediator-join-coefficients-fixed-2.10.0.tgz", - "integrity": "sha512-Mkd3WFJZTHkb6KD58ecFzh0QKMDPLst+29PvXxxbh0HhFf15sWdd3JU9hpa/+cm7MNd3MZ8m2dA9ie7bjbLLyA==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@comunica/mediator-join-coefficients-fixed/-/mediator-join-coefficients-fixed-2.10.1.tgz", + "integrity": "sha512-HRvc0e8QDnR3sbRMMCyx9ILFA6KiUxHEqDOpt7BV3kFMWWIpBavFDwPUjLBG6sRA8o0CFu1+oVVh5fAFYZIxzQ==", "dependencies": { - "@comunica/bus-rdf-join": "^2.10.0", + "@comunica/bus-rdf-join": "^2.10.1", "@comunica/context-entries": "^2.10.0", "@comunica/core": "^2.10.0", "@comunica/mediatortype-join-coefficients": "^2.10.0", @@ -2802,86 +2816,86 @@ } }, "node_modules/@comunica/query-sparql": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@comunica/query-sparql/-/query-sparql-2.10.0.tgz", - "integrity": "sha512-BTm8mZLhs32OzPo278605kYRg8QQJ44kz/VRQp2+GKK5HjlPoXD7ULK+RiFNyAWDxJHT9QCv890QwS7+5ShPxQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@comunica/query-sparql/-/query-sparql-2.10.2.tgz", + "integrity": "sha512-bgjQ8N5/vP3Iy71AgDKQc06mXmEBvh7dsenw2VPbvk11iXywec4XCq8TzX+GozL+Zxxl5XyYlBw+nRjvORTGHg==", "dependencies": { "@comunica/actor-context-preprocess-source-to-destination": "^2.10.0", "@comunica/actor-dereference-fallback": "^2.10.0", - "@comunica/actor-dereference-http": "^2.10.0", + "@comunica/actor-dereference-http": "^2.10.2", "@comunica/actor-dereference-rdf-parse": "^2.10.0", "@comunica/actor-hash-bindings-sha1": "^2.10.0", - "@comunica/actor-http-fetch": "^2.10.0", - "@comunica/actor-http-proxy": "^2.10.0", - "@comunica/actor-http-wayback": "^2.10.0", - "@comunica/actor-init-query": "^2.10.0", + "@comunica/actor-http-fetch": "^2.10.2", + "@comunica/actor-http-proxy": "^2.10.2", + "@comunica/actor-http-wayback": "^2.10.2", + "@comunica/actor-init-query": "^2.10.2", "@comunica/actor-optimize-query-operation-bgp-to-join": "^2.10.0", "@comunica/actor-optimize-query-operation-join-bgp": "^2.10.0", "@comunica/actor-optimize-query-operation-join-connected": "^2.10.0", - "@comunica/actor-query-operation-ask": "^2.10.0", - "@comunica/actor-query-operation-bgp-join": "^2.10.0", - "@comunica/actor-query-operation-construct": "^2.10.0", - "@comunica/actor-query-operation-describe-subject": "^2.10.0", - "@comunica/actor-query-operation-distinct-hash": "^2.10.0", - "@comunica/actor-query-operation-extend": "^2.10.0", - "@comunica/actor-query-operation-filter-sparqlee": "^2.10.0", - "@comunica/actor-query-operation-from-quad": "^2.10.0", - "@comunica/actor-query-operation-group": "^2.10.0", - "@comunica/actor-query-operation-join": "^2.10.0", - "@comunica/actor-query-operation-leftjoin": "^2.10.0", - "@comunica/actor-query-operation-minus": "^2.10.0", - "@comunica/actor-query-operation-nop": "^2.10.0", - "@comunica/actor-query-operation-orderby-sparqlee": "^2.10.0", - "@comunica/actor-query-operation-path-alt": "^2.10.0", - "@comunica/actor-query-operation-path-inv": "^2.10.0", - "@comunica/actor-query-operation-path-link": "^2.10.0", - "@comunica/actor-query-operation-path-nps": "^2.10.0", - "@comunica/actor-query-operation-path-one-or-more": "^2.10.0", - "@comunica/actor-query-operation-path-seq": "^2.10.0", - "@comunica/actor-query-operation-path-zero-or-more": "^2.10.0", - "@comunica/actor-query-operation-path-zero-or-one": "^2.10.0", - "@comunica/actor-query-operation-project": "^2.10.0", - "@comunica/actor-query-operation-quadpattern": "^2.10.0", - "@comunica/actor-query-operation-reduced-hash": "^2.10.0", - "@comunica/actor-query-operation-service": "^2.10.0", - "@comunica/actor-query-operation-slice": "^2.10.0", - "@comunica/actor-query-operation-sparql-endpoint": "^2.10.0", - "@comunica/actor-query-operation-union": "^2.10.0", - "@comunica/actor-query-operation-update-add-rewrite": "^2.10.0", - "@comunica/actor-query-operation-update-clear": "^2.10.0", - "@comunica/actor-query-operation-update-compositeupdate": "^2.10.0", - "@comunica/actor-query-operation-update-copy-rewrite": "^2.10.0", - "@comunica/actor-query-operation-update-create": "^2.10.0", - "@comunica/actor-query-operation-update-deleteinsert": "^2.10.0", - "@comunica/actor-query-operation-update-drop": "^2.10.0", - "@comunica/actor-query-operation-update-load": "^2.10.0", - "@comunica/actor-query-operation-update-move-rewrite": "^2.10.0", - "@comunica/actor-query-operation-values": "^2.10.0", + "@comunica/actor-query-operation-ask": "^2.10.1", + "@comunica/actor-query-operation-bgp-join": "^2.10.1", + "@comunica/actor-query-operation-construct": "^2.10.1", + "@comunica/actor-query-operation-describe-subject": "^2.10.1", + "@comunica/actor-query-operation-distinct-hash": "^2.10.1", + "@comunica/actor-query-operation-extend": "^2.10.1", + "@comunica/actor-query-operation-filter-sparqlee": "^2.10.1", + "@comunica/actor-query-operation-from-quad": "^2.10.1", + "@comunica/actor-query-operation-group": "^2.10.1", + "@comunica/actor-query-operation-join": "^2.10.1", + "@comunica/actor-query-operation-leftjoin": "^2.10.1", + "@comunica/actor-query-operation-minus": "^2.10.1", + "@comunica/actor-query-operation-nop": "^2.10.1", + "@comunica/actor-query-operation-orderby-sparqlee": "^2.10.1", + "@comunica/actor-query-operation-path-alt": "^2.10.1", + "@comunica/actor-query-operation-path-inv": "^2.10.1", + "@comunica/actor-query-operation-path-link": "^2.10.1", + "@comunica/actor-query-operation-path-nps": "^2.10.1", + "@comunica/actor-query-operation-path-one-or-more": "^2.10.1", + "@comunica/actor-query-operation-path-seq": "^2.10.1", + "@comunica/actor-query-operation-path-zero-or-more": "^2.10.1", + "@comunica/actor-query-operation-path-zero-or-one": "^2.10.1", + "@comunica/actor-query-operation-project": "^2.10.1", + "@comunica/actor-query-operation-quadpattern": "^2.10.1", + "@comunica/actor-query-operation-reduced-hash": "^2.10.1", + "@comunica/actor-query-operation-service": "^2.10.1", + "@comunica/actor-query-operation-slice": "^2.10.1", + "@comunica/actor-query-operation-sparql-endpoint": "^2.10.2", + "@comunica/actor-query-operation-union": "^2.10.1", + "@comunica/actor-query-operation-update-add-rewrite": "^2.10.1", + "@comunica/actor-query-operation-update-clear": "^2.10.2", + "@comunica/actor-query-operation-update-compositeupdate": "^2.10.1", + "@comunica/actor-query-operation-update-copy-rewrite": "^2.10.1", + "@comunica/actor-query-operation-update-create": "^2.10.2", + "@comunica/actor-query-operation-update-deleteinsert": "^2.10.2", + "@comunica/actor-query-operation-update-drop": "^2.10.2", + "@comunica/actor-query-operation-update-load": "^2.10.2", + "@comunica/actor-query-operation-update-move-rewrite": "^2.10.1", + "@comunica/actor-query-operation-values": "^2.10.1", "@comunica/actor-query-parse-graphql": "^2.10.0", "@comunica/actor-query-parse-sparql": "^2.10.0", "@comunica/actor-query-result-serialize-json": "^2.10.0", "@comunica/actor-query-result-serialize-rdf": "^2.10.0", "@comunica/actor-query-result-serialize-simple": "^2.10.0", "@comunica/actor-query-result-serialize-sparql-csv": "^2.10.0", - "@comunica/actor-query-result-serialize-sparql-json": "^2.10.0", + "@comunica/actor-query-result-serialize-sparql-json": "^2.10.2", "@comunica/actor-query-result-serialize-sparql-tsv": "^2.10.0", "@comunica/actor-query-result-serialize-sparql-xml": "^2.10.0", - "@comunica/actor-query-result-serialize-stats": "^2.10.0", + "@comunica/actor-query-result-serialize-stats": "^2.10.2", "@comunica/actor-query-result-serialize-table": "^2.10.0", "@comunica/actor-query-result-serialize-tree": "^2.10.0", "@comunica/actor-rdf-join-entries-sort-cardinality": "^2.10.0", - "@comunica/actor-rdf-join-inner-hash": "^2.10.0", - "@comunica/actor-rdf-join-inner-multi-bind": "^2.10.0", - "@comunica/actor-rdf-join-inner-multi-empty": "^2.10.0", - "@comunica/actor-rdf-join-inner-multi-smallest": "^2.10.0", - "@comunica/actor-rdf-join-inner-nestedloop": "^2.10.0", - "@comunica/actor-rdf-join-inner-none": "^2.10.0", - "@comunica/actor-rdf-join-inner-single": "^2.10.0", - "@comunica/actor-rdf-join-inner-symmetrichash": "^2.10.0", - "@comunica/actor-rdf-join-minus-hash": "^2.10.0", - "@comunica/actor-rdf-join-minus-hash-undef": "^2.10.0", - "@comunica/actor-rdf-join-optional-bind": "^2.10.0", - "@comunica/actor-rdf-join-optional-nestedloop": "^2.10.0", + "@comunica/actor-rdf-join-inner-hash": "^2.10.1", + "@comunica/actor-rdf-join-inner-multi-bind": "^2.10.1", + "@comunica/actor-rdf-join-inner-multi-empty": "^2.10.1", + "@comunica/actor-rdf-join-inner-multi-smallest": "^2.10.1", + "@comunica/actor-rdf-join-inner-nestedloop": "^2.10.1", + "@comunica/actor-rdf-join-inner-none": "^2.10.1", + "@comunica/actor-rdf-join-inner-single": "^2.10.1", + "@comunica/actor-rdf-join-inner-symmetrichash": "^2.10.1", + "@comunica/actor-rdf-join-minus-hash": "^2.10.1", + "@comunica/actor-rdf-join-minus-hash-undef": "^2.10.1", + "@comunica/actor-rdf-join-optional-bind": "^2.10.1", + "@comunica/actor-rdf-join-optional-nestedloop": "^2.10.1", "@comunica/actor-rdf-join-selectivity-variable-counting": "^2.10.0", "@comunica/actor-rdf-metadata-accumulate-cancontainundefs": "^2.10.0", "@comunica/actor-rdf-metadata-accumulate-cardinality": "^2.10.0", @@ -2901,7 +2915,7 @@ "@comunica/actor-rdf-parse-html-microdata": "^2.10.0", "@comunica/actor-rdf-parse-html-rdfa": "^2.10.0", "@comunica/actor-rdf-parse-html-script": "^2.10.0", - "@comunica/actor-rdf-parse-jsonld": "^2.10.0", + "@comunica/actor-rdf-parse-jsonld": "^2.10.2", "@comunica/actor-rdf-parse-n3": "^2.10.0", "@comunica/actor-rdf-parse-rdfxml": "^2.10.0", "@comunica/actor-rdf-parse-shaclc": "^2.10.0", @@ -2910,28 +2924,28 @@ "@comunica/actor-rdf-resolve-hypermedia-links-queue-fifo": "^2.10.0", "@comunica/actor-rdf-resolve-hypermedia-none": "^2.10.0", "@comunica/actor-rdf-resolve-hypermedia-qpf": "^2.10.0", - "@comunica/actor-rdf-resolve-hypermedia-sparql": "^2.10.0", - "@comunica/actor-rdf-resolve-quad-pattern-federated": "^2.10.0", - "@comunica/actor-rdf-resolve-quad-pattern-hypermedia": "^2.10.0", + "@comunica/actor-rdf-resolve-hypermedia-sparql": "^2.10.2", + "@comunica/actor-rdf-resolve-quad-pattern-federated": "^2.10.1", + "@comunica/actor-rdf-resolve-quad-pattern-hypermedia": "^2.10.1", "@comunica/actor-rdf-resolve-quad-pattern-rdfjs-source": "^2.10.0", "@comunica/actor-rdf-resolve-quad-pattern-string-source": "^2.10.0", "@comunica/actor-rdf-serialize-jsonld": "^2.10.0", "@comunica/actor-rdf-serialize-n3": "^2.10.0", "@comunica/actor-rdf-serialize-shaclc": "^2.10.0", - "@comunica/actor-rdf-update-hypermedia-patch-sparql-update": "^2.10.0", - "@comunica/actor-rdf-update-hypermedia-put-ldp": "^2.10.0", - "@comunica/actor-rdf-update-hypermedia-sparql": "^2.10.0", - "@comunica/actor-rdf-update-quads-hypermedia": "^2.10.0", - "@comunica/actor-rdf-update-quads-rdfjs-store": "^2.10.0", + "@comunica/actor-rdf-update-hypermedia-patch-sparql-update": "^2.10.2", + "@comunica/actor-rdf-update-hypermedia-put-ldp": "^2.10.2", + "@comunica/actor-rdf-update-hypermedia-sparql": "^2.10.2", + "@comunica/actor-rdf-update-quads-hypermedia": "^2.10.2", + "@comunica/actor-rdf-update-quads-rdfjs-store": "^2.10.2", "@comunica/bus-http-invalidate": "^2.10.0", - "@comunica/bus-query-operation": "^2.10.0", + "@comunica/bus-query-operation": "^2.10.1", "@comunica/config-query-sparql": "^2.7.0", "@comunica/core": "^2.10.0", "@comunica/logger-void": "^2.10.0", "@comunica/mediator-all": "^2.10.0", "@comunica/mediator-combine-pipeline": "^2.10.0", "@comunica/mediator-combine-union": "^2.10.0", - "@comunica/mediator-join-coefficients-fixed": "^2.10.0", + "@comunica/mediator-join-coefficients-fixed": "^2.10.1", "@comunica/mediator-number": "^2.10.0", "@comunica/mediator-race": "^2.10.0", "@comunica/runner": "^2.10.0", @@ -3151,45 +3165,24 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/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==" - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "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==", "dependencies": { - "argparse": "^2.0.1" + "brace-expansion": "^1.1.7" }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/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==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, "node_modules/@eslint/js": { @@ -3249,18 +3242,38 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@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==", + "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", @@ -3274,9 +3287,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" }, "node_modules/@inrupt/oidc-client": { "version": "1.11.6", @@ -3393,6 +3406,89 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -4210,9 +4306,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -4345,9 +4441,9 @@ } }, "node_modules/@rdfjs/data-model": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-2.0.1.tgz", - "integrity": "sha512-oRDYpy7/fJ9NNjS+M7m+dbnhi4lOWYGbBiM/A+u9bBExnN6ifXUF5mUsFxwZaQulmwTDaMhKERdV6iKTBUMgtw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-2.0.2.tgz", + "integrity": "sha512-v5LRNkLRJazMCGU7VtEzhz5wKwz/IrOdJEKapCtd35HuFbQfeGpoJP6QOXGyFHhWwKmtG+UMlZzYFyNDVE1m6g==", "bin": { "rdfjs-data-model-test": "bin/test.js" } @@ -4508,9 +4604,9 @@ } }, "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { "type-detect": "4.0.8" @@ -4525,23 +4621,47 @@ "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@solid/access-control-policy": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@solid/access-control-policy/-/access-control-policy-0.1.3.tgz", - "integrity": "sha512-LTxfN8N5hNBNYfuwJr0nyfxlp2P0+GeK+biCa1FQgIqska3wXpTgYaxjVgsw27mKx4N1FOlaGwG+nXdLnl9ykg==" - }, - "node_modules/@solid/access-token-verifier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@solid/access-token-verifier/-/access-token-verifier-2.0.5.tgz", - "integrity": "sha512-YsoMmEk7pN6tlCHcDm5iLa9ZYvTYvuk3SX5cz18XW1qYmM46znEGnXz94vm7DIa7DcTLGi9suMw7M5pRs2xOLw==", + "node_modules/@smessie/readable-web-to-node-stream": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smessie/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.3.tgz", + "integrity": "sha512-8FFE7psRtRWQT31/duqbmgnSf2++QLR2YH9kj5iwsHhnoqSvHdOY3SAN5e7dhc+60p2cNk7rv3HYOiXOapTEXQ==", "dependencies": { - "jose": "^4.10.3", - "lru-cache": "^6.0.0", - "n3": "^1.16.2", - "node-fetch": "^2.6.7", + "process": "^0.11.10", + "readable-stream": "^4.5.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@solid/access-control-policy": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@solid/access-control-policy/-/access-control-policy-0.1.3.tgz", + "integrity": "sha512-LTxfN8N5hNBNYfuwJr0nyfxlp2P0+GeK+biCa1FQgIqska3wXpTgYaxjVgsw27mKx4N1FOlaGwG+nXdLnl9ykg==" + }, + "node_modules/@solid/access-token-verifier": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solid/access-token-verifier/-/access-token-verifier-2.1.0.tgz", + "integrity": "sha512-79u92GD1SBTxjYghg2ta6cfoBNZ5ljz/9zE6RmXUypTXW7oI18DTWiSrEjWwI4njW+OMh+4ih+sAR6AkI1IFxg==", + "dependencies": { + "jose": "^5.1.3", + "lru-cache": "^6.0.0", + "n3": "^1.17.1", + "node-fetch": "^2.7.0", "ts-guards": "^0.5.1" } }, + "node_modules/@solid/access-token-verifier/node_modules/jose": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.2.tgz", + "integrity": "sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/@solid/access-token-verifier/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4686,9 +4806,9 @@ } }, "node_modules/@solid/community-server/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4987,45 +5107,21 @@ } }, "node_modules/@ts-morph/common": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.21.0.tgz", - "integrity": "sha512-ES110Mmne5Vi4ypUKrtVQfXFDtCsDXiUiGxF6ILVlE90dDD4fdpC1LSjydl/ml7xJWKSDZwUYD2zkOePMSrPBA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.22.0.tgz", + "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", "peer": true, "dependencies": { - "fast-glob": "^3.2.12", - "minimatch": "^7.4.3", - "mkdirp": "^2.1.6", + "fast-glob": "^3.3.2", + "minimatch": "^9.0.3", + "mkdirp": "^3.0.1", "path-browserify": "^1.0.1" } }, - "node_modules/@ts-morph/common/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==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@ts-morph/common/node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "peer": true, "bin": { "mkdirp": "dist/cjs/src/bin.js" @@ -5075,9 +5171,9 @@ "integrity": "sha512-HlZ6Dcr205BmNhwkdXqrg2vkFMN2PluI7Lgr8In3B3wE5PiQHhjRqtW/lGdVU9gw+sM0JcIDx2AN+cW8oSWIcw==" }, "node_modules/@types/babel__core": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", - "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -5088,9 +5184,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" @@ -5107,9 +5203,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -5155,11 +5251,12 @@ } }, "node_modules/@types/clownface": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/clownface/-/clownface-2.0.4.tgz", - "integrity": "sha512-NAV4bUtQetmHf+vBIDdAcPmgC26ObDOPHB2jowhcMb6phRlcRPMRZ0YwY77p1Iic4K8htlnBquZS2ld4UFO6hA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/clownface/-/clownface-2.0.7.tgz", + "integrity": "sha512-juRApsKi3UgyjmVH9mu1W8VmVe9EBu642BAZ8jdb3tEGOv6oDk2W9JEBRmjTeWVgoGu0GL1GPzlhYt5rIPcL9A==", "dependencies": { - "rdf-js": "^4.0.2" + "@rdfjs/types": ">=1.0.0", + "@types/rdfjs__environment": "*" } }, "node_modules/@types/connect": { @@ -5176,9 +5273,9 @@ "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" }, "node_modules/@types/cookies": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.10.tgz", - "integrity": "sha512-hmUCjAk2fwZVPPkkPBcI7jGLIR5mg4OVoNMBwU6aVsMm/iNPY7z9/R+x2fSwLt/ZXoGua6C5Zy2k5xOo9jUyhQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", "dependencies": { "@types/connect": "*", "@types/express": "*", @@ -5187,9 +5284,9 @@ } }, "node_modules/@types/cors": { - "version": "2.8.16", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.16.tgz", - "integrity": "sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dependencies": { "@types/node": "*" } @@ -5208,9 +5305,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.44.7", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", - "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", "peer": true, "dependencies": { "@types/estree": "*", @@ -5245,9 +5342,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -5321,9 +5418,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -5333,8 +5430,7 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "peer": true + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -5350,14 +5446,14 @@ } }, "node_modules/@types/jsonld": { - "version": "1.5.12", - "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.12.tgz", - "integrity": "sha512-y2EDlpPhuifmqcijoLV0zu9Pw3fd40RIZqpX4V0v7cq6vVFXjBOMhCGe2SlfTPzTZBJLZUFBidWshTYFfInvDQ==" + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.13.tgz", + "integrity": "sha512-n7fUU6W4kSYK8VQlf/LsE9kddBHPKhODoVOjsZswmve+2qLwBy6naWxs/EiuSZN9NU0N06Ra01FR+j87C62T0A==" }, "node_modules/@types/keygrip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.5.tgz", - "integrity": "sha512-M+BUYYOXgiYoab5L98VpOY1PzmDwWcTkqqu4mdluez5qOTDV0MVPChxhRIPeIFxQgSi3+6qjg1PnGFaGlW373g==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" }, "node_modules/@types/keyv": { "version": "3.1.4", @@ -5368,9 +5464,9 @@ } }, "node_modules/@types/koa": { - "version": "2.13.11", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.11.tgz", - "integrity": "sha512-0HZSGNdmLlLRvSxv0ngLSp09Hw98c+2XL3ZRYmkE6y8grqTweKEyyaj7LgxkyPUv0gQ5pNS/a7kHXo2Iwha1rA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", + "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", @@ -5391,9 +5487,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.201", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", - "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==" + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" }, "node_modules/@types/lodash.orderby": { "version": "4.6.9", @@ -5409,9 +5505,9 @@ "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" }, "node_modules/@types/luxon": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.1.tgz", - "integrity": "sha512-m1KQEZZCITtheRhMVq5jDvAl0HwFhunLs7x6tpFFvUTJpKfmewS/Ymg+YA97/s8w1I1nC4pJyi0aAnn+vf3yew==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==" }, "node_modules/@types/marked": { "version": "4.3.2", @@ -5443,17 +5539,17 @@ } }, "node_modules/@types/node": { - "version": "20.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", - "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", + "version": "20.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", + "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", "dev": true, "dependencies": { "@types/node": "*", @@ -5493,14 +5589,14 @@ } }, "node_modules/@types/punycode": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/punycode/-/punycode-2.1.2.tgz", - "integrity": "sha512-KKQ4GjRCpswGPA6ZfvPrC+7h84bAvPkU1kFGJ3FuQOgZIEc8JmO1jcDCaxSiYcN3qzOOp9YqHq+njKEO3Q4BnA==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/punycode/-/punycode-2.1.4.tgz", + "integrity": "sha512-trzh6NzBnq8yw5e35f8xe8VTYjqM3NE7bohBtvDVf/dtUer3zYTLK1Ka3DG3p7bdtoaOHZucma6FfVKlQ134pQ==" }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -5508,11 +5604,11 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/rdf-dataset-indexed": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/@types/rdf-dataset-indexed/-/rdf-dataset-indexed-0.4.10.tgz", - "integrity": "sha512-X5ET9apEn/7hy6FAGDxnC7G8fQTk7yJqkOuGAmFPSvirfZsr0Bd0CiO/21naETRUuQZU2S3Z2QrILGcjADJCWg==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/@types/rdf-dataset-indexed/-/rdf-dataset-indexed-0.4.11.tgz", + "integrity": "sha512-q59w+46GHfXquNCRcL08sc6kciUs+jczfw22wPKjXmEFvbxzflPc2vGMgDBT61ypCD8veyV6VIOycgqoo/dfcA==", "dependencies": { - "rdf-js": "^4.0.2" + "@rdfjs/types": ">=1.0.0" } }, "node_modules/@types/rdf-ext": { @@ -5543,6 +5639,15 @@ "@types/node": "*" } }, + "node_modules/@types/rdfjs__environment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/rdfjs__environment/-/rdfjs__environment-1.0.0.tgz", + "integrity": "sha512-MDcnv3qfJvbHoEpUQXj5muT8g3e+xz1D8sGevrq3+Q4TzeEvQf5ijGX5l8485XFYrN/OBApgzXkHMZC04/kd5w==", + "dependencies": { + "@rdfjs/types": "*", + "@types/node": "*" + } + }, "node_modules/@types/rdfjs__namespace": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/rdfjs__namespace/-/rdfjs__namespace-2.0.10.tgz", @@ -5579,9 +5684,9 @@ "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==" }, "node_modules/@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==" + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==" }, "node_modules/@types/send": { "version": "0.17.4", @@ -5608,11 +5713,11 @@ "integrity": "sha512-qtOaDz+IXiNndPgYb6t1YoutnGvFRtWSNzpVjkAPCfB2UzTyybuD4Tjgs7VgRawum3JnJNRwNQd4N//SvrHg1Q==" }, "node_modules/@types/sparqljs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/sparqljs/-/sparqljs-3.1.8.tgz", - "integrity": "sha512-A9cCkdFzMMYeY1oyd+yxqc0DEyrKnq/M5rPZ/xgGrRhlHglNt0JXw+uh9JsS0IbIOdWKXiqwD2Bn2wGhpSCrYA==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@types/sparqljs/-/sparqljs-3.1.10.tgz", + "integrity": "sha512-rqMpUhl/d8B+vaACa6ZVdwPQ1JXw+KxiCc0cndgn/V6moRG3WjUAgoBnhSwfKtXD98wgMThDsc6R1+yRUuMsAg==", "dependencies": { - "rdf-js": "^4.0.2" + "@rdfjs/types": ">=1.0.0" } }, "node_modules/@types/stack-utils": { @@ -5637,31 +5742,31 @@ "integrity": "sha512-3l1qMm3wqO0iyC5gkADzT95UVW7C/XXcdvUcShOideKF0ddgVRErEQQJXBd2kvQm+aSgqhBGHGB38TgMeT57Ww==" }, "node_modules/@types/uuid": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", - "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==" + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" }, "node_modules/@types/websocket": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.9.tgz", - "integrity": "sha512-xrMBdqdKdlE+7L9Wg2PQblIkZGSgiMlEoP6UAaYKMHbbxqCJ6PV/pTZ2RcMcSSERurU2TtGbmO4lqpFOJd01ww==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.10.tgz", + "integrity": "sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/ws": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", - "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dependencies": { "@types/yargs-parser": "*" } @@ -5699,7 +5804,24 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", @@ -5712,7 +5834,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", @@ -5740,98 +5862,54 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/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/parser/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/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "engines": { - "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" } }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5840,10 +5918,11 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -5866,10 +5945,11 @@ } } }, - "node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -5882,6 +5962,45 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/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/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/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.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", @@ -6093,7 +6212,8 @@ "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" }, "node_modules/abort-controller": { "version": "3.0.0", @@ -6129,6 +6249,29 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha512-j3/4pkfih8W4NK22gxVSXcEonTpAHOHh0hu5BoZrKcOsW/4oBPxTi4Yk3SAj+FhC1f3+bRTkXdm4019gw1vg9g==", + "dev": true, + "optional": true, + "dependencies": { + "acorn": "^2.1.0" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", + "dev": true, + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -6138,9 +6281,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "peer": true, "engines": { "node": ">=0.4.0" @@ -6185,6 +6328,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -6233,13 +6388,9 @@ "peer": 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" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/arr-diff": { "version": "4.0.0", @@ -6266,12 +6417,15 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "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==", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6316,16 +6470,16 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "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==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" @@ -6334,10 +6488,28 @@ "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==", + "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==", + "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.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==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -6369,28 +6541,29 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "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": { @@ -6441,9 +6614,9 @@ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/async-lock": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", - "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" }, "node_modules/asynciterator": { "version": "3.8.1", @@ -6483,9 +6656,9 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", "engines": { "node": ">= 0.4" }, @@ -6524,6 +6697,112 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "dependencies": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "node_modules/babel-generator/node_modules/jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/babel-generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -6615,6 +6894,15 @@ "node": ">=8" } }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -6710,6 +6998,101 @@ "@babel/core": "^7.0.0" } }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse/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/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-traverse/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -6827,13 +7210,18 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -6881,9 +7269,9 @@ "integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg==" }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "funding": [ { "type": "opencollective", @@ -6899,9 +7287,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -7080,13 +7468,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7110,9 +7503,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001563", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz", - "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==", + "version": "1.0.30001587", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", + "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", "funding": [ { "type": "opencollective", @@ -7160,6 +7553,92 @@ "node": ">=10" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha512-9LDHQy1jHc/eXMzPN6/oah9Qba4CjdKECC7YYEE/2zge/tsGwt19NQp5NFdfd5Lx6TZlyC5SXNQkG41P9r6XDg==", + "dev": true, + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/cheerio/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/cheerio/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -7351,6 +7830,12 @@ "color-name": "1.1.3" } }, + "node_modules/color-logger": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.6.tgz", + "integrity": "sha512-0iBj3eHRYnor8EJi3oQ1kixbr7B2Sbw1InxjsYZxS+q2H+Ii69m3ARYSJeYIqmf/QRtFhWnR1v97wp8N7ABubw==", + "dev": true + }, "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", @@ -7410,9 +7895,9 @@ } }, "node_modules/componentsjs": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/componentsjs/-/componentsjs-5.4.2.tgz", - "integrity": "sha512-qIeXLozDkvubl6qtiovWsIBRqUP80w1ImTbilB6QE3OQgaEExI8pYZ9MkZ10QDFtdoKUryztlqp0AWs49t4puA==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/componentsjs/-/componentsjs-5.5.1.tgz", + "integrity": "sha512-hmqq+ZUa98t9CoeWPGwE14I18aXQFAt66HRd8DaZCNggcSr82vhlyrjeXX0JAUMgr2MyQzwKstkv4INRAREguA==", "dependencies": { "@rdfjs/types": "*", "@types/minimist": "^1.2.0", @@ -7431,9 +7916,6 @@ }, "bin": { "componentsjs-compile-config": "bin/compile-config.js" - }, - "engines": { - "node": ">=8.0" } }, "node_modules/componentsjs-generator": { @@ -7459,26 +7941,80 @@ "node": ">=12.0" } }, - "node_modules/componentsjs-generator/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/componentsjs-generator/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/componentsjs-generator/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dependencies": { - "yallist": "^4.0.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=10" + "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/componentsjs-generator/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "node_modules/componentsjs-generator/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/componentsjs-generator/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/componentsjs-generator/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/componentsjs/node_modules/@types/node": { - "version": "18.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.10.tgz", - "integrity": "sha512-luANqZxPmjTll8bduz4ACs/lNTCLuWssCyjqTY9yLdsv1xnViQp3ISKwsEWOIecO13JWUqjVdig/Vjjc09o8uA==", + "version": "18.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", + "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", "dependencies": { "undici-types": "~5.26.4" } @@ -7533,9 +8069,9 @@ "dev": true }, "node_modules/cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dependencies": { "depd": "~2.0.0", "keygrip": "~1.1.0" @@ -7553,9 +8089,9 @@ } }, "node_modules/core-js": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz", - "integrity": "sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.1.tgz", + "integrity": "sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -7771,10 +8307,83 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/css-select/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "optional": true + }, + "node_modules/cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "dev": true, + "optional": true, + "dependencies": { + "cssom": "0.3.x" + } + }, "node_modules/csv-stringify": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.4.tgz", - "integrity": "sha512-NDshLupGa7gp4UG4sSNIqwYJqgSwvds0SvENntxoVoVvTzXcrHvd5gG2MWpbRpSNvk59dlmIe1IwNvSxN4IVmg==" + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.5.tgz", + "integrity": "sha512-SPu1Vnh8U5EnzpNOi1NDBL5jU5Rx7DVHr15DNg9LXDTAbQlAVAmEbVt16wZvEW9Fu9Qt4Ji8kmeCJ2B1+4rFTQ==" }, "node_modules/csv-writer": { "version": "1.6.0", @@ -7901,16 +8510,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.3.tgz", + "integrity": "sha512-h3GBouC+RPtNX2N0hHVLo2ZwPYurq8mLmXpOLTsw71gr7lHt5VaI4vVkDUNOfiWmm48JEXe3VM7PmLX45AMmmg==", "dependencies": { - "get-intrinsic": "^1.2.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -7979,6 +8592,18 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -8090,14 +8715,14 @@ } }, "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "version": "16.4.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.3.tgz", + "integrity": "sha512-II98GFrje5psQTSve0E7bnwMFybNLqT8Vu8JIFWRjsE3khyNUm/loZupuy5DVzG2IXf/ysxvrixYOQnM6mjD3A==", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/dtrace-provider": { @@ -8142,9 +8767,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.588", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.588.tgz", - "integrity": "sha512-soytjxwbgcCu7nh5Pf4S2/4wa6UIu+A3p03U2yVr53qGxi1/VTR3ENI+p50v+UxqqZAfl48j3z55ud7VHIOr9w==" + "version": "1.4.667", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.667.tgz", + "integrity": "sha512-66L3pLlWhTNVUhnmSA5+qDM3fwnXsM6KAqE36e2w4KN0g6pkEtlT5bs41FQtQwVwKnfhNBXiWRLPs30HSxd7Kw==" }, "node_modules/emittery": { "version": "0.13.1", @@ -8287,25 +8912,53 @@ "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==" + }, + "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==", + "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==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.16.tgz", + "integrity": "sha512-CREG2A9Vq7bpDRnldhFcMKuKArvkZtsH6Y0DHOHVg49qhf+LD8uEdUM3OkOAICv0EziGtDEnQtqY2/mfBILpFw==", "dependencies": { "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.6", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.1", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-module-lexer": { @@ -8385,9 +9038,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -8405,147 +9058,757 @@ "node": ">=0.8.0" } }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "optional": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@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", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "esprima": "^4.0.1", + "estraverse": "^4.2.0", "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.8.1" }, "bin": { - "eslint": "bin/eslint.js" + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=4.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "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/escodegen/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "optional": true, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" + "node": ">=4.0" } }, - "node_modules/eslint-config-standard-jsx": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", - "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peerDependencies": { - "eslint": "^8.8.0", - "eslint-plugin-react": "^7.28.0" + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "optional": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.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==", + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "optional": true, "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/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==", - "dependencies": { - "ms": "^2.1.1" + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "optional": true, "dependencies": { - "debug": "^3.2.7" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">= 0.8.0" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", + "node_modules/esdoc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esdoc/-/esdoc-1.1.0.tgz", + "integrity": "sha512-vsUcp52XJkOWg9m1vDYplGZN2iDzvmjDL5M/Mp8qkoDG3p2s0yIQCIjKR5wfPBaM3eV14a6zhQNYiNTCVzPnxA==", + "dev": true, + "dependencies": { + "babel-generator": "6.26.1", + "babel-traverse": "6.26.0", + "babylon": "6.18.0", + "cheerio": "1.0.0-rc.2", + "color-logger": "0.0.6", + "escape-html": "1.0.3", + "fs-extra": "5.0.0", + "ice-cap": "0.0.4", + "marked": "0.3.19", + "minimist": "1.2.0", + "taffydb": "2.7.3" + }, + "bin": { + "esdoc": "out/src/ESDocCLI.js" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-accessor-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esdoc-accessor-plugin/-/esdoc-accessor-plugin-1.0.0.tgz", + "integrity": "sha512-s9mNmdHGOyQOaOUXNHPz38Y8clm6dR8/fa9DPGzuRYmIN+Lv0NVnpPAcHb5XrfC23/Mz3IUwD8h798f5Ai4rbA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-brand-plugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esdoc-brand-plugin/-/esdoc-brand-plugin-1.0.1.tgz", + "integrity": "sha512-Yv9j3M7qk5PSLmSeD6MbPsfIsEf8K43EdH8qZpE/GZwnJCRVmDPrZJ1cLDj/fPu6P35YqgcEaJK4E2NL/CKA7g==", + "dev": true, + "dependencies": { + "cheerio": "0.22.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-brand-plugin/node_modules/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", + "dev": true, + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/esdoc-brand-plugin/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/esdoc-brand-plugin/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/esdoc-brand-plugin/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/esdoc-brand-plugin/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/esdoc-brand-plugin/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/esdoc-brand-plugin/node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/esdoc-brand-plugin/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/esdoc-coverage-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esdoc-coverage-plugin/-/esdoc-coverage-plugin-1.1.0.tgz", + "integrity": "sha512-M+94/Y+eoM08V3teiJIYpJ5HF13jH4cC9LQZrjmA91mlAqCHtNzelHF9ZdWofoOFYFRNpllFsXTFsJgwVa000A==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-external-ecmascript-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esdoc-external-ecmascript-plugin/-/esdoc-external-ecmascript-plugin-1.0.0.tgz", + "integrity": "sha512-ASj7lhfZpzI01xd4XqB4HN+zNKwnhdaN/OIp/CTnUiLIErMOeUqzV9z/dcnUUeDY3NSwPCH1pUNATVwznspmHw==", + "dev": true, + "dependencies": { + "fs-extra": "1.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-external-ecmascript-plugin/node_modules/fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "node_modules/esdoc-external-ecmascript-plugin/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/esdoc-integrate-manual-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esdoc-integrate-manual-plugin/-/esdoc-integrate-manual-plugin-1.0.0.tgz", + "integrity": "sha512-+XcW8xRtuFVFadoVLIOj6kzX4uqtAEB5UoR7AA5g46StxLghZZ6RLrRQSERUTIc3VX9v47lOMKEaQvQfanv3+A==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-integrate-test-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esdoc-integrate-test-plugin/-/esdoc-integrate-test-plugin-1.0.0.tgz", + "integrity": "sha512-WRbkbnbWnzF4RdmcoJLYZvhod7jLVUYWU2ZAojYjK+GiqSgy2yjGi7PxckeGF0LtpCuqqKat3PRdUNEMo6Nf3A==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-lint-plugin": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/esdoc-lint-plugin/-/esdoc-lint-plugin-1.0.2.tgz", + "integrity": "sha512-24AYqD2WbZI9We02I7/6dzAa7yUliRTFUaJCZAcYJMQicJT5gUrNFVaI8XmWEN/mhF3szIn1uZBNWeLul4CmNw==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-publish-html-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/esdoc-publish-html-plugin/-/esdoc-publish-html-plugin-1.1.2.tgz", + "integrity": "sha512-hG1fZmTcEp3P/Hv/qKiMdG1qSp8MjnVZMMkxL5P5ry7I2sX0HQ4P9lt2lms+90Lt0r340HHhSuVx107UL7dphg==", + "dev": true, + "dependencies": { + "babel-generator": "6.11.4", + "cheerio": "0.22.0", + "escape-html": "1.0.3", + "fs-extra": "1.0.0", + "ice-cap": "0.0.4", + "marked": "0.3.19", + "taffydb": "2.7.2" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/babel-generator": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.11.4.tgz", + "integrity": "sha512-JFBWXdE89s4V3E8kZroEEsnQF2A4/+55IzciGjnAATXj7HTMSum3SrW7QRYGSDLWTTQF+hhD3BmC2UFGgtM0Yw==", + "dev": true, + "dependencies": { + "babel-messages": "^6.8.0", + "babel-runtime": "^6.9.0", + "babel-types": "^6.10.2", + "detect-indent": "^3.0.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", + "dev": true, + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha512-xo3WP66SNbr1Eim85s/qyH0ZL8PQUwp86HWm0S1l8WnJ/zjT6T3w1nwNA0yOZeuvOemupEYvpvF6BIdYRuERJQ==", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + }, + "bin": { + "detect-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/esdoc-publish-html-plugin/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/esdoc-publish-html-plugin/node_modules/fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha512-Nh30JLeMHdoI+AsQ5eblhZ7YlTsM9wiJQe/AHIunlK3KWzvXhXb36IJ7K1IOeRjIOtzMjdUHjwXUFxKJoPTSOg==", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "bin": { + "repeating": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esdoc-publish-html-plugin/node_modules/taffydb": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.2.tgz", + "integrity": "sha512-R6es6/C/m1xXZckrSam4j07YKbd74437mRJ/R944S1hLG7mIl2/EQW7tQPI4XiX7jTduFzz31g7466a2BcsglQ==", + "dev": true + }, + "node_modules/esdoc-standard-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esdoc-standard-plugin/-/esdoc-standard-plugin-1.0.0.tgz", + "integrity": "sha512-IDEG9NV/MF5Bi2TdKPqQ3GHfDkgqYhk2iyvBNX+XcNKYmXm9zxtXVS459WAmiTZuYpDLtDGbulQdJ1t4ud57mw==", + "dev": true, + "dependencies": { + "esdoc-accessor-plugin": "^1.0.0", + "esdoc-brand-plugin": "^1.0.0", + "esdoc-coverage-plugin": "^1.0.0", + "esdoc-external-ecmascript-plugin": "^1.0.0", + "esdoc-integrate-manual-plugin": "^1.0.0", + "esdoc-integrate-test-plugin": "^1.0.0", + "esdoc-lint-plugin": "^1.0.0", + "esdoc-publish-html-plugin": "^1.0.0", + "esdoc-type-inference-plugin": "^1.0.0", + "esdoc-undocumented-identifier-plugin": "^1.0.0", + "esdoc-unexported-identifier-plugin": "^1.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-type-inference-plugin": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/esdoc-type-inference-plugin/-/esdoc-type-inference-plugin-1.0.2.tgz", + "integrity": "sha512-tMIcEHNe1uhUGA7lT1UTWc9hs2dzthnTgmqXpmeUhurk7fL2tinvoH+IVvG/sLROzwOGZQS9zW/F9KWnpMzLIQ==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-undocumented-identifier-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esdoc-undocumented-identifier-plugin/-/esdoc-undocumented-identifier-plugin-1.0.0.tgz", + "integrity": "sha512-T0hQc0ec1+pUJPDBoJ2SxEv7uX9VD7Q9+7UAGnDZ5R2l2JYa3WY7cawyqfbMHVtLgvqH0eMBpxdfRsQvAWzj4Q==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc-unexported-identifier-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esdoc-unexported-identifier-plugin/-/esdoc-unexported-identifier-plugin-1.0.0.tgz", + "integrity": "sha512-PRdMLWHWdy9PwxzYDG2clhta9H7yHDpGCBIHxSw9R7TFK6ZYuPK1fUbURIzIxcdQhzt1PX9Cn6Cak2824K0+Ng==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/esdoc/node_modules/fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/esdoc/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/esdoc/node_modules/marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esdoc/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==", + "dev": true + }, + "node_modules/esdoc/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@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", + "escape-string-regexp": "^4.0.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", + "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.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-config-standard-jsx": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peerDependencies": { + "eslint": "^8.8.0", + "eslint-plugin-react": "^7.28.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==", + "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==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "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==", "dependencies": { @@ -8593,9 +9856,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -8613,7 +9876,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -8622,6 +9885,15 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -8641,6 +9913,17 @@ "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==", + "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", @@ -8649,6 +9932,31 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-jest": { + "version": "27.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.8.0.tgz", + "integrity": "sha512-347hVFiu4ZKMYl5xFp0X81gLNwBdno0dl0CMpUMjwuAux9X/M2a7z+ab2VHmPL6XCT87q8nv1vaVzhIO4TE/hw==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, "node_modules/eslint-plugin-jsdoc": { "version": "48.0.6", "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.0.6.tgz", @@ -8717,6 +10025,26 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-promise": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", @@ -8757,6 +10085,15 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -8768,6 +10105,17 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -8857,10 +10205,14 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/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==" + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", @@ -8904,46 +10256,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8952,43 +10264,15 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "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==", "dependencies": { - "p-limit": "^3.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, "node_modules/eslint/node_modules/supports-color": { @@ -9002,17 +10286,6 @@ "node": ">=8" } }, - "node_modules/eslint/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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -9438,6 +10711,17 @@ "node": ">=8" } }, + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-glob/node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9486,9 +10770,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dependencies": { "reusify": "^1.0.4" } @@ -9522,11 +10806,12 @@ } }, "node_modules/fetch-sparql-endpoint": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/fetch-sparql-endpoint/-/fetch-sparql-endpoint-4.1.0.tgz", - "integrity": "sha512-RQwr4+RpEiWZqubPCv05t7t1Y8ZDAmiJ4cCo0Ee9vmet4bjnDIiZIpAtJn9NMLBeVxpZfxGiPFcX6V0v2yVcUA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fetch-sparql-endpoint/-/fetch-sparql-endpoint-4.1.1.tgz", + "integrity": "sha512-q0TLXPoAM/rA3OaHH4LvfJzaN8vVmaEVNNFtH3xsz9L40YIiAWSdbg2c/Ze/JL75kf8Iktbh1tItHZoottCh2Q==", "dependencies": { "@rdfjs/types": "*", + "@smessie/readable-web-to-node-stream": "^3.0.3", "@types/readable-stream": "^2.3.11", "@types/sparqljs": "^3.1.3", "abort-controller": "^3.0.0", @@ -9535,7 +10820,6 @@ "minimist": "^1.2.0", "n3": "^1.6.3", "rdf-string": "^1.6.0", - "readable-web-to-node-stream": "^3.0.2", "sparqljs": "^3.1.2", "sparqljson-parse": "^2.2.0", "sparqlxml-parse": "^2.1.1", @@ -9572,14 +10856,6 @@ "minimatch": "^5.0.1" } }, - "node_modules/filelist/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==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -9655,16 +10931,18 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { @@ -9691,9 +10969,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -9904,15 +11182,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "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" } @@ -9952,12 +11234,13 @@ } }, "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==", "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" @@ -10002,14 +11285,14 @@ } }, "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==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob-to-regexp": { @@ -10018,13 +11301,38 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "peer": true }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -10178,6 +11486,27 @@ "node": ">=6" } }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -10195,11 +11524,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10228,11 +11557,11 @@ } }, "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==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -10287,9 +11616,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dependencies": { "function-bind": "^1.1.2" }, @@ -10313,9 +11642,9 @@ "dev": true }, "node_modules/htmlparser2": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.0.0.tgz", - "integrity": "sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -10442,6 +11771,125 @@ "node": ">=10.17.0" } }, + "node_modules/ice-cap": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/ice-cap/-/ice-cap-0.0.4.tgz", + "integrity": "sha512-39ZblYEKlqj7LHgLkUcVk7zcJp772lOVQAUhN6QyY88w8/4bn5SgDeU2020yzHosf+uKPuCFK1UQ36gyBNiraw==", + "dev": true, + "dependencies": { + "cheerio": "0.20.0", + "color-logger": "0.0.3" + } + }, + "node_modules/ice-cap/node_modules/cheerio": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz", + "integrity": "sha512-e5jCTzJc28MWkrLLjB1mu3ks7rDQJLC5y/JMdQkOAEX/dmJk62rC6Xae1yvOO4xyCxLpzcth3jIZ7nypmjQ/0w==", + "dev": true, + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "lodash": "^4.1.0" + }, + "engines": { + "node": ">= 0.6" + }, + "optionalDependencies": { + "jsdom": "^7.0.2" + } + }, + "node_modules/ice-cap/node_modules/color-logger": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.3.tgz", + "integrity": "sha512-s4oriek7VTdSmDbS5chJhNui3uUzlk/mU39V4HnOUv0KphRXpIj73lq4wY5f8l/x+WtHUhiV+FCzsrNO1w6REA==", + "dev": true + }, + "node_modules/ice-cap/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/ice-cap/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/ice-cap/node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/ice-cap/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/ice-cap/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/ice-cap/node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", + "dev": true, + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/ice-cap/node_modules/htmlparser2/node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "dev": true + }, + "node_modules/ice-cap/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/ice-cap/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ice-cap/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -10473,17 +11921,17 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -10497,15 +11945,7 @@ "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-local": { @@ -10527,6 +11967,58 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/import-local/node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -10562,11 +12054,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -10574,6 +12066,15 @@ "node": ">= 0.4" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ioredis": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", @@ -10633,13 +12134,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10799,6 +12302,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -10989,11 +12504,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "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==", "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -11057,9 +12572,9 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/iso8601-duration": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/iso8601-duration/-/iso8601-duration-2.1.1.tgz", - "integrity": "sha512-VGGpW30/R57FpG1J7RqqKBAaK7lIiudlZkQ5tRoO9hNlKYQNnhs60DQpXlPFBmp6I+kJ61PHkI3f/T7cR4wfbw==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/iso8601-duration/-/iso8601-duration-2.1.2.tgz", + "integrity": "sha512-yXteYUiKv6x8seaDzyBwnZtPpmx766KfvQuaVNyPifYOjmPdOo3ajd4phDNa7Y5mTQGnXsNEcXFtVun1FjYXxQ==" }, "node_modules/isobject": { "version": "3.0.1", @@ -11204,6 +12719,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/jake/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -11243,6 +12767,17 @@ "node": ">=8" } }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/jake/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13001,13 +14536,11 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -13027,6 +14560,65 @@ "node": ">=12.0.0" } }, + "node_modules/jsdom": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz", + "integrity": "sha512-kYeYuos/pYp0V/V8VAoGnUc0va0UZjTjwCsldBFZNBrOi9Q5kUXrvsw6W5/lQllB7hKXBARC4HRk1Sfk4dPFtA==", + "dev": true, + "optional": true, + "dependencies": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.29 < 0.3.0", + "escodegen": "^1.6.1", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.2.0", + "webidl-conversions": "^2.0.0", + "whatwg-url-compat": "~0.6.5", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + } + }, + "node_modules/jsdom/node_modules/abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "optional": true + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", + "dev": true, + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==", + "dev": true, + "optional": true + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz", + "integrity": "sha512-OZ7I/f0sM+T28T2/OXinNGfmvjm3KKptdyQy8NPRZyLfYBn+9vt72Bfr+uQaE9OvWyxJjQ5kHFygH2wOTUb76g==", + "dev": true, + "optional": true + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -13129,9 +14721,9 @@ } }, "node_modules/jsonld-context-parser/node_modules/@types/node": { - "version": "18.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.10.tgz", - "integrity": "sha512-luANqZxPmjTll8bduz4ACs/lNTCLuWssCyjqTY9yLdsv1xnViQp3ISKwsEWOIecO13JWUqjVdig/Vjjc09o8uA==", + "version": "18.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", + "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", "dependencies": { "undici-types": "~5.26.4" } @@ -13254,6 +14846,15 @@ "node": ">=0.10.0" } }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -13264,15 +14865,15 @@ } }, "node_modules/koa": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", - "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.0.tgz", + "integrity": "sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw==", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", "content-disposition": "~0.5.2", "content-type": "^1.0.4", - "cookies": "~0.8.0", + "cookies": "~0.9.0", "debug": "^4.3.2", "delegates": "^1.0.0", "depd": "^2.0.0", @@ -13582,15 +15183,17 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -13598,16 +15201,52 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", + "dev": true + }, + "node_modules/lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", + "dev": true + }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, + "node_modules/lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", + "dev": true + }, "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "dev": true + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -13624,6 +15263,30 @@ "resolved": "https://registry.npmjs.org/lodash.orderby/-/lodash.orderby-4.6.0.tgz", "integrity": "sha512-T0rZxKmghOOf5YPnn8EY5iLYeWCpZq8G41FfqoVHH5QDTAFaghJRmAdLiadEDq+ztgM2q5PjA+Z1fOwGrLgmtg==" }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "dev": true + }, + "node_modules/lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", + "dev": true + }, + "node_modules/lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", + "dev": true + }, + "node_modules/lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", + "dev": true + }, "node_modules/log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -13652,9 +15315,9 @@ } }, "node_modules/loglevel": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", - "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", "engines": { "node": ">= 0.6.0" }, @@ -13700,9 +15363,9 @@ } }, "node_modules/lru-cache": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.3.tgz", - "integrity": "sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "engines": { "node": "14 || >=16.14" } @@ -13958,14 +15621,17 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -13999,10 +15665,18 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mock-socket": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", + "integrity": "sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==", + "engines": { + "node": ">= 8" + } + }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "engines": { "node": "*" } @@ -14026,6 +15700,16 @@ "node": ">=0.8.0" } }, + "node_modules/mv/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/mv/node_modules/glob": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", @@ -14042,6 +15726,18 @@ "node": "*" } }, + "node_modules/mv/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/mv/node_modules/rimraf": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", @@ -14198,9 +15894,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.0.tgz", - "integrity": "sha512-PbZERfeFdrHQOOXiAKOY0VPbykZy90ndPKk0d+CFDegTKmWp1VgOTz2xACVbr1BjCWxrQp68CXtvNsveFhqDJg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -14214,14 +15910,14 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/nodemailer": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", - "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.9.tgz", + "integrity": "sha512-dexTll8zqQoVJEZPwQAKzxxtFn0qTnjdQTchoU6Re9BUUGBJiOy3YMn/0ShTW6J5M0dfQ1NeDeRTTl4oIWgQMA==", "engines": { "node": ">=6.0.0" } @@ -14258,6 +15954,22 @@ "node": ">=8" } }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "dev": true, + "optional": true + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -14357,12 +16069,12 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -14403,14 +16115,15 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "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==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "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.hasown": { @@ -14550,11 +16263,11 @@ "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" }, "node_modules/openid-client": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.1.tgz", - "integrity": "sha512-PtrWsY+dXg6y8mtMPyL/namZSYVz8pjXz3yJiBNZsEdCnu9miHLB4ELVC85WvneMKo2Rg62Ay7NkuCpM0bgiLQ==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.4.tgz", + "integrity": "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA==", "dependencies": { - "jose": "^4.15.1", + "jose": "^4.15.4", "lru-cache": "^6.0.0", "object-hash": "^2.2.0", "oidc-token-hash": "^5.0.3" @@ -14618,27 +16331,14 @@ } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "p-try": "^2.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14689,6 +16389,15 @@ "xtend": "~4.0.1" } }, + "node_modules/parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -14900,49 +16609,6 @@ "node": ">=10" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -15167,68 +16833,11 @@ } }, "node_modules/rate-limited-ldp-communication": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/rate-limited-ldp-communication/-/rate-limited-ldp-communication-1.0.5.tgz", - "integrity": "sha512-5jDxeUQp4a/waECw+HO1UeVYqszTyQzsTkIyLqo7EhvmCR3Smz/VudONjLSim7SdwgKsGOi2CQdXB+v6Yqqpew==", - "dependencies": { - "@treecg/versionawareldesinldp": "^0.2.2" - } - }, - "node_modules/rate-limited-ldp-communication/node_modules/@rdfjs/data-model": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-1.3.4.tgz", - "integrity": "sha512-iKzNcKvJotgbFDdti7GTQDCYmL7GsGldkYStiP0K8EYtN7deJu5t7U11rKTz+nR7RtesUggT+lriZ7BakFv8QQ==", - "dependencies": { - "@rdfjs/types": ">=1.0.1" - }, - "bin": { - "rdfjs-data-model-test": "bin/test.js" - } - }, - "node_modules/rate-limited-ldp-communication/node_modules/@treecg/types": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@treecg/types/-/types-0.4.5.tgz", - "integrity": "sha512-vPEVVlRDPQz8KwQmC6SKW5cTgggrBmEapw1Plg7beVX6pmfM1bll7lMnHGNLJDmoDyfAkR6LV4nB/VLGpjGBPA==", - "dependencies": { - "@rdfjs/types": "*", - "loglevel": "^1.8.1", - "loglevel-plugin-prefix": "^0.8.4", - "rdf-data-factory": "^1.1.0" - } - }, - "node_modules/rate-limited-ldp-communication/node_modules/@treecg/versionawareldesinldp": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@treecg/versionawareldesinldp/-/versionawareldesinldp-0.2.2.tgz", - "integrity": "sha512-rcuMe971KrUYomA+xMgiOdKez99hZ/PM3dgQkSYL2RYpCA2HKBMYlVpuY4n0YXyy25YjzmpX/WcJfd9g2dO6OQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/rate-limited-ldp-communication/-/rate-limited-ldp-communication-1.0.7.tgz", + "integrity": "sha512-lDnBvhok96UkQS3TRo5yKqWh3vvXkSNQCuYfjnpi3fYkWgSlt4Ov2E5dZ/wKzILDYqCNzxA9lOw+e66cBwcdMw==", "dependencies": { - "@inrupt/solid-client-authn-node": "1.12.1", - "@rdfjs/data-model": "^1.3.4", - "@rubensworks/solid-client-authn-isomorphic": "^2.0.0", - "@treecg/ldes-snapshot": "^0.1.1", - "@treecg/types": "^0.4.0", - "componentsjs": "^5.3.2", - "componentsjs-generator": "^3.1.0", - "dotenv": "^16.0.1", - "express": "^4.17.3", - "loglevel": "^1.8.0", - "loglevel-plugin-prefix": "^0.8.4", - "n3": "^1.14.0", - "parse-link-header": "^2.0.0", - "rdf-store-stream": "^1.3.1", - "streamify-string": "^1.0.1", - "tinyduration": "^3.2.3", - "typescript": "^4.6.2", - "uuid": "^8.3.2", - "wac-allow": "^1.0.0", - "yargs": "^17.4.1" - } - }, - "node_modules/rate-limited-ldp-communication/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "@treecg/versionawareldesinldp": "^0.3.0" } }, "node_modules/raw-body": { @@ -15374,14 +16983,15 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/rdf-js/-/rdf-js-4.0.2.tgz", "integrity": "sha512-ApvlFa/WsQh8LpPK/6hctQwG06Z9ztQQGWVtrcrf9L6+sejHNXLPOqL+w7q3hF+iL0C4sv3AX1PUtGkLNzyZ0Q==", + "deprecated": "Use @types/rdf-js instead. See https://github.com/rdfjs/types?tab=readme-ov-file#what-about-typesrdf-js", "dependencies": { "@rdfjs/types": "*" } }, "node_modules/rdf-literal": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-1.3.1.tgz", - "integrity": "sha512-+o/PGOfJchyay9Rjrvi/oveRJACnt2WFO3LhEvtPlsRD1tFmwVUCMU+s33FtQprMo+z1ohFrv/yfEQ6Eym4KgQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-1.3.2.tgz", + "integrity": "sha512-79Stlu3sXy0kq9/decHFLf3xNPuY6sfhFPhd/diWErgaFr0Ekyg38Vh9bnVcqDYu48CFRi0t+hrFii49n92Hbw==", "dependencies": { "@rdfjs/types": "*", "rdf-data-factory": "^1.1.0" @@ -15405,9 +17015,9 @@ } }, "node_modules/rdf-parse": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/rdf-parse/-/rdf-parse-2.3.2.tgz", - "integrity": "sha512-TOeI7FKlyr/GupfGaXZvpMLzvByOrtwt4zHLMuuy3deNGse9QyhHsspVraZam491sIgBogdchzcUqkf2WXnAsg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/rdf-parse/-/rdf-parse-2.3.3.tgz", + "integrity": "sha512-N5XEHm+ajFzwo/vVNzB4tDtvqMwBosbVJmZl5DlzplQM9ejlJBlN/43i0ImAb/NMtJJgQPC3jYnkCKGA7wdo/w==", "dependencies": { "@comunica/actor-http-fetch": "^2.0.1", "@comunica/actor-http-proxy": "^2.0.1", @@ -15446,9 +17056,9 @@ } }, "node_modules/rdf-serialize": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/rdf-serialize/-/rdf-serialize-2.2.2.tgz", - "integrity": "sha512-zzWQMMMmDzocuFLEOcdz8U5AxbdjBvknwFEHXCyw2lklcEjd2OtsvD5NgWQc+zbsWZKxewvDYEXuzhkNAHRv1g==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rdf-serialize/-/rdf-serialize-2.2.3.tgz", + "integrity": "sha512-t3AvH3lw1NUufCUjf6/pxOyU/cPBJ0J3TkMP+FuUJKMmsJ1FzFdNkpsIMp9QFmWtqUYijyhYpVfJ4Tqprl+1RA==", "dependencies": { "@comunica/actor-rdf-serialize-jsonld": "^2.6.6", "@comunica/actor-rdf-serialize-n3": "^2.6.6", @@ -15487,9 +17097,9 @@ } }, "node_modules/rdf-streaming-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/rdf-streaming-store/-/rdf-streaming-store-1.1.0.tgz", - "integrity": "sha512-C/5NTKGpKrNJ5VUo42DtGFsXYDlP3rx/u4C6gEBuSn+6eVFahjFdUDgNGcPtVyhCQkctRCj3GT1lX9UeyoXWtw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rdf-streaming-store/-/rdf-streaming-store-1.1.3.tgz", + "integrity": "sha512-rCP+wETf5jfSX8a32niSnbtf+R4UFxbjgbZNw0n8HB5DIcwm6epUAU7V4bBQOlm1NDHfwY92k4H5oQwOLBtQuA==", "dependencies": { "@rdfjs/types": "*", "@types/n3": "^1.10.4", @@ -15585,9 +17195,9 @@ } }, "node_modules/rdflib": { - "version": "2.2.32", - "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-2.2.32.tgz", - "integrity": "sha512-JMQ0fPMkgTjpP6AaQK1bMZtgG3Q1FauKdefAtROXVMCfm3JggoHbAn4HwzypajtskN2xyhbePt9SJXxYspUMWw==", + "version": "2.2.33", + "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-2.2.33.tgz", + "integrity": "sha512-5OwoVbjY8CutaSJ7FLx2PhaMTpYX6y2bhDPijLkMESXncDi/eZ+53NH2+FrOWTltSMo3e27VYpiGPh3qhofWrA==", "dependencies": { "@babel/runtime": "^7.21.0", "@frogcat/ttl2jsonld": "^0.0.9", @@ -15655,9 +17265,9 @@ } }, "node_modules/rdflib/node_modules/jsonld": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.3.1.tgz", - "integrity": "sha512-tYfKpWL56meSJCHS91Ph0+EUThHZOZ8bKuboME4998SF+Kkukp2PhCPdRCvA7tsGUKr9FvSoyIRqJPuImBcBuA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.3.2.tgz", + "integrity": "sha512-MwBbq95szLwt8eVQ1Bcfwmgju/Y5P2GdtlHE2ncyfuYjIdEhluUVyj1eudacf1mOkWIoS9GpDBTECqhmq7EOaA==", "dependencies": { "@digitalbazaar/http-client": "^3.4.1", "canonicalize": "^1.0.1", @@ -15748,16 +17358,16 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/rdfxml-streaming-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rdfxml-streaming-parser/-/rdfxml-streaming-parser-2.3.0.tgz", - "integrity": "sha512-t8O4v7UUw4aRKIdro68p0YdpP/xbv6GGpEe05HAXbsTo4OTELx/vBzAciTP+P51O6TaywVSXPAsPyK9/sQRT8A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/rdfxml-streaming-parser/-/rdfxml-streaming-parser-2.4.0.tgz", + "integrity": "sha512-f+tdI1wxOiPzMbFWRtOwinwPsqac0WIN80668yFKcVdFCSTGOWTM70ucQGUSdDZZo7pce/UvZgV0C3LDj0P7tg==", "dependencies": { "@rdfjs/types": "*", "@rubensworks/saxes": "^6.0.1", "@types/readable-stream": "^2.3.13", "buffer": "^6.0.3", "rdf-data-factory": "^1.1.0", - "readable-stream": "^4.0.0", + "readable-stream": "^4.4.2", "relative-to-absolute-iri": "^1.0.0", "validate-iri": "^1.0.0" } @@ -15769,9 +17379,9 @@ "dev": true }, "node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -15857,14 +17467,15 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -15876,9 +17487,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regex-not": { "version": "1.0.2", @@ -15893,13 +17504,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "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==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "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" @@ -15940,6 +17552,18 @@ "node": ">=0.10" } }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -16042,7 +17666,7 @@ "node": ">=8" } }, - "node_modules/resolve-from": { + "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", @@ -16051,6 +17675,14 @@ "node": ">=8" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -16160,12 +17792,12 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "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==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -16216,14 +17848,17 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "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" } @@ -16241,6 +17876,13 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true, + "optional": true + }, "node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -16353,14 +17995,16 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "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==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "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.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -16461,13 +18105,17 @@ } }, "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.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.6", + "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" @@ -16721,9 +18369,9 @@ "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==" }, "node_modules/sparqlalgebrajs": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/sparqlalgebrajs/-/sparqlalgebrajs-4.3.1.tgz", - "integrity": "sha512-cKX7c6kXvewSvBiftTxtDmFG2iqi8CtLpqErAwgrVdsbOKuDww63QcGo63Jqjhpk3H022LWlWm1OO2COq6Rtmg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/sparqlalgebrajs/-/sparqlalgebrajs-4.3.3.tgz", + "integrity": "sha512-g5+fYsb+7bNDTR72cCo/BSUgTroYr3hVtf+bAz7jszx6yU8+hHZxcoDuT+zkCA3sfHs/qG9oYDD/TA3UsH07eA==", "dependencies": { "@rdfjs/types": "*", "@types/sparqljs": "^3.1.3", @@ -16804,9 +18452,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, "node_modules/split-string": { @@ -17249,13 +18897,13 @@ } }, "node_modules/supertest": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", - "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", + "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^8.0.5" + "superagent": "^8.1.2" }, "engines": { "node": ">=6.4.0" @@ -17283,6 +18931,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "optional": true + }, + "node_modules/taffydb": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", + "integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==", + "dev": true + }, "node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -17292,9 +18953,9 @@ } }, "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -17310,16 +18971,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -17367,9 +19028,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "peer": true, "dependencies": { "randombytes": "^2.1.0" @@ -17391,9 +19052,9 @@ } }, "node_modules/terser/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "peer": true, "bin": { "acorn": "bin/acorn" @@ -17422,6 +19083,28 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/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/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -17525,6 +19208,15 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/triple-beam": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", @@ -17551,9 +19243,9 @@ "integrity": "sha512-Y6P/VJnwARiPMfxO7rvaYaz5tGQ5TQ0Wnb2cWIxMpFOioYkhsT8XaCrJX6wYPNFACa4UOrN5SPqhwpM8NolAhQ==" }, "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -17569,7 +19261,7 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", @@ -17594,19 +19286,19 @@ } }, "node_modules/ts-morph": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-20.0.0.tgz", - "integrity": "sha512-JVmEJy2Wow5n/84I3igthL9sudQ8qzjh/6i4tmYCm6IqYyKFlNbJZi7oBdjyqcWSWYRu3CtL0xbT6fS03ESZIg==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-21.0.1.tgz", + "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", "peer": true, "dependencies": { - "@ts-morph/common": "~0.21.0", + "@ts-morph/common": "~0.22.0", "code-block-writer": "^12.0.0" } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -17647,9 +19339,9 @@ } }, "node_modules/ts-node/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "peer": true, "bin": { "acorn": "bin/acorn" @@ -17659,9 +19351,9 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -17768,10 +19460,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, + "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==", "engines": { "node": ">=10" }, @@ -17792,13 +19483,13 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", + "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -17899,9 +19590,9 @@ } }, "node_modules/undici": { - "version": "5.27.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", - "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -18150,9 +19841,9 @@ "peer": true }, "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -18246,9 +19937,9 @@ } }, "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", "engines": { "node": ">= 8" } @@ -18264,19 +19955,19 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.90.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", + "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", + "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.11.5", "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", @@ -18290,7 +19981,7 @@ "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -18343,9 +20034,9 @@ } }, "node_modules/webpack/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "peer": true, "bin": { "acorn": "bin/acorn" @@ -18445,6 +20136,16 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/whatwg-url-compat": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", + "integrity": "sha512-vbg5+JVNwGtHRI3GheZGWrcUlxF9BXHbA80dLa+2XqJjlV/BK6upoi2j8dIRW9FGPUUyaMm7Hf1pTexHnsk85g==", + "dev": true, + "optional": true, + "dependencies": { + "tr46": "~0.0.1" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -18514,15 +20215,15 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "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==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -18553,9 +20254,9 @@ } }, "node_modules/winston-transport": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", - "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", "dependencies": { "logform": "^2.3.2", "readable-stream": "^3.6.0", @@ -18591,6 +20292,16 @@ "node": ">= 6" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -18661,9 +20372,9 @@ } }, "node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { "node": ">=10.0.0" }, @@ -18688,6 +20399,13 @@ "node": ">=8" } }, + "node_modules/xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==", + "dev": true, + "optional": true + }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index 0dcabc2..5f718a3 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "start": "npx tsc && cp -r ./src/static ./dist && node --max-old-space-size=8192 dist/index.js ", "start-aggregation": "npx tsc && cp -r ./src/static ./dist && node --max-old-space-size=8192 dist/index.js aggregation", + "docs": "esdoc", "test": "jest --coverage", "test:watch": "jest --watch", "start-solid-server": "cd scripts && rm -rf data/.internal/accounts && npx community-solid-server --config ./pod/config/unsafe.json -f ./data/ --seededPodConfigJson ./pod/pod_credentials.json -w 0", @@ -13,7 +14,8 @@ "start-solid-server-extended-lock": "cd scripts && rm -rf data/.internal/ && npx community-solid-server --config ./pod/config/extendedlock.json -f ./data/ --seededPodConfigJson ./pod/pod_credentials.json", "test-run": "cd scripts && rm -rf data/.internal/ && npx community-solid-server --config ./pod/config/auth.json -f ./data/ --seededPodConfigJson ./pod/pod_credentials.json --workers 1", "lint:ts": "eslint . --ext ts --report-unused-disable-directives --max-warnings 0", - "lint:ts:fix": "eslint . --ext ts --report-unused-disable-directives --max-warnings 0 --fix" + "lint:ts:fix": "eslint . --ext ts --report-unused-disable-directives --max-warnings 0 --fix", + "lint:no-warning": "eslint . --ext ts --quiet --max-warnings 0" }, "keywords": [], "author": "Kushagra Singh Bisen", @@ -24,7 +26,10 @@ "@types/node-fetch": "^2.6.0", "@types/websocket": "^1.0.6", "@typescript-eslint/parser": "^6.21.0", + "esdoc": "^1.1.0", + "esdoc-standard-plugin": "^1.0.0", "eslint": "^8.56.0", + "eslint-plugin-jest": "^27.8.0", "eslint-plugin-jsdoc": "^48.0.6", "jest": "^29.3.1", "ldfetch": "^1.2.8", @@ -39,6 +44,7 @@ "@treecg/ldes-snapshot": "^0.1.1", "@treecg/versionawareldesinldp": "^0.3.0", "@types/luxon": "^3.4.1", + "buffer": "^6.0.3", "bunyan": "^1.8.15", "cors": "^2.8.5", "css-auth-login": "^1.0.8", @@ -46,6 +52,7 @@ "csv-writer": "^1.6.0", "express": "^4.18.2", "luxon": "^3.4.4", + "mock-socket": "^9.3.1", "perf_hooks": "^0.0.1", "rate-limited-ldp-communication": "^1.0.5", "rdf-isomorphic": "^1.3.1", diff --git a/scratch/test.ts b/scratch/test.ts deleted file mode 100644 index 1600dd9..0000000 --- a/scratch/test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { LDESinLDP, LDPCommunication } from "@treecg/versionawareldesinldp"; -// const pod_location_bvp = "http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/"; -const pod_location_bvp = "http://localhost:3000/dataset_participant1/xyz/"; - -/** - * - */ -async function main() { - let counter = 0; - const ldes = new LDESinLDP(pod_location_bvp, new LDPCommunication()); - const stream = await ldes.readAllMembers(); - stream.on("data", (data) => { - counter++; - }); - - stream.on("end", () => { - console.log(counter); - }); -} - -main(); \ No newline at end of file diff --git a/scratch/test.ttl b/scratch/test.ttl deleted file mode 100644 index fffb804..0000000 --- a/scratch/test.ttl +++ /dev/null @@ -1,11 +0,0 @@ -@prefix dahccsensors: . -@prefix ldes: . -@prefix saref: . -@prefix solid: . -@prefix tree: . -@prefix type: . - -<#bvpDataset> a ldes:EventStream ; - ldes:timestampPath saref:hasTimestamp ; - tree:shape ; - tree:view . diff --git a/scratch/typeindex-test.ts b/scratch/typeindex-test.ts deleted file mode 100644 index d0d7602..0000000 --- a/scratch/typeindex-test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import {LDPCommunication} from "@treecg/versionawareldesinldp"; -const communication = new LDPCommunication(); -const pod_location = "http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/"; - -// communication.get(pod_location).then(async(response) => { -// const stream = response.text(); -// console.log(await stream); - -// }); - -// communication.put(pod_location + "settings/publicTypeIndex", `@prefix dahccsensors: . -// @prefix ldes: . -// @prefix saref: . -// @prefix solid: . -// @prefix tree: . -// @prefix type: . - -// <#bvpDataset> a ldes:EventStream ; -// ldes:timestampPath saref:hasTimestamp ; -// tree:shape ; -// tree:view . -// `).then(async(response) => { -// const stream = response.text(); -// console.log(await stream); -// }); - -const body = `INSERT DATA { . }`; - -// let body = `INSERT DATA {<#bvpDataset> }` - -communication.patch(pod_location + "settings/publicTypeIndex", body).then(async(response) => { - const stream = response.text(); - console.log(await stream); -}); - diff --git a/scripts/addIndex.ts b/scripts/addIndex.ts index 6d99490..60d8ef8 100644 --- a/scripts/addIndex.ts +++ b/scripts/addIndex.ts @@ -3,21 +3,23 @@ import { LDPCommunication } from "@treecg/versionawareldesinldp"; const communication = new LDPCommunication(); /** - * - * @param pod_location + * Create a public type index for the given pod location. + * @param {string} pod_location - The location of the pod. + * @returns {Promise} - The response of the request. */ export async function createPublicTypeIndex(pod_location: string) { const body = `INSERT DATA {${pod_location}profile/card#> ${pod_location}settings/publicTypeIndex> . }`; communication.patch(pod_location + 'settings/publicTypeIndex', body).then(async (response) => { + console.log(`Response: ${response.status} ${response.statusText}`); console.log(`Public type index created at ${pod_location}settings/publicTypeIndex`); }) } /** - * - * @param pod_location - * @param ldes_location - * @param sensor_metric + * Add a stream to the public type index. + * @param {string} pod_location - The location of the pod. + * @param {string} ldes_location - The location of the LDES stream stored in the pod. + * @param {string} sensor_metric - The sensor metric. */ export async function addStreamToPublicTypeIndex(pod_location: string, ldes_location: string, sensor_metric: string) { communication.put(pod_location + "settings/publicTypeIndex", ` @@ -34,18 +36,21 @@ export async function addStreamToPublicTypeIndex(pod_location: string, ldes_loca tree:shape <${ldes_location}public/bvpEventTemplate.shacl> ; tree:view <${ldes_location}> . `).then(async (response) => { + console.log(`Response: ${response.status} ${response.statusText}`); console.log(`Stream added to ${pod_location}settings/publicTypeIndex`); }); } /** - * - * @param pod_location - * @param tree_path - * @param type + * Add a property to the public type index. + * @param {string} pod_location - The location of the pod. + * @param {string} tree_path - The path of the tree which was used to fragment the LDES stream. + * @param {string} type - The type of the property. + * @returns {Promise} - The response of the request. */ export async function addPropertyToPublicTypeIndex(pod_location: string, tree_path: string, type: string) { communication.patch(pod_location + "settings/publicTypeIndex", `INSERT DATA {<#bvpDataset> <${tree_path}> <${type}>}`).then(async (response) => { + console.log(`Response: ${response.status} ${response.statusText}`); console.log(`Type ${type} with Property ${tree_path} added to ${pod_location}settings/publicTypeIndex`); }); } \ No newline at end of file diff --git a/scripts/pod/AggregatorAbstraction.ts b/scripts/pod/AggregatorAbstraction.ts index eb9c82a..3d5c728 100644 --- a/scripts/pod/AggregatorAbstraction.ts +++ b/scripts/pod/AggregatorAbstraction.ts @@ -1,6 +1,9 @@ import { storeToString } from "@treecg/versionawareldesinldp"; - const N3 = require('n3'); +/** + * Class for adding the aggregator to the solid pod's profile card. + * @class AggregatorAbstraction + */ export class AggregatorAbstraction { /** * @@ -9,16 +12,29 @@ export class AggregatorAbstraction { * @memberof AggregatorAbstraction */ pod_aggregator_location: Map; + /** + * Creates an instance of AggregatorAbstraction. + * @param {Map} aggregator_map - A map of the solid pod URLs with the location of the aggregator. + * @memberof AggregatorAbstraction + */ constructor(aggregator_map: Map) { this.pod_aggregator_location = aggregator_map; } - + /** + * Adds the aggregator to the solid pod card. + * @memberof AggregatorAbstraction + */ public add_aggregator_to_pod_card() { this.pod_aggregator_location.forEach((pod_location: string, aggregator_location: string) => { this.patch_request(pod_location, aggregator_location); }); } - + /** + * Patches the solid pod with the aggregator location. + * @param {string} solid_pod_url - The URL of the solid pod. + * @param {string} aggregator_location - The location of the aggregator. + * @memberof AggregatorAbstraction + */ public patch_request(solid_pod_url: string, aggregator_location: string) { const store = new N3.Store(); store.addQuad( diff --git a/scripts/pod/createMultiPod.ts b/scripts/pod/createMultiPod.ts index 90f740c..73eec06 100644 --- a/scripts/pod/createMultiPod.ts +++ b/scripts/pod/createMultiPod.ts @@ -19,9 +19,16 @@ type myType = { const fileObject: myType = { solidpod: [], }; - +/** + * Class for preparing the solid pods for the multi-pod setup. + * @class prepareSolidPod + */ export class prepareSolidPod { - + /** + * Lists the files in the directory and creates a solid pod's email and password for each file. + * @param {string} path - The path to the directory. + * @memberof prepareSolidPod + */ async listFile(path: string) { const dir = await fs.promises.opendir(path) for await (const value of dir) { @@ -38,9 +45,14 @@ export class prepareSolidPod { fileObject.solidpod.push(solidObject); } } - + /** + * Writes the JSON file with the solid pod credentials. + * @param {multipod[]} object - The object to write to the JSON file. + * @memberof prepareSolidPod + */ async writeJSONFile(object: multipod[]) { - for await (const { } of object) { + for await (const pod of object) { + console.log(`The pod name is ${pod.pod_name}`); const podContent: string = JSON.stringify(fileObject.solidpod) jsonFile.writeFile('pod_credentials.json', JSON.parse(podContent), function (error: string) { if (error) { diff --git a/src/config/PodToken.ts b/src/config/PodToken.ts index 23f821a..f0c9d07 100644 --- a/src/config/PodToken.ts +++ b/src/config/PodToken.ts @@ -1,5 +1,5 @@ import * as fs from 'fs'; -import { generateToken} from "../utils/authentication/css-auth" +import { generateToken } from "../utils/authentication/CSSAuthentication" export type auth_object = { email: string, @@ -16,15 +16,16 @@ export type css_credentials = { /** - * - * @param json_file - * @param service_name - * @param identity_provider + * Create a client credentials token for CSS v4.0.0 and higher from the file. + * @param {string} json_file - The file containing the credentials. + * @param {string} service_name - The service name (e.g. Solid-Stream-Aggregator in our case). + * @param {string} identity_provider - The identity provider. + * @returns {Map} - The resulting map of credentials. */ -export async function create_authentication_token_css(json_file: string, service_name: string, identity_provider: string) { +export async function create_authentication_token_css(json_file: string, service_name: string, identity_provider: string): Promise> { const auth_token_map = new Map(); const json_string = fs.readFileSync(json_file, 'utf8'); - const data = JSON.parse(json_string); + const data = JSON.parse(json_string); for (const cred of data) { const token = await generateToken({ email: cred.email, @@ -36,11 +37,11 @@ export async function create_authentication_token_css(json_file: string, service id: token.id, secret: token.secret, idp: identity_provider - } + } auth_token_map.set(cred.email, credentials); } - console.log(auth_token_map); + return auth_token_map; } create_authentication_token_css('src/config/pod_authentication.json', 'Solid-Stream-Aggregator', 'http://localhost:3000/'); diff --git a/tests/unit/service/aggregator/AggregatorInstantiator.test.ts b/src/index.test.ts similarity index 100% rename from tests/unit/service/aggregator/AggregatorInstantiator.test.ts rename to src/index.test.ts diff --git a/src/index.ts b/src/index.ts index b8e46a7..7eeeaa5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -49,7 +49,3 @@ program }); program.parse(); - -// ``` -// 2023-09-05T13:24:30.888Z [ListeningActivityHandler] {Primary} error: Error trying to handle notification for http://localhost:3000/.notifications/WebSocketChannel2023/3a05c98d-4ab7-4be6-b2ad-e7bd24dc38e2: Lock expired after 6000ms on http://localhost:3000/aggregation_pod/aggregation_new/1692373487374 -// ``` \ No newline at end of file diff --git a/src/server/AggregatorPod.ts b/src/server/AggregatorPod.ts index 0cb7a28..bdabf59 100644 --- a/src/server/AggregatorPod.ts +++ b/src/server/AggregatorPod.ts @@ -1,12 +1,23 @@ const { exec } = require('child_process'); - +/** + * Class for creating a solid pod for the aggregator. + * @class AggregatorPod + */ export class AggregatorPod{ + /** + * Creates an instance of AggregatorPod. + * @memberof AggregatorPod + */ constructor(){ this.create_solid_pod(); } - + /** + * Creates a solid pod for the aggregator. + * @returns {Promise} - The solid pod is created but the return is void. + * @memberof AggregatorPod + */ public async create_solid_pod(): Promise{ - exec('npx community-solid-server --config src/server/aggregator-pod/config.json -f ./aggregation-data/ --seededPodConfigJson src/server/aggregator-pod/account.json', (err: any, stdout: any, stderr: any) => { + exec('npx community-solid-server --config src/server/aggregator-pod/config.json -f ./aggregation-data/ --seededPodConfigJson src/server/aggregator-pod/account.json', (err: any) => { if (err) { console.error(err); return; diff --git a/src/server/EndpointQueries.ts b/src/server/EndpointQueries.ts index 1f45a0e..d79c073 100644 --- a/src/server/EndpointQueries.ts +++ b/src/server/EndpointQueries.ts @@ -1,5 +1,16 @@ - +/** + * This class contains the queries for the endpoints. + * @class EndpointQueries + */ export class EndpointQueries { + /** + * Get the query for the given name. + * @param {string} name - The name of the query. + * @param {Date} from_timestamp - The start of the time window. + * @param {Date} to_timestamp - The end of the time window. + * @returns {string} - The query. + * @memberof EndpointQueries + */ get_query(name: string, from_timestamp: Date, to_timestamp: Date) { const from = Date.parse(from_timestamp.toString()) const to = Date.parse(to_timestamp.toString()); diff --git a/tests/unit/service/aggregator/DecentralizedFileStreamer.test.ts b/src/server/GETHandler.test.ts similarity index 100% rename from tests/unit/service/aggregator/DecentralizedFileStreamer.test.ts rename to src/server/GETHandler.test.ts diff --git a/src/server/GETHandler.ts b/src/server/GETHandler.ts index a0141c0..ec9f0d6 100644 --- a/src/server/GETHandler.ts +++ b/src/server/GETHandler.ts @@ -1,20 +1,40 @@ import { IncomingMessage, ServerResponse } from "http"; -import { QueryRegistry } from "../service/query-registry/QueryRegistry"; import fs from 'fs'; -import { EndpointQueries } from "./EndpointQueries"; +import { QueryRegistry } from "../service/query-registry/QueryRegistry"; +/** + * Class for handling the GET request from the client. + * @class GETHandler + */ export class GETHandler { - public static async handle(req: IncomingMessage, res: ServerResponse, solid_server_url: string, query_registry: QueryRegistry, endpoint_queries: EndpointQueries, latest_minutes: number, logger: any) { - const to_timestamp = new Date().getTime(); // current time - const from_timestamp = new Date(to_timestamp - (latest_minutes * 60)).getTime(); // latest minutes ago + /** + * Handle the GET request from the client. + * @static + * @param {IncomingMessage} req - The request from the client. + * @param {ServerResponse} res - The response to the client. + * @param {QueryRegistry} query_registry - The QueryRegistry object. + * @memberof GETHandler + */ + public static async handle(req: IncomingMessage, res: ServerResponse, query_registry: QueryRegistry) { if (req.url !== undefined) { - const endpoint = req.url.split('?')[0]; - } - else { - const file = fs.readFileSync('dist/static/index.html'); - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.write(file.toString()); + /** + * The following API path of the Solid Stream Aggregator is used to clear all of the registered queries from the query registry. + */ + if (req.url === '/clearQueryRegistry') { + query_registry.delete_all_queries_from_the_registry(); + res.write('Query registry cleared'); } - + } + else { + const endpoint = req.url; + console.log('Endpoint: ' + endpoint); + /** + * The API path showcases a default HTML Page for the Solid Stream Aggregator. + */ + const file = fs.readFileSync('dist/static/index.html'); + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.write(file.toString()); } } + +} diff --git a/src/server/HTTPServer.test.ts b/src/server/HTTPServer.test.ts new file mode 100644 index 0000000..4041b01 --- /dev/null +++ b/src/server/HTTPServer.test.ts @@ -0,0 +1,59 @@ +import { HTTPServer } from './HTTPServer'; + +describe('HTTPServer', () => { + let httpServer: HTTPServer; + + beforeEach(() => { + // Mock values + const httpPort = 8080; + const solidServerUrl = 'http://example.com'; + const logger = jest.fn(); + + httpServer = new HTTPServer(httpPort, solidServerUrl, logger); + }); + + afterEach(() => { + // Cleanup code if needed + }); + + it('should handle GET requests', () => { + // Mock request and response objects + const req = {} as any; + const res = { + setHeader: jest.fn(), + end: jest.fn(), + } as any; + + // Call the request handler + httpServer['request_handler'](req, res); + + // Assert the response + expect(res.setHeader).toHaveBeenCalledWith('Access-Control-Allow-Origin', '*'); + expect(res.setHeader).toHaveBeenCalledWith('Access-Control-Allow-Methods', 'OPTIONS, GET'); + // Add more assertions as needed + }); + + it('should handle POST requests', () => { + // Mock request and response objects + const req = { + method: 'POST', + url: '/registerQuery', + on: jest.fn(), + } as any; + const res = { + setHeader: jest.fn(), + writeHead: jest.fn(), + end: jest.fn(), + } as any; + + // Call the request handler + httpServer['request_handler'](req, res); + + // Assert the response + expect(res.setHeader).toHaveBeenCalledWith('Access-Control-Allow-Origin', '*'); + expect(res.setHeader).toHaveBeenCalledWith('Access-Control-Allow-Methods', 'OPTIONS, GET'); + // Add more assertions as needed + }); + + // Add more test cases as needed +}); \ No newline at end of file diff --git a/src/server/HTTPServer.ts b/src/server/HTTPServer.ts index 7d6d10d..7a2fa91 100644 --- a/src/server/HTTPServer.ts +++ b/src/server/HTTPServer.ts @@ -2,14 +2,15 @@ import { createServer, ServerResponse, IncomingMessage, Server } from "http"; import { GETHandler } from "./GETHandler"; import { LDESPublisher } from "../service/publishing-stream-to-pod/LDESPublisher"; import { QueryRegistry } from "../service/query-registry/QueryRegistry"; -import { EndpointQueries } from "./EndpointQueries"; import { POSTHandler } from "./POSTHandler"; import { WebSocketHandler } from "./WebSocketHandler"; import * as websocket from 'websocket'; -const url = require('url'); const EventEmitter = require('events'); const event_emitter = new EventEmitter(); - +/** + * Class for the HTTP Server. + * @class HTTPServer + */ export class HTTPServer { private readonly http_server: Server; public solid_server_url: string; @@ -18,8 +19,14 @@ export class HTTPServer { public query_registry: any; public websocket_server: any; public aggregation_publisher: any; - public endpoint_queries: EndpointQueries; public websocket_handler: any; + /** + * Creates an instance of HTTPServer. + * @param {number} http_port - The port on which the HTTP server is to be started. + * @param {string} solid_server_url - The URL of the Solid Server. + * @param {*} logger - The logger object. + * @memberof HTTPServer + */ constructor(http_port: number, solid_server_url: string, logger: any) { this.solid_server_url = solid_server_url; this.dynamic_endpoints = {}; @@ -32,27 +39,31 @@ export class HTTPServer { this.http_server.keepAliveTimeout = 6000; this.aggregation_publisher = new LDESPublisher(); this.query_registry = new QueryRegistry(); - this.endpoint_queries = new EndpointQueries(); this.websocket_handler = new WebSocketHandler(this.websocket_server, event_emitter, this.aggregation_publisher, this.logger); this.websocket_handler.handle_wss(); this.websocket_handler.aggregation_event_publisher(); this.logger.info({}, 'http_server_started'); } - + /** + * Handle the request from the client. + * Handles the GET and the POST requests from the client. + * @private + * @param {IncomingMessage} req - The request from the client. + * @param {ServerResponse} res - The response to the client. + * @memberof HTTPServer + */ private request_handler(req: IncomingMessage, res: ServerResponse) { - const parsed_url = url.parse(req.url, true); - const endpoint_name = parsed_url.pathname?.split(1); res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET'); + let body: string = ''; switch (req.method) { case "GET": - const latest_minutes = parsed_url.query.latest_minutes; - GETHandler.handle(req, res, this.solid_server_url, this.query_registry, this.endpoint_queries, latest_minutes, this.logger); + GETHandler.handle(req, res, this.query_registry); res.end(); break; case "POST": // TODO : bug that the notification is sent more than once from the solid server. - let body: string = ''; + // Relevant issue : https://github.com/SolidLabResearch/solid-stream-aggregator/issues/33 req.on('data', (chunk: Buffer) => { body = body + chunk.toString(); }); @@ -67,8 +78,7 @@ export class HTTPServer { event_emitter.emit(notification); } }); - - if (req.url = '/registerQuery') { + if (req.url === '/registerQuery') { POSTHandler.handle(req, res, this.query_registry, this.solid_server_url, this.logger); } break; diff --git a/src/server/POSTHandler.test.ts b/src/server/POSTHandler.test.ts new file mode 100644 index 0000000..20715e2 --- /dev/null +++ b/src/server/POSTHandler.test.ts @@ -0,0 +1,171 @@ +import { POSTHandler } from './POSTHandler'; +import { IncomingMessage, ServerResponse } from 'http'; +import { QueryRegistry } from '../service/query-registry/QueryRegistry'; +describe('POSTHandler', () => { + describe('handle', () => { + it('should handle rspql query', async () => { + // Mock dependencies and setup test data + const req = {} as IncomingMessage; + const res = {} as ServerResponse; + const query_registry = {} as QueryRegistry; + const solid_server_url = 'http://example.com'; + const logger = console; + + const body = { + query: 'SELECT * WHERE { ?s ?p ?o }', + latest_minutes: 10, + query_type: 'rspql', + }; + const post_body = JSON.stringify(body); + + // Mock request events + req.on = jest.fn().mockImplementation((event, callback) => { + if (event === 'data') { + callback(Buffer.from(post_body)); + } else if (event === 'end') { + callback(); + } + }); + + // Call the handle method + await POSTHandler.handle(req, res, query_registry, solid_server_url, logger); + + // Assert the expected behavior + // Add your assertions here + }); + + it('should handle sparql query', async () => { + // Mock dependencies and setup test data + const req = {} as IncomingMessage; + const res = {} as ServerResponse; + const query_registry = {} as QueryRegistry; + const solid_server_url = 'http://example.com'; + const logger = console; + + const body = { + query: 'SELECT * WHERE { ?s ?p ?o }', + latest_minutes: 10, + query_type: 'sparql', + }; + const post_body = JSON.stringify(body); + + // Mock request events + req.on = jest.fn().mockImplementation((event, callback) => { + if (event === 'data') { + callback(Buffer.from(post_body)); + } else if (event === 'end') { + callback(); + } + }); + + // Call the handle method + await POSTHandler.handle(req, res, query_registry, solid_server_url, logger); + + // Assert the expected behavior + // Add your assertions here + }); + + it('should handle other query types', async () => { + // Mock dependencies and setup test data + const req = {} as IncomingMessage; + const res = {} as ServerResponse; + const query_registry = {} as QueryRegistry; + const solid_server_url = 'http://example.com'; + const logger = console; + + const body = { + query: 'SELECT * WHERE { ?s ?p ?o }', + latest_minutes: 10, + query_type: 'other', + }; + const post_body = JSON.stringify(body); + + // Mock request events + req.on = jest.fn().mockImplementation((event, callback) => { + if (event === 'data') { + callback(Buffer.from(post_body)); + } else if (event === 'end') { + callback(); + } + }); + + // Call the handle method + await POSTHandler.handle(req, res, query_registry, solid_server_url, logger); + + // Assert the expected behavior + // Add your assertions here + }); + }); + + describe('handle_ws_query', () => { + it('should handle ws query', async () => { + // Mock dependencies and setup test data + const query = 'SELECT * WHERE { ?s ?p ?o }'; + const width = 10; + const query_registry = {} as QueryRegistry; + const logger = console; + const websocket_connections = new Map(); + + // Call the handle_ws_query method + await POSTHandler.handle_ws_query(query, width, query_registry, logger, websocket_connections); + + // Assert the expected behavior + // Add your assertions here + }); + }); + + describe('connect_with_server', () => { + it('should connect with server', async () => { + // Mock dependencies and setup test data + const wssURL = 'ws://example.com'; + + // Call the connect_with_server method + await POSTHandler.connect_with_server(wssURL); + + // Assert the expected behavior + // Add your assertions here + }); + }); + + describe('sendToServer', () => { + it('should send message to server if connection is established', () => { + // Mock dependencies and setup test data + const message = 'Hello, server!'; + const connection = { + connected: true, + sendUTF: jest.fn(), + }; + + // Set the connection + POSTHandler.connection = connection; + + // Call the sendToServer method + POSTHandler.sendToServer(message); + + // Assert the expected behavior + expect(connection.sendUTF).toHaveBeenCalledWith(message); + }); + + it('should establish connection with server and send message if connection is not established', async () => { + // Mock dependencies and setup test data + const message = 'Hello, server!'; + const connection = { + connected: false, + sendUTF: jest.fn(), + }; + + // Set the connection + POSTHandler.connection = connection; + + // Mock the connect_with_server method + POSTHandler.connect_with_server = jest.fn().mockResolvedValue(undefined); + + // Call the sendToServer method + POSTHandler.sendToServer(message); + + // Assert the expected behavior + expect(POSTHandler.connect_with_server).toHaveBeenCalledWith('ws://localhost:8080/'); + expect(connection.sendUTF).toHaveBeenCalledWith(message); + }); + }); +}); \ No newline at end of file diff --git a/src/server/POSTHandler.ts b/src/server/POSTHandler.ts index b354b5f..cb187a7 100644 --- a/src/server/POSTHandler.ts +++ b/src/server/POSTHandler.ts @@ -1,6 +1,5 @@ import { storeToString } from "@treecg/versionawareldesinldp"; import { IncomingMessage, ServerResponse } from "http"; -import { Store } from "rdflib"; import { SPARQLToRSPQL } from "../service/parsers/SPARQLToRSPQL"; import { QueryRegistry } from "../service/query-registry/QueryRegistry"; import { AggregationDispatcher } from "../service/result-dispatcher/AggregationDispatcher"; @@ -9,13 +8,19 @@ import { hash_string_md5 } from "../utils/Util"; const websocketConnection = require('websocket').connection; const WebSocketClient = require('websocket').client; const N3 = require('n3'); - +/** + * Class for handling the POST request from the client. + * @class POSTHandler + */ export class POSTHandler { static connection: typeof websocketConnection; public static client: any; static request_body: RequestBody; static sparql_to_rspql: SPARQLToRSPQL; - + /** + * Creates an instance of POSTHandler. + * @memberof POSTHandler + */ constructor() { POSTHandler.sparql_to_rspql = new SPARQLToRSPQL(); POSTHandler.connection = websocketConnection; @@ -23,6 +28,16 @@ export class POSTHandler { POSTHandler.client = new WebSocketClient(); } + /** + * Handle the POST request from the client. + * @static + * @param {IncomingMessage} req - The request from the client. + * @param {ServerResponse} res - The response to the client. + * @param {QueryRegistry} query_registry - The QueryRegistry object. + * @param {string} solid_server_url - The URL of the Solid Server. + * @param {*} logger - The logger object. + * @memberof POSTHandler + */ public static async handle(req: IncomingMessage, res: ServerResponse, query_registry: QueryRegistry, solid_server_url: string, logger: any) { const to_timestamp = new Date().getTime(); // current time let post_body: string = ''; @@ -60,7 +75,19 @@ export class POSTHandler { }); } - + /** + * Handle the Websocket query from the client. + * It checks if the query is unique and if it is, then it registers the query in the QueryRegistry and if it is not, then it sends the aggregated events to the client. + * The non unique query is the query that is already registered in the QueryRegistry, and it uses the Function Ontology Description from the Solid Stream Aggregator's Solid Pod + * To get the aggregated events and send them to the client. + * @static + * @param {string} query - The query to be handled (RSPQL or SPARQL). + * @param {number} width - The width of the window. + * @param {QueryRegistry} query_registry - The QueryRegistry object. + * @param {*} logger - The logger object. + * @param {*} websocket_connections - The Websocket connections. + * @memberof POSTHandler + */ public static async handle_ws_query(query: string, width: number, query_registry: QueryRegistry, logger: any, websocket_connections: any) { const aggregation_dispatcher = new AggregationDispatcher(query); // let to_timestamp = new Date().getTime(); // current time @@ -106,7 +133,12 @@ export class POSTHandler { } } - + /** + * Connect with the Websocket server of the Solid Stream Aggregator. + * @static + * @param {string} wssURL - The URL of the Websocket server. + * @memberof POSTHandler + */ static async connect_with_server(wssURL: string) { this.client.connect(wssURL, 'solid-stream-aggregator-protocol'); this.client.on('connect', (connection: typeof websocketConnection) => { @@ -117,7 +149,12 @@ export class POSTHandler { console.log('Connect Error: ' + error.toString()); }); } - + /** + * Send a message to the Websocket server of the Solid Stream Aggregator. + * @static + * @param {string} message - The message to be sent to the server. + * @memberof POSTHandler + */ static sendToServer(message: string) { if (this.connection.connected) { this.connection.sendUTF(message); diff --git a/src/server/WebSocketHandler.test.ts b/src/server/WebSocketHandler.test.ts new file mode 100644 index 0000000..fb9e377 --- /dev/null +++ b/src/server/WebSocketHandler.test.ts @@ -0,0 +1,5 @@ +describe('WebSocketHandler', () => { + beforeEach(() => { + + }); +}); \ No newline at end of file diff --git a/src/server/WebSocketHandler.ts b/src/server/WebSocketHandler.ts index b8c1ecc..31177af 100644 --- a/src/server/WebSocketHandler.ts +++ b/src/server/WebSocketHandler.ts @@ -7,8 +7,11 @@ import { find_relevant_streams, hash_string_md5 } from "../utils/Util"; import { POSTHandler } from "./POSTHandler"; import { RSPQLParser } from "../service/parsers/RSPQLParser"; import { QueryRegistry } from "../service/query-registry/QueryRegistry"; -import { TypeIndexLDESLocator } from "../utils/TypeIndexLDESLocator"; import { AggregationFocusExtractor } from "../service/parsers/AggregationFocusExtractor"; +/** + * Class for handling the Websocket server. + * @class WebSocketHandler + */ export class WebSocketHandler { private aggregation_resource_list: any[]; @@ -21,7 +24,14 @@ export class WebSocketHandler { public aggregation_publisher: LDESPublisher; public logger: any; private query_registry: QueryRegistry; - + /** + * Creates an instance of WebSocketHandler. + * @param {WebSocket.server} websocket_server - The Websocket server. + * @param {EventEmitter} event_emitter - The event emitter. + * @param {LDESPublisher} aggregation_publisher - The LDES Publisher class instance. + * @param {*} logger - The logger object. + * @memberof WebSocketHandler + */ constructor(websocket_server: WebSocket.server, event_emitter: EventEmitter, aggregation_publisher: LDESPublisher, logger: any) { this.aggregation_resource_list = []; this.logger = logger; @@ -34,6 +44,13 @@ export class WebSocketHandler { this.n3_parser = new Parser({ format: 'N-Triples' }); } + /** + * Handle the Websocket server. + * It retrieves the query from the client and processes it. + * It also sends the result to the client. + * It also stores the aggregation event in the Solid Pod of the Solid Stream Aggregator. + * @memberof WebSocketHandler + */ public handle_wss() { // TODO: find the type of the request object console.log(`Handling the websocket server.`); @@ -59,13 +76,13 @@ export class WebSocketHandler { const width = parsed.s2r[0].width; const query_hashed = hash_string_md5(ldes_query); this.connections.set(query_hashed, connection); - this.process_query(ldes_query, width, this.connections); + this.process_query(ldes_query, width); } else if (Object.keys(ws_message).includes('aggregation_event')) { const query_hash = ws_message.query_hash; for (const [key, value] of this.connections) { if (key === query_hash) { - this.publish_aggregation_event(ws_message, this.aggregation_publisher); + this.publish_aggregation_event(ws_message, this.aggregation_publisher); value.send(JSON.stringify(ws_message)); this.logger.info({ query_id: query_hash }, `aggregation_event_sent_to_client`); } @@ -99,6 +116,10 @@ export class WebSocketHandler { this.aggregation_event_publisher(); } + /** + * Send the aggregation event to the client's Websocket channel. + * @memberof WebSocketHandler + */ public async client_response_publisher() { this.event_emitter.on('aggregation_event', (object: string) => { const event = JSON.parse(object) @@ -109,10 +130,15 @@ export class WebSocketHandler { } }); } + /** + * Publish the aggregation event to the Solid Pod of the Solid Stream Aggregator. + * @param {*} aggregation_event - The aggregation event to be published. + * @param {LDESPublisher} aggregation_publisher - The LDES Publisher class instance. + * @memberof WebSocketHandler + */ public publish_aggregation_event(aggregation_event: any, aggregation_publisher: LDESPublisher) { let zeroLengthDuration: number = 0; - let intervalId: NodeJS.Timeout | null = null; - + let intervalId: any | null = null; const event_quad: any = this.n3_parser.parse(aggregation_event.aggregation_event); this.aggregation_resource_list.push(event_quad); @@ -145,7 +171,10 @@ export class WebSocketHandler { } }, checkInterval); } - + /** + * Publish the aggregation event to the Solid Pod of the Solid Stream Aggregator. + * @memberof WebSocketHandler + */ public aggregation_event_publisher() { this.event_emitter.on('aggregation_event', async (object: string) => { const parser = new Parser({ format: 'N-Triples' }); @@ -167,6 +196,7 @@ export class WebSocketHandler { }); this.event_emitter.on('error', (error: Error) => { + this.logger.debug(`Error in aggregation event publisher: ${error}`); this.event_emitter.on('error', (error: Error) => { this.logger.debug(`Error in aggregation event publisher: ${error}`); }); @@ -174,15 +204,23 @@ export class WebSocketHandler { this.event_emitter.on('end', () => { this.logger.debug(`End of aggregation event publisher.`); }); - - - }); } + /** + * Associate a Websocket channel with the query. + * @param {string} query_id - The id of the query. + * @param {WebSocket} ws - The Websocket channel to be associated with the query. + * @memberof WebSocketHandler + */ public associate_channel_with_query(query_id: string, ws: WebSocket) { this.connections.set(query_id, ws); } - + /** + * Send the result to the client for the given query. + * @param {string} query_id - The id of the query. + * @param {*} result - The result to be sent (the aggregation result). + * @memberof WebSocketHandler + */ public send_result_to_client(query_id: string, result: any) { const ws = this.connections.get(query_id); if (ws) { @@ -192,11 +230,20 @@ export class WebSocketHandler { this.logger.debug(`No connection found for query id: ${query_id}`); } } - - public process_query(query: string, width: number, connections: Map) { + /** + * Process the query and send the result to the client. + * @param {string} query - The query to be processed (RSP-QL query). + * @param {number} width - The width of the window to be processed. + * @memberof WebSocketHandler + */ + public process_query(query: string, width: number) { POSTHandler.handle_ws_query(query, width, this.query_registry, this.logger, this.connections); } - + /** + * Send a test message to the client. + * @param {string} query - The query to which the test message is to be sent. + * @memberof WebSocketHandler + */ public send_test(query: string) { const ws = this.connections.get(query); if (ws) { diff --git a/src/service/aggregator/AggregatorInstantiator.test.ts b/src/service/aggregator/AggregatorInstantiator.test.ts new file mode 100644 index 0000000..a6d4c89 --- /dev/null +++ b/src/service/aggregator/AggregatorInstantiator.test.ts @@ -0,0 +1,3 @@ +describe('aggregator_instantiator', () => { + +}); \ No newline at end of file diff --git a/src/service/aggregator/AggregatorInstantiator.ts b/src/service/aggregator/AggregatorInstantiator.ts index 9bab63b..1e4e781 100644 --- a/src/service/aggregator/AggregatorInstantiator.ts +++ b/src/service/aggregator/AggregatorInstantiator.ts @@ -9,7 +9,10 @@ import { hash_string_md5 } from "../../utils/Util"; const WebSocketClient = require('websocket').client; const websocketConnection = require('websocket').connection; const parser = new RSPQLParser(); - +/** + * Class for the Aggregator Instantiator. + * @class AggregatorInstantiator + */ export class AggregatorInstantiator { public query: string; public rsp_engine: RSPEngine; @@ -21,6 +24,14 @@ export class AggregatorInstantiator { public to_date: Date; public client = new WebSocketClient(); public connection: typeof websocketConnection; + /** + * Creates an instance of AggregatorInstantiator. + * @param {string} query - The RSPQL query. + * @param {number} from_timestamp - The timestamp from where the query is to be executed. + * @param {number} to_timestamp - The timestamp to where the query is to be executed. + * @param {*} logger - The logger object. + * @memberof AggregatorInstantiator + */ public constructor(query: string, from_timestamp: number, to_timestamp: number, logger: any) { this.query = query; this.logger = logger; @@ -36,25 +47,39 @@ export class AggregatorInstantiator { this.rsp_emitter = this.rsp_engine.register(); this.intiateDecentralizedFileStreamer(); } - public async intiateDecentralizedFileStreamer() { + /** + * Initiate the Decentralized File Streamer for the LDES in the Solid Pod and then initialize the subscription to the RStream of the RSP Engine. + * @returns {Promise} - The promise of the initiation of the Decentralized File Streamer, which is true if it is initiated, and false if it is not initiated. + * @memberof AggregatorInstantiator + */ + public async intiateDecentralizedFileStreamer(): Promise { const query_hashed = hash_string_md5(this.query); console.log(`Initiating LDES Reader for ${this.stream_array}`); - for (const stream of this.stream_array) { - const session_credentials = this.get_session_credentials(stream); - this.logger.info({ query_hashed }, `stream_credentials_retrieved`); - new DecentralizedFileStreamer(stream, session_credentials, this.from_date, this.to_date, this.rsp_engine, this.query, this.logger); + if (this.stream_array.length !== 0) { + for (const stream of this.stream_array) { + const session_credentials = this.get_session_credentials(stream); + this.logger.info({ query_hashed }, `stream_credentials_retrieved`); + new DecentralizedFileStreamer(stream, session_credentials, this.from_date, this.to_date, this.rsp_engine, this.query, this.logger); + } + this.subscribeRStream(); + return true; + } + else { + return false; } - this.executeRSP(); } - public async executeRSP() { - // RSP Engine event emitter. + /** + * Subscribe to the RStream of the RSP Engine to listen to the bindings, i.e the generated aggregation events and send it to the Solid Stream Aggregator's Websocket server for further processing (i.e publishing to the Solid Pod & sending to the clients). + * @memberof AggregatorInstantiator + */ + public async subscribeRStream() { this.connect_with_server('ws://localhost:8080/').then(() => { console.log(`The connection with the websocket server has been established.`); this.connection.connected = true; }); this.client.on('connect', (connection: typeof websocketConnection) => { - console.log(`The connection with the server has been established.`); + console.log(`The connection with the server has been established. ${connection.connected}`); this.rsp_emitter.on('RStream', async (object: BindingsWithTimestamp) => { const window_timestamp_from = object.timestamp_from; const window_timestamp_to = object.timestamp_to; @@ -78,6 +103,17 @@ export class AggregatorInstantiator { } // TODO : add extra projection variables to the aggregation event. + // Relevant Issue : https://github.com/SolidLabResearch/solid-stream-aggregator/issues/34 + /** + * Generate an aggregation event. + * @param {string} value - The value of the aggregation event. + * @param {number} event_timestamp - The timestamp of the aggregation event when it was generated. + * @param {(string[] | undefined)} stream_array - The array of streams that the aggregation event is generated from. + * @param {number} timestamp_from - The timestamp of the start of the aggregation window. + * @param {number} timestamp_to - The timestamp of the end of the aggregation window. + * @returns {string} - The aggregation event in string RDF. + * @memberof AggregatorInstantiator + */ generate_aggregation_event(value: string, event_timestamp: number, stream_array: string[] | undefined, timestamp_from: number, timestamp_to: number): string { if (stream_array === undefined) { throw new Error("The stream array is undefined. "); @@ -101,8 +137,11 @@ export class AggregatorInstantiator { return aggregation_event; } } - - + /** + * Connect with the Websocket server of the Solid Stream Aggregator. + * @param {string} wssURL - The URL of the Websocket server of the Solid Stream Aggregator. + * @memberof AggregatorInstantiator + */ async connect_with_server(wssURL: string) { this.client.connect(wssURL, 'solid-stream-aggregator-protocol'); this.client.on('connectFailed', (error: Error) => { @@ -113,7 +152,11 @@ export class AggregatorInstantiator { this.connection = connection; }); } - + /** + * Send a message to the Websocket server of the Solid Stream Aggregator. + * @param {string} message - The message to be sent. + * @memberof AggregatorInstantiator + */ sendToServer(message: string) { if (this.connection.connected) { this.connection.sendUTF(message); @@ -124,7 +167,12 @@ export class AggregatorInstantiator { }); } } - + /** + * Get the session credentials for the Solid Pod. + * @param {string} stream_name - The name of the stream (i.e the LDES in LDP of the Solid Pod). + * @returns {Credentials} - The session credentials. + * @memberof AggregatorInstantiator + */ get_session_credentials(stream_name: string) { const credentials: Credentials = CREDENTIALS; const session_credentials = credentials[stream_name]; diff --git a/tests/unit/service/publishing-stream-to-pod/QueryAnnotationPublishing.test.ts b/src/service/aggregator/DecentralizedFileStreamer.test.ts similarity index 100% rename from tests/unit/service/publishing-stream-to-pod/QueryAnnotationPublishing.test.ts rename to src/service/aggregator/DecentralizedFileStreamer.test.ts diff --git a/src/service/aggregator/DecentralizedFileStreamer.ts b/src/service/aggregator/DecentralizedFileStreamer.ts index ec76e6e..05482ce 100644 --- a/src/service/aggregator/DecentralizedFileStreamer.ts +++ b/src/service/aggregator/DecentralizedFileStreamer.ts @@ -1,22 +1,23 @@ import { QueryEngine } from "@comunica/query-sparql"; -import { LDESinLDP, LDPCommunication, SolidCommunication, storeToString } from "@treecg/versionawareldesinldp"; +import { LDESinLDP, LDPCommunication, SolidCommunication } from "@treecg/versionawareldesinldp"; import { RDFStream, RSPEngine } from "rsp-js"; import { Bindings } from '@comunica/types'; -import { quick_sort_queue, StreamEventQueue } from "../../utils/StreamEventQueue"; +import { StreamEventQueue } from "../../utils/StreamEventQueue"; const { Store } = require('n3'); -const ld_fetch = require('ldfetch'); -const ldfetch = new ld_fetch({}); const websocketConnection = require('websocket').connection; const WebSocketClient = require('websocket').client; import { Quad } from "n3"; -import WebSocket from 'ws'; -import { QuadWithID, WebSocketMessage } from "../../utils/Types"; -import { session_with_credentials } from "../../utils/authentication/css-auth"; +import { QuadWithID } from "../../utils/Types"; +import { session_with_credentials } from "../../utils/authentication/CSSAuthentication"; import { readMembersRateLimited } from "../../utils/ldes-in-ldp/EventSource"; import { RateLimitedLDPCommunication } from "rate-limited-ldp-communication"; -import { hash_string_md5, insertion_sort, quick_sort } from "../../utils/Util"; +import { hash_string_md5 } from "../../utils/Util"; import { TREE } from "@treecg/ldes-snapshot"; - +import { Session } from "@inrupt/solid-client-authn-node"; +/** + * Class for streaming the events from the Solid Pod to the RSP Engine by reading the events and converting the events stored into files into a stream. + * @class DecentralizedFileStreamer + */ export class DecentralizedFileStreamer { public ldes_stream: string; public from_date: Date; @@ -35,7 +36,17 @@ export class DecentralizedFileStreamer { public logger: any public notification_listening_time: number = 0; public missing_event_queue: StreamEventQueue>; - + /** + * Creates an instance of DecentralizedFileStreamer. + * @param {string} ldes_stream - The LDES stream URL. + * @param {session_credentials} session_credentials - The credentials of the Solid Pod. + * @param {Date} from_date - The start date of the events to be read from the Solid Pod. + * @param {Date} to_date - The end date of the events to be read from the Solid Pod. + * @param {RSPEngine} rsp_engine - The RSP Engine. + * @param {string} query - The query to be executed. + * @param {*} logger - The logger object. + * @memberof DecentralizedFileStreamer + */ constructor(ldes_stream: string, session_credentials: session_credentials, from_date: Date, to_date: Date, rsp_engine: RSPEngine, query: string, logger: any) { this.ldes_stream = ldes_stream; this.communication = this.get_communication(session_credentials); @@ -56,6 +67,12 @@ export class DecentralizedFileStreamer { }); } + /** + * Get the communication object with the Solid Pod. + * @param {session_credentials} credentials - The credentials of the Solid Pod. + * @returns {Promise} - The communication object with the Solid Pod. + * @memberof DecentralizedFileStreamer + */ public async get_communication(credentials: session_credentials) { const session = await this.get_session(credentials); if (session) { @@ -73,8 +90,6 @@ export class DecentralizedFileStreamer { * @memberof DecentralizedFileStreamer */ public async add_missing_events_to_rsp_engine() { - const start_time = this.get_file_streamer_start_time(); - const end_time = this.get_websocket_listening_time(); const stream = await readMembersRateLimited({ ldes: this.ldes, rate: 60, @@ -106,7 +121,11 @@ export class DecentralizedFileStreamer { }); } - + /** + * Initiates the Decentralized File Streamer to read the events from the Solid Pod in between a certain time frame and then subscribe to the latest events from the Solid Pod. + * @returns {Promise} - The promise that resolves to nothing. + * @memberof DecentralizedFileStreamer + */ public async initiateDecentralizedFileStreamer(): Promise { const communication = await this.communication; this.ldes = new LDESinLDP(this.ldes_stream, communication); @@ -127,7 +146,7 @@ export class DecentralizedFileStreamer { const member_store = new Store(data.quads); const timestamp = member_store.getQuads(null, bucket_strategy, null, null)[0].object.value; const timestamp_epoch = Date.parse(timestamp); - if (this.stream_name){ + if (this.stream_name) { this.logger.info({ query_id: this.query_hash }, `event_added_to_rsp_engine for ${this.ldes_stream}`) await this.add_event_to_rsp_engine(member_store, [this.stream_name], timestamp_epoch); } @@ -148,6 +167,12 @@ export class DecentralizedFileStreamer { }); } + /** + * Adds the event store to the RSP Engine. + * @param {typeof Store} store - The store of the events. + * @param {RDFStream[]} stream_name - The RDF Stream where the events are being added to. + * @memberof DecentralizedFileStreamer + */ async add_event_store_to_rsp_engine(store: typeof Store, stream_name: RDFStream[]) { const binding_stream = await this.comunica_engine.queryBindings(` PREFIX saref: @@ -177,6 +202,13 @@ export class DecentralizedFileStreamer { }); } + /** + * Adds the events to the RSP Engine. + * @param {typeof Store} store - The store of the events. + * @param {RDFStream[]} stream_name - The RDF Stream where the events are being added to. + * @param {number} timestamp - The timestamp of the events. + * @memberof DecentralizedFileStreamer + */ async add_event_to_rsp_engine(store: typeof Store, stream_name: RDFStream[], timestamp: number) { stream_name.forEach((stream: RDFStream) => { const quads = store.getQuads(null, null, null, null); @@ -185,15 +217,24 @@ export class DecentralizedFileStreamer { } }); } - - async epoch(date: string) { + /** + * Converts the date to epoch time. + * @param {string} date - The date to convert to epoch time. + * @returns {Promise} - The epoch time. + * @memberof DecentralizedFileStreamer + */ + async epoch(date: string): Promise { return Date.parse(date); } - + /** + * Subscribes to the latest events of the LDES stream. + * @param {RDFStream} stream_name - The name of the RDF stream generated from the Solid Pod. + * @memberof DecentralizedFileStreamer + */ async subscribing_latest_events(stream_name: RDFStream) { - const inbox = await this.get_inbox_container(this.ldes_stream); - + console.log(`Subscribing to the latest events of the stream ${stream_name}`); + // const inbox = await this.get_inbox_container(this.ldes_stream); // let stream_subscription_ws = await this.get_stream_subscription_websocket_url(this.ldes_stream); // const stream_websocket = new WebSocket(stream_subscription_ws); // stream_websocket.onmessage = async (event: any) => { @@ -201,7 +242,7 @@ export class DecentralizedFileStreamer { // const parsed = JSON.parse(event.data); // inbox = parsed.object; // if (inbox !== undefined) { - // let subscription_ws = await this.get_inbox_subscription_websocket_url(this.ldes_stream, inbox); + // let subscription_ws = await this. url(this.ldes_stream, inbox); // const websocket = new WebSocket(subscription_ws); // websocket.onmessage = async (event: any) => { // const parsed = JSON.parse(event.data); @@ -232,8 +273,13 @@ export class DecentralizedFileStreamer { // } } - - async get_inbox_container(stream: string) { + /** + * Get the inbox container from the LDP container or return undefined if the inbox container does not exist. + * @param {string} stream - The LDES in LDP URL. + * @returns {Promise} - The inbox container URL. + * @memberof DecentralizedFileStreamer + */ + async get_inbox_container(stream: string): Promise { console.log(`Getting the inbox container from`, stream); const ldes_in_ldp: LDESinLDP = new LDESinLDP(stream, new LDPCommunication()); const metadata = await ldes_in_ldp.readMetadata(); @@ -243,10 +289,21 @@ export class DecentralizedFileStreamer { if (quad.object.value != undefined) { return quad.object.value; } + else { + return undefined; + } + } + else { + return undefined; } } } - + /** + * Subscribes to the webhook notification of the LDES stream to get the notifications of when new events are being added to the Solid Pod. + * @param {string} ldes_stream - The LDES stream URL. + * @returns {Promise} - Subscribes and then the new events are sent to the Solid Stream Aggregator's HTTP server. + * @memberof DecentralizedFileStreamer + */ async subscribe_webhook_notification(ldes_stream: string): Promise { const solid_server = ldes_stream.split("/").slice(0, 3).join("/"); const webhook_notification_server = solid_server + "/.notifications/WebhookChannel2023/"; @@ -270,7 +327,13 @@ export class DecentralizedFileStreamer { console.log(response_json.sendTo); } - async get_stream_subscription_websocket_url(ldes_stream: string): Promise { + /** + * Get the subscription URL for the LDES stream. + * @param {string} ldes_stream - The LDES stream URL. + * @returns {Promise} - The subscription URL. + * @memberof DecentralizedFileStreamer + */ + async get_stream_subscription_url(ldes_stream: string): Promise { const solid_server = ldes_stream.split("/").slice(0, 3).join("/"); const notification_server = solid_server + "/.notifications/WebSocketChannel2023/"; const post_body = { @@ -291,14 +354,29 @@ export class DecentralizedFileStreamer { return response_json.receiveFrom; } + /** + * Add the sorted queue to the RSP Engine and logs the element of the queue by dequeuing it one by one. + * @param {StreamEventQueue>} sorted_queue - The sorted queue of events. + * @memberof DecentralizedFileStreamer + */ async add_sorted_queue_to_rsp_engine(sorted_queue: StreamEventQueue>) { for (let i = 0; i < sorted_queue.size(); i++) { const element = sorted_queue.dequeue(); - console.log(element); + // TODO : extract the timestamp from the element and add it to the RSP Engine. + // Relevant Issue : https://github.com/SolidLabResearch/solid-stream-aggregator/issues/37 + if (this.stream_name !== undefined && element !== undefined) { + this.stream_name?.add(element, Date.now()); + } } } - - async get_inbox_subscription_websocket_url(ldes_stream: string, inbox_container: string): Promise { + /** + * Get the inbox subscription websocket URL. + * @param {string} ldes_stream - The LDES stream URL. + * @param {string} inbox_container - The inbox container URL. + * @returns {Promise} - The inbox subscription websocket URL. + * @memberof DecentralizedFileStreamer + */ + async get_inbox_subscription_notification_url(ldes_stream: string, inbox_container: string): Promise { const solid_server = ldes_stream.split("/").slice(0, 3).join("/"); const notification_server = solid_server + "/.notifications/WebSocketChannel2023/"; const post_body = { @@ -319,19 +397,37 @@ export class DecentralizedFileStreamer { const response_json = await repsonse.json(); return response_json.receiveFrom; } - - get_websocket_listening_time() { + /** + * Get the notification listening time when the DecentralizedFileStreamer started to listen to the notifications of when new events were being added to the Solid Pod. + * @returns {number} - The start of the notification listening time. + * @memberof DecentralizedFileStreamer + */ + get_notification_listening_time() { return this.notification_listening_time; } - + /** + * Get the start time of the file streamer. + * @returns {number} - The start time of the file streamer. + * @memberof DecentralizedFileStreamer + */ get_file_streamer_start_time() { return this.file_streamer_start_time; } - - async get_session(credentials: session_credentials) { + /** + * Get the session with the credentials. + * @param {session_credentials} credentials - The credentials of the solid pod for which you can generate an authenticated session to communicated to the Solid Pod's LDP. + * @returns {Promise} - The authenticated session. + * @memberof DecentralizedFileStreamer + */ + async get_session(credentials: session_credentials): Promise { return await session_with_credentials(credentials); } - + /** + * Send a message to the websocket server of the Solid Stream Aggregator. + * @static + * @param {string} message - The message to send to the server (which in this case is the generated aggregation event). + * @memberof DecentralizedFileStreamer + */ static sendToServer(message: string) { if (this.connection.connected) { this.connection.sendUTF(message); @@ -343,6 +439,12 @@ export class DecentralizedFileStreamer { } } + /** + * Connect with the Websocket server of the Solid Stream Aggregator. + * @static + * @param {string} wssURL - The URL of the websocket server. + * @memberof DecentralizedFileStreamer + */ static async connect_with_server(wssURL: string) { this.client.connect(wssURL, 'solid-stream-aggregator-protocol'); this.client.on('connect', (connection: typeof websocketConnection) => { diff --git a/src/service/aggregator/test.ts b/src/service/aggregator/test.ts index 565bc66..ad8900c 100644 --- a/src/service/aggregator/test.ts +++ b/src/service/aggregator/test.ts @@ -1,6 +1,7 @@ /** - * - * @param ldes_stream + * Subscribe to a webhook notification. + * @param {string} ldes_stream - The LDES stream to subscribe to. + * @returns {Promise} - Returns nothing. */ async function subscribe_webhook_notification(ldes_stream: string): Promise { const solid_server = ldes_stream.split("/").slice(0, 3).join("/"); @@ -31,7 +32,7 @@ async function subscribe_webhook_notification(ldes_stream: string): Promise; - public aggregation_thing_in_context: Array; - public projection_variables: Array; - public aggregation_function: string; - public sparql: string; - public r2s: R2S; - public s2r: Array; - constructor() { - this.sparql = "Select * WHERE{?s ?p ?o}"; - this.r2s = { operator: "RStream", name: "undefined" }; - this.s2r = new Array(); - this.prefixes = new Map(); - this.aggregation_thing_in_context = new Array(); - this.projection_variables = new Array(); - this.aggregation_function = ""; - } - set_sparql(sparql: string) { - this.sparql = sparql; - } - set_r2s(r2s: R2S) { - this.r2s = r2s; - } - add_s2r(s2r: WindowDefinition) { - this.s2r.push(s2r); - } -} - -export type WindowDefinition = { - window_name: string, - stream_name: string, - width: number, - slide: number -} -type R2S = { - operator: "RStream" | "IStream" | "DStream", - name: string -} diff --git a/src/service/parsers/RSPQLParser.test.ts b/src/service/parsers/RSPQLParser.test.ts new file mode 100644 index 0000000..65b7814 --- /dev/null +++ b/src/service/parsers/RSPQLParser.test.ts @@ -0,0 +1,71 @@ +import { RSPQLParser } from "./RSPQLParser"; + +describe('RSPQLParser', () => { + + let parser: RSPQLParser; + + beforeEach(() => { + parser = new RSPQLParser(); + }); + + const rspql_query = ` + PREFIX saref: + PREFIX dahccsensors: + PREFIX : + REGISTER RStream AS + SELECT (MAX(?o) as ?maxSKT) + FROM NAMED WINDOW :w1 ON STREAM [RANGE 180000 STEP 30000] + WHERE { + WINDOW :w1 { + ?s saref:hasValue ?o . + ?s saref:relatesToProperty dahccsensors:wearable.skt . + } + } + `; + it('should_parse_the_rspql_query', () => { + const parsed_query = parser.parse(rspql_query); + expect(parsed_query).toBeDefined(); + expect(parsed_query.sparql).toBe('\n' + + 'PREFIX saref: \n' + + 'PREFIX dahccsensors: \n' + + 'PREFIX : \n' + + 'SELECT (MAX(?o) as ?maxSKT)\n' + + 'WHERE {\n' + + 'GRAPH :w1 {\n' + + '?s saref:hasValue ?o .\n' + + '?s saref:relatesToProperty dahccsensors:wearable.skt .\n' + + '}\n' + + '}\n') + expect(parsed_query.r2s).toEqual({ operator: 'RStream', name: 'output' }); + expect(parsed_query.s2r).toEqual([{ window_name: 'https://rsp.js/w1', stream_name: 'http://localhost:3000/', width: 180000, slide: 30000 }]); + expect(parsed_query.aggregation_function).toBe('max'); + expect(parsed_query.projection_variables[0]).toBe('maxSKT'); + expect(parsed_query.aggregation_thing_in_context.length).toBe(0); + expect(parsed_query.prefixes.size).toBe(3); + }); + + it('should_unwrap_the_prefixed_iri', () => { + const prefixMapper = new Map(); + prefixMapper.set('saref', 'https://saref.etsi.org/core/'); + prefixMapper.set('dahccsensors', 'https://dahcc.idlab.ugent.be/Homelab/SensorsAndActuators/'); + const unwrapped = parser.unwrap('saref:hasValue', prefixMapper); + expect(unwrapped).toBe('https://saref.etsi.org/core/hasValue'); + }); + + it('should_unwrap_the_full_iri', () => { + const prefixMapper = new Map(); + const unwrapped = parser.unwrap('', prefixMapper); + expect(unwrapped).toBe('https://saref.etsi.org/core/hasValue'); + }); + + it('should_unwrap_the_prefixed_iri_with_no_prefix', () => { + const prefixMapper = new Map(); + const unwrapped = parser.unwrap('hasValue', prefixMapper); + expect(unwrapped).toBe(''); + }); + + it('should_unwrap_the_prefixed_iri_with_no_prefix_mapper', () => { + const unwrapped = parser.unwrap('saref:hasValue', new Map()); + expect(unwrapped).toBe(''); + }); +}); \ No newline at end of file diff --git a/src/service/parsers/RSPQLParser.ts b/src/service/parsers/RSPQLParser.ts index 658fd3d..2582b69 100644 --- a/src/service/parsers/RSPQLParser.ts +++ b/src/service/parsers/RSPQLParser.ts @@ -1,16 +1,23 @@ -import { ParsedQuery } from "./ParsedQuery"; const { Parser: SparqlParser } = require('sparqljs'); +/** + * Class for parsing a RSPQL query. + * @class RSPQLParser + */ export class RSPQLParser { r2s: Map = new Map(); s2r: Array = new Array(); sparql_parser: typeof SparqlParser; + /** + * Creates an instance of RSPQLParser. + * @memberof RSPQLParser + */ constructor() { this.sparql_parser = new SparqlParser(); } /** * Parse a RSPQL query to a parsedQuery Object containing the R2S and S2R mappings along with the SPARQL query. - * @param {string} rspql_query - * @returns {*} {ParsedQuery}. + * @param {string} rspql_query - The RSPQL query to be parsed. + * @returns {ParsedQuery} - The parsed query object. * @memberof RSPQLParser */ parse(rspql_query: string): ParsedQuery { @@ -56,15 +63,15 @@ export class RSPQLParser { } }); parsed.sparql = sparqlLines.join("\n"); - const sparql_parsed = this.parse_sparql_query(parsed.sparql, parsed); + this.parse_sparql_query(parsed.sparql, parsed); return parsed; } /** * Unwraps a prefixed IRI to a full IRI. - * @param {string} prefixedIRI - * @param {Map} prefixMapper - * @returns {*} + * @param {string} prefixedIRI - The prefixed IRI to be unwrapped. + * @param {Map} prefixMapper - The prefix mapper to be used for unwrapping. + * @returns {string} - The unwrapped IRI. - The unwrapped IRI. * @memberof RSPQLParser */ unwrap(prefixedIRI: string, prefixMapper: Map) { @@ -82,13 +89,11 @@ export class RSPQLParser { } /** - * Returns the name of the sensor from the SPARQL query. + * Parses the SPARQL query to extract the prefixes, projection variables and aggregation function. + * @param {string} sparqlQuery - The SPARQL query to be parsed. + * @param {ParsedQuery} parsed - The parsed query object to be used for storing the parsed data. + * @memberof RSPQLParser */ - - get_sensor_name(parsed_query: ParsedQuery) { - console.log(parsed_query.sparql) - } - parse_sparql_query(sparqlQuery: string, parsed: ParsedQuery) { const parsed_sparql_query = this.sparql_parser.parse(sparqlQuery); const prefixes = parsed_sparql_query.prefixes; @@ -103,4 +108,66 @@ export class RSPQLParser { } } } +/** + * The parsed query object. + * @class ParsedQuery + */ +export class ParsedQuery { + public prefixes: Map; + public aggregation_thing_in_context: Array; + public projection_variables: Array; + public aggregation_function: string; + public sparql: string; + public r2s: R2S; + public s2r: Array; + /** + * Creates an instance of ParsedQuery. + * @memberof ParsedQuery + */ + constructor() { + this.sparql = "Select * WHERE{?s ?p ?o}"; + this.r2s = { operator: "RStream", name: "undefined" }; + this.s2r = new Array(); + this.prefixes = new Map(); + this.aggregation_thing_in_context = new Array(); + this.projection_variables = new Array(); + this.aggregation_function = ""; + } + /** + * Set the SPARQL query. + * @param {string} sparql - The SPARQL query to be set. + * @memberof ParsedQuery + */ + set_sparql(sparql: string) { + this.sparql = sparql; + } + /** + * Set the R2S mapping (The Relation to Stream Operator). + * @param {R2S} r2s - The R2S mapping to be set. + * @memberof ParsedQuery + */ + set_r2s(r2s: R2S) { + this.r2s = r2s; + } + /** + * Add a window definition. (The Stream to Relation Operator). + * @param {WindowDefinition} s2r - The window definition to be added. + * @memberof ParsedQuery + */ + add_s2r(s2r: WindowDefinition) { + this.s2r.push(s2r); + } +} + +export type WindowDefinition = { + window_name: string, + stream_name: string, + width: number, + slide: number +} +type R2S = { + operator: "RStream" | "IStream" | "DStream", + name: string +} + diff --git a/src/service/parsers/SPARQLToRSPQL.ts b/src/service/parsers/SPARQLToRSPQL.ts index 565252d..ccb774b 100644 --- a/src/service/parsers/SPARQLToRSPQL.ts +++ b/src/service/parsers/SPARQLToRSPQL.ts @@ -1,14 +1,23 @@ -const {Parser: SparqlParser} = require('sparqljs'); +const { Parser: SparqlParser } = require('sparqljs'); const parser = new SparqlParser(); const Store = require('n3').Store; import { Quad } from 'rdflib/lib/tf-types'; import * as RSPQLConfig from '../../config/rspql_query.json'; +/** + * Class for converting a SPARQL query to a RSPQL query. + * @class SPARQLToRSPQL + */ export class SPARQLToRSPQL { private extractedVariables: string[]; private extractedGraphPatterns: typeof Store; private operationArgs: Map; private operator: string; + + /** + * Creates an instance of SPARQLToRSPQL. + * @memberof SPARQLToRSPQL + */ constructor() { this.extractedVariables = []; this.extractedGraphPatterns = new Store(); @@ -16,10 +25,16 @@ export class SPARQLToRSPQL { this.operator = ''; } + /** + * Generate a RSPQL query from a SPARQL query by adding the necessary RSPQL syntax as well as a window and a stream. + * @param {string} sparqlQuery - The SPARQL query to be converted to RSPQL. + * @returns {string} - The RSPQL query. + * @memberof SPARQLToRSPQL + */ public getRSPQLQuery(sparqlQuery: string): string { const parsedQuery = parser.parse(sparqlQuery); if (parsedQuery.type === 'query') { - if (parsedQuery.queryType === 'SELECT' || 'select') { + if (parsedQuery.queryType === 'SELECT' || parsedQuery.queryType === 'select') { const queryVariables = parsedQuery.variables; for (let i = 0; i < queryVariables.length; i++) { if (queryVariables[i].termType === 'Variable') { diff --git a/src/service/publishing-stream-to-pod/LDESPublisher.test.ts b/src/service/publishing-stream-to-pod/LDESPublisher.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/service/publishing-stream-to-pod/LDESPublisher.ts b/src/service/publishing-stream-to-pod/LDESPublisher.ts index d1a1517..99d093c 100644 --- a/src/service/publishing-stream-to-pod/LDESPublisher.ts +++ b/src/service/publishing-stream-to-pod/LDESPublisher.ts @@ -1,22 +1,15 @@ import { LDESinLDP, - LDESMetadata, LDPCommunication, - SolidCommunication, RDF, LDES, - extractLdesMetadata, LDESConfig, VersionAwareLDESinLDP, ILDES, getAuthenticatedSession, - LILConfig, VLILConfig } from "@treecg/versionawareldesinldp"; import { QueryAnnotationPublishing } from "./QueryAnnotationPublishing"; -import { - initSession -} from "../../utils/ldes-in-ldp/EventSource"; import * as CONFIG from '../../config/ldes_properties.json'; import * as AGG_CONFIG from '../../config/pod_credentials.json'; import { RSPQLParser } from "../parsers/RSPQLParser"; @@ -24,28 +17,30 @@ import { Logger, ILogObj } from "tslog"; const ld_fetch = require('ldfetch'); const ldfetch = new ld_fetch({}); import { EndpointQueries } from "../../server/EndpointQueries"; - +/** + * Class for publishing the resources (which were generated by the RSP Engine) to the LDES in the LDP container + * of the aggregation pod. + * @class LDESPublisher + */ export class LDESPublisher { public initialised: boolean = false; - private credentialsFileName: any = CONFIG.CREDENTIALS_FILE_NAME; private session: any; public lilURL: string = CONFIG.LIL_URL - private prefixFile = CONFIG.PREFIX_FILE; private treePath = CONFIG.TREE_PATH; public config: VLILConfig; - private amount = CONFIG.AMOUNT; - private bucketSize = CONFIG.BUCKET_SIZE; - private logLevel = CONFIG.LOG_LEVEL; - private aggregationQuery: string = ""; - private parser: any; + public parser: RSPQLParser; private query_annotation_publisher: QueryAnnotationPublishing; public logger: Logger; public endpoint_queries: EndpointQueries; + /** + * Creates an instance of LDESPublisher. + * @memberof LDESPublisher + */ constructor() { this.initialise(); this.config = { - treePath: this.treePath, versionOfPath : "1.0" + treePath: this.treePath, versionOfPath: "1.0" } this.parser = new RSPQLParser(); this.logger = new Logger(); @@ -53,37 +48,46 @@ export class LDESPublisher { this.endpoint_queries = new EndpointQueries(); } - async initialise() { + /** + * Initialises LDES in the LDP container inside the aggregation pod. + * @returns {Promise} - Returns true if the LDES is initialised successfully, otherwise false. + * @memberof LDESPublisher + */ + async initialise() { this.session = await getAuthenticatedSession({ webId: AGG_CONFIG.aggregation_pod_web_id, password: AGG_CONFIG.aggregation_pod_password, email: AGG_CONFIG.aggregation_pod_email, }) - // const communication = new SolidCommunication(this.session); const communication = new LDPCommunication(); const lil: ILDES = new LDESinLDP(this.lilURL, communication); - let metadata: LDESMetadata | undefined; - // this.config.date = new Date(0); - // await lil.initialise(this.config); const vlil: VersionAwareLDESinLDP = new VersionAwareLDESinLDP(lil) await vlil.initialise(this.config) console.log(`Initialised LDES at ${this.lilURL}`); - + try { const metadataStore = await lil.readMetadata(); const ldes = metadataStore.getSubjects(RDF.type, LDES.EventStream, null); if (ldes.length > 1) { console.log(`More than one LDES is present. We are extracting the first one at, ${ldes[0].value}`); } - // metadata = extractLdesMetadata(metadataStore, ldes[0].value); - } catch (error) { console.log(error); console.log(`No LDES is present.`); + return false; } return true; } + /** + * Publishes the resources to the LDES in the LDP container (without the Function Ontology Annotation). + * It uses the QueryAnnotationPublishing class to publish the query annotation. + * @param {any[]} resourceList - The list of resources to be published. + * @param {Date} start_time - The start time of the resources generated from the RSP Engine. + * @param {Date} end_time - The end time of the resources generated from the RSP Engine. + * @returns {Promise} - Returns true if the resources are published successfully and if the query was defined, otherwise false. + * @memberof LDESPublisher + */ async publish(resourceList: any[], start_time: Date, end_time: Date): Promise { if (resourceList.length === 0) { console.log("No resources to publish"); @@ -109,8 +113,14 @@ export class LDESPublisher { } + /** + * Updates the latest inbox of the LDP container. + * As the LDP container's patch is slower than the LDP container's creation, the latest inbox is updated after the query annotation is published. + * @param {string} aggregation_pod_ldes_location - The location of the LDES in the LDP container of the aggregation pod. + * @memberof LDESPublisher + */ public async update_latest_inbox(aggregation_pod_ldes_location: string) { - const inbox_location:string[] = []; + const inbox_location: string[] = []; ldfetch.get(aggregation_pod_ldes_location).then((response: any) => { for (const quad of response.triples) { if (quad.predicate.value == "http://www.w3.org/ns/ldp#inbox") { @@ -125,7 +135,7 @@ export class LDESPublisher { }, body: "INSERT DATA { <" + aggregation_pod_ldes_location + "> <" + latest_inbox + "> }", }).then((response) => { - if (response.status == 200 || 201 || 205) { + if (response.ok) { this.logger.debug(`The latest inbox of the LDP container is patched successfully.`) } else { diff --git a/src/service/publishing-stream-to-pod/QueryAnnotationPublishing.test.ts b/src/service/publishing-stream-to-pod/QueryAnnotationPublishing.test.ts new file mode 100644 index 0000000..70e2ec3 --- /dev/null +++ b/src/service/publishing-stream-to-pod/QueryAnnotationPublishing.test.ts @@ -0,0 +1,17 @@ +import { patchSparqlUpdateDelete } from "./QueryAnnotationPublishing"; +const N3 = require('n3'); + +describe('query_annotation_publishing', () => { + + it('publish_with_fno_annotation', () => { + + }); + + it('return_sparl_delete', () => { + const store = new N3.Store(); + store.addQuad('http://example.com/s1', 'http://example.com/p1', 'http://example.com/o1'); + const delete_query = patchSparqlUpdateDelete(store); + const string = 'DELETE DATA { .\n}'; + expect(delete_query).toBe(string); + }); +}); \ No newline at end of file diff --git a/src/service/publishing-stream-to-pod/QueryAnnotationPublishing.ts b/src/service/publishing-stream-to-pod/QueryAnnotationPublishing.ts index 09022f5..cb5d31e 100644 --- a/src/service/publishing-stream-to-pod/QueryAnnotationPublishing.ts +++ b/src/service/publishing-stream-to-pod/QueryAnnotationPublishing.ts @@ -1,4 +1,4 @@ -import { addRelationToNode, extractLdesMetadata, LDESConfig, LDESinLDP, LDESMetadata, LDPCommunication, MetadataParser, patchSparqlUpdateInsert, SolidCommunication, storeToString } from "@treecg/versionawareldesinldp"; +import { addRelationToNode, LDESConfig, LDESinLDP, LDPCommunication, MetadataParser, patchSparqlUpdateInsert, SolidCommunication, storeToString } from "@treecg/versionawareldesinldp"; import { ILogObj, Logger } from "tslog"; import { RSPQLParser } from "../parsers/RSPQLParser"; import { getTimeStamp, Resource } from "../../utils/ldes-in-ldp/EventSource"; @@ -8,27 +8,50 @@ import { add_resources_with_metadata_to_buckets, check_if_container_exists, crea import { editMetadata } from "../../utils/ldes-in-ldp/Util"; import { v4 as uuidv4 } from 'uuid'; import { AggregationFocusExtractor } from "../parsers/AggregationFocusExtractor"; -import { ParsedQuery } from "../parsers/ParsedQuery"; +import { ParsedQuery } from "../parsers/RSPQLParser"; import { RateLimitedLDPCommunication } from "rate-limited-ldp-communication"; const { quad, namedNode, literal } = DataFactory; const ldfetch = require('ldfetch'); const fetch = new ldfetch({}); - +/** + * The QueryAnnotationPublishing class is responsible for publishing the generated aggregation events from the RSP Engine with the + * Function Ontology Metadata to the LDP container in a LDES in LDP fashion to the Solid Pod of the Aggregator. The aggregator's Solid Pod stores the materialized results. + * @class QueryAnnotationPublishing + */ export class QueryAnnotationPublishing { private logger: Logger; public parser: RSPQLParser; public bucket_resources: { [key: string]: Resource[]; } + /** + * Creates an instance of QueryAnnotationPublishing. + * @memberof QueryAnnotationPublishing + */ constructor() { this.logger = new Logger(); this.parser = new RSPQLParser(); this.bucket_resources = {}; } + /** + * Published the generated aggregation events from the RSP Engine with the + * Function Ontology Metadata to the LDP container in a LDES in LDP fashion to the + * Solid Pod of the Aggregator. The aggregator's Solid Pod stores the materialized results + * Which can be used, and reused by other query processes. + * @param {string} query - The RSPQL query. + * @param {string} ldes_in_ldp_url - The URL of the LDES in LDP inside the Solid Pod. + * @param {Resource[]} resources - The resources to be published which were generated from the RSP Engine. + * @param {string} version_id - The version identifier of the LDES in LDP. + * @param {LDESConfig} config - The configuration of the LDES in LDP. + * @param {Date} start_time - The starting time of the aggregation function. + * @param {Date} end_time - The endtime of the aggregation function. + * @param {Session} [session] - The session object to communicate with the Solid Pod. + * @returns {*} {Promise} - A promise that resolves to void when the publishing is done. It just logs the result. + * @memberof QueryAnnotationPublishing + */ public async publish(query: string, ldes_in_ldp_url: string, resources: Resource[], version_id: string, config: LDESConfig, start_time: Date, end_time: Date, session?: Session): Promise { - // const comunication = session ? new SolidCommunication(session) : new LDPCommunication(); - const communication = new RateLimitedLDPCommunication(30, 1000); + const communication = session ? new SolidCommunication(session) : new RateLimitedLDPCommunication(30, 1000); const ldes_in_ldp = new LDESinLDP(ldes_in_ldp_url, communication); const metadata_store = await ldes_in_ldp.readMetadata(); const metadata = MetadataParser.extractLDESinLDPMetadata(metadata_store, ldes_in_ldp_url + "#EventStream") @@ -98,16 +121,25 @@ export class QueryAnnotationPublishing { ] ) await communication.patch(ldes_in_ldp_url, patchSparqlUpdateDelete(current_inbox_store)) - .then(async () => { - const ldp_response = await communication.patch(ldes_in_ldp_url, patchSparqlUpdateInsert(latest_inbox_store)) - console.log("response is: ", ldp_response); + .then(async () => { + const ldp_response = await communication.patch(ldes_in_ldp_url, patchSparqlUpdateInsert(latest_inbox_store)) + console.log("response is: ", ldp_response); - }) + }) }); } + + /** + * Generates a function ontology description for a query on the stream generated from the solid pod. + * @param {string} query - The RSPQL query. + * @param {Date} start_time - The starting time of the aggregation function. + * @param {Date} end_time - The endtime of the aggregation function. + * @returns {*} {Store} - Returns a Store of quads containing the Function Ontology which can be patched. + * @memberof QueryAnnotationPublishing + */ public get_query_metadata(query: string, start_time: Date, end_time: Date): Store { const query_identifier_uuid = uuidv4(); const aggregation_query_identifier: string = `http://example.org/aggregation_query/${query_identifier_uuid}`; @@ -158,10 +190,18 @@ export class QueryAnnotationPublishing { ]) return store; } + + /** + * Patches the Function Ontology Description of the stream events to the ./meta file of the LDP container. + * @param {Store} store - The store contains the quads related to the function ontology description. + * @param {string} location - The location of the container of which the description is generated. + * @param {LDPCommunication} ldp_communication - The communication object to communicate to the LDP. + * @memberof QueryAnnotationPublishing + */ public patch_metadata(store: Store, location: string, ldp_communication: LDPCommunication): void { const location_metadata = location + '.meta'; ldp_communication.patch(location_metadata, `INSERT DATA {${storeToString(store)}}`).then((response) => { - if (response.status == 200 || 201 || 205) { + if (response.status == 200 || response.status == 201 || response.status == 205) { this.logger.debug("The metadata of the LDP container is patched successfully") } }).catch((error) => { @@ -170,9 +210,10 @@ export class QueryAnnotationPublishing { } } /** - * - * @param store + * The function returns the SPARQL Update DELETE query to delete the data. + * @param {Store} store - The store to be deleted. + * @returns {string} - The SPARQL Update DELETE query to delete the data. */ export function patchSparqlUpdateDelete(store: Store): string { - return `DELETE DATA {${storeToString(store)}};` + return `DELETE DATA {${storeToString(store)}}` } \ No newline at end of file diff --git a/src/service/query-registry/QueryRegistry.test.ts b/src/service/query-registry/QueryRegistry.test.ts new file mode 100644 index 0000000..fae28db --- /dev/null +++ b/src/service/query-registry/QueryRegistry.test.ts @@ -0,0 +1,158 @@ +import { Logger } from "tslog"; +import { QueryRegistry } from "./QueryRegistry"; + +describe('QueryRegistry', () => { + let query_registry: QueryRegistry; + beforeAll(() => { + query_registry = new QueryRegistry(); + }) + const logger = new Logger(); + const rspql_query = ` + PREFIX saref: + PREFIX dahccsensors: + PREFIX : + REGISTER RStream AS + SELECT (MAX(?o) as ?maxSKT) + FROM NAMED WINDOW :w1 ON STREAM [RANGE 180000 STEP 30000] + WHERE { + WINDOW :w1 { + ?s saref:hasValue ?o . + ?s saref:relatesToProperty dahccsensors:wearable.skt . + } + } +`; + + it('initializing the QueryRegistry', () => { + expect(query_registry).toBeInstanceOf(QueryRegistry); + }); + it(`adding a query to the registry`, async () => { + expect(await query_registry.add_query_in_registry(rspql_query, logger)).toBe(true); + query_registry.delete_all_queries_from_the_registry(); + }); + + it('delete_all_queries_from_the_registry', async () => { + const query_one = ` + PREFIX saref: + PREFIX dahccsensors: + PREFIX : + REGISTER RStream AS + SELECT (MAX(?o) as ?maxSKT) + FROM NAMED WINDOW :w1 ON STREAM [RANGE 180000 STEP 30000] + WHERE { + WINDOW :w1 { + ?s saref:hasValue ?o . + ?s saref:relatesToProperty dahccsensors:wearable.skt . + } + } + `; + + const query_two = ` + PREFIX saref: + PREFIX dahccsensors: + PREFIX : + REGISTER RStream AS + SELECT (MIN(?o) as ?minSKT) + FROM NAMED WINDOW :w1 ON STREAM [RANGE 180000 STEP 30000] + WHERE { + WINDOW :w1 { + ?s saref:relatesToProperty ?o . + } + } + `; + await query_registry.add_query_in_registry(query_one, logger); + await query_registry.add_query_in_registry(query_two, logger); + expect(query_registry.get_registered_queries().get_length()).toBe(2); + query_registry.delete_all_queries_from_the_registry(); + expect(query_registry.get_registered_queries().get_length()).toBe(0); + }); + + it('if_only_unique_queries_are_added_to_query_registry', async () => { + console.log(query_registry.get_executing_queries()); + const query_one = ` + PREFIX saref: + PREFIX dahccsensors: + PREFIX : + REGISTER RStream AS + SELECT (AVG(?o) as ?avgSKT) + FROM NAMED WINDOW :w1 ON STREAM [RANGE 800 STEP 100] + WHERE { + WINDOW :w1{ + ?s saref:hasValue ?o + } + } + `; + + const query_two = ` + PREFIX saref: + PREFIX dahccsensors: + PREFIX : + REGISTER RStream AS + SELECT (AVG(?o) as ?avgSKT) + FROM NAMED WINDOW :w1 ON STREAM [RANGE 800 STEP 100] + WHERE { + WINDOW :w1{ + ?s saref:hasValue ?o + } + } + `; + + const query_three = ` + PREFIX saref: + PREFIX dahccsensors: + PREFIX : + REGISTER RStream AS + SELECT (AVG(?o) as ?avgSKT) + FROM NAMED WINDOW :w1 ON STREAM [RANGE 800 STEP 100] + WHERE { + WINDOW :w1{ + ?s ?p ?o + } + } + `; + // The first query is unique and should be added to the registry. + // The second query is not unique and should not be added to the registry. + expect(await query_registry.add_query_in_registry(query_one, logger)).toBe(true); + expect(await query_registry.add_query_in_registry(query_two, logger)).toBe(false); + // The third query is unique and should be added to the registry. + expect(await query_registry.add_query_in_registry(query_three, logger)).toBe(true); + query_registry.delete_all_queries_from_the_registry(); + expect(query_registry.get_registered_queries().get_length()).toBe(0); + }); + + it('get_registered_queries', async () => { + const query_one = ` + PREFIX saref: + PREFIX dahccsensors: + PREFIX : + REGISTER RStream AS + SELECT (AVG(?o) as ?avgSKT) + FROM NAMED WINDOW :w1 ON STREAM [RANGE 800 STEP 100] + WHERE { + WINDOW :w1{ + ?s saref:hasValue ?o + } + } + `; + + await query_registry.add_query_in_registry(query_one, logger); + expect(query_registry.get_registered_queries().getArrayCopy().length).toBe(1); + }); + + it('check_unique_query', async () => { + const query_one = ` + PREFIX saref: + PREFIX dahccsensors: + PREFIX : + REGISTER RStream AS + SELECT (AVG(?o) as ?avgSKT) + FROM NAMED WINDOW :w1 ON STREAM [RANGE 800 STEP 100] + WHERE { + WINDOW :w1{ + ?s saref:hasValue ?o + } + } + `; + await query_registry.add_query_in_registry(query_one, logger); + expect(query_registry.checkUniqueQuery(query_one, logger)).toBe(true); + }); +}); \ No newline at end of file diff --git a/src/service/query-registry/QueryRegistry.ts b/src/service/query-registry/QueryRegistry.ts index aeb5ff3..a0cbdee 100644 --- a/src/service/query-registry/QueryRegistry.ts +++ b/src/service/query-registry/QueryRegistry.ts @@ -6,7 +6,10 @@ import { WriteLockArray } from "../../utils/query-registry/Util"; import { hash_string_md5 } from "../../utils/Util"; const websocketConnection = require('websocket').connection; const WebSocketClient = require('websocket').client; - +/** + * The QueryRegistry class is responsible for registering, executing and storing the queries. + * @class QueryRegistry + */ export class QueryRegistry { registered_queries: WriteLockArray; executed_queries: WriteLockArray; @@ -41,12 +44,15 @@ export class QueryRegistry { } /** * Register a query in the QueryRegistry. - * @param {string} rspql_query - * @returns {*} + * @param {string} rspql_query - The RSPQL query to be registered. + * @param {QueryRegistry} query_registry - The QueryRegistry object. + * @param {number} from_timestamp - The timestamp from where the query is to be executed. + * @param {number} to_timestamp - The timestamp to where the query is to be executed. + * @param {any} logger - The logger object. + * @returns {Promise} - Returns true if the query is unique, otherwise false. * @memberof QueryRegistry */ - - async register_query(rspql_query: string, query_registry: QueryRegistry, from_timestamp: number, to_timestamp: number, logger: any) { + async register_query(rspql_query: string, query_registry: QueryRegistry, from_timestamp: number, to_timestamp: number, logger: any): Promise { if (await query_registry.add_query_in_registry(rspql_query, logger)) { /* The query is not already executing or computed ; it is unique. So, just compute it and send it via the websocket. @@ -58,7 +64,6 @@ export class QueryRegistry { else { /* The query is already computed and stored in the Solid Stream Aggregator's Solid Pod. So, read from there and send via a websocket. - TODO : make a result dispatcher module. */ logger.info({}, 'query_is_not_unique'); this.logger.debug(`The query you have registered is already executing.`); @@ -67,7 +72,14 @@ export class QueryRegistry { } - async add_query_in_registry(rspql_query: string, logger: any) { + /** + * Add a query to the registry. + * @param {string} rspql_query - The RSPQL query to be added. + * @param {any} logger - The logger object. + * @returns {Promise} - Returns true if the query is unique, otherwise false. + * @memberof QueryRegistry + */ + async add_query_in_registry(rspql_query: string, logger: any): Promise { await this.registered_queries.addItem(rspql_query); if (this.checkUniqueQuery(rspql_query, logger)) { /* @@ -86,21 +98,22 @@ export class QueryRegistry { /** * Add a query to the executing queries. - * @param {string} query + * @param {string} query - The query to be added. + * @returns {Promise} - Returns nothing. * @memberof QueryRegistry */ - add_to_executing_queries(query: string) { + async add_to_executing_queries(query: string): Promise { this.executing_queries.addItem(query); } /** * Checking if the query is unique or if it is isomorphic with an already executing query. - * @param {string} query - * @param logger - * @returns {*} + * @param {string} query - The query to be checked. + * @param {any} logger - The logger object. + * @returns {boolean} - Returns true if the query is unique, otherwise false. * @memberof QueryRegistry */ - checkUniqueQuery(query: string, logger: any) { + checkUniqueQuery(query: string, logger: any): boolean { const query_hashed = hash_string_md5(query); const registered_queries = this.get_registered_queries(); const array_length = registered_queries.get_length(); @@ -117,15 +130,59 @@ export class QueryRegistry { return false; } + /** + * Get the query registry length. + * @returns {number} - The length of the query registry. + * @memberof QueryRegistry + */ + get_query_registry_length() { + return this.registered_queries.get_length(); + } + /** + * Delete all the queries from the registry. + * @returns {boolean} - Returns true if the queries are deleted, otherwise false. + * @memberof QueryRegistry + */ + public delete_all_queries_from_the_registry() { + this.registered_queries.delete_all_items(); + const registered_queries = this.get_registered_queries(); + if (registered_queries.getArrayCopy().length === 0) { + this.logger.info('query_registry_cleared'); + return true; + } + else { + this.logger.error('query_registry_not_cleared'); + return false; + } + } + + /** + * Get the executing queries. + * @returns {WriteLockArray} - The executing queries. + * @memberof QueryRegistry + */ get_executing_queries() { return this.executing_queries; } + + /** + * Get the registered queries. + * @returns {WriteLockArray} - The registered queries. + * @memberof QueryRegistry + */ get_registered_queries() { return this.registered_queries; } + + /** + * Send a message to the server. + * @static + * @param {string} message - The message to be sent. + * @memberof QueryRegistry + */ static send_to_server(message: string) { if (this.connection.connected) { this.connection.sendUTF(message); @@ -137,6 +194,12 @@ export class QueryRegistry { } } + /** + * Connect with the Websocket server. + * @static + * @param {string} websocketURL - The URL of the websocket server. + * @memberof QueryRegistry + */ static async connect_with_server(websocketURL: string) { this.client.connect(websocketURL, 'solid-stream-aggregator-protocol'); this.client.on('connect', (connection: typeof websocketConnection) => { diff --git a/src/service/result-dispatcher/AggregationDispatcher.test.ts b/src/service/result-dispatcher/AggregationDispatcher.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/service/result-dispatcher/AggregationDispatcher.ts b/src/service/result-dispatcher/AggregationDispatcher.ts index af2b920..a19e987 100644 --- a/src/service/result-dispatcher/AggregationDispatcher.ts +++ b/src/service/result-dispatcher/AggregationDispatcher.ts @@ -5,27 +5,45 @@ import { RateLimitedLDPCommunication } from "rate-limited-ldp-communication"; import { filterRelation, ILDESinLDPMetadata, LDESinLDP, MetadataParser } from "@treecg/versionawareldesinldp"; const ld_fetch = require('ldfetch'); const ldfetch = new ld_fetch({}); -import { extractDateFromLiteral, LDPCommunication} from "@treecg/versionawareldesinldp"; +import { extractDateFromLiteral } from "@treecg/versionawareldesinldp"; import { Member } from "@treecg/types"; import { Readable } from "stream"; import { Quad } from "rdflib/lib/tf-types"; import { hash_string_md5 } from "../../utils/Util"; import { TREE } from "@treecg/ldes-snapshot"; import { DataFactory, Store } from "n3"; +import { aggregationDispatcherType } from "../../utils/Types"; import { Literal } from "n3"; -const { quad, namedNode, literal } = DataFactory; +const { namedNode } = DataFactory; +/** + * Class for dispatching aggregated events. + * @class AggregationDispatcher + */ export class AggregationDispatcher { public query: string; public communication: RateLimitedLDPCommunication; public aggregation_ldes: LDESinLDP; + /** + * Creates an instance of AggregationDispatcher. + * @param {string} query - The query to be dispatched. + * @memberof AggregationDispatcher + */ public constructor(query: string) { this.query = query; this.communication = new RateLimitedLDPCommunication(AGG_CONFIG.aggregator_rate_limit); this.aggregation_ldes = new LDESinLDP(AGG_CONFIG.aggregation_pod_ldes_location, this.communication) } + /** + * Dispatches aggregated events. + * @param {aggregationDispatcherType} opts - The options for reading the aggregated events. + * @param {Date} opts.from - The start date of the events to be dispatched. + * @param {Date} opts.to - The end date of the events to be dispatched. + * @returns {Promise} - A promise that resolves to a readable stream of aggregated events. + * @memberof AggregationDispatcher + */ public async dispatch_aggregated_events(opts: { from?: Date; to?: Date; @@ -48,7 +66,7 @@ export class AggregationDispatcher { const resources = this.aggregation_ldes.readPage(relation.node); const members: Member[] = []; - for await (const resource of resources){ + for await (const resource of resources) { const member_identifier = resource.getSubjects(relation.path, null, null)[0].value; resource.removeQuads(resource.getQuads(metadata.eventStreamIdentifier, TREE.member, null, null)); const member: Member = { @@ -57,7 +75,7 @@ export class AggregationDispatcher { } const member_date_time = extractDateFromMember(member, relation.path); - if (from <= member_date_time && member_date_time <= to){ + if (from <= member_date_time && member_date_time <= to) { members.push({ id: namedNode(member_identifier), quads: resource.getQuads(null, null, null, null) @@ -70,7 +88,7 @@ export class AggregationDispatcher { return a_date.getTime() - b_date.getTime(); }); - for (const member of sorted_members){ + for (const member of sorted_members) { member_stream.push(member); } @@ -80,9 +98,15 @@ export class AggregationDispatcher { return Promise.resolve(member_stream); } + /** + * Checks if aggregated events exist. + * @returns {Promise} - A promise that resolves to a boolean indicating if aggregated events exist. + * @memberof AggregationDispatcher + */ public async if_aggregated_events_exist(): Promise { // TODO : add the feature for query isomorphism here. // by creating a mapping between the query and the query hash(es). + // Relevant Issue : https://github.com/SolidLabResearch/solid-stream-aggregator/issues/36 let aggregated_events_exist: boolean = false; const parsed_query = parser.parse(this.query); const query_streams: string[] = []; @@ -90,7 +114,6 @@ export class AggregationDispatcher { query_streams.push(stream.stream_name); } const fragment_containers: string[] = []; - const aggregation_pod_ldes_identifier = AGG_CONFIG.aggregation_pod_ldes_location; const metadata = await this.aggregation_ldes.readMetadata(); for (const quad of metadata) { if (quad.predicate.value === "http://www.w3.org/ns/ldp#contains") { @@ -105,7 +128,7 @@ export class AggregationDispatcher { fno_description.set(fragment, response.triples); } - fno_description.forEach((value, key) => { + fno_description.forEach((value) => { const quads = value; for (const quad of quads) { if (quad.predicate.value === "http://www.example.org/has_query_hash") { @@ -123,8 +146,9 @@ export class AggregationDispatcher { } /** - * - * @param ldes_in_ldp + * Extracts the metadata of an LDES in LDP. + * @param {LDESinLDP} ldes_in_ldp - The LDES in LDP object. + * @returns {Promise} - The metadata of the LDES in LDP. */ export async function extractLdesMetadata(ldes_in_ldp: LDESinLDP): Promise { const metadata_store = await ldes_in_ldp.readMetadata(); @@ -132,9 +156,10 @@ export async function extractLdesMetadata(ldes_in_ldp: LDESinLDP): Promise { + let result_dispatcher: ResultDispatcher; + let websocket_client: WebSocket.client; + beforeEach(() => { + result_dispatcher = new ResultDispatcher(); + websocket_client = new WebSocket.client(); + }); + it('check_the_query_socket_channels', () => { + expect(result_dispatcher.query_socket_channels).toBeInstanceOf(Map); + }); + it('get_the_assigned_channel_to_query', () => { + result_dispatcher.assign_channel_to_query('query_id', websocket_client); + expect(result_dispatcher.query_socket_channels.get('query_id')).toEqual(websocket_client); + }); + + it('send_the_result_to_query_channel', () => { + result_dispatcher.assign_channel_to_query('query_id', websocket_client); + const result = ` .`; + expect(result_dispatcher.send_result_to_query_channel('query_id', result)).toBe(true); + }); +}); \ No newline at end of file diff --git a/src/service/result-dispatcher/ResultDispatcher.ts b/src/service/result-dispatcher/ResultDispatcher.ts index e82cc86..bddb61e 100644 --- a/src/service/result-dispatcher/ResultDispatcher.ts +++ b/src/service/result-dispatcher/ResultDispatcher.ts @@ -1,24 +1,46 @@ import * as WebSocket from 'websocket'; +/** + * The ResultDispatcher class is responsible for dispatching the result to the query channel. + * @class ResultDispatcher + */ export class ResultDispatcher { - private query_socket_channels: Map; + public query_socket_channels: Map; + /** + * Creates an instance of ResultDispatcher. + * @memberof ResultDispatcher + */ constructor() { this.query_socket_channels = new Map(); } - // assigning a websocket channel to a specific query. + /** + * Assign a websocket channel to a specific query. + * @param {string} query_id - The id of the query. + * @param {WebSocket.client} websocket - The websocket channel to be assigned. + * @memberof ResultDispatcher + */ public assign_channel_to_query(query_id: string, websocket: WebSocket.client) { this.query_socket_channels.set(query_id, websocket); } - // dispatching the result to the associated websocket channel. + + /** + * Send the result to the query channel. + * @param {string} query_id - The id of the query. + * @param {string} result - The result to be sent. + * @returns {boolean} - Returns true if the result is sent, otherwise false if no websocket channel was found for the query id. + * @memberof ResultDispatcher + */ public send_result_to_query_channel(query_id: string, result: string) { - const websocket = this.query_socket_channels.get(query_id); + const websocket = this.query_socket_channels.get(query_id); if (websocket !== undefined) { websocket.send(JSON.stringify(result)); + return true; } else { console.log("No websocket channel found for the query: " + query_id); + return false; } } } \ No newline at end of file diff --git a/src/service/result-dispatcher/WebSocketChannel.ts b/src/service/result-dispatcher/WebSocketChannel.ts index 0b61132..60a90b7 100644 --- a/src/service/result-dispatcher/WebSocketChannel.ts +++ b/src/service/result-dispatcher/WebSocketChannel.ts @@ -1,27 +1,12 @@ -/* -WebSocket channels with a single topic as a reponse to a query request for data from the -streams stored in the solid pod. -*/ - +/** + * WebSocket channels with a single topic as a reponse to a query request for data from the + * streams stored in the solid pod. + * @interface WebSocketChannel + */ export interface WebSocketChannel { - /* - identifier for the channel - */ id: string; - /* - the query the channel is reponding to - */ responseToQuery: string; - /* - sender of the query results - */ sender: string; - /* - channel to receive the query results - */ channel: string; - /* - the timestamp of the channel creation - */ timestamp: number; } \ No newline at end of file diff --git a/src/utils/StreamEventQueue.test.ts b/src/utils/StreamEventQueue.test.ts new file mode 100644 index 0000000..721d02e --- /dev/null +++ b/src/utils/StreamEventQueue.test.ts @@ -0,0 +1,89 @@ +import { quick_sort_queue, StreamEventQueue } from "./StreamEventQueue"; + +describe("stream_event_queue", () => { + it('should_enqueue_and_dequeue', async () => { + const event_queue = new StreamEventQueue([]); + event_queue.enqueue(1, 100); + event_queue.enqueue(2, 200); + console.log(event_queue); + + expect(event_queue.size()).toBe(2); + event_queue.dequeue(); + expect(event_queue.size()).toBe(1); + event_queue.dequeue(); + expect(event_queue.size()).toBe(0); + event_queue.dequeue(); + expect(event_queue.dequeue()).toBe(undefined); + }); + + it('should_check_if_queue_is_empty', async () => { + const event_queue = new StreamEventQueue([]); + expect(event_queue.is_empty()).toBe(true); + event_queue.enqueue(1, 100); + expect(event_queue.is_empty()).toBe(false); + event_queue.dequeue(); + expect(event_queue.is_empty()).toBe(true); + }); + + it('should_peek_at_earliest_event', () => { + const event_queue = new StreamEventQueue([]); + event_queue.enqueue(1, 100); + event_queue.enqueue(2, 200); + expect(event_queue.peek()).toBe(1); + event_queue.dequeue(); + expect(event_queue.peek()).toBe(2); + event_queue.dequeue(); + expect(event_queue.peek()).toBe(undefined); + }); + + + it('should_return_size_of_queue', () => { + const event_queue = new StreamEventQueue([]); + expect(event_queue.size()).toBe(0); + event_queue.enqueue(1, 100); + expect(event_queue.size()).toBe(1); + event_queue.enqueue(2, 200); + expect(event_queue.size()).toBe(2); + event_queue.dequeue(); + expect(event_queue.size()).toBe(1); + event_queue.dequeue(); + expect(event_queue.size()).toBe(0); + }); +}); + +describe('sort_event_queue', () => { + it('should_sort_events_by_time_ascending_order', () => { + + const unsorted_events = [ + { event: 1, timestamp: 100 }, + { event: 2, timestamp: 200 }, + { event: 3, timestamp: 50 }, + { event: 4, timestamp: 150 }, + { event: 5, timestamp: 250 }, + { event: 6, timestamp: 300 }, + { event: 7, timestamp: 250 }, + { event: 8, timestamp: 200 }, + ]; + + const unsorted_queue = new StreamEventQueue(unsorted_events); + const sorted_queue = quick_sort_queue(unsorted_queue); + const first_event = sorted_queue.dequeue(); + expect(first_event).toStrictEqual({event: 3, timestamp: 50 }); + + }); + + it('should_handle_an_empty_queue', () => { + const empty_queue = new StreamEventQueue([]); + const sorted_queue = quick_sort_queue(empty_queue); + const sorted_events = sorted_queue; + expect(sorted_events.size()).toBe(0); + }); + + it('should_handle_a_queue_with_one_event', () => { + const single_event_queue = new StreamEventQueue([{ event: 1, timestamp: 100 }]); + const sorted_queue = quick_sort_queue(single_event_queue); + const sorted_events = sorted_queue; + expect(sorted_events.size()).toBe(1); + expect(sorted_events.dequeue()).toStrictEqual({ event: 1, timestamp: 100 }); + }); +}) \ No newline at end of file diff --git a/src/utils/StreamEventQueue.ts b/src/utils/StreamEventQueue.ts index 5988d3f..391576a 100644 --- a/src/utils/StreamEventQueue.ts +++ b/src/utils/StreamEventQueue.ts @@ -1,9 +1,23 @@ +/** + * A queue for storing events in a stream. + * @class StreamEventQueue + * @template T + */ export class StreamEventQueue { public items: { event: T; timestamp: number; }[] = []; + /** + * Creates an instance of StreamEventQueue. + * @template T - The type of the event. + * @param {{ + * event: T; + * timestamp: number + * }[]} items - The items to be enqueued. + * @memberof StreamEventQueue + */ constructor(items: { event: T; timestamp: number @@ -11,13 +25,27 @@ export class StreamEventQueue { this.items = items; } + /** + * Enqueue an event to the queue. + * @template T - The type of the event. + * @param {T} event - The event to be enqueued. + * @param {number} timestamp - The timestamp of the event. + * @returns {void} - Enqueued event in the items queue. + * @memberof StreamEventQueue + */ enqueue(event: T, timestamp: number) { this.items.push({ event, timestamp }); } - + + /** + * Dequeue an event from the queue. + * @template T - The type of the event. + * @returns {(T | undefined)} - The dequeued event. + * @memberof StreamEventQueue + */ dequeue(): T | undefined { const earliest_event = this.findEarliestEvent(); if (earliest_event) { @@ -30,22 +58,50 @@ export class StreamEventQueue { throw new Error(`The event ${earliest_event} was not found in the queue.`); } } + return undefined; } + /** + * Check if the queue is empty. + * @returns {boolean} - True if the queue is empty, false otherwise. + * @memberof StreamEventQueue + */ is_empty(): boolean { return this.items.length === 0; } + + /** + * Get the size of the queue. + * @returns {number} - The size of the queue. + * @memberof StreamEventQueue + */ size(): number { return this.items.length; } + /** + * Peek at event in the queue. + * @template T - The type of the event. + * @returns {T} - {T | undefined}. + * @memberof StreamEventQueue + */ peek(): T | undefined { const earliest_event = this.findEarliestEvent(); return earliest_event ? earliest_event.event : undefined; } + /** + * Find the earliest event in the queue. + * @private + * @template T - The type of the event. + * @returns {({ + * event: T; + * timestamp: number + * } | undefined)} - The earliest event in the queue with its timestamp. + * @memberof StreamEventQueue + */ private findEarliestEvent(): { event: T; timestamp: number @@ -66,8 +122,10 @@ export class StreamEventQueue { /** - * - * @param stream_event_queue + * Sort a queue using the quick sort algorithm. + * @template T - The type of the event. + * @param {StreamEventQueue} stream_event_queue - The queue to be sorted. + * @returns {StreamEventQueue} - The sorted queue. */ export function quick_sort_queue(stream_event_queue: StreamEventQueue): StreamEventQueue { if (stream_event_queue.items.length <= 1) { diff --git a/src/utils/TypeIndexLDESLocator.ts b/src/utils/TypeIndexLDESLocator.ts index d9f5c45..5046645 100644 --- a/src/utils/TypeIndexLDESLocator.ts +++ b/src/utils/TypeIndexLDESLocator.ts @@ -2,6 +2,10 @@ const ld_fetch = require('ldfetch'); const ldfetch = new ld_fetch({}); const N3 = require('n3'); +/** + * Class for fetching the LDES stream URL from the type index. + * @class TypeIndexLDESLocator + */ export class TypeIndexLDESLocator { public readonly pod_webid: string; @@ -9,6 +13,11 @@ export class TypeIndexLDESLocator { public readonly private_type_index: string; public readonly public_type_index: string; + /** + * Creates an instance of TypeIndexLDESLocator. + * @param {string} pod_url - The URL of the pod. + * @memberof TypeIndexLDESLocator + */ constructor(pod_url: string) { this.pod_url = pod_url; this.pod_webid = `${this.pod_url}/profile/card#me`; @@ -16,11 +25,25 @@ export class TypeIndexLDESLocator { this.private_type_index = `${this.pod_url}/settings/privateTypeIndex`; } - public async getLDESStreamURL(metric: string) { + /** + * Fetches the LDES stream URL from the public type index. + * @param {string} metric - The metric to fetch the LDES stream URL for. + * @returns {Promise} - The LDES stream URL. + * @memberof TypeIndexLDESLocator + */ + public async getLDESStreamURL(metric: string): Promise { try { const response = await ldfetch.get(this.public_type_index); const store = new N3.Store(response.triples); const quads = store.getQuads(); + const relevant_ldes_metric = metric; + for (const quad of quads) { + if (quad.predicate.value === 'https://saref.etsi.org/core/relatesToProperty') { + if (quad.object.value === relevant_ldes_metric) { + return quad.subject.value; + } + } + } for (const quad of quads) { if (quad.predicate.value === 'https://saref.etsi.org/core/relatesToProperty') { continue; @@ -35,20 +58,40 @@ export class TypeIndexLDESLocator { return null; } } - + + /** + * Returns the pod WebID. + * @returns {string} - The WEBID of the pod. + * @memberof TypeIndexLDESLocator + */ public getPodWebId(): string { return this.pod_webid; } + /** + * Returns the pod URL. + * @returns {string} - The pod URL. + * @memberof TypeIndexLDESLocator + */ public getPodUrl(): string { return this.pod_url; } + /** + * Returns the private type index URL. + * @returns {string} - The private type index URL. + * @memberof TypeIndexLDESLocator + */ public getPrivateTypeIndex(): string { return this.private_type_index; } + /** + * Returns the public type index URL. + * @returns {string} - The public type index URL. + * @memberof TypeIndexLDESLocator + */ public getPublicTypeIndex(): string { return this.public_type_index; } diff --git a/src/utils/Types.ts b/src/utils/Types.ts index 6be8e63..e9c2259 100644 --- a/src/utils/Types.ts +++ b/src/utils/Types.ts @@ -1,4 +1,6 @@ import { Bindings } from "@comunica/types"; +import { LDESinLDP, LDPCommunication, SolidCommunication } from "@treecg/versionawareldesinldp"; +import { RateLimitedLDPCommunication } from "rate-limited-ldp-communication"; import { Quad } from "rdflib/lib/tf-types"; export type QuadWithID = { @@ -29,3 +31,17 @@ export type WebSocketMessage = { } export type Prefixes = { [key: string]: string } + +export type readOpts = { + from?: Date, + to?: Date, + ldes: LDESinLDP, + communication: LDPCommunication | SolidCommunication | RateLimitedLDPCommunication, + rate: number, + interval: number +} + +export type aggregationDispatcherType = { + from ?: Date, + to ?: Date +} \ No newline at end of file diff --git a/src/utils/Util.test.ts b/src/utils/Util.test.ts new file mode 100644 index 0000000..0228a2b --- /dev/null +++ b/src/utils/Util.test.ts @@ -0,0 +1,85 @@ +import { hash_string_md5, quick_sort, insertion_sort, find_public_type_index, measureExecutionTimeSync, measureExecutionTimeAsync } from "./Util"; + +it('hash_string_md5', () => { + const input = 'test'; + const output = '098f6bcd4621d373cade4e832627b4f6' + console.log(hash_string_md5(input)); + expect(hash_string_md5(input)).toBe(output); +}); + +it('quick_sort_test', () => { + const input_text = ['test', 'hello', 'world', 'a', 'b', 'c']; + const output_text = ['a', 'b', 'c', 'hello', 'test', 'world']; + expect(quick_sort(input_text)).toStrictEqual(output_text); + const output_numbers: string[] = ['1', '2', '3', '4', '5']; + const input_numbers: string[] = ['5', '4', '3', '2', '1']; + expect(quick_sort(input_numbers)).toStrictEqual(output_numbers); +}); + + +it('insertion_sort_test', () => { + const input_text = ['test', 'hello', 'world', 'a', 'b', 'c']; + const output_text = ['a', 'b', 'c', 'hello', 'test', 'world']; + expect(insertion_sort(input_text)).toStrictEqual(output_text); + const output_numbers: string[] = ['1', '2', '3', '4', '5']; + const input_numbers: string[] = ['5', '4', '3', '2', '1']; + expect(insertion_sort(input_numbers)).toStrictEqual(output_numbers); +}); + +describe('finding_public_type_index', () => { + jest.mock('ldfetch', () => { + jest.fn() + }); + const ldfetch = require('ldfetch'); + it('should return public type index', () => { + // const pod_url = 'http://n061-14a.wall2.ilabt.iminds.be:3000/'; + // const profile_document_url = pod_url + 'profile/card'; + + const mock_response = { + triples: [ + // mock-triple responses. + ] + }; + + ldfetch.get.mockResolvedValueOnce(mock_response); + + }); + + it('should_handle_error_during_fetch', async () => { + const pod_url = 'http://n061-14a.wall2.ilabt.iminds.be:3000/'; + ldfetch.get.mockRejectedValueOnce('Error: Could not fetch profile document'); + const result = await find_public_type_index(pod_url); + expect(ldfetch.get).toHaveBeenCalled(); + expect(result).toBe(''); + }); +}); + + +describe('measureExecutionTimeSync', () => { + jest.useFakeTimers(); + it('should_measure_execution_time_sync', () => { + const mock_function = jest.fn(() => { + for (let i = 0; i < 100000000; i++) { + // do nothing + } + }); + const result = measureExecutionTimeSync(mock_function, 'test'); + jest.advanceTimersByTime(1000); + expect(mock_function).toHaveBeenCalled(); + expect(result.execution_time).toBe(1000); + expect(result.component_name).toBe('test'); + }); +}) + +describe('measureExecutionTimeAsync', () => { + it('should_measure_execution_time_async', async () => { + const mock_async_function = jest.fn(async () => { + await new Promise(resolve => setTimeout(resolve, 1000)); + }); + const result = await measureExecutionTimeAsync(mock_async_function, 'test'); + jest.advanceTimersByTime(2000); + expect(mock_async_function).toHaveBeenCalled(); + expect(result.execution_time).toBe(2000); + expect(result.component_name).toBe('test'); + }); +}); diff --git a/src/utils/Util.ts b/src/utils/Util.ts index b5888a5..4a24b02 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -5,8 +5,9 @@ const ld_fetch = new ldfetch({}); const N3 = require('n3'); /** - * - * @param input_string + * Hash a string using the MD5 algorithm. + * @param {string} input_string - The input string to be hashed. + * @returns {string} - The hashed string. */ export function hash_string_md5(input_string: string) { input_string = input_string.replace(/\s/g, ''); @@ -16,9 +17,10 @@ export function hash_string_md5(input_string: string) { } /** - * - * @param func - * @param component_name + * Measure the execution time of a function. + * @param {void} func - The function to be measured. + * @param {string} component_name - The name of the component. + * @returns {object} - The execution time of the function. */ export function measureExecutionTimeSync(func: () => void, component_name: string) { const start_time = new Date().getTime(); @@ -31,9 +33,10 @@ export function measureExecutionTimeSync(func: () => void, component_name: strin } /** - * - * @param func - * @param component_name + * Measure the execution time of a function which is asynchronous. + * @param {void} func - The function to be measured. + * @param {string} component_name - The name of the component. + * @returns {object} - The execution time of the function. */ export async function measureExecutionTimeAsync(func: () => Promise, component_name: string) { const start_time = new Date().getTime(); @@ -46,10 +49,11 @@ export async function measureExecutionTimeAsync(func: () => Promise, compo } /** - * + * Create an aggregator pod. + * @returns {Promise} - Returns true if the aggregator pod was created successfully, otherwise false. */ export async function create_aggregator_pod(): Promise { - exec('npx community-solid-server --config src/server/aggregator-pod/config.json -f ./aggregation-data/ --seededPodConfigJson src/server/aggregator-pod/account.json', (err: any, stdout: any, stderr: any) => { + exec('npx community-solid-server --config src/server/aggregator-pod/config.json -f ./aggregation-data/ --seededPodConfigJson src/server/aggregator-pod/account.json', (err: any, stdout: any) => { if (stdout.code !== 0) { console.log('Error: Failed to create aggregator pod'); return false; @@ -62,8 +66,9 @@ export async function create_aggregator_pod(): Promise { } /** - * - * @param arr + * Sort an array using the quick sort algorithm. + * @param {string[]} arr - The array to be sorted. + * @returns {string[]} - The sorted array. */ export function quick_sort(arr: string[]): string[] { if (arr.length <= 1) { @@ -88,11 +93,11 @@ export function quick_sort(arr: string[]): string[] { return [...quick_sort(left), ...equal, ...quick_sort(right)]; } -// TODO: sort it on the hashmap but will be faster. /** - * - * @param arr + * Sort an array using the insertion sort algorithm. + * @param {string[]} arr - The array to be sorted. + * @returns {string[]} - The sorted array. */ export function insertion_sort(arr: string[]): string[] { const len = arr.length; @@ -113,9 +118,10 @@ export function insertion_sort(arr: string[]): string[] { } /** - * - * @param solid_pod_url - * @param interest_metrics + * Find relevant streams in a Solid Pod. + * @param {string} solid_pod_url - The URL of the Solid Pod. + * @param {string[]} interest_metrics - The array of interest metrics which are relevant and being searched inside the aggregator pod. + * @returns {Promise} - The relevant streams. */ export async function find_relevant_streams(solid_pod_url: string, interest_metrics: string[]): Promise { const relevant_streams: string[] = []; @@ -141,9 +147,10 @@ export async function find_relevant_streams(solid_pod_url: string, interest_metr } /** - * - * @param solid_pod_url - * @param interest_metrics + * Check if relevant streams exist in a Solid Pod. + * @param {string} solid_pod_url - The URL of the Solid Pod. + * @param {string[]} interest_metrics - The array of interest metrics which are relevant and being searched inside the aggregator pod. + * @returns {Promise} - Returns true if relevant streams exist, otherwise false. */ export async function if_exists_relevant_streams(solid_pod_url: string, interest_metrics: string[]): Promise { try { @@ -166,8 +173,9 @@ export async function if_exists_relevant_streams(solid_pod_url: string, interest } /** - * - * @param solid_pod_url + * Find the public type index of a Solid Pod. + * @param {string} solid_pod_url - The URL of the Solid Pod. + * @returns {Promise} - The public type index. */ export async function find_public_type_index(solid_pod_url: string): Promise { const profie_document = solid_pod_url + "/profile/card"; diff --git a/src/utils/algorithms/NaiveRebalancing.ts b/src/utils/algorithms/NaiveRebalancing.ts index 2e81bc9..512392f 100644 --- a/src/utils/algorithms/NaiveRebalancing.ts +++ b/src/utils/algorithms/NaiveRebalancing.ts @@ -25,13 +25,13 @@ import { Prefixes } from "../Types"; /** * In order to correctly rebalance the container, * this algorithm assumes that all resources in the container are in fact part of the LDES in LDP. - * @param ldpCommunication - * @param metadata - * @param containerURL - * @param bucketSize - * @param prefixes - * @param loglevel - * @returns {Promise} + * @param {Communication} ldpCommunication - The communication object to communicate to the LDP. + * @param {ILDESinLDPMetadata} metadata - The metadata of the LDES. + * @param {string} containerURL - The URL of the container to be rebalanced. + * @param {number} bucketSize - The maximum number of resources per container. + * @param {Prefixes} prefixes - The prefixes of the LDES. + * @param {string} loglevel - The loglevel of the logger. + * @returns {Promise} - Returns a promise. */ export async function rebalanceContainer(ldpCommunication: Communication, metadata: ILDESinLDPMetadata, containerURL: string, bucketSize: number, prefixes: Prefixes, loglevel: string = 'info'): Promise { @@ -144,6 +144,9 @@ export async function rebalanceContainer(ldpCommunication: Communication, metada const resourceUrl = resourcesLocationMap.get(resource) if (resourceUrl) { const response = await ldpCommunication.delete(resourceUrl) + if (response.status !== 205) { + logger.error('for some reason, following resource could not be deleted: ' + resourceUrl) + } } else { logger.error('for some reason, following resource could not be deleted: ' + resourceUrl) } diff --git a/src/utils/algorithms/naiveAlgorithm.ts b/src/utils/algorithms/naiveAlgorithm.ts index a2332ea..df1a01a 100644 --- a/src/utils/algorithms/naiveAlgorithm.ts +++ b/src/utils/algorithms/naiveAlgorithm.ts @@ -19,16 +19,12 @@ import { } from "@treecg/versionawareldesinldp"; import {Session} from "@rubensworks/solid-client-authn-isomorphic" import {addRelationToNode, createContainer} from "@treecg/versionawareldesinldp/dist/ldes/Util"; -import {DataFactory, Store} from "n3"; +import {Store} from "n3"; import {rebalanceContainer} from "./NaiveRebalancing"; import {Logger} from "@treecg/versionawareldesinldp/dist/logging/Logger"; import {performance, PerformanceObserver} from 'perf_hooks' import {editMetadata} from "../ldes-in-ldp/Util"; import { Prefixes } from "../Types"; - -const {quad, namedNode} = DataFactory - - /** * Algorithm A. * @@ -38,17 +34,17 @@ const {quad, namedNode} = DataFactory * step 3: rebalance. * * Params: - * * LDESinLDPURL (string) - * * 1000 resources (Resource[]) - * * version ID. - * @param lilURL - * @param resources - * @param versionID - * @param bucketSize - * @param config - * @param prefixes - * @param session - * @param loglevel + * LDESinLDPURL (string) + * 1000 resources (Resource[]) + * version ID. + * @param {string} lilURL - The URL of the LDES in LDP. + * @param {Resource[]} resources - The resources array to be added to the LDES. + * @param {string} versionID - The version identifier of the LDES. + * @param {number} bucketSize - The maximum number of resources per container. + * @param {LDESConfig} config - The configuration of the LDES. + * @param {Prefixes} prefixes - The prefixes of the LDES. + * @param {Session} session - The session of the user. + * @param {string} loglevel - The loglevel of the logger. */ export async function naiveAlgorithm(lilURL: string, resources: Resource[], versionID: string, bucketSize: number, config: LDESConfig, prefixes: Prefixes, session?: Session, loglevel: string = 'info'): Promise { @@ -108,6 +104,7 @@ export async function naiveAlgorithm(lilURL: string, resources: Resource[], vers // add version identifier to resource const resourceStore = new Store(resource) const subject = resourceStore.getSubjects(config.treePath, null, null)[0] // Note: kind of hardcoded to get subject of resource + console.log(`Adding version to resource ${subject}`); // resourceStore.add(quad(subject, namedNode(metadata.versionOfPath), namedNode(versionID))) } console.log(resources.length) diff --git a/src/utils/authentication/css-auth.ts b/src/utils/authentication/CSSAuthentication.ts similarity index 86% rename from src/utils/authentication/css-auth.ts rename to src/utils/authentication/CSSAuthentication.ts index 135bd81..9c68c9a 100644 --- a/src/utils/authentication/css-auth.ts +++ b/src/utils/authentication/CSSAuthentication.ts @@ -23,8 +23,9 @@ async function createAuthenticationTokenCSS(options: any) { } /** - * - * @param options + * Get the Identity Provider from a WebID. + * @param {any} options - The options for the token generation. + * @returns {Promise} - The resulting Identity Provider. */ async function getIdpFromWebID(options: any) { const parser = new N3.Parser({ baseIRI: options.webid }); @@ -48,8 +49,9 @@ async function getIdpFromWebID(options: any) { } /** - * - * @param options + * Generate a authentication token from the IDP of the Community Solid Server. + * @param {any} options - The options for the token generation. + * @returns {Promise} - The resulting token. */ export async function generateToken(options: any) { // This assumes your server is started under http://localhost:3000/. @@ -87,9 +89,10 @@ async function makeAuthenticatedFetch(credentials: any, fetch: any) { } /** - * - * @param credentials - * @param passedFetch + * Create an authenticated fetch function using a file with a CSS client credentials token for CSS v4.0.0 and higher. + * @param {any} credentials - Client Credentials Token. + * @param {any} passedFetch - Optional fetch function to authenticate. Defaults to built-in fetch function. + * @returns {Promise} - The authenticated fetch function. */ async function createAuthenticatedFetchFunction(credentials: any, passedFetch: any) { const { id, secret, idp } = credentials; @@ -130,8 +133,9 @@ async function createAuthenticatedFetchFunction(credentials: any, passedFetch: a return authFetch } /** - * - * @param credentials + * Create a session with a file with a CSS client credentials token for CSS v4.0.0 and higher. + * @param {any} credentials - Client Credentials Token. + * @returns {Promise} - The resulting session. */ export async function session_with_credentials(credentials: any): Promise { const session = new Session(); diff --git a/src/utils/authentication/test.ts b/src/utils/authentication/test.ts deleted file mode 100644 index 8be3364..0000000 --- a/src/utils/authentication/test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { getAuthenticatedSession, LDESinLDP, LDPCommunication, SolidCommunication } from "@treecg/versionawareldesinldp"; -import { session_with_credentials, generateToken } from "./css-auth"; -import { performance, PerformanceObserver } from "perf_hooks"; -const n3 = require('n3'); -import { storeToString } from "@treecg/versionawareldesinldp"; -import { readMembersRateLimited } from "../ldes-in-ldp/EventSource"; - -/** - * - */ -async function main() { - let counter = 0; - // const token = await generateToken({ - // email: 'dataset_participant2@protego.com', - // password: 'KdxpVr', - // name: 'Solid-Stream-Aggregator', - // idp: 'http://localhost:3000/' - // }); - // const credentials = { - // id: token.id, - // secret: token.secret, - // idp: 'http://localhost:3000/' - // } - - // console.log(credentials); - - // const session = await session_with_credentials(credentials); - // console.log(session.info.isLoggedIn); - - if (true) { - const ldes_in_ldp_identifier = "http://localhost:3000/dataset_participant1/data/" - // const ldes_in_ldp_identifier = "http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp-10min/" - // const communication = new SolidCommunication(session); - const communication = new LDPCommunication(); - const ldes_in_ldp = new LDESinLDP(ldes_in_ldp_identifier, communication); - // const ldes = await ldes_in_ldp.readAllMembers(); - - - const ldes = await readMembersRateLimited({ - ldes: ldes_in_ldp, - communication: new LDPCommunication(), - rate: 20, - interval: 1000 - }) - - performance.mark("start_reading"); - const time_start = performance.now(); - let time_end; - ldes.on("data", (data) => { - // const store = new n3.Store(data.quads); - // console.log(storeToString(store)); - console.log(counter); - counter++; - }); - - ldes.on("end", () => { - console.log(counter); - console.log("Stream ended"); - const time_end = performance.now(); - }); - - } -} -main(); \ No newline at end of file diff --git a/src/utils/function-ontology/Metadata.ts b/src/utils/function-ontology/Metadata.ts index d861247..b313e2b 100644 --- a/src/utils/function-ontology/Metadata.ts +++ b/src/utils/function-ontology/Metadata.ts @@ -11,10 +11,11 @@ const myEngine = new QueryEngine(); /** - * - * @param resource + * Get the metadata of the LDP container. + * @param {string} resource - The LDP resource URL. + * @returns {Promise} - Returns the metadata of the LDP container. */ -export async function get_metadata_container(resource: string) { +export async function get_metadata_container(resource: string): Promise { const ldp_container_meta = resource.split("/").slice(0, -1).join("/") + "/.meta"; const metadata = await fetch.get(ldp_container_meta); const store = new N3.Store(); @@ -24,16 +25,17 @@ export async function get_metadata_container(resource: string) { } } const quads = store.getQuads(null, null, null, null); - console.log(writer.quadsToString(quads)) + return (writer.quadsToString(quads)); } /** - * - * @param resource + * Get the original events which were used to generate the aggregated event. + * @param {string} resource - The LDES in LDP resource URL. */ export async function trace_original_events(resource: string) { - const stream = await get_container_stream_metadata(resource).then((stream: string) => { - const resource_metadata = fetch.get(resource).catch((error: Error) => { + await get_container_stream_metadata(resource).then((stream: string | undefined) => { + console.log(`Stream: ${stream}`); + fetch.get(resource).catch((error: Error) => { console.log(error); // TODO: add the type for the resource metadata }).then(async (resource_metadata: any) => { @@ -49,7 +51,7 @@ export async function trace_original_events(resource: string) { binding_stream.on('data', async (binding: Bindings) => { const timestamp_from = binding.get('timestamp_from'); const timestamp_to = binding.get('timestamp_to'); - if (timestamp_from !== undefined && timestamp_to !== undefined) { + if (stream && timestamp_from && timestamp_from.value && timestamp_to && timestamp_to.value) { await get_original_events(stream, timestamp_from.value, timestamp_to.value); } }); @@ -57,28 +59,32 @@ export async function trace_original_events(resource: string) { }); } -/** - * - * @param registered_stream - * @param aggregation_event_window_start - * @param aggregation_event_window_end +/** + * Get the original events which were used to generate the aggregated event. + * @param {string} registered_stream - The URL of the registered stream which was used to generate the event in the container stored in the LDP resource. + * @param {string} aggregation_event_window_start - The start date of the aggregation event window. + * @param {string} aggregation_event_window_end - The end date of the aggregation event window. + * @returns {Promise} - Returns the original events. */ -async function get_original_events(registered_stream: string, aggregation_event_window_start: string, aggregation_event_window_end: string) { +async function get_original_events(registered_stream: string, aggregation_event_window_start: string, aggregation_event_window_end: string): Promise { + const original_events: string[] = []; const communication = new LDPCommunication(); const ldes_in_ldp = new LDESinLDP(registered_stream, communication); const aggregation_event_window_start_date = new Date(aggregation_event_window_start); const aggregation_event_window_end_date = new Date(aggregation_event_window_end); const lil_stream = ldes_in_ldp.readAllMembers(aggregation_event_window_start_date, aggregation_event_window_end_date); (await lil_stream).on('data', (member: QuadWithID) => { - console.log(member.quads[0].subject.value); + original_events.push(member.quads[0].subject.value); }); + return original_events; } /** - * - * @param ldp_resource + * Get the registered stream which was used to generate the event in the container stored in the LDP resource. + * @param {string} ldp_resource - The URL of the LDP resource. + * @returns {Promise} - Returns the URL of the stream. */ -async function get_container_stream_metadata(ldp_resource: string) { +async function get_container_stream_metadata(ldp_resource: string): Promise { const ldp_container_meta: string = ldp_resource.split("/").slice(0, -1).join("/") + "/.meta"; const metadata = await fetch.get(ldp_container_meta).catch((error: Error) => { console.log(error); @@ -90,9 +96,11 @@ async function get_container_stream_metadata(ldp_resource: string) { return quad.object.value; } else { + throw new Error("No registered streams found"); } } } else { + throw new Error("No metadata found"); } } \ No newline at end of file diff --git a/src/utils/ldes-in-ldp/EventSource.ts b/src/utils/ldes-in-ldp/EventSource.ts index cf73079..30f7047 100644 --- a/src/utils/ldes-in-ldp/EventSource.ts +++ b/src/utils/ldes-in-ldp/EventSource.ts @@ -17,7 +17,7 @@ import { extractDateFromMember, extractLdesMetadata } from "../../service/result import { Readable } from "stream"; import { Member } from "@treecg/types"; import { TREE } from "@treecg/ldes-snapshot"; -import { Prefixes } from "../Types"; +import { Prefixes, readOpts } from "../Types"; import { RateLimitedLDPCommunication } from "rate-limited-ldp-communication"; const namedNode = DataFactory.namedNode; @@ -28,10 +28,9 @@ export type Resource = Quad[] export type BucketResources = { [p: string]: Resource[] } /** - * @param credentialsFile - Filepath to a JSON containing credentials to setup a - * Solid communication session. - * @param credentialsFilepath - * @returns {Promise} + * Initialises an authenticated Solid communication session with the Solid Server. + * @param {string} credentialsFilepath - The path to the file containing the credentials. + * @returns {Promise} - Returns a Solid communication session. */ export async function initSession(credentialsFilepath: string): Promise { if (existsSync(credentialsFilepath)) { @@ -51,9 +50,9 @@ export async function initSession(credentialsFilepath: string): Promise} - Returns the prefixes as an object. */ export async function prefixesFromFilepath(path: string, url?: string): Promise { const prefixes: { [key: string]: string } = {}; @@ -125,10 +126,10 @@ export async function prefixesFromFilepath(path: string, url?: string): Promise< * issues * Note: a more processing performant solution might be possible, by creating a store from the resource * and indexing from there instead of two seperate maps. - * @param resource - The resource that gets converted to a string. - * @param _prefixes - An object which members are strings, member name being the short prefix and its + * @param {Resource} resource - The resource that gets converted to a string. + * @param {Prefixes} _prefixes - An object which members are strings, member name being the short prefix and its * value a string representing its URI. Example: `{"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#"}`. - * @returns {string} + * @returns {string} - Returns the resource as a string. */ export function resourceToOptimisedTurtle(resource: Resource, _prefixes: Prefixes): string { // get a grouped overview of this resource's content @@ -190,39 +191,33 @@ export function resourceToOptimisedTurtle(resource: Resource, _prefixes: Prefixe * Adds all the resources from each bucket entry of the BucketResources object to the specified container * Note: currently does not do any error handling * handling should be something in the line of collecting all the resources that were added OR trying to add them again? - * @param bucketResources - * @param metadata - * @param ldpComm - * @param prefixes - * @returns {Promise} + * @param {BucketResources} bucketResources - The resources to be added to the LDES in seperate fragments (i.e. LDP containers) or buckets. + * @param {ILDESinLDPMetadata} metadata - The metadata of the LDES. + * @param {LDPCommunication} ldpComm - The LDP communication object to communicate to the LDP. + * @param {Prefixes} prefixes - The prefixes of the LDES. + * @returns {Promise} - Returns nothing (void) and just creates the resources in the LDP. */ export async function addResourcesToBuckets(bucketResources: BucketResources, metadata: ILDESinLDPMetadata, ldpComm: LDPCommunication, prefixes: Prefixes) { for (const containerURL of Object.keys(bucketResources)) { for (const resource of bucketResources[containerURL]) { const response = await ldpComm.post(containerURL, resourceToOptimisedTurtle(resource, prefixes)) - // console.log(`Resource stored at: ${response.headers.get('location')} | status: ${response.status}`) + console.log(`Resource stored at: ${response.headers.get('location')} | status: ${response.status}`) // TODO: handle when status is not 201 (Http Created) } } } - - -/** - * Rate limiting read members function so that the GET requests are - * not sent too fast to the server so that the CSS server does not crash. - * @export - */ - /** - * - * @param opts - * @param opts.from - * @param opts.to - * @param opts.ldes - * @param opts.communication - * @param opts.rate - * @param opts.interval + * Rate limiting read members function so that the GET requests are + * not sent too fast to the server so that the CSS server does not crash. + * @param {readOpts} opts - The options for the read function. + * @param {Date} opts.from - The date from which the members should be read. + * @param {Date} opts.to - The date to which the members should be read. + * @param {LDESinLDP} opts.ldes - The LDES in LDP object. + * @param {LDPCommunication | SolidCommunication | RateLimitedLDPCommunication} opts.communication - The communication object to communicate to the LDP. + * @param {number} opts.rate - The rate at which the GET requests should be sent. + * @param {number} opts.interval - The interval at which the GET requests should be sent. + * @returns {Promise} - Returns the members as a readable stream. */ export async function readMembersRateLimited(opts: { from?: Date, @@ -246,15 +241,10 @@ export async function readMembersRateLimited(opts: { const metadata = await extractLdesMetadata(opts.ldes); const relations = filterRelation(metadata, from, to); const rate_limit_comm = new RateLimitedLDPCommunication(rate) - const pre_process_end = performance.now(); - for (const relation of relations) { - const start_loop = performance.now(); + for (const relation of relations) { const resources = readPageRateLimited(opts.ldes, relation.node, rate_limit_comm, metadata); - const readPage = performance.now(); const members: Member[] = []; - let resource_counter = 0; for await (const resource of resources) { - resource_counter++; if (resource !== undefined) { const members_id = resource.getSubjects(relation.path, null, null); for (const member_id of members_id) { @@ -278,7 +268,6 @@ export async function readMembersRateLimited(opts: { }); sorted_members.forEach(member => member_stream.push(member)); } - const end = performance.now(); member_stream.push(null); return member_stream; } @@ -286,15 +275,11 @@ export async function readMembersRateLimited(opts: { /** * ReadPage function which is rate limited so that there are * not a lot of GET requests so that the CSS server does not crash. - */ - - -/** - * - * @param ldes - * @param fragment_url - * @param rate_limit_comm - * @param metadata + * @param {LDESinLDP} ldes - The LDES in LDP object. + * @param {string} fragment_url - The URL of the fragment to be read. + * @param {RateLimitedLDPCommunication} rate_limit_comm - The rate limited LDP communication object to communicate to the LDP. + * @param {ILDESinLDPMetadata} metadata - The metadata of the LDES. + * @yields {AsyncIterable} - Returns the fragment as an N3 Store. */ export async function* readPageRateLimited(ldes: LDESinLDP, fragment_url: string, rate_limit_comm: RateLimitedLDPCommunication, metadata: ILDESinLDPMetadata): AsyncIterable { if (isContainerIdentifier(fragment_url)) { @@ -314,18 +299,39 @@ export async function* readPageRateLimited(ldes: LDESinLDP, fragment_url: string } } + /** * Read function which is rate limited so that there are not a lot of GET requests * so that the CSS server does not crash. - */ - -/** - * - * @param ldes - * @param resource_identifier - * @param rate_limit_comm + * @param {LDESinLDP} ldes - The LDES in LDP object. + * @param {string} resource_identifier - The identifier of the resource to be read. + * @param {RateLimitedLDPCommunication} rate_limit_comm - The rate limited LDP communication object to communicate to the LDP. + * @returns {Promise} - Returns the resource as an N3 Store. */ export async function readRateLimited(ldes: LDESinLDP, resource_identifier: string, rate_limit_comm: RateLimitedLDPCommunication) { + try { + // TODO : check for headers, as well as error handling. check if you can increase the timeout for the get request as some resources might take longer to load (due to large files, slow server, etc.) + // relevant issue: https://github.com/SolidLabResearch/solid-stream-aggregator/issues/35 + const response = await rate_limit_comm.get(resource_identifier); + if (response && response.status !== 200) { + throw new Error(`Resource not found: ${resource_identifier}`); + } + if (response && response.headers.get('content-type') !== 'text/turtle') { + throw new Error(`Resource is not turtle: ${resource_identifier}`); + } + const text = response ? await response.text() : ''; + if (text === '') { + throw new Error(`Resource is empty: ${resource_identifier}`); + } + return await turtleStringToStore(text, resource_identifier); + } catch (error) { + console.error(`Error reading resource: ${resource_identifier}`, error); + if (error instanceof Error) { + if (error.message.includes('Resource not found')) { + console.log(`Resource not found: ${resource_identifier}`); + } + } + } const response = await rate_limit_comm.get(resource_identifier); if (response && response.status !== 200) { console.log(`Resource not found: ${resource_identifier}`); diff --git a/src/utils/ldes-in-ldp/EventSourceUtil.ts b/src/utils/ldes-in-ldp/EventSourceUtil.ts index 20c76bb..17c7e0b 100644 --- a/src/utils/ldes-in-ldp/EventSourceUtil.ts +++ b/src/utils/ldes-in-ldp/EventSourceUtil.ts @@ -4,7 +4,6 @@ import { extractTimestampFromLiteral, ILDESinLDPMetadata, LDESinLDP, - LDESMetadata, LDPCommunication, storeToString } from "@treecg/versionawareldesinldp"; @@ -19,9 +18,9 @@ export type BucketResources = { [p: string]: Resource[] } /** * Calculates to which bucket (i.e. The ldp:Container) the resource should be added. * When the returned url is none, this means the resource its timestamp is less than all current bucket timestamps. - * @param resource - * @param metadata - * @returns {string} + * @param {Resource} resource - The resource to be added. + * @param {ILDESinLDPMetadata} metadata - The metadata of the LDES. + * @returns {string} - The URL of the bucket. */ export function calculateBucket(resource: Resource, metadata: ILDESinLDPMetadata): string { const relations = metadata.view.relations @@ -41,8 +40,9 @@ export function calculateBucket(resource: Resource, metadata: ILDESinLDPMetadata /** * The new container URL is calculated based on the container URL where too many resources reside and a timestamp. - * @param containerURL - * @param timestamp + * @param {string} containerURL - The LDP container to be created. + * @param {number} timestamp - The timestamp of the fragment which will hold the resources. + * @returns {string} - The URL of the new container. */ export function createBucketUrl(containerURL: string, timestamp: number) { const split = containerURL.split('/') @@ -56,9 +56,9 @@ export function createBucketUrl(containerURL: string, timestamp: number) { /** * Retrieve timestamp of a resource (ms). - * @param resource - * @param timestampPath - * @returns {number} + * @param {Resource} resource - The resource to be added to the LDES. + * @param {string} timestampPath - The tree:path relation which was used to fragmentize the LDES. + * @returns {number} - The timestamp. */ export function getTimeStamp(resource: Resource, timestampPath: string): number { const resourceStore = new Store(resource) @@ -77,10 +77,10 @@ export function getTimeStamp(resource: Resource, timestampPath: string): number */ /** - * - * @param bucket_resources - * @param metadata - * @param ldp_communication + * Adds the resources with metadata to the LDP. + * @param {BucketResources} bucket_resources - The resources to be added to the LDES in seperate fragments (i.e. LDP containers) or buckets. + * @param {ILDESinLDPMetadata} metadata - The metadata of the LDES. + * @param {LDPCommunication} ldp_communication - The LDP communication object to communicate to the LDP. */ export async function add_resources_with_metadata_to_buckets(bucket_resources: BucketResources, metadata: ILDESinLDPMetadata, ldp_communication: LDPCommunication) { for (const containerURL of Object.keys(bucket_resources)) { @@ -102,6 +102,7 @@ export async function add_resources_with_metadata_to_buckets(bucket_resources: B uuid, `INSERT DATA {${storeToString(relation_to_resource_store)}}` ).then((response) => { + console.log(`Relation to resource added: ${response.status}`); } ).catch((error) => { console.log("Error while patching metadata of the LDP resource: " + error); @@ -117,9 +118,9 @@ export async function add_resources_with_metadata_to_buckets(bucket_resources: B } /** - * - * @param url - * @param communication + * Creates a new LDP container. + * @param {string} url - The URL of the container to be created. + * @param {Communication} communication - The communication object to communicate to the LDP. */ export async function create_ldp_container(url: string, communication: Communication) { if (url.endsWith('/')) { @@ -135,9 +136,10 @@ export async function create_ldp_container(url: string, communication: Communica /** - * - * @param ldes_in_ldp - * @param bucket_url + * Checks if the container already exists in the LDP. + * @param {LDESinLDP} ldes_in_ldp - The LDES in LDP object. + * @param {string} bucket_url - The URL of the bucket to be checked. + * @returns {Promise} - Returns true if the container exists, otherwise false. */ export async function check_if_container_exists(ldes_in_ldp: LDESinLDP, bucket_url: string) { const metadata = await ldes_in_ldp.readMetadata(); @@ -154,17 +156,16 @@ export async function check_if_container_exists(ldes_in_ldp: LDESinLDP, bucket_u } /** - * - * @param bucketResources - * @param metadata - * @param ldpComm + * Adds the resources to the LDP container/bucket. + * @param {BucketResources} bucketResources - The resources to be added to the LDES in seperate fragments (i.e. LDP containers) or buckets. + * @param {ILDESinLDPMetadata} metadata - The metadata of the LDES. + * @param {LDPCommunication} ldpComm - The LDP communication object. */ export async function addResourcesToBuckets(bucketResources: BucketResources, metadata: ILDESinLDPMetadata, ldpComm: LDPCommunication) { for (const containerURL of Object.keys(bucketResources)) { for (const resource of bucketResources[containerURL]) { const response = await ldpComm.post(containerURL, storeToString(new Store(resource))); console.log(`Resource stored at: ${response.headers.get('location')} | status: ${response.status}`) - // TODO: handle when status is not 201 (Http Created) } } } diff --git a/src/utils/ldes-in-ldp/Util.ts b/src/utils/ldes-in-ldp/Util.ts index e5802f3..7eef3f2 100644 --- a/src/utils/ldes-in-ldp/Util.ts +++ b/src/utils/ldes-in-ldp/Util.ts @@ -1,13 +1,12 @@ -// TODO: util has to be moved to LdesUtil of the package VersionAwareLIL -import {Communication, LDES, LDESMetadata, LDP, RDF, storeToString, TREE, XSD} from "@treecg/versionawareldesinldp"; +import {Communication, LDES, LDESMetadata, LDP, RDF, TREE, XSD} from "@treecg/versionawareldesinldp"; import {DataFactory, Store} from "n3"; import {Logger} from "@treecg/versionawareldesinldp/dist/logging/Logger"; const {quad, namedNode, literal} = DataFactory /** * Convert the ldes metadata object back to an N3 Store. - * @param metadata - * @returns {Store} + * @param {LDESMetadata} metadata - The metadata of the LDES. + * @returns {Store} - Returns the metadata as an N3 Store. */ export function convertLdesMetadata(metadata: LDESMetadata): Store { const metadataStore = new Store() @@ -38,10 +37,10 @@ export function convertLdesMetadata(metadata: LDESMetadata): Store { } /** - * - * @param resourceIdentifier - * @param communication - * @param body + * Editing the metadata of the LDES. + * @param {string} resourceIdentifier - The identifier of the resource. + * @param {Communication} communication - The communication object to communicate to the LDP. + * @param {string} body - The body (in string) of the metadata to be inserted. */ export async function editMetadata(resourceIdentifier: string, communication: Communication, body: string): Promise { const logger = new Logger(editMetadata.name) diff --git a/src/utils/query-registry/Mutex.test.ts b/src/utils/query-registry/Mutex.test.ts new file mode 100644 index 0000000..22a5261 --- /dev/null +++ b/src/utils/query-registry/Mutex.test.ts @@ -0,0 +1,37 @@ +import { Mutex } from "./Mutex"; + +describe("mutex_class", () => { + + let mutex: Mutex; + + beforeEach(() => { + mutex = new Mutex(); + }); + + it("initializing the Mutex", () => { + expect(mutex).toBeInstanceOf(Mutex); + }); + + it('acquire_and_release_mutex', async () => { + await mutex.acquire(); + expect(mutex.isLocked).toBe(true); + mutex.release(); + expect(mutex.isLocked).toBe(false); + }); + + it('acquire_mutex_twice', async () => { + await mutex.acquire(); + expect(mutex.isLocked).toBe(true); + mutex.release(); + expect(mutex.isLocked).toBe(false); + await mutex.acquire(); + expect(mutex.isLocked).toBe(true); + mutex.release(); + expect(mutex.isLocked).toBe(false); + }); + + it('should_release_if_no_one_else_in_queue', async () => { + mutex.release(); + expect(mutex.isLocked).toBe(false); + }); +}); \ No newline at end of file diff --git a/src/utils/query-registry/Mutex.ts b/src/utils/query-registry/Mutex.ts index ee2aafe..8cbf7e6 100644 --- a/src/utils/query-registry/Mutex.ts +++ b/src/utils/query-registry/Mutex.ts @@ -1,8 +1,17 @@ +/** + * A simple mutex implementation. + * @class Mutex + */ export class Mutex { - private isLocked: boolean = false; + public isLocked: boolean = false; private queue: Array<() => void> = []; - // Acquire the mutex + + /** + * Acquire the mutex. + * @returns {*} - {Promise}. + * @memberof Mutex + */ async acquire(): Promise { return new Promise((resolve) => { const acquireLock = () => { @@ -17,7 +26,10 @@ export class Mutex { }); } - // Release the mutex + /** + * Release the mutex. + * @memberof Mutex + */ release() { if (this.isLocked) { this.isLocked = false; diff --git a/src/utils/query-registry/Util.test.ts b/src/utils/query-registry/Util.test.ts new file mode 100644 index 0000000..4b235b9 --- /dev/null +++ b/src/utils/query-registry/Util.test.ts @@ -0,0 +1,71 @@ +import { WriteLockArray } from "./Util"; + +describe("WriteLockArray", () => { + let write_lock_array: WriteLockArray; + + beforeEach(() => { + write_lock_array = new WriteLockArray(); + }); + + it("should_add_item_to_array", async () => { + await write_lock_array.addItem(43); + expect(write_lock_array.get_length()).toBe(1); + expect(write_lock_array.get_item(0)).toBe(43); + expect(write_lock_array.getArrayCopy()).toEqual([43]); + }); + + it('should_remove_item_from_array', async () => { + await write_lock_array.addItem(43); + await write_lock_array.removeItem(43); + expect(write_lock_array.get_length()).toBe(0); + expect(write_lock_array.getArrayCopy()).toEqual([]); + }); + + it('should_get_array_copy', async () => { + await write_lock_array.addItem(43); + await write_lock_array.addItem(44); + await write_lock_array.addItem(45); + const array_copy = write_lock_array.getArrayCopy(); + expect(array_copy).toEqual([43, 44, 45]); + // making sure the array copy is not a reference to the original array + array_copy.push(46); + expect(write_lock_array.get_length()).toBe(3); + }); + + it('should_get_item', async () => { + await write_lock_array.addItem(43); + await write_lock_array.addItem(44); + await write_lock_array.addItem(45); + expect(write_lock_array.get_item(1)).toBe(44); + }); + + + it('should_get_length', async () => { + await write_lock_array.addItem(43); + await write_lock_array.addItem(44); + await write_lock_array.addItem(45); + const length = write_lock_array.get_length(); + expect(length).toBe(3); + }); + + it('should_handle_concurrent_add_and_remove', async () => { + const promise_one = write_lock_array.addItem(43); + const promise_two = write_lock_array.removeItem(43); + await Promise.all([promise_one, promise_two]); + expect(write_lock_array.get_length()).toBe(0); + }); + + it('should_allow_simultaneous_read_and_write', async () => { + const read_promise = new Promise((resolve) => { + let array_copy = write_lock_array.getArrayCopy(); + expect(array_copy).toEqual([]); + write_lock_array.addItem(43); + array_copy = write_lock_array.getArrayCopy(); + expect(array_copy).toEqual([43]); + resolve(); + }); + + const write_promise = write_lock_array.addItem(44); + await Promise.all([read_promise, write_promise]); + }); +}); \ No newline at end of file diff --git a/src/utils/query-registry/Util.ts b/src/utils/query-registry/Util.ts index 77fa722..8665273 100644 --- a/src/utils/query-registry/Util.ts +++ b/src/utils/query-registry/Util.ts @@ -1,22 +1,42 @@ import { Mutex } from "./Mutex"; +/** + * Represents an array that supports write locking for concurrent access. + * @template T The type of items stored in the array. + */ export class WriteLockArray { private array: T[]; private writeMutex: Mutex; + /** + * Creates an instance of WriteLockArray. + * Assigns an empty array to the array property and + * creates a new Mutex instance for the write lock. + * @memberof WriteLockArray + */ constructor() { this.array = []; this.writeMutex = new Mutex(); } - // Add an item to the array while holding the write lock + /** + * Adds an item to the array while holding the write lock. + * @param {T} item - The item to be added. + * @returns {*} {Promise} - Void promise when the item is added. + * @memberof WriteLockArray + */ async addItem(item: T): Promise { await this.writeMutex.acquire(); this.array.push(item); this.writeMutex.release(); } - // Remove an item from the array while holding the write lock + /** + * Removes an item from the array while holding the write lock. + * @param {T} item - The item to be removed. + * @returns {*} {Promise} - Void promise when the item is removed. + * @memberof WriteLockArray + */ async removeItem(item: T): Promise { await this.writeMutex.acquire(); const index = this.array.indexOf(item); @@ -26,16 +46,41 @@ export class WriteLockArray { this.writeMutex.release(); } - // Get a copy of the array for reading + /** + * Returns a copy of the array. + * @returns {*} {T[]} - A copy of the array. + * @memberof WriteLockArray + */ getArrayCopy(): T[] { return [...this.array]; } + + /** + * Returns the item at the specified index. + * @param {number} index - The index of the item to be returned. + * @returns {*} - The item at the specified index. + * @memberof WriteLockArray + */ get_item(index: number): T { return this.array[index]; } + /** + * Returns the length of the array. + * @returns {*} - The length of the array. + * @memberof WriteLockArray + */ get_length(): number { return this.array.length; } + + /** + * Deletes all items from the array. + * @memberof WriteLockArray + * @returns {void} - Deletes all items from the array. + */ + delete_all_items() { + this.array = []; + } } \ No newline at end of file diff --git a/src/utils/test.ts b/src/utils/test.ts deleted file mode 100644 index c33529f..0000000 --- a/src/utils/test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import {LDESinLDP, LDPCommunication, SolidCommunication, filterRelation, ILDESinLDPMetadata, MetadataParser, extractDateFromLiteral} from "@treecg/versionawareldesinldp"; -import {RateLimitedLDPCommunication} from "rate-limited-ldp-communication"; -import { readMembersRateLimited } from "./ldes-in-ldp/EventSource"; -const N3 = require('n3'); - -/** - * - */ -async function main() { - const ldes_location = 'http://n061-14a.wall2.ilabt.iminds.be:3000/participant6/bvp/'; - let counter = 0; - const ldes = new LDESinLDP(ldes_location, new LDPCommunication()); - const until = new Date(1700038653238); - const from = new Date(until.getTime()); - const start = performance.now(); - const stream = await readMembersRateLimited({ - from: from, - to: until, - ldes: ldes, - communication: new LDPCommunication(), - rate: 100, - interval: 1000 - }) - stream.on("data", (data: any) => { - const stream_store = new N3.Store(data.quads); - const store = stream_store.getQuads(null, null, null, null); - for (const quad of store) { - counter++; - } - }); - - stream.on("end", () => { - const end = performance.now(); - console.log(`The number of observations is `, counter / 6); - console.log(`The query took ${end - start} milliseconds.`); - }); -} - -main(); diff --git a/tests/unit/server/GETHandler.test.ts b/tests/unit/server/GETHandler.test.ts deleted file mode 100644 index 82119b6..0000000 --- a/tests/unit/server/GETHandler.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { GETHandler } from '../../../src/server/GETHandler'; -import { QueryRegistry } from '../../../src/service/query-registry/QueryRegistry'; -import { EndpointQueries } from '../../../src/server/EndpointQueries'; -import { IncomingMessage, ServerResponse } from 'http'; -import fs from 'fs'; - -jest.mock('fs'); - -describe('GETHandler', () => { - let req: IncomingMessage; - let res: ServerResponse; - let solid_server_url: string; - let query_registry: QueryRegistry; - let endpoint_queries: EndpointQueries; - let latest_minutes: number; - let logger: any; - - beforeEach(() => { - req = {} as IncomingMessage; - res = {} as ServerResponse; - solid_server_url = 'mockSolidServerUrl'; - query_registry = {} as QueryRegistry; - endpoint_queries = {} as EndpointQueries; - latest_minutes = 5; - logger = jest.fn(); - }); - - it('handles request with valid URL', async () => { - req.url = '/example'; - await GETHandler.handle(req, res, solid_server_url, query_registry, endpoint_queries, latest_minutes, logger); - // Add your assertions for the valid URL case - }); - - it('handles request with undefined URL', async () => { - req.url = undefined; - const readFileSyncMock = jest.spyOn(fs, 'readFileSync').mockReturnValue('mockedFileContent'); - await GETHandler.handle(req, res, solid_server_url, query_registry, endpoint_queries, latest_minutes, logger); - expect(readFileSyncMock).toHaveBeenCalledWith('dist/static/index.html'); - // Add your assertions for the undefined URL case - }); -}); diff --git a/tests/unit/server/HTTPServer.test.ts b/tests/unit/server/HTTPServer.test.ts deleted file mode 100644 index 91c3bbf..0000000 --- a/tests/unit/server/HTTPServer.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { HTTPServer } from '../../../src/server/HTTPServer'; -import * as http from 'http'; -import * as websocket from 'websocket'; - -const mock_logger = { - info: jest.fn(), - error: jest.fn() -} - -// starting a mock http server for testing. -const mock_http_server = http.createServer((req, res) => { }); -const mock_websocket_server = new websocket.server({ - httpServer: mock_http_server -}); - - -jest.mock('./WebSocketHandler', () => { - return jest.fn().mockImplementation(() => { - return { - handle_wss: jest.fn(), - aggregation_event_publisher: jest.fn() - }; - }); -}); - -describe('HTTPServer', () => { - let server; - const mock_port = 8085; - const mock_solid_server_url = 'http://localhost:3000/'; - - beforeAll(() => { - server = new HTTPServer(mock_port, mock_solid_server_url, mock_logger); - server['http_server'] = mock_http_server; - server['websocket_server'] = mock_websocket_server; - }) - - afterAll(() => { - // close the server after all the tests are done. - server['http_server'].close(); - }) - - it('should_handle_GET_request', () => { - const mock_request = { - method: 'GET', - url: 'http://example.com' - } as http.IncomingMessage; - - const mock_response = { - - } as http.ServerResponse; - - // const mock_response = { - // setHeader: jest.fn(), - // end: jest.fn() - // } as http.ServerResponse; - - const typed_mock_res = mock_response as http.ServerResponse; - - // expect(mock_logger.info).toHaveBeenCalled({}, 'http_server_started'); - }) -}); \ No newline at end of file diff --git a/tests/unit/service/query-registry/QueryRegistry.test.ts b/tests/unit/service/query-registry/QueryRegistry.test.ts deleted file mode 100644 index eb6b614..0000000 --- a/tests/unit/service/query-registry/QueryRegistry.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import {QueryRegistry} from "../../../../src/service/query-registry/QueryRegistry"; - -describe("query_registry_test", () => { - it('adding_a_query_to_the_registry', () => { - - }); -}); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 8b57920..256d583 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,5 +15,6 @@ ] }, - "include": ["./src"] + "include": ["./src"], + "types": ["node"] }