diff --git a/PKG-INFO b/PKG-INFO index 833d02cd..c07afd18 100644 --- a/PKG-INFO +++ b/PKG-INFO @@ -1,111 +1,111 @@ Metadata-Version: 2.1 Name: swh.web -Version: 0.0.196 +Version: 0.0.198 Summary: Software Heritage Web UI Home-page: https://forge.softwareheritage.org/diffusion/DWUI/ Author: Software Heritage developers Author-email: swh-devel@inria.fr License: UNKNOWN +Project-URL: Funding, https://www.softwareheritage.org/donate Project-URL: Source, https://forge.softwareheritage.org/source/swh-web Project-URL: Bug Reports, https://forge.softwareheritage.org/maniphest -Project-URL: Funding, https://www.softwareheritage.org/donate Description: # swh-web This repository holds the development of Software Heritage web applications: * swh-web API (https://archive.softwareheritage.org/api): enables to query the content of the archive through HTTP requests and get responses in JSON or YAML. * swh-web browse (https://archive.softwareheritage.org/browse): graphical interface that eases the navigation in the archive. Documentation about how to use these components but also the details of their URI schemes can be found in the docs folder. The produced HTML documentation can be read and browsed at https://docs.softwareheritage.org/devel/swh-web/index.html. ## Technical details Those applications are powered by: * [Django Web Framework](https://www.djangoproject.com/) on the backend side with the following extensions enabled: * [django-rest-framework](http://www.django-rest-framework.org/) * [django-webpack-loader](https://github.com/owais/django-webpack-loader) * [django-js-reverse](http://django-js-reverse.readthedocs.io/en/latest/) * [webpack](https://webpack.js.org/) on the frontend side for better static assets management, including: * assets dependencies management and retrieval through [yarn](https://yarnpkg.com/en/) * linting of custom javascript code (through [eslint](https://eslint.org/)) and stylesheets (through [stylelint](https://stylelint.io/)) * use of [es6](http://es6-features.org) syntax and advanced javascript feature like [async/await](https://javascript.info/async-await) or [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) thanks to [babel](https://babeljs.io/) (es6 to es5 transpiler and polyfills provider) * assets minification (using [UglifyJS](https://github.com/mishoo/UglifyJS2) and [cssnano](http://cssnano.co/)) but also dead code elimination for production use ## How to build and run ### Requirements First you will need [Python 3](https://www.python.org) and a complete [swh development environment](https://forge.softwareheritage.org/source/swh-environment/) installed. To run the backend, you need to have the following Python 3 modules installed: * beautifulsoup4 * django >= 1.10.7 * djangorestframework >= 3.4.0 * django_webpack_loader * django_js_reverse * docutils * file_magic >= 0.3.0 * htmlmin * lxml * pygments * pypandoc * python-dateutil * pyyaml * requests To compile the frontend assets, you need to have [nodejs](https://nodejs.org/en/) >= 8.x and [yarn](https://yarnpkg.com/en/) installed. If you are on Debian stretch, you can easily install an up to date nodejs from the stretch-backports repository while packages for yarn can be installed by following [these instructions](https://yarnpkg.com/en/docs/install#debian-stable). Alternatively, you can install yarn with `npm install yarn`, and add `YARN=node_modules/yarn/bin/yarn` as argument whenever you run `make`. Please note that the static assets bundles generated by webpack are not stored in the git repository. Follow the instructions below in order to generate them in order to be able to run the frontend part of the web applications. ### Make targets Below is the list of available make targets that can be executed from the root directory of swh-web in order to build and/or execute the web applications under various configurations: * **run-django-webpack-devserver**: Compile and serve not optimized (without mignification and dead code elimination) frontend static assets using [webpack-dev-server](https://github.com/webpack/webpack-dev-server) and run django server with development settings. This is the recommended target to use when developing swh-web as it enables automatic reloading of backend and frontend part of the applications when modifying source files (*.py, *.js, *.css, *.html). * **run-django-webpack-dev**: Compile not optimized (no minification, no dead code elimination) frontend static assets using webpack and run django server with development settings. This is the recommended target when one only wants to develop the backend side of the application. * **run-django-webpack-prod**: Compile optimized (with minification and dead code elimination) frontend static assets using webpack and run django server with production settings. This is useful to test the applications in production mode (with the difference that static assets are served by django). Production settings notably enable advanced django caching and you will need to have [memcached](https://memcached.org/) installed for that feature to work. * **run-django-server-dev**: Run the django server with development settings but without compiling frontend static assets through webpack. * **run-django-server-prod**: Run the django server with production settings but without compiling frontend static assets through webpack. * **run-gunicorn-server**: Run the web applications with production settings in a [gunicorn](http://gunicorn.org/) worker as they will be in real production environment. Once one of these targets executed, the web applications can be executed by pointing your browser to http://localhost:5004. ### Yarn targets Below is a list of available yarn targets in order to only execute the frontend static assets compilation (no web server will be executed): * **build-dev**: compile not optimized (without mignification and dead code elimination) frontend static assets and store the results in the `swh/web/static` folder. * **build**: compile optimized (with mignification and dead code elimination) frontend static assets and store the results in the `swh/web/static` folder. **The build target must be executed prior performing the Debian packaging of swh-web** in order for the package to contain the optimized assets dedicated to production environment. To execute these targets, issue the following commmand: ``` $ yarn ``` Platform: UNKNOWN Classifier: Programming Language :: Python :: 3 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+) Classifier: Operating System :: OS Independent Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: Django Description-Content-Type: text/markdown Provides-Extra: testing diff --git a/package.json b/package.json index e12b586d..391cd92b 100644 --- a/package.json +++ b/package.json @@ -1,107 +1,107 @@ { "name": "swh-web", - "version": "0.0.196", + "version": "0.0.198", "description": "Static assets management for swh-web", "scripts": { "build-dev": "NODE_ENV=development webpack --config ./swh/web/assets/config/webpack.config.development.js --display-modules --progress --colors", "start-dev": "NODE_ENV=development nodemon --watch swh/web/api --watch swh/web/browse --watch swh/web/templates --watch swh/web/common --watch swh/web/settings --watch swh/web/assets/config --ext py,html,js --exec \"webpack-dev-server --config ./swh/web/assets/config/webpack.config.development.js --progress --colors\"", "build": "NODE_ENV=production webpack --config ./swh/web/assets/config/webpack.config.production.js --display-modules --progress --colors" }, "repository": { "type": "git", "url": "https://forge.softwareheritage.org/source/swh-web" }, "author": "The Software Heritage developers", "license": "AGPL-3.0-or-later", "dependencies": { "admin-lte": "^3.0.0-alpha", "ansi_up": "^4.0.3", "bootstrap": "^4.3.1", "bootstrap-year-calendar-bs4": "^1.0.0", "clipboard": "^2.0.4", "d3": "^5.9.2", "datatables.net-bs4": "^1.10.19", "dompurify": "^1.0.10", "elementsfrompoint-polyfill": "^1.0.0", "font-awesome": "^4.7.0", "highlight.js": "^9.15.6", "highlightjs-line-numbers.js": "^2.7.0", "iframe-resizer": "^4.1.1", "jquery": "^3.4.1", "js-cookie": "^2.2.0", "notebookjs": "^0.4.2", "object-fit-images": "^3.2.4", "octicons": "^8.5.0", "open-iconic": "^1.1.1", "org": "^0.2.0", "pdfjs-dist": "^2.0.943", "popper.js": "^1.15.0", "showdown": "^1.9.0", "typeface-alegreya": "0.0.69", "typeface-alegreya-sans": "^0.0.72", "url-search-params-polyfill": "^6.0.0", "validate.js": "^0.12.0", "waypoints": "^4.0.1", "whatwg-fetch": "^3.0.0" }, "devDependencies": { "@babel/core": "^7.4.4", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-transform-runtime": "^7.4.4", "@babel/polyfill": "^7.4.4", "@babel/preset-env": "^7.4.4", "@babel/runtime-corejs2": "^7.4.4", "autoprefixer": "^9.5.1", "babel-eslint": "^10.0.1", "babel-loader": "^8.0.6", "bootstrap-loader": "^3.0.4", "cache-loader": "^3.0.1", "clean-webpack-plugin": "^2.0.2", "copy-webpack-plugin": "^5.0.3", "css-loader": "^2.1.1", "ejs": "^2.6.1", "eslint": "^5.15.3", "eslint-loader": "^2.1.2", "eslint-plugin-import": "^2.17.2", "eslint-plugin-node": "^9.0.1", "eslint-plugin-promise": "^4.1.1", "eslint-plugin-standard": "^4.0.0", "exports-loader": "^0.7.0", "expose-loader": "^0.7.5", "file-loader": "^3.0.1", "imports-loader": "^0.8.0", "less": "^3.9.0", "less-loader": "^5.0.0", "mini-css-extract-plugin": "^0.6.0", "node-sass": "^4.12.0", "nodemon": "^1.19.0", "optimize-css-assets-webpack-plugin": "^5.0.1", "postcss-loader": "^3.0.0", "postcss-normalize": "^7.0.1", "resolve-url-loader": "^3.1.0", "robotstxt-webpack-plugin": "^5.0.0", "sass-loader": "^7.1.0", "schema-utils": "^1.0.0", "script-loader": "^0.7.2", "spdx-expression-parse": "^3.0.0", "style-loader": "^0.23.1", "stylelint": "^10.0.1", "stylelint-config-standard": "^18.3.0", "terser-webpack-plugin": "^1.2.4", "url-loader": "^1.1.2", "webpack": "^4.31.0", "webpack-bundle-tracker": "^0.4.2-beta", "webpack-cli": "^3.3.2", "webpack-dev-server": "^3.3.1" }, "browserslist": [ "cover 99.5%", "not dead" ], "postcss": { "plugins": { "autoprefixer": {}, "postcss-normalize": {} } } } diff --git a/requirements-swh.txt b/requirements-swh.txt index 9ae089a5..cb1123fd 100644 --- a/requirements-swh.txt +++ b/requirements-swh.txt @@ -1,6 +1,5 @@ -swh.core >= 0.0.57 swh.model >= 0.0.32 swh.storage >= 0.0.140 swh.vault >= 0.0.23 swh.indexer >= 0.0.120 swh.scheduler >= 0.0.31 diff --git a/requirements-test.txt b/requirements-test.txt index 9d5625bd..04a85a6c 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,4 +1,5 @@ pytest pytest-django hypothesis +swh.core[http] >= 0.0.61 swh.loader.git >= 0.0.47 diff --git a/swh.web.egg-info/PKG-INFO b/swh.web.egg-info/PKG-INFO index 833d02cd..c07afd18 100644 --- a/swh.web.egg-info/PKG-INFO +++ b/swh.web.egg-info/PKG-INFO @@ -1,111 +1,111 @@ Metadata-Version: 2.1 Name: swh.web -Version: 0.0.196 +Version: 0.0.198 Summary: Software Heritage Web UI Home-page: https://forge.softwareheritage.org/diffusion/DWUI/ Author: Software Heritage developers Author-email: swh-devel@inria.fr License: UNKNOWN +Project-URL: Funding, https://www.softwareheritage.org/donate Project-URL: Source, https://forge.softwareheritage.org/source/swh-web Project-URL: Bug Reports, https://forge.softwareheritage.org/maniphest -Project-URL: Funding, https://www.softwareheritage.org/donate Description: # swh-web This repository holds the development of Software Heritage web applications: * swh-web API (https://archive.softwareheritage.org/api): enables to query the content of the archive through HTTP requests and get responses in JSON or YAML. * swh-web browse (https://archive.softwareheritage.org/browse): graphical interface that eases the navigation in the archive. Documentation about how to use these components but also the details of their URI schemes can be found in the docs folder. The produced HTML documentation can be read and browsed at https://docs.softwareheritage.org/devel/swh-web/index.html. ## Technical details Those applications are powered by: * [Django Web Framework](https://www.djangoproject.com/) on the backend side with the following extensions enabled: * [django-rest-framework](http://www.django-rest-framework.org/) * [django-webpack-loader](https://github.com/owais/django-webpack-loader) * [django-js-reverse](http://django-js-reverse.readthedocs.io/en/latest/) * [webpack](https://webpack.js.org/) on the frontend side for better static assets management, including: * assets dependencies management and retrieval through [yarn](https://yarnpkg.com/en/) * linting of custom javascript code (through [eslint](https://eslint.org/)) and stylesheets (through [stylelint](https://stylelint.io/)) * use of [es6](http://es6-features.org) syntax and advanced javascript feature like [async/await](https://javascript.info/async-await) or [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) thanks to [babel](https://babeljs.io/) (es6 to es5 transpiler and polyfills provider) * assets minification (using [UglifyJS](https://github.com/mishoo/UglifyJS2) and [cssnano](http://cssnano.co/)) but also dead code elimination for production use ## How to build and run ### Requirements First you will need [Python 3](https://www.python.org) and a complete [swh development environment](https://forge.softwareheritage.org/source/swh-environment/) installed. To run the backend, you need to have the following Python 3 modules installed: * beautifulsoup4 * django >= 1.10.7 * djangorestframework >= 3.4.0 * django_webpack_loader * django_js_reverse * docutils * file_magic >= 0.3.0 * htmlmin * lxml * pygments * pypandoc * python-dateutil * pyyaml * requests To compile the frontend assets, you need to have [nodejs](https://nodejs.org/en/) >= 8.x and [yarn](https://yarnpkg.com/en/) installed. If you are on Debian stretch, you can easily install an up to date nodejs from the stretch-backports repository while packages for yarn can be installed by following [these instructions](https://yarnpkg.com/en/docs/install#debian-stable). Alternatively, you can install yarn with `npm install yarn`, and add `YARN=node_modules/yarn/bin/yarn` as argument whenever you run `make`. Please note that the static assets bundles generated by webpack are not stored in the git repository. Follow the instructions below in order to generate them in order to be able to run the frontend part of the web applications. ### Make targets Below is the list of available make targets that can be executed from the root directory of swh-web in order to build and/or execute the web applications under various configurations: * **run-django-webpack-devserver**: Compile and serve not optimized (without mignification and dead code elimination) frontend static assets using [webpack-dev-server](https://github.com/webpack/webpack-dev-server) and run django server with development settings. This is the recommended target to use when developing swh-web as it enables automatic reloading of backend and frontend part of the applications when modifying source files (*.py, *.js, *.css, *.html). * **run-django-webpack-dev**: Compile not optimized (no minification, no dead code elimination) frontend static assets using webpack and run django server with development settings. This is the recommended target when one only wants to develop the backend side of the application. * **run-django-webpack-prod**: Compile optimized (with minification and dead code elimination) frontend static assets using webpack and run django server with production settings. This is useful to test the applications in production mode (with the difference that static assets are served by django). Production settings notably enable advanced django caching and you will need to have [memcached](https://memcached.org/) installed for that feature to work. * **run-django-server-dev**: Run the django server with development settings but without compiling frontend static assets through webpack. * **run-django-server-prod**: Run the django server with production settings but without compiling frontend static assets through webpack. * **run-gunicorn-server**: Run the web applications with production settings in a [gunicorn](http://gunicorn.org/) worker as they will be in real production environment. Once one of these targets executed, the web applications can be executed by pointing your browser to http://localhost:5004. ### Yarn targets Below is a list of available yarn targets in order to only execute the frontend static assets compilation (no web server will be executed): * **build-dev**: compile not optimized (without mignification and dead code elimination) frontend static assets and store the results in the `swh/web/static` folder. * **build**: compile optimized (with mignification and dead code elimination) frontend static assets and store the results in the `swh/web/static` folder. **The build target must be executed prior performing the Debian packaging of swh-web** in order for the package to contain the optimized assets dedicated to production environment. To execute these targets, issue the following commmand: ``` $ yarn ``` Platform: UNKNOWN Classifier: Programming Language :: Python :: 3 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+) Classifier: Operating System :: OS Independent Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: Django Description-Content-Type: text/markdown Provides-Extra: testing diff --git a/swh.web.egg-info/SOURCES.txt b/swh.web.egg-info/SOURCES.txt index dabd8d57..ebb332cb 100644 --- a/swh.web.egg-info/SOURCES.txt +++ b/swh.web.egg-info/SOURCES.txt @@ -1,1588 +1,1588 @@ MANIFEST.in Makefile README.md package.json pytest.ini requirements-swh.txt requirements-test.txt requirements.txt setup.py tox.ini version.txt yarn.lock swh/__init__.py swh.web.egg-info/PKG-INFO swh.web.egg-info/SOURCES.txt swh.web.egg-info/dependency_links.txt swh.web.egg-info/requires.txt swh.web.egg-info/top_level.txt swh/web/__init__.py swh/web/config.py swh/web/doc_config.py swh/web/manage.py swh/web/urls.py swh/web/wsgi.py swh/web/admin/__init__.py swh/web/admin/adminurls.py swh/web/admin/deposit.py swh/web/admin/origin_save.py swh/web/admin/urls.py swh/web/api/__init__.py swh/web/api/apidoc.py swh/web/api/apiresponse.py swh/web/api/apiurls.py swh/web/api/renderers.py swh/web/api/urls.py swh/web/api/utils.py swh/web/api/views/__init__.py swh/web/api/views/content.py swh/web/api/views/directory.py swh/web/api/views/identifiers.py swh/web/api/views/origin.py swh/web/api/views/origin_save.py swh/web/api/views/person.py swh/web/api/views/release.py swh/web/api/views/revision.py swh/web/api/views/snapshot.py swh/web/api/views/stat.py swh/web/api/views/utils.py swh/web/api/views/vault.py swh/web/assets/config/.bootstraprc swh/web/assets/config/.eslintignore swh/web/assets/config/.eslintrc swh/web/assets/config/bootstrap-pre-customize.scss swh/web/assets/config/mathjax-js-files.js swh/web/assets/config/webpack.config.development.js swh/web/assets/config/webpack.config.production.js swh/web/assets/config/webpack-plugins/fix-swh-source-maps-webpack-plugin.js swh/web/assets/config/webpack-plugins/generate-weblabels-webpack-plugin/README.md swh/web/assets/config/webpack-plugins/generate-weblabels-webpack-plugin/index.js swh/web/assets/config/webpack-plugins/generate-weblabels-webpack-plugin/jslicenses.ejs swh/web/assets/config/webpack-plugins/generate-weblabels-webpack-plugin/plugin-options-schema.json swh/web/assets/config/webpack-plugins/generate-weblabels-webpack-plugin/spdx-licenses-mapping.js swh/web/assets/src/bundles/admin/deposit.js swh/web/assets/src/bundles/admin/index.js swh/web/assets/src/bundles/admin/origin-save.js swh/web/assets/src/bundles/browse/breadcrumbs.css swh/web/assets/src/bundles/browse/browse-utils.js swh/web/assets/src/bundles/browse/browse.css swh/web/assets/src/bundles/browse/content.css swh/web/assets/src/bundles/browse/index.js swh/web/assets/src/bundles/browse/origin-save.js swh/web/assets/src/bundles/browse/origin-search.js swh/web/assets/src/bundles/browse/snapshot-navigation.css swh/web/assets/src/bundles/browse/snapshot-navigation.js swh/web/assets/src/bundles/browse/swh-ids-utils.js swh/web/assets/src/bundles/origin/index.js swh/web/assets/src/bundles/origin/visits-calendar.js swh/web/assets/src/bundles/origin/visits-histogram.js swh/web/assets/src/bundles/origin/visits-reporting.css swh/web/assets/src/bundles/origin/visits-reporting.js swh/web/assets/src/bundles/revision/diff-utils.js swh/web/assets/src/bundles/revision/index.js swh/web/assets/src/bundles/revision/log-utils.js swh/web/assets/src/bundles/revision/revision.css swh/web/assets/src/bundles/vault/index.js swh/web/assets/src/bundles/vault/vault-create-tasks.js swh/web/assets/src/bundles/vault/vault-ui.js swh/web/assets/src/bundles/vault/vault.css swh/web/assets/src/bundles/vendors/datatables.css swh/web/assets/src/bundles/vendors/index.js swh/web/assets/src/bundles/vendors/octicons.css swh/web/assets/src/bundles/webapp/breadcrumbs.css swh/web/assets/src/bundles/webapp/code-highlighting.js swh/web/assets/src/bundles/webapp/index.js swh/web/assets/src/bundles/webapp/notebook-rendering.js swh/web/assets/src/bundles/webapp/notebook.css swh/web/assets/src/bundles/webapp/pdf-rendering.js swh/web/assets/src/bundles/webapp/readme-rendering.js swh/web/assets/src/bundles/webapp/webapp-utils.js swh/web/assets/src/bundles/webapp/webapp.css swh/web/assets/src/bundles/webapp/xss-filtering.js swh/web/assets/src/thirdparty/jquery.tabSlideOut/LICENSE swh/web/assets/src/thirdparty/jquery.tabSlideOut/jquery.tabSlideOut.css swh/web/assets/src/thirdparty/jquery.tabSlideOut/jquery.tabSlideOut.js swh/web/assets/src/utils/functions.js swh/web/assets/src/utils/heaps-permute.js swh/web/assets/src/utils/highlightjs.css swh/web/assets/src/utils/highlightjs.js swh/web/assets/src/utils/org.css swh/web/assets/src/utils/org.js swh/web/assets/src/utils/showdown.css swh/web/assets/src/utils/showdown.js swh/web/browse/__init__.py swh/web/browse/browseurls.py swh/web/browse/identifiers.py swh/web/browse/urls.py swh/web/browse/utils.py swh/web/browse/views/__init__.py swh/web/browse/views/content.py swh/web/browse/views/directory.py swh/web/browse/views/origin.py swh/web/browse/views/origin_save.py swh/web/browse/views/person.py swh/web/browse/views/release.py swh/web/browse/views/revision.py swh/web/browse/views/snapshot.py swh/web/browse/views/utils/__init__.py swh/web/browse/views/utils/snapshot_context.py swh/web/common/__init__.py swh/web/common/apps.py swh/web/common/converters.py swh/web/common/exc.py swh/web/common/highlightjs.py swh/web/common/middlewares.py swh/web/common/models.py swh/web/common/origin_save.py swh/web/common/origin_visits.py swh/web/common/query.py swh/web/common/service.py swh/web/common/swh_templatetags.py swh/web/common/throttling.py swh/web/common/urlsindex.py swh/web/common/utils.py swh/web/common/migrations/0001_initial.py swh/web/common/migrations/0002_saveoriginrequest_visit_date.py swh/web/common/migrations/0003_saveoriginrequest_loading_task_status.py swh/web/common/migrations/0004_auto_20190204_1324.py swh/web/common/migrations/__init__.py swh/web/misc/__init__.py swh/web/misc/coverage.py swh/web/settings/__init__.py swh/web/settings/common.py swh/web/settings/development.py swh/web/settings/production.py swh/web/settings/tests.py swh/web/static/robots.txt swh/web/static/webpack-stats.json swh/web/static/css/browse.f07d52177a412e075463.css swh/web/static/css/browse.f07d52177a412e075463.css.map swh/web/static/css/highlightjs.932df6c1a60ab424d6d3.css swh/web/static/css/highlightjs.932df6c1a60ab424d6d3.css.map swh/web/static/css/org.a7fdd4a10c36ca96c1f9.css swh/web/static/css/org.a7fdd4a10c36ca96c1f9.css.map swh/web/static/css/origin.2ff144091a4cfa3120f7.css swh/web/static/css/origin.2ff144091a4cfa3120f7.css.map swh/web/static/css/revision.a6be906a7ecabc9118e4.css swh/web/static/css/revision.a6be906a7ecabc9118e4.css.map swh/web/static/css/showdown.1379127bb1663f9405fb.css swh/web/static/css/showdown.1379127bb1663f9405fb.css.map swh/web/static/css/vault.d3301724e72732613d37.css swh/web/static/css/vault.d3301724e72732613d37.css.map swh/web/static/css/vendors.03855ba2d5707029b254.css swh/web/static/css/vendors.03855ba2d5707029b254.css.map -swh/web/static/css/webapp.705444d32d34e3bc5043.css -swh/web/static/css/webapp.705444d32d34e3bc5043.css.map +swh/web/static/css/webapp.b979e897536467ca4793.css +swh/web/static/css/webapp.b979e897536467ca4793.css.map swh/web/static/fonts/alegreya-latin-400.woff swh/web/static/fonts/alegreya-latin-400.woff2 swh/web/static/fonts/alegreya-latin-400italic.woff swh/web/static/fonts/alegreya-latin-400italic.woff2 swh/web/static/fonts/alegreya-latin-500.woff swh/web/static/fonts/alegreya-latin-500.woff2 swh/web/static/fonts/alegreya-latin-500italic.woff swh/web/static/fonts/alegreya-latin-500italic.woff2 swh/web/static/fonts/alegreya-latin-700.woff swh/web/static/fonts/alegreya-latin-700.woff2 swh/web/static/fonts/alegreya-latin-700italic.woff swh/web/static/fonts/alegreya-latin-700italic.woff2 swh/web/static/fonts/alegreya-latin-800.woff swh/web/static/fonts/alegreya-latin-800.woff2 swh/web/static/fonts/alegreya-latin-800italic.woff swh/web/static/fonts/alegreya-latin-800italic.woff2 swh/web/static/fonts/alegreya-latin-900.woff swh/web/static/fonts/alegreya-latin-900.woff2 swh/web/static/fonts/alegreya-latin-900italic.woff swh/web/static/fonts/alegreya-latin-900italic.woff2 swh/web/static/fonts/alegreya-sans-latin-100.woff swh/web/static/fonts/alegreya-sans-latin-100.woff2 swh/web/static/fonts/alegreya-sans-latin-100italic.woff swh/web/static/fonts/alegreya-sans-latin-100italic.woff2 swh/web/static/fonts/alegreya-sans-latin-300.woff swh/web/static/fonts/alegreya-sans-latin-300.woff2 swh/web/static/fonts/alegreya-sans-latin-300italic.woff swh/web/static/fonts/alegreya-sans-latin-300italic.woff2 swh/web/static/fonts/alegreya-sans-latin-400.woff swh/web/static/fonts/alegreya-sans-latin-400.woff2 swh/web/static/fonts/alegreya-sans-latin-400italic.woff swh/web/static/fonts/alegreya-sans-latin-400italic.woff2 swh/web/static/fonts/alegreya-sans-latin-500.woff swh/web/static/fonts/alegreya-sans-latin-500.woff2 swh/web/static/fonts/alegreya-sans-latin-500italic.woff swh/web/static/fonts/alegreya-sans-latin-500italic.woff2 swh/web/static/fonts/alegreya-sans-latin-700.woff swh/web/static/fonts/alegreya-sans-latin-700.woff2 swh/web/static/fonts/alegreya-sans-latin-700italic.woff swh/web/static/fonts/alegreya-sans-latin-700italic.woff2 swh/web/static/fonts/alegreya-sans-latin-800.woff swh/web/static/fonts/alegreya-sans-latin-800.woff2 swh/web/static/fonts/alegreya-sans-latin-800italic.woff swh/web/static/fonts/alegreya-sans-latin-800italic.woff2 swh/web/static/fonts/alegreya-sans-latin-900.woff swh/web/static/fonts/alegreya-sans-latin-900.woff2 swh/web/static/fonts/alegreya-sans-latin-900italic.woff swh/web/static/fonts/alegreya-sans-latin-900italic.woff2 swh/web/static/fonts/fontawesome-webfont.eot swh/web/static/fonts/fontawesome-webfont.svg swh/web/static/fonts/fontawesome-webfont.ttf swh/web/static/fonts/fontawesome-webfont.woff swh/web/static/fonts/fontawesome-webfont.woff2 swh/web/static/fonts/git-commit.svg swh/web/static/fonts/open-iconic.eot swh/web/static/fonts/open-iconic.otf swh/web/static/fonts/open-iconic.svg swh/web/static/fonts/open-iconic.ttf swh/web/static/fonts/open-iconic.woff swh/web/static/img/arrow-up-small.png swh/web/static/img/swh-api.png swh/web/static/img/swh-browse.png swh/web/static/img/swh-logo.png swh/web/static/img/swh-logo.svg swh/web/static/img/swh-spinner-small.gif swh/web/static/img/swh-spinner.gif swh/web/static/img/swh-vault.png swh/web/static/img/icons/swh-logo-32x32.png swh/web/static/img/icons/swh-logo-archive-180x180.png swh/web/static/img/icons/swh-logo-archive-192x192.png swh/web/static/img/icons/swh-logo-archive-270x270.png swh/web/static/img/logos/debian.png swh/web/static/img/logos/framagit.png swh/web/static/img/logos/github.png swh/web/static/img/logos/gitlab.svg swh/web/static/img/logos/gitorious.png swh/web/static/img/logos/gnu.png swh/web/static/img/logos/googlecode.png swh/web/static/img/logos/hal.png swh/web/static/img/logos/inria.jpg swh/web/static/img/logos/pypi.svg -swh/web/static/js/admin.728881fdb561789879dd.js -swh/web/static/js/admin.728881fdb561789879dd.js.map +swh/web/static/js/admin.e72f14c77b3a7af60340.js +swh/web/static/js/admin.e72f14c77b3a7af60340.js.map swh/web/static/js/browse.f07d52177a412e075463.js swh/web/static/js/browse.f07d52177a412e075463.js.map swh/web/static/js/highlightjs.932df6c1a60ab424d6d3.js swh/web/static/js/highlightjs.932df6c1a60ab424d6d3.js.map swh/web/static/js/org.a7fdd4a10c36ca96c1f9.js swh/web/static/js/org.a7fdd4a10c36ca96c1f9.js.map swh/web/static/js/origin.2ff144091a4cfa3120f7.js swh/web/static/js/origin.2ff144091a4cfa3120f7.js.map swh/web/static/js/pdf.worker.min.js swh/web/static/js/pdfjs.e75cc90e0e4f1077926f.js swh/web/static/js/pdfjs.e75cc90e0e4f1077926f.js.map swh/web/static/js/revision.a6be906a7ecabc9118e4.js swh/web/static/js/revision.a6be906a7ecabc9118e4.js.map swh/web/static/js/showdown.1379127bb1663f9405fb.js swh/web/static/js/showdown.1379127bb1663f9405fb.js.map swh/web/static/js/vault.d3301724e72732613d37.js swh/web/static/js/vault.d3301724e72732613d37.js.map swh/web/static/js/vendors.03855ba2d5707029b254.js swh/web/static/js/vendors.03855ba2d5707029b254.js.map -swh/web/static/js/webapp.705444d32d34e3bc5043.js -swh/web/static/js/webapp.705444d32d34e3bc5043.js.map +swh/web/static/js/webapp.b979e897536467ca4793.js +swh/web/static/js/webapp.b979e897536467ca4793.js.map swh/web/static/jssources/LICENSE.txt swh/web/static/jssources/jslicenses.json swh/web/static/jssources/@babel/polyfill/LICENSE.txt swh/web/static/jssources/@babel/polyfill/lib/index.js swh/web/static/jssources/@babel/polyfill/lib/noConflict.js swh/web/static/jssources/@babel/runtime-corejs2/LICENSE.txt swh/web/static/jssources/@babel/runtime-corejs2/core-js/get-iterator.js swh/web/static/jssources/@babel/runtime-corejs2/core-js/parse-int.js swh/web/static/jssources/@babel/runtime-corejs2/core-js/promise.js swh/web/static/jssources/@babel/runtime-corejs2/core-js/array/is-array.js swh/web/static/jssources/@babel/runtime-corejs2/core-js/json/stringify.js swh/web/static/jssources/@babel/runtime-corejs2/helpers/asyncToGenerator.js swh/web/static/jssources/@babel/runtime-corejs2/regenerator/index.js swh/web/static/jssources/admin-lte/LICENSE.txt swh/web/static/jssources/admin-lte/dist/js/adminlte.js swh/web/static/jssources/ansi_up/ansi_up.js swh/web/static/jssources/bootstrap/LICENSE.txt swh/web/static/jssources/bootstrap-year-calendar-bs4/LICENSE.txt swh/web/static/jssources/bootstrap-year-calendar-bs4/js/bootstrap-year-calendar.js swh/web/static/jssources/bootstrap/js/dist/alert.js swh/web/static/jssources/bootstrap/js/dist/button.js swh/web/static/jssources/bootstrap/js/dist/carousel.js swh/web/static/jssources/bootstrap/js/dist/collapse.js swh/web/static/jssources/bootstrap/js/dist/dropdown.js swh/web/static/jssources/bootstrap/js/dist/modal.js swh/web/static/jssources/bootstrap/js/dist/popover.js swh/web/static/jssources/bootstrap/js/dist/scrollspy.js swh/web/static/jssources/bootstrap/js/dist/tab.js swh/web/static/jssources/bootstrap/js/dist/tooltip.js swh/web/static/jssources/bootstrap/js/dist/util.js swh/web/static/jssources/clipboard/dist/clipboard.js swh/web/static/jssources/core-js/LICENSE.txt swh/web/static/jssources/core-js/es6/index.js swh/web/static/jssources/core-js/fn/array/flat-map.js swh/web/static/jssources/core-js/fn/array/includes.js swh/web/static/jssources/core-js/fn/object/entries.js swh/web/static/jssources/core-js/fn/object/get-own-property-descriptors.js swh/web/static/jssources/core-js/fn/object/values.js swh/web/static/jssources/core-js/fn/promise/finally.js swh/web/static/jssources/core-js/fn/string/pad-end.js swh/web/static/jssources/core-js/fn/string/pad-start.js swh/web/static/jssources/core-js/fn/string/trim-end.js swh/web/static/jssources/core-js/fn/string/trim-start.js swh/web/static/jssources/core-js/fn/symbol/async-iterator.js swh/web/static/jssources/core-js/library/fn/get-iterator.js swh/web/static/jssources/core-js/library/fn/global.js swh/web/static/jssources/core-js/library/fn/parse-int.js swh/web/static/jssources/core-js/library/fn/promise.js swh/web/static/jssources/core-js/library/fn/array/is-array.js swh/web/static/jssources/core-js/library/fn/json/stringify.js swh/web/static/jssources/core-js/library/modules/_a-function.js swh/web/static/jssources/core-js/library/modules/_add-to-unscopables.js swh/web/static/jssources/core-js/library/modules/_an-instance.js swh/web/static/jssources/core-js/library/modules/_an-object.js swh/web/static/jssources/core-js/library/modules/_array-includes.js swh/web/static/jssources/core-js/library/modules/_classof.js swh/web/static/jssources/core-js/library/modules/_cof.js swh/web/static/jssources/core-js/library/modules/_core.js swh/web/static/jssources/core-js/library/modules/_ctx.js swh/web/static/jssources/core-js/library/modules/_defined.js swh/web/static/jssources/core-js/library/modules/_descriptors.js swh/web/static/jssources/core-js/library/modules/_dom-create.js swh/web/static/jssources/core-js/library/modules/_enum-bug-keys.js swh/web/static/jssources/core-js/library/modules/_export.js swh/web/static/jssources/core-js/library/modules/_fails.js swh/web/static/jssources/core-js/library/modules/_for-of.js swh/web/static/jssources/core-js/library/modules/_global.js swh/web/static/jssources/core-js/library/modules/_has.js swh/web/static/jssources/core-js/library/modules/_hide.js swh/web/static/jssources/core-js/library/modules/_html.js swh/web/static/jssources/core-js/library/modules/_ie8-dom-define.js swh/web/static/jssources/core-js/library/modules/_invoke.js swh/web/static/jssources/core-js/library/modules/_iobject.js swh/web/static/jssources/core-js/library/modules/_is-array-iter.js swh/web/static/jssources/core-js/library/modules/_is-array.js swh/web/static/jssources/core-js/library/modules/_is-object.js swh/web/static/jssources/core-js/library/modules/_iter-call.js swh/web/static/jssources/core-js/library/modules/_iter-create.js swh/web/static/jssources/core-js/library/modules/_iter-define.js swh/web/static/jssources/core-js/library/modules/_iter-detect.js swh/web/static/jssources/core-js/library/modules/_iter-step.js swh/web/static/jssources/core-js/library/modules/_iterators.js swh/web/static/jssources/core-js/library/modules/_library.js swh/web/static/jssources/core-js/library/modules/_microtask.js swh/web/static/jssources/core-js/library/modules/_new-promise-capability.js swh/web/static/jssources/core-js/library/modules/_object-create.js swh/web/static/jssources/core-js/library/modules/_object-dp.js swh/web/static/jssources/core-js/library/modules/_object-dps.js swh/web/static/jssources/core-js/library/modules/_object-gpo.js swh/web/static/jssources/core-js/library/modules/_object-keys-internal.js swh/web/static/jssources/core-js/library/modules/_object-keys.js swh/web/static/jssources/core-js/library/modules/_parse-int.js swh/web/static/jssources/core-js/library/modules/_perform.js swh/web/static/jssources/core-js/library/modules/_promise-resolve.js swh/web/static/jssources/core-js/library/modules/_property-desc.js swh/web/static/jssources/core-js/library/modules/_redefine-all.js swh/web/static/jssources/core-js/library/modules/_redefine.js swh/web/static/jssources/core-js/library/modules/_set-species.js swh/web/static/jssources/core-js/library/modules/_set-to-string-tag.js swh/web/static/jssources/core-js/library/modules/_shared-key.js swh/web/static/jssources/core-js/library/modules/_shared.js swh/web/static/jssources/core-js/library/modules/_species-constructor.js swh/web/static/jssources/core-js/library/modules/_string-at.js swh/web/static/jssources/core-js/library/modules/_string-trim.js swh/web/static/jssources/core-js/library/modules/_string-ws.js swh/web/static/jssources/core-js/library/modules/_task.js swh/web/static/jssources/core-js/library/modules/_to-absolute-index.js swh/web/static/jssources/core-js/library/modules/_to-integer.js swh/web/static/jssources/core-js/library/modules/_to-iobject.js swh/web/static/jssources/core-js/library/modules/_to-length.js swh/web/static/jssources/core-js/library/modules/_to-object.js swh/web/static/jssources/core-js/library/modules/_to-primitive.js swh/web/static/jssources/core-js/library/modules/_uid.js swh/web/static/jssources/core-js/library/modules/_user-agent.js swh/web/static/jssources/core-js/library/modules/_wks.js swh/web/static/jssources/core-js/library/modules/core.get-iterator-method.js swh/web/static/jssources/core-js/library/modules/core.get-iterator.js swh/web/static/jssources/core-js/library/modules/es6.array.is-array.js swh/web/static/jssources/core-js/library/modules/es6.array.iterator.js swh/web/static/jssources/core-js/library/modules/es6.object.to-string.js swh/web/static/jssources/core-js/library/modules/es6.parse-int.js swh/web/static/jssources/core-js/library/modules/es6.promise.js swh/web/static/jssources/core-js/library/modules/es6.string.iterator.js swh/web/static/jssources/core-js/library/modules/es7.global.js swh/web/static/jssources/core-js/library/modules/es7.promise.finally.js swh/web/static/jssources/core-js/library/modules/es7.promise.try.js swh/web/static/jssources/core-js/library/modules/web.dom.iterable.js swh/web/static/jssources/core-js/modules/_a-function.js swh/web/static/jssources/core-js/modules/_a-number-value.js swh/web/static/jssources/core-js/modules/_add-to-unscopables.js swh/web/static/jssources/core-js/modules/_advance-string-index.js swh/web/static/jssources/core-js/modules/_an-instance.js swh/web/static/jssources/core-js/modules/_an-object.js swh/web/static/jssources/core-js/modules/_array-copy-within.js swh/web/static/jssources/core-js/modules/_array-fill.js swh/web/static/jssources/core-js/modules/_array-includes.js swh/web/static/jssources/core-js/modules/_array-methods.js swh/web/static/jssources/core-js/modules/_array-reduce.js swh/web/static/jssources/core-js/modules/_array-species-constructor.js swh/web/static/jssources/core-js/modules/_array-species-create.js swh/web/static/jssources/core-js/modules/_bind.js swh/web/static/jssources/core-js/modules/_classof.js swh/web/static/jssources/core-js/modules/_cof.js swh/web/static/jssources/core-js/modules/_collection-strong.js swh/web/static/jssources/core-js/modules/_collection-weak.js swh/web/static/jssources/core-js/modules/_collection.js swh/web/static/jssources/core-js/modules/_core.js swh/web/static/jssources/core-js/modules/_create-property.js swh/web/static/jssources/core-js/modules/_ctx.js swh/web/static/jssources/core-js/modules/_date-to-iso-string.js swh/web/static/jssources/core-js/modules/_date-to-primitive.js swh/web/static/jssources/core-js/modules/_defined.js swh/web/static/jssources/core-js/modules/_descriptors.js swh/web/static/jssources/core-js/modules/_dom-create.js swh/web/static/jssources/core-js/modules/_enum-bug-keys.js swh/web/static/jssources/core-js/modules/_enum-keys.js swh/web/static/jssources/core-js/modules/_export.js swh/web/static/jssources/core-js/modules/_fails-is-regexp.js swh/web/static/jssources/core-js/modules/_fails.js swh/web/static/jssources/core-js/modules/_fix-re-wks.js swh/web/static/jssources/core-js/modules/_flags.js swh/web/static/jssources/core-js/modules/_flatten-into-array.js swh/web/static/jssources/core-js/modules/_for-of.js swh/web/static/jssources/core-js/modules/_function-to-string.js swh/web/static/jssources/core-js/modules/_global.js swh/web/static/jssources/core-js/modules/_has.js swh/web/static/jssources/core-js/modules/_hide.js swh/web/static/jssources/core-js/modules/_html.js swh/web/static/jssources/core-js/modules/_ie8-dom-define.js swh/web/static/jssources/core-js/modules/_inherit-if-required.js swh/web/static/jssources/core-js/modules/_invoke.js swh/web/static/jssources/core-js/modules/_iobject.js swh/web/static/jssources/core-js/modules/_is-array-iter.js swh/web/static/jssources/core-js/modules/_is-array.js swh/web/static/jssources/core-js/modules/_is-integer.js swh/web/static/jssources/core-js/modules/_is-object.js swh/web/static/jssources/core-js/modules/_is-regexp.js swh/web/static/jssources/core-js/modules/_iter-call.js swh/web/static/jssources/core-js/modules/_iter-create.js swh/web/static/jssources/core-js/modules/_iter-define.js swh/web/static/jssources/core-js/modules/_iter-detect.js swh/web/static/jssources/core-js/modules/_iter-step.js swh/web/static/jssources/core-js/modules/_iterators.js swh/web/static/jssources/core-js/modules/_library.js swh/web/static/jssources/core-js/modules/_math-expm1.js swh/web/static/jssources/core-js/modules/_math-fround.js swh/web/static/jssources/core-js/modules/_math-log1p.js swh/web/static/jssources/core-js/modules/_math-sign.js swh/web/static/jssources/core-js/modules/_meta.js swh/web/static/jssources/core-js/modules/_microtask.js swh/web/static/jssources/core-js/modules/_new-promise-capability.js swh/web/static/jssources/core-js/modules/_object-assign.js swh/web/static/jssources/core-js/modules/_object-create.js swh/web/static/jssources/core-js/modules/_object-dp.js swh/web/static/jssources/core-js/modules/_object-dps.js swh/web/static/jssources/core-js/modules/_object-gopd.js swh/web/static/jssources/core-js/modules/_object-gopn-ext.js swh/web/static/jssources/core-js/modules/_object-gopn.js swh/web/static/jssources/core-js/modules/_object-gops.js swh/web/static/jssources/core-js/modules/_object-gpo.js swh/web/static/jssources/core-js/modules/_object-keys-internal.js swh/web/static/jssources/core-js/modules/_object-keys.js swh/web/static/jssources/core-js/modules/_object-pie.js swh/web/static/jssources/core-js/modules/_object-sap.js swh/web/static/jssources/core-js/modules/_object-to-array.js swh/web/static/jssources/core-js/modules/_own-keys.js swh/web/static/jssources/core-js/modules/_parse-float.js swh/web/static/jssources/core-js/modules/_parse-int.js swh/web/static/jssources/core-js/modules/_perform.js swh/web/static/jssources/core-js/modules/_promise-resolve.js swh/web/static/jssources/core-js/modules/_property-desc.js swh/web/static/jssources/core-js/modules/_redefine-all.js swh/web/static/jssources/core-js/modules/_redefine.js swh/web/static/jssources/core-js/modules/_regexp-exec-abstract.js swh/web/static/jssources/core-js/modules/_regexp-exec.js swh/web/static/jssources/core-js/modules/_same-value.js swh/web/static/jssources/core-js/modules/_set-proto.js swh/web/static/jssources/core-js/modules/_set-species.js swh/web/static/jssources/core-js/modules/_set-to-string-tag.js swh/web/static/jssources/core-js/modules/_shared-key.js swh/web/static/jssources/core-js/modules/_shared.js swh/web/static/jssources/core-js/modules/_species-constructor.js swh/web/static/jssources/core-js/modules/_strict-method.js swh/web/static/jssources/core-js/modules/_string-at.js swh/web/static/jssources/core-js/modules/_string-context.js swh/web/static/jssources/core-js/modules/_string-html.js swh/web/static/jssources/core-js/modules/_string-pad.js swh/web/static/jssources/core-js/modules/_string-repeat.js swh/web/static/jssources/core-js/modules/_string-trim.js swh/web/static/jssources/core-js/modules/_string-ws.js swh/web/static/jssources/core-js/modules/_task.js swh/web/static/jssources/core-js/modules/_to-absolute-index.js swh/web/static/jssources/core-js/modules/_to-index.js swh/web/static/jssources/core-js/modules/_to-integer.js swh/web/static/jssources/core-js/modules/_to-iobject.js swh/web/static/jssources/core-js/modules/_to-length.js swh/web/static/jssources/core-js/modules/_to-object.js swh/web/static/jssources/core-js/modules/_to-primitive.js swh/web/static/jssources/core-js/modules/_typed-array.js swh/web/static/jssources/core-js/modules/_typed-buffer.js swh/web/static/jssources/core-js/modules/_typed.js swh/web/static/jssources/core-js/modules/_uid.js swh/web/static/jssources/core-js/modules/_user-agent.js swh/web/static/jssources/core-js/modules/_validate-collection.js swh/web/static/jssources/core-js/modules/_wks-define.js swh/web/static/jssources/core-js/modules/_wks-ext.js swh/web/static/jssources/core-js/modules/_wks.js swh/web/static/jssources/core-js/modules/core.get-iterator-method.js swh/web/static/jssources/core-js/modules/es6.array.copy-within.js swh/web/static/jssources/core-js/modules/es6.array.every.js swh/web/static/jssources/core-js/modules/es6.array.fill.js swh/web/static/jssources/core-js/modules/es6.array.filter.js swh/web/static/jssources/core-js/modules/es6.array.find-index.js swh/web/static/jssources/core-js/modules/es6.array.find.js swh/web/static/jssources/core-js/modules/es6.array.for-each.js swh/web/static/jssources/core-js/modules/es6.array.from.js swh/web/static/jssources/core-js/modules/es6.array.index-of.js swh/web/static/jssources/core-js/modules/es6.array.is-array.js swh/web/static/jssources/core-js/modules/es6.array.iterator.js swh/web/static/jssources/core-js/modules/es6.array.join.js swh/web/static/jssources/core-js/modules/es6.array.last-index-of.js swh/web/static/jssources/core-js/modules/es6.array.map.js swh/web/static/jssources/core-js/modules/es6.array.of.js swh/web/static/jssources/core-js/modules/es6.array.reduce-right.js swh/web/static/jssources/core-js/modules/es6.array.reduce.js swh/web/static/jssources/core-js/modules/es6.array.slice.js swh/web/static/jssources/core-js/modules/es6.array.some.js swh/web/static/jssources/core-js/modules/es6.array.sort.js swh/web/static/jssources/core-js/modules/es6.array.species.js swh/web/static/jssources/core-js/modules/es6.date.now.js swh/web/static/jssources/core-js/modules/es6.date.to-iso-string.js swh/web/static/jssources/core-js/modules/es6.date.to-json.js swh/web/static/jssources/core-js/modules/es6.date.to-primitive.js swh/web/static/jssources/core-js/modules/es6.date.to-string.js swh/web/static/jssources/core-js/modules/es6.function.bind.js swh/web/static/jssources/core-js/modules/es6.function.has-instance.js swh/web/static/jssources/core-js/modules/es6.function.name.js swh/web/static/jssources/core-js/modules/es6.map.js swh/web/static/jssources/core-js/modules/es6.math.acosh.js swh/web/static/jssources/core-js/modules/es6.math.asinh.js swh/web/static/jssources/core-js/modules/es6.math.atanh.js swh/web/static/jssources/core-js/modules/es6.math.cbrt.js swh/web/static/jssources/core-js/modules/es6.math.clz32.js swh/web/static/jssources/core-js/modules/es6.math.cosh.js swh/web/static/jssources/core-js/modules/es6.math.expm1.js swh/web/static/jssources/core-js/modules/es6.math.fround.js swh/web/static/jssources/core-js/modules/es6.math.hypot.js swh/web/static/jssources/core-js/modules/es6.math.imul.js swh/web/static/jssources/core-js/modules/es6.math.log10.js swh/web/static/jssources/core-js/modules/es6.math.log1p.js swh/web/static/jssources/core-js/modules/es6.math.log2.js swh/web/static/jssources/core-js/modules/es6.math.sign.js swh/web/static/jssources/core-js/modules/es6.math.sinh.js swh/web/static/jssources/core-js/modules/es6.math.tanh.js swh/web/static/jssources/core-js/modules/es6.math.trunc.js swh/web/static/jssources/core-js/modules/es6.number.constructor.js swh/web/static/jssources/core-js/modules/es6.number.epsilon.js swh/web/static/jssources/core-js/modules/es6.number.is-finite.js swh/web/static/jssources/core-js/modules/es6.number.is-integer.js swh/web/static/jssources/core-js/modules/es6.number.is-nan.js swh/web/static/jssources/core-js/modules/es6.number.is-safe-integer.js swh/web/static/jssources/core-js/modules/es6.number.max-safe-integer.js swh/web/static/jssources/core-js/modules/es6.number.min-safe-integer.js swh/web/static/jssources/core-js/modules/es6.number.parse-float.js swh/web/static/jssources/core-js/modules/es6.number.parse-int.js swh/web/static/jssources/core-js/modules/es6.number.to-fixed.js swh/web/static/jssources/core-js/modules/es6.number.to-precision.js swh/web/static/jssources/core-js/modules/es6.object.assign.js swh/web/static/jssources/core-js/modules/es6.object.create.js swh/web/static/jssources/core-js/modules/es6.object.define-properties.js swh/web/static/jssources/core-js/modules/es6.object.define-property.js swh/web/static/jssources/core-js/modules/es6.object.freeze.js swh/web/static/jssources/core-js/modules/es6.object.get-own-property-descriptor.js swh/web/static/jssources/core-js/modules/es6.object.get-own-property-names.js swh/web/static/jssources/core-js/modules/es6.object.get-prototype-of.js swh/web/static/jssources/core-js/modules/es6.object.is-extensible.js swh/web/static/jssources/core-js/modules/es6.object.is-frozen.js swh/web/static/jssources/core-js/modules/es6.object.is-sealed.js swh/web/static/jssources/core-js/modules/es6.object.is.js swh/web/static/jssources/core-js/modules/es6.object.keys.js swh/web/static/jssources/core-js/modules/es6.object.prevent-extensions.js swh/web/static/jssources/core-js/modules/es6.object.seal.js swh/web/static/jssources/core-js/modules/es6.object.set-prototype-of.js swh/web/static/jssources/core-js/modules/es6.object.to-string.js swh/web/static/jssources/core-js/modules/es6.parse-float.js swh/web/static/jssources/core-js/modules/es6.parse-int.js swh/web/static/jssources/core-js/modules/es6.promise.js swh/web/static/jssources/core-js/modules/es6.reflect.apply.js swh/web/static/jssources/core-js/modules/es6.reflect.construct.js swh/web/static/jssources/core-js/modules/es6.reflect.define-property.js swh/web/static/jssources/core-js/modules/es6.reflect.delete-property.js swh/web/static/jssources/core-js/modules/es6.reflect.enumerate.js swh/web/static/jssources/core-js/modules/es6.reflect.get-own-property-descriptor.js swh/web/static/jssources/core-js/modules/es6.reflect.get-prototype-of.js swh/web/static/jssources/core-js/modules/es6.reflect.get.js swh/web/static/jssources/core-js/modules/es6.reflect.has.js swh/web/static/jssources/core-js/modules/es6.reflect.is-extensible.js swh/web/static/jssources/core-js/modules/es6.reflect.own-keys.js swh/web/static/jssources/core-js/modules/es6.reflect.prevent-extensions.js swh/web/static/jssources/core-js/modules/es6.reflect.set-prototype-of.js swh/web/static/jssources/core-js/modules/es6.reflect.set.js swh/web/static/jssources/core-js/modules/es6.regexp.constructor.js swh/web/static/jssources/core-js/modules/es6.regexp.exec.js swh/web/static/jssources/core-js/modules/es6.regexp.flags.js swh/web/static/jssources/core-js/modules/es6.regexp.match.js swh/web/static/jssources/core-js/modules/es6.regexp.replace.js swh/web/static/jssources/core-js/modules/es6.regexp.search.js swh/web/static/jssources/core-js/modules/es6.regexp.split.js swh/web/static/jssources/core-js/modules/es6.regexp.to-string.js swh/web/static/jssources/core-js/modules/es6.set.js swh/web/static/jssources/core-js/modules/es6.string.anchor.js swh/web/static/jssources/core-js/modules/es6.string.big.js swh/web/static/jssources/core-js/modules/es6.string.blink.js swh/web/static/jssources/core-js/modules/es6.string.bold.js swh/web/static/jssources/core-js/modules/es6.string.code-point-at.js swh/web/static/jssources/core-js/modules/es6.string.ends-with.js swh/web/static/jssources/core-js/modules/es6.string.fixed.js swh/web/static/jssources/core-js/modules/es6.string.fontcolor.js swh/web/static/jssources/core-js/modules/es6.string.fontsize.js swh/web/static/jssources/core-js/modules/es6.string.from-code-point.js swh/web/static/jssources/core-js/modules/es6.string.includes.js swh/web/static/jssources/core-js/modules/es6.string.italics.js swh/web/static/jssources/core-js/modules/es6.string.iterator.js swh/web/static/jssources/core-js/modules/es6.string.link.js swh/web/static/jssources/core-js/modules/es6.string.raw.js swh/web/static/jssources/core-js/modules/es6.string.repeat.js swh/web/static/jssources/core-js/modules/es6.string.small.js swh/web/static/jssources/core-js/modules/es6.string.starts-with.js swh/web/static/jssources/core-js/modules/es6.string.strike.js swh/web/static/jssources/core-js/modules/es6.string.sub.js swh/web/static/jssources/core-js/modules/es6.string.sup.js swh/web/static/jssources/core-js/modules/es6.string.trim.js swh/web/static/jssources/core-js/modules/es6.symbol.js swh/web/static/jssources/core-js/modules/es6.typed.array-buffer.js swh/web/static/jssources/core-js/modules/es6.typed.data-view.js swh/web/static/jssources/core-js/modules/es6.typed.float32-array.js swh/web/static/jssources/core-js/modules/es6.typed.float64-array.js swh/web/static/jssources/core-js/modules/es6.typed.int16-array.js swh/web/static/jssources/core-js/modules/es6.typed.int32-array.js swh/web/static/jssources/core-js/modules/es6.typed.int8-array.js swh/web/static/jssources/core-js/modules/es6.typed.uint16-array.js swh/web/static/jssources/core-js/modules/es6.typed.uint32-array.js swh/web/static/jssources/core-js/modules/es6.typed.uint8-array.js swh/web/static/jssources/core-js/modules/es6.typed.uint8-clamped-array.js swh/web/static/jssources/core-js/modules/es6.weak-map.js swh/web/static/jssources/core-js/modules/es6.weak-set.js swh/web/static/jssources/core-js/modules/es7.array.flat-map.js swh/web/static/jssources/core-js/modules/es7.array.includes.js swh/web/static/jssources/core-js/modules/es7.object.entries.js swh/web/static/jssources/core-js/modules/es7.object.get-own-property-descriptors.js swh/web/static/jssources/core-js/modules/es7.object.values.js swh/web/static/jssources/core-js/modules/es7.promise.finally.js swh/web/static/jssources/core-js/modules/es7.string.pad-end.js swh/web/static/jssources/core-js/modules/es7.string.pad-start.js swh/web/static/jssources/core-js/modules/es7.string.trim-left.js swh/web/static/jssources/core-js/modules/es7.string.trim-right.js swh/web/static/jssources/core-js/modules/es7.symbol.async-iterator.js swh/web/static/jssources/core-js/modules/web.dom.iterable.js swh/web/static/jssources/core-js/modules/web.immediate.js swh/web/static/jssources/core-js/modules/web.timers.js swh/web/static/jssources/core-js/web/index.js swh/web/static/jssources/d3/LICENSE.txt swh/web/static/jssources/d3/index.js swh/web/static/jssources/d3-array/LICENSE.txt swh/web/static/jssources/d3-array/src/array.js swh/web/static/jssources/d3-array/src/ascending.js swh/web/static/jssources/d3-array/src/bisect.js swh/web/static/jssources/d3-array/src/bisector.js swh/web/static/jssources/d3-array/src/constant.js swh/web/static/jssources/d3-array/src/cross.js swh/web/static/jssources/d3-array/src/descending.js swh/web/static/jssources/d3-array/src/deviation.js swh/web/static/jssources/d3-array/src/extent.js swh/web/static/jssources/d3-array/src/histogram.js swh/web/static/jssources/d3-array/src/identity.js swh/web/static/jssources/d3-array/src/index.js swh/web/static/jssources/d3-array/src/max.js swh/web/static/jssources/d3-array/src/mean.js swh/web/static/jssources/d3-array/src/median.js swh/web/static/jssources/d3-array/src/merge.js swh/web/static/jssources/d3-array/src/min.js swh/web/static/jssources/d3-array/src/number.js swh/web/static/jssources/d3-array/src/pairs.js swh/web/static/jssources/d3-array/src/permute.js swh/web/static/jssources/d3-array/src/quantile.js swh/web/static/jssources/d3-array/src/range.js swh/web/static/jssources/d3-array/src/scan.js swh/web/static/jssources/d3-array/src/shuffle.js swh/web/static/jssources/d3-array/src/sum.js swh/web/static/jssources/d3-array/src/ticks.js swh/web/static/jssources/d3-array/src/transpose.js swh/web/static/jssources/d3-array/src/variance.js swh/web/static/jssources/d3-array/src/zip.js swh/web/static/jssources/d3-array/src/threshold/freedmanDiaconis.js swh/web/static/jssources/d3-array/src/threshold/scott.js swh/web/static/jssources/d3-array/src/threshold/sturges.js swh/web/static/jssources/d3-axis/LICENSE.txt swh/web/static/jssources/d3-axis/src/array.js swh/web/static/jssources/d3-axis/src/axis.js swh/web/static/jssources/d3-axis/src/identity.js swh/web/static/jssources/d3-axis/src/index.js swh/web/static/jssources/d3-brush/LICENSE.txt swh/web/static/jssources/d3-brush/src/brush.js swh/web/static/jssources/d3-brush/src/constant.js swh/web/static/jssources/d3-brush/src/event.js swh/web/static/jssources/d3-brush/src/index.js swh/web/static/jssources/d3-brush/src/noevent.js swh/web/static/jssources/d3-chord/LICENSE.txt swh/web/static/jssources/d3-chord/src/array.js swh/web/static/jssources/d3-chord/src/chord.js swh/web/static/jssources/d3-chord/src/constant.js swh/web/static/jssources/d3-chord/src/index.js swh/web/static/jssources/d3-chord/src/math.js swh/web/static/jssources/d3-chord/src/ribbon.js swh/web/static/jssources/d3-collection/LICENSE.txt swh/web/static/jssources/d3-collection/src/entries.js swh/web/static/jssources/d3-collection/src/index.js swh/web/static/jssources/d3-collection/src/keys.js swh/web/static/jssources/d3-collection/src/map.js swh/web/static/jssources/d3-collection/src/nest.js swh/web/static/jssources/d3-collection/src/set.js swh/web/static/jssources/d3-collection/src/values.js swh/web/static/jssources/d3-color/LICENSE.txt swh/web/static/jssources/d3-color/src/color.js swh/web/static/jssources/d3-color/src/cubehelix.js swh/web/static/jssources/d3-color/src/define.js swh/web/static/jssources/d3-color/src/index.js swh/web/static/jssources/d3-color/src/lab.js swh/web/static/jssources/d3-color/src/math.js swh/web/static/jssources/d3-contour/LICENSE.txt swh/web/static/jssources/d3-contour/src/area.js swh/web/static/jssources/d3-contour/src/array.js swh/web/static/jssources/d3-contour/src/ascending.js swh/web/static/jssources/d3-contour/src/blur.js swh/web/static/jssources/d3-contour/src/constant.js swh/web/static/jssources/d3-contour/src/contains.js swh/web/static/jssources/d3-contour/src/contours.js swh/web/static/jssources/d3-contour/src/density.js swh/web/static/jssources/d3-contour/src/index.js swh/web/static/jssources/d3-contour/src/noop.js swh/web/static/jssources/d3-dispatch/LICENSE.txt swh/web/static/jssources/d3-dispatch/src/dispatch.js swh/web/static/jssources/d3-dispatch/src/index.js swh/web/static/jssources/d3-drag/LICENSE.txt swh/web/static/jssources/d3-drag/src/constant.js swh/web/static/jssources/d3-drag/src/drag.js swh/web/static/jssources/d3-drag/src/event.js swh/web/static/jssources/d3-drag/src/index.js swh/web/static/jssources/d3-drag/src/nodrag.js swh/web/static/jssources/d3-drag/src/noevent.js swh/web/static/jssources/d3-dsv/LICENSE.txt swh/web/static/jssources/d3-dsv/src/autoType.js swh/web/static/jssources/d3-dsv/src/csv.js swh/web/static/jssources/d3-dsv/src/dsv.js swh/web/static/jssources/d3-dsv/src/index.js swh/web/static/jssources/d3-dsv/src/tsv.js swh/web/static/jssources/d3-ease/LICENSE.txt swh/web/static/jssources/d3-ease/src/back.js swh/web/static/jssources/d3-ease/src/bounce.js swh/web/static/jssources/d3-ease/src/circle.js swh/web/static/jssources/d3-ease/src/cubic.js swh/web/static/jssources/d3-ease/src/elastic.js swh/web/static/jssources/d3-ease/src/exp.js swh/web/static/jssources/d3-ease/src/index.js swh/web/static/jssources/d3-ease/src/linear.js swh/web/static/jssources/d3-ease/src/poly.js swh/web/static/jssources/d3-ease/src/quad.js swh/web/static/jssources/d3-ease/src/sin.js swh/web/static/jssources/d3-fetch/LICENSE.txt swh/web/static/jssources/d3-fetch/src/blob.js swh/web/static/jssources/d3-fetch/src/buffer.js swh/web/static/jssources/d3-fetch/src/dsv.js swh/web/static/jssources/d3-fetch/src/image.js swh/web/static/jssources/d3-fetch/src/index.js swh/web/static/jssources/d3-fetch/src/json.js swh/web/static/jssources/d3-fetch/src/text.js swh/web/static/jssources/d3-fetch/src/xml.js swh/web/static/jssources/d3-force/LICENSE.txt swh/web/static/jssources/d3-force/src/center.js swh/web/static/jssources/d3-force/src/collide.js swh/web/static/jssources/d3-force/src/constant.js swh/web/static/jssources/d3-force/src/index.js swh/web/static/jssources/d3-force/src/jiggle.js swh/web/static/jssources/d3-force/src/link.js swh/web/static/jssources/d3-force/src/manyBody.js swh/web/static/jssources/d3-force/src/radial.js swh/web/static/jssources/d3-force/src/simulation.js swh/web/static/jssources/d3-force/src/x.js swh/web/static/jssources/d3-force/src/y.js swh/web/static/jssources/d3-format/LICENSE.txt swh/web/static/jssources/d3-format/src/defaultLocale.js swh/web/static/jssources/d3-format/src/exponent.js swh/web/static/jssources/d3-format/src/formatDecimal.js swh/web/static/jssources/d3-format/src/formatGroup.js swh/web/static/jssources/d3-format/src/formatNumerals.js swh/web/static/jssources/d3-format/src/formatPrefixAuto.js swh/web/static/jssources/d3-format/src/formatRounded.js swh/web/static/jssources/d3-format/src/formatSpecifier.js swh/web/static/jssources/d3-format/src/formatTrim.js swh/web/static/jssources/d3-format/src/formatTypes.js swh/web/static/jssources/d3-format/src/identity.js swh/web/static/jssources/d3-format/src/index.js swh/web/static/jssources/d3-format/src/locale.js swh/web/static/jssources/d3-format/src/precisionFixed.js swh/web/static/jssources/d3-format/src/precisionPrefix.js swh/web/static/jssources/d3-format/src/precisionRound.js swh/web/static/jssources/d3-geo/LICENSE.txt swh/web/static/jssources/d3-geo/src/adder.js swh/web/static/jssources/d3-geo/src/area.js swh/web/static/jssources/d3-geo/src/bounds.js swh/web/static/jssources/d3-geo/src/cartesian.js swh/web/static/jssources/d3-geo/src/centroid.js swh/web/static/jssources/d3-geo/src/circle.js swh/web/static/jssources/d3-geo/src/compose.js swh/web/static/jssources/d3-geo/src/constant.js swh/web/static/jssources/d3-geo/src/contains.js swh/web/static/jssources/d3-geo/src/distance.js swh/web/static/jssources/d3-geo/src/graticule.js swh/web/static/jssources/d3-geo/src/identity.js swh/web/static/jssources/d3-geo/src/index.js swh/web/static/jssources/d3-geo/src/interpolate.js swh/web/static/jssources/d3-geo/src/length.js swh/web/static/jssources/d3-geo/src/math.js swh/web/static/jssources/d3-geo/src/noop.js swh/web/static/jssources/d3-geo/src/pointEqual.js swh/web/static/jssources/d3-geo/src/polygonContains.js swh/web/static/jssources/d3-geo/src/rotation.js swh/web/static/jssources/d3-geo/src/stream.js swh/web/static/jssources/d3-geo/src/transform.js swh/web/static/jssources/d3-geo/src/clip/antimeridian.js swh/web/static/jssources/d3-geo/src/clip/buffer.js swh/web/static/jssources/d3-geo/src/clip/circle.js swh/web/static/jssources/d3-geo/src/clip/extent.js swh/web/static/jssources/d3-geo/src/clip/index.js swh/web/static/jssources/d3-geo/src/clip/line.js swh/web/static/jssources/d3-geo/src/clip/rectangle.js swh/web/static/jssources/d3-geo/src/clip/rejoin.js swh/web/static/jssources/d3-geo/src/path/area.js swh/web/static/jssources/d3-geo/src/path/bounds.js swh/web/static/jssources/d3-geo/src/path/centroid.js swh/web/static/jssources/d3-geo/src/path/context.js swh/web/static/jssources/d3-geo/src/path/index.js swh/web/static/jssources/d3-geo/src/path/measure.js swh/web/static/jssources/d3-geo/src/path/string.js swh/web/static/jssources/d3-geo/src/projection/albers.js swh/web/static/jssources/d3-geo/src/projection/albersUsa.js swh/web/static/jssources/d3-geo/src/projection/azimuthal.js swh/web/static/jssources/d3-geo/src/projection/azimuthalEqualArea.js swh/web/static/jssources/d3-geo/src/projection/azimuthalEquidistant.js swh/web/static/jssources/d3-geo/src/projection/conic.js swh/web/static/jssources/d3-geo/src/projection/conicConformal.js swh/web/static/jssources/d3-geo/src/projection/conicEqualArea.js swh/web/static/jssources/d3-geo/src/projection/conicEquidistant.js swh/web/static/jssources/d3-geo/src/projection/cylindricalEqualArea.js swh/web/static/jssources/d3-geo/src/projection/equalEarth.js swh/web/static/jssources/d3-geo/src/projection/equirectangular.js swh/web/static/jssources/d3-geo/src/projection/fit.js swh/web/static/jssources/d3-geo/src/projection/gnomonic.js swh/web/static/jssources/d3-geo/src/projection/identity.js swh/web/static/jssources/d3-geo/src/projection/index.js swh/web/static/jssources/d3-geo/src/projection/mercator.js swh/web/static/jssources/d3-geo/src/projection/naturalEarth1.js swh/web/static/jssources/d3-geo/src/projection/orthographic.js swh/web/static/jssources/d3-geo/src/projection/resample.js swh/web/static/jssources/d3-geo/src/projection/stereographic.js swh/web/static/jssources/d3-geo/src/projection/transverseMercator.js swh/web/static/jssources/d3-hierarchy/LICENSE.txt swh/web/static/jssources/d3-hierarchy/src/accessors.js swh/web/static/jssources/d3-hierarchy/src/array.js swh/web/static/jssources/d3-hierarchy/src/cluster.js swh/web/static/jssources/d3-hierarchy/src/constant.js swh/web/static/jssources/d3-hierarchy/src/index.js swh/web/static/jssources/d3-hierarchy/src/partition.js swh/web/static/jssources/d3-hierarchy/src/stratify.js swh/web/static/jssources/d3-hierarchy/src/tree.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/ancestors.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/count.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/descendants.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/each.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/eachAfter.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/eachBefore.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/index.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/leaves.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/links.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/path.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/sort.js swh/web/static/jssources/d3-hierarchy/src/hierarchy/sum.js swh/web/static/jssources/d3-hierarchy/src/pack/enclose.js swh/web/static/jssources/d3-hierarchy/src/pack/index.js swh/web/static/jssources/d3-hierarchy/src/pack/siblings.js swh/web/static/jssources/d3-hierarchy/src/treemap/binary.js swh/web/static/jssources/d3-hierarchy/src/treemap/dice.js swh/web/static/jssources/d3-hierarchy/src/treemap/index.js swh/web/static/jssources/d3-hierarchy/src/treemap/resquarify.js swh/web/static/jssources/d3-hierarchy/src/treemap/round.js swh/web/static/jssources/d3-hierarchy/src/treemap/slice.js swh/web/static/jssources/d3-hierarchy/src/treemap/sliceDice.js swh/web/static/jssources/d3-hierarchy/src/treemap/squarify.js swh/web/static/jssources/d3-interpolate/LICENSE.txt swh/web/static/jssources/d3-interpolate/src/array.js swh/web/static/jssources/d3-interpolate/src/basis.js swh/web/static/jssources/d3-interpolate/src/basisClosed.js swh/web/static/jssources/d3-interpolate/src/color.js swh/web/static/jssources/d3-interpolate/src/constant.js swh/web/static/jssources/d3-interpolate/src/cubehelix.js swh/web/static/jssources/d3-interpolate/src/date.js swh/web/static/jssources/d3-interpolate/src/discrete.js swh/web/static/jssources/d3-interpolate/src/hcl.js swh/web/static/jssources/d3-interpolate/src/hsl.js swh/web/static/jssources/d3-interpolate/src/hue.js swh/web/static/jssources/d3-interpolate/src/index.js swh/web/static/jssources/d3-interpolate/src/lab.js swh/web/static/jssources/d3-interpolate/src/number.js swh/web/static/jssources/d3-interpolate/src/object.js swh/web/static/jssources/d3-interpolate/src/piecewise.js swh/web/static/jssources/d3-interpolate/src/quantize.js swh/web/static/jssources/d3-interpolate/src/rgb.js swh/web/static/jssources/d3-interpolate/src/round.js swh/web/static/jssources/d3-interpolate/src/string.js swh/web/static/jssources/d3-interpolate/src/value.js swh/web/static/jssources/d3-interpolate/src/zoom.js swh/web/static/jssources/d3-interpolate/src/transform/decompose.js swh/web/static/jssources/d3-interpolate/src/transform/index.js swh/web/static/jssources/d3-interpolate/src/transform/parse.js swh/web/static/jssources/d3-path/LICENSE.txt swh/web/static/jssources/d3-path/src/index.js swh/web/static/jssources/d3-path/src/path.js swh/web/static/jssources/d3-polygon/LICENSE.txt swh/web/static/jssources/d3-polygon/src/area.js swh/web/static/jssources/d3-polygon/src/centroid.js swh/web/static/jssources/d3-polygon/src/contains.js swh/web/static/jssources/d3-polygon/src/cross.js swh/web/static/jssources/d3-polygon/src/hull.js swh/web/static/jssources/d3-polygon/src/index.js swh/web/static/jssources/d3-polygon/src/length.js swh/web/static/jssources/d3-quadtree/LICENSE.txt swh/web/static/jssources/d3-quadtree/src/add.js swh/web/static/jssources/d3-quadtree/src/cover.js swh/web/static/jssources/d3-quadtree/src/data.js swh/web/static/jssources/d3-quadtree/src/extent.js swh/web/static/jssources/d3-quadtree/src/find.js swh/web/static/jssources/d3-quadtree/src/index.js swh/web/static/jssources/d3-quadtree/src/quad.js swh/web/static/jssources/d3-quadtree/src/quadtree.js swh/web/static/jssources/d3-quadtree/src/remove.js swh/web/static/jssources/d3-quadtree/src/root.js swh/web/static/jssources/d3-quadtree/src/size.js swh/web/static/jssources/d3-quadtree/src/visit.js swh/web/static/jssources/d3-quadtree/src/visitAfter.js swh/web/static/jssources/d3-quadtree/src/x.js swh/web/static/jssources/d3-quadtree/src/y.js swh/web/static/jssources/d3-random/LICENSE.txt swh/web/static/jssources/d3-random/src/bates.js swh/web/static/jssources/d3-random/src/defaultSource.js swh/web/static/jssources/d3-random/src/exponential.js swh/web/static/jssources/d3-random/src/index.js swh/web/static/jssources/d3-random/src/irwinHall.js swh/web/static/jssources/d3-random/src/logNormal.js swh/web/static/jssources/d3-random/src/normal.js swh/web/static/jssources/d3-random/src/uniform.js swh/web/static/jssources/d3-scale/LICENSE.txt swh/web/static/jssources/d3-scale-chromatic/LICENSE.txt swh/web/static/jssources/d3-scale-chromatic/src/colors.js swh/web/static/jssources/d3-scale-chromatic/src/index.js swh/web/static/jssources/d3-scale-chromatic/src/ramp.js swh/web/static/jssources/d3-scale-chromatic/src/categorical/Accent.js swh/web/static/jssources/d3-scale-chromatic/src/categorical/Dark2.js swh/web/static/jssources/d3-scale-chromatic/src/categorical/Paired.js swh/web/static/jssources/d3-scale-chromatic/src/categorical/Pastel1.js swh/web/static/jssources/d3-scale-chromatic/src/categorical/Pastel2.js swh/web/static/jssources/d3-scale-chromatic/src/categorical/Set1.js swh/web/static/jssources/d3-scale-chromatic/src/categorical/Set2.js swh/web/static/jssources/d3-scale-chromatic/src/categorical/Set3.js swh/web/static/jssources/d3-scale-chromatic/src/categorical/category10.js swh/web/static/jssources/d3-scale-chromatic/src/diverging/BrBG.js swh/web/static/jssources/d3-scale-chromatic/src/diverging/PRGn.js swh/web/static/jssources/d3-scale-chromatic/src/diverging/PiYG.js swh/web/static/jssources/d3-scale-chromatic/src/diverging/PuOr.js swh/web/static/jssources/d3-scale-chromatic/src/diverging/RdBu.js swh/web/static/jssources/d3-scale-chromatic/src/diverging/RdGy.js swh/web/static/jssources/d3-scale-chromatic/src/diverging/RdYlBu.js swh/web/static/jssources/d3-scale-chromatic/src/diverging/RdYlGn.js swh/web/static/jssources/d3-scale-chromatic/src/diverging/Spectral.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/BuGn.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/BuPu.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/GnBu.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/OrRd.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/PuBu.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/PuBuGn.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/PuRd.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/RdPu.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/YlGn.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/YlGnBu.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/YlOrBr.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/YlOrRd.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/cubehelix.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/rainbow.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/sinebow.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-multi/viridis.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-single/Blues.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-single/Greens.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-single/Greys.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-single/Oranges.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-single/Purples.js swh/web/static/jssources/d3-scale-chromatic/src/sequential-single/Reds.js swh/web/static/jssources/d3-scale/src/array.js swh/web/static/jssources/d3-scale/src/band.js swh/web/static/jssources/d3-scale/src/constant.js swh/web/static/jssources/d3-scale/src/continuous.js swh/web/static/jssources/d3-scale/src/diverging.js swh/web/static/jssources/d3-scale/src/identity.js swh/web/static/jssources/d3-scale/src/index.js swh/web/static/jssources/d3-scale/src/init.js swh/web/static/jssources/d3-scale/src/linear.js swh/web/static/jssources/d3-scale/src/log.js swh/web/static/jssources/d3-scale/src/nice.js swh/web/static/jssources/d3-scale/src/number.js swh/web/static/jssources/d3-scale/src/ordinal.js swh/web/static/jssources/d3-scale/src/pow.js swh/web/static/jssources/d3-scale/src/quantile.js swh/web/static/jssources/d3-scale/src/quantize.js swh/web/static/jssources/d3-scale/src/sequential.js swh/web/static/jssources/d3-scale/src/sequentialQuantile.js swh/web/static/jssources/d3-scale/src/symlog.js swh/web/static/jssources/d3-scale/src/threshold.js swh/web/static/jssources/d3-scale/src/tickFormat.js swh/web/static/jssources/d3-scale/src/time.js swh/web/static/jssources/d3-scale/src/utcTime.js swh/web/static/jssources/d3-selection/LICENSE.txt swh/web/static/jssources/d3-selection/src/constant.js swh/web/static/jssources/d3-selection/src/create.js swh/web/static/jssources/d3-selection/src/creator.js swh/web/static/jssources/d3-selection/src/index.js swh/web/static/jssources/d3-selection/src/local.js swh/web/static/jssources/d3-selection/src/matcher.js swh/web/static/jssources/d3-selection/src/mouse.js swh/web/static/jssources/d3-selection/src/namespace.js swh/web/static/jssources/d3-selection/src/namespaces.js swh/web/static/jssources/d3-selection/src/point.js swh/web/static/jssources/d3-selection/src/select.js swh/web/static/jssources/d3-selection/src/selectAll.js swh/web/static/jssources/d3-selection/src/selector.js swh/web/static/jssources/d3-selection/src/selectorAll.js swh/web/static/jssources/d3-selection/src/sourceEvent.js swh/web/static/jssources/d3-selection/src/touch.js swh/web/static/jssources/d3-selection/src/touches.js swh/web/static/jssources/d3-selection/src/window.js swh/web/static/jssources/d3-selection/src/selection/append.js swh/web/static/jssources/d3-selection/src/selection/attr.js swh/web/static/jssources/d3-selection/src/selection/call.js swh/web/static/jssources/d3-selection/src/selection/classed.js swh/web/static/jssources/d3-selection/src/selection/clone.js swh/web/static/jssources/d3-selection/src/selection/data.js swh/web/static/jssources/d3-selection/src/selection/datum.js swh/web/static/jssources/d3-selection/src/selection/dispatch.js swh/web/static/jssources/d3-selection/src/selection/each.js swh/web/static/jssources/d3-selection/src/selection/empty.js swh/web/static/jssources/d3-selection/src/selection/enter.js swh/web/static/jssources/d3-selection/src/selection/exit.js swh/web/static/jssources/d3-selection/src/selection/filter.js swh/web/static/jssources/d3-selection/src/selection/html.js swh/web/static/jssources/d3-selection/src/selection/index.js swh/web/static/jssources/d3-selection/src/selection/insert.js swh/web/static/jssources/d3-selection/src/selection/join.js swh/web/static/jssources/d3-selection/src/selection/lower.js swh/web/static/jssources/d3-selection/src/selection/merge.js swh/web/static/jssources/d3-selection/src/selection/node.js swh/web/static/jssources/d3-selection/src/selection/nodes.js swh/web/static/jssources/d3-selection/src/selection/on.js swh/web/static/jssources/d3-selection/src/selection/order.js swh/web/static/jssources/d3-selection/src/selection/property.js swh/web/static/jssources/d3-selection/src/selection/raise.js swh/web/static/jssources/d3-selection/src/selection/remove.js swh/web/static/jssources/d3-selection/src/selection/select.js swh/web/static/jssources/d3-selection/src/selection/selectAll.js swh/web/static/jssources/d3-selection/src/selection/size.js swh/web/static/jssources/d3-selection/src/selection/sort.js swh/web/static/jssources/d3-selection/src/selection/sparse.js swh/web/static/jssources/d3-selection/src/selection/style.js swh/web/static/jssources/d3-selection/src/selection/text.js swh/web/static/jssources/d3-shape/LICENSE.txt swh/web/static/jssources/d3-shape/src/arc.js swh/web/static/jssources/d3-shape/src/area.js swh/web/static/jssources/d3-shape/src/areaRadial.js swh/web/static/jssources/d3-shape/src/array.js swh/web/static/jssources/d3-shape/src/constant.js swh/web/static/jssources/d3-shape/src/descending.js swh/web/static/jssources/d3-shape/src/identity.js swh/web/static/jssources/d3-shape/src/index.js swh/web/static/jssources/d3-shape/src/line.js swh/web/static/jssources/d3-shape/src/lineRadial.js swh/web/static/jssources/d3-shape/src/math.js swh/web/static/jssources/d3-shape/src/noop.js swh/web/static/jssources/d3-shape/src/pie.js swh/web/static/jssources/d3-shape/src/point.js swh/web/static/jssources/d3-shape/src/pointRadial.js swh/web/static/jssources/d3-shape/src/stack.js swh/web/static/jssources/d3-shape/src/symbol.js swh/web/static/jssources/d3-shape/src/curve/basis.js swh/web/static/jssources/d3-shape/src/curve/basisClosed.js swh/web/static/jssources/d3-shape/src/curve/basisOpen.js swh/web/static/jssources/d3-shape/src/curve/bundle.js swh/web/static/jssources/d3-shape/src/curve/cardinal.js swh/web/static/jssources/d3-shape/src/curve/cardinalClosed.js swh/web/static/jssources/d3-shape/src/curve/cardinalOpen.js swh/web/static/jssources/d3-shape/src/curve/catmullRom.js swh/web/static/jssources/d3-shape/src/curve/catmullRomClosed.js swh/web/static/jssources/d3-shape/src/curve/catmullRomOpen.js swh/web/static/jssources/d3-shape/src/curve/linear.js swh/web/static/jssources/d3-shape/src/curve/linearClosed.js swh/web/static/jssources/d3-shape/src/curve/monotone.js swh/web/static/jssources/d3-shape/src/curve/natural.js swh/web/static/jssources/d3-shape/src/curve/radial.js swh/web/static/jssources/d3-shape/src/curve/step.js swh/web/static/jssources/d3-shape/src/link/index.js swh/web/static/jssources/d3-shape/src/offset/diverging.js swh/web/static/jssources/d3-shape/src/offset/expand.js swh/web/static/jssources/d3-shape/src/offset/none.js swh/web/static/jssources/d3-shape/src/offset/silhouette.js swh/web/static/jssources/d3-shape/src/offset/wiggle.js swh/web/static/jssources/d3-shape/src/order/appearance.js swh/web/static/jssources/d3-shape/src/order/ascending.js swh/web/static/jssources/d3-shape/src/order/descending.js swh/web/static/jssources/d3-shape/src/order/insideOut.js swh/web/static/jssources/d3-shape/src/order/none.js swh/web/static/jssources/d3-shape/src/order/reverse.js swh/web/static/jssources/d3-shape/src/symbol/circle.js swh/web/static/jssources/d3-shape/src/symbol/cross.js swh/web/static/jssources/d3-shape/src/symbol/diamond.js swh/web/static/jssources/d3-shape/src/symbol/square.js swh/web/static/jssources/d3-shape/src/symbol/star.js swh/web/static/jssources/d3-shape/src/symbol/triangle.js swh/web/static/jssources/d3-shape/src/symbol/wye.js swh/web/static/jssources/d3-time/LICENSE.txt swh/web/static/jssources/d3-time-format/LICENSE.txt swh/web/static/jssources/d3-time-format/src/defaultLocale.js swh/web/static/jssources/d3-time-format/src/index.js swh/web/static/jssources/d3-time-format/src/isoFormat.js swh/web/static/jssources/d3-time-format/src/isoParse.js swh/web/static/jssources/d3-time-format/src/locale.js swh/web/static/jssources/d3-time/src/day.js swh/web/static/jssources/d3-time/src/duration.js swh/web/static/jssources/d3-time/src/hour.js swh/web/static/jssources/d3-time/src/index.js swh/web/static/jssources/d3-time/src/interval.js swh/web/static/jssources/d3-time/src/millisecond.js swh/web/static/jssources/d3-time/src/minute.js swh/web/static/jssources/d3-time/src/month.js swh/web/static/jssources/d3-time/src/second.js swh/web/static/jssources/d3-time/src/utcDay.js swh/web/static/jssources/d3-time/src/utcHour.js swh/web/static/jssources/d3-time/src/utcMinute.js swh/web/static/jssources/d3-time/src/utcMonth.js swh/web/static/jssources/d3-time/src/utcWeek.js swh/web/static/jssources/d3-time/src/utcYear.js swh/web/static/jssources/d3-time/src/week.js swh/web/static/jssources/d3-time/src/year.js swh/web/static/jssources/d3-timer/LICENSE.txt swh/web/static/jssources/d3-timer/src/index.js swh/web/static/jssources/d3-timer/src/interval.js swh/web/static/jssources/d3-timer/src/timeout.js swh/web/static/jssources/d3-timer/src/timer.js swh/web/static/jssources/d3-transition/LICENSE.txt swh/web/static/jssources/d3-transition/src/active.js swh/web/static/jssources/d3-transition/src/index.js swh/web/static/jssources/d3-transition/src/interrupt.js swh/web/static/jssources/d3-transition/src/selection/index.js swh/web/static/jssources/d3-transition/src/selection/interrupt.js swh/web/static/jssources/d3-transition/src/selection/transition.js swh/web/static/jssources/d3-transition/src/transition/attr.js swh/web/static/jssources/d3-transition/src/transition/attrTween.js swh/web/static/jssources/d3-transition/src/transition/delay.js swh/web/static/jssources/d3-transition/src/transition/duration.js swh/web/static/jssources/d3-transition/src/transition/ease.js swh/web/static/jssources/d3-transition/src/transition/end.js swh/web/static/jssources/d3-transition/src/transition/filter.js swh/web/static/jssources/d3-transition/src/transition/index.js swh/web/static/jssources/d3-transition/src/transition/interpolate.js swh/web/static/jssources/d3-transition/src/transition/merge.js swh/web/static/jssources/d3-transition/src/transition/on.js swh/web/static/jssources/d3-transition/src/transition/remove.js swh/web/static/jssources/d3-transition/src/transition/schedule.js swh/web/static/jssources/d3-transition/src/transition/select.js swh/web/static/jssources/d3-transition/src/transition/selectAll.js swh/web/static/jssources/d3-transition/src/transition/selection.js swh/web/static/jssources/d3-transition/src/transition/style.js swh/web/static/jssources/d3-transition/src/transition/styleTween.js swh/web/static/jssources/d3-transition/src/transition/text.js swh/web/static/jssources/d3-transition/src/transition/transition.js swh/web/static/jssources/d3-transition/src/transition/tween.js swh/web/static/jssources/d3-voronoi/LICENSE.txt swh/web/static/jssources/d3-voronoi/src/Beach.js swh/web/static/jssources/d3-voronoi/src/Cell.js swh/web/static/jssources/d3-voronoi/src/Circle.js swh/web/static/jssources/d3-voronoi/src/Diagram.js swh/web/static/jssources/d3-voronoi/src/Edge.js swh/web/static/jssources/d3-voronoi/src/RedBlackTree.js swh/web/static/jssources/d3-voronoi/src/constant.js swh/web/static/jssources/d3-voronoi/src/index.js swh/web/static/jssources/d3-voronoi/src/point.js swh/web/static/jssources/d3-voronoi/src/voronoi.js swh/web/static/jssources/d3-zoom/LICENSE.txt swh/web/static/jssources/d3-zoom/src/constant.js swh/web/static/jssources/d3-zoom/src/event.js swh/web/static/jssources/d3-zoom/src/index.js swh/web/static/jssources/d3-zoom/src/noevent.js swh/web/static/jssources/d3-zoom/src/transform.js swh/web/static/jssources/d3-zoom/src/zoom.js swh/web/static/jssources/d3/dist/package.js swh/web/static/jssources/datatables.net/License.txt swh/web/static/jssources/datatables.net-bs4/js/dataTables.bootstrap4.js swh/web/static/jssources/datatables.net/js/jquery.dataTables.js swh/web/static/jssources/dompurify/LICENSE.txt swh/web/static/jssources/dompurify/dist/purify.js swh/web/static/jssources/elementsfrompoint-polyfill/LICENSE.txt swh/web/static/jssources/elementsfrompoint-polyfill/index.js swh/web/static/jssources/highlight.js/LICENSE.txt swh/web/static/jssources/highlight.js/lib/highlight.js swh/web/static/jssources/highlight.js/lib/index.js swh/web/static/jssources/highlight.js/lib/languages/1c.js swh/web/static/jssources/highlight.js/lib/languages/abnf.js swh/web/static/jssources/highlight.js/lib/languages/accesslog.js swh/web/static/jssources/highlight.js/lib/languages/actionscript.js swh/web/static/jssources/highlight.js/lib/languages/ada.js swh/web/static/jssources/highlight.js/lib/languages/angelscript.js swh/web/static/jssources/highlight.js/lib/languages/apache.js swh/web/static/jssources/highlight.js/lib/languages/applescript.js swh/web/static/jssources/highlight.js/lib/languages/arcade.js swh/web/static/jssources/highlight.js/lib/languages/arduino.js swh/web/static/jssources/highlight.js/lib/languages/armasm.js swh/web/static/jssources/highlight.js/lib/languages/asciidoc.js swh/web/static/jssources/highlight.js/lib/languages/aspectj.js swh/web/static/jssources/highlight.js/lib/languages/autohotkey.js swh/web/static/jssources/highlight.js/lib/languages/autoit.js swh/web/static/jssources/highlight.js/lib/languages/avrasm.js swh/web/static/jssources/highlight.js/lib/languages/awk.js swh/web/static/jssources/highlight.js/lib/languages/axapta.js swh/web/static/jssources/highlight.js/lib/languages/bash.js swh/web/static/jssources/highlight.js/lib/languages/basic.js swh/web/static/jssources/highlight.js/lib/languages/bnf.js swh/web/static/jssources/highlight.js/lib/languages/brainfuck.js swh/web/static/jssources/highlight.js/lib/languages/cal.js swh/web/static/jssources/highlight.js/lib/languages/capnproto.js swh/web/static/jssources/highlight.js/lib/languages/ceylon.js swh/web/static/jssources/highlight.js/lib/languages/clean.js swh/web/static/jssources/highlight.js/lib/languages/clojure-repl.js swh/web/static/jssources/highlight.js/lib/languages/clojure.js swh/web/static/jssources/highlight.js/lib/languages/cmake.js swh/web/static/jssources/highlight.js/lib/languages/coffeescript.js swh/web/static/jssources/highlight.js/lib/languages/coq.js swh/web/static/jssources/highlight.js/lib/languages/cos.js swh/web/static/jssources/highlight.js/lib/languages/cpp.js swh/web/static/jssources/highlight.js/lib/languages/crmsh.js swh/web/static/jssources/highlight.js/lib/languages/crystal.js swh/web/static/jssources/highlight.js/lib/languages/cs.js swh/web/static/jssources/highlight.js/lib/languages/csp.js swh/web/static/jssources/highlight.js/lib/languages/css.js swh/web/static/jssources/highlight.js/lib/languages/d.js swh/web/static/jssources/highlight.js/lib/languages/dart.js swh/web/static/jssources/highlight.js/lib/languages/delphi.js swh/web/static/jssources/highlight.js/lib/languages/diff.js swh/web/static/jssources/highlight.js/lib/languages/django.js swh/web/static/jssources/highlight.js/lib/languages/dns.js swh/web/static/jssources/highlight.js/lib/languages/dockerfile.js swh/web/static/jssources/highlight.js/lib/languages/dos.js swh/web/static/jssources/highlight.js/lib/languages/dsconfig.js swh/web/static/jssources/highlight.js/lib/languages/dts.js swh/web/static/jssources/highlight.js/lib/languages/dust.js swh/web/static/jssources/highlight.js/lib/languages/ebnf.js swh/web/static/jssources/highlight.js/lib/languages/elixir.js swh/web/static/jssources/highlight.js/lib/languages/elm.js swh/web/static/jssources/highlight.js/lib/languages/erb.js swh/web/static/jssources/highlight.js/lib/languages/erlang-repl.js swh/web/static/jssources/highlight.js/lib/languages/erlang.js swh/web/static/jssources/highlight.js/lib/languages/excel.js swh/web/static/jssources/highlight.js/lib/languages/fix.js swh/web/static/jssources/highlight.js/lib/languages/flix.js swh/web/static/jssources/highlight.js/lib/languages/fortran.js swh/web/static/jssources/highlight.js/lib/languages/fsharp.js swh/web/static/jssources/highlight.js/lib/languages/gams.js swh/web/static/jssources/highlight.js/lib/languages/gauss.js swh/web/static/jssources/highlight.js/lib/languages/gcode.js swh/web/static/jssources/highlight.js/lib/languages/gherkin.js swh/web/static/jssources/highlight.js/lib/languages/glsl.js swh/web/static/jssources/highlight.js/lib/languages/gml.js swh/web/static/jssources/highlight.js/lib/languages/go.js swh/web/static/jssources/highlight.js/lib/languages/golo.js swh/web/static/jssources/highlight.js/lib/languages/gradle.js swh/web/static/jssources/highlight.js/lib/languages/groovy.js swh/web/static/jssources/highlight.js/lib/languages/haml.js swh/web/static/jssources/highlight.js/lib/languages/handlebars.js swh/web/static/jssources/highlight.js/lib/languages/haskell.js swh/web/static/jssources/highlight.js/lib/languages/haxe.js swh/web/static/jssources/highlight.js/lib/languages/hsp.js swh/web/static/jssources/highlight.js/lib/languages/htmlbars.js swh/web/static/jssources/highlight.js/lib/languages/http.js swh/web/static/jssources/highlight.js/lib/languages/hy.js swh/web/static/jssources/highlight.js/lib/languages/inform7.js swh/web/static/jssources/highlight.js/lib/languages/ini.js swh/web/static/jssources/highlight.js/lib/languages/irpf90.js swh/web/static/jssources/highlight.js/lib/languages/isbl.js swh/web/static/jssources/highlight.js/lib/languages/java.js swh/web/static/jssources/highlight.js/lib/languages/javascript.js swh/web/static/jssources/highlight.js/lib/languages/jboss-cli.js swh/web/static/jssources/highlight.js/lib/languages/json.js swh/web/static/jssources/highlight.js/lib/languages/julia-repl.js swh/web/static/jssources/highlight.js/lib/languages/julia.js swh/web/static/jssources/highlight.js/lib/languages/kotlin.js swh/web/static/jssources/highlight.js/lib/languages/lasso.js swh/web/static/jssources/highlight.js/lib/languages/ldif.js swh/web/static/jssources/highlight.js/lib/languages/leaf.js swh/web/static/jssources/highlight.js/lib/languages/less.js swh/web/static/jssources/highlight.js/lib/languages/lisp.js swh/web/static/jssources/highlight.js/lib/languages/livecodeserver.js swh/web/static/jssources/highlight.js/lib/languages/livescript.js swh/web/static/jssources/highlight.js/lib/languages/llvm.js swh/web/static/jssources/highlight.js/lib/languages/lsl.js swh/web/static/jssources/highlight.js/lib/languages/lua.js swh/web/static/jssources/highlight.js/lib/languages/makefile.js swh/web/static/jssources/highlight.js/lib/languages/markdown.js swh/web/static/jssources/highlight.js/lib/languages/mathematica.js swh/web/static/jssources/highlight.js/lib/languages/matlab.js swh/web/static/jssources/highlight.js/lib/languages/maxima.js swh/web/static/jssources/highlight.js/lib/languages/mel.js swh/web/static/jssources/highlight.js/lib/languages/mercury.js swh/web/static/jssources/highlight.js/lib/languages/mipsasm.js swh/web/static/jssources/highlight.js/lib/languages/mizar.js swh/web/static/jssources/highlight.js/lib/languages/mojolicious.js swh/web/static/jssources/highlight.js/lib/languages/monkey.js swh/web/static/jssources/highlight.js/lib/languages/moonscript.js swh/web/static/jssources/highlight.js/lib/languages/n1ql.js swh/web/static/jssources/highlight.js/lib/languages/nginx.js swh/web/static/jssources/highlight.js/lib/languages/nimrod.js swh/web/static/jssources/highlight.js/lib/languages/nix.js swh/web/static/jssources/highlight.js/lib/languages/nsis.js swh/web/static/jssources/highlight.js/lib/languages/objectivec.js swh/web/static/jssources/highlight.js/lib/languages/ocaml.js swh/web/static/jssources/highlight.js/lib/languages/openscad.js swh/web/static/jssources/highlight.js/lib/languages/oxygene.js swh/web/static/jssources/highlight.js/lib/languages/parser3.js swh/web/static/jssources/highlight.js/lib/languages/perl.js swh/web/static/jssources/highlight.js/lib/languages/pf.js swh/web/static/jssources/highlight.js/lib/languages/pgsql.js swh/web/static/jssources/highlight.js/lib/languages/php.js swh/web/static/jssources/highlight.js/lib/languages/plaintext.js swh/web/static/jssources/highlight.js/lib/languages/pony.js swh/web/static/jssources/highlight.js/lib/languages/powershell.js swh/web/static/jssources/highlight.js/lib/languages/processing.js swh/web/static/jssources/highlight.js/lib/languages/profile.js swh/web/static/jssources/highlight.js/lib/languages/prolog.js swh/web/static/jssources/highlight.js/lib/languages/properties.js swh/web/static/jssources/highlight.js/lib/languages/protobuf.js swh/web/static/jssources/highlight.js/lib/languages/puppet.js swh/web/static/jssources/highlight.js/lib/languages/purebasic.js swh/web/static/jssources/highlight.js/lib/languages/python.js swh/web/static/jssources/highlight.js/lib/languages/q.js swh/web/static/jssources/highlight.js/lib/languages/qml.js swh/web/static/jssources/highlight.js/lib/languages/r.js swh/web/static/jssources/highlight.js/lib/languages/reasonml.js swh/web/static/jssources/highlight.js/lib/languages/rib.js swh/web/static/jssources/highlight.js/lib/languages/roboconf.js swh/web/static/jssources/highlight.js/lib/languages/routeros.js swh/web/static/jssources/highlight.js/lib/languages/rsl.js swh/web/static/jssources/highlight.js/lib/languages/ruby.js swh/web/static/jssources/highlight.js/lib/languages/ruleslanguage.js swh/web/static/jssources/highlight.js/lib/languages/rust.js swh/web/static/jssources/highlight.js/lib/languages/sas.js swh/web/static/jssources/highlight.js/lib/languages/scala.js swh/web/static/jssources/highlight.js/lib/languages/scheme.js swh/web/static/jssources/highlight.js/lib/languages/scilab.js swh/web/static/jssources/highlight.js/lib/languages/scss.js swh/web/static/jssources/highlight.js/lib/languages/shell.js swh/web/static/jssources/highlight.js/lib/languages/smali.js swh/web/static/jssources/highlight.js/lib/languages/smalltalk.js swh/web/static/jssources/highlight.js/lib/languages/sml.js swh/web/static/jssources/highlight.js/lib/languages/sqf.js swh/web/static/jssources/highlight.js/lib/languages/sql.js swh/web/static/jssources/highlight.js/lib/languages/stan.js swh/web/static/jssources/highlight.js/lib/languages/stata.js swh/web/static/jssources/highlight.js/lib/languages/step21.js swh/web/static/jssources/highlight.js/lib/languages/stylus.js swh/web/static/jssources/highlight.js/lib/languages/subunit.js swh/web/static/jssources/highlight.js/lib/languages/swift.js swh/web/static/jssources/highlight.js/lib/languages/taggerscript.js swh/web/static/jssources/highlight.js/lib/languages/tap.js swh/web/static/jssources/highlight.js/lib/languages/tcl.js swh/web/static/jssources/highlight.js/lib/languages/tex.js swh/web/static/jssources/highlight.js/lib/languages/thrift.js swh/web/static/jssources/highlight.js/lib/languages/tp.js swh/web/static/jssources/highlight.js/lib/languages/twig.js swh/web/static/jssources/highlight.js/lib/languages/typescript.js swh/web/static/jssources/highlight.js/lib/languages/vala.js swh/web/static/jssources/highlight.js/lib/languages/vbnet.js swh/web/static/jssources/highlight.js/lib/languages/vbscript-html.js swh/web/static/jssources/highlight.js/lib/languages/vbscript.js swh/web/static/jssources/highlight.js/lib/languages/verilog.js swh/web/static/jssources/highlight.js/lib/languages/vhdl.js swh/web/static/jssources/highlight.js/lib/languages/vim.js swh/web/static/jssources/highlight.js/lib/languages/x86asm.js swh/web/static/jssources/highlight.js/lib/languages/xl.js swh/web/static/jssources/highlight.js/lib/languages/xml.js swh/web/static/jssources/highlight.js/lib/languages/xquery.js swh/web/static/jssources/highlight.js/lib/languages/yaml.js swh/web/static/jssources/highlight.js/lib/languages/zephir.js swh/web/static/jssources/highlightjs-line-numbers.js/LICENSE.txt swh/web/static/jssources/highlightjs-line-numbers.js/src/highlightjs-line-numbers.js swh/web/static/jssources/iframe-resizer/LICENSE.txt swh/web/static/jssources/iframe-resizer/index.js swh/web/static/jssources/iframe-resizer/js/iframeResizer.contentWindow.js swh/web/static/jssources/iframe-resizer/js/iframeResizer.js swh/web/static/jssources/iframe-resizer/js/index.js swh/web/static/jssources/jquery/LICENSE.txt swh/web/static/jssources/jquery/dist/jquery.js swh/web/static/jssources/js-cookie/LICENSE.txt swh/web/static/jssources/js-cookie/src/js.cookie.js swh/web/static/jssources/notebookjs/LICENSE.txt swh/web/static/jssources/notebookjs/notebook.js swh/web/static/jssources/object-fit-images/license.txt swh/web/static/jssources/object-fit-images/dist/ofi.common-js.js swh/web/static/jssources/org/LICENSE.txt swh/web/static/jssources/org/lib/org.js swh/web/static/jssources/org/lib/org/lexer.js swh/web/static/jssources/org/lib/org/node.js swh/web/static/jssources/org/lib/org/parser.js swh/web/static/jssources/org/lib/org/stream.js swh/web/static/jssources/org/lib/org/converter/converter.js swh/web/static/jssources/org/lib/org/converter/html.js swh/web/static/jssources/pdfjs-dist/LICENSE.txt swh/web/static/jssources/pdfjs-dist/build/pdf.js swh/web/static/jssources/pdfjs-dist/build/pdf.worker.js swh/web/static/jssources/popper.js/dist/esm/popper.js swh/web/static/jssources/regenerator-runtime/runtime.js swh/web/static/jssources/script-loader/LICENSE.txt swh/web/static/jssources/script-loader/addScript.js swh/web/static/jssources/showdown/license.txt swh/web/static/jssources/showdown/dist/showdown.js swh/web/static/jssources/swh/web/assets/src/bundles/admin/deposit.js swh/web/static/jssources/swh/web/assets/src/bundles/admin/index.js swh/web/static/jssources/swh/web/assets/src/bundles/admin/origin-save.js swh/web/static/jssources/swh/web/assets/src/bundles/browse/browse-utils.js swh/web/static/jssources/swh/web/assets/src/bundles/browse/index.js swh/web/static/jssources/swh/web/assets/src/bundles/browse/origin-save.js swh/web/static/jssources/swh/web/assets/src/bundles/browse/origin-search.js swh/web/static/jssources/swh/web/assets/src/bundles/browse/snapshot-navigation.js swh/web/static/jssources/swh/web/assets/src/bundles/browse/swh-ids-utils.js swh/web/static/jssources/swh/web/assets/src/bundles/origin/index.js swh/web/static/jssources/swh/web/assets/src/bundles/origin/visits-calendar.js swh/web/static/jssources/swh/web/assets/src/bundles/origin/visits-histogram.js swh/web/static/jssources/swh/web/assets/src/bundles/origin/visits-reporting.js swh/web/static/jssources/swh/web/assets/src/bundles/revision/diff-utils.js swh/web/static/jssources/swh/web/assets/src/bundles/revision/index.js swh/web/static/jssources/swh/web/assets/src/bundles/revision/log-utils.js swh/web/static/jssources/swh/web/assets/src/bundles/vault/index.js swh/web/static/jssources/swh/web/assets/src/bundles/vault/vault-create-tasks.js swh/web/static/jssources/swh/web/assets/src/bundles/vault/vault-ui.js swh/web/static/jssources/swh/web/assets/src/bundles/vendors/index.js swh/web/static/jssources/swh/web/assets/src/bundles/webapp/code-highlighting.js swh/web/static/jssources/swh/web/assets/src/bundles/webapp/index.js swh/web/static/jssources/swh/web/assets/src/bundles/webapp/notebook-rendering.js swh/web/static/jssources/swh/web/assets/src/bundles/webapp/pdf-rendering.js swh/web/static/jssources/swh/web/assets/src/bundles/webapp/readme-rendering.js swh/web/static/jssources/swh/web/assets/src/bundles/webapp/webapp-utils.js swh/web/static/jssources/swh/web/assets/src/bundles/webapp/xss-filtering.js swh/web/static/jssources/swh/web/assets/src/thirdparty/jquery.tabSlideOut/LICENSE.txt swh/web/static/jssources/swh/web/assets/src/thirdparty/jquery.tabSlideOut/jquery.tabSlideOut.js swh/web/static/jssources/swh/web/assets/src/utils/functions.js swh/web/static/jssources/swh/web/assets/src/utils/heaps-permute.js swh/web/static/jssources/swh/web/assets/src/utils/highlightjs.js swh/web/static/jssources/swh/web/assets/src/utils/org.js swh/web/static/jssources/swh/web/assets/src/utils/showdown.js swh/web/static/jssources/url-search-params-polyfill/LICENSE.txt swh/web/static/jssources/url-search-params-polyfill/index.js swh/web/static/jssources/validate.js/LICENSE.txt swh/web/static/jssources/validate.js/validate.js swh/web/static/jssources/waypoints/licenses.txt.txt swh/web/static/jssources/waypoints/lib/jquery.waypoints.js swh/web/static/jssources/whatwg-fetch/LICENSE.txt swh/web/static/jssources/whatwg-fetch/dist/fetch.umd.js swh/web/static/xml/swh-opensearch.xml swh/web/templates/coverage.html swh/web/templates/error.html swh/web/templates/homepage.html swh/web/templates/jslicenses.html swh/web/templates/layout.html swh/web/templates/login.html swh/web/templates/logout.html swh/web/templates/admin/deposit.html swh/web/templates/admin/origin-save.html swh/web/templates/api/api.html swh/web/templates/api/apidoc.html swh/web/templates/api/endpoints.html swh/web/templates/browse/branches.html swh/web/templates/browse/browse.html swh/web/templates/browse/content.html swh/web/templates/browse/directory.html swh/web/templates/browse/help.html swh/web/templates/browse/layout.html swh/web/templates/browse/origin-save.html swh/web/templates/browse/origin-visits.html swh/web/templates/browse/person.html swh/web/templates/browse/release.html swh/web/templates/browse/releases.html swh/web/templates/browse/revision-log.html swh/web/templates/browse/revision.html swh/web/templates/browse/search.html swh/web/templates/browse/vault-ui.html swh/web/templates/includes/apidoc-header.html swh/web/templates/includes/apidoc-header.md swh/web/templates/includes/breadcrumbs.html swh/web/templates/includes/content-display.html swh/web/templates/includes/directory-display.html swh/web/templates/includes/empty-snapshot.html swh/web/templates/includes/global-modals.html swh/web/templates/includes/http-error.html swh/web/templates/includes/readme-display.html swh/web/templates/includes/show-metadata.html swh/web/templates/includes/show-swh-ids.html swh/web/templates/includes/snapshot-context.html swh/web/templates/includes/take-new-snapshot.html swh/web/templates/includes/top-navigation.html swh/web/templates/includes/vault-create-tasks.html swh/web/tests/__init__.py swh/web/tests/conftest.py swh/web/tests/data.py swh/web/tests/strategies.py swh/web/tests/testcase.py swh/web/tests/admin/__init__.py swh/web/tests/admin/test_origin_save.py swh/web/tests/api/__init__.py swh/web/tests/api/test_api_lookup.py swh/web/tests/api/test_apidoc.py swh/web/tests/api/test_apiresponse.py swh/web/tests/api/test_utils.py swh/web/tests/api/views/__init__.py swh/web/tests/api/views/test_content.py swh/web/tests/api/views/test_directory.py swh/web/tests/api/views/test_identifiers.py swh/web/tests/api/views/test_origin.py swh/web/tests/api/views/test_origin_save.py swh/web/tests/api/views/test_person.py swh/web/tests/api/views/test_release.py swh/web/tests/api/views/test_revision.py swh/web/tests/api/views/test_snapshot.py swh/web/tests/api/views/test_stat.py swh/web/tests/api/views/test_vault.py swh/web/tests/browse/__init__.py swh/web/tests/browse/test_utils.py swh/web/tests/browse/views/__init__.py swh/web/tests/browse/views/test_content.py swh/web/tests/browse/views/test_directory.py swh/web/tests/browse/views/test_identifiers.py swh/web/tests/browse/views/test_origin.py swh/web/tests/browse/views/test_origin_save.py swh/web/tests/browse/views/test_person.py swh/web/tests/browse/views/test_release.py swh/web/tests/browse/views/test_revision.py swh/web/tests/common/__init__.py swh/web/tests/common/test_converters.py swh/web/tests/common/test_highlightjs.py swh/web/tests/common/test_origin_visits.py swh/web/tests/common/test_query.py swh/web/tests/common/test_service.py swh/web/tests/common/test_templatetags.py swh/web/tests/common/test_throttling.py swh/web/tests/common/test_utils.py swh/web/tests/resources/repos/highlightjs-line-numbers.js.zip swh/web/tests/resources/repos/highlightjs-line-numbers.js_visit2.zip swh/web/tests/resources/repos/libtess2.zip swh/web/tests/resources/repos/repo_with_submodules.tgz \ No newline at end of file diff --git a/swh.web.egg-info/requires.txt b/swh.web.egg-info/requires.txt index 2466a4c3..44c146df 100644 --- a/swh.web.egg-info/requires.txt +++ b/swh.web.egg-info/requires.txt @@ -1,29 +1,29 @@ beautifulsoup4 Django<2.0,>=1.10.7 djangorestframework>=3.4.0 django_webpack_loader django_js_reverse docutils file_magic>=0.3.0 htmlmin lxml pygments pypandoc python-dateutil pyyaml requests python-memcached sphinx sphinxcontrib-httpdomain -swh.core>=0.0.57 swh.model>=0.0.32 swh.storage>=0.0.140 swh.vault>=0.0.23 swh.indexer>=0.0.120 swh.scheduler>=0.0.31 [testing] pytest pytest-django hypothesis +swh.core[http]>=0.0.61 swh.loader.git>=0.0.47 diff --git a/swh/web/admin/deposit.py b/swh/web/admin/deposit.py index 1f88f3a0..874d070e 100644 --- a/swh/web/admin/deposit.py +++ b/swh/web/admin/deposit.py @@ -1,85 +1,91 @@ -# Copyright (C) 2018 The Software Heritage developers +# Copyright (C) 2018-2019 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import json import requests from django.core.cache import cache from django.conf import settings from django.contrib.admin.views.decorators import staff_member_required from django.core.paginator import Paginator from django.http import HttpResponse from django.shortcuts import render from requests.auth import HTTPBasicAuth from swh.web.admin.adminurls import admin_route from swh.web.config import get_config config = get_config()['deposit'] @admin_route(r'deposit/', view_name='admin-deposit') @staff_member_required(login_url=settings.LOGIN_URL) def _admin_origin_save(request): return render(request, 'admin/deposit.html') @admin_route(r'deposit/list/', view_name='admin-deposit-list') @staff_member_required(login_url=settings.LOGIN_URL) def _admin_deposit_list(request): table_data = {} table_data['draw'] = int(request.GET['draw']) deposits_list_url = config['private_api_url'] + 'deposits' deposits_list_auth = HTTPBasicAuth(config['private_api_user'], config['private_api_password']) try: nb_deposits = requests.get('%s?page_size=1' % deposits_list_url, auth=deposits_list_auth).json()['count'] deposits_data = cache.get('swh-deposit-list') if not deposits_data or deposits_data['count'] != nb_deposits: deposits_data = requests.get('%s?page_size=%s' % (deposits_list_url, nb_deposits), auth=deposits_list_auth).json() cache.set('swh-deposit-list', deposits_data) deposits = deposits_data['results'] search_value = request.GET['search[value]'] if search_value: deposits = \ [d for d in deposits if any(search_value.lower() in val for val in [str(v).lower() for v in d.values()])] column_order = request.GET['order[0][column]'] field_order = request.GET['columns[%s][name]' % column_order] order_dir = request.GET['order[0][dir]'] deposits = sorted(deposits, key=lambda d: d[field_order] or '') if order_dir == 'desc': deposits = list(reversed(deposits)) length = int(request.GET['length']) page = int(request.GET['start']) / length + 1 paginator = Paginator(deposits, length) data = paginator.page(page).object_list table_data['recordsTotal'] = deposits_data['count'] table_data['recordsFiltered'] = len(deposits) - table_data['data'] = [{'id': d['id'], - 'external_id': d['external_id'], - 'reception_date': d['reception_date'], - 'status': d['status'], - 'status_detail': d['status_detail'], - 'swh_id': d['swh_id'] - } for d in data] + table_data['data'] = [{ + 'id': d['id'], + 'external_id': d['external_id'], + 'reception_date': d['reception_date'], + 'status': d['status'], + 'status_detail': d['status_detail'], + 'swh_anchor_id': d['swh_anchor_id'], + 'swh_anchor_id_context': d['swh_anchor_id_context'], + 'swh_id': d['swh_id'], + 'swh_id_context': d['swh_id_context'] + } for d in data] + except Exception: - table_data['error'] = 'An error occurred while retrieving the list of deposits !' # noqa + table_data['error'] = ('An error occurred while retrieving ' + 'the list of deposits !') return HttpResponse(json.dumps(table_data), content_type='application/json') diff --git a/swh/web/assets/src/bundles/admin/deposit.js b/swh/web/assets/src/bundles/admin/deposit.js index a899964e..5e8493eb 100644 --- a/swh/web/assets/src/bundles/admin/deposit.js +++ b/swh/web/assets/src/bundles/admin/deposit.js @@ -1,79 +1,135 @@ +/** + * Copyright (C) 2018-2019 The Software Heritage developers + * See the AUTHORS file at the top-level directory of this distribution + * License: GNU Affero General Public License version 3, or any later version + * See top-level LICENSE file for more information + */ + +function genSwhLink(data, type) { + if (type === 'display') { + if (data && data.startsWith('swh')) { + let browseUrl = Urls.browse_swh_id(data); + return `${data}`; + } + } + return data; +} + export function initDepositAdmin() { let depositsTable; $(document).ready(() => { $.fn.dataTable.ext.errMode = 'none'; depositsTable = $('#swh-admin-deposit-list') .on('error.dt', (e, settings, techNote, message) => { $('#swh-admin-deposit-list-error').text(message); }) .DataTable({ serverSide: true, ajax: Urls.admin_deposit_list(), columns: [ { data: 'id', name: 'id' }, { - data: 'external_id', - name: 'external_id', + data: 'swh_id_context', + name: 'swh_id_context', render: (data, type, row) => { - if (type === 'display') { - if (data && data.startsWith('hal')) { - return `${data}`; + if (data && type === 'display') { + let originPattern = ';origin='; + let originPatternIdx = data.indexOf(originPattern); + if (originPatternIdx !== -1) { + let originUrl = data.slice(originPatternIdx + originPattern.length); + return `${originUrl}`; } } return data; } }, { data: 'reception_date', name: 'reception_date', render: (data, type, row) => { if (type === 'display') { let date = new Date(data); return date.toLocaleString(); } return data; } }, { data: 'status', name: 'status' }, { data: 'status_detail', name: 'status_detail', render: (data, type, row) => { if (type === 'display' && data) { let text = data; if (typeof data === 'object') { text = JSON.stringify(data, null, 4); } return `
${text}
`; } return data; }, + orderable: false, + visible: false + }, + { + data: 'swh_anchor_id', + name: 'swh_anchor_id', + render: (data, type, row) => { + return genSwhLink(data, type); + }, orderable: false }, + { + data: 'swh_anchor_id_context', + name: 'swh_anchor_id_context', + render: (data, type, row) => { + return genSwhLink(data, type); + }, + orderable: false, + visible: false + }, { data: 'swh_id', name: 'swh_id', render: (data, type, row) => { - if (type === 'display') { - if (data && data.startsWith('swh')) { - let browseUrl = Urls.browse_swh_id(data); - return `${data}`; - } - } - return data; - } + return genSwhLink(data, type); + }, + orderable: false, + visible: false + }, + { + data: 'swh_id_context', + name: 'swh_id_context', + render: (data, type, row) => { + return genSwhLink(data, type); + }, + orderable: false, + visible: false } ], + scrollX: true, scrollY: '50vh', scrollCollapse: true, order: [[0, 'desc']] }); depositsTable.draw(); }); + + $('a.toggle-col').on('click', function(e) { + e.preventDefault(); + var column = depositsTable.column($(this).attr('data-column')); + column.visible(!column.visible()); + if (column.visible()) { + $(this).removeClass('col-hidden'); + } else { + $(this).addClass('col-hidden'); + } + }); + } diff --git a/swh/web/assets/src/bundles/webapp/webapp.css b/swh/web/assets/src/bundles/webapp/webapp.css index 27299ff3..ccf30767 100644 --- a/swh/web/assets/src/bundles/webapp/webapp.css +++ b/swh/web/assets/src/bundles/webapp/webapp.css @@ -1,477 +1,485 @@ /** - * Copyright (C) 2018 The Software Heritage developers + * Copyright (C) 2018-2019 The Software Heritage developers * See the AUTHORS file at the top-level directory of this distribution * License: GNU Affero General Public License version 3, or any later version * See top-level LICENSE file for more information */ html { height: 100%; overflow-x: hidden; } body { min-height: 100%; margin: 0; position: relative; padding-bottom: 120px; } a:active, a.active { outline: none; } code { background-color: #f9f2f4; } pre code { background-color: transparent; } footer { background-color: #262626; color: #fff; font-size: 0.8rem; position: absolute; bottom: 0; width: 100%; padding-top: 20px; padding-bottom: 20px; } footer a, footer a:visited, footer a:hover { color: #fecd1b; } footer a:hover { text-decoration: underline; } .link-color { color: #fecd1b; } pre { background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 4px; padding: 9.5px; font-size: 0.8rem; } .btn.active { background-color: #e7e7e7; } .card { margin-bottom: 5px !important; overflow-x: auto; } .navbar-brand { padding: 5px; margin-right: 0; } .table { margin-bottom: 0; } .swh-table thead { background-color: #f2f4f5; border-top: 1px solid rgba(0, 0, 0, 0.2); font-weight: normal; } .swh-table-striped th { border-top: none; } .swh-table-striped tbody tr:nth-child(even) { background-color: #f2f4f5; } .swh-table-striped tbody tr:nth-child(odd) { background-color: #fff; } .swh-web-app-link a { text-decoration: none; border: none; } .swh-web-app-link:hover { background-color: #efeff2; } .table > thead > tr > th { border-top: none; border-bottom: 1px solid #e20026; } .table > tbody > tr > td { border-style: none; } .sitename .first-word, .sitename .second-word { color: rgba(0, 0, 0, 0.75); font-weight: normal; font-size: 1.2rem; } .sitename .first-word { font-family: 'Alegreya Sans', sans-serif; } .sitename .second-word { font-family: 'Alegreya', serif; } .swh-counter { font-size: 150%; } .swh-http-error { margin: 0 auto; text-align: center; } .swh-http-error-head { color: #2d353c; font-size: 30px; } .swh-http-error-code { bottom: 60%; color: #2d353c; font-size: 96px; line-height: 80px; margin-bottom: 10px !important; } .swh-http-error-desc { font-size: 12px; color: #647788; text-align: center; } .swh-http-error-desc pre { display: inline-block; text-align: left; max-width: 800px; white-space: pre-wrap; } .popover { max-width: 100%; z-index: 2000; } .modal { text-align: center; padding: 0 !important; } .modal::before { content: ''; display: inline-block; height: 100%; vertical-align: middle; margin-right: -4px; } .modal-dialog { display: inline-block; text-align: left; vertical-align: middle; } .dropdown-submenu { position: relative; } .dropdown-submenu .dropdown-menu { top: 0; left: -100%; margin-top: -5px; margin-left: -2px; } .dropdown-item:hover, .dropdown-item:focus { background-color: rgba(0, 0, 0, 0.1); } a.dropdown-left::before { content: "\f0d9"; font-family: 'FontAwesome'; display: block; width: 20px; height: 20px; float: left; margin-left: 0; } #swh-navbar { border-top-style: none; border-left-style: none; border-right-style: none; border-bottom-style: solid; border-bottom-width: 5px; border-image: linear-gradient(to right, rgb(226, 0, 38) 0%, rgb(254, 205, 27) 100%) 1 1 1 1; width: 100%; padding: 5px; margin-bottom: 10px; margin-top: 30px; justify-content: normal; flex-wrap: nowrap; height: 72px; overflow: hidden; } #back-to-top { display: initial; position: fixed; bottom: 30px; right: 30px; z-index: 10; } #back-to-top a img { display: block; width: 32px; height: 32px; background-size: 32px 32px; text-indent: -999px; overflow: hidden; } .swh-top-bar { direction: ltr; height: 30px; position: fixed; top: 0; left: 0; width: 100%; z-index: 99999; background-color: #262626; color: #fff; text-align: center; font-size: 14px; } .swh-top-bar ul { margin-top: 4px; padding-left: 0; white-space: nowrap; } .swh-top-bar li { display: inline-block; margin-left: 10px; margin-right: 10px; } .swh-top-bar a, .swh-top-bar a:visited { color: white; } .swh-top-bar a.swh-current-site, .swh-top-bar a.swh-current-site:visited { color: #fecd1b; } .swh-position-right { position: absolute; right: 0; } .swh-donate-link { border: 1px solid #fecd1b; background-color: #e20026; color: white !important; padding: 3px; border-radius: 3px; } .swh-navbar-content h4 { padding-top: 7px; } .swh-navbar-content .bread-crumbs { display: block; margin-left: -40px; } .swh-navbar-content .bread-crumbs li.bc-no-root { padding-top: 7px; } .main-sidebar { margin-top: 30px; } .content-wrapper { background: none; } .brand-image { max-height: 40px; } .brand-link { padding-top: 18.5px; padding-bottom: 18px; padding-left: 4px; border-bottom: 5px solid #e20026 !important; } .navbar-header a, ul.dropdown-menu a, ul.navbar-nav a, ul.nav-sidebar a { border-bottom-style: none; color: #323232; } .swh-sidebar .nav-link.active { color: #323232 !important; background-color: #e7e7e7 !important; } .swh-image-error { width: 80px; height: auto; } @media (max-width: 600px) { .swh-image-error { width: 40px; height: auto; } .swh-navbar-content h4 { font-size: 1rem; } } .form-check-label { padding-top: 4px; } .swh-id-option { display: inline-block; margin-right: 5px; line-height: 1rem; } .nav-pills .nav-link:not(.active):hover { color: rgba(0, 0, 0, 0.55); } .swh-heading-color { color: #e20026 !important; } .sidebar-mini.sidebar-collapse .main-sidebar:hover { width: 4.6rem; } .sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel > .info, .sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar .nav-link p, .sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-text { visibility: hidden !important; } .sidebar .nav-link p, .main-sidebar .brand-text, .sidebar .user-panel .info { transition: none; } .sidebar-mini.sidebar-mini.sidebar-collapse .sidebar { padding-right: 0; } .swh-words-logo { position: absolute; top: 0; left: 0; width: 73px; height: 73px; text-align: center; font-size: 10pt; color: rgba(0, 0, 0, 0.75); } .swh-words-logo:hover { text-decoration: none; } .swh-words-logo-swh { line-height: 1; padding-top: 13px; visibility: hidden; } hr.swh-faded-line { border: 0; height: 1px; background-image: linear-gradient(to left, #f0f0f0, #8c8b8b, #f0f0f0); } .swh-readme-txt pre { background: none; border: none; } .swh-coverage-col { padding-left: 10px; padding-right: 10px; } .swh-coverage { height: calc(65px + 1em); padding-top: 0.3rem; border: none; } .swh-coverage a { text-decoration: none; } .swh-coverage-logo { display: block; width: 100%; height: 50px; margin-left: auto; margin-right: auto; object-fit: contain; /* polyfill for old browsers, see https://github.com/bfred-it/object-fit-images */ font-family: 'object-fit: contain;'; } .swh-coverage-list { width: 100%; height: 320px; border: none; } tr.swh-tr-hover-highlight:hover td { background: #ededed; } tr.swh-api-doc-route a { text-decoration: none; } .swh-apidoc .col { margin: 10px; } + +a.toggle-col { + text-decoration: none; +} + +a.toggle-col.col-hidden { + text-decoration: line-through; +} diff --git a/swh/web/static/css/webapp.705444d32d34e3bc5043.css.map b/swh/web/static/css/webapp.705444d32d34e3bc5043.css.map deleted file mode 100644 index f9d6c27e..00000000 --- a/swh/web/static/css/webapp.705444d32d34e3bc5043.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webapp.css","breadcrumbs.css","notebook.css"],"names":[],"mappings":"AAOA,KACI,WAAY,CACZ,iBACJ,CAEA,KACI,eAAgB,CAChB,QAAS,CACT,iBAAkB,CAClB,oBACJ,CAEA,kBAEI,YACJ,CAEA,KACI,wBACJ,CAEA,SACI,4BACJ,CAEA,OACI,wBAAyB,CACzB,UAAW,CACX,eAAiB,CACjB,iBAAkB,CAClB,QAAS,CACT,UAAW,CACX,gBAAiB,CACjB,mBACJ,CAEA,yCAGI,aACJ,CAEA,eACI,yBACJ,CAEA,YACI,aACJ,CAEA,IACI,wBAAyB,CACzB,qBAAsB,CACtB,yBAAkB,CAAlB,sBAAkB,CAAlB,iBAAkB,CAClB,aAAc,CACd,eACJ,CAEA,YACI,wBACJ,CAEA,MACI,2BAA6B,CAC7B,eACJ,CAEA,cACI,WAAY,CACZ,cACJ,CAEA,OACI,eACJ,CAEA,iBACI,wBAAyB,CACzB,mCAAwC,CACxC,eACJ,CAEA,sBACI,eACJ,CAEA,0CACI,wBACJ,CAEA,2CACI,qBACJ,CAEA,oBACI,oBAAqB,CACrB,WACJ,CAEA,wBACI,wBACJ,CAEA,mBACI,eAAgB,CAChB,+BACJ,CAEA,mBACI,iBACJ,CAEA,6CAEI,qBAA0B,CAC1B,eAAmB,CACnB,gBACJ,CAEA,sBACI,oCACJ,CAEA,uBACI,0BACJ,CAEA,aACI,cACJ,CAEA,gBACI,aAAc,CACd,iBACJ,CAEA,qBACI,aAAc,CACd,cACJ,CAEA,qBACI,UAAW,CACX,aAAc,CACd,cAAe,CACf,gBAAiB,CACjB,4BACJ,CAEA,qBACI,cAAe,CACf,aAAc,CACd,iBACJ,CAEA,yBACI,oBAAqB,CACrB,eAAgB,CAChB,eAAgB,CAChB,oBACJ,CAEA,SACI,cAAe,CACf,YACJ,CAEA,OACI,iBAAkB,CAClB,mBACJ,CAEA,cACI,UAAW,CAEX,WAAY,CAEZ,iBACJ,CAEA,4BANI,oBAAqB,CAErB,qBAQJ,CAJA,cAEI,eAEJ,CAEA,kBACI,iBACJ,CAEA,iCACI,KAAM,CACN,UAAW,CACX,eAAgB,CAChB,gBACJ,CAEA,0CAEI,+BACJ,CAEA,uBACI,eAAgB,CAChB,uBAA0B,CAC1B,aAAc,CACd,UAAW,CACX,WAAY,CACZ,UAAW,CACX,aACJ,CAEA,YAII,4BAA0B,CAC1B,uBAAwB,CACxB,kGAA2F,CAA3F,0EAA2F,CAA3F,2EAA2F,CAA3F,uEAA2F,CAA3F,0FAA2F,CAA3F,6DAA2F,CAC3F,UAAW,CACX,WAAY,CACZ,kBAAmB,CACnB,eAAgB,CAChB,uBAAuB,CAAvB,8BAAuB,CAAvB,oBAAuB,CAAvB,sBAAuB,CACvB,wBAAiB,CAAjB,gBAAiB,CACjB,WAAY,CACZ,eACJ,CAEA,aACI,eAAgB,CAChB,cAAe,CACf,WAAY,CACZ,UAAW,CACX,UACJ,CAEA,mBACI,aAAc,CACd,UAAW,CACX,WAAY,CACZ,iCAA0B,CAA1B,8BAA0B,CAA1B,yBAA0B,CAC1B,kBAAmB,CACnB,eACJ,CAEA,aACI,aAAc,CACd,WAAY,CACZ,cAAe,CACf,KAAM,CACN,MAAO,CACP,UAAW,CACX,aAAc,CACd,wBAAyB,CACzB,UAAW,CACX,iBAAkB,CAClB,cACJ,CAEA,gBACI,cAAe,CACf,cAAe,CACf,kBACJ,CAEA,gBACI,oBAAqB,CACrB,gBAAiB,CACjB,iBACJ,CAEA,sCAEI,UACJ,CAEA,wEAEI,aACJ,CAEA,oBACI,iBAAkB,CAClB,OACJ,CAEA,iBACI,wBAAyB,CACzB,wBAAyB,CACzB,oBAAuB,CACvB,WAAY,CACZ,yBAAkB,CAAlB,sBAAkB,CAAlB,iBACJ,CAEA,uBACI,eACJ,CAEA,kCACI,aAAc,CACd,iBACJ,CAEA,gDACI,eACJ,CAEA,cACI,eACJ,CAEA,iBACI,eACJ,CAEA,aACI,eACJ,CAEA,YACI,kBAAmB,CACnB,mBAAoB,CACpB,gBAAiB,CACjB,yCACJ,CAEA,qEAII,wBAAyB,CACzB,aACJ,CAEA,8BACI,uBAAyB,CACzB,kCACJ,CAEA,iBACI,UAAW,CACX,WACJ,CAEA,yBACI,iBACI,UAAW,CACX,WACJ,CAEA,uBACI,cACJ,CACJ,CAEA,kBACI,eACJ,CAEA,eACI,oBAAqB,CACrB,gBAAiB,CACjB,gBACJ,CAEA,wCACI,qBACJ,CAEA,mBACI,uBACJ,CAEA,mDACI,YACJ,CAEA,gNAGI,2BACJ,CAEA,0EAGI,uBAAgB,CAAhB,kBAAgB,CAAhB,oBAAgB,CAAhB,eACJ,CAEA,qDACI,eACJ,CAEA,gBACI,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,UAAW,CACX,WAAY,CACZ,iBAAkB,CAClB,cAAe,CACf,qBACJ,CAEA,sBACI,oBACJ,CAEA,oBACI,aAAc,CACd,gBAAiB,CACjB,iBACJ,CAEA,kBACI,QAAS,CACT,UAAW,CACX,0GAAqE,CAArE,uEAAqE,CAArE,oEAAqE,CAArE,kEAAqE,CAArE,gEACJ,CAEA,oBACI,eAAgB,CAChB,WACJ,CAEA,kBACI,iBAAkB,CAClB,kBACJ,CAEA,cACI,+BAAwB,CAAxB,4BAAwB,CAAxB,uBAAwB,CACxB,iBAAmB,CACnB,WACJ,CAEA,gBACI,oBACJ,CAEA,mBACI,aAAc,CACd,UAAW,CACX,WAAY,CACZ,gBAAiB,CACjB,iBAAkB,CAClB,qBAAmB,CAAnB,kBAAmB,CAGnB,kCACJ,CAEA,mBACI,UAAW,CACX,YAAa,CACb,WACJ,CAEA,mCACI,kBACJ,CAEA,uBACI,oBACJ,CAEA,iBACI,WACJ,CCrdA,cACI,oBAAqB,CACrB,eAAgB,CAChB,qBACJ,CAEA,iBACI,oBAAqB,CACrB,WACJ,CAEA,iBACI,UAAW,CACX,oBACJ,CAEA,gBACI,qBAA0B,CAC1B,wBACJ,CAEA,sBACI,qBAA0B,CAC1B,yBACJ,CCtBA,aACI,eAAgB,CAChB,gBAAiB,CACjB,iBACJ,CAEA,cACI,SACJ,CAEA,sBAEI,oBAAqB,CACrB,YAAa,CACb,iBACJ,CAEA,WACI,qBACJ,CAEA,kBACI,eACJ,CAEA,iBACI,qBAAsB,CACtB,wBACJ,CAEA,cACI,eACJ,CAEA,4BAEI,qBAAsB,CACtB,aAAe,CACf,eAAgB,CAChB,qBAAsB,CACtB,wBACJ,CAEA,SACI,iBACJ,CAEA,aACI,oBAAqB,CACrB,wBAAyB,CACzB,iDAAuD,CACvD,WAAY,CACZ,aACJ,CAEA,UACI,wBAAyB,CACzB,yBAAkB,CAAlB,sBAAkB,CAAlB,iBAAkB,CAClB,kBAAmB,CACnB,WAAa,CACb,SACJ,CAEA,iBACI,qBAAwB,CACxB,WAAY,CACZ,SAAU,CACV,4BAA6B,CAC7B,eACJ,CAEA,WACI,cAAe,CACf,eAAgB,CAChB,gBAAkB,CAClB,iBACJ,CAEA,eACI,cACJ,CAEA,mCAEI,iBAAkB,CAClB,qBAAsB,CACtB,UAAW,CACX,WAAY,CACZ,SAAU,CACV,gBAAiB,CACjB,cACJ,CAEA,iBACI,4CAA6C,CAC7C,aACJ,CAEA,kBACI,6CAA8C,CAC9C,aACJ,CAEA,kCACI,yBACJ,CAEA,mCAEI,eAAgB,CAChB,gBACJ,CAEA,cACI,WACJ,CAEA,eACI,yBACJ,CAEA,oCACI,aACI,cACJ,CAEA,UACI,wBACJ,CAEA,mCAEI,eACJ,CAEA,iBACI,SAAW,CACX,QACJ,CAEA,kBACI,iBAAkB,CAClB,MAAO,CACP,KACJ,CACJ","file":"webapp.705444d32d34e3bc5043.css","sourcesContent":["/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nhtml {\n height: 100%;\n overflow-x: hidden;\n}\n\nbody {\n min-height: 100%;\n margin: 0;\n position: relative;\n padding-bottom: 120px;\n}\n\na:active,\na.active {\n outline: none;\n}\n\ncode {\n background-color: #f9f2f4;\n}\n\npre code {\n background-color: transparent;\n}\n\nfooter {\n background-color: #262626;\n color: #fff;\n font-size: 0.8rem;\n position: absolute;\n bottom: 0;\n width: 100%;\n padding-top: 20px;\n padding-bottom: 20px;\n}\n\nfooter a,\nfooter a:visited,\nfooter a:hover {\n color: #fecd1b;\n}\n\nfooter a:hover {\n text-decoration: underline;\n}\n\n.link-color {\n color: #fecd1b;\n}\n\npre {\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n padding: 9.5px;\n font-size: 0.8rem;\n}\n\n.btn.active {\n background-color: #e7e7e7;\n}\n\n.card {\n margin-bottom: 5px !important;\n overflow-x: auto;\n}\n\n.navbar-brand {\n padding: 5px;\n margin-right: 0;\n}\n\n.table {\n margin-bottom: 0;\n}\n\n.swh-table thead {\n background-color: #f2f4f5;\n border-top: 1px solid rgba(0, 0, 0, 0.2);\n font-weight: normal;\n}\n\n.swh-table-striped th {\n border-top: none;\n}\n\n.swh-table-striped tbody tr:nth-child(even) {\n background-color: #f2f4f5;\n}\n\n.swh-table-striped tbody tr:nth-child(odd) {\n background-color: #fff;\n}\n\n.swh-web-app-link a {\n text-decoration: none;\n border: none;\n}\n\n.swh-web-app-link:hover {\n background-color: #efeff2;\n}\n\n.table > thead > tr > th {\n border-top: none;\n border-bottom: 1px solid #e20026;\n}\n\n.table > tbody > tr > td {\n border-style: none;\n}\n\n.sitename .first-word,\n.sitename .second-word {\n color: rgba(0, 0, 0, 0.75);\n font-weight: normal;\n font-size: 1.2rem;\n}\n\n.sitename .first-word {\n font-family: 'Alegreya Sans', sans-serif;\n}\n\n.sitename .second-word {\n font-family: 'Alegreya', serif;\n}\n\n.swh-counter {\n font-size: 150%;\n}\n\n.swh-http-error {\n margin: 0 auto;\n text-align: center;\n}\n\n.swh-http-error-head {\n color: #2d353c;\n font-size: 30px;\n}\n\n.swh-http-error-code {\n bottom: 60%;\n color: #2d353c;\n font-size: 96px;\n line-height: 80px;\n margin-bottom: 10px !important;\n}\n\n.swh-http-error-desc {\n font-size: 12px;\n color: #647788;\n text-align: center;\n}\n\n.swh-http-error-desc pre {\n display: inline-block;\n text-align: left;\n max-width: 800px;\n white-space: pre-wrap;\n}\n\n.popover {\n max-width: 100%;\n z-index: 2000;\n}\n\n.modal {\n text-align: center;\n padding: 0 !important;\n}\n\n.modal::before {\n content: '';\n display: inline-block;\n height: 100%;\n vertical-align: middle;\n margin-right: -4px;\n}\n\n.modal-dialog {\n display: inline-block;\n text-align: left;\n vertical-align: middle;\n}\n\n.dropdown-submenu {\n position: relative;\n}\n\n.dropdown-submenu .dropdown-menu {\n top: 0;\n left: -100%;\n margin-top: -5px;\n margin-left: -2px;\n}\n\n.dropdown-item:hover,\n.dropdown-item:focus {\n background-color: rgba(0, 0, 0, 0.1);\n}\n\na.dropdown-left::before {\n content: \"\\f0d9\";\n font-family: 'FontAwesome';\n display: block;\n width: 20px;\n height: 20px;\n float: left;\n margin-left: 0;\n}\n\n#swh-navbar {\n border-top-style: none;\n border-left-style: none;\n border-right-style: none;\n border-bottom-style: solid;\n border-bottom-width: 5px;\n border-image: linear-gradient(to right, rgb(226, 0, 38) 0%, rgb(254, 205, 27) 100%) 1 1 1 1;\n width: 100%;\n padding: 5px;\n margin-bottom: 10px;\n margin-top: 30px;\n justify-content: normal;\n flex-wrap: nowrap;\n height: 72px;\n overflow: hidden;\n}\n\n#back-to-top {\n display: initial;\n position: fixed;\n bottom: 30px;\n right: 30px;\n z-index: 10;\n}\n\n#back-to-top a img {\n display: block;\n width: 32px;\n height: 32px;\n background-size: 32px 32px;\n text-indent: -999px;\n overflow: hidden;\n}\n\n.swh-top-bar {\n direction: ltr;\n height: 30px;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n z-index: 99999;\n background-color: #262626;\n color: #fff;\n text-align: center;\n font-size: 14px;\n}\n\n.swh-top-bar ul {\n margin-top: 4px;\n padding-left: 0;\n white-space: nowrap;\n}\n\n.swh-top-bar li {\n display: inline-block;\n margin-left: 10px;\n margin-right: 10px;\n}\n\n.swh-top-bar a,\n.swh-top-bar a:visited {\n color: white;\n}\n\n.swh-top-bar a.swh-current-site,\n.swh-top-bar a.swh-current-site:visited {\n color: #fecd1b;\n}\n\n.swh-position-right {\n position: absolute;\n right: 0;\n}\n\n.swh-donate-link {\n border: 1px solid #fecd1b;\n background-color: #e20026;\n color: white !important;\n padding: 3px;\n border-radius: 3px;\n}\n\n.swh-navbar-content h4 {\n padding-top: 7px;\n}\n\n.swh-navbar-content .bread-crumbs {\n display: block;\n margin-left: -40px;\n}\n\n.swh-navbar-content .bread-crumbs li.bc-no-root {\n padding-top: 7px;\n}\n\n.main-sidebar {\n margin-top: 30px;\n}\n\n.content-wrapper {\n background: none;\n}\n\n.brand-image {\n max-height: 40px;\n}\n\n.brand-link {\n padding-top: 18.5px;\n padding-bottom: 18px;\n padding-left: 4px;\n border-bottom: 5px solid #e20026 !important;\n}\n\n.navbar-header a,\nul.dropdown-menu a,\nul.navbar-nav a,\nul.nav-sidebar a {\n border-bottom-style: none;\n color: #323232;\n}\n\n.swh-sidebar .nav-link.active {\n color: #323232 !important;\n background-color: #e7e7e7 !important;\n}\n\n.swh-image-error {\n width: 80px;\n height: auto;\n}\n\n@media (max-width: 600px) {\n .swh-image-error {\n width: 40px;\n height: auto;\n }\n\n .swh-navbar-content h4 {\n font-size: 1rem;\n }\n}\n\n.form-check-label {\n padding-top: 4px;\n}\n\n.swh-id-option {\n display: inline-block;\n margin-right: 5px;\n line-height: 1rem;\n}\n\n.nav-pills .nav-link:not(.active):hover {\n color: rgba(0, 0, 0, 0.55);\n}\n\n.swh-heading-color {\n color: #e20026 !important;\n}\n\n.sidebar-mini.sidebar-collapse .main-sidebar:hover {\n width: 4.6rem;\n}\n\n.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel > .info,\n.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar .nav-link p,\n.sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-text {\n visibility: hidden !important;\n}\n\n.sidebar .nav-link p,\n.main-sidebar .brand-text,\n.sidebar .user-panel .info {\n transition: none;\n}\n\n.sidebar-mini.sidebar-mini.sidebar-collapse .sidebar {\n padding-right: 0;\n}\n\n.swh-words-logo {\n position: absolute;\n top: 0;\n left: 0;\n width: 73px;\n height: 73px;\n text-align: center;\n font-size: 10pt;\n color: rgba(0, 0, 0, 0.75);\n}\n\n.swh-words-logo:hover {\n text-decoration: none;\n}\n\n.swh-words-logo-swh {\n line-height: 1;\n padding-top: 13px;\n visibility: hidden;\n}\n\nhr.swh-faded-line {\n border: 0;\n height: 1px;\n background-image: linear-gradient(to left, #f0f0f0, #8c8b8b, #f0f0f0);\n}\n\n.swh-readme-txt pre {\n background: none;\n border: none;\n}\n\n.swh-coverage-col {\n padding-left: 10px;\n padding-right: 10px;\n}\n\n.swh-coverage {\n height: calc(65px + 1em);\n padding-top: 0.3rem;\n border: none;\n}\n\n.swh-coverage a {\n text-decoration: none;\n}\n\n.swh-coverage-logo {\n display: block;\n width: 100%;\n height: 50px;\n margin-left: auto;\n margin-right: auto;\n object-fit: contain;\n\n /* polyfill for old browsers, see https://github.com/bfred-it/object-fit-images */\n font-family: 'object-fit: contain;';\n}\n\n.swh-coverage-list {\n width: 100%;\n height: 320px;\n border: none;\n}\n\ntr.swh-tr-hover-highlight:hover td {\n background: #ededed;\n}\n\ntr.swh-api-doc-route a {\n text-decoration: none;\n}\n\n.swh-apidoc .col {\n margin: 10px;\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n.bread-crumbs {\n display: inline-block;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.55);\n}\n\n.bread-crumbs ul {\n list-style-type: none;\n height: 100%;\n}\n\n.bread-crumbs li {\n float: left;\n list-style-type: none;\n}\n\n.bread-crumbs a {\n color: rgba(0, 0, 0, 0.75);\n border-bottom-style: none;\n}\n\n.bread-crumbs a:hover {\n color: rgba(0, 0, 0, 0.85);\n text-decoration: underline;\n}\n","/**\n * Copyright (C) 2019 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n/* Adapted from https://github.com/jsvine/nbpreview/blob/master/css/vendor/notebook.css */\n\n.nb-notebook {\n line-height: 1.5;\n padding-left: 6em;\n overflow-y: hidden;\n}\n\n.nb-worksheet {\n width: 99%;\n}\n\n.nb-stdout,\n.nb-stderr {\n white-space: pre-wrap;\n margin: 1em 0;\n padding: 0.1em 0.5em;\n}\n\n.nb-stderr {\n background-color: #faa;\n}\n\n.nb-cell + .nb-cell {\n margin-top: 0.5em;\n}\n\n.nb-output table {\n border: 1px solid #000;\n border-collapse: collapse;\n}\n\n.nb-output th {\n font-weight: bold;\n}\n\n.nb-output th,\n.nb-output td {\n border: 1px solid #000;\n padding: 0.25em;\n text-align: left;\n vertical-align: middle;\n border-collapse: collapse;\n}\n\n.nb-cell {\n position: relative;\n}\n\n.nb-raw-cell {\n white-space: pre-wrap;\n background-color: #f5f2f0;\n font-family: Consolas, Monaco, 'Andale Mono', monospace;\n padding: 1em;\n margin: 0 0.5em;\n}\n\n.nb-input {\n border: 1px solid #cfcfcf;\n border-radius: 2px;\n background: #f7f7f7;\n margin: 0.4em;\n padding: 0;\n}\n\n.nb-notebook pre {\n margin: 0.4em !important;\n border: none;\n padding: 0;\n background-color: transparent;\n min-height: 1rem;\n}\n\n.nb-output {\n min-height: 1em;\n overflow-x: auto;\n margin-left: 0.5em;\n margin-right: 0.5em;\n}\n\n.nb-output img {\n max-width: 100%;\n}\n\n.nb-output::before,\n.nb-input::before {\n position: absolute;\n font-family: monospace;\n color: #999;\n left: -7.5em;\n width: 7em;\n text-align: right;\n font-size: 14px;\n}\n\n.nb-input::before {\n content: \"In [\" attr(data-prompt-number) \"]:\";\n color: #303f9f;\n}\n\n.nb-output::before {\n content: \"Out [\" attr(data-prompt-number) \"]:\";\n color: #d84315;\n}\n\n.nb-latex-output .MathJax_Display {\n text-align: left !important;\n}\n\n.nb-markdown-cell,\n.nb-heading-cell {\n margin-left: 1em;\n margin-right: 1em;\n}\n\n.nb-code-cell {\n margin: 0.4em;\n}\n\n.nb-output pre {\n margin-top: 0.2em !important;\n}\n\n@media screen and (max-width: 600px) {\n .nb-notebook {\n padding-left: 0;\n }\n\n .nb-input {\n margin-top: 2em !important;\n }\n\n .nb-output::before,\n .nb-input::before {\n text-align: left;\n }\n\n .nb-input::before {\n left: 0.5em;\n top: -2em;\n }\n\n .nb-output::before {\n position: relative;\n left: 0;\n top: 0;\n }\n}\n"]} \ No newline at end of file diff --git a/swh/web/static/css/webapp.705444d32d34e3bc5043.css b/swh/web/static/css/webapp.b979e897536467ca4793.css similarity index 75% rename from swh/web/static/css/webapp.705444d32d34e3bc5043.css rename to swh/web/static/css/webapp.b979e897536467ca4793.css index d52b3fa9..c9134079 100644 --- a/swh/web/static/css/webapp.705444d32d34e3bc5043.css +++ b/swh/web/static/css/webapp.b979e897536467ca4793.css @@ -1,2 +1,2 @@ -html{height:100%;overflow-x:hidden}body{min-height:100%;margin:0;position:relative;padding-bottom:120px}a.active,a:active{outline:none}code{background-color:#f9f2f4}pre code{background-color:transparent}footer{background-color:#262626;color:#fff;font-size:.8rem;position:absolute;bottom:0;width:100%;padding-top:20px;padding-bottom:20px}footer a,footer a:hover,footer a:visited{color:#fecd1b}footer a:hover{text-decoration:underline}.link-color{color:#fecd1b}pre{background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:9.5px;font-size:.8rem}.btn.active{background-color:#e7e7e7}.card{margin-bottom:5px!important;overflow-x:auto}.navbar-brand{padding:5px;margin-right:0}.table{margin-bottom:0}.swh-table thead{background-color:#f2f4f5;border-top:1px solid rgba(0,0,0,.2);font-weight:400}.swh-table-striped th{border-top:none}.swh-table-striped tbody tr:nth-child(2n){background-color:#f2f4f5}.swh-table-striped tbody tr:nth-child(odd){background-color:#fff}.swh-web-app-link a{text-decoration:none;border:none}.swh-web-app-link:hover{background-color:#efeff2}.table>thead>tr>th{border-top:none;border-bottom:1px solid #e20026}.table>tbody>tr>td{border-style:none}.sitename .first-word,.sitename .second-word{color:rgba(0,0,0,.75);font-weight:400;font-size:1.2rem}.sitename .first-word{font-family:Alegreya Sans,sans-serif}.sitename .second-word{font-family:Alegreya,serif}.swh-counter{font-size:150%}.swh-http-error{margin:0 auto;text-align:center}.swh-http-error-head{color:#2d353c;font-size:30px}.swh-http-error-code{bottom:60%;color:#2d353c;font-size:96px;line-height:80px;margin-bottom:10px!important}.swh-http-error-desc{font-size:12px;color:#647788;text-align:center}.swh-http-error-desc pre{display:inline-block;text-align:left;max-width:800px;white-space:pre-wrap}.popover{max-width:100%;z-index:2000}.modal{text-align:center;padding:0!important}.modal:before{content:"";height:100%;margin-right:-4px}.modal-dialog,.modal:before{display:inline-block;vertical-align:middle}.modal-dialog{text-align:left}.dropdown-submenu{position:relative}.dropdown-submenu .dropdown-menu{top:0;left:-100%;margin-top:-5px;margin-left:-2px}.dropdown-item:focus,.dropdown-item:hover{background-color:rgba(0,0,0,.1)}a.dropdown-left:before{content:"\f0d9";font-family:FontAwesome;display:block;width:20px;height:20px;float:left;margin-left:0}#swh-navbar{border-style:none none solid;border-bottom-width:5px;-webkit-border-image:-webkit-gradient(linear,left top,right top,from(#e20026),to(#fecd1b)) 1 1 1 1;-webkit-border-image:-webkit-linear-gradient(left,#e20026,#fecd1b) 1 1 1 1;-moz-border-image:-moz-linear-gradient(left,#e20026 0,#fecd1b 100%) 1 1 1 1;-o-border-image:-o-linear-gradient(left,#e20026 0,#fecd1b 100%) 1 1 1 1;border-image:-webkit-gradient(linear,left top,right top,from(#e20026),to(#fecd1b)) 1 1 1 1;border-image:linear-gradient(90deg,#e20026 0,#fecd1b) 1 1 1 1;width:100%;padding:5px;margin-bottom:10px;margin-top:30px;-webkit-box-pack:normal;-webkit-justify-content:normal;-moz-box-pack:normal;justify-content:normal;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;height:72px;overflow:hidden}#back-to-top{display:initial;position:fixed;bottom:30px;right:30px;z-index:10}#back-to-top a img{display:block;width:32px;height:32px;-webkit-background-size:32px 32px;-moz-background-size:32px 32px;background-size:32px 32px;text-indent:-999px;overflow:hidden}.swh-top-bar{direction:ltr;height:30px;position:fixed;top:0;left:0;width:100%;z-index:99999;background-color:#262626;color:#fff;text-align:center;font-size:14px}.swh-top-bar ul{margin-top:4px;padding-left:0;white-space:nowrap}.swh-top-bar li{display:inline-block;margin-left:10px;margin-right:10px}.swh-top-bar a,.swh-top-bar a:visited{color:#fff}.swh-top-bar a.swh-current-site,.swh-top-bar a.swh-current-site:visited{color:#fecd1b}.swh-position-right{position:absolute;right:0}.swh-donate-link{border:1px solid #fecd1b;background-color:#e20026;color:#fff!important;padding:3px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.swh-navbar-content h4{padding-top:7px}.swh-navbar-content .bread-crumbs{display:block;margin-left:-40px}.swh-navbar-content .bread-crumbs li.bc-no-root{padding-top:7px}.main-sidebar{margin-top:30px}.content-wrapper{background:none}.brand-image{max-height:40px}.brand-link{padding-top:18.5px;padding-bottom:18px;padding-left:4px;border-bottom:5px solid #e20026!important}.navbar-header a,ul.dropdown-menu a,ul.nav-sidebar a,ul.navbar-nav a{border-bottom-style:none;color:#323232}.swh-sidebar .nav-link.active{color:#323232!important;background-color:#e7e7e7!important}.swh-image-error{width:80px;height:auto}@media (max-width:600px){.swh-image-error{width:40px;height:auto}.swh-navbar-content h4{font-size:1rem}}.form-check-label{padding-top:4px}.swh-id-option{display:inline-block;margin-right:5px;line-height:1rem}.nav-pills .nav-link:not(.active):hover{color:rgba(0,0,0,.55)}.swh-heading-color{color:#e20026!important}.sidebar-mini.sidebar-collapse .main-sidebar:hover{width:4.6rem}.sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-text,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar .nav-link p,.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel>.info{visibility:hidden!important}.main-sidebar .brand-text,.sidebar .nav-link p,.sidebar .user-panel .info{-webkit-transition:none;-o-transition:none;-moz-transition:none;transition:none}.sidebar-mini.sidebar-mini.sidebar-collapse .sidebar{padding-right:0}.swh-words-logo{position:absolute;top:0;left:0;width:73px;height:73px;text-align:center;font-size:10pt;color:rgba(0,0,0,.75)}.swh-words-logo:hover{text-decoration:none}.swh-words-logo-swh{line-height:1;padding-top:13px;visibility:hidden}hr.swh-faded-line{border:0;height:1px;background-image:-webkit-gradient(linear,right top,left top,from(#f0f0f0),color-stop(#8c8b8b),to(#f0f0f0));background-image:-webkit-linear-gradient(right,#f0f0f0,#8c8b8b,#f0f0f0);background-image:-moz-linear-gradient(right,#f0f0f0,#8c8b8b,#f0f0f0);background-image:-o-linear-gradient(right,#f0f0f0,#8c8b8b,#f0f0f0);background-image:linear-gradient(270deg,#f0f0f0,#8c8b8b,#f0f0f0)}.swh-readme-txt pre{background:none;border:none}.swh-coverage-col{padding-left:10px;padding-right:10px}.swh-coverage{height:-webkit-calc(65px + 1em);height:-moz-calc(65px + 1em);height:calc(65px + 1em);padding-top:.3rem;border:none}.swh-coverage a{text-decoration:none}.swh-coverage-logo{display:block;width:100%;height:50px;margin-left:auto;margin-right:auto;-o-object-fit:contain;object-fit:contain;font-family:"object-fit: contain;"}.swh-coverage-list{width:100%;height:320px;border:none}tr.swh-tr-hover-highlight:hover td{background:#ededed}tr.swh-api-doc-route a{text-decoration:none}.swh-apidoc .col{margin:10px}.bread-crumbs{display:inline-block;overflow:hidden;color:rgba(0,0,0,.55)}.bread-crumbs ul{list-style-type:none;height:100%}.bread-crumbs li{float:left;list-style-type:none}.bread-crumbs a{color:rgba(0,0,0,.75);border-bottom-style:none}.bread-crumbs a:hover{color:rgba(0,0,0,.85);text-decoration:underline}.nb-notebook{line-height:1.5;padding-left:6em;overflow-y:hidden}.nb-worksheet{width:99%}.nb-stderr,.nb-stdout{white-space:pre-wrap;margin:1em 0;padding:.1em .5em}.nb-stderr{background-color:#faa}.nb-cell+.nb-cell{margin-top:.5em}.nb-output table{border:1px solid #000;border-collapse:collapse}.nb-output th{font-weight:700}.nb-output td,.nb-output th{border:1px solid #000;padding:.25em;text-align:left;vertical-align:middle;border-collapse:collapse}.nb-cell{position:relative}.nb-raw-cell{white-space:pre-wrap;background-color:#f5f2f0;font-family:Consolas,Monaco,Andale Mono,monospace;padding:1em;margin:0 .5em}.nb-input{border:1px solid #cfcfcf;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#f7f7f7;margin:.4em;padding:0}.nb-notebook pre{margin:.4em!important;border:none;padding:0;background-color:transparent;min-height:1rem}.nb-output{min-height:1em;overflow-x:auto;margin-left:.5em;margin-right:.5em}.nb-output img{max-width:100%}.nb-input:before,.nb-output:before{position:absolute;font-family:monospace;color:#999;left:-7.5em;width:7em;text-align:right;font-size:14px}.nb-input:before{content:"In [" attr(data-prompt-number) "]:";color:#303f9f}.nb-output:before{content:"Out [" attr(data-prompt-number) "]:";color:#d84315}.nb-latex-output .MathJax_Display{text-align:left!important}.nb-heading-cell,.nb-markdown-cell{margin-left:1em;margin-right:1em}.nb-code-cell{margin:.4em}.nb-output pre{margin-top:.2em!important}@media screen and (max-width:600px){.nb-notebook{padding-left:0}.nb-input{margin-top:2em!important}.nb-input:before,.nb-output:before{text-align:left}.nb-input:before{left:.5em;top:-2em}.nb-output:before{position:relative;left:0;top:0}} -/*# sourceMappingURL=webapp.705444d32d34e3bc5043.css.map */ \ No newline at end of file +html{height:100%;overflow-x:hidden}body{min-height:100%;margin:0;position:relative;padding-bottom:120px}a.active,a:active{outline:none}code{background-color:#f9f2f4}pre code{background-color:transparent}footer{background-color:#262626;color:#fff;font-size:.8rem;position:absolute;bottom:0;width:100%;padding-top:20px;padding-bottom:20px}footer a,footer a:hover,footer a:visited{color:#fecd1b}footer a:hover{text-decoration:underline}.link-color{color:#fecd1b}pre{background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:9.5px;font-size:.8rem}.btn.active{background-color:#e7e7e7}.card{margin-bottom:5px!important;overflow-x:auto}.navbar-brand{padding:5px;margin-right:0}.table{margin-bottom:0}.swh-table thead{background-color:#f2f4f5;border-top:1px solid rgba(0,0,0,.2);font-weight:400}.swh-table-striped th{border-top:none}.swh-table-striped tbody tr:nth-child(2n){background-color:#f2f4f5}.swh-table-striped tbody tr:nth-child(odd){background-color:#fff}.swh-web-app-link a{text-decoration:none;border:none}.swh-web-app-link:hover{background-color:#efeff2}.table>thead>tr>th{border-top:none;border-bottom:1px solid #e20026}.table>tbody>tr>td{border-style:none}.sitename .first-word,.sitename .second-word{color:rgba(0,0,0,.75);font-weight:400;font-size:1.2rem}.sitename .first-word{font-family:Alegreya Sans,sans-serif}.sitename .second-word{font-family:Alegreya,serif}.swh-counter{font-size:150%}.swh-http-error{margin:0 auto;text-align:center}.swh-http-error-head{color:#2d353c;font-size:30px}.swh-http-error-code{bottom:60%;color:#2d353c;font-size:96px;line-height:80px;margin-bottom:10px!important}.swh-http-error-desc{font-size:12px;color:#647788;text-align:center}.swh-http-error-desc pre{display:inline-block;text-align:left;max-width:800px;white-space:pre-wrap}.popover{max-width:100%;z-index:2000}.modal{text-align:center;padding:0!important}.modal:before{content:"";height:100%;margin-right:-4px}.modal-dialog,.modal:before{display:inline-block;vertical-align:middle}.modal-dialog{text-align:left}.dropdown-submenu{position:relative}.dropdown-submenu .dropdown-menu{top:0;left:-100%;margin-top:-5px;margin-left:-2px}.dropdown-item:focus,.dropdown-item:hover{background-color:rgba(0,0,0,.1)}a.dropdown-left:before{content:"\f0d9";font-family:FontAwesome;display:block;width:20px;height:20px;float:left;margin-left:0}#swh-navbar{border-style:none none solid;border-bottom-width:5px;-webkit-border-image:-webkit-gradient(linear,left top,right top,from(#e20026),to(#fecd1b)) 1 1 1 1;-webkit-border-image:-webkit-linear-gradient(left,#e20026,#fecd1b) 1 1 1 1;-moz-border-image:-moz-linear-gradient(left,#e20026 0,#fecd1b 100%) 1 1 1 1;-o-border-image:-o-linear-gradient(left,#e20026 0,#fecd1b 100%) 1 1 1 1;border-image:-webkit-gradient(linear,left top,right top,from(#e20026),to(#fecd1b)) 1 1 1 1;border-image:linear-gradient(90deg,#e20026 0,#fecd1b) 1 1 1 1;width:100%;padding:5px;margin-bottom:10px;margin-top:30px;-webkit-box-pack:normal;-webkit-justify-content:normal;-moz-box-pack:normal;justify-content:normal;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;height:72px;overflow:hidden}#back-to-top{display:initial;position:fixed;bottom:30px;right:30px;z-index:10}#back-to-top a img{display:block;width:32px;height:32px;-webkit-background-size:32px 32px;-moz-background-size:32px 32px;background-size:32px 32px;text-indent:-999px;overflow:hidden}.swh-top-bar{direction:ltr;height:30px;position:fixed;top:0;left:0;width:100%;z-index:99999;background-color:#262626;color:#fff;text-align:center;font-size:14px}.swh-top-bar ul{margin-top:4px;padding-left:0;white-space:nowrap}.swh-top-bar li{display:inline-block;margin-left:10px;margin-right:10px}.swh-top-bar a,.swh-top-bar a:visited{color:#fff}.swh-top-bar a.swh-current-site,.swh-top-bar a.swh-current-site:visited{color:#fecd1b}.swh-position-right{position:absolute;right:0}.swh-donate-link{border:1px solid #fecd1b;background-color:#e20026;color:#fff!important;padding:3px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.swh-navbar-content h4{padding-top:7px}.swh-navbar-content .bread-crumbs{display:block;margin-left:-40px}.swh-navbar-content .bread-crumbs li.bc-no-root{padding-top:7px}.main-sidebar{margin-top:30px}.content-wrapper{background:none}.brand-image{max-height:40px}.brand-link{padding-top:18.5px;padding-bottom:18px;padding-left:4px;border-bottom:5px solid #e20026!important}.navbar-header a,ul.dropdown-menu a,ul.nav-sidebar a,ul.navbar-nav a{border-bottom-style:none;color:#323232}.swh-sidebar .nav-link.active{color:#323232!important;background-color:#e7e7e7!important}.swh-image-error{width:80px;height:auto}@media (max-width:600px){.swh-image-error{width:40px;height:auto}.swh-navbar-content h4{font-size:1rem}}.form-check-label{padding-top:4px}.swh-id-option{display:inline-block;margin-right:5px;line-height:1rem}.nav-pills .nav-link:not(.active):hover{color:rgba(0,0,0,.55)}.swh-heading-color{color:#e20026!important}.sidebar-mini.sidebar-collapse .main-sidebar:hover{width:4.6rem}.sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-text,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar .nav-link p,.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel>.info{visibility:hidden!important}.main-sidebar .brand-text,.sidebar .nav-link p,.sidebar .user-panel .info{-webkit-transition:none;-o-transition:none;-moz-transition:none;transition:none}.sidebar-mini.sidebar-mini.sidebar-collapse .sidebar{padding-right:0}.swh-words-logo{position:absolute;top:0;left:0;width:73px;height:73px;text-align:center;font-size:10pt;color:rgba(0,0,0,.75)}.swh-words-logo:hover{text-decoration:none}.swh-words-logo-swh{line-height:1;padding-top:13px;visibility:hidden}hr.swh-faded-line{border:0;height:1px;background-image:-webkit-gradient(linear,right top,left top,from(#f0f0f0),color-stop(#8c8b8b),to(#f0f0f0));background-image:-webkit-linear-gradient(right,#f0f0f0,#8c8b8b,#f0f0f0);background-image:-moz-linear-gradient(right,#f0f0f0,#8c8b8b,#f0f0f0);background-image:-o-linear-gradient(right,#f0f0f0,#8c8b8b,#f0f0f0);background-image:linear-gradient(270deg,#f0f0f0,#8c8b8b,#f0f0f0)}.swh-readme-txt pre{background:none;border:none}.swh-coverage-col{padding-left:10px;padding-right:10px}.swh-coverage{height:-webkit-calc(65px + 1em);height:-moz-calc(65px + 1em);height:calc(65px + 1em);padding-top:.3rem;border:none}.swh-coverage a{text-decoration:none}.swh-coverage-logo{display:block;width:100%;height:50px;margin-left:auto;margin-right:auto;-o-object-fit:contain;object-fit:contain;font-family:"object-fit: contain;"}.swh-coverage-list{width:100%;height:320px;border:none}tr.swh-tr-hover-highlight:hover td{background:#ededed}tr.swh-api-doc-route a{text-decoration:none}.swh-apidoc .col{margin:10px}a.toggle-col{text-decoration:none}a.toggle-col.col-hidden{text-decoration:line-through}.bread-crumbs{display:inline-block;overflow:hidden;color:rgba(0,0,0,.55)}.bread-crumbs ul{list-style-type:none;height:100%}.bread-crumbs li{float:left;list-style-type:none}.bread-crumbs a{color:rgba(0,0,0,.75);border-bottom-style:none}.bread-crumbs a:hover{color:rgba(0,0,0,.85);text-decoration:underline}.nb-notebook{line-height:1.5;padding-left:6em;overflow-y:hidden}.nb-worksheet{width:99%}.nb-stderr,.nb-stdout{white-space:pre-wrap;margin:1em 0;padding:.1em .5em}.nb-stderr{background-color:#faa}.nb-cell+.nb-cell{margin-top:.5em}.nb-output table{border:1px solid #000;border-collapse:collapse}.nb-output th{font-weight:700}.nb-output td,.nb-output th{border:1px solid #000;padding:.25em;text-align:left;vertical-align:middle;border-collapse:collapse}.nb-cell{position:relative}.nb-raw-cell{white-space:pre-wrap;background-color:#f5f2f0;font-family:Consolas,Monaco,Andale Mono,monospace;padding:1em;margin:0 .5em}.nb-input{border:1px solid #cfcfcf;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#f7f7f7;margin:.4em;padding:0}.nb-notebook pre{margin:.4em!important;border:none;padding:0;background-color:transparent;min-height:1rem}.nb-output{min-height:1em;overflow-x:auto;margin-left:.5em;margin-right:.5em}.nb-output img{max-width:100%}.nb-input:before,.nb-output:before{position:absolute;font-family:monospace;color:#999;left:-7.5em;width:7em;text-align:right;font-size:14px}.nb-input:before{content:"In [" attr(data-prompt-number) "]:";color:#303f9f}.nb-output:before{content:"Out [" attr(data-prompt-number) "]:";color:#d84315}.nb-latex-output .MathJax_Display{text-align:left!important}.nb-heading-cell,.nb-markdown-cell{margin-left:1em;margin-right:1em}.nb-code-cell{margin:.4em}.nb-output pre{margin-top:.2em!important}@media screen and (max-width:600px){.nb-notebook{padding-left:0}.nb-input{margin-top:2em!important}.nb-input:before,.nb-output:before{text-align:left}.nb-input:before{left:.5em;top:-2em}.nb-output:before{position:relative;left:0;top:0}} +/*# sourceMappingURL=webapp.b979e897536467ca4793.css.map */ \ No newline at end of file diff --git a/swh/web/static/css/webapp.b979e897536467ca4793.css.map b/swh/web/static/css/webapp.b979e897536467ca4793.css.map new file mode 100644 index 00000000..f3fe1907 --- /dev/null +++ b/swh/web/static/css/webapp.b979e897536467ca4793.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webapp.css","breadcrumbs.css","notebook.css"],"names":[],"mappings":"AAOA,KACI,WAAY,CACZ,iBACJ,CAEA,KACI,eAAgB,CAChB,QAAS,CACT,iBAAkB,CAClB,oBACJ,CAEA,kBAEI,YACJ,CAEA,KACI,wBACJ,CAEA,SACI,4BACJ,CAEA,OACI,wBAAyB,CACzB,UAAW,CACX,eAAiB,CACjB,iBAAkB,CAClB,QAAS,CACT,UAAW,CACX,gBAAiB,CACjB,mBACJ,CAEA,yCAGI,aACJ,CAEA,eACI,yBACJ,CAEA,YACI,aACJ,CAEA,IACI,wBAAyB,CACzB,qBAAsB,CACtB,yBAAkB,CAAlB,sBAAkB,CAAlB,iBAAkB,CAClB,aAAc,CACd,eACJ,CAEA,YACI,wBACJ,CAEA,MACI,2BAA6B,CAC7B,eACJ,CAEA,cACI,WAAY,CACZ,cACJ,CAEA,OACI,eACJ,CAEA,iBACI,wBAAyB,CACzB,mCAAwC,CACxC,eACJ,CAEA,sBACI,eACJ,CAEA,0CACI,wBACJ,CAEA,2CACI,qBACJ,CAEA,oBACI,oBAAqB,CACrB,WACJ,CAEA,wBACI,wBACJ,CAEA,mBACI,eAAgB,CAChB,+BACJ,CAEA,mBACI,iBACJ,CAEA,6CAEI,qBAA0B,CAC1B,eAAmB,CACnB,gBACJ,CAEA,sBACI,oCACJ,CAEA,uBACI,0BACJ,CAEA,aACI,cACJ,CAEA,gBACI,aAAc,CACd,iBACJ,CAEA,qBACI,aAAc,CACd,cACJ,CAEA,qBACI,UAAW,CACX,aAAc,CACd,cAAe,CACf,gBAAiB,CACjB,4BACJ,CAEA,qBACI,cAAe,CACf,aAAc,CACd,iBACJ,CAEA,yBACI,oBAAqB,CACrB,eAAgB,CAChB,eAAgB,CAChB,oBACJ,CAEA,SACI,cAAe,CACf,YACJ,CAEA,OACI,iBAAkB,CAClB,mBACJ,CAEA,cACI,UAAW,CAEX,WAAY,CAEZ,iBACJ,CAEA,4BANI,oBAAqB,CAErB,qBAQJ,CAJA,cAEI,eAEJ,CAEA,kBACI,iBACJ,CAEA,iCACI,KAAM,CACN,UAAW,CACX,eAAgB,CAChB,gBACJ,CAEA,0CAEI,+BACJ,CAEA,uBACI,eAAgB,CAChB,uBAA0B,CAC1B,aAAc,CACd,UAAW,CACX,WAAY,CACZ,UAAW,CACX,aACJ,CAEA,YAII,4BAA0B,CAC1B,uBAAwB,CACxB,kGAA2F,CAA3F,0EAA2F,CAA3F,2EAA2F,CAA3F,uEAA2F,CAA3F,0FAA2F,CAA3F,6DAA2F,CAC3F,UAAW,CACX,WAAY,CACZ,kBAAmB,CACnB,eAAgB,CAChB,uBAAuB,CAAvB,8BAAuB,CAAvB,oBAAuB,CAAvB,sBAAuB,CACvB,wBAAiB,CAAjB,gBAAiB,CACjB,WAAY,CACZ,eACJ,CAEA,aACI,eAAgB,CAChB,cAAe,CACf,WAAY,CACZ,UAAW,CACX,UACJ,CAEA,mBACI,aAAc,CACd,UAAW,CACX,WAAY,CACZ,iCAA0B,CAA1B,8BAA0B,CAA1B,yBAA0B,CAC1B,kBAAmB,CACnB,eACJ,CAEA,aACI,aAAc,CACd,WAAY,CACZ,cAAe,CACf,KAAM,CACN,MAAO,CACP,UAAW,CACX,aAAc,CACd,wBAAyB,CACzB,UAAW,CACX,iBAAkB,CAClB,cACJ,CAEA,gBACI,cAAe,CACf,cAAe,CACf,kBACJ,CAEA,gBACI,oBAAqB,CACrB,gBAAiB,CACjB,iBACJ,CAEA,sCAEI,UACJ,CAEA,wEAEI,aACJ,CAEA,oBACI,iBAAkB,CAClB,OACJ,CAEA,iBACI,wBAAyB,CACzB,wBAAyB,CACzB,oBAAuB,CACvB,WAAY,CACZ,yBAAkB,CAAlB,sBAAkB,CAAlB,iBACJ,CAEA,uBACI,eACJ,CAEA,kCACI,aAAc,CACd,iBACJ,CAEA,gDACI,eACJ,CAEA,cACI,eACJ,CAEA,iBACI,eACJ,CAEA,aACI,eACJ,CAEA,YACI,kBAAmB,CACnB,mBAAoB,CACpB,gBAAiB,CACjB,yCACJ,CAEA,qEAII,wBAAyB,CACzB,aACJ,CAEA,8BACI,uBAAyB,CACzB,kCACJ,CAEA,iBACI,UAAW,CACX,WACJ,CAEA,yBACI,iBACI,UAAW,CACX,WACJ,CAEA,uBACI,cACJ,CACJ,CAEA,kBACI,eACJ,CAEA,eACI,oBAAqB,CACrB,gBAAiB,CACjB,gBACJ,CAEA,wCACI,qBACJ,CAEA,mBACI,uBACJ,CAEA,mDACI,YACJ,CAEA,gNAGI,2BACJ,CAEA,0EAGI,uBAAgB,CAAhB,kBAAgB,CAAhB,oBAAgB,CAAhB,eACJ,CAEA,qDACI,eACJ,CAEA,gBACI,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,UAAW,CACX,WAAY,CACZ,iBAAkB,CAClB,cAAe,CACf,qBACJ,CAEA,sBACI,oBACJ,CAEA,oBACI,aAAc,CACd,gBAAiB,CACjB,iBACJ,CAEA,kBACI,QAAS,CACT,UAAW,CACX,0GAAqE,CAArE,uEAAqE,CAArE,oEAAqE,CAArE,kEAAqE,CAArE,gEACJ,CAEA,oBACI,eAAgB,CAChB,WACJ,CAEA,kBACI,iBAAkB,CAClB,kBACJ,CAEA,cACI,+BAAwB,CAAxB,4BAAwB,CAAxB,uBAAwB,CACxB,iBAAmB,CACnB,WACJ,CAEA,gBACI,oBACJ,CAEA,mBACI,aAAc,CACd,UAAW,CACX,WAAY,CACZ,gBAAiB,CACjB,iBAAkB,CAClB,qBAAmB,CAAnB,kBAAmB,CAGnB,kCACJ,CAEA,mBACI,UAAW,CACX,YAAa,CACb,WACJ,CAEA,mCACI,kBACJ,CAEA,uBACI,oBACJ,CAEA,iBACI,WACJ,CAEA,aACI,oBACJ,CAEA,wBACI,4BACJ,CC7dA,cACI,oBAAqB,CACrB,eAAgB,CAChB,qBACJ,CAEA,iBACI,oBAAqB,CACrB,WACJ,CAEA,iBACI,UAAW,CACX,oBACJ,CAEA,gBACI,qBAA0B,CAC1B,wBACJ,CAEA,sBACI,qBAA0B,CAC1B,yBACJ,CCtBA,aACI,eAAgB,CAChB,gBAAiB,CACjB,iBACJ,CAEA,cACI,SACJ,CAEA,sBAEI,oBAAqB,CACrB,YAAa,CACb,iBACJ,CAEA,WACI,qBACJ,CAEA,kBACI,eACJ,CAEA,iBACI,qBAAsB,CACtB,wBACJ,CAEA,cACI,eACJ,CAEA,4BAEI,qBAAsB,CACtB,aAAe,CACf,eAAgB,CAChB,qBAAsB,CACtB,wBACJ,CAEA,SACI,iBACJ,CAEA,aACI,oBAAqB,CACrB,wBAAyB,CACzB,iDAAuD,CACvD,WAAY,CACZ,aACJ,CAEA,UACI,wBAAyB,CACzB,yBAAkB,CAAlB,sBAAkB,CAAlB,iBAAkB,CAClB,kBAAmB,CACnB,WAAa,CACb,SACJ,CAEA,iBACI,qBAAwB,CACxB,WAAY,CACZ,SAAU,CACV,4BAA6B,CAC7B,eACJ,CAEA,WACI,cAAe,CACf,eAAgB,CAChB,gBAAkB,CAClB,iBACJ,CAEA,eACI,cACJ,CAEA,mCAEI,iBAAkB,CAClB,qBAAsB,CACtB,UAAW,CACX,WAAY,CACZ,SAAU,CACV,gBAAiB,CACjB,cACJ,CAEA,iBACI,4CAA6C,CAC7C,aACJ,CAEA,kBACI,6CAA8C,CAC9C,aACJ,CAEA,kCACI,yBACJ,CAEA,mCAEI,eAAgB,CAChB,gBACJ,CAEA,cACI,WACJ,CAEA,eACI,yBACJ,CAEA,oCACI,aACI,cACJ,CAEA,UACI,wBACJ,CAEA,mCAEI,eACJ,CAEA,iBACI,SAAW,CACX,QACJ,CAEA,kBACI,iBAAkB,CAClB,MAAO,CACP,KACJ,CACJ","file":"webapp.b979e897536467ca4793.css","sourcesContent":["/**\n * Copyright (C) 2018-2019 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nhtml {\n height: 100%;\n overflow-x: hidden;\n}\n\nbody {\n min-height: 100%;\n margin: 0;\n position: relative;\n padding-bottom: 120px;\n}\n\na:active,\na.active {\n outline: none;\n}\n\ncode {\n background-color: #f9f2f4;\n}\n\npre code {\n background-color: transparent;\n}\n\nfooter {\n background-color: #262626;\n color: #fff;\n font-size: 0.8rem;\n position: absolute;\n bottom: 0;\n width: 100%;\n padding-top: 20px;\n padding-bottom: 20px;\n}\n\nfooter a,\nfooter a:visited,\nfooter a:hover {\n color: #fecd1b;\n}\n\nfooter a:hover {\n text-decoration: underline;\n}\n\n.link-color {\n color: #fecd1b;\n}\n\npre {\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n padding: 9.5px;\n font-size: 0.8rem;\n}\n\n.btn.active {\n background-color: #e7e7e7;\n}\n\n.card {\n margin-bottom: 5px !important;\n overflow-x: auto;\n}\n\n.navbar-brand {\n padding: 5px;\n margin-right: 0;\n}\n\n.table {\n margin-bottom: 0;\n}\n\n.swh-table thead {\n background-color: #f2f4f5;\n border-top: 1px solid rgba(0, 0, 0, 0.2);\n font-weight: normal;\n}\n\n.swh-table-striped th {\n border-top: none;\n}\n\n.swh-table-striped tbody tr:nth-child(even) {\n background-color: #f2f4f5;\n}\n\n.swh-table-striped tbody tr:nth-child(odd) {\n background-color: #fff;\n}\n\n.swh-web-app-link a {\n text-decoration: none;\n border: none;\n}\n\n.swh-web-app-link:hover {\n background-color: #efeff2;\n}\n\n.table > thead > tr > th {\n border-top: none;\n border-bottom: 1px solid #e20026;\n}\n\n.table > tbody > tr > td {\n border-style: none;\n}\n\n.sitename .first-word,\n.sitename .second-word {\n color: rgba(0, 0, 0, 0.75);\n font-weight: normal;\n font-size: 1.2rem;\n}\n\n.sitename .first-word {\n font-family: 'Alegreya Sans', sans-serif;\n}\n\n.sitename .second-word {\n font-family: 'Alegreya', serif;\n}\n\n.swh-counter {\n font-size: 150%;\n}\n\n.swh-http-error {\n margin: 0 auto;\n text-align: center;\n}\n\n.swh-http-error-head {\n color: #2d353c;\n font-size: 30px;\n}\n\n.swh-http-error-code {\n bottom: 60%;\n color: #2d353c;\n font-size: 96px;\n line-height: 80px;\n margin-bottom: 10px !important;\n}\n\n.swh-http-error-desc {\n font-size: 12px;\n color: #647788;\n text-align: center;\n}\n\n.swh-http-error-desc pre {\n display: inline-block;\n text-align: left;\n max-width: 800px;\n white-space: pre-wrap;\n}\n\n.popover {\n max-width: 100%;\n z-index: 2000;\n}\n\n.modal {\n text-align: center;\n padding: 0 !important;\n}\n\n.modal::before {\n content: '';\n display: inline-block;\n height: 100%;\n vertical-align: middle;\n margin-right: -4px;\n}\n\n.modal-dialog {\n display: inline-block;\n text-align: left;\n vertical-align: middle;\n}\n\n.dropdown-submenu {\n position: relative;\n}\n\n.dropdown-submenu .dropdown-menu {\n top: 0;\n left: -100%;\n margin-top: -5px;\n margin-left: -2px;\n}\n\n.dropdown-item:hover,\n.dropdown-item:focus {\n background-color: rgba(0, 0, 0, 0.1);\n}\n\na.dropdown-left::before {\n content: \"\\f0d9\";\n font-family: 'FontAwesome';\n display: block;\n width: 20px;\n height: 20px;\n float: left;\n margin-left: 0;\n}\n\n#swh-navbar {\n border-top-style: none;\n border-left-style: none;\n border-right-style: none;\n border-bottom-style: solid;\n border-bottom-width: 5px;\n border-image: linear-gradient(to right, rgb(226, 0, 38) 0%, rgb(254, 205, 27) 100%) 1 1 1 1;\n width: 100%;\n padding: 5px;\n margin-bottom: 10px;\n margin-top: 30px;\n justify-content: normal;\n flex-wrap: nowrap;\n height: 72px;\n overflow: hidden;\n}\n\n#back-to-top {\n display: initial;\n position: fixed;\n bottom: 30px;\n right: 30px;\n z-index: 10;\n}\n\n#back-to-top a img {\n display: block;\n width: 32px;\n height: 32px;\n background-size: 32px 32px;\n text-indent: -999px;\n overflow: hidden;\n}\n\n.swh-top-bar {\n direction: ltr;\n height: 30px;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n z-index: 99999;\n background-color: #262626;\n color: #fff;\n text-align: center;\n font-size: 14px;\n}\n\n.swh-top-bar ul {\n margin-top: 4px;\n padding-left: 0;\n white-space: nowrap;\n}\n\n.swh-top-bar li {\n display: inline-block;\n margin-left: 10px;\n margin-right: 10px;\n}\n\n.swh-top-bar a,\n.swh-top-bar a:visited {\n color: white;\n}\n\n.swh-top-bar a.swh-current-site,\n.swh-top-bar a.swh-current-site:visited {\n color: #fecd1b;\n}\n\n.swh-position-right {\n position: absolute;\n right: 0;\n}\n\n.swh-donate-link {\n border: 1px solid #fecd1b;\n background-color: #e20026;\n color: white !important;\n padding: 3px;\n border-radius: 3px;\n}\n\n.swh-navbar-content h4 {\n padding-top: 7px;\n}\n\n.swh-navbar-content .bread-crumbs {\n display: block;\n margin-left: -40px;\n}\n\n.swh-navbar-content .bread-crumbs li.bc-no-root {\n padding-top: 7px;\n}\n\n.main-sidebar {\n margin-top: 30px;\n}\n\n.content-wrapper {\n background: none;\n}\n\n.brand-image {\n max-height: 40px;\n}\n\n.brand-link {\n padding-top: 18.5px;\n padding-bottom: 18px;\n padding-left: 4px;\n border-bottom: 5px solid #e20026 !important;\n}\n\n.navbar-header a,\nul.dropdown-menu a,\nul.navbar-nav a,\nul.nav-sidebar a {\n border-bottom-style: none;\n color: #323232;\n}\n\n.swh-sidebar .nav-link.active {\n color: #323232 !important;\n background-color: #e7e7e7 !important;\n}\n\n.swh-image-error {\n width: 80px;\n height: auto;\n}\n\n@media (max-width: 600px) {\n .swh-image-error {\n width: 40px;\n height: auto;\n }\n\n .swh-navbar-content h4 {\n font-size: 1rem;\n }\n}\n\n.form-check-label {\n padding-top: 4px;\n}\n\n.swh-id-option {\n display: inline-block;\n margin-right: 5px;\n line-height: 1rem;\n}\n\n.nav-pills .nav-link:not(.active):hover {\n color: rgba(0, 0, 0, 0.55);\n}\n\n.swh-heading-color {\n color: #e20026 !important;\n}\n\n.sidebar-mini.sidebar-collapse .main-sidebar:hover {\n width: 4.6rem;\n}\n\n.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel > .info,\n.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar .nav-link p,\n.sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-text {\n visibility: hidden !important;\n}\n\n.sidebar .nav-link p,\n.main-sidebar .brand-text,\n.sidebar .user-panel .info {\n transition: none;\n}\n\n.sidebar-mini.sidebar-mini.sidebar-collapse .sidebar {\n padding-right: 0;\n}\n\n.swh-words-logo {\n position: absolute;\n top: 0;\n left: 0;\n width: 73px;\n height: 73px;\n text-align: center;\n font-size: 10pt;\n color: rgba(0, 0, 0, 0.75);\n}\n\n.swh-words-logo:hover {\n text-decoration: none;\n}\n\n.swh-words-logo-swh {\n line-height: 1;\n padding-top: 13px;\n visibility: hidden;\n}\n\nhr.swh-faded-line {\n border: 0;\n height: 1px;\n background-image: linear-gradient(to left, #f0f0f0, #8c8b8b, #f0f0f0);\n}\n\n.swh-readme-txt pre {\n background: none;\n border: none;\n}\n\n.swh-coverage-col {\n padding-left: 10px;\n padding-right: 10px;\n}\n\n.swh-coverage {\n height: calc(65px + 1em);\n padding-top: 0.3rem;\n border: none;\n}\n\n.swh-coverage a {\n text-decoration: none;\n}\n\n.swh-coverage-logo {\n display: block;\n width: 100%;\n height: 50px;\n margin-left: auto;\n margin-right: auto;\n object-fit: contain;\n\n /* polyfill for old browsers, see https://github.com/bfred-it/object-fit-images */\n font-family: 'object-fit: contain;';\n}\n\n.swh-coverage-list {\n width: 100%;\n height: 320px;\n border: none;\n}\n\ntr.swh-tr-hover-highlight:hover td {\n background: #ededed;\n}\n\ntr.swh-api-doc-route a {\n text-decoration: none;\n}\n\n.swh-apidoc .col {\n margin: 10px;\n}\n\na.toggle-col {\n text-decoration: none;\n}\n\na.toggle-col.col-hidden {\n text-decoration: line-through;\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n.bread-crumbs {\n display: inline-block;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.55);\n}\n\n.bread-crumbs ul {\n list-style-type: none;\n height: 100%;\n}\n\n.bread-crumbs li {\n float: left;\n list-style-type: none;\n}\n\n.bread-crumbs a {\n color: rgba(0, 0, 0, 0.75);\n border-bottom-style: none;\n}\n\n.bread-crumbs a:hover {\n color: rgba(0, 0, 0, 0.85);\n text-decoration: underline;\n}\n","/**\n * Copyright (C) 2019 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n/* Adapted from https://github.com/jsvine/nbpreview/blob/master/css/vendor/notebook.css */\n\n.nb-notebook {\n line-height: 1.5;\n padding-left: 6em;\n overflow-y: hidden;\n}\n\n.nb-worksheet {\n width: 99%;\n}\n\n.nb-stdout,\n.nb-stderr {\n white-space: pre-wrap;\n margin: 1em 0;\n padding: 0.1em 0.5em;\n}\n\n.nb-stderr {\n background-color: #faa;\n}\n\n.nb-cell + .nb-cell {\n margin-top: 0.5em;\n}\n\n.nb-output table {\n border: 1px solid #000;\n border-collapse: collapse;\n}\n\n.nb-output th {\n font-weight: bold;\n}\n\n.nb-output th,\n.nb-output td {\n border: 1px solid #000;\n padding: 0.25em;\n text-align: left;\n vertical-align: middle;\n border-collapse: collapse;\n}\n\n.nb-cell {\n position: relative;\n}\n\n.nb-raw-cell {\n white-space: pre-wrap;\n background-color: #f5f2f0;\n font-family: Consolas, Monaco, 'Andale Mono', monospace;\n padding: 1em;\n margin: 0 0.5em;\n}\n\n.nb-input {\n border: 1px solid #cfcfcf;\n border-radius: 2px;\n background: #f7f7f7;\n margin: 0.4em;\n padding: 0;\n}\n\n.nb-notebook pre {\n margin: 0.4em !important;\n border: none;\n padding: 0;\n background-color: transparent;\n min-height: 1rem;\n}\n\n.nb-output {\n min-height: 1em;\n overflow-x: auto;\n margin-left: 0.5em;\n margin-right: 0.5em;\n}\n\n.nb-output img {\n max-width: 100%;\n}\n\n.nb-output::before,\n.nb-input::before {\n position: absolute;\n font-family: monospace;\n color: #999;\n left: -7.5em;\n width: 7em;\n text-align: right;\n font-size: 14px;\n}\n\n.nb-input::before {\n content: \"In [\" attr(data-prompt-number) \"]:\";\n color: #303f9f;\n}\n\n.nb-output::before {\n content: \"Out [\" attr(data-prompt-number) \"]:\";\n color: #d84315;\n}\n\n.nb-latex-output .MathJax_Display {\n text-align: left !important;\n}\n\n.nb-markdown-cell,\n.nb-heading-cell {\n margin-left: 1em;\n margin-right: 1em;\n}\n\n.nb-code-cell {\n margin: 0.4em;\n}\n\n.nb-output pre {\n margin-top: 0.2em !important;\n}\n\n@media screen and (max-width: 600px) {\n .nb-notebook {\n padding-left: 0;\n }\n\n .nb-input {\n margin-top: 2em !important;\n }\n\n .nb-output::before,\n .nb-input::before {\n text-align: left;\n }\n\n .nb-input::before {\n left: 0.5em;\n top: -2em;\n }\n\n .nb-output::before {\n position: relative;\n left: 0;\n top: 0;\n }\n}\n"]} \ No newline at end of file diff --git a/swh/web/static/js/admin.728881fdb561789879dd.js b/swh/web/static/js/admin.728881fdb561789879dd.js deleted file mode 100644 index b84fdb5f..00000000 --- a/swh/web/static/js/admin.728881fdb561789879dd.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.admin=r():(e.swh=e.swh||{},e.swh.admin=r())}(window,function(){return function(e){function r(r){for(var n,o,s=r[0],u=r[1],d=r[2],l=0,f=[];l'+e+"":e}},{data:"reception_date",name:"reception_date",render:function(e,r,t){return"display"===r?new Date(e).toLocaleString():e}},{data:"status",name:"status"},{data:"status_detail",name:"status_detail",render:function(e,r,t){if("display"===r&&e){var n=e;return"object"==typeof e&&(n=i()(e,null,4)),'
'+n+"
"}return e},orderable:!1},{data:"swh_id",name:"swh_id",render:function(e,r,t){if("display"===r&&(e&&e.startsWith("swh")))return''+e+"";return e}}],scrollY:"50vh",scrollCollapse:!0,order:[[0,"desc"]]}).draw()})}},473:function(e,r,t){"use strict";t.d(r,"d",function(){return c}),t.d(r,"b",function(){return l}),t.d(r,"g",function(){return f}),t.d(r,"c",function(){return h}),t.d(r,"j",function(){return v}),t.d(r,"a",function(){return p}),t.d(r,"e",function(){return w}),t.d(r,"h",function(){return _}),t.d(r,"f",function(){return b}),t.d(r,"i",function(){return m});var n,i,a,o,s,u=t(9);function d(e){$(e+" tbody").on("click","tr",function(){$(this).hasClass("selected")?$(this).removeClass("selected"):($(e+" tr.selected").removeClass("selected"),$(this).addClass("selected"))})}function c(){$(document).ready(function(){$.fn.dataTable.ext.errMode="throw",n=$("#swh-authorized-origin-urls").DataTable({serverSide:!0,ajax:Urls.admin_origin_save_authorized_urls_list(),columns:[{data:"url",name:"url"}],scrollY:"50vh",scrollCollapse:!0,info:!1}),d("#swh-authorized-origin-urls"),i=$("#swh-unauthorized-origin-urls").DataTable({serverSide:!0,ajax:Urls.admin_origin_save_unauthorized_urls_list(),columns:[{data:"url",name:"url"}],scrollY:"50vh",scrollCollapse:!0,info:!1}),d("#swh-unauthorized-origin-urls");var e=[{data:"id",name:"id",visible:!1,searchable:!1},{data:"save_request_date",name:"request_date",render:function(e,r,t){return"display"===r?new Date(e).toLocaleString():e}},{data:"origin_type",name:"origin_type"},{data:"origin_url",name:"origin_url",render:function(e,r,t){if("display"===r){var n=$.fn.dataTable.render.text().display(e);return''+n+""}return e}}];a=$("#swh-origin-save-pending-requests").DataTable({serverSide:!0,ajax:Urls.browse_origin_save_requests_list("pending"),searchDelay:1e3,columns:e,scrollY:"50vh",scrollCollapse:!0,order:[[0,"desc"]]}),d("#swh-origin-save-pending-requests"),s=$("#swh-origin-save-rejected-requests").DataTable({serverSide:!0,ajax:Urls.browse_origin_save_requests_list("rejected"),searchDelay:1e3,columns:e,scrollY:"50vh",scrollCollapse:!0,order:[[0,"desc"]]}),d("#swh-origin-save-rejected-requests"),e.push({data:"save_task_status",name:"save_task_status",render:function(e,r,t){return"succeed"===e?''+e+"":e}}),o=$("#swh-origin-save-accepted-requests").DataTable({serverSide:!0,ajax:Urls.browse_origin_save_requests_list("accepted"),searchDelay:1e3,columns:e,scrollY:"50vh",scrollCollapse:!0,order:[[0,"desc"]]}),d("#swh-origin-save-accepted-requests"),$("#swh-origin-save-requests-nav-item").on("shown.bs.tab",function(){a.draw()}),$("#swh-origin-save-url-filters-nav-item").on("shown.bs.tab",function(){n.draw()}),$("#swh-authorized-origins-tab").on("shown.bs.tab",function(){n.draw()}),$("#swh-unauthorized-origins-tab").on("shown.bs.tab",function(){i.draw()}),$("#swh-save-requests-pending-tab").on("shown.bs.tab",function(){a.draw()}),$("#swh-save-requests-accepted-tab").on("shown.bs.tab",function(){o.draw()}),$("#swh-save-requests-rejected-tab").on("shown.bs.tab",function(){s.draw()}),$("#swh-save-requests-pending-tab").click(function(){a.ajax.reload(null,!1)}),$("#swh-save-requests-accepted-tab").click(function(){o.ajax.reload(null,!1)}),$("#swh-save-requests-rejected-tab").click(function(){s.ajax.reload(null,!1)})})}function l(){var e=$("#swh-authorized-url-prefix").val(),r=Urls.admin_origin_save_add_authorized_url(e);Object(u.a)(r).then(u.b).then(function(){n.row.add({url:e}).draw()}).catch(function(e){swh.webapp.showModalMessage("Duplicated origin url prefix","The provided origin url prefix is already registered in the authorized list.")})}function f(){var e=$("#swh-authorized-origin-urls tr.selected").text();if(e){var r=Urls.admin_origin_save_remove_authorized_url(e);Object(u.a)(r).then(u.b).then(function(){n.row(".selected").remove().draw()}).catch(function(){})}}function h(){var e=$("#swh-unauthorized-url-prefix").val(),r=Urls.admin_origin_save_add_unauthorized_url(e);Object(u.a)(r).then(u.b).then(function(){i.row.add({url:e}).draw()}).catch(function(){swh.webapp.showModalMessage("Duplicated origin url prefix","The provided origin url prefix is already registered in the unauthorized list.")})}function v(){var e=$("#swh-unauthorized-origin-urls tr.selected").text();if(e){var r=Urls.admin_origin_save_remove_unauthorized_url(e);Object(u.a)(r).then(u.b).then(function(){i.row(".selected").remove().draw()}).catch(function(){})}}function p(){var e=a.row(".selected");if(e.length){swh.webapp.showModalConfirm("Accept origin save request ?","Are you sure to accept this origin save request ?",function(){var r=e.data(),t=Urls.admin_origin_save_request_accept(r.origin_type,r.origin_url);Object(u.a)(t).then(function(){a.ajax.reload(null,!1)})})}}function w(){var e=a.row(".selected");if(e.length){swh.webapp.showModalConfirm("Reject origin save request ?","Are you sure to reject this origin save request ?",function(){var r=e.data(),t=Urls.admin_origin_save_request_reject(r.origin_type,r.origin_url);Object(u.a)(t).then(function(){a.ajax.reload(null,!1)})})}}function g(e){var r=e.row(".selected");if(r.length){var t=r.data().id;swh.webapp.showModalConfirm("Remove origin save request ?","Are you sure to remove this origin save request ?",function(){var r=Urls.admin_origin_save_request_remove(t);Object(u.a)(r).then(function(){e.ajax.reload(null,!1)})})}}function _(){g(a)}function b(){g(o)}function m(){g(s)}},56:function(e,r,t){e.exports=t(153)},756:function(e,r,t){e.exports=t(757)},757:function(e,r,t){"use strict";t.r(r);var n=t(472);t.d(r,"initDepositAdmin",function(){return n.a});var i=t(473);t.d(r,"initOriginSaveAdmin",function(){return i.d}),t.d(r,"addAuthorizedOriginUrl",function(){return i.b}),t.d(r,"removeAuthorizedOriginUrl",function(){return i.g}),t.d(r,"addUnauthorizedOriginUrl",function(){return i.c}),t.d(r,"removeUnauthorizedOriginUrl",function(){return i.j}),t.d(r,"acceptOriginSaveRequest",function(){return i.a}),t.d(r,"rejectOriginSaveRequest",function(){return i.e}),t.d(r,"removePendingOriginSaveRequest",function(){return i.h}),t.d(r,"removeAcceptedOriginSaveRequest",function(){return i.f}),t.d(r,"removeRejectedOriginSaveRequest",function(){return i.i})},9:function(e,r,t){"use strict";function n(e){if(!e.ok)throw e;return e}function i(e){for(var r=0;r {\n $.fn.dataTable.ext.errMode = 'none';\n depositsTable = $('#swh-admin-deposit-list')\n .on('error.dt', (e, settings, techNote, message) => {\n $('#swh-admin-deposit-list-error').text(message);\n })\n .DataTable({\n serverSide: true,\n ajax: Urls.admin_deposit_list(),\n columns: [\n {\n data: 'id',\n name: 'id'\n },\n {\n data: 'external_id',\n name: 'external_id',\n render: (data, type, row) => {\n if (type === 'display') {\n if (data && data.startsWith('hal')) {\n return `${data}`;\n }\n }\n return data;\n }\n },\n {\n data: 'reception_date',\n name: 'reception_date',\n render: (data, type, row) => {\n if (type === 'display') {\n let date = new Date(data);\n return date.toLocaleString();\n }\n return data;\n }\n },\n {\n data: 'status',\n name: 'status'\n },\n {\n data: 'status_detail',\n name: 'status_detail',\n render: (data, type, row) => {\n if (type === 'display' && data) {\n let text = data;\n if (typeof data === 'object') {\n text = JSON.stringify(data, null, 4);\n }\n return `
${text}
`;\n }\n return data;\n },\n orderable: false\n },\n {\n data: 'swh_id',\n name: 'swh_id',\n render: (data, type, row) => {\n if (type === 'display') {\n if (data && data.startsWith('swh')) {\n let browseUrl = Urls.browse_swh_id(data);\n return `${data}`;\n }\n }\n return data;\n }\n }\n ],\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']]\n });\n depositsTable.draw();\n });\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nimport {handleFetchError, csrfPost} from 'utils/functions';\n\nlet authorizedOriginTable;\nlet unauthorizedOriginTable;\nlet pendingSaveRequestsTable;\nlet acceptedSaveRequestsTable;\nlet rejectedSaveRequestsTable;\n\nfunction enableRowSelection(tableSel) {\n $(`${tableSel} tbody`).on('click', 'tr', function() {\n if ($(this).hasClass('selected')) {\n $(this).removeClass('selected');\n } else {\n $(`${tableSel} tr.selected`).removeClass('selected');\n $(this).addClass('selected');\n }\n });\n}\n\nexport function initOriginSaveAdmin() {\n $(document).ready(() => {\n\n $.fn.dataTable.ext.errMode = 'throw';\n\n authorizedOriginTable = $('#swh-authorized-origin-urls').DataTable({\n serverSide: true,\n ajax: Urls.admin_origin_save_authorized_urls_list(),\n columns: [{data: 'url', name: 'url'}],\n scrollY: '50vh',\n scrollCollapse: true,\n info: false\n });\n enableRowSelection('#swh-authorized-origin-urls');\n\n unauthorizedOriginTable = $('#swh-unauthorized-origin-urls').DataTable({\n serverSide: true,\n ajax: Urls.admin_origin_save_unauthorized_urls_list(),\n columns: [{data: 'url', name: 'url'}],\n scrollY: '50vh',\n scrollCollapse: true,\n info: false\n });\n enableRowSelection('#swh-unauthorized-origin-urls');\n\n let columnsData = [\n {\n data: 'id',\n name: 'id',\n visible: false,\n searchable: false\n },\n {\n data: 'save_request_date',\n name: 'request_date',\n render: (data, type, row) => {\n if (type === 'display') {\n let date = new Date(data);\n return date.toLocaleString();\n }\n return data;\n }\n },\n {\n data: 'origin_type',\n name: 'origin_type'\n },\n {\n data: 'origin_url',\n name: 'origin_url',\n render: (data, type, row) => {\n if (type === 'display') {\n const sanitizedURL = $.fn.dataTable.render.text().display(data);\n return `${sanitizedURL}`;\n }\n return data;\n }\n }\n ];\n\n pendingSaveRequestsTable = $('#swh-origin-save-pending-requests').DataTable({\n serverSide: true,\n ajax: Urls.browse_origin_save_requests_list('pending'),\n searchDelay: 1000,\n columns: columnsData,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']]\n });\n enableRowSelection('#swh-origin-save-pending-requests');\n\n rejectedSaveRequestsTable = $('#swh-origin-save-rejected-requests').DataTable({\n serverSide: true,\n ajax: Urls.browse_origin_save_requests_list('rejected'),\n searchDelay: 1000,\n columns: columnsData,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']]\n });\n enableRowSelection('#swh-origin-save-rejected-requests');\n\n columnsData.push({\n data: 'save_task_status',\n name: 'save_task_status',\n render: (data, type, row) => {\n if (data === 'succeed') {\n let browseOriginUrl = Urls.browse_origin(row.origin_url);\n return `${data}`;\n }\n return data;\n }\n });\n\n acceptedSaveRequestsTable = $('#swh-origin-save-accepted-requests').DataTable({\n serverSide: true,\n ajax: Urls.browse_origin_save_requests_list('accepted'),\n searchDelay: 1000,\n columns: columnsData,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']]\n });\n enableRowSelection('#swh-origin-save-accepted-requests');\n\n $('#swh-origin-save-requests-nav-item').on('shown.bs.tab', () => {\n pendingSaveRequestsTable.draw();\n });\n\n $('#swh-origin-save-url-filters-nav-item').on('shown.bs.tab', () => {\n authorizedOriginTable.draw();\n });\n\n $('#swh-authorized-origins-tab').on('shown.bs.tab', () => {\n authorizedOriginTable.draw();\n });\n\n $('#swh-unauthorized-origins-tab').on('shown.bs.tab', () => {\n unauthorizedOriginTable.draw();\n });\n\n $('#swh-save-requests-pending-tab').on('shown.bs.tab', () => {\n pendingSaveRequestsTable.draw();\n });\n\n $('#swh-save-requests-accepted-tab').on('shown.bs.tab', () => {\n acceptedSaveRequestsTable.draw();\n });\n\n $('#swh-save-requests-rejected-tab').on('shown.bs.tab', () => {\n rejectedSaveRequestsTable.draw();\n });\n\n $('#swh-save-requests-pending-tab').click(() => {\n pendingSaveRequestsTable.ajax.reload(null, false);\n });\n\n $('#swh-save-requests-accepted-tab').click(() => {\n acceptedSaveRequestsTable.ajax.reload(null, false);\n });\n\n $('#swh-save-requests-rejected-tab').click(() => {\n rejectedSaveRequestsTable.ajax.reload(null, false);\n });\n\n });\n}\n\nexport function addAuthorizedOriginUrl() {\n let originUrl = $('#swh-authorized-url-prefix').val();\n let addOriginUrl = Urls.admin_origin_save_add_authorized_url(originUrl);\n csrfPost(addOriginUrl)\n .then(handleFetchError)\n .then(() => {\n authorizedOriginTable.row.add({'url': originUrl}).draw();\n })\n .catch(response => {\n swh.webapp.showModalMessage(\n 'Duplicated origin url prefix',\n 'The provided origin url prefix is already registered in the authorized list.');\n });\n}\n\nexport function removeAuthorizedOriginUrl() {\n let originUrl = $('#swh-authorized-origin-urls tr.selected').text();\n if (originUrl) {\n let removeOriginUrl = Urls.admin_origin_save_remove_authorized_url(originUrl);\n csrfPost(removeOriginUrl)\n .then(handleFetchError)\n .then(() => {\n authorizedOriginTable.row('.selected').remove().draw();\n })\n .catch(() => {});\n }\n}\n\nexport function addUnauthorizedOriginUrl() {\n let originUrl = $('#swh-unauthorized-url-prefix').val();\n let addOriginUrl = Urls.admin_origin_save_add_unauthorized_url(originUrl);\n csrfPost(addOriginUrl)\n .then(handleFetchError)\n .then(() => {\n unauthorizedOriginTable.row.add({'url': originUrl}).draw();\n })\n .catch(() => {\n swh.webapp.showModalMessage(\n 'Duplicated origin url prefix',\n 'The provided origin url prefix is already registered in the unauthorized list.');\n });\n}\n\nexport function removeUnauthorizedOriginUrl() {\n let originUrl = $('#swh-unauthorized-origin-urls tr.selected').text();\n if (originUrl) {\n let removeOriginUrl = Urls.admin_origin_save_remove_unauthorized_url(originUrl);\n csrfPost(removeOriginUrl)\n .then(handleFetchError)\n .then(() => {\n unauthorizedOriginTable.row('.selected').remove().draw();\n })\n .catch(() => {});\n }\n}\n\nexport function acceptOriginSaveRequest() {\n let selectedRow = pendingSaveRequestsTable.row('.selected');\n if (selectedRow.length) {\n let acceptOriginSaveRequestCallback = () => {\n let rowData = selectedRow.data();\n let acceptSaveRequestUrl = Urls.admin_origin_save_request_accept(rowData['origin_type'], rowData['origin_url']);\n csrfPost(acceptSaveRequestUrl)\n .then(() => {\n pendingSaveRequestsTable.ajax.reload(null, false);\n });\n };\n\n swh.webapp.showModalConfirm(\n 'Accept origin save request ?',\n 'Are you sure to accept this origin save request ?',\n acceptOriginSaveRequestCallback);\n }\n}\n\nexport function rejectOriginSaveRequest() {\n let selectedRow = pendingSaveRequestsTable.row('.selected');\n if (selectedRow.length) {\n let rejectOriginSaveRequestCallback = () => {\n let rowData = selectedRow.data();\n let rejectSaveRequestUrl = Urls.admin_origin_save_request_reject(rowData['origin_type'], rowData['origin_url']);\n csrfPost(rejectSaveRequestUrl)\n .then(() => {\n pendingSaveRequestsTable.ajax.reload(null, false);\n });\n };\n\n swh.webapp.showModalConfirm(\n 'Reject origin save request ?',\n 'Are you sure to reject this origin save request ?',\n rejectOriginSaveRequestCallback);\n }\n}\n\nfunction removeOriginSaveRequest(requestTable) {\n let selectedRow = requestTable.row('.selected');\n if (selectedRow.length) {\n let requestId = selectedRow.data()['id'];\n let removeOriginSaveRequestCallback = () => {\n let removeSaveRequestUrl = Urls.admin_origin_save_request_remove(requestId);\n csrfPost(removeSaveRequestUrl)\n .then(() => {\n requestTable.ajax.reload(null, false);\n });\n };\n\n swh.webapp.showModalConfirm(\n 'Remove origin save request ?',\n 'Are you sure to remove this origin save request ?',\n removeOriginSaveRequestCallback);\n }\n}\n\nexport function removePendingOriginSaveRequest() {\n removeOriginSaveRequest(pendingSaveRequestsTable);\n}\n\nexport function removeAcceptedOriginSaveRequest() {\n removeOriginSaveRequest(acceptedSaveRequestsTable);\n}\n\nexport function removeRejectedOriginSaveRequest() {\n removeOriginSaveRequest(rejectedSaveRequestsTable);\n}\n","module.exports = require(\"core-js/library/fn/json/stringify\");","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nexport * from './deposit';\nexport * from './origin-save';\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n// utility functions\n\nexport function handleFetchError(response) {\n if (!response.ok) {\n throw response;\n }\n return response;\n}\n\nexport function handleFetchErrors(responses) {\n for (let i = 0; i < responses.length; ++i) {\n if (!responses[i].ok) {\n throw responses[i];\n }\n }\n return responses;\n}\n\nexport function staticAsset(asset) {\n return `${__STATIC__}${asset}`;\n}\n\nexport function csrfPost(url, headers = {}, body = null) {\n headers['X-CSRFToken'] = Cookies.get('csrftoken');\n return fetch(url, {\n credentials: 'include',\n headers: headers,\n method: 'POST',\n body: body\n });\n}\n\nexport function isGitRepoUrl(url, domain) {\n let endOfPattern = '\\\\/[\\\\w\\\\.-]+\\\\/?(?!=.git)(?:\\\\.git(?:\\\\/?|\\\\#[\\\\w\\\\.\\\\-_]+)?)?$';\n let pattern = `(?:git|https?|git@)(?:\\\\:\\\\/\\\\/)?${domain}[/|:][A-Za-z0-9-]+?` + endOfPattern;\n let re = new RegExp(pattern);\n return re.test(url);\n};\n\nexport function removeUrlFragment() {\n history.replaceState('', document.title, window.location.pathname + window.location.search);\n}\n\nexport function selectText(startNode, endNode) {\n let selection = window.getSelection();\n selection.removeAllRanges();\n let range = document.createRange();\n range.setStart(startNode, 0);\n if (endNode.nodeName !== '#text') {\n range.setEnd(endNode, endNode.childNodes.length);\n } else {\n range.setEnd(endNode, endNode.textContent.length);\n }\n selection.addRange(range);\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/swh/web/static/js/admin.e72f14c77b3a7af60340.js b/swh/web/static/js/admin.e72f14c77b3a7af60340.js new file mode 100644 index 00000000..1305fb2c --- /dev/null +++ b/swh/web/static/js/admin.e72f14c77b3a7af60340.js @@ -0,0 +1,2 @@ +!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.admin=r():(e.swh=e.swh||{},e.swh.admin=r())}(window,function(){return function(e){function r(r){for(var t,o,s=r[0],u=r[1],d=r[2],l=0,f=[];l'+e+"";return e}function o(){var e;$(document).ready(function(){$.fn.dataTable.ext.errMode="none",(e=$("#swh-admin-deposit-list").on("error.dt",function(e,r,n,t){$("#swh-admin-deposit-list-error").text(t)}).DataTable({serverSide:!0,ajax:Urls.admin_deposit_list(),columns:[{data:"id",name:"id"},{data:"swh_id_context",name:"swh_id_context",render:function(e,r,n){if(e&&"display"===r){var t=e.indexOf(";origin=");if(-1!==t){var i=e.slice(t+";origin=".length);return''+i+""}}return e}},{data:"reception_date",name:"reception_date",render:function(e,r,n){return"display"===r?new Date(e).toLocaleString():e}},{data:"status",name:"status"},{data:"status_detail",name:"status_detail",render:function(e,r,n){if("display"===r&&e){var t=e;return"object"==typeof e&&(t=i()(e,null,4)),'
'+t+"
"}return e},orderable:!1,visible:!1},{data:"swh_anchor_id",name:"swh_anchor_id",render:function(e,r,n){return a(e,r)},orderable:!1},{data:"swh_anchor_id_context",name:"swh_anchor_id_context",render:function(e,r,n){return a(e,r)},orderable:!1,visible:!1},{data:"swh_id",name:"swh_id",render:function(e,r,n){return a(e,r)},orderable:!1,visible:!1},{data:"swh_id_context",name:"swh_id_context",render:function(e,r,n){return a(e,r)},orderable:!1,visible:!1}],scrollX:!0,scrollY:"50vh",scrollCollapse:!0,order:[[0,"desc"]]})).draw()}),$("a.toggle-col").on("click",function(r){r.preventDefault();var n=e.column($(this).attr("data-column"));n.visible(!n.visible()),n.visible()?$(this).removeClass("col-hidden"):$(this).addClass("col-hidden")})}},473:function(e,r,n){"use strict";n.d(r,"d",function(){return c}),n.d(r,"b",function(){return l}),n.d(r,"g",function(){return f}),n.d(r,"c",function(){return h}),n.d(r,"j",function(){return v}),n.d(r,"a",function(){return w}),n.d(r,"e",function(){return p}),n.d(r,"h",function(){return _}),n.d(r,"f",function(){return b}),n.d(r,"i",function(){return m});var t,i,a,o,s,u=n(9);function d(e){$(e+" tbody").on("click","tr",function(){$(this).hasClass("selected")?$(this).removeClass("selected"):($(e+" tr.selected").removeClass("selected"),$(this).addClass("selected"))})}function c(){$(document).ready(function(){$.fn.dataTable.ext.errMode="throw",t=$("#swh-authorized-origin-urls").DataTable({serverSide:!0,ajax:Urls.admin_origin_save_authorized_urls_list(),columns:[{data:"url",name:"url"}],scrollY:"50vh",scrollCollapse:!0,info:!1}),d("#swh-authorized-origin-urls"),i=$("#swh-unauthorized-origin-urls").DataTable({serverSide:!0,ajax:Urls.admin_origin_save_unauthorized_urls_list(),columns:[{data:"url",name:"url"}],scrollY:"50vh",scrollCollapse:!0,info:!1}),d("#swh-unauthorized-origin-urls");var e=[{data:"id",name:"id",visible:!1,searchable:!1},{data:"save_request_date",name:"request_date",render:function(e,r,n){return"display"===r?new Date(e).toLocaleString():e}},{data:"origin_type",name:"origin_type"},{data:"origin_url",name:"origin_url",render:function(e,r,n){if("display"===r){var t=$.fn.dataTable.render.text().display(e);return''+t+""}return e}}];a=$("#swh-origin-save-pending-requests").DataTable({serverSide:!0,ajax:Urls.browse_origin_save_requests_list("pending"),searchDelay:1e3,columns:e,scrollY:"50vh",scrollCollapse:!0,order:[[0,"desc"]]}),d("#swh-origin-save-pending-requests"),s=$("#swh-origin-save-rejected-requests").DataTable({serverSide:!0,ajax:Urls.browse_origin_save_requests_list("rejected"),searchDelay:1e3,columns:e,scrollY:"50vh",scrollCollapse:!0,order:[[0,"desc"]]}),d("#swh-origin-save-rejected-requests"),e.push({data:"save_task_status",name:"save_task_status",render:function(e,r,n){return"succeed"===e?''+e+"":e}}),o=$("#swh-origin-save-accepted-requests").DataTable({serverSide:!0,ajax:Urls.browse_origin_save_requests_list("accepted"),searchDelay:1e3,columns:e,scrollY:"50vh",scrollCollapse:!0,order:[[0,"desc"]]}),d("#swh-origin-save-accepted-requests"),$("#swh-origin-save-requests-nav-item").on("shown.bs.tab",function(){a.draw()}),$("#swh-origin-save-url-filters-nav-item").on("shown.bs.tab",function(){t.draw()}),$("#swh-authorized-origins-tab").on("shown.bs.tab",function(){t.draw()}),$("#swh-unauthorized-origins-tab").on("shown.bs.tab",function(){i.draw()}),$("#swh-save-requests-pending-tab").on("shown.bs.tab",function(){a.draw()}),$("#swh-save-requests-accepted-tab").on("shown.bs.tab",function(){o.draw()}),$("#swh-save-requests-rejected-tab").on("shown.bs.tab",function(){s.draw()}),$("#swh-save-requests-pending-tab").click(function(){a.ajax.reload(null,!1)}),$("#swh-save-requests-accepted-tab").click(function(){o.ajax.reload(null,!1)}),$("#swh-save-requests-rejected-tab").click(function(){s.ajax.reload(null,!1)})})}function l(){var e=$("#swh-authorized-url-prefix").val(),r=Urls.admin_origin_save_add_authorized_url(e);Object(u.a)(r).then(u.b).then(function(){t.row.add({url:e}).draw()}).catch(function(e){swh.webapp.showModalMessage("Duplicated origin url prefix","The provided origin url prefix is already registered in the authorized list.")})}function f(){var e=$("#swh-authorized-origin-urls tr.selected").text();if(e){var r=Urls.admin_origin_save_remove_authorized_url(e);Object(u.a)(r).then(u.b).then(function(){t.row(".selected").remove().draw()}).catch(function(){})}}function h(){var e=$("#swh-unauthorized-url-prefix").val(),r=Urls.admin_origin_save_add_unauthorized_url(e);Object(u.a)(r).then(u.b).then(function(){i.row.add({url:e}).draw()}).catch(function(){swh.webapp.showModalMessage("Duplicated origin url prefix","The provided origin url prefix is already registered in the unauthorized list.")})}function v(){var e=$("#swh-unauthorized-origin-urls tr.selected").text();if(e){var r=Urls.admin_origin_save_remove_unauthorized_url(e);Object(u.a)(r).then(u.b).then(function(){i.row(".selected").remove().draw()}).catch(function(){})}}function w(){var e=a.row(".selected");if(e.length){swh.webapp.showModalConfirm("Accept origin save request ?","Are you sure to accept this origin save request ?",function(){var r=e.data(),n=Urls.admin_origin_save_request_accept(r.origin_type,r.origin_url);Object(u.a)(n).then(function(){a.ajax.reload(null,!1)})})}}function p(){var e=a.row(".selected");if(e.length){swh.webapp.showModalConfirm("Reject origin save request ?","Are you sure to reject this origin save request ?",function(){var r=e.data(),n=Urls.admin_origin_save_request_reject(r.origin_type,r.origin_url);Object(u.a)(n).then(function(){a.ajax.reload(null,!1)})})}}function g(e){var r=e.row(".selected");if(r.length){var n=r.data().id;swh.webapp.showModalConfirm("Remove origin save request ?","Are you sure to remove this origin save request ?",function(){var r=Urls.admin_origin_save_request_remove(n);Object(u.a)(r).then(function(){e.ajax.reload(null,!1)})})}}function _(){g(a)}function b(){g(o)}function m(){g(s)}},56:function(e,r,n){e.exports=n(153)},756:function(e,r,n){e.exports=n(757)},757:function(e,r,n){"use strict";n.r(r);var t=n(472);n.d(r,"initDepositAdmin",function(){return t.a});var i=n(473);n.d(r,"initOriginSaveAdmin",function(){return i.d}),n.d(r,"addAuthorizedOriginUrl",function(){return i.b}),n.d(r,"removeAuthorizedOriginUrl",function(){return i.g}),n.d(r,"addUnauthorizedOriginUrl",function(){return i.c}),n.d(r,"removeUnauthorizedOriginUrl",function(){return i.j}),n.d(r,"acceptOriginSaveRequest",function(){return i.a}),n.d(r,"rejectOriginSaveRequest",function(){return i.e}),n.d(r,"removePendingOriginSaveRequest",function(){return i.h}),n.d(r,"removeAcceptedOriginSaveRequest",function(){return i.f}),n.d(r,"removeRejectedOriginSaveRequest",function(){return i.i})},9:function(e,r,n){"use strict";function t(e){if(!e.ok)throw e;return e}function i(e){for(var r=0;r${data}`;\n }\n }\n return data;\n}\n\nexport function initDepositAdmin() {\n let depositsTable;\n $(document).ready(() => {\n $.fn.dataTable.ext.errMode = 'none';\n depositsTable = $('#swh-admin-deposit-list')\n .on('error.dt', (e, settings, techNote, message) => {\n $('#swh-admin-deposit-list-error').text(message);\n })\n .DataTable({\n serverSide: true,\n ajax: Urls.admin_deposit_list(),\n columns: [\n {\n data: 'id',\n name: 'id'\n },\n {\n data: 'swh_id_context',\n name: 'swh_id_context',\n render: (data, type, row) => {\n if (data && type === 'display') {\n let originPattern = ';origin=';\n let originPatternIdx = data.indexOf(originPattern);\n if (originPatternIdx !== -1) {\n let originUrl = data.slice(originPatternIdx + originPattern.length);\n return `${originUrl}`;\n }\n }\n return data;\n }\n },\n {\n data: 'reception_date',\n name: 'reception_date',\n render: (data, type, row) => {\n if (type === 'display') {\n let date = new Date(data);\n return date.toLocaleString();\n }\n return data;\n }\n },\n {\n data: 'status',\n name: 'status'\n },\n {\n data: 'status_detail',\n name: 'status_detail',\n render: (data, type, row) => {\n if (type === 'display' && data) {\n let text = data;\n if (typeof data === 'object') {\n text = JSON.stringify(data, null, 4);\n }\n return `
${text}
`;\n }\n return data;\n },\n orderable: false,\n visible: false\n },\n {\n data: 'swh_anchor_id',\n name: 'swh_anchor_id',\n render: (data, type, row) => {\n return genSwhLink(data, type);\n },\n orderable: false\n },\n {\n data: 'swh_anchor_id_context',\n name: 'swh_anchor_id_context',\n render: (data, type, row) => {\n return genSwhLink(data, type);\n },\n orderable: false,\n visible: false\n },\n {\n data: 'swh_id',\n name: 'swh_id',\n render: (data, type, row) => {\n return genSwhLink(data, type);\n },\n orderable: false,\n visible: false\n },\n {\n data: 'swh_id_context',\n name: 'swh_id_context',\n render: (data, type, row) => {\n return genSwhLink(data, type);\n },\n orderable: false,\n visible: false\n }\n ],\n scrollX: true,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']]\n });\n depositsTable.draw();\n });\n\n $('a.toggle-col').on('click', function(e) {\n e.preventDefault();\n var column = depositsTable.column($(this).attr('data-column'));\n column.visible(!column.visible());\n if (column.visible()) {\n $(this).removeClass('col-hidden');\n } else {\n $(this).addClass('col-hidden');\n }\n });\n\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nimport {handleFetchError, csrfPost} from 'utils/functions';\n\nlet authorizedOriginTable;\nlet unauthorizedOriginTable;\nlet pendingSaveRequestsTable;\nlet acceptedSaveRequestsTable;\nlet rejectedSaveRequestsTable;\n\nfunction enableRowSelection(tableSel) {\n $(`${tableSel} tbody`).on('click', 'tr', function() {\n if ($(this).hasClass('selected')) {\n $(this).removeClass('selected');\n } else {\n $(`${tableSel} tr.selected`).removeClass('selected');\n $(this).addClass('selected');\n }\n });\n}\n\nexport function initOriginSaveAdmin() {\n $(document).ready(() => {\n\n $.fn.dataTable.ext.errMode = 'throw';\n\n authorizedOriginTable = $('#swh-authorized-origin-urls').DataTable({\n serverSide: true,\n ajax: Urls.admin_origin_save_authorized_urls_list(),\n columns: [{data: 'url', name: 'url'}],\n scrollY: '50vh',\n scrollCollapse: true,\n info: false\n });\n enableRowSelection('#swh-authorized-origin-urls');\n\n unauthorizedOriginTable = $('#swh-unauthorized-origin-urls').DataTable({\n serverSide: true,\n ajax: Urls.admin_origin_save_unauthorized_urls_list(),\n columns: [{data: 'url', name: 'url'}],\n scrollY: '50vh',\n scrollCollapse: true,\n info: false\n });\n enableRowSelection('#swh-unauthorized-origin-urls');\n\n let columnsData = [\n {\n data: 'id',\n name: 'id',\n visible: false,\n searchable: false\n },\n {\n data: 'save_request_date',\n name: 'request_date',\n render: (data, type, row) => {\n if (type === 'display') {\n let date = new Date(data);\n return date.toLocaleString();\n }\n return data;\n }\n },\n {\n data: 'origin_type',\n name: 'origin_type'\n },\n {\n data: 'origin_url',\n name: 'origin_url',\n render: (data, type, row) => {\n if (type === 'display') {\n const sanitizedURL = $.fn.dataTable.render.text().display(data);\n return `${sanitizedURL}`;\n }\n return data;\n }\n }\n ];\n\n pendingSaveRequestsTable = $('#swh-origin-save-pending-requests').DataTable({\n serverSide: true,\n ajax: Urls.browse_origin_save_requests_list('pending'),\n searchDelay: 1000,\n columns: columnsData,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']]\n });\n enableRowSelection('#swh-origin-save-pending-requests');\n\n rejectedSaveRequestsTable = $('#swh-origin-save-rejected-requests').DataTable({\n serverSide: true,\n ajax: Urls.browse_origin_save_requests_list('rejected'),\n searchDelay: 1000,\n columns: columnsData,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']]\n });\n enableRowSelection('#swh-origin-save-rejected-requests');\n\n columnsData.push({\n data: 'save_task_status',\n name: 'save_task_status',\n render: (data, type, row) => {\n if (data === 'succeed') {\n let browseOriginUrl = Urls.browse_origin(row.origin_url);\n return `${data}`;\n }\n return data;\n }\n });\n\n acceptedSaveRequestsTable = $('#swh-origin-save-accepted-requests').DataTable({\n serverSide: true,\n ajax: Urls.browse_origin_save_requests_list('accepted'),\n searchDelay: 1000,\n columns: columnsData,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']]\n });\n enableRowSelection('#swh-origin-save-accepted-requests');\n\n $('#swh-origin-save-requests-nav-item').on('shown.bs.tab', () => {\n pendingSaveRequestsTable.draw();\n });\n\n $('#swh-origin-save-url-filters-nav-item').on('shown.bs.tab', () => {\n authorizedOriginTable.draw();\n });\n\n $('#swh-authorized-origins-tab').on('shown.bs.tab', () => {\n authorizedOriginTable.draw();\n });\n\n $('#swh-unauthorized-origins-tab').on('shown.bs.tab', () => {\n unauthorizedOriginTable.draw();\n });\n\n $('#swh-save-requests-pending-tab').on('shown.bs.tab', () => {\n pendingSaveRequestsTable.draw();\n });\n\n $('#swh-save-requests-accepted-tab').on('shown.bs.tab', () => {\n acceptedSaveRequestsTable.draw();\n });\n\n $('#swh-save-requests-rejected-tab').on('shown.bs.tab', () => {\n rejectedSaveRequestsTable.draw();\n });\n\n $('#swh-save-requests-pending-tab').click(() => {\n pendingSaveRequestsTable.ajax.reload(null, false);\n });\n\n $('#swh-save-requests-accepted-tab').click(() => {\n acceptedSaveRequestsTable.ajax.reload(null, false);\n });\n\n $('#swh-save-requests-rejected-tab').click(() => {\n rejectedSaveRequestsTable.ajax.reload(null, false);\n });\n\n });\n}\n\nexport function addAuthorizedOriginUrl() {\n let originUrl = $('#swh-authorized-url-prefix').val();\n let addOriginUrl = Urls.admin_origin_save_add_authorized_url(originUrl);\n csrfPost(addOriginUrl)\n .then(handleFetchError)\n .then(() => {\n authorizedOriginTable.row.add({'url': originUrl}).draw();\n })\n .catch(response => {\n swh.webapp.showModalMessage(\n 'Duplicated origin url prefix',\n 'The provided origin url prefix is already registered in the authorized list.');\n });\n}\n\nexport function removeAuthorizedOriginUrl() {\n let originUrl = $('#swh-authorized-origin-urls tr.selected').text();\n if (originUrl) {\n let removeOriginUrl = Urls.admin_origin_save_remove_authorized_url(originUrl);\n csrfPost(removeOriginUrl)\n .then(handleFetchError)\n .then(() => {\n authorizedOriginTable.row('.selected').remove().draw();\n })\n .catch(() => {});\n }\n}\n\nexport function addUnauthorizedOriginUrl() {\n let originUrl = $('#swh-unauthorized-url-prefix').val();\n let addOriginUrl = Urls.admin_origin_save_add_unauthorized_url(originUrl);\n csrfPost(addOriginUrl)\n .then(handleFetchError)\n .then(() => {\n unauthorizedOriginTable.row.add({'url': originUrl}).draw();\n })\n .catch(() => {\n swh.webapp.showModalMessage(\n 'Duplicated origin url prefix',\n 'The provided origin url prefix is already registered in the unauthorized list.');\n });\n}\n\nexport function removeUnauthorizedOriginUrl() {\n let originUrl = $('#swh-unauthorized-origin-urls tr.selected').text();\n if (originUrl) {\n let removeOriginUrl = Urls.admin_origin_save_remove_unauthorized_url(originUrl);\n csrfPost(removeOriginUrl)\n .then(handleFetchError)\n .then(() => {\n unauthorizedOriginTable.row('.selected').remove().draw();\n })\n .catch(() => {});\n }\n}\n\nexport function acceptOriginSaveRequest() {\n let selectedRow = pendingSaveRequestsTable.row('.selected');\n if (selectedRow.length) {\n let acceptOriginSaveRequestCallback = () => {\n let rowData = selectedRow.data();\n let acceptSaveRequestUrl = Urls.admin_origin_save_request_accept(rowData['origin_type'], rowData['origin_url']);\n csrfPost(acceptSaveRequestUrl)\n .then(() => {\n pendingSaveRequestsTable.ajax.reload(null, false);\n });\n };\n\n swh.webapp.showModalConfirm(\n 'Accept origin save request ?',\n 'Are you sure to accept this origin save request ?',\n acceptOriginSaveRequestCallback);\n }\n}\n\nexport function rejectOriginSaveRequest() {\n let selectedRow = pendingSaveRequestsTable.row('.selected');\n if (selectedRow.length) {\n let rejectOriginSaveRequestCallback = () => {\n let rowData = selectedRow.data();\n let rejectSaveRequestUrl = Urls.admin_origin_save_request_reject(rowData['origin_type'], rowData['origin_url']);\n csrfPost(rejectSaveRequestUrl)\n .then(() => {\n pendingSaveRequestsTable.ajax.reload(null, false);\n });\n };\n\n swh.webapp.showModalConfirm(\n 'Reject origin save request ?',\n 'Are you sure to reject this origin save request ?',\n rejectOriginSaveRequestCallback);\n }\n}\n\nfunction removeOriginSaveRequest(requestTable) {\n let selectedRow = requestTable.row('.selected');\n if (selectedRow.length) {\n let requestId = selectedRow.data()['id'];\n let removeOriginSaveRequestCallback = () => {\n let removeSaveRequestUrl = Urls.admin_origin_save_request_remove(requestId);\n csrfPost(removeSaveRequestUrl)\n .then(() => {\n requestTable.ajax.reload(null, false);\n });\n };\n\n swh.webapp.showModalConfirm(\n 'Remove origin save request ?',\n 'Are you sure to remove this origin save request ?',\n removeOriginSaveRequestCallback);\n }\n}\n\nexport function removePendingOriginSaveRequest() {\n removeOriginSaveRequest(pendingSaveRequestsTable);\n}\n\nexport function removeAcceptedOriginSaveRequest() {\n removeOriginSaveRequest(acceptedSaveRequestsTable);\n}\n\nexport function removeRejectedOriginSaveRequest() {\n removeOriginSaveRequest(rejectedSaveRequestsTable);\n}\n","module.exports = require(\"core-js/library/fn/json/stringify\");","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nexport * from './deposit';\nexport * from './origin-save';\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n// utility functions\n\nexport function handleFetchError(response) {\n if (!response.ok) {\n throw response;\n }\n return response;\n}\n\nexport function handleFetchErrors(responses) {\n for (let i = 0; i < responses.length; ++i) {\n if (!responses[i].ok) {\n throw responses[i];\n }\n }\n return responses;\n}\n\nexport function staticAsset(asset) {\n return `${__STATIC__}${asset}`;\n}\n\nexport function csrfPost(url, headers = {}, body = null) {\n headers['X-CSRFToken'] = Cookies.get('csrftoken');\n return fetch(url, {\n credentials: 'include',\n headers: headers,\n method: 'POST',\n body: body\n });\n}\n\nexport function isGitRepoUrl(url, domain) {\n let endOfPattern = '\\\\/[\\\\w\\\\.-]+\\\\/?(?!=.git)(?:\\\\.git(?:\\\\/?|\\\\#[\\\\w\\\\.\\\\-_]+)?)?$';\n let pattern = `(?:git|https?|git@)(?:\\\\:\\\\/\\\\/)?${domain}[/|:][A-Za-z0-9-]+?` + endOfPattern;\n let re = new RegExp(pattern);\n return re.test(url);\n};\n\nexport function removeUrlFragment() {\n history.replaceState('', document.title, window.location.pathname + window.location.search);\n}\n\nexport function selectText(startNode, endNode) {\n let selection = window.getSelection();\n selection.removeAllRanges();\n let range = document.createRange();\n range.setStart(startNode, 0);\n if (endNode.nodeName !== '#text') {\n range.setEnd(endNode, endNode.childNodes.length);\n } else {\n range.setEnd(endNode, endNode.textContent.length);\n }\n selection.addRange(range);\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/swh/web/static/js/webapp.705444d32d34e3bc5043.js b/swh/web/static/js/webapp.b979e897536467ca4793.js similarity index 99% rename from swh/web/static/js/webapp.705444d32d34e3bc5043.js rename to swh/web/static/js/webapp.b979e897536467ca4793.js index 2d492f45..ca2658e6 100644 --- a/swh/web/static/js/webapp.705444d32d34e3bc5043.js +++ b/swh/web/static/js/webapp.b979e897536467ca4793.js @@ -1,3 +1,3 @@ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.webapp=t():(e.swh=e.swh||{},e.swh.webapp=t())}(window,function(){return function(e){function t(t){for(var r,i,s=t[0],c=t[1],l=t[2],u=0,d=[];u0?i(r(e),9007199254740991):0}},102:function(e,t,n){var r=n(13).document;e.exports=r&&r.documentElement},103:function(e,t,n){var r=n(41),i=n(11)("toStringTag"),o="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),i))?n:o?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},11:function(e,t,n){var r=n(86)("wks"),i=n(87),o=n(13).Symbol,a="function"==typeof o;(e.exports=function(e){return r[e]||(r[e]=a&&o[e]||(a?o:i)("Symbol."+e))}).store=r},131:function(e,t,n){n(158);for(var r=n(13),i=n(38),o=n(35),a=n(11)("toStringTag"),s="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),c=0;c=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},133:function(e,t,n){var r=n(103),i=n(11)("iterator"),o=n(35);e.exports=n(16).getIteratorMethod=function(e){if(null!=e)return e[i]||e["@@iterator"]||o[r(e)]}},134:function(e,t,n){var r=n(33),i=n(99),o=n(11)("species");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||null==(n=r(a)[o])?t:i(n)}},135:function(e,t,n){var r,i,o,a=n(98),s=n(259),c=n(102),l=n(130),u=n(13),f=u.process,d=u.setImmediate,p=u.clearImmediate,h=u.MessageChannel,m=u.Dispatch,g=0,v={},b=function(){var e=+this;if(v.hasOwnProperty(e)){var t=v[e];delete v[e],t()}},y=function(e){b.call(e.data)};d&&p||(d=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return v[++g]=function(){s("function"==typeof e?e:Function(e),t)},r(g),g},p=function(e){delete v[e]},"process"==n(41)(f)?r=function(e){f.nextTick(a(b,e,1))}:m&&m.now?r=function(e){m.now(a(b,e,1))}:h?(o=(i=new h).port2,i.port1.onmessage=y,r=a(o.postMessage,o,1)):u.addEventListener&&"function"==typeof postMessage&&!u.importScripts?(r=function(e){u.postMessage(e+"","*")},u.addEventListener("message",y,!1)):r="onreadystatechange"in l("script")?function(e){c.appendChild(l("script")).onreadystatechange=function(){c.removeChild(this),b.call(e)}}:function(e){setTimeout(a(b,e,1),0)}),e.exports={set:d,clear:p}},136:function(e,t){e.exports=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}}},137:function(e,t,n){var r=n(33),i=n(115),o=n(89);e.exports=function(e,t){if(r(e),i(t)&&t.constructor===e)return t;var n=o.f(e);return(0,n.resolve)(t),n.promise}},153:function(e,t,n){var r=n(16),i=r.JSON||(r.JSON={stringify:JSON.stringify});e.exports=function(e){return i.stringify.apply(i,arguments)}},154:function(e,t,n){n(155),e.exports=n(16).parseInt},155:function(e,t,n){var r=n(31),i=n(156);r(r.G+r.F*(parseInt!=i),{parseInt:i})},156:function(e,t,n){var r=n(13).parseInt,i=n(157).trim,o=n(84),a=/^[-+]?0[xX]/;e.exports=8!==r(o+"08")||22!==r(o+"0x16")?function(e,t){var n=i(String(e),3);return r(n,t>>>0||(a.test(n)?16:10))}:r},157:function(e,t,n){var r=n(31),i=n(39),o=n(199),a=n(84),s="["+a+"]",c=RegExp("^"+s+s+"*"),l=RegExp(s+s+"*$"),u=function(e,t,n){var i={},s=o(function(){return!!a[e]()||"​…"!="​…"[e]()}),c=i[e]=s?t(f):a[e];n&&(i[n]=c),r(r.P+r.F*s,"String",i)},f=u.trim=function(e,t){return e=String(i(e)),1&t&&(e=e.replace(c,"")),2&t&&(e=e.replace(l,"")),e};e.exports=u},158:function(e,t,n){"use strict";var r=n(159),i=n(160),o=n(35),a=n(53);e.exports=n(85)(Array,"Array",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,i(1)):i(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),o.Arguments=o.Array,r("keys"),r("values"),r("entries")},159:function(e,t){e.exports=function(){}},160:function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},161:function(e,t,n){var r=n(41);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},162:function(e,t,n){e.exports=n(38)},163:function(e,t,n){"use strict";var r=n(164),i=n(236),o=n(61),a={};n(38)(a,n(11)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(a,{next:i(1,n)}),o(e,t+" Iterator")}},164:function(e,t,n){var r=n(33),i=n(165),o=n(88),a=n(55)("IE_PROTO"),s=function(){},c=function(){var e,t=n(130)("iframe"),r=o.length;for(t.style.display="none",n(102).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" {% endblock content %} \ No newline at end of file diff --git a/swh/web/tests/admin/test_origin_save.py b/swh/web/tests/admin/test_origin_save.py index 0338c3c0..b0e20d04 100644 --- a/swh/web/tests/admin/test_origin_save.py +++ b/swh/web/tests/admin/test_origin_save.py @@ -1,232 +1,232 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from urllib.parse import unquote from django.contrib.auth import get_user_model from unittest.mock import patch from swh.web.common.models import ( SaveAuthorizedOrigin, SaveUnauthorizedOrigin, SaveOriginRequest ) from swh.web.common.origin_save import can_save_origin from swh.web.common.models import ( SAVE_REQUEST_PENDING, SAVE_REQUEST_ACCEPTED, SAVE_REQUEST_REJECTED, SAVE_TASK_NOT_YET_SCHEDULED ) from swh.web.common.utils import reverse from swh.web.tests.testcase import WebTestCase _user_name = 'swh-web-admin' _user_mail = 'admin@swh-web.org' _user_password = '..34~pounds~BEAUTY~march~63..' _authorized_origin_url = 'https://scm.ourproject.org/anonscm/' _unauthorized_origin_url = 'https://www.softwareheritage.org/' class OriginSaveAdminTestCase(WebTestCase): @classmethod def setUpTestData(cls): # noqa: N802 User = get_user_model() # noqa: N806 user = User.objects.create_user(_user_name, _user_mail, _user_password) user.is_staff = True user.save() SaveAuthorizedOrigin.objects.create(url=_authorized_origin_url) SaveUnauthorizedOrigin.objects.create(url=_unauthorized_origin_url) def check_not_login(self, url): login_url = reverse('login', query_params={'next': url}) response = self.client.post(url) self.assertEqual(response.status_code, 302) self.assertEqual(unquote(response.url), login_url) def test_add_authorized_origin_url(self): authorized_url = 'https://scm.adullact.net/anonscm/' self.assertEqual(can_save_origin(authorized_url), SAVE_REQUEST_PENDING) url = reverse('admin-origin-save-add-authorized-url', url_args={'origin_url': authorized_url}) self.check_not_login(url) self.assertEqual(can_save_origin(authorized_url), SAVE_REQUEST_PENDING) self.client.login(username=_user_name, password=_user_password) response = self.client.post(url) self.assertEqual(response.status_code, 200) self.assertEqual(can_save_origin(authorized_url), SAVE_REQUEST_ACCEPTED) def test_remove_authorized_origin_url(self): self.assertEqual(can_save_origin(_authorized_origin_url), SAVE_REQUEST_ACCEPTED) url = reverse('admin-origin-save-remove-authorized-url', url_args={'origin_url': _authorized_origin_url}) self.check_not_login(url) self.assertEqual(can_save_origin(_authorized_origin_url), SAVE_REQUEST_ACCEPTED) self.client.login(username=_user_name, password=_user_password) response = self.client.post(url) self.assertEqual(response.status_code, 200) self.assertEqual(can_save_origin(_authorized_origin_url), SAVE_REQUEST_PENDING) def test_add_unauthorized_origin_url(self): unauthorized_url = 'https://www.yahoo./' self.assertEqual(can_save_origin(unauthorized_url), SAVE_REQUEST_PENDING) url = reverse('admin-origin-save-add-unauthorized-url', url_args={'origin_url': unauthorized_url}) self.check_not_login(url) self.assertEqual(can_save_origin(unauthorized_url), SAVE_REQUEST_PENDING) self.client.login(username=_user_name, password=_user_password) response = self.client.post(url) self.assertEqual(response.status_code, 200) self.assertEqual(can_save_origin(unauthorized_url), SAVE_REQUEST_REJECTED) def test_remove_unauthorized_origin_url(self): self.assertEqual(can_save_origin(_unauthorized_origin_url), SAVE_REQUEST_REJECTED) url = reverse('admin-origin-save-remove-unauthorized-url', url_args={'origin_url': _unauthorized_origin_url}) self.check_not_login(url) self.assertEqual(can_save_origin(_unauthorized_origin_url), SAVE_REQUEST_REJECTED) self.client.login(username=_user_name, password=_user_password) response = self.client.post(url) self.assertEqual(response.status_code, 200) self.assertEqual(can_save_origin(_unauthorized_origin_url), SAVE_REQUEST_PENDING) @patch('swh.web.common.origin_save.scheduler') def test_accept_pending_save_request(self, mock_scheduler): origin_type = 'git' origin_url = 'https://v2.pikacode.com/bthate/botlib.git' save_request_url = reverse('api-save-origin', url_args={'origin_type': origin_type, 'origin_url': origin_url}) response = self.client.post(save_request_url, data={}, content_type='application/x-www-form-urlencoded') # noqa self.assertEqual(response.status_code, 200) self.assertEqual(response.data['save_request_status'], SAVE_REQUEST_PENDING) accept_request_url = reverse('admin-origin-save-request-accept', url_args={'origin_type': origin_type, 'origin_url': origin_url}) self.check_not_login(accept_request_url) tasks_data = [ { 'priority': 'high', 'policy': 'oneshot', - 'type': 'origin-update-git', + 'type': 'load-git', 'arguments': { 'kwargs': { 'repo_url': origin_url }, 'args': [] }, 'status': 'next_run_not_scheduled', 'id': 1, } ] mock_scheduler.create_tasks.return_value = tasks_data mock_scheduler.get_tasks.return_value = tasks_data self.client.login(username=_user_name, password=_user_password) response = self.client.post(accept_request_url) self.assertEqual(response.status_code, 200) response = self.client.get(save_request_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.data[0]['save_request_status'], SAVE_REQUEST_ACCEPTED) self.assertEqual(response.data[0]['save_task_status'], SAVE_TASK_NOT_YET_SCHEDULED) @patch('swh.web.common.origin_save.scheduler') def test_reject_pending_save_request(self, mock_scheduler): origin_type = 'git' origin_url = 'https://wikipedia.com' save_request_url = reverse('api-save-origin', url_args={'origin_type': origin_type, 'origin_url': origin_url}) response = self.client.post(save_request_url, data={}, content_type='application/x-www-form-urlencoded') # noqa self.assertEqual(response.status_code, 200) self.assertEqual(response.data['save_request_status'], SAVE_REQUEST_PENDING) reject_request_url = reverse('admin-origin-save-request-reject', url_args={'origin_type': origin_type, 'origin_url': origin_url}) self.check_not_login(reject_request_url) self.client.login(username=_user_name, password=_user_password) response = self.client.post(reject_request_url) self.assertEqual(response.status_code, 200) tasks_data = [ { 'priority': 'high', 'policy': 'oneshot', - 'type': 'origin-update-git', + 'type': 'load-git', 'arguments': { 'kwargs': { 'repo_url': origin_url }, 'args': [] }, 'status': 'next_run_not_scheduled', 'id': 1, } ] mock_scheduler.create_tasks.return_value = tasks_data mock_scheduler.get_tasks.return_value = tasks_data response = self.client.get(save_request_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.data[0]['save_request_status'], SAVE_REQUEST_REJECTED) def test_remove_save_request(self): sor = SaveOriginRequest.objects.create(origin_type='git', origin_url='https://wikipedia.com', # noqa status=SAVE_REQUEST_PENDING) self.assertEqual(SaveOriginRequest.objects.count(), 1) remove_request_url = reverse('admin-origin-save-request-remove', url_args={'sor_id': sor.id}) self.check_not_login(remove_request_url) self.client.login(username=_user_name, password=_user_password) response = self.client.post(remove_request_url) self.assertEqual(response.status_code, 200) self.assertEqual(SaveOriginRequest.objects.count(), 0) diff --git a/swh/web/tests/api/views/test_origin_save.py b/swh/web/tests/api/views/test_origin_save.py index fd9a306c..c210dbf5 100644 --- a/swh/web/tests/api/views/test_origin_save.py +++ b/swh/web/tests/api/views/test_origin_save.py @@ -1,261 +1,261 @@ # Copyright (C) 2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from datetime import datetime, timedelta from django.utils import timezone from rest_framework.test import APITestCase from unittest.mock import patch from swh.web.common.utils import reverse from swh.web.common.models import ( SaveUnauthorizedOrigin, SaveOriginRequest, SAVE_REQUEST_ACCEPTED, SAVE_REQUEST_REJECTED, SAVE_REQUEST_PENDING ) from swh.web.common.models import ( SAVE_TASK_NOT_CREATED, SAVE_TASK_NOT_YET_SCHEDULED, SAVE_TASK_SCHEDULED, SAVE_TASK_FAILED, SAVE_TASK_SUCCEED ) from swh.web.tests.testcase import WebTestCase class SaveApiTestCase(WebTestCase, APITestCase): @classmethod def setUpTestData(cls): # noqa: N802 SaveUnauthorizedOrigin.objects.create( url='https://github.com/user/illegal_repo') SaveUnauthorizedOrigin.objects.create( url='https://gitlab.com/user_to_exclude') def test_invalid_origin_type(self): url = reverse('api-save-origin', url_args={'origin_type': 'foo', 'origin_url': 'https://github.com/torvalds/linux'}) # noqa response = self.client.post(url) self.assertEqual(response.status_code, 400) def test_invalid_origin_url(self): url = reverse('api-save-origin', url_args={'origin_type': 'git', 'origin_url': 'bar'}) response = self.client.post(url) self.assertEqual(response.status_code, 400) def check_created_save_request_status(self, mock_scheduler, origin_url, scheduler_task_status, expected_request_status, expected_task_status=None, visit_date=None): if not scheduler_task_status: mock_scheduler.get_tasks.return_value = [] else: mock_scheduler.get_tasks.return_value = \ [{ 'priority': 'high', 'policy': 'oneshot', - 'type': 'origin-update-git', + 'type': 'load-git', 'arguments': { 'kwargs': { 'repo_url': origin_url }, 'args': [] }, 'status': scheduler_task_status, 'id': 1, }] mock_scheduler.create_tasks.return_value = \ [{ 'priority': 'high', 'policy': 'oneshot', - 'type': 'origin-update-git', + 'type': 'load-git', 'arguments': { 'kwargs': { 'repo_url': origin_url }, 'args': [] }, 'status': 'next_run_not_scheduled', 'id': 1, }] url = reverse('api-save-origin', url_args={'origin_type': 'git', 'origin_url': origin_url}) with patch('swh.web.common.origin_save._get_visit_info_for_save_request') as mock_visit_date: # noqa mock_visit_date.return_value = (visit_date, None) response = self.client.post(url) if expected_request_status != SAVE_REQUEST_REJECTED: self.assertEqual(response.status_code, 200) self.assertEqual(response.data['save_request_status'], expected_request_status) self.assertEqual(response.data['save_task_status'], expected_task_status) else: self.assertEqual(response.status_code, 403) def check_save_request_status(self, mock_scheduler, origin_url, expected_request_status, expected_task_status, scheduler_task_status='next_run_not_scheduled', # noqa visit_date=None): mock_scheduler.get_tasks.return_value = \ [{ 'priority': 'high', 'policy': 'oneshot', - 'type': 'origin-update-git', + 'type': 'load-git', 'arguments': { 'kwargs': { 'repo_url': origin_url }, 'args': [] }, 'status': scheduler_task_status, 'id': 1, }] url = reverse('api-save-origin', url_args={'origin_type': 'git', 'origin_url': origin_url}) with patch('swh.web.common.origin_save._get_visit_info_for_save_request') as mock_visit_date: # noqa mock_visit_date.return_value = (visit_date, None) response = self.client.get(url) self.assertEqual(response.status_code, 200) save_request_data = response.data[0] self.assertEqual(save_request_data['save_request_status'], expected_request_status) self.assertEqual(save_request_data['save_task_status'], expected_task_status) # Check that save task status is still available when # the scheduler task has been archived mock_scheduler.get_tasks.return_value = [] response = self.client.get(url) self.assertEqual(response.status_code, 200) save_request_data = response.data[0] self.assertEqual(save_request_data['save_task_status'], expected_task_status) @patch('swh.web.common.origin_save.scheduler') def test_save_request_rejected(self, mock_scheduler): origin_url = 'https://github.com/user/illegal_repo' self.check_created_save_request_status(mock_scheduler, origin_url, None, SAVE_REQUEST_REJECTED) self.check_save_request_status(mock_scheduler, origin_url, SAVE_REQUEST_REJECTED, SAVE_TASK_NOT_CREATED) @patch('swh.web.common.origin_save.scheduler') def test_save_request_pending(self, mock_scheduler): origin_url = 'https://unkwownforge.com/user/repo' self.check_created_save_request_status(mock_scheduler, origin_url, None, SAVE_REQUEST_PENDING, SAVE_TASK_NOT_CREATED) self.check_save_request_status(mock_scheduler, origin_url, SAVE_REQUEST_PENDING, SAVE_TASK_NOT_CREATED) @patch('swh.web.common.origin_save.scheduler') def test_save_request_succeed(self, mock_scheduler): origin_url = 'https://github.com/Kitware/CMake' self.check_created_save_request_status(mock_scheduler, origin_url, None, SAVE_REQUEST_ACCEPTED, SAVE_TASK_NOT_YET_SCHEDULED) self.check_save_request_status(mock_scheduler, origin_url, SAVE_REQUEST_ACCEPTED, SAVE_TASK_SCHEDULED, scheduler_task_status='next_run_scheduled') # noqa self.check_save_request_status(mock_scheduler, origin_url, SAVE_REQUEST_ACCEPTED, SAVE_TASK_SCHEDULED, scheduler_task_status='completed', visit_date=None) # noqa visit_date = datetime.now(tz=timezone.utc) + timedelta(hours=1) self.check_save_request_status(mock_scheduler, origin_url, SAVE_REQUEST_ACCEPTED, SAVE_TASK_SUCCEED, scheduler_task_status='completed', visit_date=visit_date) # noqa @patch('swh.web.common.origin_save.scheduler') def test_save_request_failed(self, mock_scheduler): origin_url = 'https://gitlab.com/inkscape/inkscape' self.check_created_save_request_status(mock_scheduler, origin_url, None, SAVE_REQUEST_ACCEPTED, SAVE_TASK_NOT_YET_SCHEDULED) self.check_save_request_status(mock_scheduler, origin_url, SAVE_REQUEST_ACCEPTED, SAVE_TASK_SCHEDULED, scheduler_task_status='next_run_scheduled') # noqa self.check_save_request_status(mock_scheduler, origin_url, SAVE_REQUEST_ACCEPTED, SAVE_TASK_FAILED, scheduler_task_status='disabled') # noqa @patch('swh.web.common.origin_save.scheduler') def test_create_save_request_only_when_needed(self, mock_scheduler): origin_url = 'https://github.com/webpack/webpack' SaveOriginRequest.objects.create(origin_type='git', origin_url=origin_url, status=SAVE_REQUEST_ACCEPTED, # noqa loading_task_id=56) self.check_created_save_request_status(mock_scheduler, origin_url, 'next_run_not_scheduled', SAVE_REQUEST_ACCEPTED, SAVE_TASK_NOT_YET_SCHEDULED) sors = list(SaveOriginRequest.objects.filter(origin_type='git', origin_url=origin_url)) self.assertEqual(len(sors), 1) self.check_created_save_request_status(mock_scheduler, origin_url, 'next_run_scheduled', SAVE_REQUEST_ACCEPTED, SAVE_TASK_SCHEDULED) sors = list(SaveOriginRequest.objects.filter(origin_type='git', origin_url=origin_url)) self.assertEqual(len(sors), 1) visit_date = datetime.now(tz=timezone.utc) + timedelta(hours=1) self.check_created_save_request_status(mock_scheduler, origin_url, 'completed', SAVE_REQUEST_ACCEPTED, SAVE_TASK_NOT_YET_SCHEDULED, visit_date=visit_date) sors = list(SaveOriginRequest.objects.filter(origin_type='git', origin_url=origin_url)) self.assertEqual(len(sors), 2) self.check_created_save_request_status(mock_scheduler, origin_url, 'disabled', SAVE_REQUEST_ACCEPTED, SAVE_TASK_NOT_YET_SCHEDULED) sors = list(SaveOriginRequest.objects.filter(origin_type='git', origin_url=origin_url)) self.assertEqual(len(sors), 3) def test_get_save_requests_unknown_origin(self): unknown_origin_url = 'https://gitlab.com/foo/bar' url = reverse('api-save-origin', url_args={'origin_type': 'git', 'origin_url': unknown_origin_url}) response = self.client.get(url) self.assertEqual(response.status_code, 404) self.assertEqual(response.data, { 'exception': 'NotFoundExc', 'reason': ('No save requests found for origin with type ' 'git and url %s.') % unknown_origin_url }) diff --git a/version.txt b/version.txt index f7ab7dc2..6368bc77 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -v0.0.196-0-gfb49250a \ No newline at end of file +v0.0.198-0-g311131e6 \ No newline at end of file