Started by user Helio Chissini de Castro Running as Helio Chissini de Castro Obtained Jenkinsfile from git https://github.com/eclipse/sw360.website.git [Pipeline] Start of Pipeline [Pipeline] echo [WARNING] label option is deprecated. To use a static pod template, use the 'inheritFrom' option. [Pipeline] podTemplate [Pipeline] { [Pipeline] node Created Pod: kubernetes sw360/hugo-agent-pszhw-w733t [Normal][sw360/hugo-agent-pszhw-w733t][Scheduled] Successfully assigned sw360/hugo-agent-pszhw-w733t to okdnode-27 [Normal][sw360/hugo-agent-pszhw-w733t][AddedInterface] Add eth0 [10.40.50.41/23] from openshift-sdn [Normal][sw360/hugo-agent-pszhw-w733t][Pulled] Container image "klakegg/hugo:0.93.2-ext-ubuntu" already present on machine [Normal][sw360/hugo-agent-pszhw-w733t][Created] Created container hugo [Normal][sw360/hugo-agent-pszhw-w733t][Started] Started container hugo [Normal][sw360/hugo-agent-pszhw-w733t][Pulled] Container image "docker.io/eclipsecbi/jiro-agent-basic:remoting-4.13" already present on machine [Normal][sw360/hugo-agent-pszhw-w733t][Created] Created container jnlp [Normal][sw360/hugo-agent-pszhw-w733t][Started] Started container jnlp Still waiting to schedule task ‘hugo-agent-pszhw-w733t’ is offline Agent hugo-agent-pszhw-w733t is provisioned from template hugo-agent-pszhw --- apiVersion: "v1" kind: "Pod" metadata: annotations: buildUrl: "http://jenkins-ui.sw360.svc.cluster.local/sw360/job/sw360.website.staging/4/" runUrl: "job/sw360.website.staging/4/" labels: run: "hugo" jenkins: "slave" jenkins/label-digest: "7ac110df4066c009b519c7b03c365692b5eeb4d5" jenkins/label: "hugo-agent" name: "hugo-agent-pszhw-w733t" namespace: "sw360" spec: containers: - command: - "cat" image: "klakegg/hugo:0.93.2-ext-ubuntu" name: "hugo" tty: true volumeMounts: - mountPath: "/home/jenkins/agent" name: "workspace-volume" readOnly: false - env: - name: "JENKINS_SECRET" value: "********" - name: "JENKINS_TUNNEL" value: "jenkins-discovery.sw360.svc.cluster.local:50000" - name: "JENKINS_AGENT_NAME" value: "hugo-agent-pszhw-w733t" - name: "JENKINS_NAME" value: "hugo-agent-pszhw-w733t" - name: "JENKINS_AGENT_WORKDIR" value: "/home/jenkins/agent" - name: "JENKINS_URL" value: "http://jenkins-ui.sw360.svc.cluster.local/sw360/" - name: "HOME" value: "/home/jenkins/agent" image: "docker.io/eclipsecbi/jiro-agent-basic:remoting-4.13" name: "jnlp" resources: limits: {} requests: memory: "256Mi" cpu: "100m" volumeMounts: - mountPath: "/home/jenkins/agent" name: "workspace-volume" readOnly: false nodeSelector: kubernetes.io/os: "linux" restartPolicy: "Never" volumes: - emptyDir: medium: "" name: "workspace-volume" Running on hugo-agent-pszhw-w733t in /home/jenkins/agent/workspace/sw360.website.staging [Pipeline] { [Pipeline] dir Running in /home/jenkins/agent/workspace/sw360.website.staging/hugo [Pipeline] { [Pipeline] stage [Pipeline] { (Declarative: Checkout SCM) [Pipeline] checkout The recommended git tool is: git No credentials specified Cloning the remote Git repository Cloning repository https://github.com/eclipse/sw360.website.git > git init /home/jenkins/agent/workspace/sw360.website.staging/hugo # timeout=10 Fetching upstream changes from https://github.com/eclipse/sw360.website.git > git --version # timeout=10 > git --version # 'git version 2.20.1' > git fetch --tags --force --progress -- https://github.com/eclipse/sw360.website.git +refs/heads/*:refs/remotes/origin/* # timeout=10 Avoid second fetch Checking out Revision c5c38c6b736d89b63d675cb6d8211f58cf2abcca (refs/remotes/origin/hcc/new_website) > git config remote.origin.url https://github.com/eclipse/sw360.website.git # timeout=10 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10 > git rev-parse refs/remotes/origin/hcc/new_website^{commit} # timeout=10 > git config core.sparsecheckout # timeout=10 > git checkout -f c5c38c6b736d89b63d675cb6d8211f58cf2abcca # timeout=10 Commit message: "bug(jenkins): Fixed jenkins build" First time build. Skipping changelog. > git rev-list --no-walk 5e0578592e499d1aa62b3381adf7c4af28242c23 # timeout=10 [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // dir [Pipeline] withEnv [Pipeline] { [Pipeline] withEnv [Pipeline] { [Pipeline] stage [Pipeline] { (Checkout www repo) [Pipeline] sh + grep -q '^git.eclipse.org' /home/jenkins/agent/.ssh/known_hosts grep: /home/jenkins/agent/.ssh/known_hosts: No such file or directory + mkdir -p /home/jenkins/agent/.ssh + ssh-keyscan -t rsa git.eclipse.org # git.eclipse.org:22 SSH-2.0-OpenSSH_7.2 [Pipeline] dir Running in /home/jenkins/agent/workspace/sw360.website.staging/www [Pipeline] { [Pipeline] git The recommended git tool is: NONE using credential git.eclipse.org-bot-ssh Cloning the remote Git repository Cloning repository ssh://genie.sw360@git.eclipse.org:29418/www.eclipse.org/sw360.git > git init /home/jenkins/agent/workspace/sw360.website.staging/www # timeout=10 Fetching upstream changes from ssh://genie.sw360@git.eclipse.org:29418/www.eclipse.org/sw360.git > git --version # timeout=10 > git --version # 'git version 2.20.1' using GIT_SSH to set credentials ssh://genie.sw360@git.eclipse.org [INFO] Currently running in a labeled security context > /usr/bin/chcon --type=ssh_home_t /home/jenkins/agent/workspace/sw360.website.staging/www@tmp/jenkins-gitclient-ssh18115390056092125542.key > git fetch --tags --force --progress -- ssh://genie.sw360@git.eclipse.org:29418/www.eclipse.org/sw360.git +refs/heads/*:refs/remotes/origin/* # timeout=10 Avoid second fetch Checking out Revision a93d4695b48543c1c904ef3bd84a4b8e2b9606ac (refs/remotes/origin/master) > git config remote.origin.url ssh://genie.sw360@git.eclipse.org:29418/www.eclipse.org/sw360.git # timeout=10 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 > git config core.sparsecheckout # timeout=10 > git checkout -f a93d4695b48543c1c904ef3bd84a4b8e2b9606ac # timeout=10 Commit message: "Website build sw360.website-70" > git branch -a -v --no-abbrev # timeout=10 > git checkout -b master a93d4695b48543c1c904ef3bd84a4b8e2b9606ac # timeout=10 > git rev-list --no-walk a93d4695b48543c1c904ef3bd84a4b8e2b9606ac # timeout=10 [Pipeline] } [Pipeline] // dir [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Build website with Hugo) [Pipeline] container [Pipeline] { [Pipeline] dir Running in /home/jenkins/agent/workspace/sw360.website.staging/hugo [Pipeline] { [Pipeline] sh + git submodule add https://github.com/google/docsy.git themes/docsy Cloning into '/home/jenkins/agent/workspace/sw360.website.staging/hugo/themes/docsy'... [Pipeline] sh + git submodule update --init --recursive Submodule 'assets/vendor/Font-Awesome' (https://github.com/FortAwesome/Font-Awesome.git) registered for path 'themes/docsy/assets/vendor/Font-Awesome' Submodule 'assets/vendor/bootstrap' (https://github.com/twbs/bootstrap.git) registered for path 'themes/docsy/assets/vendor/bootstrap' Cloning into '/home/jenkins/agent/workspace/sw360.website.staging/hugo/themes/docsy/assets/vendor/Font-Awesome'... Cloning into '/home/jenkins/agent/workspace/sw360.website.staging/hugo/themes/docsy/assets/vendor/bootstrap'... Submodule path 'themes/docsy/assets/vendor/Font-Awesome': checked out '7d3d774145ac38663f6d1effc6def0334b68ab7e' Submodule path 'themes/docsy/assets/vendor/bootstrap': checked out '043a03c95a2ad6738f85b65e53b9dbdfb03b8d10' [Pipeline] sh + hugo -b https://www.eclipse.org/sw360/ hugo: downloading modules … hugo: collected modules in 29513 ms Start building sites … hugo v0.93.2-643B5AE9+extended linux/amd64 BuildDate=2022-03-05T10:02:23z VendorInfo=hugoguru | EN -------------------+----- Pages | 64 Paginator pages | 0 Non-page files | 0 Static files | 86 Processed images | 0 Aliases | 0 Sitemaps | 1 Cleaned | 0 Total in 37199 ms [Pipeline] } [Pipeline] // dir [Pipeline] } [Pipeline] // container [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Push www) [Pipeline] sh + echo 'copy and update files' copy and update files + rm -rf www/404.html www/about www/blog www/categories www/css www/img www/index.html www/index.xml www/js www/page www/presentations www/resources www/screenshots www/sitemap.xml www/tags + cp -Rvf hugo/public/404.html hugo/public/about hugo/public/css hugo/public/docs hugo/public/favicons hugo/public/img hugo/public/index.html hugo/public/index.xml hugo/public/js hugo/public/presentations hugo/public/robots.txt hugo/public/screenshots hugo/public/scss hugo/public/sitemap.xml hugo/public/webfonts www/ 'hugo/public/404.html' -> 'www/404.html' 'hugo/public/about' -> 'www/about' 'hugo/public/about/index.html' -> 'www/about/index.html' 'hugo/public/css' -> 'www/css' 'hugo/public/css/prism.css' -> 'www/css/prism.css' 'hugo/public/css/shortcodes.css' -> 'www/css/shortcodes.css' 'hugo/public/css/swagger-ui.css' -> 'www/css/swagger-ui.css' 'hugo/public/css/shortcodes' -> 'www/css/shortcodes' 'hugo/public/css/shortcodes/cards-pane.css' -> 'www/css/shortcodes/cards-pane.css' 'hugo/public/css/shortcodes/tabbed-pane.css' -> 'www/css/shortcodes/tabbed-pane.css' 'hugo/public/docs' -> 'www/docs' 'hugo/public/docs/index.html' -> 'www/docs/index.html' 'hugo/public/docs/index.xml' -> 'www/docs/index.xml' 'hugo/public/docs/deployment' -> 'www/docs/deployment' 'hugo/public/docs/deployment/index.html' -> 'www/docs/deployment/index.html' 'hugo/public/docs/deployment/index.xml' -> 'www/docs/deployment/index.xml' 'hugo/public/docs/deployment/deploy-export-and-import' -> 'www/docs/deployment/deploy-export-and-import' 'hugo/public/docs/deployment/deploy-export-and-import/index.html' -> 'www/docs/deployment/deploy-export-and-import/index.html' 'hugo/public/docs/deployment/deploy-cve-search' -> 'www/docs/deployment/deploy-cve-search' 'hugo/public/docs/deployment/deploy-cve-search/index.html' -> 'www/docs/deployment/deploy-cve-search/index.html' 'hugo/public/docs/deployment/deploy-docker' -> 'www/docs/deployment/deploy-docker' 'hugo/public/docs/deployment/deploy-docker/index.html' -> 'www/docs/deployment/deploy-docker/index.html' 'hugo/public/docs/deployment/deploy-configuration-country-codes' -> 'www/docs/deployment/deploy-configuration-country-codes' 'hugo/public/docs/deployment/deploy-configuration-country-codes/index.html' -> 'www/docs/deployment/deploy-configuration-country-codes/index.html' 'hugo/public/docs/deployment/deploy-authorization-concept' -> 'www/docs/deployment/deploy-authorization-concept' 'hugo/public/docs/deployment/deploy-authorization-concept/index.html' -> 'www/docs/deployment/deploy-authorization-concept/index.html' 'hugo/public/docs/deployment/deploy-configuration-files' -> 'www/docs/deployment/deploy-configuration-files' 'hugo/public/docs/deployment/deploy-configuration-files/index.html' -> 'www/docs/deployment/deploy-configuration-files/index.html' 'hugo/public/docs/deployment/deploy-requirements' -> 'www/docs/deployment/deploy-requirements' 'hugo/public/docs/deployment/deploy-requirements/index.html' -> 'www/docs/deployment/deploy-requirements/index.html' 'hugo/public/docs/deployment/deploy-secure-deployment' -> 'www/docs/deployment/deploy-secure-deployment' 'hugo/public/docs/deployment/deploy-secure-deployment/index.html' -> 'www/docs/deployment/deploy-secure-deployment/index.html' 'hugo/public/docs/deployment/baremetal' -> 'www/docs/deployment/baremetal' 'hugo/public/docs/deployment/baremetal/index.html' -> 'www/docs/deployment/baremetal/index.html' 'hugo/public/docs/deployment/baremetal/index.xml' -> 'www/docs/deployment/baremetal/index.xml' 'hugo/public/docs/deployment/baremetal/deploy-natively-11' -> 'www/docs/deployment/baremetal/deploy-natively-11' 'hugo/public/docs/deployment/baremetal/deploy-natively-11/index.html' -> 'www/docs/deployment/baremetal/deploy-natively-11/index.html' 'hugo/public/docs/deployment/upgrading' -> 'www/docs/deployment/upgrading' 'hugo/public/docs/deployment/upgrading/index.html' -> 'www/docs/deployment/upgrading/index.html' 'hugo/public/docs/deployment/upgrading/index.xml' -> 'www/docs/deployment/upgrading/index.xml' 'hugo/public/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11' -> 'www/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11' 'hugo/public/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11/index.html' -> 'www/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11/index.html' 'hugo/public/docs/developers' -> 'www/docs/developers' 'hugo/public/docs/developers/index.html' -> 'www/docs/developers/index.html' 'hugo/public/docs/developers/index.xml' -> 'www/docs/developers/index.xml' 'hugo/public/docs/developers/dev-dod-and-style' -> 'www/docs/developers/dev-dod-and-style' 'hugo/public/docs/developers/dev-dod-and-style/index.html' -> 'www/docs/developers/dev-dod-and-style/index.html' 'hugo/public/docs/developers/dev-branches' -> 'www/docs/developers/dev-branches' 'hugo/public/docs/developers/dev-branches/index.html' -> 'www/docs/developers/dev-branches/index.html' 'hugo/public/docs/developers/dev-filtering-in-portlets' -> 'www/docs/developers/dev-filtering-in-portlets' 'hugo/public/docs/developers/dev-filtering-in-portlets/index.html' -> 'www/docs/developers/dev-filtering-in-portlets/index.html' 'hugo/public/docs/developers/dev-adding-new-fields-to-existing-classes' -> 'www/docs/developers/dev-adding-new-fields-to-existing-classes' 'hugo/public/docs/developers/dev-adding-new-fields-to-existing-classes/index.html' -> 'www/docs/developers/dev-adding-new-fields-to-existing-classes/index.html' 'hugo/public/docs/developers/dev-liferay-friendly-url' -> 'www/docs/developers/dev-liferay-friendly-url' 'hugo/public/docs/developers/dev-liferay-friendly-url/index.html' -> 'www/docs/developers/dev-liferay-friendly-url/index.html' 'hugo/public/docs/developers/dev-fossology-integration' -> 'www/docs/developers/dev-fossology-integration' 'hugo/public/docs/developers/dev-fossology-integration/index.html' -> 'www/docs/developers/dev-fossology-integration/index.html' 'hugo/public/docs/developers/dev-adding-a-new-portlet-frontend' -> 'www/docs/developers/dev-adding-a-new-portlet-frontend' 'hugo/public/docs/developers/dev-adding-a-new-portlet-frontend/index.html' -> 'www/docs/developers/dev-adding-a-new-portlet-frontend/index.html' 'hugo/public/docs/developers/dev-moderation-requests' -> 'www/docs/developers/dev-moderation-requests' 'hugo/public/docs/developers/dev-moderation-requests/index.html' -> 'www/docs/developers/dev-moderation-requests/index.html' 'hugo/public/docs/developers/dev-releasing-sw360' -> 'www/docs/developers/dev-releasing-sw360' 'hugo/public/docs/developers/dev-releasing-sw360/index.html' -> 'www/docs/developers/dev-releasing-sw360/index.html' 'hugo/public/docs/developers/dev-role-authorisation-model' -> 'www/docs/developers/dev-role-authorisation-model' 'hugo/public/docs/developers/dev-role-authorisation-model/index.html' -> 'www/docs/developers/dev-role-authorisation-model/index.html' 'hugo/public/docs/developers/dev-adding-a-new-portlet-backend' -> 'www/docs/developers/dev-adding-a-new-portlet-backend' 'hugo/public/docs/developers/dev-adding-a-new-portlet-backend/index.html' -> 'www/docs/developers/dev-adding-a-new-portlet-backend/index.html' 'hugo/public/docs/developers/dev-semantic-commits' -> 'www/docs/developers/dev-semantic-commits' 'hugo/public/docs/developers/dev-semantic-commits/index.html' -> 'www/docs/developers/dev-semantic-commits/index.html' 'hugo/public/docs/developers/dev-using-requirejs-for-javascript-modules' -> 'www/docs/developers/dev-using-requirejs-for-javascript-modules' 'hugo/public/docs/developers/dev-using-requirejs-for-javascript-modules/index.html' -> 'www/docs/developers/dev-using-requirejs-for-javascript-modules/index.html' 'hugo/public/docs/developers/testcases' -> 'www/docs/developers/testcases' 'hugo/public/docs/developers/testcases/index.html' -> 'www/docs/developers/testcases/index.html' 'hugo/public/docs/developers/testcases/index.xml' -> 'www/docs/developers/testcases/index.xml' 'hugo/public/docs/developers/testcases/test-cases-components' -> 'www/docs/developers/testcases/test-cases-components' 'hugo/public/docs/developers/testcases/test-cases-components/index.html' -> 'www/docs/developers/testcases/test-cases-components/index.html' 'hugo/public/docs/developers/testcases/test-cases-projects' -> 'www/docs/developers/testcases/test-cases-projects' 'hugo/public/docs/developers/testcases/test-cases-projects/index.html' -> 'www/docs/developers/testcases/test-cases-projects/index.html' 'hugo/public/docs/developers/testcases/test-cases-licenses' -> 'www/docs/developers/testcases/test-cases-licenses' 'hugo/public/docs/developers/testcases/test-cases-licenses/index.html' -> 'www/docs/developers/testcases/test-cases-licenses/index.html' 'hugo/public/docs/developers/testcases/test-cases-moderations' -> 'www/docs/developers/testcases/test-cases-moderations' 'hugo/public/docs/developers/testcases/test-cases-moderations/index.html' -> 'www/docs/developers/testcases/test-cases-moderations/index.html' 'hugo/public/docs/developers/dev-testing-frameworks' -> 'www/docs/developers/dev-testing-frameworks' 'hugo/public/docs/developers/dev-testing-frameworks/index.html' -> 'www/docs/developers/dev-testing-frameworks/index.html' 'hugo/public/docs/developers/dev-database-migration-using-costco' -> 'www/docs/developers/dev-database-migration-using-costco' 'hugo/public/docs/developers/dev-database-migration-using-costco/index.html' -> 'www/docs/developers/dev-database-migration-using-costco/index.html' 'hugo/public/docs/developers/dev-rest-api' -> 'www/docs/developers/dev-rest-api' 'hugo/public/docs/developers/dev-rest-api/index.html' -> 'www/docs/developers/dev-rest-api/index.html' 'hugo/public/docs/developers/dev-troubleshooting' -> 'www/docs/developers/dev-troubleshooting' 'hugo/public/docs/developers/dev-troubleshooting/index.html' -> 'www/docs/developers/dev-troubleshooting/index.html' 'hugo/public/docs/developers/dev-external-documents-with-couchdb' -> 'www/docs/developers/dev-external-documents-with-couchdb' 'hugo/public/docs/developers/dev-external-documents-with-couchdb/index.html' -> 'www/docs/developers/dev-external-documents-with-couchdb/index.html' 'hugo/public/docs/userguide' -> 'www/docs/userguide' 'hugo/public/docs/userguide/index.html' -> 'www/docs/userguide/index.html' 'hugo/public/docs/userguide/index.xml' -> 'www/docs/userguide/index.xml' 'hugo/public/docs/userguide/user-attachment-file-types' -> 'www/docs/userguide/user-attachment-file-types' 'hugo/public/docs/userguide/user-attachment-file-types/index.html' -> 'www/docs/userguide/user-attachment-file-types/index.html' 'hugo/public/docs/userguide/user-data-model-enumerations' -> 'www/docs/userguide/user-data-model-enumerations' 'hugo/public/docs/userguide/user-data-model-enumerations/index.html' -> 'www/docs/userguide/user-data-model-enumerations/index.html' 'hugo/public/docs/userguide/user-bdp-import' -> 'www/docs/userguide/user-bdp-import' 'hugo/public/docs/userguide/user-bdp-import/index.html' -> 'www/docs/userguide/user-bdp-import/index.html' 'hugo/public/docs/userguide/vulnerabilitymanagement' -> 'www/docs/userguide/vulnerabilitymanagement' 'hugo/public/docs/userguide/vulnerabilitymanagement/index.html' -> 'www/docs/userguide/vulnerabilitymanagement/index.html' 'hugo/public/docs/userguide/vulnerabilitymanagement/index.xml' -> 'www/docs/userguide/vulnerabilitymanagement/index.xml' 'hugo/public/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project' -> 'www/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project' 'hugo/public/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project/index.html' -> 'www/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project/index.html' 'hugo/public/docs/userguide/user-scheduling-cve-search-by-admins' -> 'www/docs/userguide/user-scheduling-cve-search-by-admins' 'hugo/public/docs/userguide/user-scheduling-cve-search-by-admins/index.html' -> 'www/docs/userguide/user-scheduling-cve-search-by-admins/index.html' 'hugo/public/docs/userguide/user-search' -> 'www/docs/userguide/user-search' 'hugo/public/docs/userguide/user-search/index.html' -> 'www/docs/userguide/user-search/index.html' 'hugo/public/docs/userguide/workflows' -> 'www/docs/userguide/workflows' 'hugo/public/docs/userguide/workflows/index.html' -> 'www/docs/userguide/workflows/index.html' 'hugo/public/docs/userguide/workflows/index.xml' -> 'www/docs/userguide/workflows/index.xml' 'hugo/public/favicons' -> 'www/favicons' 'hugo/public/favicons/android-144x144.png' -> 'www/favicons/android-144x144.png' 'hugo/public/favicons/android-192x192.png' -> 'www/favicons/android-192x192.png' 'hugo/public/favicons/android-36x36.png' -> 'www/favicons/android-36x36.png' 'hugo/public/favicons/android-48x48.png' -> 'www/favicons/android-48x48.png' 'hugo/public/favicons/android-72x72.png' -> 'www/favicons/android-72x72.png' 'hugo/public/favicons/android-96x96.png' -> 'www/favicons/android-96x96.png' 'hugo/public/favicons/android-chrome-192x192.png' -> 'www/favicons/android-chrome-192x192.png' 'hugo/public/favicons/android-chrome-512x512.png' -> 'www/favicons/android-chrome-512x512.png' 'hugo/public/favicons/android-chrome-maskable-192x192.png' -> 'www/favicons/android-chrome-maskable-192x192.png' 'hugo/public/favicons/android-chrome-maskable-512x512.png' -> 'www/favicons/android-chrome-maskable-512x512.png' 'hugo/public/favicons/apple-touch-icon-120x120.png' -> 'www/favicons/apple-touch-icon-120x120.png' 'hugo/public/favicons/apple-touch-icon-152x152.png' -> 'www/favicons/apple-touch-icon-152x152.png' 'hugo/public/favicons/apple-touch-icon-167x167.png' -> 'www/favicons/apple-touch-icon-167x167.png' 'hugo/public/favicons/apple-touch-icon-180x180.png' -> 'www/favicons/apple-touch-icon-180x180.png' 'hugo/public/favicons/apple-touch-icon-60x60.png' -> 'www/favicons/apple-touch-icon-60x60.png' 'hugo/public/favicons/apple-touch-icon-76x76.png' -> 'www/favicons/apple-touch-icon-76x76.png' 'hugo/public/favicons/apple-touch-icon.png' -> 'www/favicons/apple-touch-icon.png' 'hugo/public/favicons/coast-228x228.png' -> 'www/favicons/coast-228x228.png' 'hugo/public/favicons/favicon-1024.png' -> 'www/favicons/favicon-1024.png' 'hugo/public/favicons/favicon-128x128.png' -> 'www/favicons/favicon-128x128.png' 'hugo/public/favicons/favicon-16x16.png' -> 'www/favicons/favicon-16x16.png' 'hugo/public/favicons/favicon-256.png' -> 'www/favicons/favicon-256.png' 'hugo/public/favicons/favicon-256x256.png' -> 'www/favicons/favicon-256x256.png' 'hugo/public/favicons/favicon-32x32.png' -> 'www/favicons/favicon-32x32.png' 'hugo/public/favicons/favicon-48x48.png' -> 'www/favicons/favicon-48x48.png' 'hugo/public/favicons/favicon-64x64.png' -> 'www/favicons/favicon-64x64.png' 'hugo/public/favicons/favicon-96x96.png' -> 'www/favicons/favicon-96x96.png' 'hugo/public/favicons/favicon.ico' -> 'www/favicons/favicon.ico' 'hugo/public/favicons/msapplication-icon-144x144.png' -> 'www/favicons/msapplication-icon-144x144.png' 'hugo/public/favicons/mstile-150x150.png' -> 'www/favicons/mstile-150x150.png' 'hugo/public/favicons/pwa-192x192.png' -> 'www/favicons/pwa-192x192.png' 'hugo/public/favicons/pwa-512x512.png' -> 'www/favicons/pwa-512x512.png' 'hugo/public/favicons/tile150x150.png' -> 'www/favicons/tile150x150.png' 'hugo/public/favicons/tile310x150.png' -> 'www/favicons/tile310x150.png' 'hugo/public/favicons/tile310x310.png' -> 'www/favicons/tile310x310.png' 'hugo/public/favicons/tile70x70.png' -> 'www/favicons/tile70x70.png' 'hugo/public/img' -> 'www/img' 'hugo/public/img/favicon.ico' -> 'www/img/favicon.ico' 'hugo/public/img/featured-background.jpg' -> 'www/img/featured-background.jpg' 'hugo/public/img/banners' -> 'www/img/banners' 'hugo/public/img/banners/banner-1.jpg' -> 'www/img/banners/banner-1.jpg' 'hugo/public/img/carousel' -> 'www/img/carousel' 'hugo/public/img/carousel/sw360-slide-01.jpg' -> 'www/img/carousel/sw360-slide-01.jpg' 'hugo/public/img/carousel/sw360-slide-02.jpg' -> 'www/img/carousel/sw360-slide-02.jpg' 'hugo/public/img/carousel/sw360-slide-03.jpg' -> 'www/img/carousel/sw360-slide-03.jpg' 'hugo/public/img/clients' -> 'www/img/clients' 'hugo/public/img/clients/BoschSI.png' -> 'www/img/clients/BoschSI.png' 'hugo/public/img/clients/Eclipse.png' -> 'www/img/clients/Eclipse.png' 'hugo/public/img/clients/Siemens.png' -> 'www/img/clients/Siemens.png' 'hugo/public/img/clients/Verifa.png' -> 'www/img/clients/Verifa.png' 'hugo/public/img/logos' -> 'www/img/logos' 'hugo/public/img/logos/logo_full.svg' -> 'www/img/logos/logo_full.svg' 'hugo/public/img/sw360screenshots' -> 'www/img/sw360screenshots' 'hugo/public/img/sw360screenshots/sw360screenshot-components01.png' -> 'www/img/sw360screenshots/sw360screenshot-components01.png' 'hugo/public/img/sw360screenshots/sw360screenshot-components02.png' -> 'www/img/sw360screenshots/sw360screenshot-components02.png' 'hugo/public/img/sw360screenshots/sw360screenshot-components03.png' -> 'www/img/sw360screenshots/sw360screenshot-components03.png' 'hugo/public/img/sw360screenshots/sw360screenshot-components04.png' -> 'www/img/sw360screenshots/sw360screenshot-components04.png' 'hugo/public/img/sw360screenshots/sw360screenshot-ecc.png' -> 'www/img/sw360screenshots/sw360screenshot-ecc.png' 'hugo/public/img/sw360screenshots/sw360screenshot-home.png' -> 'www/img/sw360screenshots/sw360screenshot-home.png' 'hugo/public/img/sw360screenshots/sw360screenshot-preferences01.png' -> 'www/img/sw360screenshots/sw360screenshot-preferences01.png' 'hugo/public/img/sw360screenshots/sw360screenshot-preferences02.png' -> 'www/img/sw360screenshots/sw360screenshot-preferences02.png' 'hugo/public/img/sw360screenshots/sw360screenshot-projectlist.png' -> 'www/img/sw360screenshots/sw360screenshot-projectlist.png' 'hugo/public/img/sw360screenshots/sw360screenshot-projects01.png' -> 'www/img/sw360screenshots/sw360screenshot-projects01.png' 'hugo/public/img/sw360screenshots/sw360screenshot-projects02.png' -> 'www/img/sw360screenshots/sw360screenshot-projects02.png' 'hugo/public/img/sw360screenshots/sw360screenshot-projects03.png' -> 'www/img/sw360screenshots/sw360screenshot-projects03.png' 'hugo/public/img/sw360screenshots/sw360screenshot-projects04.png' -> 'www/img/sw360screenshots/sw360screenshot-projects04.png' 'hugo/public/img/sw360screenshots/sw360screenshot-search.png' -> 'www/img/sw360screenshots/sw360screenshot-search.png' 'hugo/public/index.html' -> 'www/index.html' 'hugo/public/index.xml' -> 'www/index.xml' 'hugo/public/js' -> 'www/js' 'hugo/public/js/deflate.js' -> 'www/js/deflate.js' 'hugo/public/js/prism.js' -> 'www/js/prism.js' 'hugo/public/js/swagger-ui-bundle.js' -> 'www/js/swagger-ui-bundle.js' 'hugo/public/js/swagger-ui-standalone-preset.js' -> 'www/js/swagger-ui-standalone-preset.js' 'hugo/public/js/tabpane-persist.js' -> 'www/js/tabpane-persist.js' 'hugo/public/js/main.js' -> 'www/js/main.js' 'hugo/public/presentations' -> 'www/presentations' 'hugo/public/presentations/index.html' -> 'www/presentations/index.html' 'hugo/public/presentations/index.xml' -> 'www/presentations/index.xml' 'hugo/public/robots.txt' -> 'www/robots.txt' 'hugo/public/screenshots' -> 'www/screenshots' 'hugo/public/screenshots/index.html' -> 'www/screenshots/index.html' 'hugo/public/scss' -> 'www/scss' 'hugo/public/scss/main.css.map' -> 'www/scss/main.css.map' 'hugo/public/scss/main.css' -> 'www/scss/main.css' 'hugo/public/sitemap.xml' -> 'www/sitemap.xml' 'hugo/public/webfonts' -> 'www/webfonts' 'hugo/public/webfonts/fa-brands-400.eot' -> 'www/webfonts/fa-brands-400.eot' 'hugo/public/webfonts/fa-brands-400.svg' -> 'www/webfonts/fa-brands-400.svg' 'hugo/public/webfonts/fa-brands-400.ttf' -> 'www/webfonts/fa-brands-400.ttf' 'hugo/public/webfonts/fa-brands-400.woff' -> 'www/webfonts/fa-brands-400.woff' 'hugo/public/webfonts/fa-brands-400.woff2' -> 'www/webfonts/fa-brands-400.woff2' 'hugo/public/webfonts/fa-regular-400.eot' -> 'www/webfonts/fa-regular-400.eot' 'hugo/public/webfonts/fa-regular-400.svg' -> 'www/webfonts/fa-regular-400.svg' 'hugo/public/webfonts/fa-regular-400.ttf' -> 'www/webfonts/fa-regular-400.ttf' 'hugo/public/webfonts/fa-regular-400.woff' -> 'www/webfonts/fa-regular-400.woff' 'hugo/public/webfonts/fa-regular-400.woff2' -> 'www/webfonts/fa-regular-400.woff2' 'hugo/public/webfonts/fa-solid-900.eot' -> 'www/webfonts/fa-solid-900.eot' 'hugo/public/webfonts/fa-solid-900.svg' -> 'www/webfonts/fa-solid-900.svg' 'hugo/public/webfonts/fa-solid-900.ttf' -> 'www/webfonts/fa-solid-900.ttf' 'hugo/public/webfonts/fa-solid-900.woff' -> 'www/webfonts/fa-solid-900.woff' 'hugo/public/webfonts/fa-solid-900.woff2' -> 'www/webfonts/fa-solid-900.woff2' [Pipeline] dir Running in /home/jenkins/agent/workspace/sw360.website.staging/www [Pipeline] { [Pipeline] sshagent [ssh-agent] Using credentials genie.sw360 (ssh://genie.sw360@git.eclipse.org) [ssh-agent] Looking for ssh-agent implementation... [ssh-agent] Exec ssh-agent (binary ssh-agent on a remote machine) $ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-R2OZTHO2jQrM/agent.279 SSH_AGENT_PID=281 Running ssh-add (command line suppressed) Identity added: /home/jenkins/agent/workspace/sw360.website.staging/www@tmp/private_key_7639446756905708061.key (/home/jenkins/agent/workspace/sw360.website.staging/www@tmp/private_key_7639446756905708061.key) [ssh-agent] Started. [Pipeline] { [Pipeline] sh + echo 'handling git for branch: master' handling git for branch: master + git config --global user.email sw360-bot@eclipse.org + git config --global user.name 'SW360 Bot' + git add -A + git diff --cached --exit-code diff --git a/404.html b/404.html index d4d383d..013028d 100644 --- a/404.html +++ b/404.html @@ -1,238 +1,300 @@ - - - + + - - - - - 404 Page not found - + + + + - - - - - - + + + + + + + + + + - +404 Page not found | Eclipse SW360 + + + + + - + + + + - - - - - - - - - - - - + + - - - + + + + +
+ + + + +
+
+
+ +
+
+

Not found

+

Oops! This page doesn't exist. Try going back to our home page.

+ +

You can learn how to make a 404 page like this in Custom 404 Pages.

+
+
+ +
+ +
+ + - -
-
-
-
+ -

- - 404 Page not found logo - -

-

We are sorry - this page is not here anymore

-

Error 404 - Page not found

-

Go to Homepage -

-
-
- -
- -
- - - - @@ -241,10 +303,10 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= + - - + \ No newline at end of file diff --git a/about/index.html b/about/index.html index e2f629e..a392ee0 100644 --- a/about/index.html +++ b/about/index.html @@ -1,201 +1,206 @@ - - - + + - - - - - Eclipse SW360 - About - + + + + - - - - - - + + + + + + + + + + - +About Eclipse SW360 | Eclipse SW360 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
-
-
-
-

Eclipse SW360 - About

-
-
-
-
-
-
-
- -
-

September 6, 2018

+
+
+
+
+
+ + +
+ +
+

About Eclipse SW360

-
- + +
+
+
+
+
+ +
+
+
+

In most cases, software today is not built from scratch, but rather assembled from various prepackaged third-party software components. As a result, organizations face the following challenges:

-
  • Verifying various aspects of compliance when using third-party software components: license compliance, ECC checks, IP assessments, etc.
  • Sharing knowledge about software components and their qualities. For example, which software components should be recommended, which should be phased out based on which criteria?
  • Providing a broad overview of the components used: An organization and its supply chain management must have information about which assets are integrated into which products or solutions.
-

These three main use cases target different roles in an organization: quality managers, software developers, legal counsels, software architects, R&D managers etc. However, all these use cases share a common need for a central hub that manages insights into software components.

-

SW360 is an open source software project licensed under the EPL-1.0 that provides both a web application and a repository to collect, organize and make available information about software components. It establishes a central hub for software components in an organization. SW360 allows for

-
  • tracking components used by a project/product,
  • assessing security vulnerabilities,
  • @@ -203,165 +208,163 @@
  • enforcing policies, and
  • generating legal documents.
-

For example, SW360 can trigger a clearing process in the open source compliance tool FOSSology and import the resulting clearing reporting. Data is either stored in SW360’s database or on the fly imported from external sources. In future we plan to have federations of SW360 instances that share selected information. Besides its web-based UI, all functionality of SW360 is available through an API that allows an integration into existing devops tools.

- -

Further Information

- -

You can find more detailed information on the project wiki.

- -
- - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - + + - - -
- - - - -
- - -
- -
- +
+ + - + - - @@ -374,27 +377,14 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= -
- - - - - - - - - - - - + - - + \ No newline at end of file diff --git a/blog/ecf2017/index.html b/blog/ecf2017/index.html deleted file mode 100644 index dc4aa3d..0000000 --- a/blog/ecf2017/index.html +++ /dev/null @@ -1,384 +0,0 @@ - - - - - - - - - Eclipse Con France 2017 Talk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - -
- -
-
-
-
-

Eclipse Con France 2017 Talk

-
-
-
-
- - -
-
- -
- - - -
- -

July 11, 2017

- -
- - -

Talk @EclipseCon France 2017

- -

Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan.

- - -
- -
- - -
- - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - diff --git a/blog/index.html b/blog/index.html deleted file mode 100644 index f705b3b..0000000 --- a/blog/index.html +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - Blogs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - -
- -
-
-
-
-

Blogs

-
-
-
-
- - -
-
-
- - -
- - - -
-
-
- -
-
-

Eclipse Con France 2017 Talk

-
-

- - - - in talk - - - -

-

- July 11, 2017 -

-
-

Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. -

-

Continue reading -

-
-
-
- - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - diff --git a/blog/index.xml b/blog/index.xml deleted file mode 100644 index 485856e..0000000 --- a/blog/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Blogs on Eclipse SW360 - https://www.eclipse.org/sw360/blog/ - Recent content in Blogs on Eclipse SW360 - Hugo -- gohugo.io - en-us - Tue, 11 Jul 2017 11:27:33 +0200 - - - - - - Eclipse Con France 2017 Talk - https://www.eclipse.org/sw360/blog/ecf2017/ - Tue, 11 Jul 2017 11:27:33 +0200 - - https://www.eclipse.org/sw360/blog/ecf2017/ - Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. - - - - - \ No newline at end of file diff --git a/blog/page/1/index.html b/blog/page/1/index.html deleted file mode 100644 index 2c651eb..0000000 --- a/blog/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.eclipse.org/sw360/blog/ \ No newline at end of file diff --git a/categories/index.html b/categories/index.html deleted file mode 100644 index 0486a4c..0000000 --- a/categories/index.html +++ /dev/null @@ -1,374 +0,0 @@ - - - - - - - - - Categories - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - -
- -
-
-
-
-

Categories

-
-
-
-
- - -
-
-
- - -
- - - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - diff --git a/categories/index.xml b/categories/index.xml deleted file mode 100644 index 2d274b1..0000000 --- a/categories/index.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - Categories on Eclipse SW360 - https://www.eclipse.org/sw360/categories/ - Recent content in Categories on Eclipse SW360 - Hugo -- gohugo.io - en-us - - - - - - Introduction - https://www.eclipse.org/sw360/categories/introduction/ - Tue, 11 Jul 2017 11:27:33 +0200 - - https://www.eclipse.org/sw360/categories/introduction/ - - - - - Talk - https://www.eclipse.org/sw360/categories/talk/ - Tue, 11 Jul 2017 11:27:33 +0200 - - https://www.eclipse.org/sw360/categories/talk/ - - - - - Video - https://www.eclipse.org/sw360/categories/video/ - Tue, 11 Jul 2017 11:27:33 +0200 - - https://www.eclipse.org/sw360/categories/video/ - - - - - \ No newline at end of file diff --git a/categories/introduction/index.html b/categories/introduction/index.html deleted file mode 100644 index e0c774f..0000000 --- a/categories/introduction/index.html +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - Introduction - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - -
- -
-
-
-
-

Introduction

-
-
-
-
- - -
-
-
- - -
- - - -
-
-
- -
-
-

Eclipse Con France 2017 Talk

-
-

- - - - in talk - - - -

-

- July 11, 2017 -

-
-

Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. -

-

Continue reading -

-
-
-
- - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - diff --git a/categories/introduction/index.xml b/categories/introduction/index.xml deleted file mode 100644 index fc7c747..0000000 --- a/categories/introduction/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Introduction on Eclipse SW360 - https://www.eclipse.org/sw360/categories/introduction/ - Recent content in Introduction on Eclipse SW360 - Hugo -- gohugo.io - en-us - Tue, 11 Jul 2017 11:27:33 +0200 - - - - - - Eclipse Con France 2017 Talk - https://www.eclipse.org/sw360/blog/ecf2017/ - Tue, 11 Jul 2017 11:27:33 +0200 - - https://www.eclipse.org/sw360/blog/ecf2017/ - Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. - - - - - \ No newline at end of file diff --git a/categories/introduction/page/1/index.html b/categories/introduction/page/1/index.html deleted file mode 100644 index 8b24057..0000000 --- a/categories/introduction/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.eclipse.org/sw360/categories/introduction/ \ No newline at end of file diff --git a/categories/page/1/index.html b/categories/page/1/index.html deleted file mode 100644 index 22a6d7d..0000000 --- a/categories/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.eclipse.org/sw360/categories/ \ No newline at end of file diff --git a/categories/talk/index.html b/categories/talk/index.html deleted file mode 100644 index 3086c12..0000000 --- a/categories/talk/index.html +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - Talk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - -
- -
-
-
-
-

Talk

-
-
-
-
- - -
-
-
- - -
- - - -
-
-
- -
-
-

Eclipse Con France 2017 Talk

-
-

- - - - in talk - - - -

-

- July 11, 2017 -

-
-

Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. -

-

Continue reading -

-
-
-
- - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - diff --git a/categories/talk/index.xml b/categories/talk/index.xml deleted file mode 100644 index ea3b687..0000000 --- a/categories/talk/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Talk on Eclipse SW360 - https://www.eclipse.org/sw360/categories/talk/ - Recent content in Talk on Eclipse SW360 - Hugo -- gohugo.io - en-us - Tue, 11 Jul 2017 11:27:33 +0200 - - - - - - Eclipse Con France 2017 Talk - https://www.eclipse.org/sw360/blog/ecf2017/ - Tue, 11 Jul 2017 11:27:33 +0200 - - https://www.eclipse.org/sw360/blog/ecf2017/ - Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. - - - - - \ No newline at end of file diff --git a/categories/talk/page/1/index.html b/categories/talk/page/1/index.html deleted file mode 100644 index b27f7f8..0000000 --- a/categories/talk/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.eclipse.org/sw360/categories/talk/ \ No newline at end of file diff --git a/categories/video/index.html b/categories/video/index.html deleted file mode 100644 index 6e927c4..0000000 --- a/categories/video/index.html +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - Video - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - -
- -
-
-
-
-

Video

-
-
-
-
- - -
-
-
- - -
- - - -
-
-
- -
-
-

Eclipse Con France 2017 Talk

-
-

- - - - in talk - - - -

-

- July 11, 2017 -

-
-

Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. -

-

Continue reading -

-
-
-
- - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - diff --git a/categories/video/index.xml b/categories/video/index.xml deleted file mode 100644 index f384f74..0000000 --- a/categories/video/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Video on Eclipse SW360 - https://www.eclipse.org/sw360/categories/video/ - Recent content in Video on Eclipse SW360 - Hugo -- gohugo.io - en-us - Tue, 11 Jul 2017 11:27:33 +0200 - - - - - - Eclipse Con France 2017 Talk - https://www.eclipse.org/sw360/blog/ecf2017/ - Tue, 11 Jul 2017 11:27:33 +0200 - - https://www.eclipse.org/sw360/blog/ecf2017/ - Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. - - - - - \ No newline at end of file diff --git a/categories/video/page/1/index.html b/categories/video/page/1/index.html deleted file mode 100644 index f1261e5..0000000 --- a/categories/video/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.eclipse.org/sw360/categories/video/ \ No newline at end of file diff --git a/css/animate.css b/css/animate.css deleted file mode 100644 index f784ce8..0000000 --- a/css/animate.css +++ /dev/null @@ -1,3158 +0,0 @@ -@charset "UTF-8"; -/*! -Animate.css - http://daneden.me/animate -Licensed under the MIT license - http://opensource.org/licenses/MIT - -Copyright (c) 2014 Daniel Eden -*/ - -.animated { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} - -.animated.infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; -} - -.animated.hinge { - -webkit-animation-duration: 2s; - animation-duration: 2s; -} - -@-webkit-keyframes bounce { - 0%, 20%, 53%, 80%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - -webkit-transform: translate3d(0,0,0); - transform: translate3d(0,0,0); - } - - 40%, 43% { - -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); - transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); - -webkit-transform: translate3d(0, -30px, 0); - transform: translate3d(0, -30px, 0); - } - - 70% { - -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); - transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); - -webkit-transform: translate3d(0, -15px, 0); - transform: translate3d(0, -15px, 0); - } - - 90% { - -webkit-transform: translate3d(0,-4px,0); - transform: translate3d(0,-4px,0); - } -} - -@keyframes bounce { - 0%, 20%, 53%, 80%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - -webkit-transform: translate3d(0,0,0); - transform: translate3d(0,0,0); - } - - 40%, 43% { - -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); - transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); - -webkit-transform: translate3d(0, -30px, 0); - transform: translate3d(0, -30px, 0); - } - - 70% { - -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); - transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); - -webkit-transform: translate3d(0, -15px, 0); - transform: translate3d(0, -15px, 0); - } - - 90% { - -webkit-transform: translate3d(0,-4px,0); - transform: translate3d(0,-4px,0); - } -} - -.bounce { - -webkit-animation-name: bounce; - animation-name: bounce; - -webkit-transform-origin: center bottom; - -ms-transform-origin: center bottom; - transform-origin: center bottom; -} - -@-webkit-keyframes flash { - 0%, 50%, 100% { - opacity: 1; - } - - 25%, 75% { - opacity: 0; - } -} - -@keyframes flash { - 0%, 50%, 100% { - opacity: 1; - } - - 25%, 75% { - opacity: 0; - } -} - -.flash { - -webkit-animation-name: flash; - animation-name: flash; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes pulse { - 0% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 50% { - -webkit-transform: scale3d(1.05, 1.05, 1.05); - transform: scale3d(1.05, 1.05, 1.05); - } - - 100% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@keyframes pulse { - 0% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 50% { - -webkit-transform: scale3d(1.05, 1.05, 1.05); - transform: scale3d(1.05, 1.05, 1.05); - } - - 100% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -.pulse { - -webkit-animation-name: pulse; - animation-name: pulse; -} - -@-webkit-keyframes rubberBand { - 0% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 30% { - -webkit-transform: scale3d(1.25, 0.75, 1); - transform: scale3d(1.25, 0.75, 1); - } - - 40% { - -webkit-transform: scale3d(0.75, 1.25, 1); - transform: scale3d(0.75, 1.25, 1); - } - - 50% { - -webkit-transform: scale3d(1.15, 0.85, 1); - transform: scale3d(1.15, 0.85, 1); - } - - 65% { - -webkit-transform: scale3d(.95, 1.05, 1); - transform: scale3d(.95, 1.05, 1); - } - - 75% { - -webkit-transform: scale3d(1.05, .95, 1); - transform: scale3d(1.05, .95, 1); - } - - 100% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@keyframes rubberBand { - 0% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 30% { - -webkit-transform: scale3d(1.25, 0.75, 1); - transform: scale3d(1.25, 0.75, 1); - } - - 40% { - -webkit-transform: scale3d(0.75, 1.25, 1); - transform: scale3d(0.75, 1.25, 1); - } - - 50% { - -webkit-transform: scale3d(1.15, 0.85, 1); - transform: scale3d(1.15, 0.85, 1); - } - - 65% { - -webkit-transform: scale3d(.95, 1.05, 1); - transform: scale3d(.95, 1.05, 1); - } - - 75% { - -webkit-transform: scale3d(1.05, .95, 1); - transform: scale3d(1.05, .95, 1); - } - - 100% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -.rubberBand { - -webkit-animation-name: rubberBand; - animation-name: rubberBand; -} - -@-webkit-keyframes shake { - 0%, 100% { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - 10%, 30%, 50%, 70%, 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - - 20%, 40%, 60%, 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} - -@keyframes shake { - 0%, 100% { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - 10%, 30%, 50%, 70%, 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - - 20%, 40%, 60%, 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} - -.shake { - -webkit-animation-name: shake; - animation-name: shake; -} - -@-webkit-keyframes swing { - 20% { - -webkit-transform: rotate3d(0, 0, 1, 15deg); - transform: rotate3d(0, 0, 1, 15deg); - } - - 40% { - -webkit-transform: rotate3d(0, 0, 1, -10deg); - transform: rotate3d(0, 0, 1, -10deg); - } - - 60% { - -webkit-transform: rotate3d(0, 0, 1, 5deg); - transform: rotate3d(0, 0, 1, 5deg); - } - - 80% { - -webkit-transform: rotate3d(0, 0, 1, -5deg); - transform: rotate3d(0, 0, 1, -5deg); - } - - 100% { - -webkit-transform: rotate3d(0, 0, 1, 0deg); - transform: rotate3d(0, 0, 1, 0deg); - } -} - -@keyframes swing { - 20% { - -webkit-transform: rotate3d(0, 0, 1, 15deg); - transform: rotate3d(0, 0, 1, 15deg); - } - - 40% { - -webkit-transform: rotate3d(0, 0, 1, -10deg); - transform: rotate3d(0, 0, 1, -10deg); - } - - 60% { - -webkit-transform: rotate3d(0, 0, 1, 5deg); - transform: rotate3d(0, 0, 1, 5deg); - } - - 80% { - -webkit-transform: rotate3d(0, 0, 1, -5deg); - transform: rotate3d(0, 0, 1, -5deg); - } - - 100% { - -webkit-transform: rotate3d(0, 0, 1, 0deg); - transform: rotate3d(0, 0, 1, 0deg); - } -} - -.swing { - -webkit-transform-origin: top center; - -ms-transform-origin: top center; - transform-origin: top center; - -webkit-animation-name: swing; - animation-name: swing; -} - -@-webkit-keyframes tada { - 0% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 10%, 20% { - -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); - transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); - } - - 30%, 50%, 70%, 90% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - } - - 40%, 60%, 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - } - - 100% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@keyframes tada { - 0% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 10%, 20% { - -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); - transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); - } - - 30%, 50%, 70%, 90% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - } - - 40%, 60%, 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - } - - 100% { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -.tada { - -webkit-animation-name: tada; - animation-name: tada; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes wobble { - 0% { - -webkit-transform: none; - transform: none; - } - - 15% { - -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - } - - 30% { - -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - } - - 45% { - -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - } - - 60% { - -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - } - - 75% { - -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - } - - 100% { - -webkit-transform: none; - transform: none; - } -} - -@keyframes wobble { - 0% { - -webkit-transform: none; - transform: none; - } - - 15% { - -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - } - - 30% { - -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - } - - 45% { - -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - } - - 60% { - -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - } - - 75% { - -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - } - - 100% { - -webkit-transform: none; - transform: none; - } -} - -.wobble { - -webkit-animation-name: wobble; - animation-name: wobble; -} - -@-webkit-keyframes bounceIn { - 0%, 20%, 40%, 60%, 80%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } - - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - - 40% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - - 80% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97); - } - - 100% { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@keyframes bounceIn { - 0%, 20%, 40%, 60%, 80%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } - - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - - 40% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - - 80% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97); - } - - 100% { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -.bounceIn { - -webkit-animation-name: bounceIn; - animation-name: bounceIn; - -webkit-animation-duration: .75s; - animation-duration: .75s; -} - -@-webkit-keyframes bounceInDown { - 0%, 60%, 75%, 90%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -3000px, 0); - transform: translate3d(0, -3000px, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(0, 25px, 0); - transform: translate3d(0, 25px, 0); - } - - 75% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - - 90% { - -webkit-transform: translate3d(0, 5px, 0); - transform: translate3d(0, 5px, 0); - } - - 100% { - -webkit-transform: none; - transform: none; - } -} - -@keyframes bounceInDown { - 0%, 60%, 75%, 90%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -3000px, 0); - transform: translate3d(0, -3000px, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(0, 25px, 0); - transform: translate3d(0, 25px, 0); - } - - 75% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - - 90% { - -webkit-transform: translate3d(0, 5px, 0); - transform: translate3d(0, 5px, 0); - } - - 100% { - -webkit-transform: none; - transform: none; - } -} - -.bounceInDown { - -webkit-animation-name: bounceInDown; - animation-name: bounceInDown; -} - -@-webkit-keyframes bounceInLeft { - 0%, 60%, 75%, 90%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(-3000px, 0, 0); - transform: translate3d(-3000px, 0, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(25px, 0, 0); - transform: translate3d(25px, 0, 0); - } - - 75% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - - 90% { - -webkit-transform: translate3d(5px, 0, 0); - transform: translate3d(5px, 0, 0); - } - - 100% { - -webkit-transform: none; - transform: none; - } -} - -@keyframes bounceInLeft { - 0%, 60%, 75%, 90%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(-3000px, 0, 0); - transform: translate3d(-3000px, 0, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(25px, 0, 0); - transform: translate3d(25px, 0, 0); - } - - 75% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - - 90% { - -webkit-transform: translate3d(5px, 0, 0); - transform: translate3d(5px, 0, 0); - } - - 100% { - -webkit-transform: none; - transform: none; - } -} - -.bounceInLeft { - -webkit-animation-name: bounceInLeft; - animation-name: bounceInLeft; -} - -@-webkit-keyframes bounceInRight { - 0%, 60%, 75%, 90%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(3000px, 0, 0); - transform: translate3d(3000px, 0, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(-25px, 0, 0); - transform: translate3d(-25px, 0, 0); - } - - 75% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } - - 90% { - -webkit-transform: translate3d(-5px, 0, 0); - transform: translate3d(-5px, 0, 0); - } - - 100% { - -webkit-transform: none; - transform: none; - } -} - -@keyframes bounceInRight { - 0%, 60%, 75%, 90%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(3000px, 0, 0); - transform: translate3d(3000px, 0, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(-25px, 0, 0); - transform: translate3d(-25px, 0, 0); - } - - 75% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } - - 90% { - -webkit-transform: translate3d(-5px, 0, 0); - transform: translate3d(-5px, 0, 0); - } - - 100% { - -webkit-transform: none; - transform: none; - } -} - -.bounceInRight { - -webkit-animation-name: bounceInRight; - animation-name: bounceInRight; -} - -@-webkit-keyframes bounceInUp { - 0%, 60%, 75%, 90%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 3000px, 0); - transform: translate3d(0, 3000px, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - - 75% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - - 90% { - -webkit-transform: translate3d(0, -5px, 0); - transform: translate3d(0, -5px, 0); - } - - 100% { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes bounceInUp { - 0%, 60%, 75%, 90%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 3000px, 0); - transform: translate3d(0, 3000px, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - - 75% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - - 90% { - -webkit-transform: translate3d(0, -5px, 0); - transform: translate3d(0, -5px, 0); - } - - 100% { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.bounceInUp { - -webkit-animation-name: bounceInUp; - animation-name: bounceInUp; -} - -@-webkit-keyframes bounceOut { - 20% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - - 50%, 55% { - opacity: 1; - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - - 100% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } -} - -@keyframes bounceOut { - 20% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - - 50%, 55% { - opacity: 1; - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - - 100% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } -} - -.bounceOut { - -webkit-animation-name: bounceOut; - animation-name: bounceOut; - -webkit-animation-duration: .75s; - animation-duration: .75s; -} - -@-webkit-keyframes bounceOutDown { - 20% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - - 40%, 45% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} - -@keyframes bounceOutDown { - 20% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - - 40%, 45% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} - -.bounceOutDown { - -webkit-animation-name: bounceOutDown; - animation-name: bounceOutDown; -} - -@-webkit-keyframes bounceOutLeft { - 20% { - opacity: 1; - -webkit-transform: translate3d(20px, 0, 0); - transform: translate3d(20px, 0, 0); - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} - -@keyframes bounceOutLeft { - 20% { - opacity: 1; - -webkit-transform: translate3d(20px, 0, 0); - transform: translate3d(20px, 0, 0); - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} - -.bounceOutLeft { - -webkit-animation-name: bounceOutLeft; - animation-name: bounceOutLeft; -} - -@-webkit-keyframes bounceOutRight { - 20% { - opacity: 1; - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} - -@keyframes bounceOutRight { - 20% { - opacity: 1; - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} - -.bounceOutRight { - -webkit-animation-name: bounceOutRight; - animation-name: bounceOutRight; -} - -@-webkit-keyframes bounceOutUp { - 20% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - - 40%, 45% { - opacity: 1; - -webkit-transform: translate3d(0, 20px, 0); - transform: translate3d(0, 20px, 0); - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} - -@keyframes bounceOutUp { - 20% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - - 40%, 45% { - opacity: 1; - -webkit-transform: translate3d(0, 20px, 0); - transform: translate3d(0, 20px, 0); - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} - -.bounceOutUp { - -webkit-animation-name: bounceOutUp; - animation-name: bounceOutUp; -} - -@-webkit-keyframes fadeIn { - 0% {opacity: 0;} - 100% {opacity: 1;} -} - -@keyframes fadeIn { - 0% {opacity: 0;} - 100% {opacity: 1;} -} - -.fadeIn { - -webkit-animation-name: fadeIn; - animation-name: fadeIn; -} - -@-webkit-keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -@keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -.fadeInDown { - -webkit-animation-name: fadeInDown; - animation-name: fadeInDown; -} - -@-webkit-keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -@keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -.fadeInDownBig { - -webkit-animation-name: fadeInDownBig; - animation-name: fadeInDownBig; -} - -@-webkit-keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -@keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -.fadeInLeft { - -webkit-animation-name: fadeInLeft; - animation-name: fadeInLeft; -} - -@-webkit-keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -@keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -.fadeInLeftBig { - -webkit-animation-name: fadeInLeftBig; - animation-name: fadeInLeftBig; -} - -@-webkit-keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -@keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -.fadeInRight { - -webkit-animation-name: fadeInRight; - animation-name: fadeInRight; -} - -@-webkit-keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -@keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -.fadeInRightBig { - -webkit-animation-name: fadeInRightBig; - animation-name: fadeInRightBig; -} - -@-webkit-keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -@keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -.fadeInUp { - -webkit-animation-name: fadeInUp; - animation-name: fadeInUp; -} - -@-webkit-keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -@keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -.fadeInUpBig { - -webkit-animation-name: fadeInUpBig; - animation-name: fadeInUpBig; -} - -@-webkit-keyframes fadeOut { - 0% {opacity: 1;} - 100% {opacity: 0;} -} - -@keyframes fadeOut { - 0% {opacity: 1;} - 100% {opacity: 0;} -} - -.fadeOut { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} - -@-webkit-keyframes fadeOutDown { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} - -@keyframes fadeOutDown { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} - -.fadeOutDown { - -webkit-animation-name: fadeOutDown; - animation-name: fadeOutDown; -} - -@-webkit-keyframes fadeOutDownBig { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} - -@keyframes fadeOutDownBig { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} - -.fadeOutDownBig { - -webkit-animation-name: fadeOutDownBig; - animation-name: fadeOutDownBig; -} - -@-webkit-keyframes fadeOutLeft { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} - -@keyframes fadeOutLeft { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} - -.fadeOutLeft { - -webkit-animation-name: fadeOutLeft; - animation-name: fadeOutLeft; -} - -@-webkit-keyframes fadeOutLeftBig { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} - -@keyframes fadeOutLeftBig { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} - -.fadeOutLeftBig { - -webkit-animation-name: fadeOutLeftBig; - animation-name: fadeOutLeftBig; -} - -@-webkit-keyframes fadeOutRight { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} - -@keyframes fadeOutRight { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} - -.fadeOutRight { - -webkit-animation-name: fadeOutRight; - animation-name: fadeOutRight; -} - -@-webkit-keyframes fadeOutRightBig { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} - -@keyframes fadeOutRightBig { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} - -.fadeOutRightBig { - -webkit-animation-name: fadeOutRightBig; - animation-name: fadeOutRightBig; -} - -@-webkit-keyframes fadeOutUp { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} - -@keyframes fadeOutUp { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} - -.fadeOutUp { - -webkit-animation-name: fadeOutUp; - animation-name: fadeOutUp; -} - -@-webkit-keyframes fadeOutUpBig { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} - -@keyframes fadeOutUpBig { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} - -.fadeOutUpBig { - -webkit-animation-name: fadeOutUpBig; - animation-name: fadeOutUpBig; -} - -@-webkit-keyframes flip { - 0% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); - transform: perspective(400px) rotate3d(0, 1, 0, -360deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 40% { - -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); - transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 50% { - -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); - transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 80% { - -webkit-transform: perspective(400px) scale3d(.95, .95, .95); - transform: perspective(400px) scale3d(.95, .95, .95); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 100% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} - -@keyframes flip { - 0% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); - transform: perspective(400px) rotate3d(0, 1, 0, -360deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 40% { - -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); - transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 50% { - -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); - transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 80% { - -webkit-transform: perspective(400px) scale3d(.95, .95, .95); - transform: perspective(400px) scale3d(.95, .95, .95); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 100% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} - -.animated.flip { - -webkit-backface-visibility: visible; - backface-visibility: visible; - -webkit-animation-name: flip; - animation-name: flip; -} - -@-webkit-keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - } - - 60% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - opacity: 1; - } - - 80% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - } - - 100% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} - -@keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - } - - 60% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - opacity: 1; - } - - 80% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - } - - 100% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} - -.flipInX { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInX; - animation-name: flipInX; -} - -@-webkit-keyframes flipInY { - 0% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - } - - 60% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - opacity: 1; - } - - 80% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - } - - 100% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} - -@keyframes flipInY { - 0% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - } - - 60% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - opacity: 1; - } - - 80% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - } - - 100% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} - -.flipInY { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInY; - animation-name: flipInY; -} - -@-webkit-keyframes flipOutX { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - - 30% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - opacity: 1; - } - - 100% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - opacity: 0; - } -} - -@keyframes flipOutX { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - - 30% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - opacity: 1; - } - - 100% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - opacity: 0; - } -} - -.flipOutX { - -webkit-animation-name: flipOutX; - animation-name: flipOutX; - -webkit-animation-duration: .75s; - animation-duration: .75s; - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; -} - -@-webkit-keyframes flipOutY { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - - 30% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - opacity: 1; - } - - 100% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - opacity: 0; - } -} - -@keyframes flipOutY { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - - 30% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - opacity: 1; - } - - 100% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - opacity: 0; - } -} - -.flipOutY { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipOutY; - animation-name: flipOutY; - -webkit-animation-duration: .75s; - animation-duration: .75s; -} - -@-webkit-keyframes lightSpeedIn { - 0% { - -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); - transform: translate3d(100%, 0, 0) skewX(-30deg); - opacity: 0; - } - - 60% { - -webkit-transform: skewX(20deg); - transform: skewX(20deg); - opacity: 1; - } - - 80% { - -webkit-transform: skewX(-5deg); - transform: skewX(-5deg); - opacity: 1; - } - - 100% { - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -@keyframes lightSpeedIn { - 0% { - -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); - transform: translate3d(100%, 0, 0) skewX(-30deg); - opacity: 0; - } - - 60% { - -webkit-transform: skewX(20deg); - transform: skewX(20deg); - opacity: 1; - } - - 80% { - -webkit-transform: skewX(-5deg); - transform: skewX(-5deg); - opacity: 1; - } - - 100% { - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -.lightSpeedIn { - -webkit-animation-name: lightSpeedIn; - animation-name: lightSpeedIn; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; -} - -@-webkit-keyframes lightSpeedOut { - 0% { - opacity: 1; - } - - 100% { - -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); - transform: translate3d(100%, 0, 0) skewX(30deg); - opacity: 0; - } -} - -@keyframes lightSpeedOut { - 0% { - opacity: 1; - } - - 100% { - -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); - transform: translate3d(100%, 0, 0) skewX(30deg); - opacity: 0; - } -} - -.lightSpeedOut { - -webkit-animation-name: lightSpeedOut; - animation-name: lightSpeedOut; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; -} - -@-webkit-keyframes rotateIn { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate3d(0, 0, 1, -200deg); - transform: rotate3d(0, 0, 1, -200deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -@keyframes rotateIn { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate3d(0, 0, 1, -200deg); - transform: rotate3d(0, 0, 1, -200deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -.rotateIn { - -webkit-animation-name: rotateIn; - animation-name: rotateIn; -} - -@-webkit-keyframes rotateInDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -@keyframes rotateInDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -.rotateInDownLeft { - -webkit-animation-name: rotateInDownLeft; - animation-name: rotateInDownLeft; -} - -@-webkit-keyframes rotateInDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -@keyframes rotateInDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -.rotateInDownRight { - -webkit-animation-name: rotateInDownRight; - animation-name: rotateInDownRight; -} - -@-webkit-keyframes rotateInUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -@keyframes rotateInUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -.rotateInUpLeft { - -webkit-animation-name: rotateInUpLeft; - animation-name: rotateInUpLeft; -} - -@-webkit-keyframes rotateInUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, -90deg); - transform: rotate3d(0, 0, 1, -90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -@keyframes rotateInUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, -90deg); - transform: rotate3d(0, 0, 1, -90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: none; - transform: none; - opacity: 1; - } -} - -.rotateInUpRight { - -webkit-animation-name: rotateInUpRight; - animation-name: rotateInUpRight; -} - -@-webkit-keyframes rotateOut { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - opacity: 1; - } - - 100% { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate3d(0, 0, 1, 200deg); - transform: rotate3d(0, 0, 1, 200deg); - opacity: 0; - } -} - -@keyframes rotateOut { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - opacity: 1; - } - - 100% { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate3d(0, 0, 1, 200deg); - transform: rotate3d(0, 0, 1, 200deg); - opacity: 0; - } -} - -.rotateOut { - -webkit-animation-name: rotateOut; - animation-name: rotateOut; -} - -@-webkit-keyframes rotateOutDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } -} - -@keyframes rotateOutDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } -} - -.rotateOutDownLeft { - -webkit-animation-name: rotateOutDownLeft; - animation-name: rotateOutDownLeft; -} - -@-webkit-keyframes rotateOutDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} - -@keyframes rotateOutDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} - -.rotateOutDownRight { - -webkit-animation-name: rotateOutDownRight; - animation-name: rotateOutDownRight; -} - -@-webkit-keyframes rotateOutUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} - -@keyframes rotateOutUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} - -.rotateOutUpLeft { - -webkit-animation-name: rotateOutUpLeft; - animation-name: rotateOutUpLeft; -} - -@-webkit-keyframes rotateOutUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, 90deg); - transform: rotate3d(0, 0, 1, 90deg); - opacity: 0; - } -} - -@keyframes rotateOutUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, 90deg); - transform: rotate3d(0, 0, 1, 90deg); - opacity: 0; - } -} - -.rotateOutUpRight { - -webkit-animation-name: rotateOutUpRight; - animation-name: rotateOutUpRight; -} - -@-webkit-keyframes hinge { - 0% { - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 20%, 60% { - -webkit-transform: rotate3d(0, 0, 1, 80deg); - transform: rotate3d(0, 0, 1, 80deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 40%, 80% { - -webkit-transform: rotate3d(0, 0, 1, 60deg); - transform: rotate3d(0, 0, 1, 60deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - opacity: 1; - } - - 100% { - -webkit-transform: translate3d(0, 700px, 0); - transform: translate3d(0, 700px, 0); - opacity: 0; - } -} - -@keyframes hinge { - 0% { - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 20%, 60% { - -webkit-transform: rotate3d(0, 0, 1, 80deg); - transform: rotate3d(0, 0, 1, 80deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 40%, 80% { - -webkit-transform: rotate3d(0, 0, 1, 60deg); - transform: rotate3d(0, 0, 1, 60deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - opacity: 1; - } - - 100% { - -webkit-transform: translate3d(0, 700px, 0); - transform: translate3d(0, 700px, 0); - opacity: 0; - } -} - -.hinge { - -webkit-animation-name: hinge; - animation-name: hinge; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes rollIn { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -@keyframes rollIn { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - } - - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -.rollIn { - -webkit-animation-name: rollIn; - animation-name: rollIn; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes rollOut { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - } -} - -@keyframes rollOut { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - } -} - -.rollOut { - -webkit-animation-name: rollOut; - animation-name: rollOut; -} - -@-webkit-keyframes zoomIn { - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } - - 50% { - opacity: 1; - } -} - -@keyframes zoomIn { - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } - - 50% { - opacity: 1; - } -} - -.zoomIn { - -webkit-animation-name: zoomIn; - animation-name: zoomIn; -} - -@-webkit-keyframes zoomInDown { - 0% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); - transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); - transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -@keyframes zoomInDown { - 0% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); - transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); - transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -.zoomInDown { - -webkit-animation-name: zoomInDown; - animation-name: zoomInDown; -} - -@-webkit-keyframes zoomInLeft { - 0% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); - transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); - transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -@keyframes zoomInLeft { - 0% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); - transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); - transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -.zoomInLeft { - -webkit-animation-name: zoomInLeft; - animation-name: zoomInLeft; -} - -@-webkit-keyframes zoomInRight { - 0% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); - transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); - transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -@keyframes zoomInRight { - 0% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); - transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); - transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -.zoomInRight { - -webkit-animation-name: zoomInRight; - animation-name: zoomInRight; -} - -@-webkit-keyframes zoomInUp { - 0% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); - transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); - transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -@keyframes zoomInUp { - 0% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); - transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); - transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -.zoomInUp { - -webkit-animation-name: zoomInUp; - animation-name: zoomInUp; -} - -@-webkit-keyframes zoomOut { - 0% { - opacity: 1; - } - - 50% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } - - 100% { - opacity: 0; - } -} - -@keyframes zoomOut { - 0% { - opacity: 1; - } - - 50% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } - - 100% { - opacity: 0; - } -} - -.zoomOut { - -webkit-animation-name: zoomOut; - animation-name: zoomOut; -} - -@-webkit-keyframes zoomOutDown { - 40% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); - transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 100% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); - transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -@keyframes zoomOutDown { - 40% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); - transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 100% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); - transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -.zoomOutDown { - -webkit-animation-name: zoomOutDown; - animation-name: zoomOutDown; -} - -@-webkit-keyframes zoomOutLeft { - 40% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); - transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); - } - - 100% { - opacity: 0; - -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); - transform: scale(.1) translate3d(-2000px, 0, 0); - -webkit-transform-origin: left center; - transform-origin: left center; - } -} - -@keyframes zoomOutLeft { - 40% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); - transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); - } - - 100% { - opacity: 0; - -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); - transform: scale(.1) translate3d(-2000px, 0, 0); - -webkit-transform-origin: left center; - transform-origin: left center; - } -} - -.zoomOutLeft { - -webkit-animation-name: zoomOutLeft; - animation-name: zoomOutLeft; -} - -@-webkit-keyframes zoomOutRight { - 40% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); - transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); - } - - 100% { - opacity: 0; - -webkit-transform: scale(.1) translate3d(2000px, 0, 0); - transform: scale(.1) translate3d(2000px, 0, 0); - -webkit-transform-origin: right center; - transform-origin: right center; - } -} - -@keyframes zoomOutRight { - 40% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); - transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); - } - - 100% { - opacity: 0; - -webkit-transform: scale(.1) translate3d(2000px, 0, 0); - transform: scale(.1) translate3d(2000px, 0, 0); - -webkit-transform-origin: right center; - transform-origin: right center; - } -} - -.zoomOutRight { - -webkit-animation-name: zoomOutRight; - animation-name: zoomOutRight; -} - -@-webkit-keyframes zoomOutUp { - 40% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); - transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 100% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); - transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -@keyframes zoomOutUp { - 40% { - opacity: 1; - -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); - transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); - } - - 100% { - opacity: 0; - -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); - transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); - } -} - -.zoomOutUp { - -webkit-animation-name: zoomOutUp; - animation-name: zoomOutUp; -} - -@-webkit-keyframes slideInDown { - 0% { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - visibility: visible; - } - - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -@keyframes slideInDown { - 0% { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - visibility: visible; - } - - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -.slideInDown { - -webkit-animation-name: slideInDown; - animation-name: slideInDown; -} - -@-webkit-keyframes slideInLeft { - 0% { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - visibility: visible; - } - - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes slideInLeft { - 0% { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - visibility: visible; - } - - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -.slideInLeft { - -webkit-animation-name: slideInLeft; - animation-name: slideInLeft; -} - -@-webkit-keyframes slideInRight { - 0% { - -webkit-transform: translateX(100%); - transform: translateX(100%); - visibility: visible; - } - - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes slideInRight { - 0% { - -webkit-transform: translateX(100%); - transform: translateX(100%); - visibility: visible; - } - - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -.slideInRight { - -webkit-animation-name: slideInRight; - animation-name: slideInRight; -} - -@-webkit-keyframes slideInUp { - 0% { - -webkit-transform: translateY(100%); - transform: translateY(100%); - visibility: visible; - } - - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -@keyframes slideInUp { - 0% { - -webkit-transform: translateY(100%); - transform: translateY(100%); - visibility: visible; - } - - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -.slideInUp { - -webkit-animation-name: slideInUp; - animation-name: slideInUp; -} - -@-webkit-keyframes slideOutDown { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - visibility: hidden; - -webkit-transform: translateY(100%); - transform: translateY(100%); - } -} - -@keyframes slideOutDown { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - visibility: hidden; - -webkit-transform: translateY(100%); - transform: translateY(100%); - } -} - -.slideOutDown { - -webkit-animation-name: slideOutDown; - animation-name: slideOutDown; -} - -@-webkit-keyframes slideOutLeft { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 100% { - visibility: hidden; - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} - -@keyframes slideOutLeft { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 100% { - visibility: hidden; - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} - -.slideOutLeft { - -webkit-animation-name: slideOutLeft; - animation-name: slideOutLeft; -} - -@-webkit-keyframes slideOutRight { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 100% { - visibility: hidden; - -webkit-transform: translateX(100%); - transform: translateX(100%); - } -} - -@keyframes slideOutRight { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 100% { - visibility: hidden; - -webkit-transform: translateX(100%); - transform: translateX(100%); - } -} - -.slideOutRight { - -webkit-animation-name: slideOutRight; - animation-name: slideOutRight; -} - -@-webkit-keyframes slideOutUp { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - visibility: hidden; - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - } -} - -@keyframes slideOutUp { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - visibility: hidden; - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - } -} - -.slideOutUp { - -webkit-animation-name: slideOutUp; - animation-name: slideOutUp; -} diff --git a/css/custom.css b/css/custom.css deleted file mode 100644 index 95c3097..0000000 --- a/css/custom.css +++ /dev/null @@ -1,10 +0,0 @@ -/* your styles go here */ - -.box-image-text .image { - min-height: 200px; - max-height: 200px; -} - -.box-simple { - min-height: 230px; -} diff --git a/css/owl.carousel.css b/css/owl.carousel.css deleted file mode 100644 index 4ef435a..0000000 --- a/css/owl.carousel.css +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Core Owl Carousel CSS File - * v1.3.2 - */ - -/* clearfix */ -.owl-carousel .owl-wrapper:after { - content: "."; - display: block; - clear: both; - visibility: hidden; - line-height: 0; - height: 0; -} -/* display none until init */ -.owl-carousel{ - display: none; - position: relative; - width: 100%; - -ms-touch-action: pan-y; -} -.owl-carousel .owl-wrapper{ - display: none; - position: relative; - -webkit-transform: translate3d(0px, 0px, 0px); -} -.owl-carousel .owl-wrapper-outer{ - overflow: hidden; - position: relative; - width: 100%; -} -.owl-carousel .owl-wrapper-outer.autoHeight{ - -webkit-transition: height 500ms ease-in-out; - -moz-transition: height 500ms ease-in-out; - -ms-transition: height 500ms ease-in-out; - -o-transition: height 500ms ease-in-out; - transition: height 500ms ease-in-out; -} - -.owl-carousel .owl-item{ - float: left; -} -.owl-controls .owl-page, -.owl-controls .owl-buttons div{ - cursor: pointer; -} -.owl-controls { - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -/* mouse grab icon */ -.grabbing { - cursor:url(/img/grabbing.png) 8 8, move; -} - -/* fix */ -.owl-carousel .owl-wrapper, -.owl-carousel .owl-item{ - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - -webkit-transform: translate3d(0,0,0); - -moz-transform: translate3d(0,0,0); - -ms-transform: translate3d(0,0,0); -} diff --git a/css/owl.theme.css b/css/owl.theme.css deleted file mode 100644 index e080540..0000000 --- a/css/owl.theme.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -* Owl Carousel Owl Demo Theme -* v1.3.2 -*/ - -.owl-theme .owl-controls{ - margin-top: 10px; - text-align: center; -} - -/* Styling Next and Prev buttons */ - -.owl-theme .owl-controls .owl-buttons div{ - display: inline-block; - zoom: 1; - *display: inline;/*IE7 life-saver */ -} -/* Clickable class fix problem with hover on touch devices */ -/* Use it for non-touch hover action */ -.owl-theme .owl-controls.clickable .owl-buttons div:hover{ - filter: Alpha(Opacity=100);/*IE7 fix*/ - opacity: 1; - text-decoration: none; -} - -/* Styling Pagination*/ - -.owl-theme .owl-controls .owl-page{ - display: inline-block; - zoom: 1; - *display: inline;/*IE7 life-saver */ -} -.owl-theme .owl-controls .owl-page span{ - display: block; - width: 12px; - height: 12px; - margin: 5px 7px; - filter: Alpha(Opacity=50);/*IE7 fix*/ - opacity: 0.5; - -webkit-border-radius: 20px; - -moz-border-radius: 20px; - border-radius: 20px; - background: #869791; -} - -.owl-theme .owl-controls .owl-page.active span, -.owl-theme .owl-controls.clickable .owl-page:hover span{ - filter: Alpha(Opacity=100);/*IE7 fix*/ - opacity: 1; -} - -/* If PaginationNumbers is true */ - -.owl-theme .owl-controls .owl-page span.owl-numbers{ - height: auto; - width: auto; - color: #FFF; - padding: 2px 10px; - font-size: 12px; - -webkit-border-radius: 30px; - -moz-border-radius: 30px; - border-radius: 30px; -} - -/* preloading images */ -.owl-item.loading{ - min-height: 150px; - background: url(AjaxLoader.gif) no-repeat center center -} \ No newline at end of file diff --git a/css/prism.css b/css/prism.css new file mode 100644 index 0000000..f55c4c6 --- /dev/null +++ b/css/prism.css @@ -0,0 +1,208 @@ +/* PrismJS 1.21.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+c+csharp+cpp+go+java+markdown+python+scss+sql+toml+yaml&plugins=toolbar+copy-to-clipboard */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.token.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + /* This background color was intended by the author of this theme. */ + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +div.code-toolbar { + position: relative; +} + +div.code-toolbar > .toolbar { + position: absolute; + top: .3em; + right: .2em; + transition: opacity 0.3s ease-in-out; + opacity: 0; +} + +div.code-toolbar:hover > .toolbar { + opacity: 1; +} + +/* Separate line b/c rules are thrown out if selector is invalid. + IE11 and old Edge versions don't support :focus-within. */ +div.code-toolbar:focus-within > .toolbar { + opacity: 1; +} + +div.code-toolbar > .toolbar .toolbar-item { + display: inline-block; +} + +div.code-toolbar > .toolbar a { + cursor: pointer; +} + +div.code-toolbar > .toolbar button { + background: none; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + -webkit-user-select: none; /* for button */ + -moz-user-select: none; + -ms-user-select: none; +} + +div.code-toolbar > .toolbar a, +div.code-toolbar > .toolbar button, +div.code-toolbar > .toolbar span { + color: #bbb; + font-size: .8em; + padding: 0 .5em; + background: #f5f2f0; + background: rgba(224, 224, 224, 0.2); + box-shadow: 0 2px 0 0 rgba(0,0,0,0.2); + border-radius: .5em; +} + +div.code-toolbar > .toolbar a:hover, +div.code-toolbar > .toolbar a:focus, +div.code-toolbar > .toolbar button:hover, +div.code-toolbar > .toolbar button:focus, +div.code-toolbar > .toolbar span:hover, +div.code-toolbar > .toolbar span:focus { + color: inherit; + text-decoration: none; +} + diff --git a/css/shortcodes.css b/css/shortcodes.css new file mode 100644 index 0000000..0aa1c0f --- /dev/null +++ b/css/shortcodes.css @@ -0,0 +1,2 @@ +@import "shortcodes/tabbed-pane.css"; +@import "shortcodes/cards-pane.css"; diff --git a/css/shortcodes/cards-pane.css b/css/shortcodes/cards-pane.css new file mode 100644 index 0000000..34c8545 --- /dev/null +++ b/css/shortcodes/cards-pane.css @@ -0,0 +1,21 @@ +.card-deck { + max-width: 83%; +} + +.card { + max-width: 80%; +} + +.card-body.code { + background-color: #f8f9fa; + padding: 0 0 0 1ex; +} + +.card-body pre { + margin: 0; + padding: 0 1rem 1rem 1rem; +} + +.card .highlight { + border: none; +} diff --git a/css/shortcodes/tabbed-pane.css b/css/shortcodes/tabbed-pane.css new file mode 100644 index 0000000..3016398 --- /dev/null +++ b/css/shortcodes/tabbed-pane.css @@ -0,0 +1,18 @@ +.td-content .highlight { + margin: 0rem 0 2rem 0; +} + +.tab-content .highlight { + border: none; +} + +.tab-content { + margin: 0rem; + max-width: 80%; +} + +.tab-content pre { + border-left: 1px solid rgba(0, 0, 0, 0.125); + border-right: 1px solid rgba(0, 0, 0, 0.125); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} diff --git a/css/style.blue.css b/css/style.blue.css deleted file mode 100644 index c738447..0000000 --- a/css/style.blue.css +++ /dev/null @@ -1,3557 +0,0 @@ -.clearfix:before, -.clearfix:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after { - content: " "; - display: table; -} -.clearfix:after, -.navbar:after, -.navbar-header:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -/* general styles */ -a, -button { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -a i.fa, -button i.fa { - margin: 0 5px; -} -.clickable { - cursor: pointer !important; -} -.required { - color: #467fbf; -} -.accent { - color: #467fbf; -} -.text-uppercase { - text-transform: uppercase; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .text-center-sm { - text-align: center; - } -} -p.lead { - margin-bottom: 40px; -} -section, -div.section { - margin-bottom: 40px; -} -.no-mb { - margin-bottom: 0 !important; -} -.mb-small { - margin-bottom: 20px !important; -} -.heading { - margin-bottom: 40px; -} -.heading h1, -.heading h2, -.heading h3, -.heading h4, -.heading h5 { - display: inline-block; - border-bottom: solid 5px #467fbf; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; - vertical-align: middle; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.heading h1 i.fa, -.heading h2 i.fa, -.heading h3 i.fa, -.heading h4 i.fa, -.heading h5 i.fa { - display: inline-block; - background: #467fbf; - width: 30px; - height: 30px; - vertical-align: middle; - text-align: center; - color: #fff; - font-size: 12px; - line-height: 30px; - border-radius: 15px; -} -.icon { - display: inline-block; - width: 80px; - height: 80px; - color: #fff; - line-height: 80px; - border-radius: 40px; - border: solid 1px #fff; - font-size: 20px; -} -.icon.icon-lg { - font-size: 30px; - border-width: 2px; -} -.ul-icons { - padding-left: 10px; -} -.ul-icons li { - list-style-type: none; - line-height: 20px; - margin-bottom: 20px; -} -.ul-icons li i { - width: 20px; - height: 20px; - background: #467fbf; - color: #fff; - text-align: center; - border-radius: 10px; - line-height: 20px; - margin-right: 10px; -} -ul.list-style-none { - list-style: none; -} -#text-page h1, -#text-page h2, -#text-page h3 { - font-weight: 700; -} -#error-page { - text-align: center; - margin-top: 40px; - margin-bottom: 100px; -} -#error-page h4 { - margin-bottom: 40px; -} -#error-page p.buttons { - margin-top: 40px; -} -.pages-listing .item { - text-align: center; -} -.pages-listing .item h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 20px; - letter-spacing: 0.08em; -} -.pages-listing .item h3 a { - color: #555555; -} -.pages-listing .item .text { - margin-bottom: 20px; -} -.pages-listing .item .text p { - color: #999999; - font-size: 12px; - margin-bottom: 20px; -} -.banner { - margin-bottom: 30px; - text-align: center; -} -.banner img { - margin: 0 auto; -} -.banner a:hover img { - opacity: 0.8; - filter: alpha(opacity=80); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.pages { - text-align: center; -} -.pages .loadMore { - text-align: center; -} -.pages .pagination { - text-align: center; -} -.features-buttons button { - margin-bottom: 20px; -} -@media (min-width: 1300px) { - body.boxed { - background: url(https://www.toptal.com/designers/subtlepatterns/patterns/subtle_zebra_3d.png); - } - body.boxed #all { - position: relative; - background: #fff; - width: 1200px; - margin: 0 auto; - overflow: hidden; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - } -} -#top { - background: #555555; - color: #eeeeee; - padding: 10px 0; -} -#top p { - margin: 0; - font-size: 12px; -} -#top .social { - float: right; - text-align: right; -} -#top .social a { - color: #999999; - display: inline-block; - width: 24px; - height: 24px; - border-radius: 12px; - line-height: 20px; - font-size: 12px; - text-align: center; - vertical-align: bottom; -} -#top .social a:hover { - color: #fff; -} -#top .social a:hover.facebook { - background-color: #4460ae; -} -#top .social a:hover.gplus { - background-color: #c21f25; -} -#top .social a:hover.twitter { - background-color: #3cf; -} -#top .social a:hover.instagram { - background-color: #cd4378; -} -#top .social a:hover.email { - background-color: #4a7f45; -} -#top .login { - float: right; -} -#top .login a { - font-size: 12px; - color: #eeeeee; - margin-right: 15px; - text-decoration: none; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.10em; -} -@media (max-width: 767px) { - #top .login { - float: left; - } -} -#top.light { - background: #fff; - color: #999999; - border-bottom: solid 1px #eeeeee; -} -#top.light .login a { - color: #555555; -} -.navbar { - border: none; -} -.navbar ul.nav > li > a { - text-transform: uppercase; - text-decoration: underline; - font-weight: bold; - letter-spacing: 0.08em; - border-top: solid 5px transparent; -} -.navbar ul.nav > li > a:hover { - border-top: solid 5px #467fbf; -} -.navbar ul.nav > li.active > a, -.navbar ul.nav > li.open > a { - text-decoration: none !important; - border-top: solid 5px #294d76; -} -@media (max-width: 768px) { - .navbar ul.nav > li.active > a, - .navbar ul.nav > li.open > a { - border-top-color: transparent; - } - .navbar ul.nav > li > a:hover { - border-top-color: transparent; - } -} -.navbar.navbar-light ul.nav > li.active > a { - border-top: solid 5px #294d76; - background: #fff !important; - color: #555555 !important; -} -.navbar.navbar-light ul.nav > li.active > a:hover { - border-top: solid 5px #294d76; -} -.navbar.navbar-light ul.nav > li > a:hover, -.navbar.navbar-light ul.nav > li.open > a:hover, -.navbar.navbar-light ul.nav > li > a:focus, -.navbar.navbar-light ul.nav > li.open > a:focus { - border-top: solid 5px #467fbf; - background: #fff !important; - color: #555555 !important; -} -.navbar ul.dropdown-menu { - margin: 0; - padding: 0; -} -.navbar ul.dropdown-menu li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 4px 0; -} -.navbar ul.dropdown-menu li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - left: 0; -} -.navbar ul.dropdown-menu li a:hover { - color: #467fbf; - text-decoration: none; - background: none; - left: 2px; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .navbar ul.dropdown-menu li a:hover { - left: 0; - } -} -.navbar .yamm-content h3 { - font-size: 18px; - text-transform: uppercase; - padding-bottom: 10px; - margin-top: 5px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -@media (max-width: 767px) { - .navbar .yamm-content h3 { - font-size: 14px; - } -} -.navbar .yamm-content h5 { - text-transform: uppercase; - padding-bottom: 10px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -.navbar .yamm-content ul { - margin: 0; - padding: 0; -} -.navbar .yamm-content ul li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - padding: 4px 0; -} -.navbar .yamm-content ul li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.navbar .yamm-content ul li a:hover { - color: #467fbf; - text-decoration: none; - padding-left: 2px; -} -.navbar .yamm-content .banner { - margin-bottom: 10px; -} -.navbar .yamm-fw .dropdown-menu { - padding: 0; -} -.navbar .navbar-buttons { - float: right; -} -.navbar .navbar-buttons button, -.navbar .navbar-buttons a.btn, -.navbar .navbar-buttons .btn-default.navbar-toggle { - margin-top: 11px; - margin-bottom: 11px; - margin-left: 0; - margin-right: 5px; -} -.navbar .btn-default, -.navbar .btn-default.navbar-toggle { - color: #999999; - background-color: #fff; - margin-left: 7px; - margin-right: 0; -} -.navbar .btn-default:hover, -.navbar .btn-default.navbar-toggle:hover, -.navbar .btn-default:focus, -.navbar .btn-default.navbar-toggle:focus { - background-color: #fff; - border-color: #467fbf; - color: #467fbf; -} -.navbar #search { - clear: both; - border-top: solid 1px #467fbf; - text-align: right; -} -.navbar #search form { - float: right; -} -.navbar #search form .input-group { - width: 500px; -} -@media (max-width: 768px) { - .navbar #search form .input-group { - width: 100%; - } -} -.navbar #basket-overview a { - margin-left: 7px; -} -.navbar-affixed-top { - top: -32px; -} -.navbar-affixed-top.affix-top { - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -.navbar-affixed-top.affix { - position: fixed; - width: 100%; - top: 0; - z-index: 1000; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -body.boxed .navbar-affixed-top.affix { - position: static; -} -#login-modal { - overflow: hidden; -} -#login-modal .modal-header h4 { - text-transform: uppercase; -} -#login-modal form { - margin-bottom: 20px; -} -#login-modal a { - color: #467fbf; -} -#login-modal p { - font-weight: 300; - margin-bottom: 20px; - font-size: 13px; -} -/* buttons */ -.btn { - font-weight: 700; - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 6px 12px; - font-size: 13px; - line-height: 1.42857143; - border-radius: 0; -} -.input-group .btn { - font-size: 14px; -} -.btn-lg { - padding: 10px 16px; - font-size: 14px; - line-height: 1.33; - border-radius: 0; -} -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-template-main { - color: #467fbf; - background-color: #ffffff; - border-color: #467fbf; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - color: #467fbf; - background-color: #e6e6e6; - border-color: #336194; -} -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - background-image: none; -} -.btn-template-main.disabled, -.btn-template-main[disabled], -fieldset[disabled] .btn-template-main, -.btn-template-main.disabled:hover, -.btn-template-main[disabled]:hover, -fieldset[disabled] .btn-template-main:hover, -.btn-template-main.disabled:focus, -.btn-template-main[disabled]:focus, -fieldset[disabled] .btn-template-main:focus, -.btn-template-main.disabled:active, -.btn-template-main[disabled]:active, -fieldset[disabled] .btn-template-main:active, -.btn-template-main.disabled.active, -.btn-template-main[disabled].active, -fieldset[disabled] .btn-template-main.active { - background-color: #ffffff; - border-color: #467fbf; -} -.btn-template-main .badge { - color: #ffffff; - background-color: #467fbf; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active { - background: #467fbf; - color: #ffffff; - border-color: #467fbf; -} -.btn-template-transparent-primary { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - background-image: none; -} -.btn-template-transparent-primary.disabled, -.btn-template-transparent-primary[disabled], -fieldset[disabled] .btn-template-transparent-primary, -.btn-template-transparent-primary.disabled:hover, -.btn-template-transparent-primary[disabled]:hover, -fieldset[disabled] .btn-template-transparent-primary:hover, -.btn-template-transparent-primary.disabled:focus, -.btn-template-transparent-primary[disabled]:focus, -fieldset[disabled] .btn-template-transparent-primary:focus, -.btn-template-transparent-primary.disabled:active, -.btn-template-transparent-primary[disabled]:active, -fieldset[disabled] .btn-template-transparent-primary:active, -.btn-template-transparent-primary.disabled.active, -.btn-template-transparent-primary[disabled].active, -fieldset[disabled] .btn-template-transparent-primary.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active { - background: #fff; - color: #467fbf; - border-color: #fff; -} -.btn-template-transparent-black { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - background-image: none; -} -.btn-template-transparent-black.disabled, -.btn-template-transparent-black[disabled], -fieldset[disabled] .btn-template-transparent-black, -.btn-template-transparent-black.disabled:hover, -.btn-template-transparent-black[disabled]:hover, -fieldset[disabled] .btn-template-transparent-black:hover, -.btn-template-transparent-black.disabled:focus, -.btn-template-transparent-black[disabled]:focus, -fieldset[disabled] .btn-template-transparent-black:focus, -.btn-template-transparent-black.disabled:active, -.btn-template-transparent-black[disabled]:active, -fieldset[disabled] .btn-template-transparent-black:active, -.btn-template-transparent-black.disabled.active, -.btn-template-transparent-black[disabled].active, -fieldset[disabled] .btn-template-transparent-black.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active { - background: #fff; - color: #000; - border-color: #fff; -} -.btn-template-primary { - color: #ffffff; - background-color: #467fbf; - border-color: #467fbf; -} -.btn-template-primary:hover, -.btn-template-primary:focus, -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - color: #ffffff; - background-color: #36669c; - border-color: #336194; -} -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - background-image: none; -} -.btn-template-primary.disabled, -.btn-template-primary[disabled], -fieldset[disabled] .btn-template-primary, -.btn-template-primary.disabled:hover, -.btn-template-primary[disabled]:hover, -fieldset[disabled] .btn-template-primary:hover, -.btn-template-primary.disabled:focus, -.btn-template-primary[disabled]:focus, -fieldset[disabled] .btn-template-primary:focus, -.btn-template-primary.disabled:active, -.btn-template-primary[disabled]:active, -fieldset[disabled] .btn-template-primary:active, -.btn-template-primary.disabled.active, -.btn-template-primary[disabled].active, -fieldset[disabled] .btn-template-primary.active { - background-color: #467fbf; - border-color: #467fbf; -} -.btn-template-primary .badge { - color: #467fbf; - background-color: #ffffff; -} -#intro { - background: url('../img/home.jpg') no-repeat center top; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} -#intro .item { - font-family: "Roboto", Helvetica, Arial, sans-serif; - height: 100%; -} -#intro .item h1 { - text-transform: uppercase; - font-size: 50px; - color: #fff; - margin-bottom: 40px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #intro .item h1 { - font-size: 40px; - } -} -@media (max-width: 767px) { - #intro .item h1 { - font-size: 25px; - } -} -#intro .item h3 { - color: #fff; - margin-bottom: 40px; -} -@media (max-width: 767px) { - #intro .item h3 { - font-size: 15px; - margin-bottom: 20px; - } -} -#intro .item .btn { - text-transform: none; -} -@media (max-width: 991px) { - #intro .item .btn { - font-size: 14px; - } -} -@media (max-width: 991px) { - #intro .item .carousel-caption { - left: 10%; - right: 10%; - } -} -#intro .container, -#intro .row { - height: 100%; - position: relative; -} -.jumbotron { - padding: 30px; - margin-bottom: 0; - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.jumbotron .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #467fbf; - opacity: 0.9; - filter: alpha(opacity=90); -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3, -.jumbotron p, -.jumbotron ul { - color: #fff; -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3 { - color: #ffffff; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.jumbotron p { - margin-bottom: 20px; - font-size: 21px; - font-weight: 400; -} -.jumbotron p.text-uppercase { - font-weight: 700; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 0; -} -.jumbotron .container { - max-width: 100%; - z-index: 2; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 46px; - } -} -#categoryMenu h3 { - padding: 20px; - background: #f7f7f7; - margin: 0; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.panel.sidebar-menu h3 { - padding: 5px 0; - margin: 0; -} -.panel.sidebar-menu { - background: #fff; - margin: 0 0 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.panel.sidebar-menu .panel-heading { - text-transform: uppercase; - margin-bottom: 10px; - background: none; - padding: 0; - letter-spacing: 0.08em; - border-bottom: none; -} -.panel.sidebar-menu .panel-heading h1, -.panel.sidebar-menu .panel-heading h2, -.panel.sidebar-menu .panel-heading h3, -.panel.sidebar-menu .panel-heading h4, -.panel.sidebar-menu .panel-heading h5 { - display: inline-block; - border-bottom: solid 5px #467fbf; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; -} -.panel.sidebar-menu .panel-heading .btn.btn-danger { - color: #fff; - margin-top: 5px; -} -.panel.sidebar-menu .panel-body { - padding: 0; -} -.panel.sidebar-menu .panel-body span.colour { - display: inline-block; - width: 15px; - height: 15px; - border: solid 1px #555555; - vertical-align: top; - margin-top: 2px; - margin-left: 5px; -} -.panel.sidebar-menu .panel-body span.colour.white { - background: #fff; -} -.panel.sidebar-menu .panel-body span.colour.red { - background: red; -} -.panel.sidebar-menu .panel-body span.colour.green { - background: green; -} -.panel.sidebar-menu .panel-body span.colour.blue { - background: blue; -} -.panel.sidebar-menu .panel-body span.colour.yellow { - background: yellow; -} -.panel.sidebar-menu .panel-body label { - color: #999999; - font-size: 12px; -} -.panel.sidebar-menu .panel-body label:hover { - color: #555555; -} -.panel.sidebar-menu ul.nav.category-menu { - margin-bottom: 20px; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.08em; -} -.panel.sidebar-menu ul.nav.category-menu li a { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.panel.sidebar-menu ul.nav ul { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.nav ul li { - display: block; -} -.panel.sidebar-menu ul.nav ul li a { - position: relative; - font-family: "Times New Roman", Times, serif; - font-weight: normal; - text-transform: none !important; - display: block; - padding: 10px 15px; - padding-left: 30px; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.nav ul li a:hover, -.panel.sidebar-menu ul.nav ul li a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.panel.sidebar-menu ul.tag-cloud { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.tag-cloud li { - display: inline-block; -} -.panel.sidebar-menu ul.tag-cloud li a { - display: inline-block; - padding: 5px; - border: solid 1px #eeeeee; - border-radius: 0; - color: #467fbf; - margin: 5px 5px 5px 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 700; - font-size: 12px; -} -.panel.sidebar-menu ul.tag-cloud li a:hover { - color: #467fbf; - text-decoration: none; - border-color: #467fbf; -} -.panel.sidebar-menu ul.popular, -.panel.sidebar-menu ul.recent { - list-style: none; - padding-left: 0; - padding: 20px 0; -} -.panel.sidebar-menu ul.popular li, -.panel.sidebar-menu ul.recent li { - margin-bottom: 10px; - padding: 5px 0; - border-bottom: dotted 1px #eeeeee; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li img, -.panel.sidebar-menu ul.recent li img { - width: 50px; - margin-right: 10px; -} -.panel.sidebar-menu ul.popular li h5, -.panel.sidebar-menu ul.recent li h5 { - margin: 0 0 10px; -} -.panel.sidebar-menu ul.popular li h5 a, -.panel.sidebar-menu ul.recent li h5 a { - font-weight: normal; -} -.panel.sidebar-menu ul.popular li p.date, -.panel.sidebar-menu ul.recent li p.date { - float: right; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.popular li:last-child, -.panel.sidebar-menu ul.recent li:last-child { - border-bottom: none; -} -.panel.sidebar-menu .text-widget { - font-size: 12px; -} -.panel.sidebar-menu.with-icons ul.nav li a:after { - font-family: 'FontAwesome'; - content: "\f105"; - position: relative; - top: 0; - float: right; -} -/* ribbons for product sales etc. */ -.ribbon { - position: absolute; - top: 50px; - padding-left: 51px; - font-weight: 700; - letter-spacing: 0.08em; -} -.ribbon .ribbon-background { - position: absolute; - top: 0; - right: 0; -} -.ribbon .theribbon { - position: relative; - width: 80px; - padding: 6px 20px 6px 20px; - margin: 30px 10px 10px -71px; - color: #fff; - background-color: #467fbf; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.ribbon .theribbon:before, -.ribbon .theribbon:after { - content: ' '; - position: absolute; - width: 0; - height: 0; -} -.ribbon .theribbon:after { - left: 0px; - top: 100%; - border-width: 5px 10px; - border-style: solid; - border-color: #000000 #000000 transparent transparent; -} -.ribbon.sale { - top: 0; -} -.ribbon.new { - top: 50px; -} -.ribbon.new .theribbon { - background-color: #5bc0de; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.new .theribbon:after { - border-color: #2390b0 #2390b0 transparent transparent; -} -.ribbon.gift { - top: 100px; -} -.ribbon.gift .theribbon { - background-color: #5cb85c; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.gift .theribbon:after { - border-color: #357935 #357935 transparent transparent; -} -.owl-carousel .owl-controls .owl-page.active span, -.owl-theme .owl-controls .owl-page.active span, -.owl-carousel .owl-controls.clickable .owl-page:hover span, -.owl-theme .owl-controls.clickable .owl-page:hover span { - background: #467fbf; -} -.owl-carousel .owl-controls .owl-buttons, -.owl-theme .owl-controls .owl-buttons { - position: absolute; - top: 5px; - right: 0; -} -.owl-carousel .owl-controls .owl-buttons div, -.owl-theme .owl-controls .owl-buttons div { - width: 26px; - height: 26px; - line-height: 25px; - margin: 0 5px 0 0; - font-size: 18px; - color: #467fbf; - padding: 0; - background: #fff; - border-radius: 13px; - vertical-align: middle; - text-align: center; - opacity: 1; - filter: alpha(opacity=100); -} -.home-carousel { - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.home-carousel .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #467fbf; - opacity: 0.9; - filter: alpha(opacity=90); -} -.home-carousel .owl-carousel { - padding-top: 60px; - padding-bottom: 20px; -} -.home-carousel .owl-theme .owl-controls .owl-page span { - background: #666; -} -.home-carousel .owl-theme .owl-controls .owl-page.active span { - background: #fff; -} -.home-carousel .owl-theme .owl-controls .owl-page:hover span { - background: #fff; -} -@media (max-width: 767px) { - .home-carousel { - text-align: center !important; - } -} -@media (min-width: 992px) { - .home-carousel .right { - text-align: right; - } -} -.home-carousel h1, -.home-carousel h2, -.home-carousel h3, -.home-carousel p, -.home-carousel ul { - color: #fff; -} -.home-carousel h1 { - font-weight: 700; - text-transform: uppercase; - font-size: 46px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .home-carousel h1 { - font-size: 36px; - } -} -.home-carousel h2 { - font-weight: 700; - text-transform: uppercase; - font-size: 40px; - letter-spacing: 0.08em; -} -.home-carousel ul, -.home-carousel p { - font-size: 18px; - font-weight: 700; - padding: 0; - text-transform: uppercase; - letter-spacing: 0.10em; -} -@media (max-width: 991px) { - .home-carousel ul, - .home-carousel p { - font-size: 14px; - } -} -.home-carousel ul li { - margin-bottom: 10px; -} -.customers { - padding: 0; - margin-bottom: 40px; -} -.customers .item { - list-style-type: none; - text-align: center; - margin: 0 20px; -} -.customers .item img { - display: inline-block; - filter: url("data:image/svg+xml;utf8,#grayscale"); - /* Firefox 10+, Firefox on Android */ - filter: gray; - /* IE6-9 */ - -webkit-filter: grayscale(100%); - /* Chrome 19+, Safari 6+, Safari 6+ iOS */ - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.customers .item img:hover { - max-width: auto; - filter: none; - -webkit-filter: none; -} -.testimonials { - padding: 0; - margin-bottom: 40px; -} -.testimonials .item { - list-style-type: none; - margin: 0 5px; - background: #fff; - padding-bottom: 60px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.testimonials .item .testimonial { - position: relative; - padding: 20px; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial .text { - color: #999999; - margin-bottom: 40px; -} -.testimonials .item .testimonial .bottom { - position: absolute; - left: 0; - bottom: 0; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px; - height: 50px; -} -.testimonials .item .testimonial .bottom .icon { - color: #467fbf; - font-size: 30px; - float: left; - width: 20%; -} -.testimonials .item .testimonial .name-picture { - float: right; - width: 80%; - text-align: right; -} -.testimonials .item .testimonial .name-picture h5 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.testimonials .item .testimonial .name-picture p { - color: #999999; - margin: 0; - font-size: 12px; -} -.testimonials .item .testimonial .name-picture img { - float: right; - width: 60px; - border-radius: 30px; - margin-left: 10px; -} -.team-member { - text-align: center; - margin-bottom: 40px; -} -.team-member h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 5px; - letter-spacing: 0.08em; -} -.team-member h3 a { - color: #555555; -} -.team-member p.role { - color: #999999; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.team-member .social { - margin-bottom: 20px; -} -.team-member .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email { - background-color: #4a7f45; -} -.team-member .text p { - color: #999999; - font-size: 12px; -} -.team-member .social, -.team-member-detail .social { - margin-bottom: 20px; -} -.team-member .social a, -.team-member-detail .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i, -.team-member-detail .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook, -.team-member-detail .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus, -.team-member-detail .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter, -.team-member-detail .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram, -.team-member-detail .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email, -.team-member-detail .social a.email { - background-color: #4a7f45; -} -.box-simple { - text-align: center; - margin-bottom: 40px; -} -.box-simple .icon { - color: #467fbf; - border-color: #467fbf; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.box-simple h3 { - font-weight: normal; - font-size: 18px; - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-simple h3 a { - color: #555555; -} -.box-simple p { - color: #999999; -} -.box-simple:hover .icon { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.box-simple:hover .icon i { - -webkit-transform: scale(1, 1); - -ms-transform: scale(1, 1); - -o-transform: scale(1, 1); - transform: scale(1, 1); -} -.box-simple.box-white { - padding: 20px; - border: dotted 1px #999999; -} -.box-simple.box-white .icon { - color: #555555; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark { - padding: 20px; - border: dotted 1px #999999; - background: #555555; - color: #fff; -} -.box-simple.box-dark .icon { - color: #f7f7f7; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark h3 { - color: #fff; -} -.box-simple.box-dark h3 a { - color: #fff; -} -.box-simple.box-dark p { - color: #fff; -} -.box-image { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #467fbf; -} -.box-image .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -.box-image-text { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image-text .top { - position: relative; - margin-bottom: 10px; -} -.box-image-text .top .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #467fbf; -} -.box-image-text .top .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .top .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image-text .top .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image-text .top .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .content h3, -.box-image-text .content h4 { - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-image-text .content p { - color: #999999; -} -.box-image-text:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image-text:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image-text:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -/* universal box */ -.box { - background: #fff; - margin: 0 0 30px; - border: solid 1px #ccc; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px 0; - border-left: none; - border-right: none; -} -.box .box-header { - background: #f7f7f7; - margin: -20px 0 20px; - padding: 20px; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-footer { - background: #f7f7f7; - margin: 30px 0 -20px; - padding: 20px; - border-top: solid 1px #eeeeee; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -@media (max-width: 991px) { - .box .box-footer .btn { - margin-bottom: 20px; - } -} -.box.no-border { - border: none; -} -#heading-breadcrumbs { - background: url('../img/texture-bw.png') center center repeat; - padding: 20px 0; - margin-bottom: 40px; -} -#heading-breadcrumbs.no-mb { - margin-bottom: 0; -} -#heading-breadcrumbs h1 { - color: #333333; - text-transform: uppercase; - font-size: 30px; - font-weight: 700; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #heading-breadcrumbs h1 { - text-align: center; - } -} -#heading-breadcrumbs ul.breadcrumb { - margin-top: 5px; - margin-bottom: 0; -} -.bar { - position: relative; - background: #467fbf; - padding: 60px 0; -} -.bar.background-pentagon { - background: url('../img/texture-bw.png') center center repeat; - border-top: solid 1px #999999; - border-bottom: solid 1px #999999; -} -.bar.background-gray { - background: #eeeeee; -} -.bar.background-gray-dark { - background: #555555; -} -.bar.background-white { - background: #fff; -} -.bar.background-image-fixed-1 { - background: url('../img/fixed-background-1.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.background-image-fixed-2 { - background: url('../img/fixed-background-2.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.color-white h1, -.bar.color-white h2, -.bar.color-white h3, -.bar.color-white h4, -.bar.color-white h5, -.bar.color-white h6, -.bar.color-white p { - color: #fff; -} -.bar.padding-big { - padding: 50px 0; -} -.bar.padding-horizontal { - padding-left: 30px; - padding-right: 30px; -} -.bar.margin-vertical { - margin-top: 20px; - margin-bottom: 20px; -} -.bar .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #000; - opacity: 0.3; - filter: alpha(opacity=30); -} -.portfolio.no-space { - padding: 0 15px; -} -.portfolio.no-space .box-image { - margin: 0 -15px; -} -.portfolio-project .project-more h4 { - color: #555555; - text-transform: uppercase; - margin-bottom: 0; - text-align: left; - font-size: 14px; - letter-spacing: 0.08em; -} -.portfolio-project .project-more p { - color: #999999; - padding: 10px 0; - margin-bottom: 20px; - text-align: left; -} -.portfolio-showcase { - margin: 15px 0 60px; -} -.portfolio-showcase h3 a { - text-transform: uppercase; - line-height: 1.5; - letter-spacing: 0.08em; -} -.portfolio-showcase p.lead { - color: #555555; - margin-bottom: 20px; -} -.portfolio-showcase p { - color: #999999; -} -.portfolio-showcase p.buttons { - margin-top: 40px; -} -.see-more { - text-align: center; - margin-top: 20px; - padding-top: 20px; -} -.see-more p { - font-size: 28px; - font-weight: 100; - margin-bottom: 20px; -} -.showcase .item { - text-align: center; -} -.showcase .item .icon { - display: inline-block; - width: 50px; - height: 50px; - color: #555555; - line-height: 50px; - border-radius: 25px; - border: solid 1px #555555; -} -.showcase .item h4 { - color: #555555; - text-transform: uppercase; - letter-spacing: 0.08em; - line-height: 1.5; - font-size: 16px; -} -.showcase .item h4 span { - font-weight: bold; - font-size: 51px; -} -.packages .package { - background: #fff; - margin-top: 25px; - margin-bottom: 20px; - padding-bottom: 15px; - text-align: center; - border: solid 1px #467fbf; - overflow: hidden; -} -.packages .package .package-header { - height: 57px; - color: #fff; - line-height: 57px; - background: #467fbf; -} -.packages .package .package-header h5 { - color: #fff; - text-transform: uppercase; - font-weight: bold; - line-height: 57px; - margin: 0; - letter-spacing: 0.08em; -} -.packages .package .package-header.light-gray { - background: #eeeeee; -} -.packages .package .package-header.light-gray h5 { - color: #555555; -} -.packages .package .price { - line-height: 120px; - height: 100px; - color: #fff; - font-weight: 400; -} -.packages .package .price h4 { - display: inline; - font-size: 50px; - line-height: normal; - margin-bottom: 0; -} -.packages .package .price .period { - line-height: normal; - color: #999999; -} -.packages .package ul { - padding: 0; -} -.packages .package ul li { - list-style-type: none; - padding-top: 10px; - padding-bottom: 10px; - width: 80%; - margin: auto; - border-bottom: 1px dotted #ccc; -} -.packages .package ul li:last-child { - border-bottom: 0; -} -.packages .package ul li i { - font-size: 13px; - margin-right: 5px; -} -.packages .best-value .package { - margin-top: 0; - padding-bottom: 40px; -} -.packages .best-value .package .package-header { - height: 72px; - padding-top: 17px; - height: 82px !important; -} -.packages .best-value .package .package-header h5 { - font-weight: bold; - line-height: 29px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.packages .best-value .package .package-header .meta-text { - font-size: 13px; - line-height: 15px; -} -#map { - height: 300px; -} -#map.with-border { - border-top: solid 1px #467fbf; - border-bottom: solid 1px #467fbf; -} -#blog-listing-big .post, -#blog-homepage .post { - margin-bottom: 60px; -} -#blog-listing-big .post h2, -#blog-homepage .post h2, -#blog-listing-big .post h4, -#blog-homepage .post h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#blog-listing-big .post h2 a, -#blog-homepage .post h2 a, -#blog-listing-big .post h4 a, -#blog-homepage .post h4 a { - color: #555555; -} -#blog-listing-big .post h2 a:hover, -#blog-homepage .post h2 a:hover, -#blog-listing-big .post h4 a:hover, -#blog-homepage .post h4 a:hover { - color: #467fbf; -} -#blog-listing-big .post .author-category, -#blog-homepage .post .author-category { - color: #999999; - text-transform: uppercase; - font-weight: 300; - letter-spacing: 0.08em; -} -#blog-listing-big .post .author-category a, -#blog-homepage .post .author-category a { - font-weight: 500; -} -#blog-listing-big .post .date-comments a, -#blog-homepage .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-big .post .date-comments a:hover, -#blog-homepage .post .date-comments a:hover { - color: #467fbf; -} -@media (min-width: 768px) { - #blog-listing-big .post .date-comments, - #blog-homepage .post .date-comments { - text-align: right; - } -} -#blog-listing-big .post .intro, -#blog-homepage .post .intro { - text-align: left; -} -#blog-listing-big .post .image, -#blog-homepage .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-big .post .image img, -#blog-homepage .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-big .post .image img.img-responsive, - #blog-homepage .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-big .post .video, -#blog-homepage .post .video { - margin-bottom: 10px; -} -#blog-listing-big .post .read-more, -#blog-homepage .post .read-more { - text-align: right; -} -#blog-listing-medium .post { - margin-bottom: 60px; -} -#blog-listing-medium .post h2 { - text-transform: uppercase; - margin: 0 0 10px; - font-size: 24px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post h2 a { - color: #555555; -} -#blog-listing-medium .post h2 a:hover { - color: #467fbf; -} -#blog-listing-medium .post .author-category { - float: left; - color: #999999; - text-transform: uppercase; - font-weight: 300; - font-size: 12px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post .author-category a { - font-weight: 500; -} -#blog-listing-medium .post .date-comments { - float: right; - font-size: 12px; -} -#blog-listing-medium .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-medium .post .date-comments a:hover { - color: #467fbf; -} -@media (min-width: 768px) { - #blog-listing-medium .post .date-comments { - text-align: right; - } -} -#blog-listing-medium .post .intro { - text-align: left; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-medium .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-medium .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-medium .post .video { - margin-bottom: 10px; -} -#blog-listing-medium .post .read-more { - text-align: right; -} -.box-image-text.blog .author-category { - color: #999999; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 300; - font-size: 12px; -} -.box-image-text.blog .author-category a { - font-weight: 500; -} -.box-image-text.blog .intro { - text-align: left; - margin-bottom: 20px; -} -#blog-homepage .post { - margin-bottom: 30px; -} -#blog-homepage .post h2, -#blog-homepage .post h4, -#blog-homepage .post .author-category, -#blog-homepage .post .read-more { - text-align: center; -} -#blog-homepage .post .read-more { - margin-top: 20px; -} -#blog-post #post-content { - margin-bottom: 20px; -} -#blog-post .comment { - margin-bottom: 25px; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment .posted { - color: #999999; - font-size: 12px; -} -#blog-post .comment .reply { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#blog-post .comment.last { - margin-bottom: 0; -} -#blog-post #comments, -#blog-post #comment-form { - padding: 20px 0; - margin-top: 20px; - border-top: solid 1px #eeeeee; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments h4, -#blog-post #comment-form h4 { - margin-bottom: 20px; -} -#blog-post #comment-form { - margin-bottom: 20px; -} -.product { - background: #fff; - border-bottom: solid 1px #e6e6e6; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 60px; - overflow: hidden; - text-align: center; -} -.product .image { - overflow: hidden; -} -.product .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .product .image img.img-responsive { - min-width: 100%; - } -} -.product .text { - padding: 10px; -} -.product .text h3 { - font-size: 14px; - font-weight: 700; - height: 39.6px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.product .text h3 a { - color: #555555; -} -.product .text h3 a:hover { - text-decoration: none; -} -.product .text p.price { - font-size: 18px; -} -.product .text p.price del { - color: #999999; -} -.product .buttons { - clear: both; - position: absolute; - display: none; - bottom: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - border: solid 1px transparent; - padding: 20px; - background: rgba(255, 255, 255, 0.9); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - text-align: center; -} -.product .buttons .btn { - margin-bottom: 20px; -} -.product:hover { - border-bottom: solid 1px #808080; - top: 0; -} -.product:hover .buttons { - clear: both; - position: absolute; - top: 0; - background: rgba(255, 255, 255, 0.5); -} -.product:hover .image img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.goToDescription { - font-size: 12px; - text-align: center; - margin-bottom: 40px; -} -.goToDescription a { - color: #999999; - text-decoration: underline; -} -#productMain { - margin-bottom: 30px; -} -#productMain .sizes { - text-align: center; -} -#productMain .sizes h3 { - font-weight: 700; - letter-spacing: 0.08em; - text-transform: uppercase; - margin-bottom: 40px; -} -#productMain .sizes a { - display: inline-block; - width: 40px; - height: 40px; - border-radius: 40px; - background: #ccc; - line-height: 40px; - color: #555555; - text-align: center; - text-decoration: none; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#productMain .sizes a.active, -#productMain .sizes a:hover { - background: #467fbf; - color: #fff; -} -#productMain .sizes input { - display: none; -} -#productMain .price { - font-size: 40px; - text-align: center; - margin-top: 40px; - margin-bottom: 40px; -} -#thumbs a { - display: block; - border: solid 1px transparent; -} -#thumbs a.active { - border-color: #467fbf; -} -#product-social { - text-align: center; -} -#product-social h4 { - font-weight: 300; - margin-bottom: 10px; -} -#product-social p { - line-height: 26px; -} -#product-social p a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -#product-social p a i { - vertical-align: bottom; - line-height: 26px; -} -#product-social p a.facebook { - background-color: #4460ae; -} -#product-social p a.gplus { - background-color: #c21f25; -} -#product-social p a.twitter { - background-color: #3cf; -} -#product-social p a.instagram { - background-color: #cd4378; -} -#product-social p a.email { - background-color: #4a7f45; -} -@media (max-width: 991px) { - #product-social { - text-align: center; - } -} -#checkout .nav { - margin-bottom: 20px; - border-bottom: solid 1px #467fbf; -} -#checkout .nav li { - height: 100%; -} -#checkout .nav li a { - display: block; - height: 100%; -} -#order-summary table { - margin-top: 20px; -} -#order-summary table td { - color: #999999; -} -#order-summary table tr.total td, -#order-summary table tr.total th { - font-size: 18px; - color: #555555; - font-weight: 700; -} -#checkout .table tbody tr td, -#basket .table tbody tr td, -#customer-order .table tbody tr td { - vertical-align: middle; -} -#checkout .table tbody tr td input, -#basket .table tbody tr td input, -#customer-order .table tbody tr td input { - width: 50px; - text-align: right; -} -#checkout .table tbody tr td img, -#basket .table tbody tr td img, -#customer-order .table tbody tr td img { - width: 50px; -} -#checkout .table tfoot, -#basket .table tfoot, -#customer-order .table tfoot { - font-size: 18px; -} -.shipping-method h4, -.payment-method h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#customer-orders table tr th, -#customer-orders table tr td { - vertical-align: baseline; -} -#customer-order .table tfoot th { - font-size: 18px; - font-weight: 300; -} -#customer-order .addresses { - text-align: right; - margin-bottom: 30px; -} -#customer-order .addresses p { - font-size: 18px; - font-weight: 300; -} -#customer-account { - margin-bottom: 30px; -} -#get-it { - background: #467fbf; - padding: 50px 0 30px; - color: #fff; - text-align: center; -} -#get-it h1, -#get-it h2, -#get-it h3, -#get-it h4, -#get-it h5, -#get-it h6 { - color: #fff; - text-transform: uppercase; - letter-spacing: 0.08em; - margin: 0 0 20px; -} -#get-it p { - margin: 0 0 20px; -} -#footer { - background: #555555; - padding: 50px 0; - color: #999999; -} -#footer h1, -#footer h2, -#footer h3, -#footer h4, -#footer h5, -#footer h6 { - color: #eeeeee; -} -#footer h4 { - font-size: 14px; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.08em; -} -#footer ul { - padding-left: 0; - list-style: none; -} -#footer ul a { - color: #999999; -} -#footer ul a:hover { - color: #467fbf; - text-decoration: none; -} -#footer .photostream div { - float: left; - display: block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 33%; - padding: 7.5px; - overflow: hidden; -} -#footer .photostream div a { - border: solid 1 px #eeeeee; -} -#footer .photostream div img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -#footer .photostream div:hover img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -#footer .blog-entries .item { - clear: both; - padding: 5px 0; - margin-bottom: 10px; - border-bottom: solid 1px #555555; -} -#footer .blog-entries .item .image { - float: left; - width: 15%; - margin-right: 10px; -} -#footer .blog-entries .item .name { - width: 75%; - margin-left: 10px; - display: table-cell; - vertical-align: middle; -} -#footer .blog-entries .item .name h5 { - margin: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-size: 12px; -} -#footer .blog-entries .item .name h5 a { - color: #eeeeee; -} -#footer .blog-entries .item .text { - width: 100%; - clear: both; -} -#footer .blog-entries .item:last-child { - border-bottom: none; - margin-bottom: 0; -} -#footer .social a { - color: #555555; - font-size: 25px; - margin: 0 10px 0 0; -} -#footer .social a:hover { - color: #467fbf; -} -#copyright { - background: #333; - color: #ccc; - padding: 50px 0; - font-size: 12px; - line-height: 28px; -} -#copyright p { - margin: 0; -} -@media (max-width: 991px) { - #copyright p { - float: none !important; - text-align: center; - margin-bottom: 10px; - } -} -[data-animate] { - opacity: 0; - filter: alpha(opacity=0); -} -#style-switch-button { - position: fixed; - top: 100px; - left: 0px; - border-radius: 0; -} -#style-switch { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 300px; - padding: 20px; - position: fixed; - top: 140px; - left: 0; - background: #fff; - border: solid 1px #eeeeee; -} -@media (max-width: 991px) { - #style-switch-button { - display: none; - } - #style-switch { - display: none; - } -} -/* Original Boostrap template overwrite */ -/* breadcrumbs */ -.breadcrumb { - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - background-color: none; - letter-spacing: 0.08em; -} -/* nav */ -.nav > li > a { - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #999999; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #467fbf; -} -.nav-tabs { - border-bottom: 1px solid #467fbf; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 0 0 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #467fbf; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - background-color: #ffffff; - border: 1px solid #467fbf; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: solid 1px #467fbf; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #467fbf; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #467fbf; - border-radius: 0 0 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 0; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #467fbf; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; - border-bottom: solid 1px #467fbf; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #467fbf; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #467fbf; - border-radius: 0 0 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.tab-content { - padding: 15px; - border: solid 1px #ddd; - border-top: none; -} -/* navbar */ -.navbar { - position: relative; - min-height: 62px; - margin-bottom: 0; - border-bottom: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 0px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-affixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-affixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - padding: 10px 15px; - font-size: 18px; - line-height: 20px; - height: 62px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 14px; - margin-bottom: 14px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 0; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-nav { - margin: 10.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 21px; - padding-bottom: 21px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 14px; - margin-bottom: 14px; -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-btn.btn-sm { - margin-top: 16px; - margin-bottom: 16px; -} -.navbar-btn.btn-xs { - margin-top: 20px; - margin-bottom: 20px; -} -.navbar-text { - margin-top: 21px; - margin-bottom: 21px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #ffffff; - border-color: #cccccc; - border-bottom: none; -} -.navbar-default .navbar-brand { - color: #555555; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #3b3b3b; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777777; -} -.navbar-default .navbar-nav > li > a { - color: #555555; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #555555; - background-color: #92b3d9; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #467fbf; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #dddddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #467fbf; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #cccccc; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - background-color: #467fbf; - color: #ffffff; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #555555; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #467fbf; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #467fbf; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #555555; -} -.navbar-default .navbar-link:hover { - color: #555555; -} -.navbar-default .btn-link { - color: #555555; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #555555; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; -} -/* scaffolding */ -body { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #555555; -} -a { - color: #467fbf; - text-decoration: none; -} -a:hover, -a:focus { - color: #2f5a89; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.img-rounded { - border-radius: 0; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} -/* breadcrumbs */ -.breadcrumb { - padding: 20px 0; - margin-bottom: 20px; - background-color: transparent; - border-radius: 0; - text-align: right; -} -.breadcrumb > li + li:before { - content: ">\00a0"; - color: #555555; -} -.breadcrumb > .active { - color: #999999; -} -@media (max-width: 991px) { - .breadcrumb { - padding: 20px 0; - text-align: center; - } -} -/* dropdowns */ -.dropdown-menu { - z-index: 1000; - font-size: 14px; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - padding: 5px 20px; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; -} -/* labels */ -.label { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: normal; - text-transform: uppercase; - letter-spacing: 0.08em; -} -/* forms.less */ -label { - font-weight: normal; -} -.form-control { - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 0; -} -.form-control:focus { - border-color: #467fbf; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(70, 127, 191, 0.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(70, 127, 191, 0.6); -} -.form-group { - margin-bottom: 20px; -} -/* pager*/ -.pager { - margin: 20px 0; - border-top: solid 1px #eeeeee; - padding-top: 20px; - text-transform: uppercase; - letter-spacing: 0.08em; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - background-color: #ffffff; - border: 1px solid #467fbf; - border-radius: 0; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - color: #fff; - background-color: #467fbf; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - background-color: #ffffff; - border-color: #ddd; -} -/* pagination */ -.pagination { - margin: 20px 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - border-radius: 0; -} -.pagination > li > a, -.pagination > li > span { - padding: 6px 12px; - line-height: 1.42857143; - text-decoration: none; - color: #467fbf; - background-color: #ffffff; - border: 1px solid #dddddd; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #467fbf; - background-color: #b8cee6; - border-color: #dddddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - background-color: #467fbf; - border-color: #467fbf; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - background-color: #ffffff; - border-color: #dddddd; -} -/* responsive utilities */ -@media (max-width: 767px) { - .text-center-xs { - text-align: center !important; - } - .text-center-xs img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .text-center-sm { - text-align: center !important; - } - .text-center-sm img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -/* type */ -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 900; - line-height: 1.1; - color: #333333; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 20px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 18px; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -.text-small { - font-size: 12px; -} -.text-large { - font-size: 18px; -} -.text-italic { - font-style: italic; -} -.text-primary { - color: #467fbf; -} -a.text-primary:hover { - color: #36669c; -} -.bg-primary { - color: #fff; - background-color: #467fbf; -} -a.bg-primary:hover { - background-color: #36669c; -} -abbr[title], -abbr[data-original-title] { - border-bottom: 1px dotted #999999; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 14px; - border-left: 5px solid #467fbf; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #999999; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - border-right: 5px solid #467fbf; -} -address { - margin-bottom: 20px; - line-height: 1.42857143; -} -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 0; - -webkit-box-shadow: 0 0 0; - box-shadow: 0 0 0; -} -.panel-heading { - border-top-right-radius: 0; - border-top-left-radius: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 15px 15px; -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 0; - overflow: hidden; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group.accordion .panel { - border-color: #ccc; -} -.panel-primary { - border-color: #467fbf; -} -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #467fbf; - border-color: #467fbf; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #467fbf; -} -.panel-primary > .panel-heading .badge { - color: #467fbf; - background-color: #ffffff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #467fbf; -} -.panel-primary .panel-title { - font-weight: 300; -} -.panel-primary .panel-title a:hover { - color: #fff; - text-decoration: none; -} -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #467fbf; - background-color: #ffffff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.progress-bar-primary { - background-color: #467fbf; -} -.progress-striped .progress-bar-primary { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -/*! - * Yamm!3 - Yet another megamenu for Bootstrap 3 - * http://geedmo.github.com/yamm3 - * - * @geedmo - Licensed under the MIT license - */ -.yamm .nav, -.yamm .collapse, -.yamm .dropup.use-yamm, -.yamm .dropdown.use-yamm { - position: static; -} -.yamm .container { - position: relative; -} -.yamm .dropdown-menu { - left: auto; -} -.yamm .nav.navbar-right .dropdown-menu { - left: auto; - right: 0; -} -.yamm .yamm-content { - padding: 20px 30px; -} -.yamm .dropdown.yamm-fw .dropdown-menu { - left: 15px; - right: 15px; -} diff --git a/css/style.default.css b/css/style.default.css deleted file mode 100644 index 0320aea..0000000 --- a/css/style.default.css +++ /dev/null @@ -1,3557 +0,0 @@ -.clearfix:before, -.clearfix:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after { - content: " "; - display: table; -} -.clearfix:after, -.navbar:after, -.navbar-header:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -/* general styles */ -a, -button { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -a i.fa, -button i.fa { - margin: 0 5px; -} -.clickable { - cursor: pointer !important; -} -.required { - color: #38a7bb; -} -.accent { - color: #38a7bb; -} -.text-uppercase { - text-transform: uppercase; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .text-center-sm { - text-align: center; - } -} -p.lead { - margin-bottom: 40px; -} -section, -div.section { - margin-bottom: 40px; -} -.no-mb { - margin-bottom: 0 !important; -} -.mb-small { - margin-bottom: 20px !important; -} -.heading { - margin-bottom: 40px; -} -.heading h1, -.heading h2, -.heading h3, -.heading h4, -.heading h5 { - display: inline-block; - border-bottom: solid 5px #38a7bb; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; - vertical-align: middle; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.heading h1 i.fa, -.heading h2 i.fa, -.heading h3 i.fa, -.heading h4 i.fa, -.heading h5 i.fa { - display: inline-block; - background: #38a7bb; - width: 30px; - height: 30px; - vertical-align: middle; - text-align: center; - color: #fff; - font-size: 12px; - line-height: 30px; - border-radius: 15px; -} -.icon { - display: inline-block; - width: 80px; - height: 80px; - color: #fff; - line-height: 80px; - border-radius: 40px; - border: solid 1px #fff; - font-size: 20px; -} -.icon.icon-lg { - font-size: 30px; - border-width: 2px; -} -.ul-icons { - padding-left: 10px; -} -.ul-icons li { - list-style-type: none; - line-height: 20px; - margin-bottom: 20px; -} -.ul-icons li i { - width: 20px; - height: 20px; - background: #38a7bb; - color: #fff; - text-align: center; - border-radius: 10px; - line-height: 20px; - margin-right: 10px; -} -ul.list-style-none { - list-style: none; -} -#text-page h1, -#text-page h2, -#text-page h3 { - font-weight: 700; -} -#error-page { - text-align: center; - margin-top: 40px; - margin-bottom: 100px; -} -#error-page h4 { - margin-bottom: 40px; -} -#error-page p.buttons { - margin-top: 40px; -} -.pages-listing .item { - text-align: center; -} -.pages-listing .item h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 20px; - letter-spacing: 0.08em; -} -.pages-listing .item h3 a { - color: #555555; -} -.pages-listing .item .text { - margin-bottom: 20px; -} -.pages-listing .item .text p { - color: #999999; - font-size: 12px; - margin-bottom: 20px; -} -.banner { - margin-bottom: 30px; - text-align: center; -} -.banner img { - margin: 0 auto; -} -.banner a:hover img { - opacity: 0.8; - filter: alpha(opacity=80); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.pages { - text-align: center; -} -.pages .loadMore { - text-align: center; -} -.pages .pagination { - text-align: center; -} -.features-buttons button { - margin-bottom: 20px; -} -@media (min-width: 1300px) { - body.boxed { - background: url(https://www.toptal.com/designers/subtlepatterns/patterns/subtle_zebra_3d.png); - } - body.boxed #all { - position: relative; - background: #fff; - width: 1200px; - margin: 0 auto; - overflow: hidden; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - } -} -#top { - background: #555555; - color: #eeeeee; - padding: 10px 0; -} -#top p { - margin: 0; - font-size: 12px; -} -#top .social { - float: right; - text-align: right; -} -#top .social a { - color: #999999; - display: inline-block; - width: 24px; - height: 24px; - border-radius: 12px; - line-height: 20px; - font-size: 12px; - text-align: center; - vertical-align: bottom; -} -#top .social a:hover { - color: #fff; -} -#top .social a:hover.facebook { - background-color: #4460ae; -} -#top .social a:hover.gplus { - background-color: #c21f25; -} -#top .social a:hover.twitter { - background-color: #3cf; -} -#top .social a:hover.instagram { - background-color: #cd4378; -} -#top .social a:hover.email { - background-color: #4a7f45; -} -#top .login { - float: right; -} -#top .login a { - font-size: 12px; - color: #eeeeee; - margin-right: 15px; - text-decoration: none; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.10em; -} -@media (max-width: 767px) { - #top .login { - float: left; - } -} -#top.light { - background: #fff; - color: #999999; - border-bottom: solid 1px #eeeeee; -} -#top.light .login a { - color: #555555; -} -.navbar { - border: none; -} -.navbar ul.nav > li > a { - text-transform: uppercase; - text-decoration: underline; - font-weight: bold; - letter-spacing: 0.08em; - border-top: solid 5px transparent; -} -.navbar ul.nav > li > a:hover { - border-top: solid 5px #38a7bb; -} -.navbar ul.nav > li.active > a, -.navbar ul.nav > li.open > a { - text-decoration: none !important; - border-top: solid 5px #20616d; -} -@media (max-width: 768px) { - .navbar ul.nav > li.active > a, - .navbar ul.nav > li.open > a { - border-top-color: transparent; - } - .navbar ul.nav > li > a:hover { - border-top-color: transparent; - } -} -.navbar.navbar-light ul.nav > li.active > a { - border-top: solid 5px #20616d; - background: #fff !important; - color: #555555 !important; -} -.navbar.navbar-light ul.nav > li.active > a:hover { - border-top: solid 5px #20616d; -} -.navbar.navbar-light ul.nav > li > a:hover, -.navbar.navbar-light ul.nav > li.open > a:hover, -.navbar.navbar-light ul.nav > li > a:focus, -.navbar.navbar-light ul.nav > li.open > a:focus { - border-top: solid 5px #38a7bb; - background: #fff !important; - color: #555555 !important; -} -.navbar ul.dropdown-menu { - margin: 0; - padding: 0; -} -.navbar ul.dropdown-menu li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 4px 0; -} -.navbar ul.dropdown-menu li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - left: 0; -} -.navbar ul.dropdown-menu li a:hover { - color: #38a7bb; - text-decoration: none; - background: none; - left: 2px; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .navbar ul.dropdown-menu li a:hover { - left: 0; - } -} -.navbar .yamm-content h3 { - font-size: 18px; - text-transform: uppercase; - padding-bottom: 10px; - margin-top: 5px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -@media (max-width: 767px) { - .navbar .yamm-content h3 { - font-size: 14px; - } -} -.navbar .yamm-content h5 { - text-transform: uppercase; - padding-bottom: 10px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -.navbar .yamm-content ul { - margin: 0; - padding: 0; -} -.navbar .yamm-content ul li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - padding: 4px 0; -} -.navbar .yamm-content ul li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.navbar .yamm-content ul li a:hover { - color: #38a7bb; - text-decoration: none; - padding-left: 2px; -} -.navbar .yamm-content .banner { - margin-bottom: 10px; -} -.navbar .yamm-fw .dropdown-menu { - padding: 0; -} -.navbar .navbar-buttons { - float: right; -} -.navbar .navbar-buttons button, -.navbar .navbar-buttons a.btn, -.navbar .navbar-buttons .btn-default.navbar-toggle { - margin-top: 11px; - margin-bottom: 11px; - margin-left: 0; - margin-right: 5px; -} -.navbar .btn-default, -.navbar .btn-default.navbar-toggle { - color: #999999; - background-color: #fff; - margin-left: 7px; - margin-right: 0; -} -.navbar .btn-default:hover, -.navbar .btn-default.navbar-toggle:hover, -.navbar .btn-default:focus, -.navbar .btn-default.navbar-toggle:focus { - background-color: #fff; - border-color: #38a7bb; - color: #38a7bb; -} -.navbar #search { - clear: both; - border-top: solid 1px #38a7bb; - text-align: right; -} -.navbar #search form { - float: right; -} -.navbar #search form .input-group { - width: 500px; -} -@media (max-width: 768px) { - .navbar #search form .input-group { - width: 100%; - } -} -.navbar #basket-overview a { - margin-left: 7px; -} -.navbar-affixed-top { - top: -32px; -} -.navbar-affixed-top.affix-top { - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -.navbar-affixed-top.affix { - position: fixed; - width: 100%; - top: 0; - z-index: 1000; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -body.boxed .navbar-affixed-top.affix { - position: static; -} -#login-modal { - overflow: hidden; -} -#login-modal .modal-header h4 { - text-transform: uppercase; -} -#login-modal form { - margin-bottom: 20px; -} -#login-modal a { - color: #38a7bb; -} -#login-modal p { - font-weight: 300; - margin-bottom: 20px; - font-size: 13px; -} -/* buttons */ -.btn { - font-weight: 700; - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 6px 12px; - font-size: 13px; - line-height: 1.42857143; - border-radius: 0; -} -.input-group .btn { - font-size: 14px; -} -.btn-lg { - padding: 10px 16px; - font-size: 14px; - line-height: 1.33; - border-radius: 0; -} -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-template-main { - color: #38a7bb; - background-color: #ffffff; - border-color: #38a7bb; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - color: #38a7bb; - background-color: #e6e6e6; - border-color: #2a7d8c; -} -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - background-image: none; -} -.btn-template-main.disabled, -.btn-template-main[disabled], -fieldset[disabled] .btn-template-main, -.btn-template-main.disabled:hover, -.btn-template-main[disabled]:hover, -fieldset[disabled] .btn-template-main:hover, -.btn-template-main.disabled:focus, -.btn-template-main[disabled]:focus, -fieldset[disabled] .btn-template-main:focus, -.btn-template-main.disabled:active, -.btn-template-main[disabled]:active, -fieldset[disabled] .btn-template-main:active, -.btn-template-main.disabled.active, -.btn-template-main[disabled].active, -fieldset[disabled] .btn-template-main.active { - background-color: #ffffff; - border-color: #38a7bb; -} -.btn-template-main .badge { - color: #ffffff; - background-color: #38a7bb; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active { - background: #38a7bb; - color: #ffffff; - border-color: #38a7bb; -} -.btn-template-transparent-primary { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - background-image: none; -} -.btn-template-transparent-primary.disabled, -.btn-template-transparent-primary[disabled], -fieldset[disabled] .btn-template-transparent-primary, -.btn-template-transparent-primary.disabled:hover, -.btn-template-transparent-primary[disabled]:hover, -fieldset[disabled] .btn-template-transparent-primary:hover, -.btn-template-transparent-primary.disabled:focus, -.btn-template-transparent-primary[disabled]:focus, -fieldset[disabled] .btn-template-transparent-primary:focus, -.btn-template-transparent-primary.disabled:active, -.btn-template-transparent-primary[disabled]:active, -fieldset[disabled] .btn-template-transparent-primary:active, -.btn-template-transparent-primary.disabled.active, -.btn-template-transparent-primary[disabled].active, -fieldset[disabled] .btn-template-transparent-primary.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active { - background: #fff; - color: #38a7bb; - border-color: #fff; -} -.btn-template-transparent-black { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - background-image: none; -} -.btn-template-transparent-black.disabled, -.btn-template-transparent-black[disabled], -fieldset[disabled] .btn-template-transparent-black, -.btn-template-transparent-black.disabled:hover, -.btn-template-transparent-black[disabled]:hover, -fieldset[disabled] .btn-template-transparent-black:hover, -.btn-template-transparent-black.disabled:focus, -.btn-template-transparent-black[disabled]:focus, -fieldset[disabled] .btn-template-transparent-black:focus, -.btn-template-transparent-black.disabled:active, -.btn-template-transparent-black[disabled]:active, -fieldset[disabled] .btn-template-transparent-black:active, -.btn-template-transparent-black.disabled.active, -.btn-template-transparent-black[disabled].active, -fieldset[disabled] .btn-template-transparent-black.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active { - background: #fff; - color: #000; - border-color: #fff; -} -.btn-template-primary { - color: #ffffff; - background-color: #38a7bb; - border-color: #38a7bb; -} -.btn-template-primary:hover, -.btn-template-primary:focus, -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - color: #ffffff; - background-color: #2c8494; - border-color: #2a7d8c; -} -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - background-image: none; -} -.btn-template-primary.disabled, -.btn-template-primary[disabled], -fieldset[disabled] .btn-template-primary, -.btn-template-primary.disabled:hover, -.btn-template-primary[disabled]:hover, -fieldset[disabled] .btn-template-primary:hover, -.btn-template-primary.disabled:focus, -.btn-template-primary[disabled]:focus, -fieldset[disabled] .btn-template-primary:focus, -.btn-template-primary.disabled:active, -.btn-template-primary[disabled]:active, -fieldset[disabled] .btn-template-primary:active, -.btn-template-primary.disabled.active, -.btn-template-primary[disabled].active, -fieldset[disabled] .btn-template-primary.active { - background-color: #38a7bb; - border-color: #38a7bb; -} -.btn-template-primary .badge { - color: #38a7bb; - background-color: #ffffff; -} -#intro { - background: url('../img/home.jpg') no-repeat center top; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} -#intro .item { - font-family: "Roboto", Helvetica, Arial, sans-serif; - height: 100%; -} -#intro .item h1 { - text-transform: uppercase; - font-size: 50px; - color: #fff; - margin-bottom: 40px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #intro .item h1 { - font-size: 40px; - } -} -@media (max-width: 767px) { - #intro .item h1 { - font-size: 25px; - } -} -#intro .item h3 { - color: #fff; - margin-bottom: 40px; -} -@media (max-width: 767px) { - #intro .item h3 { - font-size: 15px; - margin-bottom: 20px; - } -} -#intro .item .btn { - text-transform: none; -} -@media (max-width: 991px) { - #intro .item .btn { - font-size: 14px; - } -} -@media (max-width: 991px) { - #intro .item .carousel-caption { - left: 10%; - right: 10%; - } -} -#intro .container, -#intro .row { - height: 100%; - position: relative; -} -.jumbotron { - padding: 30px; - margin-bottom: 0; - position: relative; - background: url('../img/cyber-bg.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.jumbotron .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #38a7bb; - opacity: 0.9; - filter: alpha(opacity=90); -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3, -.jumbotron p, -.jumbotron ul { - color: #fff; -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3 { - color: #ffffff; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.jumbotron p { - margin-bottom: 20px; - font-size: 21px; - font-weight: 400; -} -.jumbotron p.text-uppercase { - font-weight: 700; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 0; -} -.jumbotron .container { - max-width: 100%; - z-index: 2; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 46px; - } -} -#categoryMenu h3 { - padding: 20px; - background: #f7f7f7; - margin: 0; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.panel.sidebar-menu h3 { - padding: 5px 0; - margin: 0; -} -.panel.sidebar-menu { - background: #fff; - margin: 0 0 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.panel.sidebar-menu .panel-heading { - text-transform: uppercase; - margin-bottom: 10px; - background: none; - padding: 0; - letter-spacing: 0.08em; - border-bottom: none; -} -.panel.sidebar-menu .panel-heading h1, -.panel.sidebar-menu .panel-heading h2, -.panel.sidebar-menu .panel-heading h3, -.panel.sidebar-menu .panel-heading h4, -.panel.sidebar-menu .panel-heading h5 { - display: inline-block; - border-bottom: solid 5px #38a7bb; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; -} -.panel.sidebar-menu .panel-heading .btn.btn-danger { - color: #fff; - margin-top: 5px; -} -.panel.sidebar-menu .panel-body { - padding: 0; -} -.panel.sidebar-menu .panel-body span.colour { - display: inline-block; - width: 15px; - height: 15px; - border: solid 1px #555555; - vertical-align: top; - margin-top: 2px; - margin-left: 5px; -} -.panel.sidebar-menu .panel-body span.colour.white { - background: #fff; -} -.panel.sidebar-menu .panel-body span.colour.red { - background: red; -} -.panel.sidebar-menu .panel-body span.colour.green { - background: green; -} -.panel.sidebar-menu .panel-body span.colour.blue { - background: blue; -} -.panel.sidebar-menu .panel-body span.colour.yellow { - background: yellow; -} -.panel.sidebar-menu .panel-body label { - color: #999999; - font-size: 12px; -} -.panel.sidebar-menu .panel-body label:hover { - color: #555555; -} -.panel.sidebar-menu ul.nav.category-menu { - margin-bottom: 20px; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.08em; -} -.panel.sidebar-menu ul.nav.category-menu li a { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.panel.sidebar-menu ul.nav ul { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.nav ul li { - display: block; -} -.panel.sidebar-menu ul.nav ul li a { - position: relative; - font-family: "Times New Roman", Times, serif; - font-weight: normal; - text-transform: none !important; - display: block; - padding: 10px 15px; - padding-left: 30px; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.nav ul li a:hover, -.panel.sidebar-menu ul.nav ul li a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.panel.sidebar-menu ul.tag-cloud { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.tag-cloud li { - display: inline-block; -} -.panel.sidebar-menu ul.tag-cloud li a { - display: inline-block; - padding: 5px; - border: solid 1px #eeeeee; - border-radius: 0; - color: #38a7bb; - margin: 5px 5px 5px 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 700; - font-size: 12px; -} -.panel.sidebar-menu ul.tag-cloud li a:hover { - color: #38a7bb; - text-decoration: none; - border-color: #38a7bb; -} -.panel.sidebar-menu ul.popular, -.panel.sidebar-menu ul.recent { - list-style: none; - padding-left: 0; - padding: 20px 0; -} -.panel.sidebar-menu ul.popular li, -.panel.sidebar-menu ul.recent li { - margin-bottom: 10px; - padding: 5px 0; - border-bottom: dotted 1px #eeeeee; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li img, -.panel.sidebar-menu ul.recent li img { - width: 50px; - margin-right: 10px; -} -.panel.sidebar-menu ul.popular li h5, -.panel.sidebar-menu ul.recent li h5 { - margin: 0 0 10px; -} -.panel.sidebar-menu ul.popular li h5 a, -.panel.sidebar-menu ul.recent li h5 a { - font-weight: normal; -} -.panel.sidebar-menu ul.popular li p.date, -.panel.sidebar-menu ul.recent li p.date { - float: right; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.popular li:last-child, -.panel.sidebar-menu ul.recent li:last-child { - border-bottom: none; -} -.panel.sidebar-menu .text-widget { - font-size: 12px; -} -.panel.sidebar-menu.with-icons ul.nav li a:after { - font-family: 'FontAwesome'; - content: "\f105"; - position: relative; - top: 0; - float: right; -} -/* ribbons for product sales etc. */ -.ribbon { - position: absolute; - top: 50px; - padding-left: 51px; - font-weight: 700; - letter-spacing: 0.08em; -} -.ribbon .ribbon-background { - position: absolute; - top: 0; - right: 0; -} -.ribbon .theribbon { - position: relative; - width: 80px; - padding: 6px 20px 6px 20px; - margin: 30px 10px 10px -71px; - color: #fff; - background-color: #38a7bb; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.ribbon .theribbon:before, -.ribbon .theribbon:after { - content: ' '; - position: absolute; - width: 0; - height: 0; -} -.ribbon .theribbon:after { - left: 0px; - top: 100%; - border-width: 5px 10px; - border-style: solid; - border-color: #000000 #000000 transparent transparent; -} -.ribbon.sale { - top: 0; -} -.ribbon.new { - top: 50px; -} -.ribbon.new .theribbon { - background-color: #5bc0de; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.new .theribbon:after { - border-color: #2390b0 #2390b0 transparent transparent; -} -.ribbon.gift { - top: 100px; -} -.ribbon.gift .theribbon { - background-color: #5cb85c; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.gift .theribbon:after { - border-color: #357935 #357935 transparent transparent; -} -.owl-carousel .owl-controls .owl-page.active span, -.owl-theme .owl-controls .owl-page.active span, -.owl-carousel .owl-controls.clickable .owl-page:hover span, -.owl-theme .owl-controls.clickable .owl-page:hover span { - background: #38a7bb; -} -.owl-carousel .owl-controls .owl-buttons, -.owl-theme .owl-controls .owl-buttons { - position: absolute; - top: 5px; - right: 0; -} -.owl-carousel .owl-controls .owl-buttons div, -.owl-theme .owl-controls .owl-buttons div { - width: 26px; - height: 26px; - line-height: 25px; - margin: 0 5px 0 0; - font-size: 18px; - color: #38a7bb; - padding: 0; - background: #fff; - border-radius: 13px; - vertical-align: middle; - text-align: center; - opacity: 1; - filter: alpha(opacity=100); -} -.home-carousel { - position: relative; - background: url('../img/cyber-bg.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.home-carousel .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #38a7bb; - opacity: 0.9; - filter: alpha(opacity=90); -} -.home-carousel .owl-carousel { - padding-top: 60px; - padding-bottom: 20px; -} -.home-carousel .owl-theme .owl-controls .owl-page span { - background: #666; -} -.home-carousel .owl-theme .owl-controls .owl-page.active span { - background: #fff; -} -.home-carousel .owl-theme .owl-controls .owl-page:hover span { - background: #fff; -} -@media (max-width: 767px) { - .home-carousel { - text-align: center !important; - } -} -@media (min-width: 992px) { - .home-carousel .right { - text-align: right; - } -} -.home-carousel h1, -.home-carousel h2, -.home-carousel h3, -.home-carousel p, -.home-carousel ul { - color: #fff; -} -.home-carousel h1 { - font-weight: 700; - text-transform: uppercase; - font-size: 46px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .home-carousel h1 { - font-size: 36px; - } -} -.home-carousel h2 { - font-weight: 700; - text-transform: uppercase; - font-size: 40px; - letter-spacing: 0.08em; -} -.home-carousel ul, -.home-carousel p { - font-size: 18px; - font-weight: 700; - padding: 0; - text-transform: uppercase; - letter-spacing: 0.10em; -} -@media (max-width: 991px) { - .home-carousel ul, - .home-carousel p { - font-size: 14px; - } -} -.home-carousel ul li { - margin-bottom: 10px; -} -.customers { - padding: 0; - margin-bottom: 40px; -} -.customers .item { - list-style-type: none; - text-align: center; - margin: 0 20px; -} -.customers .item img { - display: inline-block; - filter: url("data:image/svg+xml;utf8,#grayscale"); - /* Firefox 10+, Firefox on Android */ - filter: gray; - /* IE6-9 */ - -webkit-filter: grayscale(100%); - /* Chrome 19+, Safari 6+, Safari 6+ iOS */ - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.customers .item img:hover { - max-width: auto; - filter: none; - -webkit-filter: none; -} -.testimonials { - padding: 0; - margin-bottom: 40px; -} -.testimonials .item { - list-style-type: none; - margin: 0 5px; - background: #fff; - padding-bottom: 60px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.testimonials .item .testimonial { - position: relative; - padding: 20px; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial .text { - color: #999999; - margin-bottom: 40px; -} -.testimonials .item .testimonial .bottom { - position: absolute; - left: 0; - bottom: 0; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px; - height: 50px; -} -.testimonials .item .testimonial .bottom .icon { - color: #38a7bb; - font-size: 30px; - float: left; - width: 20%; -} -.testimonials .item .testimonial .name-picture { - float: right; - width: 80%; - text-align: right; -} -.testimonials .item .testimonial .name-picture h5 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.testimonials .item .testimonial .name-picture p { - color: #999999; - margin: 0; - font-size: 12px; -} -.testimonials .item .testimonial .name-picture img { - float: right; - width: 60px; - border-radius: 30px; - margin-left: 10px; -} -.team-member { - text-align: center; - margin-bottom: 40px; -} -.team-member h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 5px; - letter-spacing: 0.08em; -} -.team-member h3 a { - color: #555555; -} -.team-member p.role { - color: #999999; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.team-member .social { - margin-bottom: 20px; -} -.team-member .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email { - background-color: #4a7f45; -} -.team-member .text p { - color: #999999; - font-size: 12px; -} -.team-member .social, -.team-member-detail .social { - margin-bottom: 20px; -} -.team-member .social a, -.team-member-detail .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i, -.team-member-detail .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook, -.team-member-detail .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus, -.team-member-detail .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter, -.team-member-detail .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram, -.team-member-detail .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email, -.team-member-detail .social a.email { - background-color: #4a7f45; -} -.box-simple { - text-align: center; - margin-bottom: 40px; -} -.box-simple .icon { - color: #38a7bb; - border-color: #38a7bb; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.box-simple h3 { - font-weight: normal; - font-size: 18px; - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-simple h3 a { - color: #555555; -} -.box-simple p { - color: #999999; -} -.box-simple:hover .icon { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.box-simple:hover .icon i { - -webkit-transform: scale(1, 1); - -ms-transform: scale(1, 1); - -o-transform: scale(1, 1); - transform: scale(1, 1); -} -.box-simple.box-white { - padding: 20px; - border: dotted 1px #999999; -} -.box-simple.box-white .icon { - color: #555555; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark { - padding: 20px; - border: dotted 1px #999999; - background: #555555; - color: #fff; -} -.box-simple.box-dark .icon { - color: #f7f7f7; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark h3 { - color: #fff; -} -.box-simple.box-dark h3 a { - color: #fff; -} -.box-simple.box-dark p { - color: #fff; -} -.box-image { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #38a7bb; -} -.box-image .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -.box-image-text { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image-text .top { - position: relative; - margin-bottom: 10px; -} -.box-image-text .top .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #38a7bb; -} -.box-image-text .top .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .top .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image-text .top .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image-text .top .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .content h3, -.box-image-text .content h4 { - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-image-text .content p { - color: #999999; -} -.box-image-text:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image-text:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image-text:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -/* universal box */ -.box { - background: #fff; - margin: 0 0 30px; - border: solid 1px #ccc; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px 0; - border-left: none; - border-right: none; -} -.box .box-header { - background: #f7f7f7; - margin: -20px 0 20px; - padding: 20px; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-footer { - background: #f7f7f7; - margin: 30px 0 -20px; - padding: 20px; - border-top: solid 1px #eeeeee; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -@media (max-width: 991px) { - .box .box-footer .btn { - margin-bottom: 20px; - } -} -.box.no-border { - border: none; -} -#heading-breadcrumbs { - background: url('../img/texture-bw.png') center center repeat; - padding: 20px 0; - margin-bottom: 40px; -} -#heading-breadcrumbs.no-mb { - margin-bottom: 0; -} -#heading-breadcrumbs h1 { - color: #333333; - text-transform: uppercase; - font-size: 30px; - font-weight: 700; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #heading-breadcrumbs h1 { - text-align: center; - } -} -#heading-breadcrumbs ul.breadcrumb { - margin-top: 5px; - margin-bottom: 0; -} -.bar { - position: relative; - background: #38a7bb; - padding: 60px 0; -} -.bar.background-pentagon { - background: url('../img/texture-bw.png') center center repeat; - border-top: solid 1px #999999; - border-bottom: solid 1px #999999; -} -.bar.background-gray { - background: #eeeeee; -} -.bar.background-gray-dark { - background: #555555; -} -.bar.background-white { - background: #fff; -} -.bar.background-image-fixed-1 { - background: url('../img/fixed-background-1.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.background-image-fixed-2 { - background: url('../img/fixed-background-2.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.color-white h1, -.bar.color-white h2, -.bar.color-white h3, -.bar.color-white h4, -.bar.color-white h5, -.bar.color-white h6, -.bar.color-white p { - color: #fff; -} -.bar.padding-big { - padding: 50px 0; -} -.bar.padding-horizontal { - padding-left: 30px; - padding-right: 30px; -} -.bar.margin-vertical { - margin-top: 20px; - margin-bottom: 20px; -} -.bar .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #000; - opacity: 0.3; - filter: alpha(opacity=30); -} -.portfolio.no-space { - padding: 0 15px; -} -.portfolio.no-space .box-image { - margin: 0 -15px; -} -.portfolio-project .project-more h4 { - color: #555555; - text-transform: uppercase; - margin-bottom: 0; - text-align: left; - font-size: 14px; - letter-spacing: 0.08em; -} -.portfolio-project .project-more p { - color: #999999; - padding: 10px 0; - margin-bottom: 20px; - text-align: left; -} -.portfolio-showcase { - margin: 15px 0 60px; -} -.portfolio-showcase h3 a { - text-transform: uppercase; - line-height: 1.5; - letter-spacing: 0.08em; -} -.portfolio-showcase p.lead { - color: #555555; - margin-bottom: 20px; -} -.portfolio-showcase p { - color: #999999; -} -.portfolio-showcase p.buttons { - margin-top: 40px; -} -.see-more { - text-align: center; - margin-top: 20px; - padding-top: 20px; -} -.see-more p { - font-size: 28px; - font-weight: 100; - margin-bottom: 20px; -} -.showcase .item { - text-align: center; -} -.showcase .item .icon { - display: inline-block; - width: 50px; - height: 50px; - color: #555555; - line-height: 50px; - border-radius: 25px; - border: solid 1px #555555; -} -.showcase .item h4 { - color: #555555; - text-transform: uppercase; - letter-spacing: 0.08em; - line-height: 1.5; - font-size: 16px; -} -.showcase .item h4 span { - font-weight: bold; - font-size: 51px; -} -.packages .package { - background: #fff; - margin-top: 25px; - margin-bottom: 20px; - padding-bottom: 15px; - text-align: center; - border: solid 1px #38a7bb; - overflow: hidden; -} -.packages .package .package-header { - height: 57px; - color: #fff; - line-height: 57px; - background: #38a7bb; -} -.packages .package .package-header h5 { - color: #fff; - text-transform: uppercase; - font-weight: bold; - line-height: 57px; - margin: 0; - letter-spacing: 0.08em; -} -.packages .package .package-header.light-gray { - background: #eeeeee; -} -.packages .package .package-header.light-gray h5 { - color: #555555; -} -.packages .package .price { - line-height: 120px; - height: 100px; - color: #fff; - font-weight: 400; -} -.packages .package .price h4 { - display: inline; - font-size: 50px; - line-height: normal; - margin-bottom: 0; -} -.packages .package .price .period { - line-height: normal; - color: #999999; -} -.packages .package ul { - padding: 0; -} -.packages .package ul li { - list-style-type: none; - padding-top: 10px; - padding-bottom: 10px; - width: 80%; - margin: auto; - border-bottom: 1px dotted #ccc; -} -.packages .package ul li:last-child { - border-bottom: 0; -} -.packages .package ul li i { - font-size: 13px; - margin-right: 5px; -} -.packages .best-value .package { - margin-top: 0; - padding-bottom: 40px; -} -.packages .best-value .package .package-header { - height: 72px; - padding-top: 17px; - height: 82px !important; -} -.packages .best-value .package .package-header h5 { - font-weight: bold; - line-height: 29px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.packages .best-value .package .package-header .meta-text { - font-size: 13px; - line-height: 15px; -} -#map { - height: 300px; -} -#map.with-border { - border-top: solid 1px #38a7bb; - border-bottom: solid 1px #38a7bb; -} -#blog-listing-big .post, -#blog-homepage .post { - margin-bottom: 60px; -} -#blog-listing-big .post h2, -#blog-homepage .post h2, -#blog-listing-big .post h4, -#blog-homepage .post h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#blog-listing-big .post h2 a, -#blog-homepage .post h2 a, -#blog-listing-big .post h4 a, -#blog-homepage .post h4 a { - color: #555555; -} -#blog-listing-big .post h2 a:hover, -#blog-homepage .post h2 a:hover, -#blog-listing-big .post h4 a:hover, -#blog-homepage .post h4 a:hover { - color: #38a7bb; -} -#blog-listing-big .post .author-category, -#blog-homepage .post .author-category { - color: #999999; - text-transform: uppercase; - font-weight: 300; - letter-spacing: 0.08em; -} -#blog-listing-big .post .author-category a, -#blog-homepage .post .author-category a { - font-weight: 500; -} -#blog-listing-big .post .date-comments a, -#blog-homepage .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-big .post .date-comments a:hover, -#blog-homepage .post .date-comments a:hover { - color: #38a7bb; -} -@media (min-width: 768px) { - #blog-listing-big .post .date-comments, - #blog-homepage .post .date-comments { - text-align: right; - } -} -#blog-listing-big .post .intro, -#blog-homepage .post .intro { - text-align: left; -} -#blog-listing-big .post .image, -#blog-homepage .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-big .post .image img, -#blog-homepage .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-big .post .image img.img-responsive, - #blog-homepage .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-big .post .video, -#blog-homepage .post .video { - margin-bottom: 10px; -} -#blog-listing-big .post .read-more, -#blog-homepage .post .read-more { - text-align: right; -} -#blog-listing-medium .post { - margin-bottom: 60px; -} -#blog-listing-medium .post h2 { - text-transform: uppercase; - margin: 0 0 10px; - font-size: 24px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post h2 a { - color: #555555; -} -#blog-listing-medium .post h2 a:hover { - color: #38a7bb; -} -#blog-listing-medium .post .author-category { - float: left; - color: #999999; - text-transform: uppercase; - font-weight: 300; - font-size: 12px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post .author-category a { - font-weight: 500; -} -#blog-listing-medium .post .date-comments { - float: right; - font-size: 12px; -} -#blog-listing-medium .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-medium .post .date-comments a:hover { - color: #38a7bb; -} -@media (min-width: 768px) { - #blog-listing-medium .post .date-comments { - text-align: right; - } -} -#blog-listing-medium .post .intro { - text-align: left; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-medium .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-medium .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-medium .post .video { - margin-bottom: 10px; -} -#blog-listing-medium .post .read-more { - text-align: right; -} -.box-image-text.blog .author-category { - color: #999999; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 300; - font-size: 12px; -} -.box-image-text.blog .author-category a { - font-weight: 500; -} -.box-image-text.blog .intro { - text-align: left; - margin-bottom: 20px; -} -#blog-homepage .post { - margin-bottom: 30px; -} -#blog-homepage .post h2, -#blog-homepage .post h4, -#blog-homepage .post .author-category, -#blog-homepage .post .read-more { - text-align: center; -} -#blog-homepage .post .read-more { - margin-top: 20px; -} -#blog-post #post-content { - margin-bottom: 20px; -} -#blog-post .comment { - margin-bottom: 25px; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment .posted { - color: #999999; - font-size: 12px; -} -#blog-post .comment .reply { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#blog-post .comment.last { - margin-bottom: 0; -} -#blog-post #comments, -#blog-post #comment-form { - padding: 20px 0; - margin-top: 20px; - border-top: solid 1px #eeeeee; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments h4, -#blog-post #comment-form h4 { - margin-bottom: 20px; -} -#blog-post #comment-form { - margin-bottom: 20px; -} -.product { - background: #fff; - border-bottom: solid 1px #e6e6e6; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 60px; - overflow: hidden; - text-align: center; -} -.product .image { - overflow: hidden; -} -.product .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .product .image img.img-responsive { - min-width: 100%; - } -} -.product .text { - padding: 10px; -} -.product .text h3 { - font-size: 14px; - font-weight: 700; - height: 39.6px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.product .text h3 a { - color: #555555; -} -.product .text h3 a:hover { - text-decoration: none; -} -.product .text p.price { - font-size: 18px; -} -.product .text p.price del { - color: #999999; -} -.product .buttons { - clear: both; - position: absolute; - display: none; - bottom: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - border: solid 1px transparent; - padding: 20px; - background: rgba(255, 255, 255, 0.9); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - text-align: center; -} -.product .buttons .btn { - margin-bottom: 20px; -} -.product:hover { - border-bottom: solid 1px #808080; - top: 0; -} -.product:hover .buttons { - clear: both; - position: absolute; - top: 0; - background: rgba(255, 255, 255, 0.5); -} -.product:hover .image img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.goToDescription { - font-size: 12px; - text-align: center; - margin-bottom: 40px; -} -.goToDescription a { - color: #999999; - text-decoration: underline; -} -#productMain { - margin-bottom: 30px; -} -#productMain .sizes { - text-align: center; -} -#productMain .sizes h3 { - font-weight: 700; - letter-spacing: 0.08em; - text-transform: uppercase; - margin-bottom: 40px; -} -#productMain .sizes a { - display: inline-block; - width: 40px; - height: 40px; - border-radius: 40px; - background: #ccc; - line-height: 40px; - color: #555555; - text-align: center; - text-decoration: none; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#productMain .sizes a.active, -#productMain .sizes a:hover { - background: #38a7bb; - color: #fff; -} -#productMain .sizes input { - display: none; -} -#productMain .price { - font-size: 40px; - text-align: center; - margin-top: 40px; - margin-bottom: 40px; -} -#thumbs a { - display: block; - border: solid 1px transparent; -} -#thumbs a.active { - border-color: #38a7bb; -} -#product-social { - text-align: center; -} -#product-social h4 { - font-weight: 300; - margin-bottom: 10px; -} -#product-social p { - line-height: 26px; -} -#product-social p a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -#product-social p a i { - vertical-align: bottom; - line-height: 26px; -} -#product-social p a.facebook { - background-color: #4460ae; -} -#product-social p a.gplus { - background-color: #c21f25; -} -#product-social p a.twitter { - background-color: #3cf; -} -#product-social p a.instagram { - background-color: #cd4378; -} -#product-social p a.email { - background-color: #4a7f45; -} -@media (max-width: 991px) { - #product-social { - text-align: center; - } -} -#checkout .nav { - margin-bottom: 20px; - border-bottom: solid 1px #38a7bb; -} -#checkout .nav li { - height: 100%; -} -#checkout .nav li a { - display: block; - height: 100%; -} -#order-summary table { - margin-top: 20px; -} -#order-summary table td { - color: #999999; -} -#order-summary table tr.total td, -#order-summary table tr.total th { - font-size: 18px; - color: #555555; - font-weight: 700; -} -#checkout .table tbody tr td, -#basket .table tbody tr td, -#customer-order .table tbody tr td { - vertical-align: middle; -} -#checkout .table tbody tr td input, -#basket .table tbody tr td input, -#customer-order .table tbody tr td input { - width: 50px; - text-align: right; -} -#checkout .table tbody tr td img, -#basket .table tbody tr td img, -#customer-order .table tbody tr td img { - width: 50px; -} -#checkout .table tfoot, -#basket .table tfoot, -#customer-order .table tfoot { - font-size: 18px; -} -.shipping-method h4, -.payment-method h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#customer-orders table tr th, -#customer-orders table tr td { - vertical-align: baseline; -} -#customer-order .table tfoot th { - font-size: 18px; - font-weight: 300; -} -#customer-order .addresses { - text-align: right; - margin-bottom: 30px; -} -#customer-order .addresses p { - font-size: 18px; - font-weight: 300; -} -#customer-account { - margin-bottom: 30px; -} -#get-it { - background: #38a7bb; - padding: 50px 0 30px; - color: #fff; - text-align: center; -} -#get-it h1, -#get-it h2, -#get-it h3, -#get-it h4, -#get-it h5, -#get-it h6 { - color: #fff; - text-transform: uppercase; - letter-spacing: 0.08em; - margin: 0 0 20px; -} -#get-it p { - margin: 0 0 20px; -} -#footer { - background: #555555; - padding: 50px 0; - color: #999999; -} -#footer h1, -#footer h2, -#footer h3, -#footer h4, -#footer h5, -#footer h6 { - color: #eeeeee; -} -#footer h4 { - font-size: 14px; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.08em; -} -#footer ul { - padding-left: 0; - list-style: none; -} -#footer ul a { - color: #999999; -} -#footer ul a:hover { - color: #38a7bb; - text-decoration: none; -} -#footer .photostream div { - float: left; - display: block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 33%; - padding: 7.5px; - overflow: hidden; -} -#footer .photostream div a { - border: solid 1 px #eeeeee; -} -#footer .photostream div img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -#footer .photostream div:hover img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -#footer .blog-entries .item { - clear: both; - padding: 5px 0; - margin-bottom: 10px; - border-bottom: solid 1px #555555; -} -#footer .blog-entries .item .image { - float: left; - width: 15%; - margin-right: 10px; -} -#footer .blog-entries .item .name { - width: 75%; - margin-left: 10px; - display: table-cell; - vertical-align: middle; -} -#footer .blog-entries .item .name h5 { - margin: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-size: 12px; -} -#footer .blog-entries .item .name h5 a { - color: #eeeeee; -} -#footer .blog-entries .item .text { - width: 100%; - clear: both; -} -#footer .blog-entries .item:last-child { - border-bottom: none; - margin-bottom: 0; -} -#footer .social a { - color: #555555; - font-size: 25px; - margin: 0 10px 0 0; -} -#footer .social a:hover { - color: #38a7bb; -} -#copyright { - background: #333; - color: #ccc; - padding: 50px 0; - font-size: 12px; - line-height: 28px; -} -#copyright p { - margin: 0; -} -@media (max-width: 991px) { - #copyright p { - float: none !important; - text-align: center; - margin-bottom: 10px; - } -} -[data-animate] { - opacity: 0; - filter: alpha(opacity=0); -} -#style-switch-button { - position: fixed; - top: 100px; - left: 0px; - border-radius: 0; -} -#style-switch { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 300px; - padding: 20px; - position: fixed; - top: 140px; - left: 0; - background: #fff; - border: solid 1px #eeeeee; -} -@media (max-width: 991px) { - #style-switch-button { - display: none; - } - #style-switch { - display: none; - } -} -/* Original Boostrap template overwrite */ -/* breadcrumbs */ -.breadcrumb { - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - background-color: none; - letter-spacing: 0.08em; -} -/* nav */ -.nav > li > a { - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #999999; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #38a7bb; -} -.nav-tabs { - border-bottom: 1px solid #38a7bb; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 0 0 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #38a7bb; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - background-color: #ffffff; - border: 1px solid #38a7bb; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: solid 1px #38a7bb; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #38a7bb; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #38a7bb; - border-radius: 0 0 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 0; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #38a7bb; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; - border-bottom: solid 1px #38a7bb; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #38a7bb; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #38a7bb; - border-radius: 0 0 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.tab-content { - padding: 15px; - border: solid 1px #ddd; - border-top: none; -} -/* navbar */ -.navbar { - position: relative; - min-height: 62px; - margin-bottom: 0; - border-bottom: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 0px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-affixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-affixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - padding: 10px 15px; - font-size: 18px; - line-height: 20px; - height: 62px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 14px; - margin-bottom: 14px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 0; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-nav { - margin: 10.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 21px; - padding-bottom: 21px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 14px; - margin-bottom: 14px; -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-btn.btn-sm { - margin-top: 16px; - margin-bottom: 16px; -} -.navbar-btn.btn-xs { - margin-top: 20px; - margin-bottom: 20px; -} -.navbar-text { - margin-top: 21px; - margin-bottom: 21px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #ffffff; - border-color: #cccccc; - border-bottom: none; -} -.navbar-default .navbar-brand { - color: #555555; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #3b3b3b; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777777; -} -.navbar-default .navbar-nav > li > a { - color: #555555; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #555555; - background-color: #80cbd9; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #38a7bb; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #dddddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #38a7bb; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #cccccc; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - background-color: #38a7bb; - color: #ffffff; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #555555; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #38a7bb; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #38a7bb; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #555555; -} -.navbar-default .navbar-link:hover { - color: #555555; -} -.navbar-default .btn-link { - color: #555555; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #555555; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; -} -/* scaffolding */ -body { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #555555; -} -a { - color: #38a7bb; - text-decoration: none; -} -a:hover, -a:focus { - color: #267280; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.img-rounded { - border-radius: 0; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} -/* breadcrumbs */ -.breadcrumb { - padding: 20px 0; - margin-bottom: 20px; - background-color: transparent; - border-radius: 0; - text-align: right; -} -.breadcrumb > li + li:before { - content: ">\00a0"; - color: #555555; -} -.breadcrumb > .active { - color: #999999; -} -@media (max-width: 991px) { - .breadcrumb { - padding: 20px 0; - text-align: center; - } -} -/* dropdowns */ -.dropdown-menu { - z-index: 1000; - font-size: 14px; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - padding: 5px 20px; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; -} -/* labels */ -.label { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: normal; - text-transform: uppercase; - letter-spacing: 0.08em; -} -/* forms.less */ -label { - font-weight: normal; -} -.form-control { - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 0; -} -.form-control:focus { - border-color: #38a7bb; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(56, 167, 187, 0.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(56, 167, 187, 0.6); -} -.form-group { - margin-bottom: 20px; -} -/* pager*/ -.pager { - margin: 20px 0; - border-top: solid 1px #eeeeee; - padding-top: 20px; - text-transform: uppercase; - letter-spacing: 0.08em; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - background-color: #ffffff; - border: 1px solid #38a7bb; - border-radius: 0; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - color: #fff; - background-color: #38a7bb; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - background-color: #ffffff; - border-color: #ddd; -} -/* pagination */ -.pagination { - margin: 20px 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - border-radius: 0; -} -.pagination > li > a, -.pagination > li > span { - padding: 6px 12px; - line-height: 1.42857143; - text-decoration: none; - color: #38a7bb; - background-color: #ffffff; - border: 1px solid #dddddd; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #38a7bb; - background-color: #a7dbe5; - border-color: #dddddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - background-color: #38a7bb; - border-color: #38a7bb; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - background-color: #ffffff; - border-color: #dddddd; -} -/* responsive utilities */ -@media (max-width: 767px) { - .text-center-xs { - text-align: center !important; - } - .text-center-xs img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .text-center-sm { - text-align: center !important; - } - .text-center-sm img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -/* type */ -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 900; - line-height: 1.1; - color: #333333; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 20px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 18px; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -.text-small { - font-size: 12px; -} -.text-large { - font-size: 18px; -} -.text-italic { - font-style: italic; -} -.text-primary { - color: #38a7bb; -} -a.text-primary:hover { - color: #2c8494; -} -.bg-primary { - color: #fff; - background-color: #38a7bb; -} -a.bg-primary:hover { - background-color: #2c8494; -} -abbr[title], -abbr[data-original-title] { - border-bottom: 1px dotted #999999; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 14px; - border-left: 5px solid #38a7bb; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #999999; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - border-right: 5px solid #38a7bb; -} -address { - margin-bottom: 20px; - line-height: 1.42857143; -} -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 0; - -webkit-box-shadow: 0 0 0; - box-shadow: 0 0 0; -} -.panel-heading { - border-top-right-radius: 0; - border-top-left-radius: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 15px 15px; -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 0; - overflow: hidden; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group.accordion .panel { - border-color: #ccc; -} -.panel-primary { - border-color: #38a7bb; -} -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #38a7bb; - border-color: #38a7bb; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #38a7bb; -} -.panel-primary > .panel-heading .badge { - color: #38a7bb; - background-color: #ffffff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #38a7bb; -} -.panel-primary .panel-title { - font-weight: 300; -} -.panel-primary .panel-title a:hover { - color: #fff; - text-decoration: none; -} -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #38a7bb; - background-color: #ffffff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.progress-bar-primary { - background-color: #38a7bb; -} -.progress-striped .progress-bar-primary { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -/*! - * Yamm!3 - Yet another megamenu for Bootstrap 3 - * http://geedmo.github.com/yamm3 - * - * @geedmo - Licensed under the MIT license - */ -.yamm .nav, -.yamm .collapse, -.yamm .dropup.use-yamm, -.yamm .dropdown.use-yamm { - position: static; -} -.yamm .container { - position: relative; -} -.yamm .dropdown-menu { - left: auto; -} -.yamm .nav.navbar-right .dropdown-menu { - left: auto; - right: 0; -} -.yamm .yamm-content { - padding: 20px 30px; -} -.yamm .dropdown.yamm-fw .dropdown-menu { - left: 15px; - right: 15px; -} diff --git a/css/style.green.css b/css/style.green.css deleted file mode 100644 index d0f8a2f..0000000 --- a/css/style.green.css +++ /dev/null @@ -1,3557 +0,0 @@ -.clearfix:before, -.clearfix:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after { - content: " "; - display: table; -} -.clearfix:after, -.navbar:after, -.navbar-header:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -/* general styles */ -a, -button { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -a i.fa, -button i.fa { - margin: 0 5px; -} -.clickable { - cursor: pointer !important; -} -.required { - color: #6aae7a; -} -.accent { - color: #6aae7a; -} -.text-uppercase { - text-transform: uppercase; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .text-center-sm { - text-align: center; - } -} -p.lead { - margin-bottom: 40px; -} -section, -div.section { - margin-bottom: 40px; -} -.no-mb { - margin-bottom: 0 !important; -} -.mb-small { - margin-bottom: 20px !important; -} -.heading { - margin-bottom: 40px; -} -.heading h1, -.heading h2, -.heading h3, -.heading h4, -.heading h5 { - display: inline-block; - border-bottom: solid 5px #6aae7a; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; - vertical-align: middle; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.heading h1 i.fa, -.heading h2 i.fa, -.heading h3 i.fa, -.heading h4 i.fa, -.heading h5 i.fa { - display: inline-block; - background: #6aae7a; - width: 30px; - height: 30px; - vertical-align: middle; - text-align: center; - color: #fff; - font-size: 12px; - line-height: 30px; - border-radius: 15px; -} -.icon { - display: inline-block; - width: 80px; - height: 80px; - color: #fff; - line-height: 80px; - border-radius: 40px; - border: solid 1px #fff; - font-size: 20px; -} -.icon.icon-lg { - font-size: 30px; - border-width: 2px; -} -.ul-icons { - padding-left: 10px; -} -.ul-icons li { - list-style-type: none; - line-height: 20px; - margin-bottom: 20px; -} -.ul-icons li i { - width: 20px; - height: 20px; - background: #6aae7a; - color: #fff; - text-align: center; - border-radius: 10px; - line-height: 20px; - margin-right: 10px; -} -ul.list-style-none { - list-style: none; -} -#text-page h1, -#text-page h2, -#text-page h3 { - font-weight: 700; -} -#error-page { - text-align: center; - margin-top: 40px; - margin-bottom: 100px; -} -#error-page h4 { - margin-bottom: 40px; -} -#error-page p.buttons { - margin-top: 40px; -} -.pages-listing .item { - text-align: center; -} -.pages-listing .item h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 20px; - letter-spacing: 0.08em; -} -.pages-listing .item h3 a { - color: #555555; -} -.pages-listing .item .text { - margin-bottom: 20px; -} -.pages-listing .item .text p { - color: #999999; - font-size: 12px; - margin-bottom: 20px; -} -.banner { - margin-bottom: 30px; - text-align: center; -} -.banner img { - margin: 0 auto; -} -.banner a:hover img { - opacity: 0.8; - filter: alpha(opacity=80); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.pages { - text-align: center; -} -.pages .loadMore { - text-align: center; -} -.pages .pagination { - text-align: center; -} -.features-buttons button { - margin-bottom: 20px; -} -@media (min-width: 1300px) { - body.boxed { - background: url(https://www.toptal.com/designers/subtlepatterns/patterns/subtle_zebra_3d.png); - } - body.boxed #all { - position: relative; - background: #fff; - width: 1200px; - margin: 0 auto; - overflow: hidden; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - } -} -#top { - background: #555555; - color: #eeeeee; - padding: 10px 0; -} -#top p { - margin: 0; - font-size: 12px; -} -#top .social { - float: right; - text-align: right; -} -#top .social a { - color: #999999; - display: inline-block; - width: 24px; - height: 24px; - border-radius: 12px; - line-height: 20px; - font-size: 12px; - text-align: center; - vertical-align: bottom; -} -#top .social a:hover { - color: #fff; -} -#top .social a:hover.facebook { - background-color: #4460ae; -} -#top .social a:hover.gplus { - background-color: #c21f25; -} -#top .social a:hover.twitter { - background-color: #3cf; -} -#top .social a:hover.instagram { - background-color: #cd4378; -} -#top .social a:hover.email { - background-color: #4a7f45; -} -#top .login { - float: right; -} -#top .login a { - font-size: 12px; - color: #eeeeee; - margin-right: 15px; - text-decoration: none; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.10em; -} -@media (max-width: 767px) { - #top .login { - float: left; - } -} -#top.light { - background: #fff; - color: #999999; - border-bottom: solid 1px #eeeeee; -} -#top.light .login a { - color: #555555; -} -.navbar { - border: none; -} -.navbar ul.nav > li > a { - text-transform: uppercase; - text-decoration: underline; - font-weight: bold; - letter-spacing: 0.08em; - border-top: solid 5px transparent; -} -.navbar ul.nav > li > a:hover { - border-top: solid 5px #6aae7a; -} -.navbar ul.nav > li.active > a, -.navbar ul.nav > li.open > a { - text-decoration: none !important; - border-top: solid 5px #3f734b; -} -@media (max-width: 768px) { - .navbar ul.nav > li.active > a, - .navbar ul.nav > li.open > a { - border-top-color: transparent; - } - .navbar ul.nav > li > a:hover { - border-top-color: transparent; - } -} -.navbar.navbar-light ul.nav > li.active > a { - border-top: solid 5px #3f734b; - background: #fff !important; - color: #555555 !important; -} -.navbar.navbar-light ul.nav > li.active > a:hover { - border-top: solid 5px #3f734b; -} -.navbar.navbar-light ul.nav > li > a:hover, -.navbar.navbar-light ul.nav > li.open > a:hover, -.navbar.navbar-light ul.nav > li > a:focus, -.navbar.navbar-light ul.nav > li.open > a:focus { - border-top: solid 5px #6aae7a; - background: #fff !important; - color: #555555 !important; -} -.navbar ul.dropdown-menu { - margin: 0; - padding: 0; -} -.navbar ul.dropdown-menu li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 4px 0; -} -.navbar ul.dropdown-menu li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - left: 0; -} -.navbar ul.dropdown-menu li a:hover { - color: #6aae7a; - text-decoration: none; - background: none; - left: 2px; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .navbar ul.dropdown-menu li a:hover { - left: 0; - } -} -.navbar .yamm-content h3 { - font-size: 18px; - text-transform: uppercase; - padding-bottom: 10px; - margin-top: 5px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -@media (max-width: 767px) { - .navbar .yamm-content h3 { - font-size: 14px; - } -} -.navbar .yamm-content h5 { - text-transform: uppercase; - padding-bottom: 10px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -.navbar .yamm-content ul { - margin: 0; - padding: 0; -} -.navbar .yamm-content ul li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - padding: 4px 0; -} -.navbar .yamm-content ul li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.navbar .yamm-content ul li a:hover { - color: #6aae7a; - text-decoration: none; - padding-left: 2px; -} -.navbar .yamm-content .banner { - margin-bottom: 10px; -} -.navbar .yamm-fw .dropdown-menu { - padding: 0; -} -.navbar .navbar-buttons { - float: right; -} -.navbar .navbar-buttons button, -.navbar .navbar-buttons a.btn, -.navbar .navbar-buttons .btn-default.navbar-toggle { - margin-top: 11px; - margin-bottom: 11px; - margin-left: 0; - margin-right: 5px; -} -.navbar .btn-default, -.navbar .btn-default.navbar-toggle { - color: #999999; - background-color: #fff; - margin-left: 7px; - margin-right: 0; -} -.navbar .btn-default:hover, -.navbar .btn-default.navbar-toggle:hover, -.navbar .btn-default:focus, -.navbar .btn-default.navbar-toggle:focus { - background-color: #fff; - border-color: #6aae7a; - color: #6aae7a; -} -.navbar #search { - clear: both; - border-top: solid 1px #6aae7a; - text-align: right; -} -.navbar #search form { - float: right; -} -.navbar #search form .input-group { - width: 500px; -} -@media (max-width: 768px) { - .navbar #search form .input-group { - width: 100%; - } -} -.navbar #basket-overview a { - margin-left: 7px; -} -.navbar-affixed-top { - top: -32px; -} -.navbar-affixed-top.affix-top { - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -.navbar-affixed-top.affix { - position: fixed; - width: 100%; - top: 0; - z-index: 1000; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -body.boxed .navbar-affixed-top.affix { - position: static; -} -#login-modal { - overflow: hidden; -} -#login-modal .modal-header h4 { - text-transform: uppercase; -} -#login-modal form { - margin-bottom: 20px; -} -#login-modal a { - color: #6aae7a; -} -#login-modal p { - font-weight: 300; - margin-bottom: 20px; - font-size: 13px; -} -/* buttons */ -.btn { - font-weight: 700; - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 6px 12px; - font-size: 13px; - line-height: 1.42857143; - border-radius: 0; -} -.input-group .btn { - font-size: 14px; -} -.btn-lg { - padding: 10px 16px; - font-size: 14px; - line-height: 1.33; - border-radius: 0; -} -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-template-main { - color: #6aae7a; - background-color: #ffffff; - border-color: #6aae7a; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - color: #6aae7a; - background-color: #e6e6e6; - border-color: #4d8e5c; -} -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - background-image: none; -} -.btn-template-main.disabled, -.btn-template-main[disabled], -fieldset[disabled] .btn-template-main, -.btn-template-main.disabled:hover, -.btn-template-main[disabled]:hover, -fieldset[disabled] .btn-template-main:hover, -.btn-template-main.disabled:focus, -.btn-template-main[disabled]:focus, -fieldset[disabled] .btn-template-main:focus, -.btn-template-main.disabled:active, -.btn-template-main[disabled]:active, -fieldset[disabled] .btn-template-main:active, -.btn-template-main.disabled.active, -.btn-template-main[disabled].active, -fieldset[disabled] .btn-template-main.active { - background-color: #ffffff; - border-color: #6aae7a; -} -.btn-template-main .badge { - color: #ffffff; - background-color: #6aae7a; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active { - background: #6aae7a; - color: #ffffff; - border-color: #6aae7a; -} -.btn-template-transparent-primary { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - background-image: none; -} -.btn-template-transparent-primary.disabled, -.btn-template-transparent-primary[disabled], -fieldset[disabled] .btn-template-transparent-primary, -.btn-template-transparent-primary.disabled:hover, -.btn-template-transparent-primary[disabled]:hover, -fieldset[disabled] .btn-template-transparent-primary:hover, -.btn-template-transparent-primary.disabled:focus, -.btn-template-transparent-primary[disabled]:focus, -fieldset[disabled] .btn-template-transparent-primary:focus, -.btn-template-transparent-primary.disabled:active, -.btn-template-transparent-primary[disabled]:active, -fieldset[disabled] .btn-template-transparent-primary:active, -.btn-template-transparent-primary.disabled.active, -.btn-template-transparent-primary[disabled].active, -fieldset[disabled] .btn-template-transparent-primary.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active { - background: #fff; - color: #6aae7a; - border-color: #fff; -} -.btn-template-transparent-black { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - background-image: none; -} -.btn-template-transparent-black.disabled, -.btn-template-transparent-black[disabled], -fieldset[disabled] .btn-template-transparent-black, -.btn-template-transparent-black.disabled:hover, -.btn-template-transparent-black[disabled]:hover, -fieldset[disabled] .btn-template-transparent-black:hover, -.btn-template-transparent-black.disabled:focus, -.btn-template-transparent-black[disabled]:focus, -fieldset[disabled] .btn-template-transparent-black:focus, -.btn-template-transparent-black.disabled:active, -.btn-template-transparent-black[disabled]:active, -fieldset[disabled] .btn-template-transparent-black:active, -.btn-template-transparent-black.disabled.active, -.btn-template-transparent-black[disabled].active, -fieldset[disabled] .btn-template-transparent-black.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active { - background: #fff; - color: #000; - border-color: #fff; -} -.btn-template-primary { - color: #ffffff; - background-color: #6aae7a; - border-color: #6aae7a; -} -.btn-template-primary:hover, -.btn-template-primary:focus, -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - color: #ffffff; - background-color: #519461; - border-color: #4d8e5c; -} -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - background-image: none; -} -.btn-template-primary.disabled, -.btn-template-primary[disabled], -fieldset[disabled] .btn-template-primary, -.btn-template-primary.disabled:hover, -.btn-template-primary[disabled]:hover, -fieldset[disabled] .btn-template-primary:hover, -.btn-template-primary.disabled:focus, -.btn-template-primary[disabled]:focus, -fieldset[disabled] .btn-template-primary:focus, -.btn-template-primary.disabled:active, -.btn-template-primary[disabled]:active, -fieldset[disabled] .btn-template-primary:active, -.btn-template-primary.disabled.active, -.btn-template-primary[disabled].active, -fieldset[disabled] .btn-template-primary.active { - background-color: #6aae7a; - border-color: #6aae7a; -} -.btn-template-primary .badge { - color: #6aae7a; - background-color: #ffffff; -} -#intro { - background: url('../img/home.jpg') no-repeat center top; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} -#intro .item { - font-family: "Roboto", Helvetica, Arial, sans-serif; - height: 100%; -} -#intro .item h1 { - text-transform: uppercase; - font-size: 50px; - color: #fff; - margin-bottom: 40px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #intro .item h1 { - font-size: 40px; - } -} -@media (max-width: 767px) { - #intro .item h1 { - font-size: 25px; - } -} -#intro .item h3 { - color: #fff; - margin-bottom: 40px; -} -@media (max-width: 767px) { - #intro .item h3 { - font-size: 15px; - margin-bottom: 20px; - } -} -#intro .item .btn { - text-transform: none; -} -@media (max-width: 991px) { - #intro .item .btn { - font-size: 14px; - } -} -@media (max-width: 991px) { - #intro .item .carousel-caption { - left: 10%; - right: 10%; - } -} -#intro .container, -#intro .row { - height: 100%; - position: relative; -} -.jumbotron { - padding: 30px; - margin-bottom: 0; - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.jumbotron .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #6aae7a; - opacity: 0.9; - filter: alpha(opacity=90); -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3, -.jumbotron p, -.jumbotron ul { - color: #fff; -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3 { - color: #ffffff; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.jumbotron p { - margin-bottom: 20px; - font-size: 21px; - font-weight: 400; -} -.jumbotron p.text-uppercase { - font-weight: 700; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 0; -} -.jumbotron .container { - max-width: 100%; - z-index: 2; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 46px; - } -} -#categoryMenu h3 { - padding: 20px; - background: #f7f7f7; - margin: 0; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.panel.sidebar-menu h3 { - padding: 5px 0; - margin: 0; -} -.panel.sidebar-menu { - background: #fff; - margin: 0 0 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.panel.sidebar-menu .panel-heading { - text-transform: uppercase; - margin-bottom: 10px; - background: none; - padding: 0; - letter-spacing: 0.08em; - border-bottom: none; -} -.panel.sidebar-menu .panel-heading h1, -.panel.sidebar-menu .panel-heading h2, -.panel.sidebar-menu .panel-heading h3, -.panel.sidebar-menu .panel-heading h4, -.panel.sidebar-menu .panel-heading h5 { - display: inline-block; - border-bottom: solid 5px #6aae7a; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; -} -.panel.sidebar-menu .panel-heading .btn.btn-danger { - color: #fff; - margin-top: 5px; -} -.panel.sidebar-menu .panel-body { - padding: 0; -} -.panel.sidebar-menu .panel-body span.colour { - display: inline-block; - width: 15px; - height: 15px; - border: solid 1px #555555; - vertical-align: top; - margin-top: 2px; - margin-left: 5px; -} -.panel.sidebar-menu .panel-body span.colour.white { - background: #fff; -} -.panel.sidebar-menu .panel-body span.colour.red { - background: red; -} -.panel.sidebar-menu .panel-body span.colour.green { - background: green; -} -.panel.sidebar-menu .panel-body span.colour.blue { - background: blue; -} -.panel.sidebar-menu .panel-body span.colour.yellow { - background: yellow; -} -.panel.sidebar-menu .panel-body label { - color: #999999; - font-size: 12px; -} -.panel.sidebar-menu .panel-body label:hover { - color: #555555; -} -.panel.sidebar-menu ul.nav.category-menu { - margin-bottom: 20px; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.08em; -} -.panel.sidebar-menu ul.nav.category-menu li a { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.panel.sidebar-menu ul.nav ul { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.nav ul li { - display: block; -} -.panel.sidebar-menu ul.nav ul li a { - position: relative; - font-family: "Times New Roman", Times, serif; - font-weight: normal; - text-transform: none !important; - display: block; - padding: 10px 15px; - padding-left: 30px; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.nav ul li a:hover, -.panel.sidebar-menu ul.nav ul li a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.panel.sidebar-menu ul.tag-cloud { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.tag-cloud li { - display: inline-block; -} -.panel.sidebar-menu ul.tag-cloud li a { - display: inline-block; - padding: 5px; - border: solid 1px #eeeeee; - border-radius: 0; - color: #6aae7a; - margin: 5px 5px 5px 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 700; - font-size: 12px; -} -.panel.sidebar-menu ul.tag-cloud li a:hover { - color: #6aae7a; - text-decoration: none; - border-color: #6aae7a; -} -.panel.sidebar-menu ul.popular, -.panel.sidebar-menu ul.recent { - list-style: none; - padding-left: 0; - padding: 20px 0; -} -.panel.sidebar-menu ul.popular li, -.panel.sidebar-menu ul.recent li { - margin-bottom: 10px; - padding: 5px 0; - border-bottom: dotted 1px #eeeeee; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li img, -.panel.sidebar-menu ul.recent li img { - width: 50px; - margin-right: 10px; -} -.panel.sidebar-menu ul.popular li h5, -.panel.sidebar-menu ul.recent li h5 { - margin: 0 0 10px; -} -.panel.sidebar-menu ul.popular li h5 a, -.panel.sidebar-menu ul.recent li h5 a { - font-weight: normal; -} -.panel.sidebar-menu ul.popular li p.date, -.panel.sidebar-menu ul.recent li p.date { - float: right; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.popular li:last-child, -.panel.sidebar-menu ul.recent li:last-child { - border-bottom: none; -} -.panel.sidebar-menu .text-widget { - font-size: 12px; -} -.panel.sidebar-menu.with-icons ul.nav li a:after { - font-family: 'FontAwesome'; - content: "\f105"; - position: relative; - top: 0; - float: right; -} -/* ribbons for product sales etc. */ -.ribbon { - position: absolute; - top: 50px; - padding-left: 51px; - font-weight: 700; - letter-spacing: 0.08em; -} -.ribbon .ribbon-background { - position: absolute; - top: 0; - right: 0; -} -.ribbon .theribbon { - position: relative; - width: 80px; - padding: 6px 20px 6px 20px; - margin: 30px 10px 10px -71px; - color: #fff; - background-color: #6aae7a; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.ribbon .theribbon:before, -.ribbon .theribbon:after { - content: ' '; - position: absolute; - width: 0; - height: 0; -} -.ribbon .theribbon:after { - left: 0px; - top: 100%; - border-width: 5px 10px; - border-style: solid; - border-color: #000000 #000000 transparent transparent; -} -.ribbon.sale { - top: 0; -} -.ribbon.new { - top: 50px; -} -.ribbon.new .theribbon { - background-color: #5bc0de; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.new .theribbon:after { - border-color: #2390b0 #2390b0 transparent transparent; -} -.ribbon.gift { - top: 100px; -} -.ribbon.gift .theribbon { - background-color: #5cb85c; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.gift .theribbon:after { - border-color: #357935 #357935 transparent transparent; -} -.owl-carousel .owl-controls .owl-page.active span, -.owl-theme .owl-controls .owl-page.active span, -.owl-carousel .owl-controls.clickable .owl-page:hover span, -.owl-theme .owl-controls.clickable .owl-page:hover span { - background: #6aae7a; -} -.owl-carousel .owl-controls .owl-buttons, -.owl-theme .owl-controls .owl-buttons { - position: absolute; - top: 5px; - right: 0; -} -.owl-carousel .owl-controls .owl-buttons div, -.owl-theme .owl-controls .owl-buttons div { - width: 26px; - height: 26px; - line-height: 25px; - margin: 0 5px 0 0; - font-size: 18px; - color: #6aae7a; - padding: 0; - background: #fff; - border-radius: 13px; - vertical-align: middle; - text-align: center; - opacity: 1; - filter: alpha(opacity=100); -} -.home-carousel { - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.home-carousel .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #6aae7a; - opacity: 0.9; - filter: alpha(opacity=90); -} -.home-carousel .owl-carousel { - padding-top: 60px; - padding-bottom: 20px; -} -.home-carousel .owl-theme .owl-controls .owl-page span { - background: #666; -} -.home-carousel .owl-theme .owl-controls .owl-page.active span { - background: #fff; -} -.home-carousel .owl-theme .owl-controls .owl-page:hover span { - background: #fff; -} -@media (max-width: 767px) { - .home-carousel { - text-align: center !important; - } -} -@media (min-width: 992px) { - .home-carousel .right { - text-align: right; - } -} -.home-carousel h1, -.home-carousel h2, -.home-carousel h3, -.home-carousel p, -.home-carousel ul { - color: #fff; -} -.home-carousel h1 { - font-weight: 700; - text-transform: uppercase; - font-size: 46px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .home-carousel h1 { - font-size: 36px; - } -} -.home-carousel h2 { - font-weight: 700; - text-transform: uppercase; - font-size: 40px; - letter-spacing: 0.08em; -} -.home-carousel ul, -.home-carousel p { - font-size: 18px; - font-weight: 700; - padding: 0; - text-transform: uppercase; - letter-spacing: 0.10em; -} -@media (max-width: 991px) { - .home-carousel ul, - .home-carousel p { - font-size: 14px; - } -} -.home-carousel ul li { - margin-bottom: 10px; -} -.customers { - padding: 0; - margin-bottom: 40px; -} -.customers .item { - list-style-type: none; - text-align: center; - margin: 0 20px; -} -.customers .item img { - display: inline-block; - filter: url("data:image/svg+xml;utf8,#grayscale"); - /* Firefox 10+, Firefox on Android */ - filter: gray; - /* IE6-9 */ - -webkit-filter: grayscale(100%); - /* Chrome 19+, Safari 6+, Safari 6+ iOS */ - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.customers .item img:hover { - max-width: auto; - filter: none; - -webkit-filter: none; -} -.testimonials { - padding: 0; - margin-bottom: 40px; -} -.testimonials .item { - list-style-type: none; - margin: 0 5px; - background: #fff; - padding-bottom: 60px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.testimonials .item .testimonial { - position: relative; - padding: 20px; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial .text { - color: #999999; - margin-bottom: 40px; -} -.testimonials .item .testimonial .bottom { - position: absolute; - left: 0; - bottom: 0; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px; - height: 50px; -} -.testimonials .item .testimonial .bottom .icon { - color: #6aae7a; - font-size: 30px; - float: left; - width: 20%; -} -.testimonials .item .testimonial .name-picture { - float: right; - width: 80%; - text-align: right; -} -.testimonials .item .testimonial .name-picture h5 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.testimonials .item .testimonial .name-picture p { - color: #999999; - margin: 0; - font-size: 12px; -} -.testimonials .item .testimonial .name-picture img { - float: right; - width: 60px; - border-radius: 30px; - margin-left: 10px; -} -.team-member { - text-align: center; - margin-bottom: 40px; -} -.team-member h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 5px; - letter-spacing: 0.08em; -} -.team-member h3 a { - color: #555555; -} -.team-member p.role { - color: #999999; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.team-member .social { - margin-bottom: 20px; -} -.team-member .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email { - background-color: #4a7f45; -} -.team-member .text p { - color: #999999; - font-size: 12px; -} -.team-member .social, -.team-member-detail .social { - margin-bottom: 20px; -} -.team-member .social a, -.team-member-detail .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i, -.team-member-detail .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook, -.team-member-detail .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus, -.team-member-detail .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter, -.team-member-detail .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram, -.team-member-detail .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email, -.team-member-detail .social a.email { - background-color: #4a7f45; -} -.box-simple { - text-align: center; - margin-bottom: 40px; -} -.box-simple .icon { - color: #6aae7a; - border-color: #6aae7a; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.box-simple h3 { - font-weight: normal; - font-size: 18px; - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-simple h3 a { - color: #555555; -} -.box-simple p { - color: #999999; -} -.box-simple:hover .icon { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.box-simple:hover .icon i { - -webkit-transform: scale(1, 1); - -ms-transform: scale(1, 1); - -o-transform: scale(1, 1); - transform: scale(1, 1); -} -.box-simple.box-white { - padding: 20px; - border: dotted 1px #999999; -} -.box-simple.box-white .icon { - color: #555555; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark { - padding: 20px; - border: dotted 1px #999999; - background: #555555; - color: #fff; -} -.box-simple.box-dark .icon { - color: #f7f7f7; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark h3 { - color: #fff; -} -.box-simple.box-dark h3 a { - color: #fff; -} -.box-simple.box-dark p { - color: #fff; -} -.box-image { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #6aae7a; -} -.box-image .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -.box-image-text { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image-text .top { - position: relative; - margin-bottom: 10px; -} -.box-image-text .top .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #6aae7a; -} -.box-image-text .top .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .top .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image-text .top .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image-text .top .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .content h3, -.box-image-text .content h4 { - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-image-text .content p { - color: #999999; -} -.box-image-text:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image-text:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image-text:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -/* universal box */ -.box { - background: #fff; - margin: 0 0 30px; - border: solid 1px #ccc; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px 0; - border-left: none; - border-right: none; -} -.box .box-header { - background: #f7f7f7; - margin: -20px 0 20px; - padding: 20px; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-footer { - background: #f7f7f7; - margin: 30px 0 -20px; - padding: 20px; - border-top: solid 1px #eeeeee; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -@media (max-width: 991px) { - .box .box-footer .btn { - margin-bottom: 20px; - } -} -.box.no-border { - border: none; -} -#heading-breadcrumbs { - background: url('../img/texture-bw.png') center center repeat; - padding: 20px 0; - margin-bottom: 40px; -} -#heading-breadcrumbs.no-mb { - margin-bottom: 0; -} -#heading-breadcrumbs h1 { - color: #333333; - text-transform: uppercase; - font-size: 30px; - font-weight: 700; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #heading-breadcrumbs h1 { - text-align: center; - } -} -#heading-breadcrumbs ul.breadcrumb { - margin-top: 5px; - margin-bottom: 0; -} -.bar { - position: relative; - background: #6aae7a; - padding: 60px 0; -} -.bar.background-pentagon { - background: url('../img/texture-bw.png') center center repeat; - border-top: solid 1px #999999; - border-bottom: solid 1px #999999; -} -.bar.background-gray { - background: #eeeeee; -} -.bar.background-gray-dark { - background: #555555; -} -.bar.background-white { - background: #fff; -} -.bar.background-image-fixed-1 { - background: url('../img/fixed-background-1.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.background-image-fixed-2 { - background: url('../img/fixed-background-2.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.color-white h1, -.bar.color-white h2, -.bar.color-white h3, -.bar.color-white h4, -.bar.color-white h5, -.bar.color-white h6, -.bar.color-white p { - color: #fff; -} -.bar.padding-big { - padding: 50px 0; -} -.bar.padding-horizontal { - padding-left: 30px; - padding-right: 30px; -} -.bar.margin-vertical { - margin-top: 20px; - margin-bottom: 20px; -} -.bar .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #000; - opacity: 0.3; - filter: alpha(opacity=30); -} -.portfolio.no-space { - padding: 0 15px; -} -.portfolio.no-space .box-image { - margin: 0 -15px; -} -.portfolio-project .project-more h4 { - color: #555555; - text-transform: uppercase; - margin-bottom: 0; - text-align: left; - font-size: 14px; - letter-spacing: 0.08em; -} -.portfolio-project .project-more p { - color: #999999; - padding: 10px 0; - margin-bottom: 20px; - text-align: left; -} -.portfolio-showcase { - margin: 15px 0 60px; -} -.portfolio-showcase h3 a { - text-transform: uppercase; - line-height: 1.5; - letter-spacing: 0.08em; -} -.portfolio-showcase p.lead { - color: #555555; - margin-bottom: 20px; -} -.portfolio-showcase p { - color: #999999; -} -.portfolio-showcase p.buttons { - margin-top: 40px; -} -.see-more { - text-align: center; - margin-top: 20px; - padding-top: 20px; -} -.see-more p { - font-size: 28px; - font-weight: 100; - margin-bottom: 20px; -} -.showcase .item { - text-align: center; -} -.showcase .item .icon { - display: inline-block; - width: 50px; - height: 50px; - color: #555555; - line-height: 50px; - border-radius: 25px; - border: solid 1px #555555; -} -.showcase .item h4 { - color: #555555; - text-transform: uppercase; - letter-spacing: 0.08em; - line-height: 1.5; - font-size: 16px; -} -.showcase .item h4 span { - font-weight: bold; - font-size: 51px; -} -.packages .package { - background: #fff; - margin-top: 25px; - margin-bottom: 20px; - padding-bottom: 15px; - text-align: center; - border: solid 1px #6aae7a; - overflow: hidden; -} -.packages .package .package-header { - height: 57px; - color: #fff; - line-height: 57px; - background: #6aae7a; -} -.packages .package .package-header h5 { - color: #fff; - text-transform: uppercase; - font-weight: bold; - line-height: 57px; - margin: 0; - letter-spacing: 0.08em; -} -.packages .package .package-header.light-gray { - background: #eeeeee; -} -.packages .package .package-header.light-gray h5 { - color: #555555; -} -.packages .package .price { - line-height: 120px; - height: 100px; - color: #fff; - font-weight: 400; -} -.packages .package .price h4 { - display: inline; - font-size: 50px; - line-height: normal; - margin-bottom: 0; -} -.packages .package .price .period { - line-height: normal; - color: #999999; -} -.packages .package ul { - padding: 0; -} -.packages .package ul li { - list-style-type: none; - padding-top: 10px; - padding-bottom: 10px; - width: 80%; - margin: auto; - border-bottom: 1px dotted #ccc; -} -.packages .package ul li:last-child { - border-bottom: 0; -} -.packages .package ul li i { - font-size: 13px; - margin-right: 5px; -} -.packages .best-value .package { - margin-top: 0; - padding-bottom: 40px; -} -.packages .best-value .package .package-header { - height: 72px; - padding-top: 17px; - height: 82px !important; -} -.packages .best-value .package .package-header h5 { - font-weight: bold; - line-height: 29px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.packages .best-value .package .package-header .meta-text { - font-size: 13px; - line-height: 15px; -} -#map { - height: 300px; -} -#map.with-border { - border-top: solid 1px #6aae7a; - border-bottom: solid 1px #6aae7a; -} -#blog-listing-big .post, -#blog-homepage .post { - margin-bottom: 60px; -} -#blog-listing-big .post h2, -#blog-homepage .post h2, -#blog-listing-big .post h4, -#blog-homepage .post h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#blog-listing-big .post h2 a, -#blog-homepage .post h2 a, -#blog-listing-big .post h4 a, -#blog-homepage .post h4 a { - color: #555555; -} -#blog-listing-big .post h2 a:hover, -#blog-homepage .post h2 a:hover, -#blog-listing-big .post h4 a:hover, -#blog-homepage .post h4 a:hover { - color: #6aae7a; -} -#blog-listing-big .post .author-category, -#blog-homepage .post .author-category { - color: #999999; - text-transform: uppercase; - font-weight: 300; - letter-spacing: 0.08em; -} -#blog-listing-big .post .author-category a, -#blog-homepage .post .author-category a { - font-weight: 500; -} -#blog-listing-big .post .date-comments a, -#blog-homepage .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-big .post .date-comments a:hover, -#blog-homepage .post .date-comments a:hover { - color: #6aae7a; -} -@media (min-width: 768px) { - #blog-listing-big .post .date-comments, - #blog-homepage .post .date-comments { - text-align: right; - } -} -#blog-listing-big .post .intro, -#blog-homepage .post .intro { - text-align: left; -} -#blog-listing-big .post .image, -#blog-homepage .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-big .post .image img, -#blog-homepage .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-big .post .image img.img-responsive, - #blog-homepage .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-big .post .video, -#blog-homepage .post .video { - margin-bottom: 10px; -} -#blog-listing-big .post .read-more, -#blog-homepage .post .read-more { - text-align: right; -} -#blog-listing-medium .post { - margin-bottom: 60px; -} -#blog-listing-medium .post h2 { - text-transform: uppercase; - margin: 0 0 10px; - font-size: 24px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post h2 a { - color: #555555; -} -#blog-listing-medium .post h2 a:hover { - color: #6aae7a; -} -#blog-listing-medium .post .author-category { - float: left; - color: #999999; - text-transform: uppercase; - font-weight: 300; - font-size: 12px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post .author-category a { - font-weight: 500; -} -#blog-listing-medium .post .date-comments { - float: right; - font-size: 12px; -} -#blog-listing-medium .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-medium .post .date-comments a:hover { - color: #6aae7a; -} -@media (min-width: 768px) { - #blog-listing-medium .post .date-comments { - text-align: right; - } -} -#blog-listing-medium .post .intro { - text-align: left; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-medium .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-medium .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-medium .post .video { - margin-bottom: 10px; -} -#blog-listing-medium .post .read-more { - text-align: right; -} -.box-image-text.blog .author-category { - color: #999999; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 300; - font-size: 12px; -} -.box-image-text.blog .author-category a { - font-weight: 500; -} -.box-image-text.blog .intro { - text-align: left; - margin-bottom: 20px; -} -#blog-homepage .post { - margin-bottom: 30px; -} -#blog-homepage .post h2, -#blog-homepage .post h4, -#blog-homepage .post .author-category, -#blog-homepage .post .read-more { - text-align: center; -} -#blog-homepage .post .read-more { - margin-top: 20px; -} -#blog-post #post-content { - margin-bottom: 20px; -} -#blog-post .comment { - margin-bottom: 25px; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment .posted { - color: #999999; - font-size: 12px; -} -#blog-post .comment .reply { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#blog-post .comment.last { - margin-bottom: 0; -} -#blog-post #comments, -#blog-post #comment-form { - padding: 20px 0; - margin-top: 20px; - border-top: solid 1px #eeeeee; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments h4, -#blog-post #comment-form h4 { - margin-bottom: 20px; -} -#blog-post #comment-form { - margin-bottom: 20px; -} -.product { - background: #fff; - border-bottom: solid 1px #e6e6e6; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 60px; - overflow: hidden; - text-align: center; -} -.product .image { - overflow: hidden; -} -.product .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .product .image img.img-responsive { - min-width: 100%; - } -} -.product .text { - padding: 10px; -} -.product .text h3 { - font-size: 14px; - font-weight: 700; - height: 39.6px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.product .text h3 a { - color: #555555; -} -.product .text h3 a:hover { - text-decoration: none; -} -.product .text p.price { - font-size: 18px; -} -.product .text p.price del { - color: #999999; -} -.product .buttons { - clear: both; - position: absolute; - display: none; - bottom: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - border: solid 1px transparent; - padding: 20px; - background: rgba(255, 255, 255, 0.9); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - text-align: center; -} -.product .buttons .btn { - margin-bottom: 20px; -} -.product:hover { - border-bottom: solid 1px #808080; - top: 0; -} -.product:hover .buttons { - clear: both; - position: absolute; - top: 0; - background: rgba(255, 255, 255, 0.5); -} -.product:hover .image img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.goToDescription { - font-size: 12px; - text-align: center; - margin-bottom: 40px; -} -.goToDescription a { - color: #999999; - text-decoration: underline; -} -#productMain { - margin-bottom: 30px; -} -#productMain .sizes { - text-align: center; -} -#productMain .sizes h3 { - font-weight: 700; - letter-spacing: 0.08em; - text-transform: uppercase; - margin-bottom: 40px; -} -#productMain .sizes a { - display: inline-block; - width: 40px; - height: 40px; - border-radius: 40px; - background: #ccc; - line-height: 40px; - color: #555555; - text-align: center; - text-decoration: none; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#productMain .sizes a.active, -#productMain .sizes a:hover { - background: #6aae7a; - color: #fff; -} -#productMain .sizes input { - display: none; -} -#productMain .price { - font-size: 40px; - text-align: center; - margin-top: 40px; - margin-bottom: 40px; -} -#thumbs a { - display: block; - border: solid 1px transparent; -} -#thumbs a.active { - border-color: #6aae7a; -} -#product-social { - text-align: center; -} -#product-social h4 { - font-weight: 300; - margin-bottom: 10px; -} -#product-social p { - line-height: 26px; -} -#product-social p a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -#product-social p a i { - vertical-align: bottom; - line-height: 26px; -} -#product-social p a.facebook { - background-color: #4460ae; -} -#product-social p a.gplus { - background-color: #c21f25; -} -#product-social p a.twitter { - background-color: #3cf; -} -#product-social p a.instagram { - background-color: #cd4378; -} -#product-social p a.email { - background-color: #4a7f45; -} -@media (max-width: 991px) { - #product-social { - text-align: center; - } -} -#checkout .nav { - margin-bottom: 20px; - border-bottom: solid 1px #6aae7a; -} -#checkout .nav li { - height: 100%; -} -#checkout .nav li a { - display: block; - height: 100%; -} -#order-summary table { - margin-top: 20px; -} -#order-summary table td { - color: #999999; -} -#order-summary table tr.total td, -#order-summary table tr.total th { - font-size: 18px; - color: #555555; - font-weight: 700; -} -#checkout .table tbody tr td, -#basket .table tbody tr td, -#customer-order .table tbody tr td { - vertical-align: middle; -} -#checkout .table tbody tr td input, -#basket .table tbody tr td input, -#customer-order .table tbody tr td input { - width: 50px; - text-align: right; -} -#checkout .table tbody tr td img, -#basket .table tbody tr td img, -#customer-order .table tbody tr td img { - width: 50px; -} -#checkout .table tfoot, -#basket .table tfoot, -#customer-order .table tfoot { - font-size: 18px; -} -.shipping-method h4, -.payment-method h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#customer-orders table tr th, -#customer-orders table tr td { - vertical-align: baseline; -} -#customer-order .table tfoot th { - font-size: 18px; - font-weight: 300; -} -#customer-order .addresses { - text-align: right; - margin-bottom: 30px; -} -#customer-order .addresses p { - font-size: 18px; - font-weight: 300; -} -#customer-account { - margin-bottom: 30px; -} -#get-it { - background: #6aae7a; - padding: 50px 0 30px; - color: #fff; - text-align: center; -} -#get-it h1, -#get-it h2, -#get-it h3, -#get-it h4, -#get-it h5, -#get-it h6 { - color: #fff; - text-transform: uppercase; - letter-spacing: 0.08em; - margin: 0 0 20px; -} -#get-it p { - margin: 0 0 20px; -} -#footer { - background: #555555; - padding: 50px 0; - color: #999999; -} -#footer h1, -#footer h2, -#footer h3, -#footer h4, -#footer h5, -#footer h6 { - color: #eeeeee; -} -#footer h4 { - font-size: 14px; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.08em; -} -#footer ul { - padding-left: 0; - list-style: none; -} -#footer ul a { - color: #999999; -} -#footer ul a:hover { - color: #6aae7a; - text-decoration: none; -} -#footer .photostream div { - float: left; - display: block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 33%; - padding: 7.5px; - overflow: hidden; -} -#footer .photostream div a { - border: solid 1 px #eeeeee; -} -#footer .photostream div img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -#footer .photostream div:hover img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -#footer .blog-entries .item { - clear: both; - padding: 5px 0; - margin-bottom: 10px; - border-bottom: solid 1px #555555; -} -#footer .blog-entries .item .image { - float: left; - width: 15%; - margin-right: 10px; -} -#footer .blog-entries .item .name { - width: 75%; - margin-left: 10px; - display: table-cell; - vertical-align: middle; -} -#footer .blog-entries .item .name h5 { - margin: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-size: 12px; -} -#footer .blog-entries .item .name h5 a { - color: #eeeeee; -} -#footer .blog-entries .item .text { - width: 100%; - clear: both; -} -#footer .blog-entries .item:last-child { - border-bottom: none; - margin-bottom: 0; -} -#footer .social a { - color: #555555; - font-size: 25px; - margin: 0 10px 0 0; -} -#footer .social a:hover { - color: #6aae7a; -} -#copyright { - background: #333; - color: #ccc; - padding: 50px 0; - font-size: 12px; - line-height: 28px; -} -#copyright p { - margin: 0; -} -@media (max-width: 991px) { - #copyright p { - float: none !important; - text-align: center; - margin-bottom: 10px; - } -} -[data-animate] { - opacity: 0; - filter: alpha(opacity=0); -} -#style-switch-button { - position: fixed; - top: 100px; - left: 0px; - border-radius: 0; -} -#style-switch { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 300px; - padding: 20px; - position: fixed; - top: 140px; - left: 0; - background: #fff; - border: solid 1px #eeeeee; -} -@media (max-width: 991px) { - #style-switch-button { - display: none; - } - #style-switch { - display: none; - } -} -/* Original Boostrap template overwrite */ -/* breadcrumbs */ -.breadcrumb { - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - background-color: none; - letter-spacing: 0.08em; -} -/* nav */ -.nav > li > a { - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #999999; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #6aae7a; -} -.nav-tabs { - border-bottom: 1px solid #6aae7a; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 0 0 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #6aae7a; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - background-color: #ffffff; - border: 1px solid #6aae7a; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: solid 1px #6aae7a; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #6aae7a; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #6aae7a; - border-radius: 0 0 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 0; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #6aae7a; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; - border-bottom: solid 1px #6aae7a; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #6aae7a; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #6aae7a; - border-radius: 0 0 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.tab-content { - padding: 15px; - border: solid 1px #ddd; - border-top: none; -} -/* navbar */ -.navbar { - position: relative; - min-height: 62px; - margin-bottom: 0; - border-bottom: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 0px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-affixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-affixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - padding: 10px 15px; - font-size: 18px; - line-height: 20px; - height: 62px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 14px; - margin-bottom: 14px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 0; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-nav { - margin: 10.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 21px; - padding-bottom: 21px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 14px; - margin-bottom: 14px; -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-btn.btn-sm { - margin-top: 16px; - margin-bottom: 16px; -} -.navbar-btn.btn-xs { - margin-top: 20px; - margin-bottom: 20px; -} -.navbar-text { - margin-top: 21px; - margin-bottom: 21px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #ffffff; - border-color: #cccccc; - border-bottom: none; -} -.navbar-default .navbar-brand { - color: #555555; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #3b3b3b; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777777; -} -.navbar-default .navbar-nav > li > a { - color: #555555; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #555555; - background-color: #acd2b5; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #6aae7a; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #dddddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #6aae7a; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #cccccc; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - background-color: #6aae7a; - color: #ffffff; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #555555; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #6aae7a; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #6aae7a; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #555555; -} -.navbar-default .navbar-link:hover { - color: #555555; -} -.navbar-default .btn-link { - color: #555555; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #555555; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; -} -/* scaffolding */ -body { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #555555; -} -a { - color: #6aae7a; - text-decoration: none; -} -a:hover, -a:focus { - color: #488456; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.img-rounded { - border-radius: 0; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} -/* breadcrumbs */ -.breadcrumb { - padding: 20px 0; - margin-bottom: 20px; - background-color: transparent; - border-radius: 0; - text-align: right; -} -.breadcrumb > li + li:before { - content: ">\00a0"; - color: #555555; -} -.breadcrumb > .active { - color: #999999; -} -@media (max-width: 991px) { - .breadcrumb { - padding: 20px 0; - text-align: center; - } -} -/* dropdowns */ -.dropdown-menu { - z-index: 1000; - font-size: 14px; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - padding: 5px 20px; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; -} -/* labels */ -.label { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: normal; - text-transform: uppercase; - letter-spacing: 0.08em; -} -/* forms.less */ -label { - font-weight: normal; -} -.form-control { - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 0; -} -.form-control:focus { - border-color: #6aae7a; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(106, 174, 122, 0.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(106, 174, 122, 0.6); -} -.form-group { - margin-bottom: 20px; -} -/* pager*/ -.pager { - margin: 20px 0; - border-top: solid 1px #eeeeee; - padding-top: 20px; - text-transform: uppercase; - letter-spacing: 0.08em; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - background-color: #ffffff; - border: 1px solid #6aae7a; - border-radius: 0; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - color: #fff; - background-color: #6aae7a; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - background-color: #ffffff; - border-color: #ddd; -} -/* pagination */ -.pagination { - margin: 20px 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - border-radius: 0; -} -.pagination > li > a, -.pagination > li > span { - padding: 6px 12px; - line-height: 1.42857143; - text-decoration: none; - color: #6aae7a; - background-color: #ffffff; - border: 1px solid #dddddd; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #6aae7a; - background-color: #cde4d2; - border-color: #dddddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - background-color: #6aae7a; - border-color: #6aae7a; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - background-color: #ffffff; - border-color: #dddddd; -} -/* responsive utilities */ -@media (max-width: 767px) { - .text-center-xs { - text-align: center !important; - } - .text-center-xs img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .text-center-sm { - text-align: center !important; - } - .text-center-sm img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -/* type */ -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 900; - line-height: 1.1; - color: #333333; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 20px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 18px; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -.text-small { - font-size: 12px; -} -.text-large { - font-size: 18px; -} -.text-italic { - font-style: italic; -} -.text-primary { - color: #6aae7a; -} -a.text-primary:hover { - color: #519461; -} -.bg-primary { - color: #fff; - background-color: #6aae7a; -} -a.bg-primary:hover { - background-color: #519461; -} -abbr[title], -abbr[data-original-title] { - border-bottom: 1px dotted #999999; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 14px; - border-left: 5px solid #6aae7a; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #999999; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - border-right: 5px solid #6aae7a; -} -address { - margin-bottom: 20px; - line-height: 1.42857143; -} -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 0; - -webkit-box-shadow: 0 0 0; - box-shadow: 0 0 0; -} -.panel-heading { - border-top-right-radius: 0; - border-top-left-radius: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 15px 15px; -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 0; - overflow: hidden; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group.accordion .panel { - border-color: #ccc; -} -.panel-primary { - border-color: #6aae7a; -} -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #6aae7a; - border-color: #6aae7a; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #6aae7a; -} -.panel-primary > .panel-heading .badge { - color: #6aae7a; - background-color: #ffffff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #6aae7a; -} -.panel-primary .panel-title { - font-weight: 300; -} -.panel-primary .panel-title a:hover { - color: #fff; - text-decoration: none; -} -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #6aae7a; - background-color: #ffffff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.progress-bar-primary { - background-color: #6aae7a; -} -.progress-striped .progress-bar-primary { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -/*! - * Yamm!3 - Yet another megamenu for Bootstrap 3 - * http://geedmo.github.com/yamm3 - * - * @geedmo - Licensed under the MIT license - */ -.yamm .nav, -.yamm .collapse, -.yamm .dropup.use-yamm, -.yamm .dropdown.use-yamm { - position: static; -} -.yamm .container { - position: relative; -} -.yamm .dropdown-menu { - left: auto; -} -.yamm .nav.navbar-right .dropdown-menu { - left: auto; - right: 0; -} -.yamm .yamm-content { - padding: 20px 30px; -} -.yamm .dropdown.yamm-fw .dropdown-menu { - left: 15px; - right: 15px; -} diff --git a/css/style.marsala.css b/css/style.marsala.css deleted file mode 100644 index 40972c3..0000000 --- a/css/style.marsala.css +++ /dev/null @@ -1,3557 +0,0 @@ -.clearfix:before, -.clearfix:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after { - content: " "; - display: table; -} -.clearfix:after, -.navbar:after, -.navbar-header:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -/* general styles */ -a, -button { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -a i.fa, -button i.fa { - margin: 0 5px; -} -.clickable { - cursor: pointer !important; -} -.required { - color: #955251; -} -.accent { - color: #955251; -} -.text-uppercase { - text-transform: uppercase; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .text-center-sm { - text-align: center; - } -} -p.lead { - margin-bottom: 40px; -} -section, -div.section { - margin-bottom: 40px; -} -.no-mb { - margin-bottom: 0 !important; -} -.mb-small { - margin-bottom: 20px !important; -} -.heading { - margin-bottom: 40px; -} -.heading h1, -.heading h2, -.heading h3, -.heading h4, -.heading h5 { - display: inline-block; - border-bottom: solid 5px #955251; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; - vertical-align: middle; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.heading h1 i.fa, -.heading h2 i.fa, -.heading h3 i.fa, -.heading h4 i.fa, -.heading h5 i.fa { - display: inline-block; - background: #955251; - width: 30px; - height: 30px; - vertical-align: middle; - text-align: center; - color: #fff; - font-size: 12px; - line-height: 30px; - border-radius: 15px; -} -.icon { - display: inline-block; - width: 80px; - height: 80px; - color: #fff; - line-height: 80px; - border-radius: 40px; - border: solid 1px #fff; - font-size: 20px; -} -.icon.icon-lg { - font-size: 30px; - border-width: 2px; -} -.ul-icons { - padding-left: 10px; -} -.ul-icons li { - list-style-type: none; - line-height: 20px; - margin-bottom: 20px; -} -.ul-icons li i { - width: 20px; - height: 20px; - background: #955251; - color: #fff; - text-align: center; - border-radius: 10px; - line-height: 20px; - margin-right: 10px; -} -ul.list-style-none { - list-style: none; -} -#text-page h1, -#text-page h2, -#text-page h3 { - font-weight: 700; -} -#error-page { - text-align: center; - margin-top: 40px; - margin-bottom: 100px; -} -#error-page h4 { - margin-bottom: 40px; -} -#error-page p.buttons { - margin-top: 40px; -} -.pages-listing .item { - text-align: center; -} -.pages-listing .item h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 20px; - letter-spacing: 0.08em; -} -.pages-listing .item h3 a { - color: #555555; -} -.pages-listing .item .text { - margin-bottom: 20px; -} -.pages-listing .item .text p { - color: #999999; - font-size: 12px; - margin-bottom: 20px; -} -.banner { - margin-bottom: 30px; - text-align: center; -} -.banner img { - margin: 0 auto; -} -.banner a:hover img { - opacity: 0.8; - filter: alpha(opacity=80); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.pages { - text-align: center; -} -.pages .loadMore { - text-align: center; -} -.pages .pagination { - text-align: center; -} -.features-buttons button { - margin-bottom: 20px; -} -@media (min-width: 1300px) { - body.boxed { - background: url(https://www.toptal.com/designers/subtlepatterns/patterns/subtle_zebra_3d.png); - } - body.boxed #all { - position: relative; - background: #fff; - width: 1200px; - margin: 0 auto; - overflow: hidden; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - } -} -#top { - background: #555555; - color: #eeeeee; - padding: 10px 0; -} -#top p { - margin: 0; - font-size: 12px; -} -#top .social { - float: right; - text-align: right; -} -#top .social a { - color: #999999; - display: inline-block; - width: 24px; - height: 24px; - border-radius: 12px; - line-height: 20px; - font-size: 12px; - text-align: center; - vertical-align: bottom; -} -#top .social a:hover { - color: #fff; -} -#top .social a:hover.facebook { - background-color: #4460ae; -} -#top .social a:hover.gplus { - background-color: #c21f25; -} -#top .social a:hover.twitter { - background-color: #3cf; -} -#top .social a:hover.instagram { - background-color: #cd4378; -} -#top .social a:hover.email { - background-color: #4a7f45; -} -#top .login { - float: right; -} -#top .login a { - font-size: 12px; - color: #eeeeee; - margin-right: 15px; - text-decoration: none; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.10em; -} -@media (max-width: 767px) { - #top .login { - float: left; - } -} -#top.light { - background: #fff; - color: #999999; - border-bottom: solid 1px #eeeeee; -} -#top.light .login a { - color: #555555; -} -.navbar { - border: none; -} -.navbar ul.nav > li > a { - text-transform: uppercase; - text-decoration: underline; - font-weight: bold; - letter-spacing: 0.08em; - border-top: solid 5px transparent; -} -.navbar ul.nav > li > a:hover { - border-top: solid 5px #955251; -} -.navbar ul.nav > li.active > a, -.navbar ul.nav > li.open > a { - text-decoration: none !important; - border-top: solid 5px #532e2d; -} -@media (max-width: 768px) { - .navbar ul.nav > li.active > a, - .navbar ul.nav > li.open > a { - border-top-color: transparent; - } - .navbar ul.nav > li > a:hover { - border-top-color: transparent; - } -} -.navbar.navbar-light ul.nav > li.active > a { - border-top: solid 5px #532e2d; - background: #fff !important; - color: #555555 !important; -} -.navbar.navbar-light ul.nav > li.active > a:hover { - border-top: solid 5px #532e2d; -} -.navbar.navbar-light ul.nav > li > a:hover, -.navbar.navbar-light ul.nav > li.open > a:hover, -.navbar.navbar-light ul.nav > li > a:focus, -.navbar.navbar-light ul.nav > li.open > a:focus { - border-top: solid 5px #955251; - background: #fff !important; - color: #555555 !important; -} -.navbar ul.dropdown-menu { - margin: 0; - padding: 0; -} -.navbar ul.dropdown-menu li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 4px 0; -} -.navbar ul.dropdown-menu li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - left: 0; -} -.navbar ul.dropdown-menu li a:hover { - color: #955251; - text-decoration: none; - background: none; - left: 2px; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .navbar ul.dropdown-menu li a:hover { - left: 0; - } -} -.navbar .yamm-content h3 { - font-size: 18px; - text-transform: uppercase; - padding-bottom: 10px; - margin-top: 5px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -@media (max-width: 767px) { - .navbar .yamm-content h3 { - font-size: 14px; - } -} -.navbar .yamm-content h5 { - text-transform: uppercase; - padding-bottom: 10px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -.navbar .yamm-content ul { - margin: 0; - padding: 0; -} -.navbar .yamm-content ul li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - padding: 4px 0; -} -.navbar .yamm-content ul li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.navbar .yamm-content ul li a:hover { - color: #955251; - text-decoration: none; - padding-left: 2px; -} -.navbar .yamm-content .banner { - margin-bottom: 10px; -} -.navbar .yamm-fw .dropdown-menu { - padding: 0; -} -.navbar .navbar-buttons { - float: right; -} -.navbar .navbar-buttons button, -.navbar .navbar-buttons a.btn, -.navbar .navbar-buttons .btn-default.navbar-toggle { - margin-top: 11px; - margin-bottom: 11px; - margin-left: 0; - margin-right: 5px; -} -.navbar .btn-default, -.navbar .btn-default.navbar-toggle { - color: #999999; - background-color: #fff; - margin-left: 7px; - margin-right: 0; -} -.navbar .btn-default:hover, -.navbar .btn-default.navbar-toggle:hover, -.navbar .btn-default:focus, -.navbar .btn-default.navbar-toggle:focus { - background-color: #fff; - border-color: #955251; - color: #955251; -} -.navbar #search { - clear: both; - border-top: solid 1px #955251; - text-align: right; -} -.navbar #search form { - float: right; -} -.navbar #search form .input-group { - width: 500px; -} -@media (max-width: 768px) { - .navbar #search form .input-group { - width: 100%; - } -} -.navbar #basket-overview a { - margin-left: 7px; -} -.navbar-affixed-top { - top: -32px; -} -.navbar-affixed-top.affix-top { - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -.navbar-affixed-top.affix { - position: fixed; - width: 100%; - top: 0; - z-index: 1000; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -body.boxed .navbar-affixed-top.affix { - position: static; -} -#login-modal { - overflow: hidden; -} -#login-modal .modal-header h4 { - text-transform: uppercase; -} -#login-modal form { - margin-bottom: 20px; -} -#login-modal a { - color: #955251; -} -#login-modal p { - font-weight: 300; - margin-bottom: 20px; - font-size: 13px; -} -/* buttons */ -.btn { - font-weight: 700; - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 6px 12px; - font-size: 13px; - line-height: 1.42857143; - border-radius: 0; -} -.input-group .btn { - font-size: 14px; -} -.btn-lg { - padding: 10px 16px; - font-size: 14px; - line-height: 1.33; - border-radius: 0; -} -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-template-main { - color: #955251; - background-color: #ffffff; - border-color: #955251; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - color: #955251; - background-color: #e6e6e6; - border-color: #6d3c3b; -} -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - background-image: none; -} -.btn-template-main.disabled, -.btn-template-main[disabled], -fieldset[disabled] .btn-template-main, -.btn-template-main.disabled:hover, -.btn-template-main[disabled]:hover, -fieldset[disabled] .btn-template-main:hover, -.btn-template-main.disabled:focus, -.btn-template-main[disabled]:focus, -fieldset[disabled] .btn-template-main:focus, -.btn-template-main.disabled:active, -.btn-template-main[disabled]:active, -fieldset[disabled] .btn-template-main:active, -.btn-template-main.disabled.active, -.btn-template-main[disabled].active, -fieldset[disabled] .btn-template-main.active { - background-color: #ffffff; - border-color: #955251; -} -.btn-template-main .badge { - color: #ffffff; - background-color: #955251; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active { - background: #955251; - color: #ffffff; - border-color: #955251; -} -.btn-template-transparent-primary { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - background-image: none; -} -.btn-template-transparent-primary.disabled, -.btn-template-transparent-primary[disabled], -fieldset[disabled] .btn-template-transparent-primary, -.btn-template-transparent-primary.disabled:hover, -.btn-template-transparent-primary[disabled]:hover, -fieldset[disabled] .btn-template-transparent-primary:hover, -.btn-template-transparent-primary.disabled:focus, -.btn-template-transparent-primary[disabled]:focus, -fieldset[disabled] .btn-template-transparent-primary:focus, -.btn-template-transparent-primary.disabled:active, -.btn-template-transparent-primary[disabled]:active, -fieldset[disabled] .btn-template-transparent-primary:active, -.btn-template-transparent-primary.disabled.active, -.btn-template-transparent-primary[disabled].active, -fieldset[disabled] .btn-template-transparent-primary.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active { - background: #fff; - color: #955251; - border-color: #fff; -} -.btn-template-transparent-black { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - background-image: none; -} -.btn-template-transparent-black.disabled, -.btn-template-transparent-black[disabled], -fieldset[disabled] .btn-template-transparent-black, -.btn-template-transparent-black.disabled:hover, -.btn-template-transparent-black[disabled]:hover, -fieldset[disabled] .btn-template-transparent-black:hover, -.btn-template-transparent-black.disabled:focus, -.btn-template-transparent-black[disabled]:focus, -fieldset[disabled] .btn-template-transparent-black:focus, -.btn-template-transparent-black.disabled:active, -.btn-template-transparent-black[disabled]:active, -fieldset[disabled] .btn-template-transparent-black:active, -.btn-template-transparent-black.disabled.active, -.btn-template-transparent-black[disabled].active, -fieldset[disabled] .btn-template-transparent-black.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active { - background: #fff; - color: #000; - border-color: #fff; -} -.btn-template-primary { - color: #ffffff; - background-color: #955251; - border-color: #955251; -} -.btn-template-primary:hover, -.btn-template-primary:focus, -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - color: #ffffff; - background-color: #74403f; - border-color: #6d3c3b; -} -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - background-image: none; -} -.btn-template-primary.disabled, -.btn-template-primary[disabled], -fieldset[disabled] .btn-template-primary, -.btn-template-primary.disabled:hover, -.btn-template-primary[disabled]:hover, -fieldset[disabled] .btn-template-primary:hover, -.btn-template-primary.disabled:focus, -.btn-template-primary[disabled]:focus, -fieldset[disabled] .btn-template-primary:focus, -.btn-template-primary.disabled:active, -.btn-template-primary[disabled]:active, -fieldset[disabled] .btn-template-primary:active, -.btn-template-primary.disabled.active, -.btn-template-primary[disabled].active, -fieldset[disabled] .btn-template-primary.active { - background-color: #955251; - border-color: #955251; -} -.btn-template-primary .badge { - color: #955251; - background-color: #ffffff; -} -#intro { - background: url('../img/home.jpg') no-repeat center top; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} -#intro .item { - font-family: "Roboto", Helvetica, Arial, sans-serif; - height: 100%; -} -#intro .item h1 { - text-transform: uppercase; - font-size: 50px; - color: #fff; - margin-bottom: 40px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #intro .item h1 { - font-size: 40px; - } -} -@media (max-width: 767px) { - #intro .item h1 { - font-size: 25px; - } -} -#intro .item h3 { - color: #fff; - margin-bottom: 40px; -} -@media (max-width: 767px) { - #intro .item h3 { - font-size: 15px; - margin-bottom: 20px; - } -} -#intro .item .btn { - text-transform: none; -} -@media (max-width: 991px) { - #intro .item .btn { - font-size: 14px; - } -} -@media (max-width: 991px) { - #intro .item .carousel-caption { - left: 10%; - right: 10%; - } -} -#intro .container, -#intro .row { - height: 100%; - position: relative; -} -.jumbotron { - padding: 30px; - margin-bottom: 0; - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.jumbotron .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #955251; - opacity: 0.9; - filter: alpha(opacity=90); -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3, -.jumbotron p, -.jumbotron ul { - color: #fff; -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3 { - color: #ffffff; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.jumbotron p { - margin-bottom: 20px; - font-size: 21px; - font-weight: 400; -} -.jumbotron p.text-uppercase { - font-weight: 700; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 0; -} -.jumbotron .container { - max-width: 100%; - z-index: 2; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 46px; - } -} -#categoryMenu h3 { - padding: 20px; - background: #f7f7f7; - margin: 0; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.panel.sidebar-menu h3 { - padding: 5px 0; - margin: 0; -} -.panel.sidebar-menu { - background: #fff; - margin: 0 0 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.panel.sidebar-menu .panel-heading { - text-transform: uppercase; - margin-bottom: 10px; - background: none; - padding: 0; - letter-spacing: 0.08em; - border-bottom: none; -} -.panel.sidebar-menu .panel-heading h1, -.panel.sidebar-menu .panel-heading h2, -.panel.sidebar-menu .panel-heading h3, -.panel.sidebar-menu .panel-heading h4, -.panel.sidebar-menu .panel-heading h5 { - display: inline-block; - border-bottom: solid 5px #955251; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; -} -.panel.sidebar-menu .panel-heading .btn.btn-danger { - color: #fff; - margin-top: 5px; -} -.panel.sidebar-menu .panel-body { - padding: 0; -} -.panel.sidebar-menu .panel-body span.colour { - display: inline-block; - width: 15px; - height: 15px; - border: solid 1px #555555; - vertical-align: top; - margin-top: 2px; - margin-left: 5px; -} -.panel.sidebar-menu .panel-body span.colour.white { - background: #fff; -} -.panel.sidebar-menu .panel-body span.colour.red { - background: red; -} -.panel.sidebar-menu .panel-body span.colour.green { - background: green; -} -.panel.sidebar-menu .panel-body span.colour.blue { - background: blue; -} -.panel.sidebar-menu .panel-body span.colour.yellow { - background: yellow; -} -.panel.sidebar-menu .panel-body label { - color: #999999; - font-size: 12px; -} -.panel.sidebar-menu .panel-body label:hover { - color: #555555; -} -.panel.sidebar-menu ul.nav.category-menu { - margin-bottom: 20px; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.08em; -} -.panel.sidebar-menu ul.nav.category-menu li a { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.panel.sidebar-menu ul.nav ul { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.nav ul li { - display: block; -} -.panel.sidebar-menu ul.nav ul li a { - position: relative; - font-family: "Times New Roman", Times, serif; - font-weight: normal; - text-transform: none !important; - display: block; - padding: 10px 15px; - padding-left: 30px; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.nav ul li a:hover, -.panel.sidebar-menu ul.nav ul li a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.panel.sidebar-menu ul.tag-cloud { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.tag-cloud li { - display: inline-block; -} -.panel.sidebar-menu ul.tag-cloud li a { - display: inline-block; - padding: 5px; - border: solid 1px #eeeeee; - border-radius: 0; - color: #955251; - margin: 5px 5px 5px 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 700; - font-size: 12px; -} -.panel.sidebar-menu ul.tag-cloud li a:hover { - color: #955251; - text-decoration: none; - border-color: #955251; -} -.panel.sidebar-menu ul.popular, -.panel.sidebar-menu ul.recent { - list-style: none; - padding-left: 0; - padding: 20px 0; -} -.panel.sidebar-menu ul.popular li, -.panel.sidebar-menu ul.recent li { - margin-bottom: 10px; - padding: 5px 0; - border-bottom: dotted 1px #eeeeee; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li img, -.panel.sidebar-menu ul.recent li img { - width: 50px; - margin-right: 10px; -} -.panel.sidebar-menu ul.popular li h5, -.panel.sidebar-menu ul.recent li h5 { - margin: 0 0 10px; -} -.panel.sidebar-menu ul.popular li h5 a, -.panel.sidebar-menu ul.recent li h5 a { - font-weight: normal; -} -.panel.sidebar-menu ul.popular li p.date, -.panel.sidebar-menu ul.recent li p.date { - float: right; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.popular li:last-child, -.panel.sidebar-menu ul.recent li:last-child { - border-bottom: none; -} -.panel.sidebar-menu .text-widget { - font-size: 12px; -} -.panel.sidebar-menu.with-icons ul.nav li a:after { - font-family: 'FontAwesome'; - content: "\f105"; - position: relative; - top: 0; - float: right; -} -/* ribbons for product sales etc. */ -.ribbon { - position: absolute; - top: 50px; - padding-left: 51px; - font-weight: 700; - letter-spacing: 0.08em; -} -.ribbon .ribbon-background { - position: absolute; - top: 0; - right: 0; -} -.ribbon .theribbon { - position: relative; - width: 80px; - padding: 6px 20px 6px 20px; - margin: 30px 10px 10px -71px; - color: #fff; - background-color: #955251; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.ribbon .theribbon:before, -.ribbon .theribbon:after { - content: ' '; - position: absolute; - width: 0; - height: 0; -} -.ribbon .theribbon:after { - left: 0px; - top: 100%; - border-width: 5px 10px; - border-style: solid; - border-color: #000000 #000000 transparent transparent; -} -.ribbon.sale { - top: 0; -} -.ribbon.new { - top: 50px; -} -.ribbon.new .theribbon { - background-color: #5bc0de; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.new .theribbon:after { - border-color: #2390b0 #2390b0 transparent transparent; -} -.ribbon.gift { - top: 100px; -} -.ribbon.gift .theribbon { - background-color: #5cb85c; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.gift .theribbon:after { - border-color: #357935 #357935 transparent transparent; -} -.owl-carousel .owl-controls .owl-page.active span, -.owl-theme .owl-controls .owl-page.active span, -.owl-carousel .owl-controls.clickable .owl-page:hover span, -.owl-theme .owl-controls.clickable .owl-page:hover span { - background: #955251; -} -.owl-carousel .owl-controls .owl-buttons, -.owl-theme .owl-controls .owl-buttons { - position: absolute; - top: 5px; - right: 0; -} -.owl-carousel .owl-controls .owl-buttons div, -.owl-theme .owl-controls .owl-buttons div { - width: 26px; - height: 26px; - line-height: 25px; - margin: 0 5px 0 0; - font-size: 18px; - color: #955251; - padding: 0; - background: #fff; - border-radius: 13px; - vertical-align: middle; - text-align: center; - opacity: 1; - filter: alpha(opacity=100); -} -.home-carousel { - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.home-carousel .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #955251; - opacity: 0.9; - filter: alpha(opacity=90); -} -.home-carousel .owl-carousel { - padding-top: 60px; - padding-bottom: 20px; -} -.home-carousel .owl-theme .owl-controls .owl-page span { - background: #666; -} -.home-carousel .owl-theme .owl-controls .owl-page.active span { - background: #fff; -} -.home-carousel .owl-theme .owl-controls .owl-page:hover span { - background: #fff; -} -@media (max-width: 767px) { - .home-carousel { - text-align: center !important; - } -} -@media (min-width: 992px) { - .home-carousel .right { - text-align: right; - } -} -.home-carousel h1, -.home-carousel h2, -.home-carousel h3, -.home-carousel p, -.home-carousel ul { - color: #fff; -} -.home-carousel h1 { - font-weight: 700; - text-transform: uppercase; - font-size: 46px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .home-carousel h1 { - font-size: 36px; - } -} -.home-carousel h2 { - font-weight: 700; - text-transform: uppercase; - font-size: 40px; - letter-spacing: 0.08em; -} -.home-carousel ul, -.home-carousel p { - font-size: 18px; - font-weight: 700; - padding: 0; - text-transform: uppercase; - letter-spacing: 0.10em; -} -@media (max-width: 991px) { - .home-carousel ul, - .home-carousel p { - font-size: 14px; - } -} -.home-carousel ul li { - margin-bottom: 10px; -} -.customers { - padding: 0; - margin-bottom: 40px; -} -.customers .item { - list-style-type: none; - text-align: center; - margin: 0 20px; -} -.customers .item img { - display: inline-block; - filter: url("data:image/svg+xml;utf8,#grayscale"); - /* Firefox 10+, Firefox on Android */ - filter: gray; - /* IE6-9 */ - -webkit-filter: grayscale(100%); - /* Chrome 19+, Safari 6+, Safari 6+ iOS */ - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.customers .item img:hover { - max-width: auto; - filter: none; - -webkit-filter: none; -} -.testimonials { - padding: 0; - margin-bottom: 40px; -} -.testimonials .item { - list-style-type: none; - margin: 0 5px; - background: #fff; - padding-bottom: 60px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.testimonials .item .testimonial { - position: relative; - padding: 20px; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial .text { - color: #999999; - margin-bottom: 40px; -} -.testimonials .item .testimonial .bottom { - position: absolute; - left: 0; - bottom: 0; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px; - height: 50px; -} -.testimonials .item .testimonial .bottom .icon { - color: #955251; - font-size: 30px; - float: left; - width: 20%; -} -.testimonials .item .testimonial .name-picture { - float: right; - width: 80%; - text-align: right; -} -.testimonials .item .testimonial .name-picture h5 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.testimonials .item .testimonial .name-picture p { - color: #999999; - margin: 0; - font-size: 12px; -} -.testimonials .item .testimonial .name-picture img { - float: right; - width: 60px; - border-radius: 30px; - margin-left: 10px; -} -.team-member { - text-align: center; - margin-bottom: 40px; -} -.team-member h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 5px; - letter-spacing: 0.08em; -} -.team-member h3 a { - color: #555555; -} -.team-member p.role { - color: #999999; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.team-member .social { - margin-bottom: 20px; -} -.team-member .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email { - background-color: #4a7f45; -} -.team-member .text p { - color: #999999; - font-size: 12px; -} -.team-member .social, -.team-member-detail .social { - margin-bottom: 20px; -} -.team-member .social a, -.team-member-detail .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i, -.team-member-detail .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook, -.team-member-detail .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus, -.team-member-detail .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter, -.team-member-detail .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram, -.team-member-detail .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email, -.team-member-detail .social a.email { - background-color: #4a7f45; -} -.box-simple { - text-align: center; - margin-bottom: 40px; -} -.box-simple .icon { - color: #955251; - border-color: #955251; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.box-simple h3 { - font-weight: normal; - font-size: 18px; - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-simple h3 a { - color: #555555; -} -.box-simple p { - color: #999999; -} -.box-simple:hover .icon { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.box-simple:hover .icon i { - -webkit-transform: scale(1, 1); - -ms-transform: scale(1, 1); - -o-transform: scale(1, 1); - transform: scale(1, 1); -} -.box-simple.box-white { - padding: 20px; - border: dotted 1px #999999; -} -.box-simple.box-white .icon { - color: #555555; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark { - padding: 20px; - border: dotted 1px #999999; - background: #555555; - color: #fff; -} -.box-simple.box-dark .icon { - color: #f7f7f7; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark h3 { - color: #fff; -} -.box-simple.box-dark h3 a { - color: #fff; -} -.box-simple.box-dark p { - color: #fff; -} -.box-image { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #955251; -} -.box-image .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -.box-image-text { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image-text .top { - position: relative; - margin-bottom: 10px; -} -.box-image-text .top .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #955251; -} -.box-image-text .top .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .top .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image-text .top .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image-text .top .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .content h3, -.box-image-text .content h4 { - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-image-text .content p { - color: #999999; -} -.box-image-text:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image-text:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image-text:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -/* universal box */ -.box { - background: #fff; - margin: 0 0 30px; - border: solid 1px #ccc; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px 0; - border-left: none; - border-right: none; -} -.box .box-header { - background: #f7f7f7; - margin: -20px 0 20px; - padding: 20px; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-footer { - background: #f7f7f7; - margin: 30px 0 -20px; - padding: 20px; - border-top: solid 1px #eeeeee; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -@media (max-width: 991px) { - .box .box-footer .btn { - margin-bottom: 20px; - } -} -.box.no-border { - border: none; -} -#heading-breadcrumbs { - background: url('../img/texture-bw.png') center center repeat; - padding: 20px 0; - margin-bottom: 40px; -} -#heading-breadcrumbs.no-mb { - margin-bottom: 0; -} -#heading-breadcrumbs h1 { - color: #333333; - text-transform: uppercase; - font-size: 30px; - font-weight: 700; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #heading-breadcrumbs h1 { - text-align: center; - } -} -#heading-breadcrumbs ul.breadcrumb { - margin-top: 5px; - margin-bottom: 0; -} -.bar { - position: relative; - background: #955251; - padding: 60px 0; -} -.bar.background-pentagon { - background: url('../img/texture-bw.png') center center repeat; - border-top: solid 1px #999999; - border-bottom: solid 1px #999999; -} -.bar.background-gray { - background: #eeeeee; -} -.bar.background-gray-dark { - background: #555555; -} -.bar.background-white { - background: #fff; -} -.bar.background-image-fixed-1 { - background: url('../img/fixed-background-1.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.background-image-fixed-2 { - background: url('../img/fixed-background-2.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.color-white h1, -.bar.color-white h2, -.bar.color-white h3, -.bar.color-white h4, -.bar.color-white h5, -.bar.color-white h6, -.bar.color-white p { - color: #fff; -} -.bar.padding-big { - padding: 50px 0; -} -.bar.padding-horizontal { - padding-left: 30px; - padding-right: 30px; -} -.bar.margin-vertical { - margin-top: 20px; - margin-bottom: 20px; -} -.bar .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #000; - opacity: 0.3; - filter: alpha(opacity=30); -} -.portfolio.no-space { - padding: 0 15px; -} -.portfolio.no-space .box-image { - margin: 0 -15px; -} -.portfolio-project .project-more h4 { - color: #555555; - text-transform: uppercase; - margin-bottom: 0; - text-align: left; - font-size: 14px; - letter-spacing: 0.08em; -} -.portfolio-project .project-more p { - color: #999999; - padding: 10px 0; - margin-bottom: 20px; - text-align: left; -} -.portfolio-showcase { - margin: 15px 0 60px; -} -.portfolio-showcase h3 a { - text-transform: uppercase; - line-height: 1.5; - letter-spacing: 0.08em; -} -.portfolio-showcase p.lead { - color: #555555; - margin-bottom: 20px; -} -.portfolio-showcase p { - color: #999999; -} -.portfolio-showcase p.buttons { - margin-top: 40px; -} -.see-more { - text-align: center; - margin-top: 20px; - padding-top: 20px; -} -.see-more p { - font-size: 28px; - font-weight: 100; - margin-bottom: 20px; -} -.showcase .item { - text-align: center; -} -.showcase .item .icon { - display: inline-block; - width: 50px; - height: 50px; - color: #555555; - line-height: 50px; - border-radius: 25px; - border: solid 1px #555555; -} -.showcase .item h4 { - color: #555555; - text-transform: uppercase; - letter-spacing: 0.08em; - line-height: 1.5; - font-size: 16px; -} -.showcase .item h4 span { - font-weight: bold; - font-size: 51px; -} -.packages .package { - background: #fff; - margin-top: 25px; - margin-bottom: 20px; - padding-bottom: 15px; - text-align: center; - border: solid 1px #955251; - overflow: hidden; -} -.packages .package .package-header { - height: 57px; - color: #fff; - line-height: 57px; - background: #955251; -} -.packages .package .package-header h5 { - color: #fff; - text-transform: uppercase; - font-weight: bold; - line-height: 57px; - margin: 0; - letter-spacing: 0.08em; -} -.packages .package .package-header.light-gray { - background: #eeeeee; -} -.packages .package .package-header.light-gray h5 { - color: #555555; -} -.packages .package .price { - line-height: 120px; - height: 100px; - color: #fff; - font-weight: 400; -} -.packages .package .price h4 { - display: inline; - font-size: 50px; - line-height: normal; - margin-bottom: 0; -} -.packages .package .price .period { - line-height: normal; - color: #999999; -} -.packages .package ul { - padding: 0; -} -.packages .package ul li { - list-style-type: none; - padding-top: 10px; - padding-bottom: 10px; - width: 80%; - margin: auto; - border-bottom: 1px dotted #ccc; -} -.packages .package ul li:last-child { - border-bottom: 0; -} -.packages .package ul li i { - font-size: 13px; - margin-right: 5px; -} -.packages .best-value .package { - margin-top: 0; - padding-bottom: 40px; -} -.packages .best-value .package .package-header { - height: 72px; - padding-top: 17px; - height: 82px !important; -} -.packages .best-value .package .package-header h5 { - font-weight: bold; - line-height: 29px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.packages .best-value .package .package-header .meta-text { - font-size: 13px; - line-height: 15px; -} -#map { - height: 300px; -} -#map.with-border { - border-top: solid 1px #955251; - border-bottom: solid 1px #955251; -} -#blog-listing-big .post, -#blog-homepage .post { - margin-bottom: 60px; -} -#blog-listing-big .post h2, -#blog-homepage .post h2, -#blog-listing-big .post h4, -#blog-homepage .post h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#blog-listing-big .post h2 a, -#blog-homepage .post h2 a, -#blog-listing-big .post h4 a, -#blog-homepage .post h4 a { - color: #555555; -} -#blog-listing-big .post h2 a:hover, -#blog-homepage .post h2 a:hover, -#blog-listing-big .post h4 a:hover, -#blog-homepage .post h4 a:hover { - color: #955251; -} -#blog-listing-big .post .author-category, -#blog-homepage .post .author-category { - color: #999999; - text-transform: uppercase; - font-weight: 300; - letter-spacing: 0.08em; -} -#blog-listing-big .post .author-category a, -#blog-homepage .post .author-category a { - font-weight: 500; -} -#blog-listing-big .post .date-comments a, -#blog-homepage .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-big .post .date-comments a:hover, -#blog-homepage .post .date-comments a:hover { - color: #955251; -} -@media (min-width: 768px) { - #blog-listing-big .post .date-comments, - #blog-homepage .post .date-comments { - text-align: right; - } -} -#blog-listing-big .post .intro, -#blog-homepage .post .intro { - text-align: left; -} -#blog-listing-big .post .image, -#blog-homepage .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-big .post .image img, -#blog-homepage .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-big .post .image img.img-responsive, - #blog-homepage .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-big .post .video, -#blog-homepage .post .video { - margin-bottom: 10px; -} -#blog-listing-big .post .read-more, -#blog-homepage .post .read-more { - text-align: right; -} -#blog-listing-medium .post { - margin-bottom: 60px; -} -#blog-listing-medium .post h2 { - text-transform: uppercase; - margin: 0 0 10px; - font-size: 24px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post h2 a { - color: #555555; -} -#blog-listing-medium .post h2 a:hover { - color: #955251; -} -#blog-listing-medium .post .author-category { - float: left; - color: #999999; - text-transform: uppercase; - font-weight: 300; - font-size: 12px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post .author-category a { - font-weight: 500; -} -#blog-listing-medium .post .date-comments { - float: right; - font-size: 12px; -} -#blog-listing-medium .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-medium .post .date-comments a:hover { - color: #955251; -} -@media (min-width: 768px) { - #blog-listing-medium .post .date-comments { - text-align: right; - } -} -#blog-listing-medium .post .intro { - text-align: left; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-medium .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-medium .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-medium .post .video { - margin-bottom: 10px; -} -#blog-listing-medium .post .read-more { - text-align: right; -} -.box-image-text.blog .author-category { - color: #999999; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 300; - font-size: 12px; -} -.box-image-text.blog .author-category a { - font-weight: 500; -} -.box-image-text.blog .intro { - text-align: left; - margin-bottom: 20px; -} -#blog-homepage .post { - margin-bottom: 30px; -} -#blog-homepage .post h2, -#blog-homepage .post h4, -#blog-homepage .post .author-category, -#blog-homepage .post .read-more { - text-align: center; -} -#blog-homepage .post .read-more { - margin-top: 20px; -} -#blog-post #post-content { - margin-bottom: 20px; -} -#blog-post .comment { - margin-bottom: 25px; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment .posted { - color: #999999; - font-size: 12px; -} -#blog-post .comment .reply { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#blog-post .comment.last { - margin-bottom: 0; -} -#blog-post #comments, -#blog-post #comment-form { - padding: 20px 0; - margin-top: 20px; - border-top: solid 1px #eeeeee; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments h4, -#blog-post #comment-form h4 { - margin-bottom: 20px; -} -#blog-post #comment-form { - margin-bottom: 20px; -} -.product { - background: #fff; - border-bottom: solid 1px #e6e6e6; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 60px; - overflow: hidden; - text-align: center; -} -.product .image { - overflow: hidden; -} -.product .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .product .image img.img-responsive { - min-width: 100%; - } -} -.product .text { - padding: 10px; -} -.product .text h3 { - font-size: 14px; - font-weight: 700; - height: 39.6px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.product .text h3 a { - color: #555555; -} -.product .text h3 a:hover { - text-decoration: none; -} -.product .text p.price { - font-size: 18px; -} -.product .text p.price del { - color: #999999; -} -.product .buttons { - clear: both; - position: absolute; - display: none; - bottom: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - border: solid 1px transparent; - padding: 20px; - background: rgba(255, 255, 255, 0.9); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - text-align: center; -} -.product .buttons .btn { - margin-bottom: 20px; -} -.product:hover { - border-bottom: solid 1px #808080; - top: 0; -} -.product:hover .buttons { - clear: both; - position: absolute; - top: 0; - background: rgba(255, 255, 255, 0.5); -} -.product:hover .image img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.goToDescription { - font-size: 12px; - text-align: center; - margin-bottom: 40px; -} -.goToDescription a { - color: #999999; - text-decoration: underline; -} -#productMain { - margin-bottom: 30px; -} -#productMain .sizes { - text-align: center; -} -#productMain .sizes h3 { - font-weight: 700; - letter-spacing: 0.08em; - text-transform: uppercase; - margin-bottom: 40px; -} -#productMain .sizes a { - display: inline-block; - width: 40px; - height: 40px; - border-radius: 40px; - background: #ccc; - line-height: 40px; - color: #555555; - text-align: center; - text-decoration: none; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#productMain .sizes a.active, -#productMain .sizes a:hover { - background: #955251; - color: #fff; -} -#productMain .sizes input { - display: none; -} -#productMain .price { - font-size: 40px; - text-align: center; - margin-top: 40px; - margin-bottom: 40px; -} -#thumbs a { - display: block; - border: solid 1px transparent; -} -#thumbs a.active { - border-color: #955251; -} -#product-social { - text-align: center; -} -#product-social h4 { - font-weight: 300; - margin-bottom: 10px; -} -#product-social p { - line-height: 26px; -} -#product-social p a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -#product-social p a i { - vertical-align: bottom; - line-height: 26px; -} -#product-social p a.facebook { - background-color: #4460ae; -} -#product-social p a.gplus { - background-color: #c21f25; -} -#product-social p a.twitter { - background-color: #3cf; -} -#product-social p a.instagram { - background-color: #cd4378; -} -#product-social p a.email { - background-color: #4a7f45; -} -@media (max-width: 991px) { - #product-social { - text-align: center; - } -} -#checkout .nav { - margin-bottom: 20px; - border-bottom: solid 1px #955251; -} -#checkout .nav li { - height: 100%; -} -#checkout .nav li a { - display: block; - height: 100%; -} -#order-summary table { - margin-top: 20px; -} -#order-summary table td { - color: #999999; -} -#order-summary table tr.total td, -#order-summary table tr.total th { - font-size: 18px; - color: #555555; - font-weight: 700; -} -#checkout .table tbody tr td, -#basket .table tbody tr td, -#customer-order .table tbody tr td { - vertical-align: middle; -} -#checkout .table tbody tr td input, -#basket .table tbody tr td input, -#customer-order .table tbody tr td input { - width: 50px; - text-align: right; -} -#checkout .table tbody tr td img, -#basket .table tbody tr td img, -#customer-order .table tbody tr td img { - width: 50px; -} -#checkout .table tfoot, -#basket .table tfoot, -#customer-order .table tfoot { - font-size: 18px; -} -.shipping-method h4, -.payment-method h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#customer-orders table tr th, -#customer-orders table tr td { - vertical-align: baseline; -} -#customer-order .table tfoot th { - font-size: 18px; - font-weight: 300; -} -#customer-order .addresses { - text-align: right; - margin-bottom: 30px; -} -#customer-order .addresses p { - font-size: 18px; - font-weight: 300; -} -#customer-account { - margin-bottom: 30px; -} -#get-it { - background: #955251; - padding: 50px 0 30px; - color: #fff; - text-align: center; -} -#get-it h1, -#get-it h2, -#get-it h3, -#get-it h4, -#get-it h5, -#get-it h6 { - color: #fff; - text-transform: uppercase; - letter-spacing: 0.08em; - margin: 0 0 20px; -} -#get-it p { - margin: 0 0 20px; -} -#footer { - background: #555555; - padding: 50px 0; - color: #999999; -} -#footer h1, -#footer h2, -#footer h3, -#footer h4, -#footer h5, -#footer h6 { - color: #eeeeee; -} -#footer h4 { - font-size: 14px; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.08em; -} -#footer ul { - padding-left: 0; - list-style: none; -} -#footer ul a { - color: #999999; -} -#footer ul a:hover { - color: #955251; - text-decoration: none; -} -#footer .photostream div { - float: left; - display: block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 33%; - padding: 7.5px; - overflow: hidden; -} -#footer .photostream div a { - border: solid 1 px #eeeeee; -} -#footer .photostream div img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -#footer .photostream div:hover img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -#footer .blog-entries .item { - clear: both; - padding: 5px 0; - margin-bottom: 10px; - border-bottom: solid 1px #555555; -} -#footer .blog-entries .item .image { - float: left; - width: 15%; - margin-right: 10px; -} -#footer .blog-entries .item .name { - width: 75%; - margin-left: 10px; - display: table-cell; - vertical-align: middle; -} -#footer .blog-entries .item .name h5 { - margin: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-size: 12px; -} -#footer .blog-entries .item .name h5 a { - color: #eeeeee; -} -#footer .blog-entries .item .text { - width: 100%; - clear: both; -} -#footer .blog-entries .item:last-child { - border-bottom: none; - margin-bottom: 0; -} -#footer .social a { - color: #555555; - font-size: 25px; - margin: 0 10px 0 0; -} -#footer .social a:hover { - color: #955251; -} -#copyright { - background: #333; - color: #ccc; - padding: 50px 0; - font-size: 12px; - line-height: 28px; -} -#copyright p { - margin: 0; -} -@media (max-width: 991px) { - #copyright p { - float: none !important; - text-align: center; - margin-bottom: 10px; - } -} -[data-animate] { - opacity: 0; - filter: alpha(opacity=0); -} -#style-switch-button { - position: fixed; - top: 100px; - left: 0px; - border-radius: 0; -} -#style-switch { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 300px; - padding: 20px; - position: fixed; - top: 140px; - left: 0; - background: #fff; - border: solid 1px #eeeeee; -} -@media (max-width: 991px) { - #style-switch-button { - display: none; - } - #style-switch { - display: none; - } -} -/* Original Boostrap template overwrite */ -/* breadcrumbs */ -.breadcrumb { - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - background-color: none; - letter-spacing: 0.08em; -} -/* nav */ -.nav > li > a { - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #999999; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #955251; -} -.nav-tabs { - border-bottom: 1px solid #955251; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 0 0 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #955251; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - background-color: #ffffff; - border: 1px solid #955251; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: solid 1px #955251; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #955251; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #955251; - border-radius: 0 0 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 0; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #955251; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; - border-bottom: solid 1px #955251; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #955251; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #955251; - border-radius: 0 0 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.tab-content { - padding: 15px; - border: solid 1px #ddd; - border-top: none; -} -/* navbar */ -.navbar { - position: relative; - min-height: 62px; - margin-bottom: 0; - border-bottom: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 0px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-affixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-affixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - padding: 10px 15px; - font-size: 18px; - line-height: 20px; - height: 62px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 14px; - margin-bottom: 14px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 0; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-nav { - margin: 10.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 21px; - padding-bottom: 21px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 14px; - margin-bottom: 14px; -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-btn.btn-sm { - margin-top: 16px; - margin-bottom: 16px; -} -.navbar-btn.btn-xs { - margin-top: 20px; - margin-bottom: 20px; -} -.navbar-text { - margin-top: 21px; - margin-bottom: 21px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #ffffff; - border-color: #cccccc; - border-bottom: none; -} -.navbar-default .navbar-brand { - color: #555555; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #3b3b3b; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777777; -} -.navbar-default .navbar-nav > li > a { - color: #555555; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #555555; - background-color: #c08c8c; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #955251; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #dddddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #955251; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #cccccc; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - background-color: #955251; - color: #ffffff; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #555555; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #955251; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #955251; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #555555; -} -.navbar-default .navbar-link:hover { - color: #555555; -} -.navbar-default .btn-link { - color: #555555; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #555555; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; -} -/* scaffolding */ -body { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #555555; -} -a { - color: #955251; - text-decoration: none; -} -a:hover, -a:focus { - color: #633736; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.img-rounded { - border-radius: 0; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} -/* breadcrumbs */ -.breadcrumb { - padding: 20px 0; - margin-bottom: 20px; - background-color: transparent; - border-radius: 0; - text-align: right; -} -.breadcrumb > li + li:before { - content: ">\00a0"; - color: #555555; -} -.breadcrumb > .active { - color: #999999; -} -@media (max-width: 991px) { - .breadcrumb { - padding: 20px 0; - text-align: center; - } -} -/* dropdowns */ -.dropdown-menu { - z-index: 1000; - font-size: 14px; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - padding: 5px 20px; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; -} -/* labels */ -.label { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: normal; - text-transform: uppercase; - letter-spacing: 0.08em; -} -/* forms.less */ -label { - font-weight: normal; -} -.form-control { - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 0; -} -.form-control:focus { - border-color: #955251; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(149, 82, 81, 0.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(149, 82, 81, 0.6); -} -.form-group { - margin-bottom: 20px; -} -/* pager*/ -.pager { - margin: 20px 0; - border-top: solid 1px #eeeeee; - padding-top: 20px; - text-transform: uppercase; - letter-spacing: 0.08em; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - background-color: #ffffff; - border: 1px solid #955251; - border-radius: 0; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - color: #fff; - background-color: #955251; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - background-color: #ffffff; - border-color: #ddd; -} -/* pagination */ -.pagination { - margin: 20px 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - border-radius: 0; -} -.pagination > li > a, -.pagination > li > span { - padding: 6px 12px; - line-height: 1.42857143; - text-decoration: none; - color: #955251; - background-color: #ffffff; - border: 1px solid #dddddd; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #955251; - background-color: #d2adad; - border-color: #dddddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - background-color: #955251; - border-color: #955251; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - background-color: #ffffff; - border-color: #dddddd; -} -/* responsive utilities */ -@media (max-width: 767px) { - .text-center-xs { - text-align: center !important; - } - .text-center-xs img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .text-center-sm { - text-align: center !important; - } - .text-center-sm img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -/* type */ -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 900; - line-height: 1.1; - color: #333333; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 20px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 18px; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -.text-small { - font-size: 12px; -} -.text-large { - font-size: 18px; -} -.text-italic { - font-style: italic; -} -.text-primary { - color: #955251; -} -a.text-primary:hover { - color: #74403f; -} -.bg-primary { - color: #fff; - background-color: #955251; -} -a.bg-primary:hover { - background-color: #74403f; -} -abbr[title], -abbr[data-original-title] { - border-bottom: 1px dotted #999999; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 14px; - border-left: 5px solid #955251; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #999999; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - border-right: 5px solid #955251; -} -address { - margin-bottom: 20px; - line-height: 1.42857143; -} -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 0; - -webkit-box-shadow: 0 0 0; - box-shadow: 0 0 0; -} -.panel-heading { - border-top-right-radius: 0; - border-top-left-radius: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 15px 15px; -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 0; - overflow: hidden; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group.accordion .panel { - border-color: #ccc; -} -.panel-primary { - border-color: #955251; -} -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #955251; - border-color: #955251; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #955251; -} -.panel-primary > .panel-heading .badge { - color: #955251; - background-color: #ffffff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #955251; -} -.panel-primary .panel-title { - font-weight: 300; -} -.panel-primary .panel-title a:hover { - color: #fff; - text-decoration: none; -} -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #955251; - background-color: #ffffff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.progress-bar-primary { - background-color: #955251; -} -.progress-striped .progress-bar-primary { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -/*! - * Yamm!3 - Yet another megamenu for Bootstrap 3 - * http://geedmo.github.com/yamm3 - * - * @geedmo - Licensed under the MIT license - */ -.yamm .nav, -.yamm .collapse, -.yamm .dropup.use-yamm, -.yamm .dropdown.use-yamm { - position: static; -} -.yamm .container { - position: relative; -} -.yamm .dropdown-menu { - left: auto; -} -.yamm .nav.navbar-right .dropdown-menu { - left: auto; - right: 0; -} -.yamm .yamm-content { - padding: 20px 30px; -} -.yamm .dropdown.yamm-fw .dropdown-menu { - left: 15px; - right: 15px; -} diff --git a/css/style.pink.css b/css/style.pink.css deleted file mode 100644 index cb7863d..0000000 --- a/css/style.pink.css +++ /dev/null @@ -1,3557 +0,0 @@ -.clearfix:before, -.clearfix:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after { - content: " "; - display: table; -} -.clearfix:after, -.navbar:after, -.navbar-header:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -/* general styles */ -a, -button { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -a i.fa, -button i.fa { - margin: 0 5px; -} -.clickable { - cursor: pointer !important; -} -.required { - color: #c27baa; -} -.accent { - color: #c27baa; -} -.text-uppercase { - text-transform: uppercase; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .text-center-sm { - text-align: center; - } -} -p.lead { - margin-bottom: 40px; -} -section, -div.section { - margin-bottom: 40px; -} -.no-mb { - margin-bottom: 0 !important; -} -.mb-small { - margin-bottom: 20px !important; -} -.heading { - margin-bottom: 40px; -} -.heading h1, -.heading h2, -.heading h3, -.heading h4, -.heading h5 { - display: inline-block; - border-bottom: solid 5px #c27baa; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; - vertical-align: middle; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.heading h1 i.fa, -.heading h2 i.fa, -.heading h3 i.fa, -.heading h4 i.fa, -.heading h5 i.fa { - display: inline-block; - background: #c27baa; - width: 30px; - height: 30px; - vertical-align: middle; - text-align: center; - color: #fff; - font-size: 12px; - line-height: 30px; - border-radius: 15px; -} -.icon { - display: inline-block; - width: 80px; - height: 80px; - color: #fff; - line-height: 80px; - border-radius: 40px; - border: solid 1px #fff; - font-size: 20px; -} -.icon.icon-lg { - font-size: 30px; - border-width: 2px; -} -.ul-icons { - padding-left: 10px; -} -.ul-icons li { - list-style-type: none; - line-height: 20px; - margin-bottom: 20px; -} -.ul-icons li i { - width: 20px; - height: 20px; - background: #c27baa; - color: #fff; - text-align: center; - border-radius: 10px; - line-height: 20px; - margin-right: 10px; -} -ul.list-style-none { - list-style: none; -} -#text-page h1, -#text-page h2, -#text-page h3 { - font-weight: 700; -} -#error-page { - text-align: center; - margin-top: 40px; - margin-bottom: 100px; -} -#error-page h4 { - margin-bottom: 40px; -} -#error-page p.buttons { - margin-top: 40px; -} -.pages-listing .item { - text-align: center; -} -.pages-listing .item h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 20px; - letter-spacing: 0.08em; -} -.pages-listing .item h3 a { - color: #555555; -} -.pages-listing .item .text { - margin-bottom: 20px; -} -.pages-listing .item .text p { - color: #999999; - font-size: 12px; - margin-bottom: 20px; -} -.banner { - margin-bottom: 30px; - text-align: center; -} -.banner img { - margin: 0 auto; -} -.banner a:hover img { - opacity: 0.8; - filter: alpha(opacity=80); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.pages { - text-align: center; -} -.pages .loadMore { - text-align: center; -} -.pages .pagination { - text-align: center; -} -.features-buttons button { - margin-bottom: 20px; -} -@media (min-width: 1300px) { - body.boxed { - background: url(https://www.toptal.com/designers/subtlepatterns/patterns/subtle_zebra_3d.png); - } - body.boxed #all { - position: relative; - background: #fff; - width: 1200px; - margin: 0 auto; - overflow: hidden; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - } -} -#top { - background: #555555; - color: #eeeeee; - padding: 10px 0; -} -#top p { - margin: 0; - font-size: 12px; -} -#top .social { - float: right; - text-align: right; -} -#top .social a { - color: #999999; - display: inline-block; - width: 24px; - height: 24px; - border-radius: 12px; - line-height: 20px; - font-size: 12px; - text-align: center; - vertical-align: bottom; -} -#top .social a:hover { - color: #fff; -} -#top .social a:hover.facebook { - background-color: #4460ae; -} -#top .social a:hover.gplus { - background-color: #c21f25; -} -#top .social a:hover.twitter { - background-color: #3cf; -} -#top .social a:hover.instagram { - background-color: #cd4378; -} -#top .social a:hover.email { - background-color: #4a7f45; -} -#top .login { - float: right; -} -#top .login a { - font-size: 12px; - color: #eeeeee; - margin-right: 15px; - text-decoration: none; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.10em; -} -@media (max-width: 767px) { - #top .login { - float: left; - } -} -#top.light { - background: #fff; - color: #999999; - border-bottom: solid 1px #eeeeee; -} -#top.light .login a { - color: #555555; -} -.navbar { - border: none; -} -.navbar ul.nav > li > a { - text-transform: uppercase; - text-decoration: underline; - font-weight: bold; - letter-spacing: 0.08em; - border-top: solid 5px transparent; -} -.navbar ul.nav > li > a:hover { - border-top: solid 5px #c27baa; -} -.navbar ul.nav > li.active > a, -.navbar ul.nav > li.open > a { - text-decoration: none !important; - border-top: solid 5px #934478; -} -@media (max-width: 768px) { - .navbar ul.nav > li.active > a, - .navbar ul.nav > li.open > a { - border-top-color: transparent; - } - .navbar ul.nav > li > a:hover { - border-top-color: transparent; - } -} -.navbar.navbar-light ul.nav > li.active > a { - border-top: solid 5px #934478; - background: #fff !important; - color: #555555 !important; -} -.navbar.navbar-light ul.nav > li.active > a:hover { - border-top: solid 5px #934478; -} -.navbar.navbar-light ul.nav > li > a:hover, -.navbar.navbar-light ul.nav > li.open > a:hover, -.navbar.navbar-light ul.nav > li > a:focus, -.navbar.navbar-light ul.nav > li.open > a:focus { - border-top: solid 5px #c27baa; - background: #fff !important; - color: #555555 !important; -} -.navbar ul.dropdown-menu { - margin: 0; - padding: 0; -} -.navbar ul.dropdown-menu li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 4px 0; -} -.navbar ul.dropdown-menu li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - left: 0; -} -.navbar ul.dropdown-menu li a:hover { - color: #c27baa; - text-decoration: none; - background: none; - left: 2px; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .navbar ul.dropdown-menu li a:hover { - left: 0; - } -} -.navbar .yamm-content h3 { - font-size: 18px; - text-transform: uppercase; - padding-bottom: 10px; - margin-top: 5px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -@media (max-width: 767px) { - .navbar .yamm-content h3 { - font-size: 14px; - } -} -.navbar .yamm-content h5 { - text-transform: uppercase; - padding-bottom: 10px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -.navbar .yamm-content ul { - margin: 0; - padding: 0; -} -.navbar .yamm-content ul li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - padding: 4px 0; -} -.navbar .yamm-content ul li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.navbar .yamm-content ul li a:hover { - color: #c27baa; - text-decoration: none; - padding-left: 2px; -} -.navbar .yamm-content .banner { - margin-bottom: 10px; -} -.navbar .yamm-fw .dropdown-menu { - padding: 0; -} -.navbar .navbar-buttons { - float: right; -} -.navbar .navbar-buttons button, -.navbar .navbar-buttons a.btn, -.navbar .navbar-buttons .btn-default.navbar-toggle { - margin-top: 11px; - margin-bottom: 11px; - margin-left: 0; - margin-right: 5px; -} -.navbar .btn-default, -.navbar .btn-default.navbar-toggle { - color: #999999; - background-color: #fff; - margin-left: 7px; - margin-right: 0; -} -.navbar .btn-default:hover, -.navbar .btn-default.navbar-toggle:hover, -.navbar .btn-default:focus, -.navbar .btn-default.navbar-toggle:focus { - background-color: #fff; - border-color: #c27baa; - color: #c27baa; -} -.navbar #search { - clear: both; - border-top: solid 1px #c27baa; - text-align: right; -} -.navbar #search form { - float: right; -} -.navbar #search form .input-group { - width: 500px; -} -@media (max-width: 768px) { - .navbar #search form .input-group { - width: 100%; - } -} -.navbar #basket-overview a { - margin-left: 7px; -} -.navbar-affixed-top { - top: -32px; -} -.navbar-affixed-top.affix-top { - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -.navbar-affixed-top.affix { - position: fixed; - width: 100%; - top: 0; - z-index: 1000; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -body.boxed .navbar-affixed-top.affix { - position: static; -} -#login-modal { - overflow: hidden; -} -#login-modal .modal-header h4 { - text-transform: uppercase; -} -#login-modal form { - margin-bottom: 20px; -} -#login-modal a { - color: #c27baa; -} -#login-modal p { - font-weight: 300; - margin-bottom: 20px; - font-size: 13px; -} -/* buttons */ -.btn { - font-weight: 700; - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 6px 12px; - font-size: 13px; - line-height: 1.42857143; - border-radius: 0; -} -.input-group .btn { - font-size: 14px; -} -.btn-lg { - padding: 10px 16px; - font-size: 14px; - line-height: 1.33; - border-radius: 0; -} -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-template-main { - color: #c27baa; - background-color: #ffffff; - border-color: #c27baa; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - color: #c27baa; - background-color: #e6e6e6; - border-color: #af518f; -} -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - background-image: none; -} -.btn-template-main.disabled, -.btn-template-main[disabled], -fieldset[disabled] .btn-template-main, -.btn-template-main.disabled:hover, -.btn-template-main[disabled]:hover, -fieldset[disabled] .btn-template-main:hover, -.btn-template-main.disabled:focus, -.btn-template-main[disabled]:focus, -fieldset[disabled] .btn-template-main:focus, -.btn-template-main.disabled:active, -.btn-template-main[disabled]:active, -fieldset[disabled] .btn-template-main:active, -.btn-template-main.disabled.active, -.btn-template-main[disabled].active, -fieldset[disabled] .btn-template-main.active { - background-color: #ffffff; - border-color: #c27baa; -} -.btn-template-main .badge { - color: #ffffff; - background-color: #c27baa; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active { - background: #c27baa; - color: #ffffff; - border-color: #c27baa; -} -.btn-template-transparent-primary { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - background-image: none; -} -.btn-template-transparent-primary.disabled, -.btn-template-transparent-primary[disabled], -fieldset[disabled] .btn-template-transparent-primary, -.btn-template-transparent-primary.disabled:hover, -.btn-template-transparent-primary[disabled]:hover, -fieldset[disabled] .btn-template-transparent-primary:hover, -.btn-template-transparent-primary.disabled:focus, -.btn-template-transparent-primary[disabled]:focus, -fieldset[disabled] .btn-template-transparent-primary:focus, -.btn-template-transparent-primary.disabled:active, -.btn-template-transparent-primary[disabled]:active, -fieldset[disabled] .btn-template-transparent-primary:active, -.btn-template-transparent-primary.disabled.active, -.btn-template-transparent-primary[disabled].active, -fieldset[disabled] .btn-template-transparent-primary.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active { - background: #fff; - color: #c27baa; - border-color: #fff; -} -.btn-template-transparent-black { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - background-image: none; -} -.btn-template-transparent-black.disabled, -.btn-template-transparent-black[disabled], -fieldset[disabled] .btn-template-transparent-black, -.btn-template-transparent-black.disabled:hover, -.btn-template-transparent-black[disabled]:hover, -fieldset[disabled] .btn-template-transparent-black:hover, -.btn-template-transparent-black.disabled:focus, -.btn-template-transparent-black[disabled]:focus, -fieldset[disabled] .btn-template-transparent-black:focus, -.btn-template-transparent-black.disabled:active, -.btn-template-transparent-black[disabled]:active, -fieldset[disabled] .btn-template-transparent-black:active, -.btn-template-transparent-black.disabled.active, -.btn-template-transparent-black[disabled].active, -fieldset[disabled] .btn-template-transparent-black.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active { - background: #fff; - color: #000; - border-color: #fff; -} -.btn-template-primary { - color: #ffffff; - background-color: #c27baa; - border-color: #c27baa; -} -.btn-template-primary:hover, -.btn-template-primary:focus, -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - color: #ffffff; - background-color: #b25894; - border-color: #af518f; -} -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - background-image: none; -} -.btn-template-primary.disabled, -.btn-template-primary[disabled], -fieldset[disabled] .btn-template-primary, -.btn-template-primary.disabled:hover, -.btn-template-primary[disabled]:hover, -fieldset[disabled] .btn-template-primary:hover, -.btn-template-primary.disabled:focus, -.btn-template-primary[disabled]:focus, -fieldset[disabled] .btn-template-primary:focus, -.btn-template-primary.disabled:active, -.btn-template-primary[disabled]:active, -fieldset[disabled] .btn-template-primary:active, -.btn-template-primary.disabled.active, -.btn-template-primary[disabled].active, -fieldset[disabled] .btn-template-primary.active { - background-color: #c27baa; - border-color: #c27baa; -} -.btn-template-primary .badge { - color: #c27baa; - background-color: #ffffff; -} -#intro { - background: url('../img/home.jpg') no-repeat center top; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} -#intro .item { - font-family: "Roboto", Helvetica, Arial, sans-serif; - height: 100%; -} -#intro .item h1 { - text-transform: uppercase; - font-size: 50px; - color: #fff; - margin-bottom: 40px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #intro .item h1 { - font-size: 40px; - } -} -@media (max-width: 767px) { - #intro .item h1 { - font-size: 25px; - } -} -#intro .item h3 { - color: #fff; - margin-bottom: 40px; -} -@media (max-width: 767px) { - #intro .item h3 { - font-size: 15px; - margin-bottom: 20px; - } -} -#intro .item .btn { - text-transform: none; -} -@media (max-width: 991px) { - #intro .item .btn { - font-size: 14px; - } -} -@media (max-width: 991px) { - #intro .item .carousel-caption { - left: 10%; - right: 10%; - } -} -#intro .container, -#intro .row { - height: 100%; - position: relative; -} -.jumbotron { - padding: 30px; - margin-bottom: 0; - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.jumbotron .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #c27baa; - opacity: 0.9; - filter: alpha(opacity=90); -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3, -.jumbotron p, -.jumbotron ul { - color: #fff; -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3 { - color: #ffffff; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.jumbotron p { - margin-bottom: 20px; - font-size: 21px; - font-weight: 400; -} -.jumbotron p.text-uppercase { - font-weight: 700; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 0; -} -.jumbotron .container { - max-width: 100%; - z-index: 2; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 46px; - } -} -#categoryMenu h3 { - padding: 20px; - background: #f7f7f7; - margin: 0; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.panel.sidebar-menu h3 { - padding: 5px 0; - margin: 0; -} -.panel.sidebar-menu { - background: #fff; - margin: 0 0 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.panel.sidebar-menu .panel-heading { - text-transform: uppercase; - margin-bottom: 10px; - background: none; - padding: 0; - letter-spacing: 0.08em; - border-bottom: none; -} -.panel.sidebar-menu .panel-heading h1, -.panel.sidebar-menu .panel-heading h2, -.panel.sidebar-menu .panel-heading h3, -.panel.sidebar-menu .panel-heading h4, -.panel.sidebar-menu .panel-heading h5 { - display: inline-block; - border-bottom: solid 5px #c27baa; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; -} -.panel.sidebar-menu .panel-heading .btn.btn-danger { - color: #fff; - margin-top: 5px; -} -.panel.sidebar-menu .panel-body { - padding: 0; -} -.panel.sidebar-menu .panel-body span.colour { - display: inline-block; - width: 15px; - height: 15px; - border: solid 1px #555555; - vertical-align: top; - margin-top: 2px; - margin-left: 5px; -} -.panel.sidebar-menu .panel-body span.colour.white { - background: #fff; -} -.panel.sidebar-menu .panel-body span.colour.red { - background: red; -} -.panel.sidebar-menu .panel-body span.colour.green { - background: green; -} -.panel.sidebar-menu .panel-body span.colour.blue { - background: blue; -} -.panel.sidebar-menu .panel-body span.colour.yellow { - background: yellow; -} -.panel.sidebar-menu .panel-body label { - color: #999999; - font-size: 12px; -} -.panel.sidebar-menu .panel-body label:hover { - color: #555555; -} -.panel.sidebar-menu ul.nav.category-menu { - margin-bottom: 20px; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.08em; -} -.panel.sidebar-menu ul.nav.category-menu li a { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.panel.sidebar-menu ul.nav ul { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.nav ul li { - display: block; -} -.panel.sidebar-menu ul.nav ul li a { - position: relative; - font-family: "Times New Roman", Times, serif; - font-weight: normal; - text-transform: none !important; - display: block; - padding: 10px 15px; - padding-left: 30px; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.nav ul li a:hover, -.panel.sidebar-menu ul.nav ul li a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.panel.sidebar-menu ul.tag-cloud { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.tag-cloud li { - display: inline-block; -} -.panel.sidebar-menu ul.tag-cloud li a { - display: inline-block; - padding: 5px; - border: solid 1px #eeeeee; - border-radius: 0; - color: #c27baa; - margin: 5px 5px 5px 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 700; - font-size: 12px; -} -.panel.sidebar-menu ul.tag-cloud li a:hover { - color: #c27baa; - text-decoration: none; - border-color: #c27baa; -} -.panel.sidebar-menu ul.popular, -.panel.sidebar-menu ul.recent { - list-style: none; - padding-left: 0; - padding: 20px 0; -} -.panel.sidebar-menu ul.popular li, -.panel.sidebar-menu ul.recent li { - margin-bottom: 10px; - padding: 5px 0; - border-bottom: dotted 1px #eeeeee; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li img, -.panel.sidebar-menu ul.recent li img { - width: 50px; - margin-right: 10px; -} -.panel.sidebar-menu ul.popular li h5, -.panel.sidebar-menu ul.recent li h5 { - margin: 0 0 10px; -} -.panel.sidebar-menu ul.popular li h5 a, -.panel.sidebar-menu ul.recent li h5 a { - font-weight: normal; -} -.panel.sidebar-menu ul.popular li p.date, -.panel.sidebar-menu ul.recent li p.date { - float: right; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.popular li:last-child, -.panel.sidebar-menu ul.recent li:last-child { - border-bottom: none; -} -.panel.sidebar-menu .text-widget { - font-size: 12px; -} -.panel.sidebar-menu.with-icons ul.nav li a:after { - font-family: 'FontAwesome'; - content: "\f105"; - position: relative; - top: 0; - float: right; -} -/* ribbons for product sales etc. */ -.ribbon { - position: absolute; - top: 50px; - padding-left: 51px; - font-weight: 700; - letter-spacing: 0.08em; -} -.ribbon .ribbon-background { - position: absolute; - top: 0; - right: 0; -} -.ribbon .theribbon { - position: relative; - width: 80px; - padding: 6px 20px 6px 20px; - margin: 30px 10px 10px -71px; - color: #fff; - background-color: #c27baa; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.ribbon .theribbon:before, -.ribbon .theribbon:after { - content: ' '; - position: absolute; - width: 0; - height: 0; -} -.ribbon .theribbon:after { - left: 0px; - top: 100%; - border-width: 5px 10px; - border-style: solid; - border-color: #000000 #000000 transparent transparent; -} -.ribbon.sale { - top: 0; -} -.ribbon.new { - top: 50px; -} -.ribbon.new .theribbon { - background-color: #5bc0de; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.new .theribbon:after { - border-color: #2390b0 #2390b0 transparent transparent; -} -.ribbon.gift { - top: 100px; -} -.ribbon.gift .theribbon { - background-color: #5cb85c; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.gift .theribbon:after { - border-color: #357935 #357935 transparent transparent; -} -.owl-carousel .owl-controls .owl-page.active span, -.owl-theme .owl-controls .owl-page.active span, -.owl-carousel .owl-controls.clickable .owl-page:hover span, -.owl-theme .owl-controls.clickable .owl-page:hover span { - background: #c27baa; -} -.owl-carousel .owl-controls .owl-buttons, -.owl-theme .owl-controls .owl-buttons { - position: absolute; - top: 5px; - right: 0; -} -.owl-carousel .owl-controls .owl-buttons div, -.owl-theme .owl-controls .owl-buttons div { - width: 26px; - height: 26px; - line-height: 25px; - margin: 0 5px 0 0; - font-size: 18px; - color: #c27baa; - padding: 0; - background: #fff; - border-radius: 13px; - vertical-align: middle; - text-align: center; - opacity: 1; - filter: alpha(opacity=100); -} -.home-carousel { - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.home-carousel .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #c27baa; - opacity: 0.9; - filter: alpha(opacity=90); -} -.home-carousel .owl-carousel { - padding-top: 60px; - padding-bottom: 20px; -} -.home-carousel .owl-theme .owl-controls .owl-page span { - background: #666; -} -.home-carousel .owl-theme .owl-controls .owl-page.active span { - background: #fff; -} -.home-carousel .owl-theme .owl-controls .owl-page:hover span { - background: #fff; -} -@media (max-width: 767px) { - .home-carousel { - text-align: center !important; - } -} -@media (min-width: 992px) { - .home-carousel .right { - text-align: right; - } -} -.home-carousel h1, -.home-carousel h2, -.home-carousel h3, -.home-carousel p, -.home-carousel ul { - color: #fff; -} -.home-carousel h1 { - font-weight: 700; - text-transform: uppercase; - font-size: 46px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .home-carousel h1 { - font-size: 36px; - } -} -.home-carousel h2 { - font-weight: 700; - text-transform: uppercase; - font-size: 40px; - letter-spacing: 0.08em; -} -.home-carousel ul, -.home-carousel p { - font-size: 18px; - font-weight: 700; - padding: 0; - text-transform: uppercase; - letter-spacing: 0.10em; -} -@media (max-width: 991px) { - .home-carousel ul, - .home-carousel p { - font-size: 14px; - } -} -.home-carousel ul li { - margin-bottom: 10px; -} -.customers { - padding: 0; - margin-bottom: 40px; -} -.customers .item { - list-style-type: none; - text-align: center; - margin: 0 20px; -} -.customers .item img { - display: inline-block; - filter: url("data:image/svg+xml;utf8,#grayscale"); - /* Firefox 10+, Firefox on Android */ - filter: gray; - /* IE6-9 */ - -webkit-filter: grayscale(100%); - /* Chrome 19+, Safari 6+, Safari 6+ iOS */ - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.customers .item img:hover { - max-width: auto; - filter: none; - -webkit-filter: none; -} -.testimonials { - padding: 0; - margin-bottom: 40px; -} -.testimonials .item { - list-style-type: none; - margin: 0 5px; - background: #fff; - padding-bottom: 60px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.testimonials .item .testimonial { - position: relative; - padding: 20px; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial .text { - color: #999999; - margin-bottom: 40px; -} -.testimonials .item .testimonial .bottom { - position: absolute; - left: 0; - bottom: 0; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px; - height: 50px; -} -.testimonials .item .testimonial .bottom .icon { - color: #c27baa; - font-size: 30px; - float: left; - width: 20%; -} -.testimonials .item .testimonial .name-picture { - float: right; - width: 80%; - text-align: right; -} -.testimonials .item .testimonial .name-picture h5 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.testimonials .item .testimonial .name-picture p { - color: #999999; - margin: 0; - font-size: 12px; -} -.testimonials .item .testimonial .name-picture img { - float: right; - width: 60px; - border-radius: 30px; - margin-left: 10px; -} -.team-member { - text-align: center; - margin-bottom: 40px; -} -.team-member h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 5px; - letter-spacing: 0.08em; -} -.team-member h3 a { - color: #555555; -} -.team-member p.role { - color: #999999; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.team-member .social { - margin-bottom: 20px; -} -.team-member .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email { - background-color: #4a7f45; -} -.team-member .text p { - color: #999999; - font-size: 12px; -} -.team-member .social, -.team-member-detail .social { - margin-bottom: 20px; -} -.team-member .social a, -.team-member-detail .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i, -.team-member-detail .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook, -.team-member-detail .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus, -.team-member-detail .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter, -.team-member-detail .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram, -.team-member-detail .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email, -.team-member-detail .social a.email { - background-color: #4a7f45; -} -.box-simple { - text-align: center; - margin-bottom: 40px; -} -.box-simple .icon { - color: #c27baa; - border-color: #c27baa; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.box-simple h3 { - font-weight: normal; - font-size: 18px; - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-simple h3 a { - color: #555555; -} -.box-simple p { - color: #999999; -} -.box-simple:hover .icon { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.box-simple:hover .icon i { - -webkit-transform: scale(1, 1); - -ms-transform: scale(1, 1); - -o-transform: scale(1, 1); - transform: scale(1, 1); -} -.box-simple.box-white { - padding: 20px; - border: dotted 1px #999999; -} -.box-simple.box-white .icon { - color: #555555; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark { - padding: 20px; - border: dotted 1px #999999; - background: #555555; - color: #fff; -} -.box-simple.box-dark .icon { - color: #f7f7f7; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark h3 { - color: #fff; -} -.box-simple.box-dark h3 a { - color: #fff; -} -.box-simple.box-dark p { - color: #fff; -} -.box-image { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #c27baa; -} -.box-image .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -.box-image-text { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image-text .top { - position: relative; - margin-bottom: 10px; -} -.box-image-text .top .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #c27baa; -} -.box-image-text .top .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .top .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image-text .top .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image-text .top .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .content h3, -.box-image-text .content h4 { - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-image-text .content p { - color: #999999; -} -.box-image-text:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image-text:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image-text:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -/* universal box */ -.box { - background: #fff; - margin: 0 0 30px; - border: solid 1px #ccc; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px 0; - border-left: none; - border-right: none; -} -.box .box-header { - background: #f7f7f7; - margin: -20px 0 20px; - padding: 20px; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-footer { - background: #f7f7f7; - margin: 30px 0 -20px; - padding: 20px; - border-top: solid 1px #eeeeee; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -@media (max-width: 991px) { - .box .box-footer .btn { - margin-bottom: 20px; - } -} -.box.no-border { - border: none; -} -#heading-breadcrumbs { - background: url('../img/texture-bw.png') center center repeat; - padding: 20px 0; - margin-bottom: 40px; -} -#heading-breadcrumbs.no-mb { - margin-bottom: 0; -} -#heading-breadcrumbs h1 { - color: #333333; - text-transform: uppercase; - font-size: 30px; - font-weight: 700; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #heading-breadcrumbs h1 { - text-align: center; - } -} -#heading-breadcrumbs ul.breadcrumb { - margin-top: 5px; - margin-bottom: 0; -} -.bar { - position: relative; - background: #c27baa; - padding: 60px 0; -} -.bar.background-pentagon { - background: url('../img/texture-bw.png') center center repeat; - border-top: solid 1px #999999; - border-bottom: solid 1px #999999; -} -.bar.background-gray { - background: #eeeeee; -} -.bar.background-gray-dark { - background: #555555; -} -.bar.background-white { - background: #fff; -} -.bar.background-image-fixed-1 { - background: url('../img/fixed-background-1.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.background-image-fixed-2 { - background: url('../img/fixed-background-2.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.color-white h1, -.bar.color-white h2, -.bar.color-white h3, -.bar.color-white h4, -.bar.color-white h5, -.bar.color-white h6, -.bar.color-white p { - color: #fff; -} -.bar.padding-big { - padding: 50px 0; -} -.bar.padding-horizontal { - padding-left: 30px; - padding-right: 30px; -} -.bar.margin-vertical { - margin-top: 20px; - margin-bottom: 20px; -} -.bar .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #000; - opacity: 0.3; - filter: alpha(opacity=30); -} -.portfolio.no-space { - padding: 0 15px; -} -.portfolio.no-space .box-image { - margin: 0 -15px; -} -.portfolio-project .project-more h4 { - color: #555555; - text-transform: uppercase; - margin-bottom: 0; - text-align: left; - font-size: 14px; - letter-spacing: 0.08em; -} -.portfolio-project .project-more p { - color: #999999; - padding: 10px 0; - margin-bottom: 20px; - text-align: left; -} -.portfolio-showcase { - margin: 15px 0 60px; -} -.portfolio-showcase h3 a { - text-transform: uppercase; - line-height: 1.5; - letter-spacing: 0.08em; -} -.portfolio-showcase p.lead { - color: #555555; - margin-bottom: 20px; -} -.portfolio-showcase p { - color: #999999; -} -.portfolio-showcase p.buttons { - margin-top: 40px; -} -.see-more { - text-align: center; - margin-top: 20px; - padding-top: 20px; -} -.see-more p { - font-size: 28px; - font-weight: 100; - margin-bottom: 20px; -} -.showcase .item { - text-align: center; -} -.showcase .item .icon { - display: inline-block; - width: 50px; - height: 50px; - color: #555555; - line-height: 50px; - border-radius: 25px; - border: solid 1px #555555; -} -.showcase .item h4 { - color: #555555; - text-transform: uppercase; - letter-spacing: 0.08em; - line-height: 1.5; - font-size: 16px; -} -.showcase .item h4 span { - font-weight: bold; - font-size: 51px; -} -.packages .package { - background: #fff; - margin-top: 25px; - margin-bottom: 20px; - padding-bottom: 15px; - text-align: center; - border: solid 1px #c27baa; - overflow: hidden; -} -.packages .package .package-header { - height: 57px; - color: #fff; - line-height: 57px; - background: #c27baa; -} -.packages .package .package-header h5 { - color: #fff; - text-transform: uppercase; - font-weight: bold; - line-height: 57px; - margin: 0; - letter-spacing: 0.08em; -} -.packages .package .package-header.light-gray { - background: #eeeeee; -} -.packages .package .package-header.light-gray h5 { - color: #555555; -} -.packages .package .price { - line-height: 120px; - height: 100px; - color: #fff; - font-weight: 400; -} -.packages .package .price h4 { - display: inline; - font-size: 50px; - line-height: normal; - margin-bottom: 0; -} -.packages .package .price .period { - line-height: normal; - color: #999999; -} -.packages .package ul { - padding: 0; -} -.packages .package ul li { - list-style-type: none; - padding-top: 10px; - padding-bottom: 10px; - width: 80%; - margin: auto; - border-bottom: 1px dotted #ccc; -} -.packages .package ul li:last-child { - border-bottom: 0; -} -.packages .package ul li i { - font-size: 13px; - margin-right: 5px; -} -.packages .best-value .package { - margin-top: 0; - padding-bottom: 40px; -} -.packages .best-value .package .package-header { - height: 72px; - padding-top: 17px; - height: 82px !important; -} -.packages .best-value .package .package-header h5 { - font-weight: bold; - line-height: 29px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.packages .best-value .package .package-header .meta-text { - font-size: 13px; - line-height: 15px; -} -#map { - height: 300px; -} -#map.with-border { - border-top: solid 1px #c27baa; - border-bottom: solid 1px #c27baa; -} -#blog-listing-big .post, -#blog-homepage .post { - margin-bottom: 60px; -} -#blog-listing-big .post h2, -#blog-homepage .post h2, -#blog-listing-big .post h4, -#blog-homepage .post h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#blog-listing-big .post h2 a, -#blog-homepage .post h2 a, -#blog-listing-big .post h4 a, -#blog-homepage .post h4 a { - color: #555555; -} -#blog-listing-big .post h2 a:hover, -#blog-homepage .post h2 a:hover, -#blog-listing-big .post h4 a:hover, -#blog-homepage .post h4 a:hover { - color: #c27baa; -} -#blog-listing-big .post .author-category, -#blog-homepage .post .author-category { - color: #999999; - text-transform: uppercase; - font-weight: 300; - letter-spacing: 0.08em; -} -#blog-listing-big .post .author-category a, -#blog-homepage .post .author-category a { - font-weight: 500; -} -#blog-listing-big .post .date-comments a, -#blog-homepage .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-big .post .date-comments a:hover, -#blog-homepage .post .date-comments a:hover { - color: #c27baa; -} -@media (min-width: 768px) { - #blog-listing-big .post .date-comments, - #blog-homepage .post .date-comments { - text-align: right; - } -} -#blog-listing-big .post .intro, -#blog-homepage .post .intro { - text-align: left; -} -#blog-listing-big .post .image, -#blog-homepage .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-big .post .image img, -#blog-homepage .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-big .post .image img.img-responsive, - #blog-homepage .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-big .post .video, -#blog-homepage .post .video { - margin-bottom: 10px; -} -#blog-listing-big .post .read-more, -#blog-homepage .post .read-more { - text-align: right; -} -#blog-listing-medium .post { - margin-bottom: 60px; -} -#blog-listing-medium .post h2 { - text-transform: uppercase; - margin: 0 0 10px; - font-size: 24px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post h2 a { - color: #555555; -} -#blog-listing-medium .post h2 a:hover { - color: #c27baa; -} -#blog-listing-medium .post .author-category { - float: left; - color: #999999; - text-transform: uppercase; - font-weight: 300; - font-size: 12px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post .author-category a { - font-weight: 500; -} -#blog-listing-medium .post .date-comments { - float: right; - font-size: 12px; -} -#blog-listing-medium .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-medium .post .date-comments a:hover { - color: #c27baa; -} -@media (min-width: 768px) { - #blog-listing-medium .post .date-comments { - text-align: right; - } -} -#blog-listing-medium .post .intro { - text-align: left; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-medium .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-medium .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-medium .post .video { - margin-bottom: 10px; -} -#blog-listing-medium .post .read-more { - text-align: right; -} -.box-image-text.blog .author-category { - color: #999999; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 300; - font-size: 12px; -} -.box-image-text.blog .author-category a { - font-weight: 500; -} -.box-image-text.blog .intro { - text-align: left; - margin-bottom: 20px; -} -#blog-homepage .post { - margin-bottom: 30px; -} -#blog-homepage .post h2, -#blog-homepage .post h4, -#blog-homepage .post .author-category, -#blog-homepage .post .read-more { - text-align: center; -} -#blog-homepage .post .read-more { - margin-top: 20px; -} -#blog-post #post-content { - margin-bottom: 20px; -} -#blog-post .comment { - margin-bottom: 25px; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment .posted { - color: #999999; - font-size: 12px; -} -#blog-post .comment .reply { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#blog-post .comment.last { - margin-bottom: 0; -} -#blog-post #comments, -#blog-post #comment-form { - padding: 20px 0; - margin-top: 20px; - border-top: solid 1px #eeeeee; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments h4, -#blog-post #comment-form h4 { - margin-bottom: 20px; -} -#blog-post #comment-form { - margin-bottom: 20px; -} -.product { - background: #fff; - border-bottom: solid 1px #e6e6e6; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 60px; - overflow: hidden; - text-align: center; -} -.product .image { - overflow: hidden; -} -.product .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .product .image img.img-responsive { - min-width: 100%; - } -} -.product .text { - padding: 10px; -} -.product .text h3 { - font-size: 14px; - font-weight: 700; - height: 39.6px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.product .text h3 a { - color: #555555; -} -.product .text h3 a:hover { - text-decoration: none; -} -.product .text p.price { - font-size: 18px; -} -.product .text p.price del { - color: #999999; -} -.product .buttons { - clear: both; - position: absolute; - display: none; - bottom: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - border: solid 1px transparent; - padding: 20px; - background: rgba(255, 255, 255, 0.9); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - text-align: center; -} -.product .buttons .btn { - margin-bottom: 20px; -} -.product:hover { - border-bottom: solid 1px #808080; - top: 0; -} -.product:hover .buttons { - clear: both; - position: absolute; - top: 0; - background: rgba(255, 255, 255, 0.5); -} -.product:hover .image img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.goToDescription { - font-size: 12px; - text-align: center; - margin-bottom: 40px; -} -.goToDescription a { - color: #999999; - text-decoration: underline; -} -#productMain { - margin-bottom: 30px; -} -#productMain .sizes { - text-align: center; -} -#productMain .sizes h3 { - font-weight: 700; - letter-spacing: 0.08em; - text-transform: uppercase; - margin-bottom: 40px; -} -#productMain .sizes a { - display: inline-block; - width: 40px; - height: 40px; - border-radius: 40px; - background: #ccc; - line-height: 40px; - color: #555555; - text-align: center; - text-decoration: none; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#productMain .sizes a.active, -#productMain .sizes a:hover { - background: #c27baa; - color: #fff; -} -#productMain .sizes input { - display: none; -} -#productMain .price { - font-size: 40px; - text-align: center; - margin-top: 40px; - margin-bottom: 40px; -} -#thumbs a { - display: block; - border: solid 1px transparent; -} -#thumbs a.active { - border-color: #c27baa; -} -#product-social { - text-align: center; -} -#product-social h4 { - font-weight: 300; - margin-bottom: 10px; -} -#product-social p { - line-height: 26px; -} -#product-social p a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -#product-social p a i { - vertical-align: bottom; - line-height: 26px; -} -#product-social p a.facebook { - background-color: #4460ae; -} -#product-social p a.gplus { - background-color: #c21f25; -} -#product-social p a.twitter { - background-color: #3cf; -} -#product-social p a.instagram { - background-color: #cd4378; -} -#product-social p a.email { - background-color: #4a7f45; -} -@media (max-width: 991px) { - #product-social { - text-align: center; - } -} -#checkout .nav { - margin-bottom: 20px; - border-bottom: solid 1px #c27baa; -} -#checkout .nav li { - height: 100%; -} -#checkout .nav li a { - display: block; - height: 100%; -} -#order-summary table { - margin-top: 20px; -} -#order-summary table td { - color: #999999; -} -#order-summary table tr.total td, -#order-summary table tr.total th { - font-size: 18px; - color: #555555; - font-weight: 700; -} -#checkout .table tbody tr td, -#basket .table tbody tr td, -#customer-order .table tbody tr td { - vertical-align: middle; -} -#checkout .table tbody tr td input, -#basket .table tbody tr td input, -#customer-order .table tbody tr td input { - width: 50px; - text-align: right; -} -#checkout .table tbody tr td img, -#basket .table tbody tr td img, -#customer-order .table tbody tr td img { - width: 50px; -} -#checkout .table tfoot, -#basket .table tfoot, -#customer-order .table tfoot { - font-size: 18px; -} -.shipping-method h4, -.payment-method h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#customer-orders table tr th, -#customer-orders table tr td { - vertical-align: baseline; -} -#customer-order .table tfoot th { - font-size: 18px; - font-weight: 300; -} -#customer-order .addresses { - text-align: right; - margin-bottom: 30px; -} -#customer-order .addresses p { - font-size: 18px; - font-weight: 300; -} -#customer-account { - margin-bottom: 30px; -} -#get-it { - background: #c27baa; - padding: 50px 0 30px; - color: #fff; - text-align: center; -} -#get-it h1, -#get-it h2, -#get-it h3, -#get-it h4, -#get-it h5, -#get-it h6 { - color: #fff; - text-transform: uppercase; - letter-spacing: 0.08em; - margin: 0 0 20px; -} -#get-it p { - margin: 0 0 20px; -} -#footer { - background: #555555; - padding: 50px 0; - color: #999999; -} -#footer h1, -#footer h2, -#footer h3, -#footer h4, -#footer h5, -#footer h6 { - color: #eeeeee; -} -#footer h4 { - font-size: 14px; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.08em; -} -#footer ul { - padding-left: 0; - list-style: none; -} -#footer ul a { - color: #999999; -} -#footer ul a:hover { - color: #c27baa; - text-decoration: none; -} -#footer .photostream div { - float: left; - display: block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 33%; - padding: 7.5px; - overflow: hidden; -} -#footer .photostream div a { - border: solid 1 px #eeeeee; -} -#footer .photostream div img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -#footer .photostream div:hover img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -#footer .blog-entries .item { - clear: both; - padding: 5px 0; - margin-bottom: 10px; - border-bottom: solid 1px #555555; -} -#footer .blog-entries .item .image { - float: left; - width: 15%; - margin-right: 10px; -} -#footer .blog-entries .item .name { - width: 75%; - margin-left: 10px; - display: table-cell; - vertical-align: middle; -} -#footer .blog-entries .item .name h5 { - margin: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-size: 12px; -} -#footer .blog-entries .item .name h5 a { - color: #eeeeee; -} -#footer .blog-entries .item .text { - width: 100%; - clear: both; -} -#footer .blog-entries .item:last-child { - border-bottom: none; - margin-bottom: 0; -} -#footer .social a { - color: #555555; - font-size: 25px; - margin: 0 10px 0 0; -} -#footer .social a:hover { - color: #c27baa; -} -#copyright { - background: #333; - color: #ccc; - padding: 50px 0; - font-size: 12px; - line-height: 28px; -} -#copyright p { - margin: 0; -} -@media (max-width: 991px) { - #copyright p { - float: none !important; - text-align: center; - margin-bottom: 10px; - } -} -[data-animate] { - opacity: 0; - filter: alpha(opacity=0); -} -#style-switch-button { - position: fixed; - top: 100px; - left: 0px; - border-radius: 0; -} -#style-switch { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 300px; - padding: 20px; - position: fixed; - top: 140px; - left: 0; - background: #fff; - border: solid 1px #eeeeee; -} -@media (max-width: 991px) { - #style-switch-button { - display: none; - } - #style-switch { - display: none; - } -} -/* Original Boostrap template overwrite */ -/* breadcrumbs */ -.breadcrumb { - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - background-color: none; - letter-spacing: 0.08em; -} -/* nav */ -.nav > li > a { - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #999999; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #c27baa; -} -.nav-tabs { - border-bottom: 1px solid #c27baa; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 0 0 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #c27baa; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - background-color: #ffffff; - border: 1px solid #c27baa; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: solid 1px #c27baa; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #c27baa; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #c27baa; - border-radius: 0 0 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 0; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #c27baa; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; - border-bottom: solid 1px #c27baa; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #c27baa; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #c27baa; - border-radius: 0 0 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.tab-content { - padding: 15px; - border: solid 1px #ddd; - border-top: none; -} -/* navbar */ -.navbar { - position: relative; - min-height: 62px; - margin-bottom: 0; - border-bottom: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 0px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-affixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-affixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - padding: 10px 15px; - font-size: 18px; - line-height: 20px; - height: 62px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 14px; - margin-bottom: 14px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 0; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-nav { - margin: 10.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 21px; - padding-bottom: 21px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 14px; - margin-bottom: 14px; -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-btn.btn-sm { - margin-top: 16px; - margin-bottom: 16px; -} -.navbar-btn.btn-xs { - margin-top: 20px; - margin-bottom: 20px; -} -.navbar-text { - margin-top: 21px; - margin-bottom: 21px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #ffffff; - border-color: #cccccc; - border-bottom: none; -} -.navbar-default .navbar-brand { - color: #555555; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #3b3b3b; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777777; -} -.navbar-default .navbar-nav > li > a { - color: #555555; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #555555; - background-color: #e2c1d7; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #c27baa; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #dddddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #c27baa; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #cccccc; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - background-color: #c27baa; - color: #ffffff; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #555555; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #c27baa; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #c27baa; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #555555; -} -.navbar-default .navbar-link:hover { - color: #555555; -} -.navbar-default .btn-link { - color: #555555; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #555555; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; -} -/* scaffolding */ -body { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #555555; -} -a { - color: #c27baa; - text-decoration: none; -} -a:hover, -a:focus { - color: #a44c87; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.img-rounded { - border-radius: 0; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} -/* breadcrumbs */ -.breadcrumb { - padding: 20px 0; - margin-bottom: 20px; - background-color: transparent; - border-radius: 0; - text-align: right; -} -.breadcrumb > li + li:before { - content: ">\00a0"; - color: #555555; -} -.breadcrumb > .active { - color: #999999; -} -@media (max-width: 991px) { - .breadcrumb { - padding: 20px 0; - text-align: center; - } -} -/* dropdowns */ -.dropdown-menu { - z-index: 1000; - font-size: 14px; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - padding: 5px 20px; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; -} -/* labels */ -.label { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: normal; - text-transform: uppercase; - letter-spacing: 0.08em; -} -/* forms.less */ -label { - font-weight: normal; -} -.form-control { - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 0; -} -.form-control:focus { - border-color: #c27baa; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(194, 123, 170, 0.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(194, 123, 170, 0.6); -} -.form-group { - margin-bottom: 20px; -} -/* pager*/ -.pager { - margin: 20px 0; - border-top: solid 1px #eeeeee; - padding-top: 20px; - text-transform: uppercase; - letter-spacing: 0.08em; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - background-color: #ffffff; - border: 1px solid #c27baa; - border-radius: 0; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - color: #fff; - background-color: #c27baa; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - background-color: #ffffff; - border-color: #ddd; -} -/* pagination */ -.pagination { - margin: 20px 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - border-radius: 0; -} -.pagination > li > a, -.pagination > li > span { - padding: 6px 12px; - line-height: 1.42857143; - text-decoration: none; - color: #c27baa; - background-color: #ffffff; - border: 1px solid #dddddd; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #c27baa; - background-color: #f2e4ed; - border-color: #dddddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - background-color: #c27baa; - border-color: #c27baa; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - background-color: #ffffff; - border-color: #dddddd; -} -/* responsive utilities */ -@media (max-width: 767px) { - .text-center-xs { - text-align: center !important; - } - .text-center-xs img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .text-center-sm { - text-align: center !important; - } - .text-center-sm img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -/* type */ -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 900; - line-height: 1.1; - color: #333333; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 20px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 18px; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -.text-small { - font-size: 12px; -} -.text-large { - font-size: 18px; -} -.text-italic { - font-style: italic; -} -.text-primary { - color: #c27baa; -} -a.text-primary:hover { - color: #b25894; -} -.bg-primary { - color: #fff; - background-color: #c27baa; -} -a.bg-primary:hover { - background-color: #b25894; -} -abbr[title], -abbr[data-original-title] { - border-bottom: 1px dotted #999999; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 14px; - border-left: 5px solid #c27baa; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #999999; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - border-right: 5px solid #c27baa; -} -address { - margin-bottom: 20px; - line-height: 1.42857143; -} -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 0; - -webkit-box-shadow: 0 0 0; - box-shadow: 0 0 0; -} -.panel-heading { - border-top-right-radius: 0; - border-top-left-radius: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 15px 15px; -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 0; - overflow: hidden; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group.accordion .panel { - border-color: #ccc; -} -.panel-primary { - border-color: #c27baa; -} -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #c27baa; - border-color: #c27baa; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #c27baa; -} -.panel-primary > .panel-heading .badge { - color: #c27baa; - background-color: #ffffff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #c27baa; -} -.panel-primary .panel-title { - font-weight: 300; -} -.panel-primary .panel-title a:hover { - color: #fff; - text-decoration: none; -} -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #c27baa; - background-color: #ffffff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.progress-bar-primary { - background-color: #c27baa; -} -.progress-striped .progress-bar-primary { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -/*! - * Yamm!3 - Yet another megamenu for Bootstrap 3 - * http://geedmo.github.com/yamm3 - * - * @geedmo - Licensed under the MIT license - */ -.yamm .nav, -.yamm .collapse, -.yamm .dropup.use-yamm, -.yamm .dropdown.use-yamm { - position: static; -} -.yamm .container { - position: relative; -} -.yamm .dropdown-menu { - left: auto; -} -.yamm .nav.navbar-right .dropdown-menu { - left: auto; - right: 0; -} -.yamm .yamm-content { - padding: 20px 30px; -} -.yamm .dropdown.yamm-fw .dropdown-menu { - left: 15px; - right: 15px; -} diff --git a/css/style.red.css b/css/style.red.css deleted file mode 100644 index f328ee6..0000000 --- a/css/style.red.css +++ /dev/null @@ -1,3557 +0,0 @@ -.clearfix:before, -.clearfix:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after { - content: " "; - display: table; -} -.clearfix:after, -.navbar:after, -.navbar-header:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -/* general styles */ -a, -button { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -a i.fa, -button i.fa { - margin: 0 5px; -} -.clickable { - cursor: pointer !important; -} -.required { - color: #da4d4d; -} -.accent { - color: #da4d4d; -} -.text-uppercase { - text-transform: uppercase; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .text-center-sm { - text-align: center; - } -} -p.lead { - margin-bottom: 40px; -} -section, -div.section { - margin-bottom: 40px; -} -.no-mb { - margin-bottom: 0 !important; -} -.mb-small { - margin-bottom: 20px !important; -} -.heading { - margin-bottom: 40px; -} -.heading h1, -.heading h2, -.heading h3, -.heading h4, -.heading h5 { - display: inline-block; - border-bottom: solid 5px #da4d4d; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; - vertical-align: middle; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.heading h1 i.fa, -.heading h2 i.fa, -.heading h3 i.fa, -.heading h4 i.fa, -.heading h5 i.fa { - display: inline-block; - background: #da4d4d; - width: 30px; - height: 30px; - vertical-align: middle; - text-align: center; - color: #fff; - font-size: 12px; - line-height: 30px; - border-radius: 15px; -} -.icon { - display: inline-block; - width: 80px; - height: 80px; - color: #fff; - line-height: 80px; - border-radius: 40px; - border: solid 1px #fff; - font-size: 20px; -} -.icon.icon-lg { - font-size: 30px; - border-width: 2px; -} -.ul-icons { - padding-left: 10px; -} -.ul-icons li { - list-style-type: none; - line-height: 20px; - margin-bottom: 20px; -} -.ul-icons li i { - width: 20px; - height: 20px; - background: #da4d4d; - color: #fff; - text-align: center; - border-radius: 10px; - line-height: 20px; - margin-right: 10px; -} -ul.list-style-none { - list-style: none; -} -#text-page h1, -#text-page h2, -#text-page h3 { - font-weight: 700; -} -#error-page { - text-align: center; - margin-top: 40px; - margin-bottom: 100px; -} -#error-page h4 { - margin-bottom: 40px; -} -#error-page p.buttons { - margin-top: 40px; -} -.pages-listing .item { - text-align: center; -} -.pages-listing .item h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 20px; - letter-spacing: 0.08em; -} -.pages-listing .item h3 a { - color: #555555; -} -.pages-listing .item .text { - margin-bottom: 20px; -} -.pages-listing .item .text p { - color: #999999; - font-size: 12px; - margin-bottom: 20px; -} -.banner { - margin-bottom: 30px; - text-align: center; -} -.banner img { - margin: 0 auto; -} -.banner a:hover img { - opacity: 0.8; - filter: alpha(opacity=80); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.pages { - text-align: center; -} -.pages .loadMore { - text-align: center; -} -.pages .pagination { - text-align: center; -} -.features-buttons button { - margin-bottom: 20px; -} -@media (min-width: 1300px) { - body.boxed { - background: url(https://www.toptal.com/designers/subtlepatterns/patterns/subtle_zebra_3d.png); - } - body.boxed #all { - position: relative; - background: #fff; - width: 1200px; - margin: 0 auto; - overflow: hidden; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - } -} -#top { - background: #555555; - color: #eeeeee; - padding: 10px 0; -} -#top p { - margin: 0; - font-size: 12px; -} -#top .social { - float: right; - text-align: right; -} -#top .social a { - color: #999999; - display: inline-block; - width: 24px; - height: 24px; - border-radius: 12px; - line-height: 20px; - font-size: 12px; - text-align: center; - vertical-align: bottom; -} -#top .social a:hover { - color: #fff; -} -#top .social a:hover.facebook { - background-color: #4460ae; -} -#top .social a:hover.gplus { - background-color: #c21f25; -} -#top .social a:hover.twitter { - background-color: #3cf; -} -#top .social a:hover.instagram { - background-color: #cd4378; -} -#top .social a:hover.email { - background-color: #4a7f45; -} -#top .login { - float: right; -} -#top .login a { - font-size: 12px; - color: #eeeeee; - margin-right: 15px; - text-decoration: none; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.10em; -} -@media (max-width: 767px) { - #top .login { - float: left; - } -} -#top.light { - background: #fff; - color: #999999; - border-bottom: solid 1px #eeeeee; -} -#top.light .login a { - color: #555555; -} -.navbar { - border: none; -} -.navbar ul.nav > li > a { - text-transform: uppercase; - text-decoration: underline; - font-weight: bold; - letter-spacing: 0.08em; - border-top: solid 5px transparent; -} -.navbar ul.nav > li > a:hover { - border-top: solid 5px #da4d4d; -} -.navbar ul.nav > li.active > a, -.navbar ul.nav > li.open > a { - text-decoration: none !important; - border-top: solid 5px #a02121; -} -@media (max-width: 768px) { - .navbar ul.nav > li.active > a, - .navbar ul.nav > li.open > a { - border-top-color: transparent; - } - .navbar ul.nav > li > a:hover { - border-top-color: transparent; - } -} -.navbar.navbar-light ul.nav > li.active > a { - border-top: solid 5px #a02121; - background: #fff !important; - color: #555555 !important; -} -.navbar.navbar-light ul.nav > li.active > a:hover { - border-top: solid 5px #a02121; -} -.navbar.navbar-light ul.nav > li > a:hover, -.navbar.navbar-light ul.nav > li.open > a:hover, -.navbar.navbar-light ul.nav > li > a:focus, -.navbar.navbar-light ul.nav > li.open > a:focus { - border-top: solid 5px #da4d4d; - background: #fff !important; - color: #555555 !important; -} -.navbar ul.dropdown-menu { - margin: 0; - padding: 0; -} -.navbar ul.dropdown-menu li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 4px 0; -} -.navbar ul.dropdown-menu li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - left: 0; -} -.navbar ul.dropdown-menu li a:hover { - color: #da4d4d; - text-decoration: none; - background: none; - left: 2px; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .navbar ul.dropdown-menu li a:hover { - left: 0; - } -} -.navbar .yamm-content h3 { - font-size: 18px; - text-transform: uppercase; - padding-bottom: 10px; - margin-top: 5px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -@media (max-width: 767px) { - .navbar .yamm-content h3 { - font-size: 14px; - } -} -.navbar .yamm-content h5 { - text-transform: uppercase; - padding-bottom: 10px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -.navbar .yamm-content ul { - margin: 0; - padding: 0; -} -.navbar .yamm-content ul li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - padding: 4px 0; -} -.navbar .yamm-content ul li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.navbar .yamm-content ul li a:hover { - color: #da4d4d; - text-decoration: none; - padding-left: 2px; -} -.navbar .yamm-content .banner { - margin-bottom: 10px; -} -.navbar .yamm-fw .dropdown-menu { - padding: 0; -} -.navbar .navbar-buttons { - float: right; -} -.navbar .navbar-buttons button, -.navbar .navbar-buttons a.btn, -.navbar .navbar-buttons .btn-default.navbar-toggle { - margin-top: 11px; - margin-bottom: 11px; - margin-left: 0; - margin-right: 5px; -} -.navbar .btn-default, -.navbar .btn-default.navbar-toggle { - color: #999999; - background-color: #fff; - margin-left: 7px; - margin-right: 0; -} -.navbar .btn-default:hover, -.navbar .btn-default.navbar-toggle:hover, -.navbar .btn-default:focus, -.navbar .btn-default.navbar-toggle:focus { - background-color: #fff; - border-color: #da4d4d; - color: #da4d4d; -} -.navbar #search { - clear: both; - border-top: solid 1px #da4d4d; - text-align: right; -} -.navbar #search form { - float: right; -} -.navbar #search form .input-group { - width: 500px; -} -@media (max-width: 768px) { - .navbar #search form .input-group { - width: 100%; - } -} -.navbar #basket-overview a { - margin-left: 7px; -} -.navbar-affixed-top { - top: -32px; -} -.navbar-affixed-top.affix-top { - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -.navbar-affixed-top.affix { - position: fixed; - width: 100%; - top: 0; - z-index: 1000; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -body.boxed .navbar-affixed-top.affix { - position: static; -} -#login-modal { - overflow: hidden; -} -#login-modal .modal-header h4 { - text-transform: uppercase; -} -#login-modal form { - margin-bottom: 20px; -} -#login-modal a { - color: #da4d4d; -} -#login-modal p { - font-weight: 300; - margin-bottom: 20px; - font-size: 13px; -} -/* buttons */ -.btn { - font-weight: 700; - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 6px 12px; - font-size: 13px; - line-height: 1.42857143; - border-radius: 0; -} -.input-group .btn { - font-size: 14px; -} -.btn-lg { - padding: 10px 16px; - font-size: 14px; - line-height: 1.33; - border-radius: 0; -} -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-template-main { - color: #da4d4d; - background-color: #ffffff; - border-color: #da4d4d; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - color: #da4d4d; - background-color: #e6e6e6; - border-color: #c22828; -} -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - background-image: none; -} -.btn-template-main.disabled, -.btn-template-main[disabled], -fieldset[disabled] .btn-template-main, -.btn-template-main.disabled:hover, -.btn-template-main[disabled]:hover, -fieldset[disabled] .btn-template-main:hover, -.btn-template-main.disabled:focus, -.btn-template-main[disabled]:focus, -fieldset[disabled] .btn-template-main:focus, -.btn-template-main.disabled:active, -.btn-template-main[disabled]:active, -fieldset[disabled] .btn-template-main:active, -.btn-template-main.disabled.active, -.btn-template-main[disabled].active, -fieldset[disabled] .btn-template-main.active { - background-color: #ffffff; - border-color: #da4d4d; -} -.btn-template-main .badge { - color: #ffffff; - background-color: #da4d4d; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active { - background: #da4d4d; - color: #ffffff; - border-color: #da4d4d; -} -.btn-template-transparent-primary { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - background-image: none; -} -.btn-template-transparent-primary.disabled, -.btn-template-transparent-primary[disabled], -fieldset[disabled] .btn-template-transparent-primary, -.btn-template-transparent-primary.disabled:hover, -.btn-template-transparent-primary[disabled]:hover, -fieldset[disabled] .btn-template-transparent-primary:hover, -.btn-template-transparent-primary.disabled:focus, -.btn-template-transparent-primary[disabled]:focus, -fieldset[disabled] .btn-template-transparent-primary:focus, -.btn-template-transparent-primary.disabled:active, -.btn-template-transparent-primary[disabled]:active, -fieldset[disabled] .btn-template-transparent-primary:active, -.btn-template-transparent-primary.disabled.active, -.btn-template-transparent-primary[disabled].active, -fieldset[disabled] .btn-template-transparent-primary.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active { - background: #fff; - color: #da4d4d; - border-color: #fff; -} -.btn-template-transparent-black { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - background-image: none; -} -.btn-template-transparent-black.disabled, -.btn-template-transparent-black[disabled], -fieldset[disabled] .btn-template-transparent-black, -.btn-template-transparent-black.disabled:hover, -.btn-template-transparent-black[disabled]:hover, -fieldset[disabled] .btn-template-transparent-black:hover, -.btn-template-transparent-black.disabled:focus, -.btn-template-transparent-black[disabled]:focus, -fieldset[disabled] .btn-template-transparent-black:focus, -.btn-template-transparent-black.disabled:active, -.btn-template-transparent-black[disabled]:active, -fieldset[disabled] .btn-template-transparent-black:active, -.btn-template-transparent-black.disabled.active, -.btn-template-transparent-black[disabled].active, -fieldset[disabled] .btn-template-transparent-black.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active { - background: #fff; - color: #000; - border-color: #fff; -} -.btn-template-primary { - color: #ffffff; - background-color: #da4d4d; - border-color: #da4d4d; -} -.btn-template-primary:hover, -.btn-template-primary:focus, -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - color: #ffffff; - background-color: #ca2a2a; - border-color: #c22828; -} -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - background-image: none; -} -.btn-template-primary.disabled, -.btn-template-primary[disabled], -fieldset[disabled] .btn-template-primary, -.btn-template-primary.disabled:hover, -.btn-template-primary[disabled]:hover, -fieldset[disabled] .btn-template-primary:hover, -.btn-template-primary.disabled:focus, -.btn-template-primary[disabled]:focus, -fieldset[disabled] .btn-template-primary:focus, -.btn-template-primary.disabled:active, -.btn-template-primary[disabled]:active, -fieldset[disabled] .btn-template-primary:active, -.btn-template-primary.disabled.active, -.btn-template-primary[disabled].active, -fieldset[disabled] .btn-template-primary.active { - background-color: #da4d4d; - border-color: #da4d4d; -} -.btn-template-primary .badge { - color: #da4d4d; - background-color: #ffffff; -} -#intro { - background: url('../img/home.jpg') no-repeat center top; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} -#intro .item { - font-family: "Roboto", Helvetica, Arial, sans-serif; - height: 100%; -} -#intro .item h1 { - text-transform: uppercase; - font-size: 50px; - color: #fff; - margin-bottom: 40px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #intro .item h1 { - font-size: 40px; - } -} -@media (max-width: 767px) { - #intro .item h1 { - font-size: 25px; - } -} -#intro .item h3 { - color: #fff; - margin-bottom: 40px; -} -@media (max-width: 767px) { - #intro .item h3 { - font-size: 15px; - margin-bottom: 20px; - } -} -#intro .item .btn { - text-transform: none; -} -@media (max-width: 991px) { - #intro .item .btn { - font-size: 14px; - } -} -@media (max-width: 991px) { - #intro .item .carousel-caption { - left: 10%; - right: 10%; - } -} -#intro .container, -#intro .row { - height: 100%; - position: relative; -} -.jumbotron { - padding: 30px; - margin-bottom: 0; - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.jumbotron .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #da4d4d; - opacity: 0.9; - filter: alpha(opacity=90); -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3, -.jumbotron p, -.jumbotron ul { - color: #fff; -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3 { - color: #ffffff; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.jumbotron p { - margin-bottom: 20px; - font-size: 21px; - font-weight: 400; -} -.jumbotron p.text-uppercase { - font-weight: 700; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 0; -} -.jumbotron .container { - max-width: 100%; - z-index: 2; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 46px; - } -} -#categoryMenu h3 { - padding: 20px; - background: #f7f7f7; - margin: 0; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.panel.sidebar-menu h3 { - padding: 5px 0; - margin: 0; -} -.panel.sidebar-menu { - background: #fff; - margin: 0 0 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.panel.sidebar-menu .panel-heading { - text-transform: uppercase; - margin-bottom: 10px; - background: none; - padding: 0; - letter-spacing: 0.08em; - border-bottom: none; -} -.panel.sidebar-menu .panel-heading h1, -.panel.sidebar-menu .panel-heading h2, -.panel.sidebar-menu .panel-heading h3, -.panel.sidebar-menu .panel-heading h4, -.panel.sidebar-menu .panel-heading h5 { - display: inline-block; - border-bottom: solid 5px #da4d4d; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; -} -.panel.sidebar-menu .panel-heading .btn.btn-danger { - color: #fff; - margin-top: 5px; -} -.panel.sidebar-menu .panel-body { - padding: 0; -} -.panel.sidebar-menu .panel-body span.colour { - display: inline-block; - width: 15px; - height: 15px; - border: solid 1px #555555; - vertical-align: top; - margin-top: 2px; - margin-left: 5px; -} -.panel.sidebar-menu .panel-body span.colour.white { - background: #fff; -} -.panel.sidebar-menu .panel-body span.colour.red { - background: red; -} -.panel.sidebar-menu .panel-body span.colour.green { - background: green; -} -.panel.sidebar-menu .panel-body span.colour.blue { - background: blue; -} -.panel.sidebar-menu .panel-body span.colour.yellow { - background: yellow; -} -.panel.sidebar-menu .panel-body label { - color: #999999; - font-size: 12px; -} -.panel.sidebar-menu .panel-body label:hover { - color: #555555; -} -.panel.sidebar-menu ul.nav.category-menu { - margin-bottom: 20px; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.08em; -} -.panel.sidebar-menu ul.nav.category-menu li a { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.panel.sidebar-menu ul.nav ul { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.nav ul li { - display: block; -} -.panel.sidebar-menu ul.nav ul li a { - position: relative; - font-family: "Times New Roman", Times, serif; - font-weight: normal; - text-transform: none !important; - display: block; - padding: 10px 15px; - padding-left: 30px; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.nav ul li a:hover, -.panel.sidebar-menu ul.nav ul li a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.panel.sidebar-menu ul.tag-cloud { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.tag-cloud li { - display: inline-block; -} -.panel.sidebar-menu ul.tag-cloud li a { - display: inline-block; - padding: 5px; - border: solid 1px #eeeeee; - border-radius: 0; - color: #da4d4d; - margin: 5px 5px 5px 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 700; - font-size: 12px; -} -.panel.sidebar-menu ul.tag-cloud li a:hover { - color: #da4d4d; - text-decoration: none; - border-color: #da4d4d; -} -.panel.sidebar-menu ul.popular, -.panel.sidebar-menu ul.recent { - list-style: none; - padding-left: 0; - padding: 20px 0; -} -.panel.sidebar-menu ul.popular li, -.panel.sidebar-menu ul.recent li { - margin-bottom: 10px; - padding: 5px 0; - border-bottom: dotted 1px #eeeeee; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li img, -.panel.sidebar-menu ul.recent li img { - width: 50px; - margin-right: 10px; -} -.panel.sidebar-menu ul.popular li h5, -.panel.sidebar-menu ul.recent li h5 { - margin: 0 0 10px; -} -.panel.sidebar-menu ul.popular li h5 a, -.panel.sidebar-menu ul.recent li h5 a { - font-weight: normal; -} -.panel.sidebar-menu ul.popular li p.date, -.panel.sidebar-menu ul.recent li p.date { - float: right; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.popular li:last-child, -.panel.sidebar-menu ul.recent li:last-child { - border-bottom: none; -} -.panel.sidebar-menu .text-widget { - font-size: 12px; -} -.panel.sidebar-menu.with-icons ul.nav li a:after { - font-family: 'FontAwesome'; - content: "\f105"; - position: relative; - top: 0; - float: right; -} -/* ribbons for product sales etc. */ -.ribbon { - position: absolute; - top: 50px; - padding-left: 51px; - font-weight: 700; - letter-spacing: 0.08em; -} -.ribbon .ribbon-background { - position: absolute; - top: 0; - right: 0; -} -.ribbon .theribbon { - position: relative; - width: 80px; - padding: 6px 20px 6px 20px; - margin: 30px 10px 10px -71px; - color: #fff; - background-color: #da4d4d; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.ribbon .theribbon:before, -.ribbon .theribbon:after { - content: ' '; - position: absolute; - width: 0; - height: 0; -} -.ribbon .theribbon:after { - left: 0px; - top: 100%; - border-width: 5px 10px; - border-style: solid; - border-color: #000000 #000000 transparent transparent; -} -.ribbon.sale { - top: 0; -} -.ribbon.new { - top: 50px; -} -.ribbon.new .theribbon { - background-color: #5bc0de; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.new .theribbon:after { - border-color: #2390b0 #2390b0 transparent transparent; -} -.ribbon.gift { - top: 100px; -} -.ribbon.gift .theribbon { - background-color: #5cb85c; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.gift .theribbon:after { - border-color: #357935 #357935 transparent transparent; -} -.owl-carousel .owl-controls .owl-page.active span, -.owl-theme .owl-controls .owl-page.active span, -.owl-carousel .owl-controls.clickable .owl-page:hover span, -.owl-theme .owl-controls.clickable .owl-page:hover span { - background: #da4d4d; -} -.owl-carousel .owl-controls .owl-buttons, -.owl-theme .owl-controls .owl-buttons { - position: absolute; - top: 5px; - right: 0; -} -.owl-carousel .owl-controls .owl-buttons div, -.owl-theme .owl-controls .owl-buttons div { - width: 26px; - height: 26px; - line-height: 25px; - margin: 0 5px 0 0; - font-size: 18px; - color: #da4d4d; - padding: 0; - background: #fff; - border-radius: 13px; - vertical-align: middle; - text-align: center; - opacity: 1; - filter: alpha(opacity=100); -} -.home-carousel { - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.home-carousel .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #da4d4d; - opacity: 0.9; - filter: alpha(opacity=90); -} -.home-carousel .owl-carousel { - padding-top: 60px; - padding-bottom: 20px; -} -.home-carousel .owl-theme .owl-controls .owl-page span { - background: #666; -} -.home-carousel .owl-theme .owl-controls .owl-page.active span { - background: #fff; -} -.home-carousel .owl-theme .owl-controls .owl-page:hover span { - background: #fff; -} -@media (max-width: 767px) { - .home-carousel { - text-align: center !important; - } -} -@media (min-width: 992px) { - .home-carousel .right { - text-align: right; - } -} -.home-carousel h1, -.home-carousel h2, -.home-carousel h3, -.home-carousel p, -.home-carousel ul { - color: #fff; -} -.home-carousel h1 { - font-weight: 700; - text-transform: uppercase; - font-size: 46px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .home-carousel h1 { - font-size: 36px; - } -} -.home-carousel h2 { - font-weight: 700; - text-transform: uppercase; - font-size: 40px; - letter-spacing: 0.08em; -} -.home-carousel ul, -.home-carousel p { - font-size: 18px; - font-weight: 700; - padding: 0; - text-transform: uppercase; - letter-spacing: 0.10em; -} -@media (max-width: 991px) { - .home-carousel ul, - .home-carousel p { - font-size: 14px; - } -} -.home-carousel ul li { - margin-bottom: 10px; -} -.customers { - padding: 0; - margin-bottom: 40px; -} -.customers .item { - list-style-type: none; - text-align: center; - margin: 0 20px; -} -.customers .item img { - display: inline-block; - filter: url("data:image/svg+xml;utf8,#grayscale"); - /* Firefox 10+, Firefox on Android */ - filter: gray; - /* IE6-9 */ - -webkit-filter: grayscale(100%); - /* Chrome 19+, Safari 6+, Safari 6+ iOS */ - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.customers .item img:hover { - max-width: auto; - filter: none; - -webkit-filter: none; -} -.testimonials { - padding: 0; - margin-bottom: 40px; -} -.testimonials .item { - list-style-type: none; - margin: 0 5px; - background: #fff; - padding-bottom: 60px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.testimonials .item .testimonial { - position: relative; - padding: 20px; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial .text { - color: #999999; - margin-bottom: 40px; -} -.testimonials .item .testimonial .bottom { - position: absolute; - left: 0; - bottom: 0; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px; - height: 50px; -} -.testimonials .item .testimonial .bottom .icon { - color: #da4d4d; - font-size: 30px; - float: left; - width: 20%; -} -.testimonials .item .testimonial .name-picture { - float: right; - width: 80%; - text-align: right; -} -.testimonials .item .testimonial .name-picture h5 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.testimonials .item .testimonial .name-picture p { - color: #999999; - margin: 0; - font-size: 12px; -} -.testimonials .item .testimonial .name-picture img { - float: right; - width: 60px; - border-radius: 30px; - margin-left: 10px; -} -.team-member { - text-align: center; - margin-bottom: 40px; -} -.team-member h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 5px; - letter-spacing: 0.08em; -} -.team-member h3 a { - color: #555555; -} -.team-member p.role { - color: #999999; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.team-member .social { - margin-bottom: 20px; -} -.team-member .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email { - background-color: #4a7f45; -} -.team-member .text p { - color: #999999; - font-size: 12px; -} -.team-member .social, -.team-member-detail .social { - margin-bottom: 20px; -} -.team-member .social a, -.team-member-detail .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i, -.team-member-detail .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook, -.team-member-detail .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus, -.team-member-detail .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter, -.team-member-detail .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram, -.team-member-detail .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email, -.team-member-detail .social a.email { - background-color: #4a7f45; -} -.box-simple { - text-align: center; - margin-bottom: 40px; -} -.box-simple .icon { - color: #da4d4d; - border-color: #da4d4d; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.box-simple h3 { - font-weight: normal; - font-size: 18px; - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-simple h3 a { - color: #555555; -} -.box-simple p { - color: #999999; -} -.box-simple:hover .icon { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.box-simple:hover .icon i { - -webkit-transform: scale(1, 1); - -ms-transform: scale(1, 1); - -o-transform: scale(1, 1); - transform: scale(1, 1); -} -.box-simple.box-white { - padding: 20px; - border: dotted 1px #999999; -} -.box-simple.box-white .icon { - color: #555555; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark { - padding: 20px; - border: dotted 1px #999999; - background: #555555; - color: #fff; -} -.box-simple.box-dark .icon { - color: #f7f7f7; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark h3 { - color: #fff; -} -.box-simple.box-dark h3 a { - color: #fff; -} -.box-simple.box-dark p { - color: #fff; -} -.box-image { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #da4d4d; -} -.box-image .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -.box-image-text { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image-text .top { - position: relative; - margin-bottom: 10px; -} -.box-image-text .top .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #da4d4d; -} -.box-image-text .top .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .top .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image-text .top .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image-text .top .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .content h3, -.box-image-text .content h4 { - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-image-text .content p { - color: #999999; -} -.box-image-text:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image-text:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image-text:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -/* universal box */ -.box { - background: #fff; - margin: 0 0 30px; - border: solid 1px #ccc; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px 0; - border-left: none; - border-right: none; -} -.box .box-header { - background: #f7f7f7; - margin: -20px 0 20px; - padding: 20px; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-footer { - background: #f7f7f7; - margin: 30px 0 -20px; - padding: 20px; - border-top: solid 1px #eeeeee; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -@media (max-width: 991px) { - .box .box-footer .btn { - margin-bottom: 20px; - } -} -.box.no-border { - border: none; -} -#heading-breadcrumbs { - background: url('../img/texture-bw.png') center center repeat; - padding: 20px 0; - margin-bottom: 40px; -} -#heading-breadcrumbs.no-mb { - margin-bottom: 0; -} -#heading-breadcrumbs h1 { - color: #333333; - text-transform: uppercase; - font-size: 30px; - font-weight: 700; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #heading-breadcrumbs h1 { - text-align: center; - } -} -#heading-breadcrumbs ul.breadcrumb { - margin-top: 5px; - margin-bottom: 0; -} -.bar { - position: relative; - background: #da4d4d; - padding: 60px 0; -} -.bar.background-pentagon { - background: url('../img/texture-bw.png') center center repeat; - border-top: solid 1px #999999; - border-bottom: solid 1px #999999; -} -.bar.background-gray { - background: #eeeeee; -} -.bar.background-gray-dark { - background: #555555; -} -.bar.background-white { - background: #fff; -} -.bar.background-image-fixed-1 { - background: url('../img/fixed-background-1.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.background-image-fixed-2 { - background: url('../img/fixed-background-2.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.color-white h1, -.bar.color-white h2, -.bar.color-white h3, -.bar.color-white h4, -.bar.color-white h5, -.bar.color-white h6, -.bar.color-white p { - color: #fff; -} -.bar.padding-big { - padding: 50px 0; -} -.bar.padding-horizontal { - padding-left: 30px; - padding-right: 30px; -} -.bar.margin-vertical { - margin-top: 20px; - margin-bottom: 20px; -} -.bar .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #000; - opacity: 0.3; - filter: alpha(opacity=30); -} -.portfolio.no-space { - padding: 0 15px; -} -.portfolio.no-space .box-image { - margin: 0 -15px; -} -.portfolio-project .project-more h4 { - color: #555555; - text-transform: uppercase; - margin-bottom: 0; - text-align: left; - font-size: 14px; - letter-spacing: 0.08em; -} -.portfolio-project .project-more p { - color: #999999; - padding: 10px 0; - margin-bottom: 20px; - text-align: left; -} -.portfolio-showcase { - margin: 15px 0 60px; -} -.portfolio-showcase h3 a { - text-transform: uppercase; - line-height: 1.5; - letter-spacing: 0.08em; -} -.portfolio-showcase p.lead { - color: #555555; - margin-bottom: 20px; -} -.portfolio-showcase p { - color: #999999; -} -.portfolio-showcase p.buttons { - margin-top: 40px; -} -.see-more { - text-align: center; - margin-top: 20px; - padding-top: 20px; -} -.see-more p { - font-size: 28px; - font-weight: 100; - margin-bottom: 20px; -} -.showcase .item { - text-align: center; -} -.showcase .item .icon { - display: inline-block; - width: 50px; - height: 50px; - color: #555555; - line-height: 50px; - border-radius: 25px; - border: solid 1px #555555; -} -.showcase .item h4 { - color: #555555; - text-transform: uppercase; - letter-spacing: 0.08em; - line-height: 1.5; - font-size: 16px; -} -.showcase .item h4 span { - font-weight: bold; - font-size: 51px; -} -.packages .package { - background: #fff; - margin-top: 25px; - margin-bottom: 20px; - padding-bottom: 15px; - text-align: center; - border: solid 1px #da4d4d; - overflow: hidden; -} -.packages .package .package-header { - height: 57px; - color: #fff; - line-height: 57px; - background: #da4d4d; -} -.packages .package .package-header h5 { - color: #fff; - text-transform: uppercase; - font-weight: bold; - line-height: 57px; - margin: 0; - letter-spacing: 0.08em; -} -.packages .package .package-header.light-gray { - background: #eeeeee; -} -.packages .package .package-header.light-gray h5 { - color: #555555; -} -.packages .package .price { - line-height: 120px; - height: 100px; - color: #fff; - font-weight: 400; -} -.packages .package .price h4 { - display: inline; - font-size: 50px; - line-height: normal; - margin-bottom: 0; -} -.packages .package .price .period { - line-height: normal; - color: #999999; -} -.packages .package ul { - padding: 0; -} -.packages .package ul li { - list-style-type: none; - padding-top: 10px; - padding-bottom: 10px; - width: 80%; - margin: auto; - border-bottom: 1px dotted #ccc; -} -.packages .package ul li:last-child { - border-bottom: 0; -} -.packages .package ul li i { - font-size: 13px; - margin-right: 5px; -} -.packages .best-value .package { - margin-top: 0; - padding-bottom: 40px; -} -.packages .best-value .package .package-header { - height: 72px; - padding-top: 17px; - height: 82px !important; -} -.packages .best-value .package .package-header h5 { - font-weight: bold; - line-height: 29px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.packages .best-value .package .package-header .meta-text { - font-size: 13px; - line-height: 15px; -} -#map { - height: 300px; -} -#map.with-border { - border-top: solid 1px #da4d4d; - border-bottom: solid 1px #da4d4d; -} -#blog-listing-big .post, -#blog-homepage .post { - margin-bottom: 60px; -} -#blog-listing-big .post h2, -#blog-homepage .post h2, -#blog-listing-big .post h4, -#blog-homepage .post h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#blog-listing-big .post h2 a, -#blog-homepage .post h2 a, -#blog-listing-big .post h4 a, -#blog-homepage .post h4 a { - color: #555555; -} -#blog-listing-big .post h2 a:hover, -#blog-homepage .post h2 a:hover, -#blog-listing-big .post h4 a:hover, -#blog-homepage .post h4 a:hover { - color: #da4d4d; -} -#blog-listing-big .post .author-category, -#blog-homepage .post .author-category { - color: #999999; - text-transform: uppercase; - font-weight: 300; - letter-spacing: 0.08em; -} -#blog-listing-big .post .author-category a, -#blog-homepage .post .author-category a { - font-weight: 500; -} -#blog-listing-big .post .date-comments a, -#blog-homepage .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-big .post .date-comments a:hover, -#blog-homepage .post .date-comments a:hover { - color: #da4d4d; -} -@media (min-width: 768px) { - #blog-listing-big .post .date-comments, - #blog-homepage .post .date-comments { - text-align: right; - } -} -#blog-listing-big .post .intro, -#blog-homepage .post .intro { - text-align: left; -} -#blog-listing-big .post .image, -#blog-homepage .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-big .post .image img, -#blog-homepage .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-big .post .image img.img-responsive, - #blog-homepage .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-big .post .video, -#blog-homepage .post .video { - margin-bottom: 10px; -} -#blog-listing-big .post .read-more, -#blog-homepage .post .read-more { - text-align: right; -} -#blog-listing-medium .post { - margin-bottom: 60px; -} -#blog-listing-medium .post h2 { - text-transform: uppercase; - margin: 0 0 10px; - font-size: 24px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post h2 a { - color: #555555; -} -#blog-listing-medium .post h2 a:hover { - color: #da4d4d; -} -#blog-listing-medium .post .author-category { - float: left; - color: #999999; - text-transform: uppercase; - font-weight: 300; - font-size: 12px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post .author-category a { - font-weight: 500; -} -#blog-listing-medium .post .date-comments { - float: right; - font-size: 12px; -} -#blog-listing-medium .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-medium .post .date-comments a:hover { - color: #da4d4d; -} -@media (min-width: 768px) { - #blog-listing-medium .post .date-comments { - text-align: right; - } -} -#blog-listing-medium .post .intro { - text-align: left; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-medium .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-medium .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-medium .post .video { - margin-bottom: 10px; -} -#blog-listing-medium .post .read-more { - text-align: right; -} -.box-image-text.blog .author-category { - color: #999999; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 300; - font-size: 12px; -} -.box-image-text.blog .author-category a { - font-weight: 500; -} -.box-image-text.blog .intro { - text-align: left; - margin-bottom: 20px; -} -#blog-homepage .post { - margin-bottom: 30px; -} -#blog-homepage .post h2, -#blog-homepage .post h4, -#blog-homepage .post .author-category, -#blog-homepage .post .read-more { - text-align: center; -} -#blog-homepage .post .read-more { - margin-top: 20px; -} -#blog-post #post-content { - margin-bottom: 20px; -} -#blog-post .comment { - margin-bottom: 25px; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment .posted { - color: #999999; - font-size: 12px; -} -#blog-post .comment .reply { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#blog-post .comment.last { - margin-bottom: 0; -} -#blog-post #comments, -#blog-post #comment-form { - padding: 20px 0; - margin-top: 20px; - border-top: solid 1px #eeeeee; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments h4, -#blog-post #comment-form h4 { - margin-bottom: 20px; -} -#blog-post #comment-form { - margin-bottom: 20px; -} -.product { - background: #fff; - border-bottom: solid 1px #e6e6e6; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 60px; - overflow: hidden; - text-align: center; -} -.product .image { - overflow: hidden; -} -.product .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .product .image img.img-responsive { - min-width: 100%; - } -} -.product .text { - padding: 10px; -} -.product .text h3 { - font-size: 14px; - font-weight: 700; - height: 39.6px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.product .text h3 a { - color: #555555; -} -.product .text h3 a:hover { - text-decoration: none; -} -.product .text p.price { - font-size: 18px; -} -.product .text p.price del { - color: #999999; -} -.product .buttons { - clear: both; - position: absolute; - display: none; - bottom: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - border: solid 1px transparent; - padding: 20px; - background: rgba(255, 255, 255, 0.9); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - text-align: center; -} -.product .buttons .btn { - margin-bottom: 20px; -} -.product:hover { - border-bottom: solid 1px #808080; - top: 0; -} -.product:hover .buttons { - clear: both; - position: absolute; - top: 0; - background: rgba(255, 255, 255, 0.5); -} -.product:hover .image img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.goToDescription { - font-size: 12px; - text-align: center; - margin-bottom: 40px; -} -.goToDescription a { - color: #999999; - text-decoration: underline; -} -#productMain { - margin-bottom: 30px; -} -#productMain .sizes { - text-align: center; -} -#productMain .sizes h3 { - font-weight: 700; - letter-spacing: 0.08em; - text-transform: uppercase; - margin-bottom: 40px; -} -#productMain .sizes a { - display: inline-block; - width: 40px; - height: 40px; - border-radius: 40px; - background: #ccc; - line-height: 40px; - color: #555555; - text-align: center; - text-decoration: none; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#productMain .sizes a.active, -#productMain .sizes a:hover { - background: #da4d4d; - color: #fff; -} -#productMain .sizes input { - display: none; -} -#productMain .price { - font-size: 40px; - text-align: center; - margin-top: 40px; - margin-bottom: 40px; -} -#thumbs a { - display: block; - border: solid 1px transparent; -} -#thumbs a.active { - border-color: #da4d4d; -} -#product-social { - text-align: center; -} -#product-social h4 { - font-weight: 300; - margin-bottom: 10px; -} -#product-social p { - line-height: 26px; -} -#product-social p a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -#product-social p a i { - vertical-align: bottom; - line-height: 26px; -} -#product-social p a.facebook { - background-color: #4460ae; -} -#product-social p a.gplus { - background-color: #c21f25; -} -#product-social p a.twitter { - background-color: #3cf; -} -#product-social p a.instagram { - background-color: #cd4378; -} -#product-social p a.email { - background-color: #4a7f45; -} -@media (max-width: 991px) { - #product-social { - text-align: center; - } -} -#checkout .nav { - margin-bottom: 20px; - border-bottom: solid 1px #da4d4d; -} -#checkout .nav li { - height: 100%; -} -#checkout .nav li a { - display: block; - height: 100%; -} -#order-summary table { - margin-top: 20px; -} -#order-summary table td { - color: #999999; -} -#order-summary table tr.total td, -#order-summary table tr.total th { - font-size: 18px; - color: #555555; - font-weight: 700; -} -#checkout .table tbody tr td, -#basket .table tbody tr td, -#customer-order .table tbody tr td { - vertical-align: middle; -} -#checkout .table tbody tr td input, -#basket .table tbody tr td input, -#customer-order .table tbody tr td input { - width: 50px; - text-align: right; -} -#checkout .table tbody tr td img, -#basket .table tbody tr td img, -#customer-order .table tbody tr td img { - width: 50px; -} -#checkout .table tfoot, -#basket .table tfoot, -#customer-order .table tfoot { - font-size: 18px; -} -.shipping-method h4, -.payment-method h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#customer-orders table tr th, -#customer-orders table tr td { - vertical-align: baseline; -} -#customer-order .table tfoot th { - font-size: 18px; - font-weight: 300; -} -#customer-order .addresses { - text-align: right; - margin-bottom: 30px; -} -#customer-order .addresses p { - font-size: 18px; - font-weight: 300; -} -#customer-account { - margin-bottom: 30px; -} -#get-it { - background: #da4d4d; - padding: 50px 0 30px; - color: #fff; - text-align: center; -} -#get-it h1, -#get-it h2, -#get-it h3, -#get-it h4, -#get-it h5, -#get-it h6 { - color: #fff; - text-transform: uppercase; - letter-spacing: 0.08em; - margin: 0 0 20px; -} -#get-it p { - margin: 0 0 20px; -} -#footer { - background: #555555; - padding: 50px 0; - color: #999999; -} -#footer h1, -#footer h2, -#footer h3, -#footer h4, -#footer h5, -#footer h6 { - color: #eeeeee; -} -#footer h4 { - font-size: 14px; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.08em; -} -#footer ul { - padding-left: 0; - list-style: none; -} -#footer ul a { - color: #999999; -} -#footer ul a:hover { - color: #da4d4d; - text-decoration: none; -} -#footer .photostream div { - float: left; - display: block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 33%; - padding: 7.5px; - overflow: hidden; -} -#footer .photostream div a { - border: solid 1 px #eeeeee; -} -#footer .photostream div img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -#footer .photostream div:hover img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -#footer .blog-entries .item { - clear: both; - padding: 5px 0; - margin-bottom: 10px; - border-bottom: solid 1px #555555; -} -#footer .blog-entries .item .image { - float: left; - width: 15%; - margin-right: 10px; -} -#footer .blog-entries .item .name { - width: 75%; - margin-left: 10px; - display: table-cell; - vertical-align: middle; -} -#footer .blog-entries .item .name h5 { - margin: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-size: 12px; -} -#footer .blog-entries .item .name h5 a { - color: #eeeeee; -} -#footer .blog-entries .item .text { - width: 100%; - clear: both; -} -#footer .blog-entries .item:last-child { - border-bottom: none; - margin-bottom: 0; -} -#footer .social a { - color: #555555; - font-size: 25px; - margin: 0 10px 0 0; -} -#footer .social a:hover { - color: #da4d4d; -} -#copyright { - background: #333; - color: #ccc; - padding: 50px 0; - font-size: 12px; - line-height: 28px; -} -#copyright p { - margin: 0; -} -@media (max-width: 991px) { - #copyright p { - float: none !important; - text-align: center; - margin-bottom: 10px; - } -} -[data-animate] { - opacity: 0; - filter: alpha(opacity=0); -} -#style-switch-button { - position: fixed; - top: 100px; - left: 0px; - border-radius: 0; -} -#style-switch { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 300px; - padding: 20px; - position: fixed; - top: 140px; - left: 0; - background: #fff; - border: solid 1px #eeeeee; -} -@media (max-width: 991px) { - #style-switch-button { - display: none; - } - #style-switch { - display: none; - } -} -/* Original Boostrap template overwrite */ -/* breadcrumbs */ -.breadcrumb { - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - background-color: none; - letter-spacing: 0.08em; -} -/* nav */ -.nav > li > a { - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #999999; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #da4d4d; -} -.nav-tabs { - border-bottom: 1px solid #da4d4d; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 0 0 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #da4d4d; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - background-color: #ffffff; - border: 1px solid #da4d4d; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: solid 1px #da4d4d; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #da4d4d; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #da4d4d; - border-radius: 0 0 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 0; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #da4d4d; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; - border-bottom: solid 1px #da4d4d; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #da4d4d; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #da4d4d; - border-radius: 0 0 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.tab-content { - padding: 15px; - border: solid 1px #ddd; - border-top: none; -} -/* navbar */ -.navbar { - position: relative; - min-height: 62px; - margin-bottom: 0; - border-bottom: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 0px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-affixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-affixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - padding: 10px 15px; - font-size: 18px; - line-height: 20px; - height: 62px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 14px; - margin-bottom: 14px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 0; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-nav { - margin: 10.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 21px; - padding-bottom: 21px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 14px; - margin-bottom: 14px; -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-btn.btn-sm { - margin-top: 16px; - margin-bottom: 16px; -} -.navbar-btn.btn-xs { - margin-top: 20px; - margin-bottom: 20px; -} -.navbar-text { - margin-top: 21px; - margin-bottom: 21px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #ffffff; - border-color: #cccccc; - border-bottom: none; -} -.navbar-default .navbar-brand { - color: #555555; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #3b3b3b; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777777; -} -.navbar-default .navbar-nav > li > a { - color: #555555; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #555555; - background-color: #eca1a1; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #da4d4d; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #dddddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #da4d4d; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #cccccc; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - background-color: #da4d4d; - color: #ffffff; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #555555; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #da4d4d; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #da4d4d; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #555555; -} -.navbar-default .navbar-link:hover { - color: #555555; -} -.navbar-default .btn-link { - color: #555555; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #555555; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; -} -/* scaffolding */ -body { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #555555; -} -a { - color: #da4d4d; - text-decoration: none; -} -a:hover, -a:focus { - color: #b52626; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.img-rounded { - border-radius: 0; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} -/* breadcrumbs */ -.breadcrumb { - padding: 20px 0; - margin-bottom: 20px; - background-color: transparent; - border-radius: 0; - text-align: right; -} -.breadcrumb > li + li:before { - content: ">\00a0"; - color: #555555; -} -.breadcrumb > .active { - color: #999999; -} -@media (max-width: 991px) { - .breadcrumb { - padding: 20px 0; - text-align: center; - } -} -/* dropdowns */ -.dropdown-menu { - z-index: 1000; - font-size: 14px; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - padding: 5px 20px; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; -} -/* labels */ -.label { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: normal; - text-transform: uppercase; - letter-spacing: 0.08em; -} -/* forms.less */ -label { - font-weight: normal; -} -.form-control { - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 0; -} -.form-control:focus { - border-color: #da4d4d; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(218, 77, 77, 0.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(218, 77, 77, 0.6); -} -.form-group { - margin-bottom: 20px; -} -/* pager*/ -.pager { - margin: 20px 0; - border-top: solid 1px #eeeeee; - padding-top: 20px; - text-transform: uppercase; - letter-spacing: 0.08em; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - background-color: #ffffff; - border: 1px solid #da4d4d; - border-radius: 0; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - color: #fff; - background-color: #da4d4d; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - background-color: #ffffff; - border-color: #ddd; -} -/* pagination */ -.pagination { - margin: 20px 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - border-radius: 0; -} -.pagination > li > a, -.pagination > li > span { - padding: 6px 12px; - line-height: 1.42857143; - text-decoration: none; - color: #da4d4d; - background-color: #ffffff; - border: 1px solid #dddddd; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #da4d4d; - background-color: #f4cccc; - border-color: #dddddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - background-color: #da4d4d; - border-color: #da4d4d; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - background-color: #ffffff; - border-color: #dddddd; -} -/* responsive utilities */ -@media (max-width: 767px) { - .text-center-xs { - text-align: center !important; - } - .text-center-xs img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .text-center-sm { - text-align: center !important; - } - .text-center-sm img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -/* type */ -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 900; - line-height: 1.1; - color: #333333; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 20px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 18px; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -.text-small { - font-size: 12px; -} -.text-large { - font-size: 18px; -} -.text-italic { - font-style: italic; -} -.text-primary { - color: #da4d4d; -} -a.text-primary:hover { - color: #ca2a2a; -} -.bg-primary { - color: #fff; - background-color: #da4d4d; -} -a.bg-primary:hover { - background-color: #ca2a2a; -} -abbr[title], -abbr[data-original-title] { - border-bottom: 1px dotted #999999; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 14px; - border-left: 5px solid #da4d4d; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #999999; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - border-right: 5px solid #da4d4d; -} -address { - margin-bottom: 20px; - line-height: 1.42857143; -} -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 0; - -webkit-box-shadow: 0 0 0; - box-shadow: 0 0 0; -} -.panel-heading { - border-top-right-radius: 0; - border-top-left-radius: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 15px 15px; -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 0; - overflow: hidden; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group.accordion .panel { - border-color: #ccc; -} -.panel-primary { - border-color: #da4d4d; -} -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #da4d4d; - border-color: #da4d4d; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #da4d4d; -} -.panel-primary > .panel-heading .badge { - color: #da4d4d; - background-color: #ffffff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #da4d4d; -} -.panel-primary .panel-title { - font-weight: 300; -} -.panel-primary .panel-title a:hover { - color: #fff; - text-decoration: none; -} -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #da4d4d; - background-color: #ffffff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.progress-bar-primary { - background-color: #da4d4d; -} -.progress-striped .progress-bar-primary { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -/*! - * Yamm!3 - Yet another megamenu for Bootstrap 3 - * http://geedmo.github.com/yamm3 - * - * @geedmo - Licensed under the MIT license - */ -.yamm .nav, -.yamm .collapse, -.yamm .dropup.use-yamm, -.yamm .dropdown.use-yamm { - position: static; -} -.yamm .container { - position: relative; -} -.yamm .dropdown-menu { - left: auto; -} -.yamm .nav.navbar-right .dropdown-menu { - left: auto; - right: 0; -} -.yamm .yamm-content { - padding: 20px 30px; -} -.yamm .dropdown.yamm-fw .dropdown-menu { - left: 15px; - right: 15px; -} diff --git a/css/style.sw360.css b/css/style.sw360.css deleted file mode 100644 index 1c91c9a..0000000 --- a/css/style.sw360.css +++ /dev/null @@ -1,48 +0,0 @@ -/* navbar */ -/* PK: min-height = logo height + 20px */ -.navbar { - min-height: 100px; -} -/* PK: height = logo height + 20px */ -.navbar-brand { - height: 100px; -} -/* cd-fixed-bg */ -.cd-fixed-bg { - min-height: 100vh; - background-size: cover; - background-attachment: fixed; - background-repeat: no-repeat; - background-position: center center; -} - -.cd-fixed-bg.cd-fixed-bg--2 { - background-image: url("../img/fixed-background-2.jpg"); -} - -html, -body { - margin:0; - padding:0; - height:100%; -} -#all { - min-height:100%; - position:relative; -} -#content { - padding:10px; - padding-bottom:252px; /* Height of the footer */ -} -#bottom { - position:absolute; - bottom:0; - width:100%; - height:235px; /* Height of the footer */ - background:#6cf; -} - -.footer-img { - margin-left:15px; - margin-right:15px; -} \ No newline at end of file diff --git a/css/style.turquoise.css b/css/style.turquoise.css deleted file mode 100644 index 41761c0..0000000 --- a/css/style.turquoise.css +++ /dev/null @@ -1,3564 +0,0 @@ -.clearfix:before, -.clearfix:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after { - content: " "; - display: table; -} -.clearfix:after, -.navbar:after, -.navbar-header:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -/* general styles */ -a, -button { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -a i.fa, -button i.fa { - margin: 0 5px; -} -.clickable { - cursor: pointer !important; -} -.required { - color: #5d8ea9; -} -.accent { - color: #5d8ea9; -} -.text-uppercase { - text-transform: uppercase; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .text-center-sm { - text-align: center; - } -} -p.lead { - margin-bottom: 40px; -} -section, -div.section { - margin-bottom: 40px; -} -.no-mb { - margin-bottom: 0 !important; -} -.mb-small { - margin-bottom: 20px !important; -} -.heading { - margin-bottom: 40px; -} -.heading h1, -.heading h2, -.heading h3, -.heading h4, -.heading h5 { - display: inline-block; - border-bottom: solid 5px #5d8ea9; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; - vertical-align: middle; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.heading h1 i.fa, -.heading h2 i.fa, -.heading h3 i.fa, -.heading h4 i.fa, -.heading h5 i.fa { - display: inline-block; - background: #5d8ea9; - width: 30px; - height: 30px; - vertical-align: middle; - text-align: center; - color: #fff; - font-size: 12px; - line-height: 30px; - border-radius: 15px; -} -.icon { - display: inline-block; - width: 80px; - height: 80px; - color: #fff; - line-height: 80px; - border-radius: 40px; - border: solid 1px #fff; - font-size: 20px; -} -.icon.icon-lg { - font-size: 30px; - border-width: 2px; -} -.ul-icons { - padding-left: 10px; -} -.ul-icons li { - list-style-type: none; - line-height: 20px; - margin-bottom: 20px; -} -.ul-icons li i { - width: 20px; - height: 20px; - background: #5d8ea9; - color: #fff; - text-align: center; - border-radius: 10px; - line-height: 20px; - margin-right: 10px; -} -ul.list-style-none { - list-style: none; -} -#text-page h1, -#text-page h2, -#text-page h3 { - font-weight: 700; -} -#error-page { - text-align: center; - margin-top: 40px; - margin-bottom: 100px; -} -#error-page h4 { - margin-bottom: 40px; -} -#error-page p.buttons { - margin-top: 40px; -} -.pages-listing .item { - text-align: center; -} -.pages-listing .item h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 20px; - letter-spacing: 0.08em; -} -.pages-listing .item h3 a { - color: #555555; -} -.pages-listing .item .text { - margin-bottom: 20px; -} -.pages-listing .item .text p { - color: #999999; - font-size: 12px; - margin-bottom: 20px; -} -.banner { - margin-bottom: 30px; - text-align: center; -} -.banner img { - margin: 0 auto; -} -.banner a:hover img { - opacity: 0.8; - filter: alpha(opacity=80); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.pages { - text-align: center; -} -.pages .loadMore { - text-align: center; -} -.pages .pagination { - text-align: center; -} -.features-buttons button { - margin-bottom: 20px; -} -@media (min-width: 1300px) { - body.boxed { - background: url(https://www.toptal.com/designers/subtlepatterns/patterns/subtle_zebra_3d.png); - } - body.boxed #all { - position: relative; - background: #fff; - width: 1200px; - margin: 0 auto; - overflow: hidden; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - } -} -#top { - background: #555555; - color: #eeeeee; - padding: 10px 0; -} -#top p { - margin: 0; - font-size: 12px; -} -#top .social { - float: right; - text-align: right; -} -#top .social a { - color: #999999; - display: inline-block; - width: 24px; - height: 24px; - border-radius: 12px; - line-height: 20px; - font-size: 12px; - text-align: center; - vertical-align: bottom; -} -#top .social a:hover { - color: #fff; -} -#top .social a:hover.facebook { - background-color: #4460ae; -} -#top .social a:hover.gplus { - background-color: #c21f25; -} -#top .social a:hover.twitter { - background-color: #3cf; -} -#top .social a:hover.instagram { - background-color: #cd4378; -} -#top .social a:hover.email { - background-color: #4a7f45; -} -#top .login { - float: right; -} -#top .login a { - font-size: 12px; - color: #eeeeee; - margin-right: 15px; - text-decoration: none; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.10em; -} -@media (max-width: 767px) { - #top .login { - float: left; - } -} -#top.light { - background: #fff; - color: #999999; - border-bottom: solid 1px #eeeeee; -} -#top.light .login a { - color: #555555; -} -.navbar { - border: none; -} -.navbar ul.nav > li > a { - text-transform: uppercase; - text-decoration: underline; - font-weight: bold; - letter-spacing: 0.08em; - border-top: solid 5px transparent; -} -.navbar ul.nav > li > a:hover { - border-top: solid 5px #5d8ea9; -} -.navbar ul.nav > li.active > a, -.navbar ul.nav > li.open > a { - text-decoration: none !important; - border-top: solid 5px #5d8ea9; -} -@media (max-width: 768px) { - .navbar ul.nav > li.active > a, - .navbar ul.nav > li.open > a { - border-top-color: transparent; - } - .navbar ul.nav > li > a:hover { - border-top-color: transparent; - } -} -.navbar.navbar-light ul.nav > li.active > a { - border-top: solid 5px #5d8ea9; - background: #fff !important; - color: #555555 !important; -} -.navbar.navbar-light ul.nav > li.active > a:hover { - border-top: solid 5px #5d8ea9; -} -.navbar.navbar-light ul.nav > li > a:hover, -.navbar.navbar-light ul.nav > li.open > a:hover, -.navbar.navbar-light ul.nav > li > a:focus, -.navbar.navbar-light ul.nav > li.open > a:focus { - border-top: solid 5px #5d8ea9; - background: #fff !important; - color: #555555 !important; -} -.navbar ul.dropdown-menu { - margin: 0; - padding: 0; -} -.navbar ul.dropdown-menu li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 4px 0; -} -.navbar ul.dropdown-menu li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - left: 0; -} -.navbar ul.dropdown-menu li a:hover { - color: #5d8ea9; - text-decoration: none; - background: none; - left: 2px; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .navbar ul.dropdown-menu li a:hover { - left: 0; - } -} -.navbar .yamm-content h3 { - font-size: 18px; - text-transform: uppercase; - padding-bottom: 10px; - margin-top: 5px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -@media (max-width: 767px) { - .navbar .yamm-content h3 { - font-size: 14px; - } -} -.navbar .yamm-content h5 { - text-transform: uppercase; - padding-bottom: 10px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -.navbar .yamm-content ul { - margin: 0; - padding: 0; -} -.navbar .yamm-content ul li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - padding: 4px 0; -} -.navbar .yamm-content ul li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.navbar .yamm-content ul li a:hover { - color: #5d8ea9; - text-decoration: none; - padding-left: 2px; -} -.navbar .yamm-content .banner { - margin-bottom: 10px; -} -.navbar .yamm-fw .dropdown-menu { - padding: 0; -} -.navbar .navbar-buttons { - float: right; -} -.navbar .navbar-buttons button, -.navbar .navbar-buttons a.btn, -.navbar .navbar-buttons .btn-default.navbar-toggle { - margin-top: 11px; - margin-bottom: 11px; - margin-left: 0; - margin-right: 5px; -} -.navbar .btn-default, -.navbar .btn-default.navbar-toggle { - color: #999999; - background-color: #fff; - margin-left: 7px; - margin-right: 0; -} -.navbar .btn-default:hover, -.navbar .btn-default.navbar-toggle:hover, -.navbar .btn-default:focus, -.navbar .btn-default.navbar-toggle:focus { - background-color: #fff; - border-color: #5d8ea9; - color: #5d8ea9; -} -.navbar #search { - clear: both; - border-top: solid 1px #5d8ea9; - text-align: right; -} -.navbar #search form { - float: right; -} -.navbar #search form .input-group { - width: 500px; -} -@media (max-width: 768px) { - .navbar #search form .input-group { - width: 100%; - } -} -.navbar #basket-overview a { - margin-left: 7px; -} -.navbar-affixed-top { - top: -32px; -} -.navbar-affixed-top.affix-top { - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -.navbar-affixed-top.affix { - position: fixed; - width: 100%; - top: 0; - z-index: 1000; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -body.boxed .navbar-affixed-top.affix { - position: static; -} -#login-modal { - overflow: hidden; -} -#login-modal .modal-header h4 { - text-transform: uppercase; -} -#login-modal form { - margin-bottom: 20px; -} -#login-modal a { - color: #5d8ea9; -} -#login-modal p { - font-weight: 300; - margin-bottom: 20px; - font-size: 13px; -} -/* buttons */ -.btn { - font-weight: 700; - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 6px 12px; - font-size: 13px; - line-height: 1.42857143; - border-radius: 0; -} -.input-group .btn { - font-size: 14px; -} -.btn-lg { - padding: 10px 16px; - font-size: 14px; - line-height: 1.33; - border-radius: 0; -} -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-template-main { - color: #5d8ea9; - background-color: #ffffff; - border-color: #5d8ea9; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - color: #5d8ea9; - background-color: #e6e6e6; - border-color: #5d8ea9; -} -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - background-image: none; -} -.btn-template-main.disabled, -.btn-template-main[disabled], -fieldset[disabled] .btn-template-main, -.btn-template-main.disabled:hover, -.btn-template-main[disabled]:hover, -fieldset[disabled] .btn-template-main:hover, -.btn-template-main.disabled:focus, -.btn-template-main[disabled]:focus, -fieldset[disabled] .btn-template-main:focus, -.btn-template-main.disabled:active, -.btn-template-main[disabled]:active, -fieldset[disabled] .btn-template-main:active, -.btn-template-main.disabled.active, -.btn-template-main[disabled].active, -fieldset[disabled] .btn-template-main.active { - background-color: #ffffff; - border-color: #5d8ea9; -} -.btn-template-main .badge { - color: #ffffff; - background-color: #5d8ea9; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active { - background: #5d8ea9; - color: #ffffff; - border-color: #5d8ea9; -} -.btn-template-transparent-primary { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - background-image: none; -} -.btn-template-transparent-primary.disabled, -.btn-template-transparent-primary[disabled], -fieldset[disabled] .btn-template-transparent-primary, -.btn-template-transparent-primary.disabled:hover, -.btn-template-transparent-primary[disabled]:hover, -fieldset[disabled] .btn-template-transparent-primary:hover, -.btn-template-transparent-primary.disabled:focus, -.btn-template-transparent-primary[disabled]:focus, -fieldset[disabled] .btn-template-transparent-primary:focus, -.btn-template-transparent-primary.disabled:active, -.btn-template-transparent-primary[disabled]:active, -fieldset[disabled] .btn-template-transparent-primary:active, -.btn-template-transparent-primary.disabled.active, -.btn-template-transparent-primary[disabled].active, -fieldset[disabled] .btn-template-transparent-primary.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active { - background: #fff; - color: #5d8ea9; - border-color: #fff; -} -.btn-template-transparent-black { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - background-image: none; -} -.btn-template-transparent-black.disabled, -.btn-template-transparent-black[disabled], -fieldset[disabled] .btn-template-transparent-black, -.btn-template-transparent-black.disabled:hover, -.btn-template-transparent-black[disabled]:hover, -fieldset[disabled] .btn-template-transparent-black:hover, -.btn-template-transparent-black.disabled:focus, -.btn-template-transparent-black[disabled]:focus, -fieldset[disabled] .btn-template-transparent-black:focus, -.btn-template-transparent-black.disabled:active, -.btn-template-transparent-black[disabled]:active, -fieldset[disabled] .btn-template-transparent-black:active, -.btn-template-transparent-black.disabled.active, -.btn-template-transparent-black[disabled].active, -fieldset[disabled] .btn-template-transparent-black.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active { - background: #fff; - color: #000; - border-color: #fff; -} -.btn-template-primary { - color: #ffffff; - background-color: #5d8ea9; - border-color: #5d8ea9; -} -.btn-template-primary:hover, -.btn-template-primary:focus, -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - color: #ffffff; - background-color: #5d8ea9; - border-color: #5d8ea9; -} -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - background-image: none; -} -.btn-template-primary.disabled, -.btn-template-primary[disabled], -fieldset[disabled] .btn-template-primary, -.btn-template-primary.disabled:hover, -.btn-template-primary[disabled]:hover, -fieldset[disabled] .btn-template-primary:hover, -.btn-template-primary.disabled:focus, -.btn-template-primary[disabled]:focus, -fieldset[disabled] .btn-template-primary:focus, -.btn-template-primary.disabled:active, -.btn-template-primary[disabled]:active, -fieldset[disabled] .btn-template-primary:active, -.btn-template-primary.disabled.active, -.btn-template-primary[disabled].active, -fieldset[disabled] .btn-template-primary.active { - background-color: #5d8ea9; - border-color: #5d8ea9; -} -.btn-template-primary .badge { - color: #5d8ea9; - background-color: #ffffff; -} -#intro { - background: url('../img/home.jpg') no-repeat center top; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} -#intro .item { - font-family: "Roboto", Helvetica, Arial, sans-serif; - height: 100%; -} -#intro .item h1 { - text-transform: uppercase; - font-size: 50px; - color: #fff; - margin-bottom: 40px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #intro .item h1 { - font-size: 40px; - } -} -@media (max-width: 767px) { - #intro .item h1 { - font-size: 25px; - } -} -#intro .item h3 { - color: #fff; - margin-bottom: 40px; -} -@media (max-width: 767px) { - #intro .item h3 { - font-size: 15px; - margin-bottom: 20px; - } -} -#intro .item .btn { - text-transform: none; -} -@media (max-width: 991px) { - #intro .item .btn { - font-size: 14px; - } -} -@media (max-width: 991px) { - #intro .item .carousel-caption { - left: 10%; - right: 10%; - } -} -#intro .container, -#intro .row { - height: 100%; - position: relative; -} -.jumbotron { - padding: 30px; - margin-bottom: 0; - position: relative; - background: url('../img/cyber-bg.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.jumbotron .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #5d8ea9; - opacity: 0.9; - filter: alpha(opacity=90); -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3, -.jumbotron p, -.jumbotron ul { - color: #fff; -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3 { - color: #ffffff; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.jumbotron p { - margin-bottom: 20px; - font-size: 21px; - font-weight: 400; -} -.jumbotron p.text-uppercase { - font-weight: 700; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 0; -} -.jumbotron .container { - max-width: 100%; - z-index: 2; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 46px; - } -} -#categoryMenu h3 { - padding: 20px; - background: #f7f7f7; - margin: 0; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.panel.sidebar-menu h3 { - padding: 5px 0; - margin: 0; -} -.panel.sidebar-menu { - background: #fff; - margin: 0 0 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.panel.sidebar-menu .panel-heading { - text-transform: uppercase; - margin-bottom: 10px; - background: none; - padding: 0; - letter-spacing: 0.08em; - border-bottom: none; -} -.panel.sidebar-menu .panel-heading h1, -.panel.sidebar-menu .panel-heading h2, -.panel.sidebar-menu .panel-heading h3, -.panel.sidebar-menu .panel-heading h4, -.panel.sidebar-menu .panel-heading h5 { - display: inline-block; - border-bottom: solid 5px #5d8ea9; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; -} -.panel.sidebar-menu .panel-heading .btn.btn-danger { - color: #fff; - margin-top: 5px; -} -.panel.sidebar-menu .panel-body { - padding: 0; -} -.panel.sidebar-menu .panel-body span.colour { - display: inline-block; - width: 15px; - height: 15px; - border: solid 1px #555555; - vertical-align: top; - margin-top: 2px; - margin-left: 5px; -} -.panel.sidebar-menu .panel-body span.colour.white { - background: #fff; -} -.panel.sidebar-menu .panel-body span.colour.red { - background: red; -} -.panel.sidebar-menu .panel-body span.colour.green { - background: green; -} -.panel.sidebar-menu .panel-body span.colour.blue { - background: blue; -} -.panel.sidebar-menu .panel-body span.colour.yellow { - background: yellow; -} -.panel.sidebar-menu .panel-body label { - color: #999999; - font-size: 12px; -} -.panel.sidebar-menu .panel-body label:hover { - color: #555555; -} -.panel.sidebar-menu ul.nav.category-menu { - margin-bottom: 20px; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.08em; -} -.panel.sidebar-menu ul.nav.category-menu li a { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.panel.sidebar-menu ul.nav ul { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.nav ul li { - display: block; -} -.panel.sidebar-menu ul.nav ul li a { - position: relative; - font-family: "Times New Roman", Times, serif; - font-weight: normal; - text-transform: none !important; - display: block; - padding: 10px 15px; - padding-left: 30px; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.nav ul li a:hover, -.panel.sidebar-menu ul.nav ul li a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.panel.sidebar-menu ul.tag-cloud { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.tag-cloud li { - display: inline-block; -} -.panel.sidebar-menu ul.tag-cloud li a { - display: inline-block; - padding: 5px; - border: solid 1px #eeeeee; - border-radius: 0; - color: #5d8ea9; - margin: 5px 5px 5px 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 700; - font-size: 12px; -} -.panel.sidebar-menu ul.tag-cloud li a:hover { - color: #5d8ea9; - text-decoration: none; - border-color: #5d8ea9; -} -.panel.sidebar-menu ul.popular, -.panel.sidebar-menu ul.recent { - list-style: none; - padding-left: 0; - padding: 20px 0; -} -.panel.sidebar-menu ul.popular li, -.panel.sidebar-menu ul.recent li { - margin-bottom: 10px; - padding: 5px 0; - border-bottom: dotted 1px #eeeeee; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li img, -.panel.sidebar-menu ul.recent li img { - width: 50px; - margin-right: 10px; -} -.panel.sidebar-menu ul.popular li h5, -.panel.sidebar-menu ul.recent li h5 { - margin: 0 0 10px; -} -.panel.sidebar-menu ul.popular li h5 a, -.panel.sidebar-menu ul.recent li h5 a { - font-weight: normal; -} -.panel.sidebar-menu ul.popular li p.date, -.panel.sidebar-menu ul.recent li p.date { - float: right; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.popular li:last-child, -.panel.sidebar-menu ul.recent li:last-child { - border-bottom: none; -} -.panel.sidebar-menu .text-widget { - font-size: 12px; -} -.panel.sidebar-menu.with-icons ul.nav li a:after { - font-family: 'FontAwesome'; - content: "\f105"; - position: relative; - top: 0; - float: right; -} -/* ribbons for product sales etc. */ -.ribbon { - position: absolute; - top: 50px; - padding-left: 51px; - font-weight: 700; - letter-spacing: 0.08em; -} -.ribbon .ribbon-background { - position: absolute; - top: 0; - right: 0; -} -.ribbon .theribbon { - position: relative; - width: 80px; - padding: 6px 20px 6px 20px; - margin: 30px 10px 10px -71px; - color: #fff; - background-color: #5d8ea9; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.ribbon .theribbon:before, -.ribbon .theribbon:after { - content: ' '; - position: absolute; - width: 0; - height: 0; -} -.ribbon .theribbon:after { - left: 0px; - top: 100%; - border-width: 5px 10px; - border-style: solid; - border-color: #000000 #000000 transparent transparent; -} -.ribbon.sale { - top: 0; -} -.ribbon.new { - top: 50px; -} -.ribbon.new .theribbon { - background-color: #5bc0de; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.new .theribbon:after { - border-color: #2390b0 #2390b0 transparent transparent; -} -.ribbon.gift { - top: 100px; -} -.ribbon.gift .theribbon { - background-color: #5cb85c; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.gift .theribbon:after { - border-color: #357935 #357935 transparent transparent; -} -.owl-carousel .owl-controls .owl-page.active span, -.owl-theme .owl-controls .owl-page.active span, -.owl-carousel .owl-controls.clickable .owl-page:hover span, -.owl-theme .owl-controls.clickable .owl-page:hover span { - background: #5d8ea9; -} -.owl-carousel .owl-controls .owl-buttons, -.owl-theme .owl-controls .owl-buttons { - position: absolute; - top: 5px; - right: 0; -} -.owl-carousel .owl-controls .owl-buttons div, -.owl-theme .owl-controls .owl-buttons div { - width: 26px; - height: 26px; - line-height: 25px; - margin: 0 5px 0 0; - font-size: 18px; - color: #5d8ea9; - padding: 0; - background: #fff; - border-radius: 13px; - vertical-align: middle; - text-align: center; - opacity: 1; - filter: alpha(opacity=100); -} -.home-carousel { - position: relative; - background: url('../img/cyber-bg.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.home-carousel .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #5d8ea9; - opacity: 0.7; - filter: alpha(opacity=70); -} -.home-carousel .owl-carousel { - padding-top: 60px; - padding-bottom: 20px; -} -.home-carousel .owl-theme .owl-controls .owl-page span { - background: #666; -} -.home-carousel .owl-theme .owl-controls .owl-page.active span { - background: #fff; -} -.home-carousel .owl-theme .owl-controls .owl-page:hover span { - background: #fff; -} -@media (max-width: 767px) { - .home-carousel { - text-align: center !important; - } -} -@media (min-width: 992px) { - .home-carousel .right { - text-align: right; - } -} -.home-carousel h1, -.home-carousel h2, -.home-carousel h3, -.home-carousel p, -.home-carousel ul { - color: #fff; -} -.home-carousel h1 { - font-weight: 700; - text-transform: uppercase; - font-size: 46px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .home-carousel h1 { - font-size: 36px; - } -} -.home-carousel h2 { - font-weight: 700; - text-transform: uppercase; - font-size: 40px; - letter-spacing: 0.08em; -} -.home-carousel ul, -.home-carousel p { - font-size: 18px; - font-weight: 700; - padding: 0; - text-transform: uppercase; - letter-spacing: 0.10em; -} -@media (max-width: 991px) { - .home-carousel ul, - .home-carousel p { - font-size: 14px; - } -} -.home-carousel ul li { - margin-bottom: 10px; -} -.customers { - padding: 0; - margin-bottom: 40px; -} -.customers .item { - list-style-type: none; - text-align: center; - margin: 0 20px; -} -.customers .item img { - display: inline-block; - filter: url("data:image/svg+xml;utf8,#grayscale"); - /* Firefox 10+, Firefox on Android */ - filter: gray; - /* IE6-9 */ - -webkit-filter: grayscale(100%); - /* Chrome 19+, Safari 6+, Safari 6+ iOS */ - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.customers .item img:hover { - max-width: auto; - filter: none; - -webkit-filter: none; -} -.testimonials { - padding: 0; - margin-bottom: 40px; -} -.testimonials .item { - list-style-type: none; - margin: 0 5px; - background: #fff; - padding-bottom: 60px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.testimonials .item .testimonial { - position: relative; - padding: 20px; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial .text { - color: #999999; - margin-bottom: 40px; -} -.testimonials .item .testimonial .bottom { - position: absolute; - left: 0; - bottom: 0; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px; - height: 50px; -} -.testimonials .item .testimonial .bottom .icon { - color: #5d8ea9; - font-size: 30px; - float: left; - width: 20%; -} -.testimonials .item .testimonial .name-picture { - float: right; - width: 80%; - text-align: right; -} -.testimonials .item .testimonial .name-picture h5 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.testimonials .item .testimonial .name-picture p { - color: #999999; - margin: 0; - font-size: 12px; -} -.testimonials .item .testimonial .name-picture img { - float: right; - width: 60px; - border-radius: 30px; - margin-left: 10px; -} -.team-member { - text-align: center; - margin-bottom: 40px; -} -.team-member h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 5px; - letter-spacing: 0.08em; -} -.team-member h3 a { - color: #555555; -} -.team-member p.role { - color: #999999; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.team-member .social { - margin-bottom: 20px; -} -.team-member .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email { - background-color: #4a7f45; -} -.team-member .text p { - color: #999999; - font-size: 12px; -} -.team-member .social, -.team-member-detail .social { - margin-bottom: 20px; -} -.team-member .social a, -.team-member-detail .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i, -.team-member-detail .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook, -.team-member-detail .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus, -.team-member-detail .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter, -.team-member-detail .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram, -.team-member-detail .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email, -.team-member-detail .social a.email { - background-color: #4a7f45; -} -.box-simple { - text-align: center; - margin-bottom: 40px; -} -.box-simple .icon { - color: #5d8ea9; - border-color: #5d8ea9; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.box-simple h3 { - font-weight: normal; - font-size: 18px; - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-simple h3 a { - color: #555555; -} -.box-simple p { - color: #999999; -} -.box-simple:hover .icon { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.box-simple:hover .icon i { - -webkit-transform: scale(1, 1); - -ms-transform: scale(1, 1); - -o-transform: scale(1, 1); - transform: scale(1, 1); -} -.box-simple.box-white { - padding: 20px; - border: dotted 1px #999999; -} -.box-simple.box-white .icon { - color: #555555; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark { - padding: 20px; - border: dotted 1px #999999; - background: #555555; - color: #fff; -} -.box-simple.box-dark .icon { - color: #f7f7f7; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark h3 { - color: #fff; -} -.box-simple.box-dark h3 a { - color: #fff; -} -.box-simple.box-dark p { - color: #fff; -} -.box-image { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #5d8ea9; -} -.box-image .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -.box-image-text { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image-text .top { - position: relative; - margin-bottom: 10px; -} -.box-image-text .top .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #5d8ea9; -} -.box-image-text .top .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .top .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image-text .top .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image-text .top .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .content h3, -.box-image-text .content h4 { - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-image-text .content p { - color: #999999; -} -.box-image-text:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image-text:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image-text:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -/* universal box */ -.box { - background: #fff; - margin: 0 0 30px; - border: solid 1px #ccc; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px 0; - border-left: none; - border-right: none; -} -.box .box-header { - background: #f7f7f7; - margin: -20px 0 20px; - padding: 20px; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-footer { - background: #f7f7f7; - margin: 30px 0 -20px; - padding: 20px; - border-top: solid 1px #eeeeee; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -@media (max-width: 991px) { - .box .box-footer .btn { - margin-bottom: 20px; - } -} -.box.no-border { - border: none; -} -#heading-breadcrumbs { - background: url('../img/texture-bw.png') center center repeat; - padding: 20px 0; - margin-bottom: 40px; -} -#heading-breadcrumbs.no-mb { - margin-bottom: 0; -} -#heading-breadcrumbs h1 { - color: #333333; - text-transform: uppercase; - font-size: 30px; - font-weight: 700; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #heading-breadcrumbs h1 { - text-align: center; - } -} -#heading-breadcrumbs ul.breadcrumb { - margin-top: 5px; - margin-bottom: 0; -} -.bar { - position: relative; - background: #5d8ea9; - padding: 60px 0; -} -.bar.background-pentagon { - background: url('../img/texture-bw.png') center center repeat; - border-top: solid 1px #999999; - border-bottom: solid 1px #999999; -} -.bar.background-gray { - background: #eeeeee; -} -.bar.background-gray-dark { - background: #555555; -} -.bar.background-white { - background: #fff; -} -.bar.background-image-fixed-1 { - background: url('../img/fixed-background-1.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.background-image-fixed-2 { - /* background: url('../img/fixed-background-2.jpg') center top no-repeat; */ - background: url('../img/fixed-background-2.jpg'); - background-attachment: fixed; - background-size: cover; - - position: relative; - min-height: 50vh; - background-repeat: no-repeat; - background-position: center center; - z-index: 1; -} -.bar.color-white h1, -.bar.color-white h2, -.bar.color-white h3, -.bar.color-white h4, -.bar.color-white h5, -.bar.color-white h6, -.bar.color-white p { - color: #fff; -} -.bar.padding-big { - padding: 50px 0; -} -.bar.padding-horizontal { - padding-left: 30px; - padding-right: 30px; -} -.bar.margin-vertical { - margin-top: 20px; - margin-bottom: 20px; -} -.bar .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #000; - opacity: 0.3; - filter: alpha(opacity=30); -} -.portfolio.no-space { - padding: 0 15px; -} -.portfolio.no-space .box-image { - margin: 0 -15px; -} -.portfolio-project .project-more h4 { - color: #555555; - text-transform: uppercase; - margin-bottom: 0; - text-align: left; - font-size: 14px; - letter-spacing: 0.08em; -} -.portfolio-project .project-more p { - color: #999999; - padding: 10px 0; - margin-bottom: 20px; - text-align: left; -} -.portfolio-showcase { - margin: 15px 0 60px; -} -.portfolio-showcase h3 a { - text-transform: uppercase; - line-height: 1.5; - letter-spacing: 0.08em; -} -.portfolio-showcase p.lead { - color: #555555; - margin-bottom: 20px; -} -.portfolio-showcase p { - color: #999999; -} -.portfolio-showcase p.buttons { - margin-top: 40px; -} -.see-more { - text-align: center; - margin-top: 20px; - padding-top: 20px; -} -.see-more p { - font-size: 28px; - font-weight: 100; - margin-bottom: 20px; -} -.showcase .item { - text-align: center; -} -.showcase .item .icon { - display: inline-block; - width: 50px; - height: 50px; - color: #555555; - line-height: 50px; - border-radius: 25px; - border: solid 1px #555555; -} -.showcase .item h4 { - color: #555555; - text-transform: uppercase; - letter-spacing: 0.08em; - line-height: 1.5; - font-size: 16px; -} -.showcase .item h4 span { - font-weight: bold; - font-size: 51px; -} -.packages .package { - background: #fff; - margin-top: 25px; - margin-bottom: 20px; - padding-bottom: 15px; - text-align: center; - border: solid 1px #5d8ea9; - overflow: hidden; -} -.packages .package .package-header { - height: 57px; - color: #fff; - line-height: 57px; - background: #5d8ea9; -} -.packages .package .package-header h5 { - color: #fff; - text-transform: uppercase; - font-weight: bold; - line-height: 57px; - margin: 0; - letter-spacing: 0.08em; -} -.packages .package .package-header.light-gray { - background: #eeeeee; -} -.packages .package .package-header.light-gray h5 { - color: #555555; -} -.packages .package .price { - line-height: 120px; - height: 100px; - color: #fff; - font-weight: 400; -} -.packages .package .price h4 { - display: inline; - font-size: 50px; - line-height: normal; - margin-bottom: 0; -} -.packages .package .price .period { - line-height: normal; - color: #999999; -} -.packages .package ul { - padding: 0; -} -.packages .package ul li { - list-style-type: none; - padding-top: 10px; - padding-bottom: 10px; - width: 80%; - margin: auto; - border-bottom: 1px dotted #ccc; -} -.packages .package ul li:last-child { - border-bottom: 0; -} -.packages .package ul li i { - font-size: 13px; - margin-right: 5px; -} -.packages .best-value .package { - margin-top: 0; - padding-bottom: 40px; -} -.packages .best-value .package .package-header { - height: 72px; - padding-top: 17px; - height: 82px !important; -} -.packages .best-value .package .package-header h5 { - font-weight: bold; - line-height: 29px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.packages .best-value .package .package-header .meta-text { - font-size: 13px; - line-height: 15px; -} -#map { - height: 300px; -} -#map.with-border { - border-top: solid 1px #5d8ea9; - border-bottom: solid 1px #5d8ea9; -} -#blog-listing-big .post, -#blog-homepage .post { - margin-bottom: 60px; -} -#blog-listing-big .post h2, -#blog-homepage .post h2, -#blog-listing-big .post h4, -#blog-homepage .post h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#blog-listing-big .post h2 a, -#blog-homepage .post h2 a, -#blog-listing-big .post h4 a, -#blog-homepage .post h4 a { - color: #555555; -} -#blog-listing-big .post h2 a:hover, -#blog-homepage .post h2 a:hover, -#blog-listing-big .post h4 a:hover, -#blog-homepage .post h4 a:hover { - color: #5d8ea9; -} -#blog-listing-big .post .author-category, -#blog-homepage .post .author-category { - color: #999999; - text-transform: uppercase; - font-weight: 300; - letter-spacing: 0.08em; -} -#blog-listing-big .post .author-category a, -#blog-homepage .post .author-category a { - font-weight: 500; -} -#blog-listing-big .post .date-comments a, -#blog-homepage .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-big .post .date-comments a:hover, -#blog-homepage .post .date-comments a:hover { - color: #5d8ea9; -} -@media (min-width: 768px) { - #blog-listing-big .post .date-comments, - #blog-homepage .post .date-comments { - text-align: right; - } -} -#blog-listing-big .post .intro, -#blog-homepage .post .intro { - text-align: left; -} -#blog-listing-big .post .image, -#blog-homepage .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-big .post .image img, -#blog-homepage .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-big .post .image img.img-responsive, - #blog-homepage .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-big .post .video, -#blog-homepage .post .video { - margin-bottom: 10px; -} -#blog-listing-big .post .read-more, -#blog-homepage .post .read-more { - text-align: right; -} -#blog-listing-medium .post { - margin-bottom: 60px; -} -#blog-listing-medium .post h2 { - text-transform: uppercase; - margin: 0 0 10px; - font-size: 24px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post h2 a { - color: #555555; -} -#blog-listing-medium .post h2 a:hover { - color: #5d8ea9; -} -#blog-listing-medium .post .author-category { - float: left; - color: #999999; - text-transform: uppercase; - font-weight: 300; - font-size: 12px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post .author-category a { - font-weight: 500; -} -#blog-listing-medium .post .date-comments { - float: right; - font-size: 12px; -} -#blog-listing-medium .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-medium .post .date-comments a:hover { - color: #5d8ea9; -} -@media (min-width: 768px) { - #blog-listing-medium .post .date-comments { - text-align: right; - } -} -#blog-listing-medium .post .intro { - text-align: left; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-medium .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-medium .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-medium .post .video { - margin-bottom: 10px; -} -#blog-listing-medium .post .read-more { - text-align: right; -} -.box-image-text.blog .author-category { - color: #999999; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 300; - font-size: 12px; -} -.box-image-text.blog .author-category a { - font-weight: 500; -} -.box-image-text.blog .intro { - text-align: left; - margin-bottom: 20px; -} -#blog-homepage .post { - margin-bottom: 30px; -} -#blog-homepage .post h2, -#blog-homepage .post h4, -#blog-homepage .post .author-category, -#blog-homepage .post .read-more { - text-align: center; -} -#blog-homepage .post .read-more { - margin-top: 20px; -} -#blog-post #post-content { - margin-bottom: 20px; -} -#blog-post .comment { - margin-bottom: 25px; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment .posted { - color: #999999; - font-size: 12px; -} -#blog-post .comment .reply { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#blog-post .comment.last { - margin-bottom: 0; -} -#blog-post #comments, -#blog-post #comment-form { - padding: 20px 0; - margin-top: 20px; - border-top: solid 1px #eeeeee; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments h4, -#blog-post #comment-form h4 { - margin-bottom: 20px; -} -#blog-post #comment-form { - margin-bottom: 20px; -} -.product { - background: #fff; - border-bottom: solid 1px #e6e6e6; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 60px; - overflow: hidden; - text-align: center; -} -.product .image { - overflow: hidden; -} -.product .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .product .image img.img-responsive { - min-width: 100%; - } -} -.product .text { - padding: 10px; -} -.product .text h3 { - font-size: 14px; - font-weight: 700; - height: 39.6px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.product .text h3 a { - color: #555555; -} -.product .text h3 a:hover { - text-decoration: none; -} -.product .text p.price { - font-size: 18px; -} -.product .text p.price del { - color: #999999; -} -.product .buttons { - clear: both; - position: absolute; - display: none; - bottom: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - border: solid 1px transparent; - padding: 20px; - background: rgba(255, 255, 255, 0.9); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - text-align: center; -} -.product .buttons .btn { - margin-bottom: 20px; -} -.product:hover { - border-bottom: solid 1px #808080; - top: 0; -} -.product:hover .buttons { - clear: both; - position: absolute; - top: 0; - background: rgba(255, 255, 255, 0.5); -} -.product:hover .image img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.goToDescription { - font-size: 12px; - text-align: center; - margin-bottom: 40px; -} -.goToDescription a { - color: #999999; - text-decoration: underline; -} -#productMain { - margin-bottom: 30px; -} -#productMain .sizes { - text-align: center; -} -#productMain .sizes h3 { - font-weight: 700; - letter-spacing: 0.08em; - text-transform: uppercase; - margin-bottom: 40px; -} -#productMain .sizes a { - display: inline-block; - width: 40px; - height: 40px; - border-radius: 40px; - background: #ccc; - line-height: 40px; - color: #555555; - text-align: center; - text-decoration: none; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#productMain .sizes a.active, -#productMain .sizes a:hover { - background: #5d8ea9; - color: #fff; -} -#productMain .sizes input { - display: none; -} -#productMain .price { - font-size: 40px; - text-align: center; - margin-top: 40px; - margin-bottom: 40px; -} -#thumbs a { - display: block; - border: solid 1px transparent; -} -#thumbs a.active { - border-color: #5d8ea9; -} -#product-social { - text-align: center; -} -#product-social h4 { - font-weight: 300; - margin-bottom: 10px; -} -#product-social p { - line-height: 26px; -} -#product-social p a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -#product-social p a i { - vertical-align: bottom; - line-height: 26px; -} -#product-social p a.facebook { - background-color: #4460ae; -} -#product-social p a.gplus { - background-color: #c21f25; -} -#product-social p a.twitter { - background-color: #3cf; -} -#product-social p a.instagram { - background-color: #cd4378; -} -#product-social p a.email { - background-color: #4a7f45; -} -@media (max-width: 991px) { - #product-social { - text-align: center; - } -} -#checkout .nav { - margin-bottom: 20px; - border-bottom: solid 1px #5d8ea9; -} -#checkout .nav li { - height: 100%; -} -#checkout .nav li a { - display: block; - height: 100%; -} -#order-summary table { - margin-top: 20px; -} -#order-summary table td { - color: #999999; -} -#order-summary table tr.total td, -#order-summary table tr.total th { - font-size: 18px; - color: #555555; - font-weight: 700; -} -#checkout .table tbody tr td, -#basket .table tbody tr td, -#customer-order .table tbody tr td { - vertical-align: middle; -} -#checkout .table tbody tr td input, -#basket .table tbody tr td input, -#customer-order .table tbody tr td input { - width: 50px; - text-align: right; -} -#checkout .table tbody tr td img, -#basket .table tbody tr td img, -#customer-order .table tbody tr td img { - width: 50px; -} -#checkout .table tfoot, -#basket .table tfoot, -#customer-order .table tfoot { - font-size: 18px; -} -.shipping-method h4, -.payment-method h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#customer-orders table tr th, -#customer-orders table tr td { - vertical-align: baseline; -} -#customer-order .table tfoot th { - font-size: 18px; - font-weight: 300; -} -#customer-order .addresses { - text-align: right; - margin-bottom: 30px; -} -#customer-order .addresses p { - font-size: 18px; - font-weight: 300; -} -#customer-account { - margin-bottom: 30px; -} -#get-it { - background: #5d8ea9; - padding: 50px 0 30px; - color: #fff; - text-align: center; -} -#get-it h1, -#get-it h2, -#get-it h3, -#get-it h4, -#get-it h5, -#get-it h6 { - color: #fff; - text-transform: uppercase; - letter-spacing: 0.08em; - margin: 0 0 20px; -} -#get-it p { - margin: 0 0 20px; -} -#footer { - background: #555555; - padding: 50px 0; - color: #999999; -} -#footer h1, -#footer h2, -#footer h3, -#footer h4, -#footer h5, -#footer h6 { - color: #eeeeee; -} -#footer h4 { - font-size: 14px; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.08em; -} -#footer ul { - padding-left: 0; - list-style: none; -} -#footer ul a { - color: #999999; -} -#footer ul a:hover { - color: #5d8ea9; - text-decoration: none; -} -#footer .photostream div { - float: left; - display: block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 33%; - padding: 7.5px; - overflow: hidden; -} -#footer .photostream div a { - border: solid 1 px #eeeeee; -} -#footer .photostream div img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -#footer .photostream div:hover img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -#footer .blog-entries .item { - clear: both; - padding: 5px 0; - margin-bottom: 10px; - border-bottom: solid 1px #555555; -} -#footer .blog-entries .item .image { - float: left; - width: 15%; - margin-right: 10px; -} -#footer .blog-entries .item .name { - width: 75%; - margin-left: 10px; - display: table-cell; - vertical-align: middle; -} -#footer .blog-entries .item .name h5 { - margin: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-size: 12px; -} -#footer .blog-entries .item .name h5 a { - color: #eeeeee; -} -#footer .blog-entries .item .text { - width: 100%; - clear: both; -} -#footer .blog-entries .item:last-child { - border-bottom: none; - margin-bottom: 0; -} -#footer .social a { - color: #555555; - font-size: 25px; - margin: 0 10px 0 0; -} -#footer .social a:hover { - color: #5d8ea9; -} -#copyright { - background: #333; - color: #ccc; - padding: 50px 0; - font-size: 12px; - line-height: 28px; -} -#copyright p { - margin: 0; -} -@media (max-width: 991px) { - #copyright p { - float: none !important; - text-align: center; - margin-bottom: 10px; - } -} -[data-animate] { - opacity: 0; - filter: alpha(opacity=0); -} -#style-switch-button { - position: fixed; - top: 100px; - left: 0px; - border-radius: 0; -} -#style-switch { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 300px; - padding: 20px; - position: fixed; - top: 140px; - left: 0; - background: #fff; - border: solid 1px #eeeeee; -} -@media (max-width: 991px) { - #style-switch-button { - display: none; - } - #style-switch { - display: none; - } -} -/* Original Boostrap template overwrite */ -/* breadcrumbs */ -.breadcrumb { - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - background-color: none; - letter-spacing: 0.08em; -} -/* nav */ -.nav > li > a { - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #999999; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #5d8ea9; -} -.nav-tabs { - border-bottom: 1px solid #5d8ea9; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 0 0 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #5d8ea9; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - background-color: #ffffff; - border: 1px solid #5d8ea9; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: solid 1px #5d8ea9; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #5d8ea9; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #5d8ea9; - border-radius: 0 0 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 0; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #5d8ea9; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; - border-bottom: solid 1px #5d8ea9; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #5d8ea9; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #5d8ea9; - border-radius: 0 0 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.tab-content { - padding: 15px; - border: solid 1px #ddd; - border-top: none; -} -/* navbar */ -.navbar { - position: relative; - min-height: 62px; - margin-bottom: 0; - border-bottom: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 0px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-affixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-affixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - padding: 10px 15px; - font-size: 18px; - line-height: 20px; - height: 62px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 14px; - margin-bottom: 14px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 0; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-nav { - margin: 10.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 21px; - padding-bottom: 21px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 14px; - margin-bottom: 14px; -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-btn.btn-sm { - margin-top: 16px; - margin-bottom: 16px; -} -.navbar-btn.btn-xs { - margin-top: 20px; - margin-bottom: 20px; -} -.navbar-text { - margin-top: 21px; - margin-bottom: 21px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #ffffff; - border-color: #cccccc; - border-bottom: none; -} -.navbar-default .navbar-brand { - color: #555555; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #3b3b3b; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777777; -} -.navbar-default .navbar-nav > li > a { - color: #555555; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #555555; - background-color: #c2dbebff; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #5d8ea9; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #dddddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #5d8ea9; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #cccccc; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - background-color: #5d8ea9; - color: #ffffff; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #555555; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #5d8ea9; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #5d8ea9; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #555555; -} -.navbar-default .navbar-link:hover { - color: #555555; -} -.navbar-default .btn-link { - color: #555555; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #555555; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; -} -/* scaffolding */ -body { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #555555; -} -a { - color: #5d8ea9; - text-decoration: none; -} -a:hover, -a:focus { - color: #f7941e; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.img-rounded { - border-radius: 0; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} -/* breadcrumbs */ -.breadcrumb { - padding: 20px 0; - margin-bottom: 20px; - background-color: transparent; - border-radius: 0; - text-align: right; -} -.breadcrumb > li + li:before { - content: ">\00a0"; - color: #555555; -} -.breadcrumb > .active { - color: #999999; -} -@media (max-width: 991px) { - .breadcrumb { - padding: 20px 0; - text-align: center; - } -} -/* dropdowns */ -.dropdown-menu { - z-index: 1000; - font-size: 14px; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - padding: 5px 20px; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; -} -/* labels */ -.label { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: normal; - text-transform: uppercase; - letter-spacing: 0.08em; -} -/* forms.less */ -label { - font-weight: normal; -} -.form-control { - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 0; -} -.form-control:focus { - border-color: #5d8ea9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(79, 191, 168, 0.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(79, 191, 168, 0.6); -} -.form-group { - margin-bottom: 20px; -} -/* pager*/ -.pager { - margin: 20px 0; - border-top: solid 1px #eeeeee; - padding-top: 20px; - text-transform: uppercase; - letter-spacing: 0.08em; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - background-color: #ffffff; - border: 1px solid #5d8ea9; - border-radius: 0; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - color: #fff; - background-color: #5d8ea9; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - background-color: #ffffff; - border-color: #ddd; -} -/* pagination */ -.pagination { - margin: 20px 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - border-radius: 0; -} -.pagination > li > a, -.pagination > li > span { - padding: 6px 12px; - line-height: 1.42857143; - text-decoration: none; - color: #5d8ea9; - background-color: #ffffff; - border: 1px solid #dddddd; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #5d8ea9; - background-color: #bfe8df; - border-color: #dddddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - background-color: #5d8ea9; - border-color: #5d8ea9; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - background-color: #ffffff; - border-color: #dddddd; -} -/* responsive utilities */ -@media (max-width: 767px) { - .text-center-xs { - text-align: center !important; - } - .text-center-xs img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .text-center-sm { - text-align: center !important; - } - .text-center-sm img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -/* type */ -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 900; - line-height: 1.1; - color: #333333; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 20px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 18px; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -.text-small { - font-size: 12px; -} -.text-large { - font-size: 18px; -} -.text-italic { - font-style: italic; -} -.text-primary { - color: #5d8ea9; -} -a.text-primary:hover { - color: #3aa18c; -} -.bg-primary { - color: #fff; - background-color: #5d8ea9; -} -a.bg-primary:hover { - background-color: #3aa18c; -} -abbr[title], -abbr[data-original-title] { - border-bottom: 1px dotted #999999; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 14px; - border-left: 5px solid #5d8ea9; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #999999; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - border-right: 5px solid #5d8ea9; -} -address { - margin-bottom: 20px; - line-height: 1.42857143; -} -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 0; - -webkit-box-shadow: 0 0 0; - box-shadow: 0 0 0; -} -.panel-heading { - border-top-right-radius: 0; - border-top-left-radius: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 15px 15px; -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 0; - overflow: hidden; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group.accordion .panel { - border-color: #ccc; -} -.panel-primary { - border-color: #5d8ea9; -} -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #5d8ea9; - border-color: #5d8ea9; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #5d8ea9; -} -.panel-primary > .panel-heading .badge { - color: #5d8ea9; - background-color: #ffffff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #5d8ea9; -} -.panel-primary .panel-title { - font-weight: 300; -} -.panel-primary .panel-title a:hover { - color: #fff; - text-decoration: none; -} -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #5d8ea9; - background-color: #ffffff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.progress-bar-primary { - background-color: #5d8ea9; -} -.progress-striped .progress-bar-primary { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -/*! - * Yamm!3 - Yet another megamenu for Bootstrap 3 - * http://geedmo.github.com/yamm3 - * - * @geedmo - Licensed under the MIT license - */ -.yamm .nav, -.yamm .collapse, -.yamm .dropup.use-yamm, -.yamm .dropdown.use-yamm { - position: static; -} -.yamm .container { - position: relative; -} -.yamm .dropdown-menu { - left: auto; -} -.yamm .nav.navbar-right .dropdown-menu { - left: auto; - right: 0; -} -.yamm .yamm-content { - padding: 20px 30px; -} -.yamm .dropdown.yamm-fw .dropdown-menu { - left: 15px; - right: 15px; -} diff --git a/css/style.violet.css b/css/style.violet.css deleted file mode 100644 index f10fe8d..0000000 --- a/css/style.violet.css +++ /dev/null @@ -1,3557 +0,0 @@ -.clearfix:before, -.clearfix:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after { - content: " "; - display: table; -} -.clearfix:after, -.navbar:after, -.navbar-header:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -/* general styles */ -a, -button { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -a i.fa, -button i.fa { - margin: 0 5px; -} -.clickable { - cursor: pointer !important; -} -.required { - color: #986dbd; -} -.accent { - color: #986dbd; -} -.text-uppercase { - text-transform: uppercase; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .text-center-sm { - text-align: center; - } -} -p.lead { - margin-bottom: 40px; -} -section, -div.section { - margin-bottom: 40px; -} -.no-mb { - margin-bottom: 0 !important; -} -.mb-small { - margin-bottom: 20px !important; -} -.heading { - margin-bottom: 40px; -} -.heading h1, -.heading h2, -.heading h3, -.heading h4, -.heading h5 { - display: inline-block; - border-bottom: solid 5px #986dbd; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; - vertical-align: middle; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.heading h1 i.fa, -.heading h2 i.fa, -.heading h3 i.fa, -.heading h4 i.fa, -.heading h5 i.fa { - display: inline-block; - background: #986dbd; - width: 30px; - height: 30px; - vertical-align: middle; - text-align: center; - color: #fff; - font-size: 12px; - line-height: 30px; - border-radius: 15px; -} -.icon { - display: inline-block; - width: 80px; - height: 80px; - color: #fff; - line-height: 80px; - border-radius: 40px; - border: solid 1px #fff; - font-size: 20px; -} -.icon.icon-lg { - font-size: 30px; - border-width: 2px; -} -.ul-icons { - padding-left: 10px; -} -.ul-icons li { - list-style-type: none; - line-height: 20px; - margin-bottom: 20px; -} -.ul-icons li i { - width: 20px; - height: 20px; - background: #986dbd; - color: #fff; - text-align: center; - border-radius: 10px; - line-height: 20px; - margin-right: 10px; -} -ul.list-style-none { - list-style: none; -} -#text-page h1, -#text-page h2, -#text-page h3 { - font-weight: 700; -} -#error-page { - text-align: center; - margin-top: 40px; - margin-bottom: 100px; -} -#error-page h4 { - margin-bottom: 40px; -} -#error-page p.buttons { - margin-top: 40px; -} -.pages-listing .item { - text-align: center; -} -.pages-listing .item h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 20px; - letter-spacing: 0.08em; -} -.pages-listing .item h3 a { - color: #555555; -} -.pages-listing .item .text { - margin-bottom: 20px; -} -.pages-listing .item .text p { - color: #999999; - font-size: 12px; - margin-bottom: 20px; -} -.banner { - margin-bottom: 30px; - text-align: center; -} -.banner img { - margin: 0 auto; -} -.banner a:hover img { - opacity: 0.8; - filter: alpha(opacity=80); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.pages { - text-align: center; -} -.pages .loadMore { - text-align: center; -} -.pages .pagination { - text-align: center; -} -.features-buttons button { - margin-bottom: 20px; -} -@media (min-width: 1300px) { - body.boxed { - background: url(https://www.toptal.com/designers/subtlepatterns/patterns/subtle_zebra_3d.png); - } - body.boxed #all { - position: relative; - background: #fff; - width: 1200px; - margin: 0 auto; - overflow: hidden; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - } -} -#top { - background: #555555; - color: #eeeeee; - padding: 10px 0; -} -#top p { - margin: 0; - font-size: 12px; -} -#top .social { - float: right; - text-align: right; -} -#top .social a { - color: #999999; - display: inline-block; - width: 24px; - height: 24px; - border-radius: 12px; - line-height: 20px; - font-size: 12px; - text-align: center; - vertical-align: bottom; -} -#top .social a:hover { - color: #fff; -} -#top .social a:hover.facebook { - background-color: #4460ae; -} -#top .social a:hover.gplus { - background-color: #c21f25; -} -#top .social a:hover.twitter { - background-color: #3cf; -} -#top .social a:hover.instagram { - background-color: #cd4378; -} -#top .social a:hover.email { - background-color: #4a7f45; -} -#top .login { - float: right; -} -#top .login a { - font-size: 12px; - color: #eeeeee; - margin-right: 15px; - text-decoration: none; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.10em; -} -@media (max-width: 767px) { - #top .login { - float: left; - } -} -#top.light { - background: #fff; - color: #999999; - border-bottom: solid 1px #eeeeee; -} -#top.light .login a { - color: #555555; -} -.navbar { - border: none; -} -.navbar ul.nav > li > a { - text-transform: uppercase; - text-decoration: underline; - font-weight: bold; - letter-spacing: 0.08em; - border-top: solid 5px transparent; -} -.navbar ul.nav > li > a:hover { - border-top: solid 5px #986dbd; -} -.navbar ul.nav > li.active > a, -.navbar ul.nav > li.open > a { - text-decoration: none !important; - border-top: solid 5px #653d87; -} -@media (max-width: 768px) { - .navbar ul.nav > li.active > a, - .navbar ul.nav > li.open > a { - border-top-color: transparent; - } - .navbar ul.nav > li > a:hover { - border-top-color: transparent; - } -} -.navbar.navbar-light ul.nav > li.active > a { - border-top: solid 5px #653d87; - background: #fff !important; - color: #555555 !important; -} -.navbar.navbar-light ul.nav > li.active > a:hover { - border-top: solid 5px #653d87; -} -.navbar.navbar-light ul.nav > li > a:hover, -.navbar.navbar-light ul.nav > li.open > a:hover, -.navbar.navbar-light ul.nav > li > a:focus, -.navbar.navbar-light ul.nav > li.open > a:focus { - border-top: solid 5px #986dbd; - background: #fff !important; - color: #555555 !important; -} -.navbar ul.dropdown-menu { - margin: 0; - padding: 0; -} -.navbar ul.dropdown-menu li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 4px 0; -} -.navbar ul.dropdown-menu li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - left: 0; -} -.navbar ul.dropdown-menu li a:hover { - color: #986dbd; - text-decoration: none; - background: none; - left: 2px; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .navbar ul.dropdown-menu li a:hover { - left: 0; - } -} -.navbar .yamm-content h3 { - font-size: 18px; - text-transform: uppercase; - padding-bottom: 10px; - margin-top: 5px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -@media (max-width: 767px) { - .navbar .yamm-content h3 { - font-size: 14px; - } -} -.navbar .yamm-content h5 { - text-transform: uppercase; - padding-bottom: 10px; - border-bottom: dotted 1px #555555; - letter-spacing: 0.08em; -} -.navbar .yamm-content ul { - margin: 0; - padding: 0; -} -.navbar .yamm-content ul li { - list-style-type: none; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - padding: 4px 0; -} -.navbar .yamm-content ul li a { - position: relative; - color: #999999; - font-size: 12px; - display: block; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.navbar .yamm-content ul li a:hover { - color: #986dbd; - text-decoration: none; - padding-left: 2px; -} -.navbar .yamm-content .banner { - margin-bottom: 10px; -} -.navbar .yamm-fw .dropdown-menu { - padding: 0; -} -.navbar .navbar-buttons { - float: right; -} -.navbar .navbar-buttons button, -.navbar .navbar-buttons a.btn, -.navbar .navbar-buttons .btn-default.navbar-toggle { - margin-top: 11px; - margin-bottom: 11px; - margin-left: 0; - margin-right: 5px; -} -.navbar .btn-default, -.navbar .btn-default.navbar-toggle { - color: #999999; - background-color: #fff; - margin-left: 7px; - margin-right: 0; -} -.navbar .btn-default:hover, -.navbar .btn-default.navbar-toggle:hover, -.navbar .btn-default:focus, -.navbar .btn-default.navbar-toggle:focus { - background-color: #fff; - border-color: #986dbd; - color: #986dbd; -} -.navbar #search { - clear: both; - border-top: solid 1px #986dbd; - text-align: right; -} -.navbar #search form { - float: right; -} -.navbar #search form .input-group { - width: 500px; -} -@media (max-width: 768px) { - .navbar #search form .input-group { - width: 100%; - } -} -.navbar #basket-overview a { - margin-left: 7px; -} -.navbar-affixed-top { - top: -32px; -} -.navbar-affixed-top.affix-top { - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -.navbar-affixed-top.affix { - position: fixed; - width: 100%; - top: 0; - z-index: 1000; - -webkit-box-shadow: 0 0 5px #cccccc; - box-shadow: 0 0 5px #cccccc; - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; -} -body.boxed .navbar-affixed-top.affix { - position: static; -} -#login-modal { - overflow: hidden; -} -#login-modal .modal-header h4 { - text-transform: uppercase; -} -#login-modal form { - margin-bottom: 20px; -} -#login-modal a { - color: #986dbd; -} -#login-modal p { - font-weight: 300; - margin-bottom: 20px; - font-size: 13px; -} -/* buttons */ -.btn { - font-weight: 700; - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 6px 12px; - font-size: 13px; - line-height: 1.42857143; - border-radius: 0; -} -.input-group .btn { - font-size: 14px; -} -.btn-lg { - padding: 10px 16px; - font-size: 14px; - line-height: 1.33; - border-radius: 0; -} -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 0; -} -.btn-template-main { - color: #986dbd; - background-color: #ffffff; - border-color: #986dbd; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - color: #986dbd; - background-color: #e6e6e6; - border-color: #7a4aa3; -} -.btn-template-main:active, -.btn-template-main.active, -.open > .dropdown-toggle.btn-template-main { - background-image: none; -} -.btn-template-main.disabled, -.btn-template-main[disabled], -fieldset[disabled] .btn-template-main, -.btn-template-main.disabled:hover, -.btn-template-main[disabled]:hover, -fieldset[disabled] .btn-template-main:hover, -.btn-template-main.disabled:focus, -.btn-template-main[disabled]:focus, -fieldset[disabled] .btn-template-main:focus, -.btn-template-main.disabled:active, -.btn-template-main[disabled]:active, -fieldset[disabled] .btn-template-main:active, -.btn-template-main.disabled.active, -.btn-template-main[disabled].active, -fieldset[disabled] .btn-template-main.active { - background-color: #ffffff; - border-color: #986dbd; -} -.btn-template-main .badge { - color: #ffffff; - background-color: #986dbd; -} -.btn-template-main:hover, -.btn-template-main:focus, -.btn-template-main:active, -.btn-template-main.active { - background: #986dbd; - color: #ffffff; - border-color: #986dbd; -} -.btn-template-transparent-primary { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active, -.open > .dropdown-toggle.btn-template-transparent-primary { - background-image: none; -} -.btn-template-transparent-primary.disabled, -.btn-template-transparent-primary[disabled], -fieldset[disabled] .btn-template-transparent-primary, -.btn-template-transparent-primary.disabled:hover, -.btn-template-transparent-primary[disabled]:hover, -fieldset[disabled] .btn-template-transparent-primary:hover, -.btn-template-transparent-primary.disabled:focus, -.btn-template-transparent-primary[disabled]:focus, -fieldset[disabled] .btn-template-transparent-primary:focus, -.btn-template-transparent-primary.disabled:active, -.btn-template-transparent-primary[disabled]:active, -fieldset[disabled] .btn-template-transparent-primary:active, -.btn-template-transparent-primary.disabled.active, -.btn-template-transparent-primary[disabled].active, -fieldset[disabled] .btn-template-transparent-primary.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-primary .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-primary:hover, -.btn-template-transparent-primary:focus, -.btn-template-transparent-primary:active, -.btn-template-transparent-primary.active { - background: #fff; - color: #986dbd; - border-color: #fff; -} -.btn-template-transparent-black { - color: #ffffff; - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - color: #ffffff; - background-color: rgba(0, 0, 0, 0); - border-color: #e0e0e0; -} -.btn-template-transparent-black:active, -.btn-template-transparent-black.active, -.open > .dropdown-toggle.btn-template-transparent-black { - background-image: none; -} -.btn-template-transparent-black.disabled, -.btn-template-transparent-black[disabled], -fieldset[disabled] .btn-template-transparent-black, -.btn-template-transparent-black.disabled:hover, -.btn-template-transparent-black[disabled]:hover, -fieldset[disabled] .btn-template-transparent-black:hover, -.btn-template-transparent-black.disabled:focus, -.btn-template-transparent-black[disabled]:focus, -fieldset[disabled] .btn-template-transparent-black:focus, -.btn-template-transparent-black.disabled:active, -.btn-template-transparent-black[disabled]:active, -fieldset[disabled] .btn-template-transparent-black:active, -.btn-template-transparent-black.disabled.active, -.btn-template-transparent-black[disabled].active, -fieldset[disabled] .btn-template-transparent-black.active { - background-color: transparent; - border-color: #ffffff; -} -.btn-template-transparent-black .badge { - color: transparent; - background-color: #ffffff; -} -.btn-template-transparent-black:hover, -.btn-template-transparent-black:focus, -.btn-template-transparent-black:active, -.btn-template-transparent-black.active { - background: #fff; - color: #000; - border-color: #fff; -} -.btn-template-primary { - color: #ffffff; - background-color: #986dbd; - border-color: #986dbd; -} -.btn-template-primary:hover, -.btn-template-primary:focus, -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - color: #ffffff; - background-color: #7f4daa; - border-color: #7a4aa3; -} -.btn-template-primary:active, -.btn-template-primary.active, -.open > .dropdown-toggle.btn-template-primary { - background-image: none; -} -.btn-template-primary.disabled, -.btn-template-primary[disabled], -fieldset[disabled] .btn-template-primary, -.btn-template-primary.disabled:hover, -.btn-template-primary[disabled]:hover, -fieldset[disabled] .btn-template-primary:hover, -.btn-template-primary.disabled:focus, -.btn-template-primary[disabled]:focus, -fieldset[disabled] .btn-template-primary:focus, -.btn-template-primary.disabled:active, -.btn-template-primary[disabled]:active, -fieldset[disabled] .btn-template-primary:active, -.btn-template-primary.disabled.active, -.btn-template-primary[disabled].active, -fieldset[disabled] .btn-template-primary.active { - background-color: #986dbd; - border-color: #986dbd; -} -.btn-template-primary .badge { - color: #986dbd; - background-color: #ffffff; -} -#intro { - background: url('../img/home.jpg') no-repeat center top; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} -#intro .item { - font-family: "Roboto", Helvetica, Arial, sans-serif; - height: 100%; -} -#intro .item h1 { - text-transform: uppercase; - font-size: 50px; - color: #fff; - margin-bottom: 40px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #intro .item h1 { - font-size: 40px; - } -} -@media (max-width: 767px) { - #intro .item h1 { - font-size: 25px; - } -} -#intro .item h3 { - color: #fff; - margin-bottom: 40px; -} -@media (max-width: 767px) { - #intro .item h3 { - font-size: 15px; - margin-bottom: 20px; - } -} -#intro .item .btn { - text-transform: none; -} -@media (max-width: 991px) { - #intro .item .btn { - font-size: 14px; - } -} -@media (max-width: 991px) { - #intro .item .carousel-caption { - left: 10%; - right: 10%; - } -} -#intro .container, -#intro .row { - height: 100%; - position: relative; -} -.jumbotron { - padding: 30px; - margin-bottom: 0; - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.jumbotron .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #986dbd; - opacity: 0.9; - filter: alpha(opacity=90); -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3, -.jumbotron p, -.jumbotron ul { - color: #fff; -} -.jumbotron h1, -.jumbotron h2, -.jumbotron h3 { - color: #ffffff; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.jumbotron p { - margin-bottom: 20px; - font-size: 21px; - font-weight: 400; -} -.jumbotron p.text-uppercase { - font-weight: 700; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 0; -} -.jumbotron .container { - max-width: 100%; - z-index: 2; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 46px; - } -} -#categoryMenu h3 { - padding: 20px; - background: #f7f7f7; - margin: 0; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.panel.sidebar-menu h3 { - padding: 5px 0; - margin: 0; -} -.panel.sidebar-menu { - background: #fff; - margin: 0 0 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.panel.sidebar-menu .panel-heading { - text-transform: uppercase; - margin-bottom: 10px; - background: none; - padding: 0; - letter-spacing: 0.08em; - border-bottom: none; -} -.panel.sidebar-menu .panel-heading h1, -.panel.sidebar-menu .panel-heading h2, -.panel.sidebar-menu .panel-heading h3, -.panel.sidebar-menu .panel-heading h4, -.panel.sidebar-menu .panel-heading h5 { - display: inline-block; - border-bottom: solid 5px #986dbd; - line-height: 1.1; - margin-bottom: 0; - padding-bottom: 10px; -} -.panel.sidebar-menu .panel-heading .btn.btn-danger { - color: #fff; - margin-top: 5px; -} -.panel.sidebar-menu .panel-body { - padding: 0; -} -.panel.sidebar-menu .panel-body span.colour { - display: inline-block; - width: 15px; - height: 15px; - border: solid 1px #555555; - vertical-align: top; - margin-top: 2px; - margin-left: 5px; -} -.panel.sidebar-menu .panel-body span.colour.white { - background: #fff; -} -.panel.sidebar-menu .panel-body span.colour.red { - background: red; -} -.panel.sidebar-menu .panel-body span.colour.green { - background: green; -} -.panel.sidebar-menu .panel-body span.colour.blue { - background: blue; -} -.panel.sidebar-menu .panel-body span.colour.yellow { - background: yellow; -} -.panel.sidebar-menu .panel-body label { - color: #999999; - font-size: 12px; -} -.panel.sidebar-menu .panel-body label:hover { - color: #555555; -} -.panel.sidebar-menu ul.nav.category-menu { - margin-bottom: 20px; - text-transform: uppercase; - font-weight: 700; - letter-spacing: 0.08em; -} -.panel.sidebar-menu ul.nav.category-menu li a { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.panel.sidebar-menu ul.nav ul { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.nav ul li { - display: block; -} -.panel.sidebar-menu ul.nav ul li a { - position: relative; - font-family: "Times New Roman", Times, serif; - font-weight: normal; - text-transform: none !important; - display: block; - padding: 10px 15px; - padding-left: 30px; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.nav ul li a:hover, -.panel.sidebar-menu ul.nav ul li a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.panel.sidebar-menu ul.tag-cloud { - list-style: none; - padding-left: 0; -} -.panel.sidebar-menu ul.tag-cloud li { - display: inline-block; -} -.panel.sidebar-menu ul.tag-cloud li a { - display: inline-block; - padding: 5px; - border: solid 1px #eeeeee; - border-radius: 0; - color: #986dbd; - margin: 5px 5px 5px 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 700; - font-size: 12px; -} -.panel.sidebar-menu ul.tag-cloud li a:hover { - color: #986dbd; - text-decoration: none; - border-color: #986dbd; -} -.panel.sidebar-menu ul.popular, -.panel.sidebar-menu ul.recent { - list-style: none; - padding-left: 0; - padding: 20px 0; -} -.panel.sidebar-menu ul.popular li, -.panel.sidebar-menu ul.recent li { - margin-bottom: 10px; - padding: 5px 0; - border-bottom: dotted 1px #eeeeee; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li:before, -.panel.sidebar-menu ul.recent li:before, -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - content: " "; - display: table; -} -.panel.sidebar-menu ul.popular li:after, -.panel.sidebar-menu ul.recent li:after { - clear: both; -} -.panel.sidebar-menu ul.popular li img, -.panel.sidebar-menu ul.recent li img { - width: 50px; - margin-right: 10px; -} -.panel.sidebar-menu ul.popular li h5, -.panel.sidebar-menu ul.recent li h5 { - margin: 0 0 10px; -} -.panel.sidebar-menu ul.popular li h5 a, -.panel.sidebar-menu ul.recent li h5 a { - font-weight: normal; -} -.panel.sidebar-menu ul.popular li p.date, -.panel.sidebar-menu ul.recent li p.date { - float: right; - font-size: 12px; - color: #999999; -} -.panel.sidebar-menu ul.popular li:last-child, -.panel.sidebar-menu ul.recent li:last-child { - border-bottom: none; -} -.panel.sidebar-menu .text-widget { - font-size: 12px; -} -.panel.sidebar-menu.with-icons ul.nav li a:after { - font-family: 'FontAwesome'; - content: "\f105"; - position: relative; - top: 0; - float: right; -} -/* ribbons for product sales etc. */ -.ribbon { - position: absolute; - top: 50px; - padding-left: 51px; - font-weight: 700; - letter-spacing: 0.08em; -} -.ribbon .ribbon-background { - position: absolute; - top: 0; - right: 0; -} -.ribbon .theribbon { - position: relative; - width: 80px; - padding: 6px 20px 6px 20px; - margin: 30px 10px 10px -71px; - color: #fff; - background-color: #986dbd; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.ribbon .theribbon:before, -.ribbon .theribbon:after { - content: ' '; - position: absolute; - width: 0; - height: 0; -} -.ribbon .theribbon:after { - left: 0px; - top: 100%; - border-width: 5px 10px; - border-style: solid; - border-color: #000000 #000000 transparent transparent; -} -.ribbon.sale { - top: 0; -} -.ribbon.new { - top: 50px; -} -.ribbon.new .theribbon { - background-color: #5bc0de; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.new .theribbon:after { - border-color: #2390b0 #2390b0 transparent transparent; -} -.ribbon.gift { - top: 100px; -} -.ribbon.gift .theribbon { - background-color: #5cb85c; - text-shadow: 0px 1px 2px #bbb; -} -.ribbon.gift .theribbon:after { - border-color: #357935 #357935 transparent transparent; -} -.owl-carousel .owl-controls .owl-page.active span, -.owl-theme .owl-controls .owl-page.active span, -.owl-carousel .owl-controls.clickable .owl-page:hover span, -.owl-theme .owl-controls.clickable .owl-page:hover span { - background: #986dbd; -} -.owl-carousel .owl-controls .owl-buttons, -.owl-theme .owl-controls .owl-buttons { - position: absolute; - top: 5px; - right: 0; -} -.owl-carousel .owl-controls .owl-buttons div, -.owl-theme .owl-controls .owl-buttons div { - width: 26px; - height: 26px; - line-height: 25px; - margin: 0 5px 0 0; - font-size: 18px; - color: #986dbd; - padding: 0; - background: #fff; - border-radius: 13px; - vertical-align: middle; - text-align: center; - opacity: 1; - filter: alpha(opacity=100); -} -.home-carousel { - position: relative; - background: url('../img/photogrid.jpg') center center repeat; - background-size: cover; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.home-carousel .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #986dbd; - opacity: 0.9; - filter: alpha(opacity=90); -} -.home-carousel .owl-carousel { - padding-top: 60px; - padding-bottom: 20px; -} -.home-carousel .owl-theme .owl-controls .owl-page span { - background: #666; -} -.home-carousel .owl-theme .owl-controls .owl-page.active span { - background: #fff; -} -.home-carousel .owl-theme .owl-controls .owl-page:hover span { - background: #fff; -} -@media (max-width: 767px) { - .home-carousel { - text-align: center !important; - } -} -@media (min-width: 992px) { - .home-carousel .right { - text-align: right; - } -} -.home-carousel h1, -.home-carousel h2, -.home-carousel h3, -.home-carousel p, -.home-carousel ul { - color: #fff; -} -.home-carousel h1 { - font-weight: 700; - text-transform: uppercase; - font-size: 46px; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - .home-carousel h1 { - font-size: 36px; - } -} -.home-carousel h2 { - font-weight: 700; - text-transform: uppercase; - font-size: 40px; - letter-spacing: 0.08em; -} -.home-carousel ul, -.home-carousel p { - font-size: 18px; - font-weight: 700; - padding: 0; - text-transform: uppercase; - letter-spacing: 0.10em; -} -@media (max-width: 991px) { - .home-carousel ul, - .home-carousel p { - font-size: 14px; - } -} -.home-carousel ul li { - margin-bottom: 10px; -} -.customers { - padding: 0; - margin-bottom: 40px; -} -.customers .item { - list-style-type: none; - text-align: center; - margin: 0 20px; -} -.customers .item img { - display: inline-block; - filter: url("data:image/svg+xml;utf8,#grayscale"); - /* Firefox 10+, Firefox on Android */ - filter: gray; - /* IE6-9 */ - -webkit-filter: grayscale(100%); - /* Chrome 19+, Safari 6+, Safari 6+ iOS */ - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.customers .item img:hover { - max-width: auto; - filter: none; - -webkit-filter: none; -} -.testimonials { - padding: 0; - margin-bottom: 40px; -} -.testimonials .item { - list-style-type: none; - margin: 0 5px; - background: #fff; - padding-bottom: 60px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.testimonials .item .testimonial { - position: relative; - padding: 20px; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial:before, -.testimonials .item .testimonial:after { - content: " "; - display: table; -} -.testimonials .item .testimonial:after { - clear: both; -} -.testimonials .item .testimonial .text { - color: #999999; - margin-bottom: 40px; -} -.testimonials .item .testimonial .bottom { - position: absolute; - left: 0; - bottom: 0; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px; - height: 50px; -} -.testimonials .item .testimonial .bottom .icon { - color: #986dbd; - font-size: 30px; - float: left; - width: 20%; -} -.testimonials .item .testimonial .name-picture { - float: right; - width: 80%; - text-align: right; -} -.testimonials .item .testimonial .name-picture h5 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.testimonials .item .testimonial .name-picture p { - color: #999999; - margin: 0; - font-size: 12px; -} -.testimonials .item .testimonial .name-picture img { - float: right; - width: 60px; - border-radius: 30px; - margin-left: 10px; -} -.team-member { - text-align: center; - margin-bottom: 40px; -} -.team-member h3 { - font-size: 18px; - text-transform: uppercase; - margin-bottom: 5px; - letter-spacing: 0.08em; -} -.team-member h3 a { - color: #555555; -} -.team-member p.role { - color: #999999; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.06em; -} -.team-member .social { - margin-bottom: 20px; -} -.team-member .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email { - background-color: #4a7f45; -} -.team-member .text p { - color: #999999; - font-size: 12px; -} -.team-member .social, -.team-member-detail .social { - margin-bottom: 20px; -} -.team-member .social a, -.team-member-detail .social a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -.team-member .social a i, -.team-member-detail .social a i { - vertical-align: bottom; - line-height: 26px; -} -.team-member .social a.facebook, -.team-member-detail .social a.facebook { - background-color: #4460ae; -} -.team-member .social a.gplus, -.team-member-detail .social a.gplus { - background-color: #c21f25; -} -.team-member .social a.twitter, -.team-member-detail .social a.twitter { - background-color: #3cf; -} -.team-member .social a.instagram, -.team-member-detail .social a.instagram { - background-color: #cd4378; -} -.team-member .social a.email, -.team-member-detail .social a.email { - background-color: #4a7f45; -} -.box-simple { - text-align: center; - margin-bottom: 40px; -} -.box-simple .icon { - color: #986dbd; - border-color: #986dbd; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -.box-simple h3 { - font-weight: normal; - font-size: 18px; - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-simple h3 a { - color: #555555; -} -.box-simple p { - color: #999999; -} -.box-simple:hover .icon { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.box-simple:hover .icon i { - -webkit-transform: scale(1, 1); - -ms-transform: scale(1, 1); - -o-transform: scale(1, 1); - transform: scale(1, 1); -} -.box-simple.box-white { - padding: 20px; - border: dotted 1px #999999; -} -.box-simple.box-white .icon { - color: #555555; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark { - padding: 20px; - border: dotted 1px #999999; - background: #555555; - color: #fff; -} -.box-simple.box-dark .icon { - color: #f7f7f7; - border-color: transparent; - font-size: 70px; -} -.box-simple.box-dark h3 { - color: #fff; -} -.box-simple.box-dark h3 a { - color: #fff; -} -.box-simple.box-dark p { - color: #fff; -} -.box-image { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #986dbd; -} -.box-image .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -.box-image-text { - position: relative; - overflow: hidden; - text-align: center; - margin: 15px 0; -} -.box-image-text .top { - position: relative; - margin-bottom: 10px; -} -.box-image-text .top .bg { - position: absolute; - top: auto; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity=0); - background: #986dbd; -} -.box-image-text .top .name { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .top .name h3 { - color: #fff; - text-transform: uppercase; - font-size: 18px; - letter-spacing: 0.08em; -} -.box-image-text .top .name h3 a { - color: #fff; - text-decoration: none; -} -.box-image-text .top .text { - position: absolute; - width: 100%; - height: 50%; - top: 0; - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - -o-transform: translate(0, -150%); - transform: translate(0, -150%); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - color: #fff; - padding: 0 20px; -} -.box-image-text .content h3, -.box-image-text .content h4 { - text-transform: uppercase; - line-height: 1.5; - color: #555555; - font-weight: 800; - letter-spacing: 0.08em; -} -.box-image-text .content p { - color: #999999; -} -.box-image-text:hover .bg { - opacity: 0.7; - filter: alpha(opacity=70); -} -.box-image-text:hover .name { - position: absolute; - -webkit-transform: translate(0, -75%); - -ms-transform: translate(0, -75%); - -o-transform: translate(0, -75%); - transform: translate(0, -75%); -} -.box-image-text:hover .text { - position: absolute; - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - -o-transform: translate(0, 100%); - transform: translate(0, 100%); -} -/* universal box */ -.box { - background: #fff; - margin: 0 0 30px; - border: solid 1px #ccc; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 20px 0; - border-left: none; - border-right: none; -} -.box .box-header { - background: #f7f7f7; - margin: -20px 0 20px; - padding: 20px; - border-bottom: solid 1px #eeeeee; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-header:before, -.box .box-header:after { - content: " "; - display: table; -} -.box .box-header:after { - clear: both; -} -.box .box-footer { - background: #f7f7f7; - margin: 30px 0 -20px; - padding: 20px; - border-top: solid 1px #eeeeee; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -.box .box-footer:before, -.box .box-footer:after { - content: " "; - display: table; -} -.box .box-footer:after { - clear: both; -} -@media (max-width: 991px) { - .box .box-footer .btn { - margin-bottom: 20px; - } -} -.box.no-border { - border: none; -} -#heading-breadcrumbs { - background: url('../img/texture-bw.png') center center repeat; - padding: 20px 0; - margin-bottom: 40px; -} -#heading-breadcrumbs.no-mb { - margin-bottom: 0; -} -#heading-breadcrumbs h1 { - color: #333333; - text-transform: uppercase; - font-size: 30px; - font-weight: 700; - letter-spacing: 0.08em; -} -@media (max-width: 991px) { - #heading-breadcrumbs h1 { - text-align: center; - } -} -#heading-breadcrumbs ul.breadcrumb { - margin-top: 5px; - margin-bottom: 0; -} -.bar { - position: relative; - background: #986dbd; - padding: 60px 0; -} -.bar.background-pentagon { - background: url('../img/texture-bw.png') center center repeat; - border-top: solid 1px #999999; - border-bottom: solid 1px #999999; -} -.bar.background-gray { - background: #eeeeee; -} -.bar.background-gray-dark { - background: #555555; -} -.bar.background-white { - background: #fff; -} -.bar.background-image-fixed-1 { - background: url('../img/fixed-background-1.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.background-image-fixed-2 { - background: url('../img/fixed-background-2.jpg') center top no-repeat; - background-attachment: fixed; - background-size: cover; -} -.bar.color-white h1, -.bar.color-white h2, -.bar.color-white h3, -.bar.color-white h4, -.bar.color-white h5, -.bar.color-white h6, -.bar.color-white p { - color: #fff; -} -.bar.padding-big { - padding: 50px 0; -} -.bar.padding-horizontal { - padding-left: 30px; - padding-right: 30px; -} -.bar.margin-vertical { - margin-top: 20px; - margin-bottom: 20px; -} -.bar .dark-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #000; - opacity: 0.3; - filter: alpha(opacity=30); -} -.portfolio.no-space { - padding: 0 15px; -} -.portfolio.no-space .box-image { - margin: 0 -15px; -} -.portfolio-project .project-more h4 { - color: #555555; - text-transform: uppercase; - margin-bottom: 0; - text-align: left; - font-size: 14px; - letter-spacing: 0.08em; -} -.portfolio-project .project-more p { - color: #999999; - padding: 10px 0; - margin-bottom: 20px; - text-align: left; -} -.portfolio-showcase { - margin: 15px 0 60px; -} -.portfolio-showcase h3 a { - text-transform: uppercase; - line-height: 1.5; - letter-spacing: 0.08em; -} -.portfolio-showcase p.lead { - color: #555555; - margin-bottom: 20px; -} -.portfolio-showcase p { - color: #999999; -} -.portfolio-showcase p.buttons { - margin-top: 40px; -} -.see-more { - text-align: center; - margin-top: 20px; - padding-top: 20px; -} -.see-more p { - font-size: 28px; - font-weight: 100; - margin-bottom: 20px; -} -.showcase .item { - text-align: center; -} -.showcase .item .icon { - display: inline-block; - width: 50px; - height: 50px; - color: #555555; - line-height: 50px; - border-radius: 25px; - border: solid 1px #555555; -} -.showcase .item h4 { - color: #555555; - text-transform: uppercase; - letter-spacing: 0.08em; - line-height: 1.5; - font-size: 16px; -} -.showcase .item h4 span { - font-weight: bold; - font-size: 51px; -} -.packages .package { - background: #fff; - margin-top: 25px; - margin-bottom: 20px; - padding-bottom: 15px; - text-align: center; - border: solid 1px #986dbd; - overflow: hidden; -} -.packages .package .package-header { - height: 57px; - color: #fff; - line-height: 57px; - background: #986dbd; -} -.packages .package .package-header h5 { - color: #fff; - text-transform: uppercase; - font-weight: bold; - line-height: 57px; - margin: 0; - letter-spacing: 0.08em; -} -.packages .package .package-header.light-gray { - background: #eeeeee; -} -.packages .package .package-header.light-gray h5 { - color: #555555; -} -.packages .package .price { - line-height: 120px; - height: 100px; - color: #fff; - font-weight: 400; -} -.packages .package .price h4 { - display: inline; - font-size: 50px; - line-height: normal; - margin-bottom: 0; -} -.packages .package .price .period { - line-height: normal; - color: #999999; -} -.packages .package ul { - padding: 0; -} -.packages .package ul li { - list-style-type: none; - padding-top: 10px; - padding-bottom: 10px; - width: 80%; - margin: auto; - border-bottom: 1px dotted #ccc; -} -.packages .package ul li:last-child { - border-bottom: 0; -} -.packages .package ul li i { - font-size: 13px; - margin-right: 5px; -} -.packages .best-value .package { - margin-top: 0; - padding-bottom: 40px; -} -.packages .best-value .package .package-header { - height: 72px; - padding-top: 17px; - height: 82px !important; -} -.packages .best-value .package .package-header h5 { - font-weight: bold; - line-height: 29px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.packages .best-value .package .package-header .meta-text { - font-size: 13px; - line-height: 15px; -} -#map { - height: 300px; -} -#map.with-border { - border-top: solid 1px #986dbd; - border-bottom: solid 1px #986dbd; -} -#blog-listing-big .post, -#blog-homepage .post { - margin-bottom: 60px; -} -#blog-listing-big .post h2, -#blog-homepage .post h2, -#blog-listing-big .post h4, -#blog-homepage .post h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#blog-listing-big .post h2 a, -#blog-homepage .post h2 a, -#blog-listing-big .post h4 a, -#blog-homepage .post h4 a { - color: #555555; -} -#blog-listing-big .post h2 a:hover, -#blog-homepage .post h2 a:hover, -#blog-listing-big .post h4 a:hover, -#blog-homepage .post h4 a:hover { - color: #986dbd; -} -#blog-listing-big .post .author-category, -#blog-homepage .post .author-category { - color: #999999; - text-transform: uppercase; - font-weight: 300; - letter-spacing: 0.08em; -} -#blog-listing-big .post .author-category a, -#blog-homepage .post .author-category a { - font-weight: 500; -} -#blog-listing-big .post .date-comments a, -#blog-homepage .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-big .post .date-comments a:hover, -#blog-homepage .post .date-comments a:hover { - color: #986dbd; -} -@media (min-width: 768px) { - #blog-listing-big .post .date-comments, - #blog-homepage .post .date-comments { - text-align: right; - } -} -#blog-listing-big .post .intro, -#blog-homepage .post .intro { - text-align: left; -} -#blog-listing-big .post .image, -#blog-homepage .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-big .post .image img, -#blog-homepage .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-big .post .image img.img-responsive, - #blog-homepage .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-big .post .video, -#blog-homepage .post .video { - margin-bottom: 10px; -} -#blog-listing-big .post .read-more, -#blog-homepage .post .read-more { - text-align: right; -} -#blog-listing-medium .post { - margin-bottom: 60px; -} -#blog-listing-medium .post h2 { - text-transform: uppercase; - margin: 0 0 10px; - font-size: 24px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post h2 a { - color: #555555; -} -#blog-listing-medium .post h2 a:hover { - color: #986dbd; -} -#blog-listing-medium .post .author-category { - float: left; - color: #999999; - text-transform: uppercase; - font-weight: 300; - font-size: 12px; - letter-spacing: 0.08em; -} -#blog-listing-medium .post .author-category a { - font-weight: 500; -} -#blog-listing-medium .post .date-comments { - float: right; - font-size: 12px; -} -#blog-listing-medium .post .date-comments a { - color: #999999; - margin-right: 20px; -} -#blog-listing-medium .post .date-comments a:hover { - color: #986dbd; -} -@media (min-width: 768px) { - #blog-listing-medium .post .date-comments { - text-align: right; - } -} -#blog-listing-medium .post .intro { - text-align: left; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .clearfix:before, -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:before, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:before, -#blog-listing-medium .post .navbar-header:after { - content: " "; - display: table; -} -#blog-listing-medium .post .clearfix:after, -#blog-listing-medium .post .navbar:after, -#blog-listing-medium .post .navbar-header:after { - clear: both; -} -#blog-listing-medium .post .image { - margin-bottom: 10px; - overflow: hidden; -} -#blog-listing-medium .post .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - #blog-listing-medium .post .image img.img-responsive { - min-width: 100%; - } -} -#blog-listing-medium .post .video { - margin-bottom: 10px; -} -#blog-listing-medium .post .read-more { - text-align: right; -} -.box-image-text.blog .author-category { - color: #999999; - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 300; - font-size: 12px; -} -.box-image-text.blog .author-category a { - font-weight: 500; -} -.box-image-text.blog .intro { - text-align: left; - margin-bottom: 20px; -} -#blog-homepage .post { - margin-bottom: 30px; -} -#blog-homepage .post h2, -#blog-homepage .post h4, -#blog-homepage .post .author-category, -#blog-homepage .post .read-more { - text-align: center; -} -#blog-homepage .post .read-more { - margin-top: 20px; -} -#blog-post #post-content { - margin-bottom: 20px; -} -#blog-post .comment { - margin-bottom: 25px; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment:before, -#blog-post .comment:after { - content: " "; - display: table; -} -#blog-post .comment:after { - clear: both; -} -#blog-post .comment .posted { - color: #999999; - font-size: 12px; -} -#blog-post .comment .reply { - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#blog-post .comment.last { - margin-bottom: 0; -} -#blog-post #comments, -#blog-post #comment-form { - padding: 20px 0; - margin-top: 20px; - border-top: solid 1px #eeeeee; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments:before, -#blog-post #comment-form:before, -#blog-post #comments:after, -#blog-post #comment-form:after { - content: " "; - display: table; -} -#blog-post #comments:after, -#blog-post #comment-form:after { - clear: both; -} -#blog-post #comments h4, -#blog-post #comment-form h4 { - margin-bottom: 20px; -} -#blog-post #comment-form { - margin-bottom: 20px; -} -.product { - background: #fff; - border-bottom: solid 1px #e6e6e6; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 60px; - overflow: hidden; - text-align: center; -} -.product .image { - overflow: hidden; -} -.product .image img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -@media (max-width: 767px) { - .product .image img.img-responsive { - min-width: 100%; - } -} -.product .text { - padding: 10px; -} -.product .text h3 { - font-size: 14px; - font-weight: 700; - height: 39.6px; - text-transform: uppercase; - letter-spacing: 0.08em; -} -.product .text h3 a { - color: #555555; -} -.product .text h3 a:hover { - text-decoration: none; -} -.product .text p.price { - font-size: 18px; -} -.product .text p.price del { - color: #999999; -} -.product .buttons { - clear: both; - position: absolute; - display: none; - bottom: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - border: solid 1px transparent; - padding: 20px; - background: rgba(255, 255, 255, 0.9); - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - text-align: center; -} -.product .buttons .btn { - margin-bottom: 20px; -} -.product:hover { - border-bottom: solid 1px #808080; - top: 0; -} -.product:hover .buttons { - clear: both; - position: absolute; - top: 0; - background: rgba(255, 255, 255, 0.5); -} -.product:hover .image img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -.goToDescription { - font-size: 12px; - text-align: center; - margin-bottom: 40px; -} -.goToDescription a { - color: #999999; - text-decoration: underline; -} -#productMain { - margin-bottom: 30px; -} -#productMain .sizes { - text-align: center; -} -#productMain .sizes h3 { - font-weight: 700; - letter-spacing: 0.08em; - text-transform: uppercase; - margin-bottom: 40px; -} -#productMain .sizes a { - display: inline-block; - width: 40px; - height: 40px; - border-radius: 40px; - background: #ccc; - line-height: 40px; - color: #555555; - text-align: center; - text-decoration: none; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -#productMain .sizes a.active, -#productMain .sizes a:hover { - background: #986dbd; - color: #fff; -} -#productMain .sizes input { - display: none; -} -#productMain .price { - font-size: 40px; - text-align: center; - margin-top: 40px; - margin-bottom: 40px; -} -#thumbs a { - display: block; - border: solid 1px transparent; -} -#thumbs a.active { - border-color: #986dbd; -} -#product-social { - text-align: center; -} -#product-social h4 { - font-weight: 300; - margin-bottom: 10px; -} -#product-social p { - line-height: 26px; -} -#product-social p a { - margin: 0 10px 0 0; - color: #fff; - display: inline-block; - width: 26px; - height: 26px; - border-radius: 13px; - line-height: 26px; - font-size: 15px; - text-align: center; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - vertical-align: bottom; -} -#product-social p a i { - vertical-align: bottom; - line-height: 26px; -} -#product-social p a.facebook { - background-color: #4460ae; -} -#product-social p a.gplus { - background-color: #c21f25; -} -#product-social p a.twitter { - background-color: #3cf; -} -#product-social p a.instagram { - background-color: #cd4378; -} -#product-social p a.email { - background-color: #4a7f45; -} -@media (max-width: 991px) { - #product-social { - text-align: center; - } -} -#checkout .nav { - margin-bottom: 20px; - border-bottom: solid 1px #986dbd; -} -#checkout .nav li { - height: 100%; -} -#checkout .nav li a { - display: block; - height: 100%; -} -#order-summary table { - margin-top: 20px; -} -#order-summary table td { - color: #999999; -} -#order-summary table tr.total td, -#order-summary table tr.total th { - font-size: 18px; - color: #555555; - font-weight: 700; -} -#checkout .table tbody tr td, -#basket .table tbody tr td, -#customer-order .table tbody tr td { - vertical-align: middle; -} -#checkout .table tbody tr td input, -#basket .table tbody tr td input, -#customer-order .table tbody tr td input { - width: 50px; - text-align: right; -} -#checkout .table tbody tr td img, -#basket .table tbody tr td img, -#customer-order .table tbody tr td img { - width: 50px; -} -#checkout .table tfoot, -#basket .table tfoot, -#customer-order .table tfoot { - font-size: 18px; -} -.shipping-method h4, -.payment-method h4 { - text-transform: uppercase; - letter-spacing: 0.08em; -} -#customer-orders table tr th, -#customer-orders table tr td { - vertical-align: baseline; -} -#customer-order .table tfoot th { - font-size: 18px; - font-weight: 300; -} -#customer-order .addresses { - text-align: right; - margin-bottom: 30px; -} -#customer-order .addresses p { - font-size: 18px; - font-weight: 300; -} -#customer-account { - margin-bottom: 30px; -} -#get-it { - background: #986dbd; - padding: 50px 0 30px; - color: #fff; - text-align: center; -} -#get-it h1, -#get-it h2, -#get-it h3, -#get-it h4, -#get-it h5, -#get-it h6 { - color: #fff; - text-transform: uppercase; - letter-spacing: 0.08em; - margin: 0 0 20px; -} -#get-it p { - margin: 0 0 20px; -} -#footer { - background: #555555; - padding: 50px 0; - color: #999999; -} -#footer h1, -#footer h2, -#footer h3, -#footer h4, -#footer h5, -#footer h6 { - color: #eeeeee; -} -#footer h4 { - font-size: 14px; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.08em; -} -#footer ul { - padding-left: 0; - list-style: none; -} -#footer ul a { - color: #999999; -} -#footer ul a:hover { - color: #986dbd; - text-decoration: none; -} -#footer .photostream div { - float: left; - display: block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 33%; - padding: 7.5px; - overflow: hidden; -} -#footer .photostream div a { - border: solid 1 px #eeeeee; -} -#footer .photostream div img { - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; -} -#footer .photostream div:hover img { - -webkit-transform: scale(1.1, 1.1); - -ms-transform: scale(1.1, 1.1); - -o-transform: scale(1.1, 1.1); - transform: scale(1.1, 1.1); -} -#footer .blog-entries .item { - clear: both; - padding: 5px 0; - margin-bottom: 10px; - border-bottom: solid 1px #555555; -} -#footer .blog-entries .item .image { - float: left; - width: 15%; - margin-right: 10px; -} -#footer .blog-entries .item .name { - width: 75%; - margin-left: 10px; - display: table-cell; - vertical-align: middle; -} -#footer .blog-entries .item .name h5 { - margin: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - font-size: 12px; -} -#footer .blog-entries .item .name h5 a { - color: #eeeeee; -} -#footer .blog-entries .item .text { - width: 100%; - clear: both; -} -#footer .blog-entries .item:last-child { - border-bottom: none; - margin-bottom: 0; -} -#footer .social a { - color: #555555; - font-size: 25px; - margin: 0 10px 0 0; -} -#footer .social a:hover { - color: #986dbd; -} -#copyright { - background: #333; - color: #ccc; - padding: 50px 0; - font-size: 12px; - line-height: 28px; -} -#copyright p { - margin: 0; -} -@media (max-width: 991px) { - #copyright p { - float: none !important; - text-align: center; - margin-bottom: 10px; - } -} -[data-animate] { - opacity: 0; - filter: alpha(opacity=0); -} -#style-switch-button { - position: fixed; - top: 100px; - left: 0px; - border-radius: 0; -} -#style-switch { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 300px; - padding: 20px; - position: fixed; - top: 140px; - left: 0; - background: #fff; - border: solid 1px #eeeeee; -} -@media (max-width: 991px) { - #style-switch-button { - display: none; - } - #style-switch { - display: none; - } -} -/* Original Boostrap template overwrite */ -/* breadcrumbs */ -.breadcrumb { - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - background-color: none; - letter-spacing: 0.08em; -} -/* nav */ -.nav > li > a { - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #999999; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #986dbd; -} -.nav-tabs { - border-bottom: 1px solid #986dbd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 0 0 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #986dbd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - background-color: #ffffff; - border: 1px solid #986dbd; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: solid 1px #986dbd; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #986dbd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #986dbd; - border-radius: 0 0 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 0; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #986dbd; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; - border-bottom: solid 1px #986dbd; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - /*margin-bottom: 5px;*/ -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 0; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #986dbd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #986dbd; - border-radius: 0 0 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.tab-content { - padding: 15px; - border: solid 1px #ddd; - border-top: none; -} -/* navbar */ -.navbar { - position: relative; - min-height: 62px; - margin-bottom: 0; - border-bottom: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 0px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-affixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-affixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - padding: 10px 15px; - font-size: 18px; - line-height: 20px; - height: 62px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 14px; - margin-bottom: 14px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 0; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-nav { - margin: 10.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 21px; - padding-bottom: 21px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 14px; - margin-bottom: 14px; -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-btn.btn-sm { - margin-top: 16px; - margin-bottom: 16px; -} -.navbar-btn.btn-xs { - margin-top: 20px; - margin-bottom: 20px; -} -.navbar-text { - margin-top: 21px; - margin-bottom: 21px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #ffffff; - border-color: #cccccc; - border-bottom: none; -} -.navbar-default .navbar-brand { - color: #555555; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #3b3b3b; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777777; -} -.navbar-default .navbar-nav > li > a { - color: #555555; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #555555; - background-color: #cab3dd; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #986dbd; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #dddddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #986dbd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #cccccc; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - background-color: #986dbd; - color: #ffffff; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #555555; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #986dbd; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #986dbd; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #555555; -} -.navbar-default .navbar-link:hover { - color: #555555; -} -.navbar-default .btn-link { - color: #555555; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #555555; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; -} -/* scaffolding */ -body { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #555555; -} -a { - color: #986dbd; - text-decoration: none; -} -a:hover, -a:focus { - color: #724599; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.img-rounded { - border-radius: 0; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} -/* breadcrumbs */ -.breadcrumb { - padding: 20px 0; - margin-bottom: 20px; - background-color: transparent; - border-radius: 0; - text-align: right; -} -.breadcrumb > li + li:before { - content: ">\00a0"; - color: #555555; -} -.breadcrumb > .active { - color: #999999; -} -@media (max-width: 991px) { - .breadcrumb { - padding: 20px 0; - text-align: center; - } -} -/* dropdowns */ -.dropdown-menu { - z-index: 1000; - font-size: 14px; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - padding: 5px 20px; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; -} -/* labels */ -.label { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: normal; - text-transform: uppercase; - letter-spacing: 0.08em; -} -/* forms.less */ -label { - font-weight: normal; -} -.form-control { - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 0; -} -.form-control:focus { - border-color: #986dbd; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(152, 109, 189, 0.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(152, 109, 189, 0.6); -} -.form-group { - margin-bottom: 20px; -} -/* pager*/ -.pager { - margin: 20px 0; - border-top: solid 1px #eeeeee; - padding-top: 20px; - text-transform: uppercase; - letter-spacing: 0.08em; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - background-color: #ffffff; - border: 1px solid #986dbd; - border-radius: 0; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - color: #fff; - background-color: #986dbd; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - background-color: #ffffff; - border-color: #ddd; -} -/* pagination */ -.pagination { - margin: 20px 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - border-radius: 0; -} -.pagination > li > a, -.pagination > li > span { - padding: 6px 12px; - line-height: 1.42857143; - text-decoration: none; - color: #986dbd; - background-color: #ffffff; - border: 1px solid #dddddd; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #986dbd; - background-color: #e2d6ed; - border-color: #dddddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - background-color: #986dbd; - border-color: #986dbd; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - background-color: #ffffff; - border-color: #dddddd; -} -/* responsive utilities */ -@media (max-width: 767px) { - .text-center-xs { - text-align: center !important; - } - .text-center-xs img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .text-center-sm { - text-align: center !important; - } - .text-center-sm img { - display: block; - margin-left: auto; - margin-right: auto; - } -} -/* type */ -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 900; - line-height: 1.1; - color: #333333; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 20px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 18px; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -.text-small { - font-size: 12px; -} -.text-large { - font-size: 18px; -} -.text-italic { - font-style: italic; -} -.text-primary { - color: #986dbd; -} -a.text-primary:hover { - color: #7f4daa; -} -.bg-primary { - color: #fff; - background-color: #986dbd; -} -a.bg-primary:hover { - background-color: #7f4daa; -} -abbr[title], -abbr[data-original-title] { - border-bottom: 1px dotted #999999; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 14px; - border-left: 5px solid #986dbd; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #999999; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - border-right: 5px solid #986dbd; -} -address { - margin-bottom: 20px; - line-height: 1.42857143; -} -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 0; - -webkit-box-shadow: 0 0 0; - box-shadow: 0 0 0; -} -.panel-heading { - border-top-right-radius: 0; - border-top-left-radius: 0; - text-transform: uppercase; - letter-spacing: 0.08em; - padding: 15px 15px; -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 0; - overflow: hidden; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group.accordion .panel { - border-color: #ccc; -} -.panel-primary { - border-color: #986dbd; -} -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #986dbd; - border-color: #986dbd; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #986dbd; -} -.panel-primary > .panel-heading .badge { - color: #986dbd; - background-color: #ffffff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #986dbd; -} -.panel-primary .panel-title { - font-weight: 300; -} -.panel-primary .panel-title a:hover { - color: #fff; - text-decoration: none; -} -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #986dbd; - background-color: #ffffff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.progress-bar-primary { - background-color: #986dbd; -} -.progress-striped .progress-bar-primary { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -/*! - * Yamm!3 - Yet another megamenu for Bootstrap 3 - * http://geedmo.github.com/yamm3 - * - * @geedmo - Licensed under the MIT license - */ -.yamm .nav, -.yamm .collapse, -.yamm .dropup.use-yamm, -.yamm .dropdown.use-yamm { - position: static; -} -.yamm .container { - position: relative; -} -.yamm .dropdown-menu { - left: auto; -} -.yamm .nav.navbar-right .dropdown-menu { - left: auto; - right: 0; -} -.yamm .yamm-content { - padding: 20px 30px; -} -.yamm .dropdown.yamm-fw .dropdown-menu { - left: 15px; - right: 15px; -} diff --git a/css/swagger-ui.css b/css/swagger-ui.css new file mode 100644 index 0000000..c61e5a8 --- /dev/null +++ b/css/swagger-ui.css @@ -0,0 +1,4 @@ +.swagger-ui{ + /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */font-family:sans-serif;color:#3b4151}.swagger-ui html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:content-box;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{background-color:transparent;-webkit-text-decoration-skip:objects}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:baseline}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui template{display:none}.swagger-ui [hidden]{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left{background-repeat:no-repeat;background-position:0}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top-ns{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right-ns{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom-ns{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left-ns{background-repeat:no-repeat;background-position:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bg-center-m{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top-m{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right-m{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom-m{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left-m{background-repeat:no-repeat;background-position:0}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top-l{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right-l{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom-l{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left-l{background-repeat:no-repeat;background-position:0}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid transparent}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid transparent}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid transparent}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid transparent}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:hsla(0,0%,100%,.9)}.swagger-ui .b--white-80{border-color:hsla(0,0%,100%,.8)}.swagger-ui .b--white-70{border-color:hsla(0,0%,100%,.7)}.swagger-ui .b--white-60{border-color:hsla(0,0%,100%,.6)}.swagger-ui .b--white-50{border-color:hsla(0,0%,100%,.5)}.swagger-ui .b--white-40{border-color:hsla(0,0%,100%,.4)}.swagger-ui .b--white-30{border-color:hsla(0,0%,100%,.3)}.swagger-ui .b--white-20{border-color:hsla(0,0%,100%,.2)}.swagger-ui .b--white-10{border-color:hsla(0,0%,100%,.1)}.swagger-ui .b--white-05{border-color:hsla(0,0%,100%,.05)}.swagger-ui .b--white-025{border-color:hsla(0,0%,100%,.025)}.swagger-ui .b--white-0125{border-color:hsla(0,0%,100%,.0125)}.swagger-ui .b--black-90{border-color:rgba(0,0,0,.9)}.swagger-ui .b--black-80{border-color:rgba(0,0,0,.8)}.swagger-ui .b--black-70{border-color:rgba(0,0,0,.7)}.swagger-ui .b--black-60{border-color:rgba(0,0,0,.6)}.swagger-ui .b--black-50{border-color:rgba(0,0,0,.5)}.swagger-ui .b--black-40{border-color:rgba(0,0,0,.4)}.swagger-ui .b--black-30{border-color:rgba(0,0,0,.3)}.swagger-ui .b--black-20{border-color:rgba(0,0,0,.2)}.swagger-ui .b--black-10{border-color:rgba(0,0,0,.1)}.swagger-ui .b--black-05{border-color:rgba(0,0,0,.05)}.swagger-ui .b--black-025{border-color:rgba(0,0,0,.025)}.swagger-ui .b--black-0125{border-color:rgba(0,0,0,.0125)}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:transparent}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left{border-top-right-radius:0;border-bottom-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left-ns{border-top-right-radius:0;border-bottom-right-radius:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left-m{border-top-right-radius:0;border-bottom-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left-l{border-top-right-radius:0;border-bottom-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{top:0;right:0;bottom:0;left:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{top:0;right:0;bottom:0;left:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{top:0;right:0;bottom:0;left:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{top:0;right:0;bottom:0;left:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:" ";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{*zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{float:left;_display:inline}.swagger-ui .fr{float:right;_display:inline}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{float:left;_display:inline}.swagger-ui .fr-ns{float:right;_display:inline}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .fl-m{float:left;_display:inline}.swagger-ui .fr-m{float:right;_display:inline}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{float:left;_display:inline}.swagger-ui .fr-l{float:right;_display:inline}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{text-decoration:none}.swagger-ui .link,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:hover{transition:color .15s ease-in}.swagger-ui .link:active{transition:color .15s ease-in}.swagger-ui .link:focus{transition:color .15s ease-in;outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.33333%}.swagger-ui .w-two-thirds{width:66.66667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.33333%}.swagger-ui .w-two-thirds-ns{width:66.66667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.33333%}.swagger-ui .w-two-thirds-m{width:66.66667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.33333%}.swagger-ui .w-two-thirds-l{width:66.66667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315{-webkit-transform:rotate(315deg);transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90-ns{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135-ns{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180-ns{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225-ns{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270-ns{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315-ns{-webkit-transform:rotate(315deg);transform:rotate(315deg)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .rotate-45-m{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90-m{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135-m{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180-m{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225-m{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270-m{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315-m{-webkit-transform:rotate(315deg);transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90-l{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135-l{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180-l{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225-l{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270-l{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315-l{-webkit-transform:rotate(315deg);transform:rotate(315deg)}}.swagger-ui .black-90{color:rgba(0,0,0,.9)}.swagger-ui .black-80{color:rgba(0,0,0,.8)}.swagger-ui .black-70{color:rgba(0,0,0,.7)}.swagger-ui .black-60{color:rgba(0,0,0,.6)}.swagger-ui .black-50{color:rgba(0,0,0,.5)}.swagger-ui .black-40{color:rgba(0,0,0,.4)}.swagger-ui .black-30{color:rgba(0,0,0,.3)}.swagger-ui .black-20{color:rgba(0,0,0,.2)}.swagger-ui .black-10{color:rgba(0,0,0,.1)}.swagger-ui .black-05{color:rgba(0,0,0,.05)}.swagger-ui .white-90{color:hsla(0,0%,100%,.9)}.swagger-ui .white-80{color:hsla(0,0%,100%,.8)}.swagger-ui .white-70{color:hsla(0,0%,100%,.7)}.swagger-ui .white-60{color:hsla(0,0%,100%,.6)}.swagger-ui .white-50{color:hsla(0,0%,100%,.5)}.swagger-ui .white-40{color:hsla(0,0%,100%,.4)}.swagger-ui .white-30{color:hsla(0,0%,100%,.3)}.swagger-ui .white-20{color:hsla(0,0%,100%,.2)}.swagger-ui .white-10{color:hsla(0,0%,100%,.1)}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:rgba(0,0,0,.9)}.swagger-ui .bg-black-80{background-color:rgba(0,0,0,.8)}.swagger-ui .bg-black-70{background-color:rgba(0,0,0,.7)}.swagger-ui .bg-black-60{background-color:rgba(0,0,0,.6)}.swagger-ui .bg-black-50{background-color:rgba(0,0,0,.5)}.swagger-ui .bg-black-40{background-color:rgba(0,0,0,.4)}.swagger-ui .bg-black-30{background-color:rgba(0,0,0,.3)}.swagger-ui .bg-black-20{background-color:rgba(0,0,0,.2)}.swagger-ui .bg-black-10{background-color:rgba(0,0,0,.1)}.swagger-ui .bg-black-05{background-color:rgba(0,0,0,.05)}.swagger-ui .bg-white-90{background-color:hsla(0,0%,100%,.9)}.swagger-ui .bg-white-80{background-color:hsla(0,0%,100%,.8)}.swagger-ui .bg-white-70{background-color:hsla(0,0%,100%,.7)}.swagger-ui .bg-white-60{background-color:hsla(0,0%,100%,.6)}.swagger-ui .bg-white-50{background-color:hsla(0,0%,100%,.5)}.swagger-ui .bg-white-40{background-color:hsla(0,0%,100%,.4)}.swagger-ui .bg-white-30{background-color:hsla(0,0%,100%,.3)}.swagger-ui .bg-white-20{background-color:hsla(0,0%,100%,.2)}.swagger-ui .bg-white-10{background-color:hsla(0,0%,100%,.1)}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:transparent}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:rgba(0,0,0,.9)}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:rgba(0,0,0,.8)}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:rgba(0,0,0,.7)}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:rgba(0,0,0,.6)}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:rgba(0,0,0,.5)}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:rgba(0,0,0,.4)}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:rgba(0,0,0,.3)}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:rgba(0,0,0,.2)}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:rgba(0,0,0,.1)}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:hsla(0,0%,100%,.9)}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:hsla(0,0%,100%,.8)}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:hsla(0,0%,100%,.7)}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:hsla(0,0%,100%,.6)}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:hsla(0,0%,100%,.5)}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:hsla(0,0%,100%,.4)}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:hsla(0,0%,100%,.3)}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:hsla(0,0%,100%,.2)}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:hsla(0,0%,100%,.1)}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:transparent}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-top:0;padding-bottom:0}.swagger-ui .pv1{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-top:0;margin-bottom:0}.swagger-ui .mv1{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-top:0;padding-bottom:0}.swagger-ui .pv1-ns{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2-ns{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3-ns{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4-ns{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5-ns{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6-ns{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7-ns{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-top:0;margin-bottom:0}.swagger-ui .mv1-ns{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2-ns{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3-ns{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4-ns{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5-ns{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6-ns{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7-ns{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-top:0;padding-bottom:0}.swagger-ui .pv1-m{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2-m{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3-m{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4-m{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5-m{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6-m{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7-m{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-top:0;margin-bottom:0}.swagger-ui .mv1-m{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2-m{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3-m{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4-m{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5-m{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6-m{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7-m{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-top:0;padding-bottom:0}.swagger-ui .pv1-l{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2-l{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3-l{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4-l{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5-l{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6-l{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7-l{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-top:0;margin-bottom:0}.swagger-ui .mv1-l{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2-l{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3-l{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4-l{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5-l{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6-l{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7-l{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.swagger-ui .stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.swagger-ui .strike{text-decoration:line-through}.swagger-ui .underline{text-decoration:underline}.swagger-ui .no-underline{text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{text-decoration:line-through}.swagger-ui .underline-ns{text-decoration:underline}.swagger-ui .no-underline-ns{text-decoration:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .strike-m{text-decoration:line-through}.swagger-ui .underline-m{text-decoration:underline}.swagger-ui .no-underline-m{text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{text-decoration:line-through}.swagger-ui .underline-l{text-decoration:underline}.swagger-ui .no-underline-l{text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps{font-variant:small-caps}.swagger-ui .truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps-ns{font-variant:small-caps}.swagger-ui .truncate-ns{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps-m{font-variant:small-caps}.swagger-ui .truncate-m{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps-l{font-variant:small-caps}.swagger-ui .truncate-l{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .center-m{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}@media screen and (min-width:30em){.swagger-ui .clip-ns{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .clip-m{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:60em){.swagger-ui .clip-l{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:baseline}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:baseline}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .v-base-m{vertical-align:baseline}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:baseline}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-out;transition:transform .25s ease-out;transition:transform .25s ease-out, -webkit-transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{-webkit-transform:scale(1.05);transform:scale(1.05)}.swagger-ui .grow:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-in-out;transition:transform .25s ease-in-out;transition:transform .25s ease-in-out, -webkit-transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.swagger-ui .grow-large:active{-webkit-transform:scale(.95);transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{content:"";box-shadow:0 0 16px 2px rgba(0,0,0,.2);border-radius:inherit;opacity:0;position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;transition:opacity .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial{z-index:auto}.swagger-ui .z-unset{z-index:unset}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{padding-left:0;margin-left:0;list-style-type:none}.swagger-ui .nested-copy-indent p+p{text-indent:.1em;margin-top:0;margin-bottom:0}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{width:100%;max-width:100%;display:block}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{width:100%;max-width:1460px;margin:0 auto;padding:0 20px;box-sizing:border-box}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .opblock-tag{display:flex;align-items:center;padding:10px 20px 10px 10px;cursor:pointer;transition:all .2s;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{font-size:24px;margin:0 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{font-size:14px;font-weight:400;flex:1;padding:0 10px;font-family:sans-serif;color:#3b4151}.swagger-ui .parameter__type{font-size:12px;padding:5px 0;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-weight:700;font-size:.9rem;margin-bottom:.5rem}.swagger-ui .examples-select{margin-bottom:.75em}.swagger-ui .examples-select__section-label{font-weight:700;font-size:.9rem;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-weight:700;font-size:.9rem;margin-bottom:.5rem}.swagger-ui .view-line-link{position:relative;top:3px;width:20px;margin:0 5px;cursor:pointer;transition:all .5s}.swagger-ui .opblock{margin:0 0 15px;border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19)}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{padding:0 40px;cursor:pointer}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{position:absolute;bottom:-15px;left:50%;width:120%;height:4px;content:"";-webkit-transform:translateX(-50%);transform:translateX(-50%);background:grey}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{display:flex;align-items:center;padding:8px 20px;min-height:50px;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-section-header>label{font-size:12px;font-weight:700;display:flex;align-items:center;margin:0 0 0 auto;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{font-size:14px;flex:1;margin:0;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary-method{font-size:14px;font-weight:700;min-width:80px;padding:6px 15px;text-align:center;border-radius:3px;background:#000;text-shadow:0 1px 0 rgba(0,0,0,.1);font-family:sans-serif;color:#fff}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:16px;display:flex;align-items:center;word-break:break-word;padding:0 10px;font-family:monospace;font-weight:600;color:#3b4151}@media (max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{font-size:13px;flex:1 1 auto;word-break:break-word;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary{display:flex;align-items:center;padding:5px;cursor:pointer}.swagger-ui .opblock .opblock-summary .view-line-link{position:relative;top:2px;width:0;margin:0;cursor:pointer;transition:all .5s}.swagger-ui .opblock .opblock-summary:hover .view-line-link{width:18px;margin:0 5px}.swagger-ui .opblock.opblock-post{border-color:#49cc90;background:rgba(73,204,144,.1)}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{border-color:#fca130;background:rgba(252,161,48,.1)}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{border-color:#f93e3e;background:rgba(249,62,62,.1)}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{border-color:#61affe;background:rgba(97,175,254,.1)}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{border-color:#50e3c2;background:rgba(80,227,194,.1)}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{border-color:#9012fe;background:rgba(144,18,254,.1)}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{border-color:#0d5aa7;background:rgba(13,90,167,.1)}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{opacity:.6;border-color:#ebebeb;background:hsla(0,0%,92.2%,.1)}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{width:100%;margin:20px 0;padding:10px;border:2px solid #d8dde7}.swagger-ui .model-example{margin-top:1em}.swagger-ui .tab{display:flex;padding:0;list-style:none}.swagger-ui .tab li{font-size:12px;min-width:60px;padding:0;cursor:pointer;font-family:sans-serif;color:#3b4151}.swagger-ui .tab li:first-of-type{position:relative;padding-left:0;padding-right:12px}.swagger-ui .tab li:first-of-type:after{position:absolute;top:0;right:6px;width:1px;height:100%;content:"";background:rgba(0,0,0,.2)}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{font-size:12px;margin:0 0 5px;padding:15px 20px;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{font-size:12px;margin:0 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{font-size:14px;margin:0;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{width:100%;padding:8px 40px}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{font-size:12px;margin:10px 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui .response-col_status{font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .response-col_status .response-undocumented{font-size:11px;font-family:monospace;font-weight:600;color:#909090}.swagger-ui .response-col_links{padding-left:2em;max-width:40em;font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .response-col_links .response-undocumented{font-size:11px;font-family:monospace;font-weight:600;color:#909090}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{font-size:12px;margin:0;padding:10px;white-space:pre-wrap;word-wrap:break-word;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;border-radius:4px;background:#41444e;overflow-wrap:break-word;font-family:monospace;font-weight:600;color:#fff}.swagger-ui .opblock-body pre.microlight span{color:#fff!important}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{overflow-y:auto;max-height:400px;min-height:6em}.swagger-ui .download-contents{position:absolute;bottom:10px;right:10px;cursor:pointer;background:#7d8293;text-align:center;padding:5px;border-radius:4px;font-family:sans-serif;font-weight:600;color:#fff;font-size:14px;height:30px;width:75px}.swagger-ui .scheme-container{margin:0 0 20px;padding:30px 0;background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.swagger-ui .scheme-container .schemes{display:flex;align-items:flex-end}.swagger-ui .scheme-container .schemes>label{font-size:12px;font-weight:700;display:flex;flex-direction:column;margin:-20px 15px 0 0;font-family:sans-serif;color:#3b4151}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{padding:40px 0 60px;margin-top:1em;min-height:1px;display:flex;justify-content:center;align-items:center;flex-direction:column}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{font-size:10px;font-weight:700;position:absolute;top:50%;left:50%;content:"loading";-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-transform:uppercase;font-family:sans-serif;color:#3b4151}.swagger-ui .loading-container .loading:before{position:absolute;top:50%;left:50%;display:block;width:60px;height:60px;margin:-30px;content:"";-webkit-animation:rotation 1s linear infinite,opacity .5s;animation:rotation 1s linear infinite,opacity .5s;opacity:1;border:2px solid rgba(85,85,85,.1);border-top-color:rgba(0,0,0,.6);border-radius:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden}@-webkit-keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.swagger-ui .response-controls{padding-top:1em;display:flex}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;margin-bottom:.2em;font-size:.7em}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui section h3{font-family:sans-serif;color:#3b4151}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{text-decoration:inherit;color:inherit;cursor:pointer}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;justify-content:center;height:100%;font-size:1.2em;text-align:center;line-height:1.5em;padding:0 .6em}.swagger-ui .version-pragma__message>div{max-width:55ch;flex:1}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .btn{font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s;border:2px solid grey;border-radius:4px;background:transparent;box-shadow:0 1px 2px rgba(0,0,0,.1);font-family:sans-serif;color:#3b4151}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{border-color:#ff6060;background-color:transparent;font-family:sans-serif;color:#ff6060}.swagger-ui .btn.authorize{line-height:1;display:inline;color:#49cc90;border-color:#49cc90;background-color:transparent}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;color:#fff;border-color:#4990e2}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{padding:0 10px;border:none;background:none}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .expand-methods,.swagger-ui .expand-operation{border:none;background:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{width:20px;height:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{transition:all .3s;fill:#707070}.swagger-ui button{cursor:pointer;outline:none}.swagger-ui button.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui select{font-size:14px;font-weight:700;padding:5px 40px 5px 10px;border:2px solid #41444e;border-radius:4px;background:#f7f7f7 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+PHBhdGggZD0iTTEzLjQxOCA3Ljg1OWEuNjk1LjY5NSAwIDAxLjk3OCAwIC42OC42OCAwIDAxMCAuOTY5bC0zLjkwOCAzLjgzYS42OTcuNjk3IDAgMDEtLjk3OSAwbC0zLjkwOC0zLjgzYS42OC42OCAwIDAxMC0uOTY5LjY5NS42OTUgMCAwMS45NzggMEwxMCAxMWwzLjQxOC0zLjE0MXoiLz48L3N2Zz4=) right 10px center no-repeat;background-size:20px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);font-family:sans-serif;color:#3b4151;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui select[multiple]{margin:5px 0;padding:5px;background:#f7f7f7}.swagger-ui select.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui .opblock-body select{min-width:230px}@media (max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}.swagger-ui label{font-size:12px;font-weight:700;margin:0 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{min-width:100px;margin:5px 0;padding:8px 10px;border:1px solid #d9d9d9;border-radius:4px;background:#fff}@media (max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{max-width:175px}}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}.swagger-ui textarea{font-size:12px;width:100%;min-height:280px;padding:10px;border:none;border-radius:4px;outline:none;background:hsla(0,0%,100%,.8);font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{font-size:12px;min-height:100px;margin:0;padding:10px;resize:none;border-radius:4px;background:#41444e;font-family:monospace;font-weight:600;color:#fff}.swagger-ui .checkbox{padding:5px 0 10px;transition:opacity .5s;color:#303030}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{font-weight:400!important;font-style:italic;margin:0!important;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{position:relative;top:3px;display:inline-block;width:16px;height:16px;margin:0 8px 0 0;padding:5px;cursor:pointer;border-radius:1px;background:#e8e8e8;box-shadow:0 0 0 2px #e8e8e8;flex:none}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url("data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='8' viewBox='3 7 10 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2341474E' fill-rule='evenodd' d='M6.333 15L3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z'/%3E%3C/svg%3E") 50% no-repeat}.swagger-ui .dialog-ux{position:fixed;z-index:9999;top:0;right:0;bottom:0;left:0}.swagger-ui .dialog-ux .backdrop-ux{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.8)}.swagger-ui .dialog-ux .modal-ux{position:absolute;z-index:9999;top:50%;left:50%;width:100%;min-width:300px;max-width:650px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border:1px solid #ebebeb;border-radius:4px;background:#fff;box-shadow:0 10px 30px 0 rgba(0,0,0,.2)}.swagger-ui .dialog-ux .modal-ux-content{overflow-y:auto;max-height:540px;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{font-size:12px;margin:0 0 5px;color:#41444e;font-family:sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-content h4{font-size:18px;font-weight:600;margin:15px 0 0;font-family:sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-header{display:flex;padding:12px 0;border-bottom:1px solid #ebebeb;align-items:center}.swagger-ui .dialog-ux .modal-ux-header .close-modal{padding:0 10px;border:none;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui .dialog-ux .modal-ux-header h3{font-size:20px;font-weight:600;margin:0;padding:0 20px;flex:1;font-family:sans-serif;color:#3b4151}.swagger-ui .model{font-size:12px;font-weight:300;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{text-decoration:line-through}.swagger-ui .model-toggle{font-size:10px;position:relative;top:6px;display:inline-block;margin:auto .3em;cursor:pointer;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in, -webkit-transform .15s ease-in;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}.swagger-ui .model-toggle.collapsed{-webkit-transform:rotate(0deg);transform:rotate(0deg)}.swagger-ui .model-toggle:after{display:block;width:20px;height:20px;content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'/%3E%3C/svg%3E") 50% no-repeat;background-size:100%}.swagger-ui .model-jump-to-path{position:relative;cursor:pointer}.swagger-ui .model-jump-to-path .view-line-link{position:absolute;top:-.4em;cursor:pointer}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{position:absolute;top:-1.8em;visibility:hidden;padding:.1em .5em;white-space:nowrap;color:#ebebeb;border-radius:4px;background:rgba(0,0,0,.7)}.swagger-ui .model p{margin:0 0 1em}.swagger-ui section.models{margin:30px 0;border:1px solid rgba(59,65,81,.3);border-radius:4px}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{margin:0 0 5px;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui section.models h4{font-size:16px;display:flex;align-items:center;margin:0;padding:10px 20px 10px 10px;cursor:pointer;transition:all .2s;font-family:sans-serif;color:#606060}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{font-size:16px;margin:0 0 10px;font-family:sans-serif;color:#707070}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{margin:0 20px 15px;position:relative;transition:all .5s;border-radius:4px;background:rgba(0,0,0,.05)}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{position:absolute;top:8px;right:5px;opacity:.65}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{padding:10px;display:inline-block;border-radius:4px;background:rgba(0,0,0,.1)}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{font-size:16px;font-family:sans-serif;color:#505050}.swagger-ui .model-deprecated-warning{font-size:16px;font-weight:600;margin-right:1em;font-family:sans-serif;color:#f93e3e}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{font-size:12px;margin:-20px 15px 0 0;font-family:sans-serif;color:#3b4151}.swagger-ui .servers>label select{min-width:130px;max-width:100%}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;vertical-align:middle;padding-top:10px;padding-bottom:10px}.swagger-ui .servers table td:first-of-type{padding-right:2em}.swagger-ui .servers table td input{width:100%;height:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;padding:4px;font-size:16px;margin:0 1em}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{width:100%;padding:0 10px;border-collapse:collapse}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{width:174px;padding:0 0 0 2em}.swagger-ui table.headers td{font-size:12px;font-weight:300;vertical-align:middle;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{max-width:20%;min-width:6em;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{font-size:12px;font-weight:700;padding:12px 0;text-align:left;border-bottom:1px solid rgba(59,65,81,.2);font-family:sans-serif;color:#3b4151}.swagger-ui .parameters-col_description{width:99%;margin-bottom:2em}.swagger-ui .parameters-col_description input[type=text]{width:100%;max-width:340px}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameter__name{font-size:16px;font-weight:400;margin-right:.75em;font-family:sans-serif;color:#3b4151}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required:after{font-size:10px;position:relative;top:-6px;padding:5px;content:"required";color:rgba(255,0,0,.6)}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{font-size:12px;font-style:italic;font-family:monospace;font-weight:600;color:grey}.swagger-ui .parameter__deprecated{font-size:12px;font-style:italic;font-family:monospace;font-weight:600;color:red}.swagger-ui .parameter__empty_value_toggle{font-size:13px;padding-top:5px;padding-bottom:12px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .topbar{padding:10px 0;background-color:#1b1b1b}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{display:flex;align-items:center}.swagger-ui .topbar a{font-size:1.5em;font-weight:700;flex:1;max-width:300px;text-decoration:none;font-family:sans-serif;color:#fff}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{width:100%;margin:0;border:2px solid #62a03f;border-radius:4px 0 0 4px;outline:none}.swagger-ui .topbar .download-url-wrapper .select-label{display:flex;align-items:center;width:100%;max-width:600px;margin:0;color:#f0f0f0}.swagger-ui .topbar .download-url-wrapper .select-label span{font-size:16px;flex:1;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{flex:2;width:100%;border:2px solid #62a03f;outline:none;box-shadow:none}.swagger-ui .topbar .download-url-wrapper .download-url-button{font-size:16px;font-weight:700;padding:4px 30px;border:none;border-radius:0 4px 4px 0;background:#62a03f;font-family:sans-serif;color:#fff}.swagger-ui .info{margin:50px 0}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info pre{font-size:14px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{font-family:sans-serif;color:#3b4151}.swagger-ui .info a{font-size:14px;transition:all .4s;font-family:sans-serif;color:#4990e2}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{font-size:12px;font-weight:300!important;margin:0;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .info .title{font-size:36px;margin:0;font-family:sans-serif;color:#3b4151}.swagger-ui .info .title small{font-size:10px;position:relative;top:-5px;display:inline-block;margin:0 0 0 5px;padding:2px 4px;vertical-align:super;border-radius:57px;background:#7d8492}.swagger-ui .info .title small pre{margin:0;padding:0;font-family:sans-serif;color:#fff}.swagger-ui .auth-btn-wrapper{display:flex;padding:10px 0;justify-content:center}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{padding-right:20px;margin-right:10px}.swagger-ui .auth-container{margin:0 0 10px;padding:10px 20px;border-bottom:1px solid #ebebeb}.swagger-ui .auth-container:last-of-type{margin:0;padding:10px 20px;border:0}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{font-size:12px;padding:10px;border-radius:4px;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .scopes h2{font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{margin:20px;padding:10px 20px;-webkit-animation:scaleUp .5s;animation:scaleUp .5s;border:2px solid #f93e3e;border-radius:4px;background:rgba(249,62,62,.1)}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{font-size:14px;margin:0;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper hgroup{display:flex;align-items:center}.swagger-ui .errors-wrapper hgroup h4{font-size:20px;margin:0;flex:1;font-family:sans-serif;color:#3b4151}@-webkit-keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{color:#000;font-weight:400;white-space:pre-wrap;background:none;padding:0}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{font-size:14px;padding:5px 7px;border-radius:4px;background:rgba(0,0,0,.05);font-family:monospace;font-weight:600;color:#9012fe}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block} + +/*# sourceMappingURL=swagger-ui.css.map*/ \ No newline at end of file diff --git a/docs/deployment/baremetal/deploy-natively-11/index.html b/docs/deployment/baremetal/deploy-natively-11/index.html new file mode 100644 index 0000000..05f83ea --- /dev/null +++ b/docs/deployment/baremetal/deploy-natively-11/index.html @@ -0,0 +1,785 @@ + + + + + + + + + + + + + + + + + + + + +Ubuntu 18.04 LTS, Java 11 | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Ubuntu 18.04 LTS, Java 11

+
Bare metal deployment with Ubuntu 18.04 LTS and Java 11
+ +

Introduction

+

We are covering the update for ubuntu 18.04 LTS here, because that is our main / agreed base system for running sw360. sw360 may run on a varienty of other linux distributions or OSes such as macosx, but in order to avoid problem we agreed on having a reference OS, which are the ubuntu long term releases. The author of this guide also uses macosx and homebrew which also works fairly well.

+

Please note that during the time, the dependencies are updated and the version info might change.

+

Overview

+

The installation consists of quite some tasks, as an overview:

+
    +
  1. Java 11
  2. +
  3. Postgresql, if we want to use it instead of hypersonic db
  4. +
  5. CouchDB 2.X at the time of starting this guide, but 3.1.X seems to work well
  6. +
  7. Thrift to 0.13, later updated to 0.14
  8. +
  9. Liferay CE 7.3.3 and 7.3.4 has been also tested
  10. +
  11. Adjust /etc/ini.d/tomcat with path of new liferay
  12. +
  13. Adjust $liferay_install variable
  14. +
  15. add Java prerequisites to OSGi container
  16. +
  17. Install couchdb-lucene (2.1)
  18. +
  19. Deploy new version of sw360
  20. +
  21. Go ahead with Liferay steps
  22. +
+

Initial steps

+

In order to “calibrate the system” just run the update / upgrade cycle once:

+

# sudo apt update

+

# sudo apt upgrade

+

PostgreSQL

+

You can go ahead install postgresql 10:

+

sudo apt install postgresql-10

+

or whatever package version is suitable here, for example version 12 for ubuntu 20.04.

+

The configuration for Liferay will come later.

+

CouchDB

+

CouchDB is not part of the Ubuntu package management anymore. Thus, you need to add the Apache CouchDB package repository to install it, first the key for signing:

+

curl -L https://couchdb.apache.org/repo/bintray-pubkey.asc | sudo apt-key add -

+

The add the repo to the sources:

+

echo "deb https://apache.bintray.com/couchdb-deb bionic main" | sudo tee -a /etc/apt/sources.list

+

Then, add its contents to the package database by updating apt:

+

sudo apt-get update -y

+

Ultimately install CouchDB, we tried with 2.1.2 install:

+

sudo apt-get install -y couchdb=2.1.2~bionic

+

The installer will ask a couple of questions:

+
    +
  1. Bind address: for CouchDB and SW360 127.0.0.1 (localhost) is a good bind address, if you would like to access the server from a remote computer because your sw360 runs as a server in the network, you would need to change accordingly.
  2. +
  3. Admin user: For fresh installation for sure a very good idea. You can set the password at sw360 for CouchDB in couchdb.properties and place it centrally in /etc/sw360
  4. +
+

In case you added an admin accidentally and would like to remove it,

+

Thrift

+

For thrift, we need version 0.13. The installation script in scripts/install-thrift.sh will help you:

+

sudo ./install-thrift.sh

+

In case there is thrift in the package management of the OS you re running on, just make sure, you have version 0.13

+

OpenJDK 11

+

First check, what is installed.

+

# sudo apt list openjdk* --installed

+

Then you could check what is available:

+

# sudo apt list openjdk*

+

And install OpenJDK 11

+

# sudo apt install openjdk-11-jdk

+

Then the $JAVA_HOME needs to be updated, most likely in /etc/environment. Please check for your installation how to set the $JAVA_HOME correctly (most likely: JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64).

+

Liferay CE 7.3.3

+

Download Liferay from this link

+

https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.3.3%20GA4/liferay-ce-portal-tomcat-7.3.3-ga4-20200701015330959.tar.gz

+

and unpack it, ideally in the /opt directory, so resulting path would look like /opt/liferay-ce-portal-7.3.3-ga4.

+

Then, you need to update the $LIFERAY_INSTALL in /etc/environment from LIFERAY_INSTALL=/opt/liferay-portal-7.2.0-ga1/ to `LIFERAY_INSTALL=/opt/liferay-ce-portal-7.3.3-ga4.

+

Auto Start

+

For auto start, you need an according init.d entry. It could be a file like /etc/init.d/tomcat. The file could be created if not there already, with the following contents:

+
#!/bin/bash
+
+### BEGIN INIT INFO
+# Provides:        tomcat7
+# Required-Start:  $network
+# Required-Stop:   $network
+# Default-Start:   2 3 4 5
+# Default-Stop:    0 1 6
+# Short-Description: Start/Stop Tomcat server
+### END INIT INFO
+
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+
+start() {
+ su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/startup.sh
+}
+
+stop() {
+ su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/shutdown.sh
+}
+
+case $1 in
+  start|stop) $1;;
+  restart) stop; start;;
+  *) echo "Run as $0 <start|stop|restart>"; exit 1;;
+esac
+

Te user siemagrant is used in the sw360vagrant project. it is the username of the user where the liefray / sw360 server should run under. In the ideal case, it is unprivileged user.

+

Adjust Memory

+

When you have downloaded the liferay distribution, Tomcat is likely configured with very basic memory settings. For trying sw360, the standard memory settings are OK. But of course, the memory settings in $LIFERAY_HOME/tomcat-X.0.XX/bin/setenv.sh should be adapted again.

+

PostgreSQL instead of Hypersonic

+

Liferay CE comes with the hypersonic database. Just for making a long-term setup in the berginning, we are advising to use postgresql from the start. The settings for postgrsql can be found in portal-ext.properties. Please do not forget to create the user and the database in the database server first.

+

Install Prerequisites

+

There are some install libraries to be downloaded and installed as OSGi modules. You can check the download script from the sw360vaghrant project for list of URLs that help you.

+

https://github.com/sw360/sw360vagrant/blob/master/download-packages.sh

+

An URL for libtrift is:

+

https://repo1.maven.org/maven2/org/apache/thrift/libthrift/0.13.0/libthrift-0.13.0.jar

+

An URL for commons-compress is:

+

https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.20/commons-compress-1.20.jar

+

If you have downloaded every thing, copy them to the deploy folder of your liferay installation:

+
# cp libthrift-0.13.0.jar $LIFEARY_HOME/deploy/
+# cp commons-lang-2.4.jar $LIFERAY_HOME/deploy
+# cp commons-io-2.6.jar $LIFERAY_HOME/deploy
+# cp commons-csv-1.4.jar $LIFERAY_HOME/deploy
+# cp commons-collections4-4.4.jar $LIFERAY_HOME/deploy
+# cp commons-codec-1.12.jar $LIFERAY_HOME/deploy
+# cp commons-compress-1.20.jar $LIFERAY_HOME/deploy
+# cp commons-logging-1.2.jar $LIFERAY_HOME/deploy
+# cp gson-2.8.5.jar $LIFERAY_HOME/deploy
+# cp guava-21.0.jar $LIFERAY_HOME/deploy
+# cp jackson-annotations-2.11.3.jar $LIFERAY_HOME/deploy
+# cp jackson-core-2.11.3.jar $LIFERAY_HOME/deploy
+# cp jackson-databind-2.11.3.jar $LIFERAY_HOME/deploy
+

if you use PostgreSQL as your database, you need to install postgres.jar in Liferay.

+
# wget https://jdbc.postgresql.org/download/postgresql-42.2.9.jar postgresql-42.2.9.jar
+# cp postgresql-42.2.9.jar $LIFERAY_HOME/tomcat-9.0.33/lib/ext
+

[Note] In case you use other database with Liferay, you need to set other jar file of corresponding database.

+

Install Couchdb Lucene

+

SW360 uses for searching the contents of the couchdb databases a lucene-based server named couchdb-lucene. The main issue here is that it requires a patch for the use in the normal SW3360 setups. The reason for the patch is that the developers presume that couchdb-lucene runs as the only component in the application server, while in the sw360 setup, there is a setup in which couchdb-lucene runs along with other components in the same application container.

+

Start with downloading the couchdb-lucene and rename the archive so the resulting URL path element will be couchdb-lucene:

+

# wget https://github.com/rnewson/couchdb-lucene/archive/v2.1.0.tar.gz ./couchdb-lucene.tar.gz

+

Please refer to the script in sw360vagrant how to apply the patch to couchdb-lucene:

+

https://github.com/sw360/sw360vagrant/blob/master/shared/scripts/install-lucene.sh

+

Please note that the patching issue is well known in the project and it is unclear why it is not merged:

+ +

Deploy New SW360

+

You will need to checkout new Java-11 based version of the SW360, which is either tagged version 11 (or later) or some few commits before that. Then build in the sw360 project root using:

+

mvn clean install -DskipTests

+

This will install new artfacts, such as lib-datahandler in your maven repostiory. Then apply in the same directory:

+
# mvn clean package -P deploy -Dbase.deploy.dir=. -Dliferay.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/deploy/ -Dbackend.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/webapps/ -Drest.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/webapps/ -DskipTests
+

Skipping tests has the reason that usually, the sw360 is tested in the CI and thus, local tests are note necessary, if the code has not been changed locally. Note that the REST API documentation framework is based on building test cases and thus for deploying a version with REST API documentation, tests should be executed:

+
# cd rest
+# mvn clean package -P deploy -Dbase.deploy.dir=. -Dliferay.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/deploy/ -Dbackend.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/webapps/ -Drest.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/webapps/
+

Final Steps in Liferay

+

Liferay CE 7.3 will need to have some manual steps applied in order to complete the setup. Unfortunately, these cannot be automated (if you know how, please let us know). For earlier versions of Liferay, please refer to the main wiki page. For Liferay CE 7.3.3 please continue here:

+

https://github.com/eclipse/sw360/wiki/Deploy-Liferay7.3

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/baremetal/index.html b/docs/deployment/baremetal/index.html new file mode 100644 index 0000000..ec0fdfc --- /dev/null +++ b/docs/deployment/baremetal/index.html @@ -0,0 +1,636 @@ + + + + + + + + + + + + + + + + + + + + + +Bare Metal | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Bare Metal

+
SW360 Bare Metal Deployment
+ + +
+ + + + + + + + +
+ + +
+
+ Ubuntu 18.04 LTS, Java 11 +
+

Bare metal deployment with Ubuntu 18.04 LTS and Java 11

+
+ + +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/baremetal/index.xml b/docs/deployment/baremetal/index.xml new file mode 100644 index 0000000..6d1af0f --- /dev/null +++ b/docs/deployment/baremetal/index.xml @@ -0,0 +1,170 @@ + + + Eclipse SW360 – Bare Metal + https://www.eclipse.org/sw360/docs/deployment/baremetal/ + Recent content in Bare Metal on Eclipse SW360 + Hugo -- gohugo.io + + + + + + + + + + + Docs: Ubuntu 18.04 LTS, Java 11 + https://www.eclipse.org/sw360/docs/deployment/baremetal/deploy-natively-11/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/baremetal/deploy-natively-11/ + + + + <h2 id="introduction">Introduction</h2> +<p>We are covering the update for ubuntu 18.04 LTS here, because that is our main / agreed base system for running sw360. sw360 may run on a varienty of other linux distributions or OSes such as macosx, but in order to avoid problem we agreed on having a reference OS, which are the ubuntu long term releases. The author of this guide also uses macosx and homebrew which also works fairly well.</p> +<p>Please note that during the time, the dependencies are updated and the version info might change.</p> +<h2 id="overview">Overview</h2> +<p>The installation consists of quite some tasks, as an overview:</p> +<ol start="5"> +<li>Java 11</li> +<li>Postgresql, if we want to use it instead of hypersonic db</li> +<li>CouchDB 2.X at the time of starting this guide, but 3.1.X seems to work well</li> +<li>Thrift to 0.13, later updated to 0.14</li> +<li>Liferay CE 7.3.3 and 7.3.4 has been also tested</li> +<li>Adjust <code>/etc/ini.d/tomcat</code> with path of new liferay</li> +<li>Adjust <code>$liferay_install</code> variable</li> +<li>add Java prerequisites to OSGi container</li> +<li>Install couchdb-lucene (2.1)</li> +<li>Deploy new version of sw360</li> +<li>Go ahead with Liferay steps</li> +</ol> +<h2 id="initial-steps">Initial steps</h2> +<p>In order to &ldquo;calibrate the system&rdquo; just run the update / upgrade cycle once:</p> +<p><code># sudo apt update</code></p> +<p><code># sudo apt upgrade</code></p> +<h2 id="postgresql">PostgreSQL</h2> +<p>You can go ahead install postgresql 10:</p> +<p><code>sudo apt install postgresql-10</code></p> +<p>or whatever package version is suitable here, for example version 12 for ubuntu 20.04.</p> +<p>The configuration for Liferay will come later.</p> +<h2 id="couchdb">CouchDB</h2> +<p>CouchDB is not part of the Ubuntu package management anymore. Thus, you need to add the Apache CouchDB package repository to install it, first the key for signing:</p> +<p><code>curl -L https://couchdb.apache.org/repo/bintray-pubkey.asc | sudo apt-key add -</code></p> +<p>The add the repo to the sources:</p> +<p><code>echo &quot;deb https://apache.bintray.com/couchdb-deb bionic main&quot; | sudo tee -a /etc/apt/sources.list</code></p> +<p>Then, add its contents to the package database by updating apt:</p> +<p><code>sudo apt-get update -y</code></p> +<p>Ultimately install CouchDB, we tried with 2.1.2 install:</p> +<p><code>sudo apt-get install -y couchdb=2.1.2~bionic</code></p> +<p>The installer will ask a couple of questions:</p> +<ol> +<li>Bind address: for CouchDB and SW360 <code>127.0.0.1</code> (localhost) is a good bind address, if you would like to access the server from a remote computer because your sw360 runs as a server in the network, you would need to change accordingly.</li> +<li>Admin user: For fresh installation for sure a very good idea. You can set the password at sw360 for CouchDB in <code>couchdb.properties</code> and place it centrally in <code>/etc/sw360</code></li> +</ol> +<p>In case you added an admin accidentally and would like to remove it,</p> +<h2 id="thrift">Thrift</h2> +<p>For thrift, we need version 0.13. The installation script in <code>scripts/install-thrift.sh</code> will help you:</p> +<p><code>sudo ./install-thrift.sh</code></p> +<p>In case there is thrift in the package management of the OS you re running on, just make sure, you have version 0.13</p> +<h2 id="openjdk-11">OpenJDK 11</h2> +<p>First check, what is installed.</p> +<p><code># sudo apt list openjdk* --installed</code></p> +<p>Then you could check what is available:</p> +<p><code># sudo apt list openjdk*</code></p> +<p>And install OpenJDK 11</p> +<p><code># sudo apt install openjdk-11-jdk</code></p> +<p>Then the <code>$JAVA_HOME</code> needs to be updated, most likely in <code>/etc/environment</code>. Please check for your installation how to set the <code>$JAVA_HOME</code> correctly (most likely: <code>JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64</code>).</p> +<h2 id="liferay-ce-733">Liferay CE 7.3.3</h2> +<p>Download Liferay from this link</p> +<p><a href="https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.3.3%20GA4/liferay-ce-portal-tomcat-7.3.3-ga4-20200701015330959.tar.gz">https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.3.3%20GA4/liferay-ce-portal-tomcat-7.3.3-ga4-20200701015330959.tar.gz</a></p> +<p>and unpack it, ideally in the <code>/opt</code> directory, so resulting path would look like <code>/opt/liferay-ce-portal-7.3.3-ga4</code>.</p> +<p>Then, you need to update the <code>$LIFERAY_INSTALL</code> in <code>/etc/environment</code> from <code>LIFERAY_INSTALL=/opt/liferay-portal-7.2.0-ga1/ </code> to `LIFERAY_INSTALL=/opt/liferay-ce-portal-7.3.3-ga4.</p> +<h3 id="auto-start">Auto Start</h3> +<p>For auto start, you need an according init.d entry. It could be a file like <code>/etc/init.d/tomcat</code>. The file could be created if not there already, with the following contents:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#099">#!/bin/bash +</span></span></span><span style="display:flex;"><span><span style="color:#099"></span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic">### BEGIN INIT INFO</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Provides: tomcat7</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Required-Start: $network</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Required-Stop: $network</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Default-Start: 2 3 4 5</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Default-Stop: 0 1 6</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Short-Description: Start/Stop Tomcat server</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic">### END INIT INFO</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#033">PATH</span><span style="color:#555">=</span>/sbin:/bin:/usr/sbin:/usr/bin +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>start<span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/startup.sh +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>stop<span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/shutdown.sh +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">case</span> <span style="color:#033">$1</span> in +</span></span><span style="display:flex;"><span> start|stop<span style="color:#555">)</span> <span style="color:#033">$1</span>;; +</span></span><span style="display:flex;"><span> restart<span style="color:#555">)</span> stop; start;; +</span></span><span style="display:flex;"><span> *<span style="color:#555">)</span> <span style="color:#366">echo</span> <span style="color:#c30">&#34;Run as </span><span style="color:#033">$0</span><span style="color:#c30"> &lt;start|stop|restart&gt;&#34;</span>; <span style="color:#366">exit</span> 1;; +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">esac</span> +</span></span></code></pre></div><p>Te user <code>siemagrant</code> is used in the sw360vagrant project. it is the username of the user where the liefray / sw360 server should run under. In the ideal case, it is unprivileged user.</p> +<h3 id="adjust-memory">Adjust Memory</h3> +<p>When you have downloaded the liferay distribution, Tomcat is likely configured with very basic memory settings. For trying sw360, the standard memory settings are OK. But of course, the memory settings in <code>$LIFERAY_HOME/tomcat-X.0.XX/bin/setenv.sh</code> should be adapted again.</p> +<h3 id="postgresql-instead-of-hypersonic">PostgreSQL instead of Hypersonic</h3> +<p>Liferay CE comes with the hypersonic database. Just for making a long-term setup in the berginning, we are advising to use postgresql from the start. The settings for postgrsql can be found in <code>portal-ext.properties</code>. Please do not forget to create the user and the database in the database server first.</p> +<h2 id="install-prerequisites">Install Prerequisites</h2> +<p>There are some install libraries to be downloaded and installed as OSGi modules. You can check the download script from the sw360vaghrant project for list of URLs that help you.</p> +<p><a href="https://github.com/sw360/sw360vagrant/blob/master/download-packages.sh">https://github.com/sw360/sw360vagrant/blob/master/download-packages.sh</a></p> +<p>An URL for libtrift is:</p> +<p><a href="https://repo1.maven.org/maven2/org/apache/thrift/libthrift/0.13.0/libthrift-0.13.0.jar">https://repo1.maven.org/maven2/org/apache/thrift/libthrift/0.13.0/libthrift-0.13.0.jar</a></p> +<p>An URL for commons-compress is:</p> +<p><a href="https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.20/commons-compress-1.20.jar">https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.20/commons-compress-1.20.jar</a></p> +<p>If you have downloaded every thing, copy them to the <code>deploy</code> folder of your liferay installation:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span># cp libthrift-0.13.0.jar $LIFEARY_HOME/deploy/ +</span></span><span style="display:flex;"><span># cp commons-lang-2.4.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-io-2.6.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-csv-1.4.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-collections4-4.4.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-codec-1.12.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-compress-1.20.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-logging-1.2.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp gson-2.8.5.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp guava-21.0.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp jackson-annotations-2.11.3.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp jackson-core-2.11.3.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp jackson-databind-2.11.3.jar $LIFERAY_HOME/deploy +</span></span></code></pre></div><p>if you use PostgreSQL as your database, you need to install postgres.jar in Liferay.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span># wget https://jdbc.postgresql.org/download/postgresql-42.2.9.jar postgresql-42.2.9.jar +</span></span><span style="display:flex;"><span># cp postgresql-42.2.9.jar $LIFERAY_HOME/tomcat-9.0.33/lib/ext +</span></span></code></pre></div><p>[Note] In case you use other database with Liferay, you need to set other jar file of corresponding database.</p> +<h2 id="install-couchdb-lucene">Install Couchdb Lucene</h2> +<p>SW360 uses for searching the contents of the couchdb databases a lucene-based server named couchdb-lucene. The main issue here is that it requires a patch for the use in the normal SW3360 setups. The reason for the patch is that the developers presume that couchdb-lucene runs as the only component in the application server, while in the sw360 setup, there is a setup in which couchdb-lucene runs along with other components in the same application container.</p> +<p>Start with downloading the couchdb-lucene and rename the archive so the resulting URL path element will be <code>couchdb-lucene</code>:</p> +<p><code># wget https://github.com/rnewson/couchdb-lucene/archive/v2.1.0.tar.gz ./couchdb-lucene.tar.gz</code></p> +<p>Please refer to the script in sw360vagrant how to apply the patch to couchdb-lucene:</p> +<p><a href="https://github.com/sw360/sw360vagrant/blob/master/shared/scripts/install-lucene.sh">https://github.com/sw360/sw360vagrant/blob/master/shared/scripts/install-lucene.sh</a></p> +<p>Please note that the patching issue is well known in the project and it is unclear why it is not merged:</p> +<ul> +<li><a href="https://github.com/rnewson/couchdb-lucene/issues/161">https://github.com/rnewson/couchdb-lucene/issues/161</a> &ldquo;allow context-root other than &ldquo;/&rdquo; when running in servlet container&rdquo;</li> +<li><a href="https://github.com/rnewson/couchdb-lucene/pull/162">https://github.com/rnewson/couchdb-lucene/pull/162</a></li> +<li><a href="https://github.com/rnewson/couchdb-lucene/pull/152">https://github.com/rnewson/couchdb-lucene/pull/152</a></li> +</ul> +<h2 id="deploy-new-sw360">Deploy New SW360</h2> +<p>You will need to checkout new Java-11 based version of the SW360, which is either tagged version 11 (or later) or some few commits before that. Then build in the sw360 project root using:</p> +<p><code>mvn clean install -DskipTests</code></p> +<p>This will install new artfacts, such as lib-datahandler in your maven repostiory. Then apply in the same directory:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a00;background-color:#faa">#</span> mvn clean <span style="color:#069;font-weight:bold">package</span> <span style="color:#555">-</span>P deploy <span style="color:#555">-</span>Dbase.deploy.dir=. <span style="color:#555">-</span>Dliferay.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>deploy<span style="color:#555">/</span> <span style="color:#555">-</span>Dbackend.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>Drest.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>DskipTests +</span></span></code></pre></div><p>Skipping tests has the reason that usually, the sw360 is tested in the CI and thus, local tests are note necessary, if the code has not been changed locally. Note that the REST API documentation framework is based on building test cases and thus for deploying a version with REST API documentation, tests should be executed:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a00;background-color:#faa">#</span> cd rest +</span></span><span style="display:flex;"><span><span style="color:#a00;background-color:#faa">#</span> mvn clean <span style="color:#069;font-weight:bold">package</span> <span style="color:#555">-</span>P deploy <span style="color:#555">-</span>Dbase.deploy.dir=. <span style="color:#555">-</span>Dliferay.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>deploy<span style="color:#555">/</span> <span style="color:#555">-</span>Dbackend.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>Drest.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> +</span></span></code></pre></div><h2 id="final-steps-in-liferay">Final Steps in Liferay</h2> +<p>Liferay CE 7.3 will need to have some manual steps applied in order to complete the setup. Unfortunately, these cannot be automated (if you know how, please let us know). For earlier versions of Liferay, please refer to the main wiki page. For Liferay CE 7.3.3 please continue here:</p> +<p><a href="https://github.com/eclipse/sw360/wiki/Deploy-Liferay7.3">https://github.com/eclipse/sw360/wiki/Deploy-Liferay7.3</a></p> + + + + + + diff --git a/docs/deployment/deploy-authorization-concept/index.html b/docs/deployment/deploy-authorization-concept/index.html new file mode 100644 index 0000000..af3df10 --- /dev/null +++ b/docs/deployment/deploy-authorization-concept/index.html @@ -0,0 +1,655 @@ + + + + + + + + + + + + + + + + + + + + +Authorization Concept | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Authorization Concept

+
Describe different roles of authorization concepts on SW360
+ +

The authorization concept describes the different roles of the solution - mainly for documentation of the authorization of different roles of the sw360. It is not focusing for the roles like being a moderator, it is described on a separate page for users: role and access model

+

Roles Overview

+

SW360 offers two choices for doing the roles: one is setting access rights at every record individually. Another are general roles that can be set for every user. An admin of SW360 can set user roles at the Liferay Users and Roles UI.

+

Setup Admin (Liferay Role)

+

The setup admin is the Liferay administrator, which can configure the entire liferay app, such as which portlets are shown on which page.

+

SW360 Admin (Liferay Role)

+

The SW360 admin can change all data and promote users for more access rights, such as promoting a user to role CLEARING_ADMIN. So its use case is to promote users to clearing admins after some time without always asking the site administrator to do this. To enhance the SW360_ADMIN role to allow users of this role to promote other users’s roles, follow these steps:

+
    +
  1. Go to control panel
  2. +
  3. Select the Users section
  4. +
  5. To subsection Roles
  6. +
  7. Select row for SW360 Admin and select action Define permissions.
  8. +
+

When defining permissions the idea is to reduce the permissions to the lowest level possible. Just allow for changing users.

+

Clearing Admin (Liferay Role)

+

The clearing admin can change all component and release records and project records of the same group.

+

Security Admin (Liferay Role)

+

In addition to the user rights, the security admin can set security vulnerabilities to irrelevant

+

ECC Admin (Liferay Role)

+

In addition to the user rights, the ECC admin can manipulate ECC data.

+

User

+

A user can create, modify and delete all own (=self created) records. A user cannot change records of others

+

Summary

+

Moderation Requests

+

If a user with user or other access role rights is not entitled to write or change a record, a moderation request will be created. The moderation request contains the changes an will be routed for approval to the users who can write this record.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/deploy-configuration-country-codes/index.html b/docs/deployment/deploy-configuration-country-codes/index.html new file mode 100644 index 0000000..ec9ecd2 --- /dev/null +++ b/docs/deployment/deploy-configuration-country-codes/index.html @@ -0,0 +1,643 @@ + + + + + + + + + + + + + + + + + + + + +Configuring Country Codes | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Configuring Country Codes

+
SW360 provides a feature for showing country codes and country names
+ +

This feature is available on:

+
    +
  • projects / Owner Country
  • +
  • components / Owner Country
  • +
+

Country Code List

+

Its supports preferred country codes, which are shown at the top of the country list.
+You can configure them by using the sw360.properties.

+ + + + + + + + + + + + + + + +
sw360 properties keyvaluedefault
preferred.country.codes(ISO 3166-1 alpha-2)DE,AT,CH,US
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/deploy-configuration-files/index.html b/docs/deployment/deploy-configuration-files/index.html new file mode 100644 index 0000000..cc9dcad --- /dev/null +++ b/docs/deployment/deploy-configuration-files/index.html @@ -0,0 +1,1104 @@ + + + + + + + + + + + + + + + + + + + + +Configurable Property Keys | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Configurable Property Keys

+
SW360 Configurable property keys
+ +

Introduction

+

List of all applicable property files in sw360:

+
    +
  • sw360.properties
  • +
  • fossology.properties
  • +
  • couchdb.properties
  • +
  • search.properties
  • +
  • orgmapping.properties
  • +
  • databasetest.properties
  • +
  • authorization/application.yml
  • +
  • rest/application.yml
  • +
+

SW360.properties (/etc/sw360/sw360.properties)

+

The following table shall give an overview about the general sw360 configuration settings.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property KeyDefault
licenseinfo.spdxparser.use-license-info-from-filestrue/false
mainline.state.enabled.for.usertrue/false
key.auth.emailEMAIL
key.auth.extidEXTID
key.auth.givennameGIVENNAME
key.auth.surnameSURNAME
key.auth.departmentDEPARTMENT
backend.urlhttp://127.0.0.1:8080
cvesearch.vendor.threshold1
cvesearch.product.threshold0
cvesearch.cutoff6
combined.cli.parser.external.id.correlation.key-
schedule.cvesearch.firstOffset.seconds0
schedule.cvesearch.interval.seconds“(246060)”
autostart-
rest.write.access.usergroupSW360_ADMIN
rest.access.token.validity.seconds3600
rest.security.client.idsw360-trusted-client
rest.security.client.secretsw360-secret
programming.languagesActionScript,AppleScript, Asp,Bash,BASIC, C,C++,C#,Cocoa,Clojure, COBOL,ColdFusion,D, Delphi,Erlang,Fortran, Go,Groovy,Haskell, JSP,Java,JavaScript,Objective-C, Ocaml,Lisp,Perl, PHP,Python,Ruby,SQL ,SVG,Scala,SmallTalk Scheme,Tcl,XML, Node.js,JSON
software.platformsAdobe AIR,Adobe Flash, Adobe Shockwave,Binary Runtime Environment for Wireless,Cocoa (API),Cocoa Touch,Java (software platform)
operating.systemsAndroid,BSD,iOS, Linux,OS X,QNX, Microsoft Windows,Windows Phone,IBM z/OS
clearing.teamsorg1,org2,org3
stateActive,Phase out,Unknown
project.typeCustomer Project,Internal Project,Product,Service,Inner Source
project.externalkeysinternal.id
license.identifiers-
component.categoriesframework,SDK,big-data, build-management,cloud,content, database,graphics,http, javaee,library,mail,mobile, security,testing,virtual-machine, web-framework,xml
component.externalkeyscom.github.id,com.gitlab.id,purl.id
custommap.project.rolesStakeholder,Analyst,Contributor,Accountant,End user,Quality manager,Test manager,Technical writer,Key user
custommap.component.rolesCommitter,Contributor,Expert
custommap.release.rolesCommitter,Contributor,Expert
custommap.release.externalIds-
release.externalkeysorg.maven.id,com.github.id,com.gitlab.id,purl.id
projectimport.hosts-
preferred.country.codesDE,AT,CH,US
MailUtil_from_No_Reply__@sw360.org
MailUtil_host-
MailUtil_port25
MailUtil_enableStarttlsfalse
MailUtil_enableSslfalse
MailUtil_isAuthenticationNecessarytrue
MailUtil_login-
MailUtil_password-
MailUtil_enableDebugfalse
MailUtil_supportMailAddress-
defaultBegin-
defaultEnd-
unsubscribeNoticeBefore-
unsubscribeNoticeAfter-
+

fossology.properties (/etc/sw360/fossology.properties)

+

These configuration parameters are necessary to connect to a fossology server.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property KeyDefault
fossology.hostlocalhost
fossology.port22
fossology.usersw360
fossology.key.file/fossology.id_rsa
fossology.key.pub.file[fossology.key.file] + .pub
+

couchdb.properties (/etc/sw360/couchdb.properties)

+

CouchDB and Lucene serach configuration properties.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property KeyDefault
couchdb.urlhttp://localhost:5984
couchdb.databasesw360db
couchdb.user-
couchdb.password-
couchdb.userdbsw360users
couchdb.attachmentssw360attachments
couchdb.fossologyKeyssw360fossologyKeys
couchdb.vulnerability_managementsw360vm
lucenesearch.limit25
lucenesearch.leading.wildcard*false
+
+

* If you enable lucene leading wildcards you have to enable this configuration also in couchdb-lucene.ini! Leading wildcard search is disabled as default because its a expensive operation. (couchdb-lucene.ini is part of the couchdb-lucene .war package)
+[lucene]
+allowLeadingWildcard=true

+
+

search.properties (/etc/sw360/search.properties)

+

The following table shall give an overview about the specific search properties

+ + + + + + + + + + + + + +
Property KeyDefault
search.name.max.length64
+

orgmapping.properties (/etc/sw360/orgmapping.properties)

+

This configuration file is used to activate the sw360 orgmapping feature.

+ + + + + + + + + + + + + + + + + +
Property KeyDefault
match.prefixfalse
enable.custom.mappingfalse
+

databasetest.properties (/etc/sw360/databasetest.properties)

+

Just for couchdb database test purpose.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Property KeyDefault
couch_db_urlhttp://localhost:5984
couch_db_databasedatahandlertestdb
couchdb.username-
couchdb.password-
+

authorization/application.yml (/etc/sw360/authorization/application.yml)

+

All of the following built-in properties can be overridden:

+

+# Port to open in standalone mode
+server:
+  port: 8090
+
+# Connection to the couch databases. Will be used to store client credentials
+couchdb:
+  url: http://localhost:5984
+  database: sw360oauthclients
+  # if your couchdb does not use authentication, pls just don't use the settings for username and password
+  #username:
+  #password:
+
+spring:
+  jackson:
+    serialization:
+      indent_output: true
+
+# Common SW360 properties
+sw360:
+  # The url of the Liferay instance
+  sw360-portal-server-url: ${SW360_PORTAL_SERVER_URL:http://127.0.0.1:8080}
+  # The id of the company in Liferay that sw360 is run for
+  sw360-liferay-company-id: ${SW360_LIFERAY_COMPANY_ID:20155}
+  # Allowed origins that should be set in the header
+  cors:
+    allowed-origin: ${SW360_CORS_ALLOWED_ORIGIN:#{null}}
+
+security:
+  # Configuration for enabling authorization via headers, e.g. when using SSO
+  # in combination with a reverse proxy server
+  customheader:
+    headername:
+      # You have to enable authorization by headers explicitly here
+      enabled: false
+      # Attention: please make sure that the proxy is removing there headers
+      # if they are coming from anywhere else then the authentication server
+      intermediateauthstore: custom-header-auth-marker
+      email: authenticated-email
+      extid: authenticated-extid
+      # also available - at least in saml pre auth - are "givenname", "surname" and "department"
+
+  oauth2:
+    resource:
+      id: sw360-REST-API
+

rest/application.yml (/etc/sw360/rest/application.yml)

+

All of the following built-in properties can be overridden:

+
server:
+  port: 8091
+
+spring:
+  http:
+    multipart:
+      max-file-size: 500MB
+      max-request-size: 600MB
+
+  data:
+    rest:
+      base-path: /api
+
+# logging:
+#   level:
+#     org.springframework.web: DEBUG
+
+security:
+  oauth2:
+    resource:
+      id: sw360-REST-API
+      filter-order: 3
+      jwt:
+        keyValue: |
+          -----BEGIN PUBLIC KEY-----
+          MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApz8Cr1o5yHMv/FUdF5uy
+          VptilqdWtNvw5S6Tr4IaQ4XR9QPt8nlRsjOngfG4QCcKMBWJISldFg8PlJWUBeV+
+          6TwQUidxokl2GbO6/+QA+lz1a5Ei1Y1pcnvFeRb2pdYlH3Yg6fXMxS6QwDLk27pZ
+          5xbpSDIGISDesyaIMvwaKdhAbFW/tTb/oJY7rCPvmYLT80kJzilijJ/W01jMMSHg
+          9Yi5cCt1eU/s78co+pxHzwNXO0Ul4iRpo/CXprQCsSIsdWkJTo6btal1xzd292Da
+          d+9xq499JEsNbcqLfCq8DBQ7CEz6aJjMvPkvZiCrFIGxC/Gqmw35DQ4688rbkKSJ
+          PQIDAQAB
+          -----END PUBLIC KEY-----
+
+sw360:
+  thrift-server-url: ${SW360_THRIFT_SERVER_URL:http://localhost:8080}
+  test-user-id: admin@sw360.org
+  test-user-password: sw360-password
+  couchdb-url: ${SW360_COUCHDB_URL:http://localhost:5984}
+  cors:
+    allowed-origin: ${SW360_CORS_ALLOWED_ORIGIN:#{null}}
+
+ + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/deploy-cve-search/index.html b/docs/deployment/deploy-cve-search/index.html new file mode 100644 index 0000000..8029abb --- /dev/null +++ b/docs/deployment/deploy-cve-search/index.html @@ -0,0 +1,735 @@ + + + + + + + + + + + + + + + + + + + + +CVE Scheduler | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

CVE Scheduler

+
SW360 CVE Schedules
+ +

How to use SW360 CVE schedule

+

SW360 gets vulnerability information from Common Vulnerability Enumeration (CVE) data. SW360 can connect to your local cve-search server.
+Few years ago, sw360 was able to get vulnerability information from online CVE serverr, but it is not active.

+ +

cve-search is a tool to import CVE (Common Vulnerabilities and Exposures) and CPE (Common Platform Enumeration) into a MongoDB to facilitate search and processing of CVEs. You can choose Docker install or Native install.

+

Docker Installation Github repo

+

Only clone and “docker-compose up”.

+
 $ git clone https://github.com/cve-search/CVE-Search-Docker.git
+ $ cd CVE-Search-Docker
+ $ docker-compose up 
+
+
    +
  1. Clone source
  2. +
+
    $ git clone https://github.com/cve-search/cve-search
+    $ cd cve-search
+    $ git checkout {tag/branch}
+
    +
  1. Install system requirements
  2. +
+
    $ sudo apt-get install -y < requirements.system
+
    +
  1. Install CVE-Search and its Python dependencies
  2. +
+
    pip3 install -r requirements.txt
+
    +
  1. Install mongodb
  2. +
+

+    $ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
+
+    $ codename=$(lsb_release --codename --short)
+
+    $ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu ${codename}/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
+
    $ sudo apt-get update
+    
+    $ sudo apt-get install -y mongodb-org
+
+    $ sudo systemctl daemon-reload
+
+    $ sudo systemctl start mongod
+
+    # Verify status of mongodb
+    $ sudo systemctl status mongod
+
+    # if all is ok, enable mongodb to start on system startup
+    $ sudo systemctl enable mongod
+
    +
  1. Populating the database
  2. +
+
    $ sudo apt-get install redis redis-server
+
+    #modify: stop-writes-on-bgsave-error yes -> no
+    $ sudo vim /etc/redis/redis.conf
+
+    $ sudo systemctl daemon-reload
+
+    $ sudo systemctl restart redis
+
+    $ ./sbin/db_mgmt_cpe_dictionary.py -p
+    
+    $ ./sbin/db_mgmt_json.py -p
+    
+    $ ./sbin/db_updater.py -c # This will take > 45minutes on a decent machine, please be patient
+
    +
  1. Updating the database
  2. +
+
    $ ./sbin/db_updater.py -v
+
    +
  1. Starting and stopping the web-server
  2. +
+
    # Install psutil >= 5.7.0
+    $ pip3 install psutil>=5.7.0
+
+    # Starting web server
+    $ python3 web/index.py
+

Default Web server: http://localhost:5000

+

To stop the server, press the CTRL+C

+

Note: By default CVE-Search takes assumptions on certain configuration aspects of the application, you can adjust

+
    $ cd cve-search
+    $ cp etc/configuration.ini.sample etc/configuration.ini
+    $ vim etc/configuration.ini
+

Setup SW360 with CVE server

+
    +
  1. Change default CVE server
  2. +
+

Change cvesearch.host with CVE server address.

+
    $ vim ${SW360_DIR_INSTALL}/backend/src/src-cvesearch/src/main/resources/cvesearch.properties
+
    +
  1. Setting for schedule the CVE service
  2. +
+

The offset (first run of the update) and the interval between updates can also be adjusted.

+
    $ vim ${SW360_DIR_INSTALL}/backend/src/src-schedule/src/main/resources/sw360.properties
+

The offset has to be given in seconds since midnight and also the interval has to be entered in seconds. The default is to update the vulnerabilities by CVEsearch every night at midnight, which corresponds to an offset of 0 and an interval of 24 hours (= 86400 seconds).

+

According to the default settings, cveSearch is not auto-started with the scheduling service. If want to auto start autostart = cvesearchService

+
    +
  1. Schedule task Adminstration
  2. +
+

View and start/stop schedule

+

Click Admin > Schedule

+

Reference

+

CVE guide: [https://cve-search.github.io/cve-search/database/database.html]

+

User Scheduling CVE Search by Admins: [https://github.com/eclipse/sw360/wiki/User-Scheduling-CVE-Search-by-Admins]

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/deploy-docker/index.html b/docs/deployment/deploy-docker/index.html new file mode 100644 index 0000000..780f788 --- /dev/null +++ b/docs/deployment/deploy-docker/index.html @@ -0,0 +1,712 @@ + + + + + + + + + + + + + + + + + + + + +Docker Deployment | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Docker Deployment

+
Deploy SW360 with Docker
+ +

A quick how-to for testing SW360

+

Requirements

+

Platform Requirements

+

As you need Apache Thrift 0.11.0 (see https://github.com/eclipse/sw360#required-software ), using the latest Ubuntu LTS (18.04) won’t work, so we start on Ubuntu 19.10 if you want to install from packages. As an alternative, consider the following script from the sw360 repository:

+

https://github.com/eclipse/sw360/blob/master/scripts/install-thrift.sh

+

We’ll go the Docker way and follow the instructions of the sw360chores project. There is a nice diagram there, explaining the rather complex setup.

+

sw360chores Requirements

+
+

the perl interpreter to run ./sw360chores.pl

+
+

You should already have it in your default, even if minimal, installation

+
$ which perl 
+/usr/bin/perl
+
+

git which is used in some prepare scripts

+
+

sudo apt install git

+
+

a current version of docker (min 1.30) [https://docs.docker.com/]

+
+
sudo apt install docker.io
+
+

docker-compose (min 1.21) [https://docs.docker.com/compose/install/]

+
+
sudo apt install docker-compose
+

And you actually also need curl,

+
sudo apt install curl
+

Sw360 Requirements

+

From the sw360 Readme:

+
+

Java 1.8.X

+
+

And when they say “1.8.X”, they mean it: it won’t work with a later version. So it’s better to uninstall the potential other versions of Java (/!\ this is expected to break other things on your environment if you depend on Java for anything), and then install the required version

+
 sudo apt install openjdk-8-jdk openjdk-8-jre
+
+

In order to build you will need:

+
    +
  • A git client
  • +
  • Apache Maven 3.6.X
  • +
  • Apache Thrift 0.11.0
  • +
+
+
sudo apt install maven
+

That will install maven Apache Maven 3.6.1 but you need to have installed the correct version (8) of Java before hand otherwise it will install a too recent one.

+
sudo apt install thrift-compiler
+

That will install Thrift version 0.11.0, if you have not installed thrift using the script above.

+

Cloning the repos

+

Generating an ssh key-pair for your machine

+

If you don’t already have one, generate a key pair with no passphrase, in default location:

+
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
+

Not 100% sure, but not having one may create problems, so…

+

Cloning sw360 chores

+

I created a code folder at the root of the user’s directory, just to make things simple.

+
~$ cd code
+~/code$ git clone https://github.com/sw360/sw360chores.git
+

Cloning eclipse/sw360

+
~/code$ git clone https://github.com/eclipse/sw360.git
+

Compiling and deploying SW360 Code

+
~$ cd code/sw360/
+~/code/sw360$ mvn package -P deploy -Dbase.deploy.dir=/home/inno3/code/sw360chores/_deploy -DskipTests
+

Launching the containers

+
$ cd ~/code/sw360chores/
+~/code/sw360chores$ ./sw360chores.pl --build -- up
+

And yes, there is a space between -- and up.

+

If everything goes fine, you should see a line like

+
sw360_1                | 15-Jan-2020 12:33:38.480 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [144,475] milliseconds 
+

You should be able to login at https://localhost:8443 with the default credentials setup@sw360.org and the password sw360fossy (found here).

+

Please go ahead now with the setup of the Liferay - links can be found in the main wiki page.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/deploy-export-and-import/index.html b/docs/deployment/deploy-export-and-import/index.html new file mode 100644 index 0000000..a6d77d1 --- /dev/null +++ b/docs/deployment/deploy-export-and-import/index.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + + + + + + + + +Export and Import | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Export and Import

+
SW360 Export and Import
+ +
- note that only export and import of users is active,
+- everything else is deprecated functionality.
+- The export and import functionality has not been
+- updated at some point and thus will not function
+- properly anymore.
+

Full Export

+

The easiest way to fully export the data is to copy all the .couch files of Couch-DB. Where the files are can be found out from Futon. +e.g.

+
http://localhost:5984/_utils/config.html
+

under

+
view_index_dir  /var/lib/couchdb
+

This method of exporting has the advantage that all Ids remain the same. +An equally simple method it to use the Couch-DB replicator from Futon.

+

This method might fail when there are changes to the document structure as Ektorp might stumble over unset required or surplus fields. The method of choice here is to repair the DB (after a backup) with

+
https://github.com/couchapp/couchapp
+

and then follows the instructions from

+
http://harthur.github.io/costco/
+

and

+
couchapp push . http://localhost:5984/sw360users
+

then you go to

+
http://localhost:5984/sw360users/_design/costco/index.html
+

and you can run functions like:

+
function(doc) {
+  if (doc.type == 'user') {
+    if(doc.fullname == 'Homer J. Simons') {
+       doc.fullname =  'Homer Jay Simons';
+    }
+  }
+  return doc;
+}
+

You can also change the names of properties, e.g.

+
function(doc) {
+  if (doc.type == 'user') {
+    if(doc.fullname ) {
+       doc.fullname2 = doc.fullname;
+       delete doc.fullname;
+      }
+  }
+  return doc;
+}
+

CSV Export

+

Users

+

The export of users was already described, this is very important as this also creates the users in the liferay database. The mere export of the users.couch is not enough.

+

Projects

+

There is no CSV export or import for projects currently.

+

Components and Releases

+

To Export the components and releases you need to do the following: +As Components and Releases are identified by their identifier ([name] or [name(version)]), these identifiers need to be unique. When importing duplicates in the identifiers are ignored and they are also not exported. +Therefore in the admin page you can check the database for such duplicates.

+

After that “Download Component CSV” creates a CSV with components, releases and their source attachments. +The source attachments are created if the “DownloadURL” is a valid url. +These remote-only attachments will be download once the first download request occurs. +If the URL does not exist you get an error.

+

Alternatively you can use

+
sw360/src/backend/utils/src/main/java/com/siemens/sw360/attachments/db/RemoteAttachmentDownloader.java
+

to bulk download the source only attachments. +The command line call to use it from the Siemens network looks like this:

+
 java -jar -Dhttp.proxyHost=proxyfarm.3dns.netz.sbs.de -Dhttps.proxyHost=proxyfarm.3dns.netz.sbs.de -Dhttp.proxyPort=84 -Dhttps.proxyPort=84 /home/siemagrant/.m2/repository/com/siemens/sw360/backend-utils/0.1.1-SNAPSHOT/backend-utils-0.1.1-SNAPSHOT-jar-with-dependencies.jar -d
+

Attachments

+

Here we have a mixed strategy, as there is a CSV export for the attachments, which only stores the meta information about the files. The files themselves need to be brought into a new instance via the sw360attachments.couch database.

+

The ids of the attachments are also in the CSV, so they are not portable without the sw360attachments.couch. This is meant as a form of recovery, but it should not be used on an instance that has been worked on, so only a fresh set up.

+

This will overwrite the auto generated attachments from the component CSV if the have the same URL as one of the imported attachments. This feature is needed to render the procedure idempotent.

+

The admin interface provides the possibility to delete attachment contents that do not have a project, component or release with an attachment that references it.

+

If you copy the sw360attachments.couch to your instance and then click this before you import than the db should be empty afterwards.

+

If there was no error after importing the csv, running this job should yield no deletions if there was no error and the exported attachments where complete.

+

In general this should only be necessary if errors have occurred. +It is a good idea to run this before you export the attachments.

+ +

Links between releases can be exported or imported. +Because release links are stored in maps, the procedure is idempotent by construction. +The old links are overwritten with the imported data.

+

Suggested Order for Exports

+
    +
  1. Freeze the application, so that others can not change the data at the moment (By external means, like closing a port forwarding)
  2. +
  3. Clean up the attachments
  4. +
  5. Look for duplicate identifiers and resolve conflicts (Important as duplicates do not get exported or imported)
  6. +
  7. Export the Users, Components, Attachment Infos and release links
  8. +
  9. copy the sw360attachments.couch, this might be a huge files
  10. +
+

Suggested Order for Imports

+

On a fresh installation

+
    +
  1. Copy the sw360attachments.couch in its place
  2. +
  3. Start the licenses importer
  4. +
  5. restart the backend to make the design documents available and boot the frontend
  6. +
  7. Import the users
  8. +
  9. Import the component CSV
  10. +
  11. Import the Attachment Infos
  12. +
  13. Import the Release Link Infos.
  14. +
+

Regular Maintenance Operations

+
    +
  1. Run the attachments clean up
  2. +
  3. Resolve name crashes with the search for duplicate Identifiers
  4. +
+

Imports on a running instance

+
    +
  1. New components can be imported via the CSV at any time. Duplicates to existing components will be ignored, but there is a log message.
  2. +
  3. Users can be added via CSV.
  4. +
  5. Release links can be added via CSV, duplicates overwrite existing links
  6. +
+

Attachments should not be imported on a running instance! +This should not break much, as without the entries in the couchDB there will be no import. +But potentially remote-only Attachments get deleted. +Nevertheless this scenario is not intended and maybe there are unforeseen side effects.

+

Troubleshooting

+

Import failing in the Backend: No Department

+

The import fails with some error message that a user does not have a department?

+
    +
  1. First of all, the importing admin requires a group assignment. Otherwise the adding component action will fail.
  2. +
  3. If a group is added to the admin, not that in addition to the Liferay group setting, this information must be also placed into the “sw360users” database in couchdb.
  4. +
  5. Note that changes to groups and similar things will require a restart of the Liferay server (=tomcat). Otherwise the user caching kicks in and might not reflect all updates.
  6. +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/deploy-requirements/index.html b/docs/deployment/deploy-requirements/index.html new file mode 100644 index 0000000..00cc15e --- /dev/null +++ b/docs/deployment/deploy-requirements/index.html @@ -0,0 +1,747 @@ + + + + + + + + + + + + + + + + + + + + +System Requirements | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

System Requirements

+
SW360 minimal system requirements based on system class
+ +

For deploying the SW360, there are the following hardware requirements below. Please note that the main memory consumer is the tomcat application container. Accordingly, this requires different settings (see $TOMCAT_HOME/bin/setenv.sh).

+

Please note that you can review the current memory situation of the application in the liferay administration section as well (see Configuration-> Server Administration).

+

Hardware and Infrastructure

+

CD-based test instances

+

When there is a continuous deployment and continuous delivery directly deployed to machine the following machine is recommended:

+
    +
  • 1 core
  • +
  • 4GB RAM
  • +
  • 40GB normal file system
  • +
  • 10Mbit Ethernet link
  • +
+

In this case, the sw360 solution runs fairly well for clicking around and creation of a few data sets. Note that Tomcat should have 2GB.

+

Staging instances

+

Testing and working with normal data sets for staging and pre-productive testing. Pre productive does not need to have the same execution speed of the machine, however, requires enough RAM and file system to run a clone on the data set.

+
    +
  • 2 cores
  • +
  • 8GB RAM
  • +
  • 500GB normal file system
  • +
  • 100Mbit Ethernet link
  • +
+

The tomcat should be adjusted to 4GB RAM

+

Productive instances

+

Productive with for example: 10K releases, 2k users which deploys the entire solution onto a single larger machine. It does not apply to a docker based setup.

+
    +
  • 4 cores
  • +
  • 16GB RAM
  • +
  • 500GB SSD based file system
  • +
  • 1GBit link Ethernet link
  • +
+

Tomcat should be adjusted to 10-12GB RAM. Note: normally, you could also run Tomcat with significantly lees RAM, if you put common dependencies in a shared lib folder.

+

Network

+

The following table shall give an overview about the inbound ports

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PortServiceRemarks
443httpsAccessing the application
22sshAdministering the application
80httpif you would like to access the solution over http
5984/5985http/httpsif access to the couchdb (admin) interface is required
+

Overview about the additional outbound ports:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PortServiceRemarks
3269sldapIf you do authentication using secure LDAP
443sldapIf you do consume services over https (e.g. vulnerabilty pulling)
53dns
22sshthe old way of calling a fossology server
+

Outbound ports for http / https may be required for downloading system updates. Ports for ssh may not be required outbound.

+

Software:

+

As for the software, the sw360 can be run on many platforms, even on Windows seven. We have the following reference platform for development:

+

until 5:

+
    +
  • OpenJDK 8
  • +
  • Unbunu 16.04 LTS
  • +
+

after 5:

+
    +
  • openjdk 8
  • +
  • ubuntu 18.04 LTS
  • +
+

after 11:

+
    +
  • openjdk 11
  • +
  • ubuntu 18.04 LTS
  • +
+

More information about requirements can be found here: https://github.com/sw360/sw360vagrant/wiki

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/deploy-secure-deployment/index.html b/docs/deployment/deploy-secure-deployment/index.html new file mode 100644 index 0000000..6254910 --- /dev/null +++ b/docs/deployment/deploy-secure-deployment/index.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + + + + + + + + +Security | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Security

+
SW360 security checklist pre and post deployment
+ +

After the basic installation, there are some following steps that should be considered for securing the deployment. The main issue that can be done upfront is the documentation of the involved components:

+
    +
  • Lifearay
  • +
  • Tomcat
  • +
  • Couchdb
  • +
  • Vagrant
  • +
+

For vagrant it is important to understand how to close the provisioning users and not keep default usernames and passwords open.

+

Then for the applications, the following very first line measure should be considered:

+
    +
  • +

    Change password of Liferay administrator user or check if that is appropriately secure.

    +
  • +
  • +

    You should check the permissions of the involved users in the user management in Liferay.

    +
  • +
  • +

    Assign individual passwords for users, also you could force the users to change their passwords at login if you like.

    +
  • +
  • +

    Besides the general advice to check the deployment instructions for the involved components, it is of particular interest to limit couchdb access from localhost only.

    +
  • +
  • +

    Also for Tomcat you limit port access from localhost only.

    +
  • +
  • +

    Do you need the ssh ports open or can you just go to the machine (physically).

    +
  • +
  • +

    Fix the admin party on couchdb

    +
  • +
  • +

    Add https access to couchdb

    +
  • +
  • +

    check that sw360 eyecuting user does not have sudo rights and config files for sw360 are 600 only for the executing user.

    +
  • +
+

Note that the Linux vagrant scripts applies somesecurity measures already on the OS level.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/index.html b/docs/deployment/index.html new file mode 100644 index 0000000..da218c9 --- /dev/null +++ b/docs/deployment/index.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + + + + + + + + + +Deployment | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Deployment

+
SW360 Deployment Guides
+ + +
+ + + + + + + + +
+ + +
+
+ Bare Metal +
+

SW360 Bare Metal Deployment

+
+ + +
+
+ Upgrade from previous instances +
+

SW360 Bare Metal Deployment

+
+ + +
+
+ Authorization Concept +
+

Describe different roles of authorization concepts on SW360

+
+ + +
+
+ Configurable Property Keys +
+

SW360 Configurable property keys

+
+ + +
+
+ Configuring Country Codes +
+

SW360 provides a feature for showing country codes and country names

+
+ + +
+
+ CVE Scheduler +
+

SW360 CVE Schedules

+
+ + +
+
+ Docker Deployment +
+

Deploy SW360 with Docker

+
+ + +
+
+ Export and Import +
+

SW360 Export and Import

+
+ + +
+
+ Security +
+

SW360 security checklist pre and post deployment

+
+ + +
+
+ System Requirements +
+

SW360 minimal system requirements based on system class

+
+ + +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/index.xml b/docs/deployment/index.xml new file mode 100644 index 0000000..02774e1 --- /dev/null +++ b/docs/deployment/index.xml @@ -0,0 +1,1100 @@ + + + Eclipse SW360 – Deployment + https://www.eclipse.org/sw360/docs/deployment/ + Recent content in Deployment on Eclipse SW360 + Hugo -- gohugo.io + + + + + + + + + + + Docs: Bare Metal + https://www.eclipse.org/sw360/docs/deployment/baremetal/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/baremetal/ + + + + + + + + + Docs: Upgrade from previous instances + https://www.eclipse.org/sw360/docs/deployment/upgrading/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/upgrading/ + + + + + + + + + Docs: Authorization Concept + https://www.eclipse.org/sw360/docs/deployment/deploy-authorization-concept/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-authorization-concept/ + + + + <p>The authorization concept describes the different roles of the solution - mainly for documentation of the authorization of different roles of the sw360. It is not focusing for the roles like being a moderator, it is described on a separate page for users: <a href="https://github.com/eclipse/sw360/wiki/Dev-Role-Authorisation-Model">role and access model</a></p> +<h2 id="roles-overview">Roles Overview</h2> +<p>SW360 offers two choices for doing the roles: one is setting access rights at every record individually. Another are general roles that can be set for every user. An admin of SW360 can set user roles at the Liferay Users and Roles UI.</p> +<h4 id="setup-admin-liferay-role">Setup Admin (Liferay Role)</h4> +<p>The setup admin is the Liferay administrator, which can configure the entire liferay app, such as which portlets are shown on which page.</p> +<h4 id="sw360-admin-liferay-role">SW360 Admin (Liferay Role)</h4> +<p>The SW360 admin can change all data and promote users for more access rights, such as promoting a user to role <code>CLEARING_ADMIN</code>. So its use case is to promote users to clearing admins after some time without always asking the site administrator to do this. To enhance the <code>SW360_ADMIN</code> role to allow users of this role to promote other users&rsquo;s roles, follow these steps:</p> +<ol> +<li>Go to control panel</li> +<li>Select the <code>Users</code> section</li> +<li>To subsection <code>Roles</code></li> +<li>Select row for <code>SW360 Admin</code> and select action <code>Define permissions</code>.</li> +</ol> +<p>When defining permissions the idea is to reduce the permissions to the lowest level possible. Just allow for changing users.</p> +<h4 id="clearing-admin-liferay-role">Clearing Admin (Liferay Role)</h4> +<p>The clearing admin can change all component and release records and project records of the same group.</p> +<h4 id="security-admin-liferay-role">Security Admin (Liferay Role)</h4> +<p>In addition to the user rights, the security admin can set security vulnerabilities to irrelevant</p> +<h4 id="ecc-admin-liferay-role">ECC Admin (Liferay Role)</h4> +<p>In addition to the user rights, the ECC admin can manipulate ECC data.</p> +<h4 id="user">User</h4> +<p>A user can create, modify and delete all own (=self created) records. A user cannot change records of others</p> +<h4 id="summary">Summary</h4> +<h3 id="moderation-requests">Moderation Requests</h3> +<p>If a user with user or other access role rights is not entitled to write or change a record, a moderation request will be created. The moderation request contains the changes an will be routed for approval to the users who can write this record.</p> + + + + + + Docs: Configurable Property Keys + https://www.eclipse.org/sw360/docs/deployment/deploy-configuration-files/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-configuration-files/ + + + + <h3 id="introduction">Introduction</h3> +<p>List of all applicable property files in sw360:</p> +<ul> +<li>sw360.properties</li> +<li>fossology.properties</li> +<li>couchdb.properties</li> +<li>search.properties</li> +<li>orgmapping.properties</li> +<li>databasetest.properties</li> +<li>authorization/application.yml</li> +<li>rest/application.yml</li> +</ul> +<h3 id="sw360properties-etcsw360sw360properties">SW360.properties (/etc/sw360/sw360.properties)</h3> +<p>The following table shall give an overview about the general sw360 configuration settings.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">licenseinfo.spdxparser.use-license-info-from-files</td> +<td style="text-align:left">true/false</td> +</tr> +<tr> +<td style="text-align:left">mainline.state.enabled.for.user</td> +<td style="text-align:left">true/false</td> +</tr> +<tr> +<td style="text-align:left">key.auth.email</td> +<td style="text-align:left">EMAIL</td> +</tr> +<tr> +<td style="text-align:left">key.auth.extid</td> +<td style="text-align:left">EXTID</td> +</tr> +<tr> +<td style="text-align:left">key.auth.givenname</td> +<td style="text-align:left">GIVENNAME</td> +</tr> +<tr> +<td style="text-align:left">key.auth.surname</td> +<td style="text-align:left">SURNAME</td> +</tr> +<tr> +<td style="text-align:left">key.auth.department</td> +<td style="text-align:left">DEPARTMENT</td> +</tr> +<tr> +<td style="text-align:left">backend.url</td> +<td style="text-align:left">http://127.0.0.1:8080</td> +</tr> +<tr> +<td style="text-align:left">cvesearch.vendor.threshold</td> +<td style="text-align:left">1</td> +</tr> +<tr> +<td style="text-align:left">cvesearch.product.threshold</td> +<td style="text-align:left">0</td> +</tr> +<tr> +<td style="text-align:left">cvesearch.cutoff</td> +<td style="text-align:left">6</td> +</tr> +<tr> +<td style="text-align:left">combined.cli.parser.external.id.correlation.key</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">schedule.cvesearch.firstOffset.seconds</td> +<td style="text-align:left">0</td> +</tr> +<tr> +<td style="text-align:left">schedule.cvesearch.interval.seconds</td> +<td style="text-align:left">&ldquo;(24<em>60</em>60)&rdquo;</td> +</tr> +<tr> +<td style="text-align:left">autostart</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">rest.write.access.usergroup</td> +<td style="text-align:left">SW360_ADMIN</td> +</tr> +<tr> +<td style="text-align:left">rest.access.token.validity.seconds</td> +<td style="text-align:left">3600</td> +</tr> +<tr> +<td style="text-align:left">rest.security.client.id</td> +<td style="text-align:left">sw360-trusted-client</td> +</tr> +<tr> +<td style="text-align:left">rest.security.client.secret</td> +<td style="text-align:left">sw360-secret</td> +</tr> +<tr> +<td style="text-align:left">programming.languages</td> +<td style="text-align:left">ActionScript,AppleScript, Asp,Bash,BASIC, C,C++,C#,Cocoa,Clojure, COBOL,ColdFusion,D, Delphi,Erlang,Fortran, Go,Groovy,Haskell, JSP,Java,JavaScript,Objective-C, Ocaml,Lisp,Perl, PHP,Python,Ruby,SQL ,SVG,Scala,SmallTalk Scheme,Tcl,XML, Node.js,JSON</td> +</tr> +<tr> +<td style="text-align:left">software.platforms</td> +<td style="text-align:left">Adobe AIR,Adobe Flash, Adobe Shockwave,Binary Runtime Environment for Wireless,Cocoa (API),Cocoa Touch,Java (software platform)</td> +</tr> +<tr> +<td style="text-align:left">operating.systems</td> +<td style="text-align:left">Android,BSD,iOS, Linux,OS X,QNX, Microsoft Windows,Windows Phone,IBM z/OS</td> +</tr> +<tr> +<td style="text-align:left">clearing.teams</td> +<td style="text-align:left">org1,org2,org3</td> +</tr> +<tr> +<td style="text-align:left">state</td> +<td style="text-align:left">Active,Phase out,Unknown</td> +</tr> +<tr> +<td style="text-align:left">project.type</td> +<td style="text-align:left">Customer Project,Internal Project,Product,Service,Inner Source</td> +</tr> +<tr> +<td style="text-align:left">project.externalkeys</td> +<td style="text-align:left">internal.id</td> +</tr> +<tr> +<td style="text-align:left">license.identifiers</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">component.categories</td> +<td style="text-align:left">framework,SDK,big-data, build-management,cloud,content, database,graphics,http, javaee,library,mail,mobile, security,testing,virtual-machine, web-framework,xml</td> +</tr> +<tr> +<td style="text-align:left">component.externalkeys</td> +<td style="text-align:left">com.github.id,com.gitlab.id,purl.id</td> +</tr> +<tr> +<td style="text-align:left">custommap.project.roles</td> +<td style="text-align:left">Stakeholder,Analyst,Contributor,Accountant,End user,Quality manager,Test manager,Technical writer,Key user</td> +</tr> +<tr> +<td style="text-align:left">custommap.component.roles</td> +<td style="text-align:left">Committer,Contributor,Expert</td> +</tr> +<tr> +<td style="text-align:left">custommap.release.roles</td> +<td style="text-align:left">Committer,Contributor,Expert</td> +</tr> +<tr> +<td style="text-align:left">custommap.release.externalIds</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">release.externalkeys</td> +<td style="text-align:left">org.maven.id,com.github.id,com.gitlab.id,purl.id</td> +</tr> +<tr> +<td style="text-align:left">projectimport.hosts</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">preferred.country.codes</td> +<td style="text-align:left">DE,AT,CH,US</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_from</td> +<td style="text-align:left">_<a href="mailto:No_Reply__@sw360.org">No_Reply__@sw360.org</a></td> +</tr> +<tr> +<td style="text-align:left">MailUtil_host</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_port</td> +<td style="text-align:left">25</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_enableStarttls</td> +<td style="text-align:left">false</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_enableSsl</td> +<td style="text-align:left">false</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_isAuthenticationNecessary</td> +<td style="text-align:left">true</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_login</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_password</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_enableDebug</td> +<td style="text-align:left">false</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_supportMailAddress</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">defaultBegin</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">defaultEnd</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">unsubscribeNoticeBefore</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">unsubscribeNoticeAfter</td> +<td style="text-align:left">-</td> +</tr> +</tbody> +</table> +<h3 id="fossologyproperties-etcsw360fossologyproperties">fossology.properties (/etc/sw360/fossology.properties)</h3> +<p>These configuration parameters are necessary to connect to a fossology server.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">fossology.host</td> +<td style="text-align:left">localhost</td> +</tr> +<tr> +<td style="text-align:left">fossology.port</td> +<td style="text-align:left">22</td> +</tr> +<tr> +<td style="text-align:left">fossology.user</td> +<td style="text-align:left">sw360</td> +</tr> +<tr> +<td style="text-align:left">fossology.key.file</td> +<td style="text-align:left">/fossology.id_rsa</td> +</tr> +<tr> +<td style="text-align:left">fossology.key.pub.file</td> +<td style="text-align:left">[fossology.key.file] + .pub</td> +</tr> +</tbody> +</table> +<h3 id="couchdbproperties-etcsw360couchdbproperties">couchdb.properties (/etc/sw360/couchdb.properties)</h3> +<p>CouchDB and Lucene serach configuration properties.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">couchdb.url</td> +<td style="text-align:left">http://localhost:5984</td> +</tr> +<tr> +<td style="text-align:left">couchdb.database</td> +<td style="text-align:left">sw360db</td> +</tr> +<tr> +<td style="text-align:left">couchdb.user</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">couchdb.password</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">couchdb.userdb</td> +<td style="text-align:left">sw360users</td> +</tr> +<tr> +<td style="text-align:left">couchdb.attachments</td> +<td style="text-align:left">sw360attachments</td> +</tr> +<tr> +<td style="text-align:left">couchdb.fossologyKeys</td> +<td style="text-align:left">sw360fossologyKeys</td> +</tr> +<tr> +<td style="text-align:left">couchdb.vulnerability_management</td> +<td style="text-align:left">sw360vm</td> +</tr> +<tr> +<td style="text-align:left">lucenesearch.limit</td> +<td style="text-align:left">25</td> +</tr> +<tr> +<td style="text-align:left">lucenesearch.leading.wildcard*</td> +<td style="text-align:left">false</td> +</tr> +</tbody> +</table> +<blockquote> +<p>* If you enable lucene leading wildcards you have to enable this configuration also in couchdb-lucene.ini! Leading wildcard search is disabled as default because its a expensive operation. <em>(couchdb-lucene.ini is part of the couchdb-lucene .war package)</em> <br> +[lucene] <br> +allowLeadingWildcard=true</p> +</blockquote> +<h3 id="searchproperties-etcsw360searchproperties">search.properties (/etc/sw360/search.properties)</h3> +<p>The following table shall give an overview about the specific search properties</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">search.name.max.length</td> +<td style="text-align:left">64</td> +</tr> +</tbody> +</table> +<h3 id="orgmappingproperties-etcsw360orgmappingproperties">orgmapping.properties (/etc/sw360/orgmapping.properties)</h3> +<p>This configuration file is used to activate the sw360 orgmapping feature.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">match.prefix</td> +<td style="text-align:left">false</td> +</tr> +<tr> +<td style="text-align:left">enable.custom.mapping</td> +<td style="text-align:left">false</td> +</tr> +</tbody> +</table> +<h3 id="databasetestproperties-etcsw360databasetestproperties">databasetest.properties (/etc/sw360/databasetest.properties)</h3> +<p>Just for couchdb database test purpose.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">couch_db_url</td> +<td style="text-align:left">http://localhost:5984</td> +</tr> +<tr> +<td style="text-align:left">couch_db_database</td> +<td style="text-align:left">datahandlertestdb</td> +</tr> +<tr> +<td style="text-align:left">couchdb.username</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">couchdb.password</td> +<td style="text-align:left">-</td> +</tr> +</tbody> +</table> +<h3 id="authorizationapplicationyml-etcsw360authorizationapplicationyml">authorization/application.yml (/etc/sw360/authorization/application.yml)</h3> +<p>All of the following built-in properties can be overridden:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span># Port to open in standalone mode +</span></span><span style="display:flex;"><span>server: +</span></span><span style="display:flex;"><span> port: 8090 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span># Connection to the couch databases. Will be used to store client credentials +</span></span><span style="display:flex;"><span>couchdb: +</span></span><span style="display:flex;"><span> url: http://localhost:5984 +</span></span><span style="display:flex;"><span> database: sw360oauthclients +</span></span><span style="display:flex;"><span> # if your couchdb does not use authentication, pls just don&#39;t use the settings for username and password +</span></span><span style="display:flex;"><span> #username: +</span></span><span style="display:flex;"><span> #password: +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>spring: +</span></span><span style="display:flex;"><span> jackson: +</span></span><span style="display:flex;"><span> serialization: +</span></span><span style="display:flex;"><span> indent_output: true +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span># Common SW360 properties +</span></span><span style="display:flex;"><span>sw360: +</span></span><span style="display:flex;"><span> # The url of the Liferay instance +</span></span><span style="display:flex;"><span> sw360-portal-server-url: ${SW360_PORTAL_SERVER_URL:http://127.0.0.1:8080} +</span></span><span style="display:flex;"><span> # The id of the company in Liferay that sw360 is run for +</span></span><span style="display:flex;"><span> sw360-liferay-company-id: ${SW360_LIFERAY_COMPANY_ID:20155} +</span></span><span style="display:flex;"><span> # Allowed origins that should be set in the header +</span></span><span style="display:flex;"><span> cors: +</span></span><span style="display:flex;"><span> allowed-origin: ${SW360_CORS_ALLOWED_ORIGIN:#{null}} +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>security: +</span></span><span style="display:flex;"><span> # Configuration for enabling authorization via headers, e.g. when using SSO +</span></span><span style="display:flex;"><span> # in combination with a reverse proxy server +</span></span><span style="display:flex;"><span> customheader: +</span></span><span style="display:flex;"><span> headername: +</span></span><span style="display:flex;"><span> # You have to enable authorization by headers explicitly here +</span></span><span style="display:flex;"><span> enabled: false +</span></span><span style="display:flex;"><span> # Attention: please make sure that the proxy is removing there headers +</span></span><span style="display:flex;"><span> # if they are coming from anywhere else then the authentication server +</span></span><span style="display:flex;"><span> intermediateauthstore: custom-header-auth-marker +</span></span><span style="display:flex;"><span> email: authenticated-email +</span></span><span style="display:flex;"><span> extid: authenticated-extid +</span></span><span style="display:flex;"><span> # also available - at least in saml pre auth - are &#34;givenname&#34;, &#34;surname&#34; and &#34;department&#34; +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> oauth2: +</span></span><span style="display:flex;"><span> resource: +</span></span><span style="display:flex;"><span> id: sw360-REST-API +</span></span></code></pre></div><h3 id="restapplicationyml-etcsw360restapplicationyml">rest/application.yml (/etc/sw360/rest/application.yml)</h3> +<p>All of the following built-in properties can be overridden:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>server: +</span></span><span style="display:flex;"><span> port: 8091 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>spring: +</span></span><span style="display:flex;"><span> http: +</span></span><span style="display:flex;"><span> multipart: +</span></span><span style="display:flex;"><span> max-file-size: 500MB +</span></span><span style="display:flex;"><span> max-request-size: 600MB +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> data: +</span></span><span style="display:flex;"><span> rest: +</span></span><span style="display:flex;"><span> base-path: /api +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span># logging: +</span></span><span style="display:flex;"><span># level: +</span></span><span style="display:flex;"><span># org.springframework.web: DEBUG +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>security: +</span></span><span style="display:flex;"><span> oauth2: +</span></span><span style="display:flex;"><span> resource: +</span></span><span style="display:flex;"><span> id: sw360-REST-API +</span></span><span style="display:flex;"><span> filter-order: 3 +</span></span><span style="display:flex;"><span> jwt: +</span></span><span style="display:flex;"><span> keyValue: | +</span></span><span style="display:flex;"><span> -----BEGIN PUBLIC KEY----- +</span></span><span style="display:flex;"><span> MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApz8Cr1o5yHMv/FUdF5uy +</span></span><span style="display:flex;"><span> VptilqdWtNvw5S6Tr4IaQ4XR9QPt8nlRsjOngfG4QCcKMBWJISldFg8PlJWUBeV+ +</span></span><span style="display:flex;"><span> 6TwQUidxokl2GbO6/+QA+lz1a5Ei1Y1pcnvFeRb2pdYlH3Yg6fXMxS6QwDLk27pZ +</span></span><span style="display:flex;"><span> 5xbpSDIGISDesyaIMvwaKdhAbFW/tTb/oJY7rCPvmYLT80kJzilijJ/W01jMMSHg +</span></span><span style="display:flex;"><span> 9Yi5cCt1eU/s78co+pxHzwNXO0Ul4iRpo/CXprQCsSIsdWkJTo6btal1xzd292Da +</span></span><span style="display:flex;"><span> d+9xq499JEsNbcqLfCq8DBQ7CEz6aJjMvPkvZiCrFIGxC/Gqmw35DQ4688rbkKSJ +</span></span><span style="display:flex;"><span> PQIDAQAB +</span></span><span style="display:flex;"><span> -----END PUBLIC KEY----- +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>sw360: +</span></span><span style="display:flex;"><span> thrift-server-url: ${SW360_THRIFT_SERVER_URL:http://localhost:8080} +</span></span><span style="display:flex;"><span> test-user-id: admin@sw360.org +</span></span><span style="display:flex;"><span> test-user-password: sw360-password +</span></span><span style="display:flex;"><span> couchdb-url: ${SW360_COUCHDB_URL:http://localhost:5984} +</span></span><span style="display:flex;"><span> cors: +</span></span><span style="display:flex;"><span> allowed-origin: ${SW360_CORS_ALLOWED_ORIGIN:#{null}} +</span></span></code></pre></div> + + + + + Docs: Configuring Country Codes + https://www.eclipse.org/sw360/docs/deployment/deploy-configuration-country-codes/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-configuration-country-codes/ + + + + <p>This feature is available on:</p> +<ul> +<li>projects / Owner Country</li> +<li>components / Owner Country</li> +</ul> +<p><img src="https://user-images.githubusercontent.com/29916928/36796378-551cf572-1c9d-11e8-96aa-85ce98e97ff3.jpg" alt="Country Code List"></p> +<p>Its supports preferred country codes, which are shown at the top of the country list. <br> +You can configure them by using the sw360.properties.</p> +<table> +<thead> +<tr> +<th style="text-align:center">sw360 properties key</th> +<th style="text-align:center">value</th> +<th style="text-align:center">default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:center">preferred.country.codes</td> +<td style="text-align:center">(ISO 3166-1 alpha-2)</td> +<td style="text-align:center">DE,AT,CH,US</td> +</tr> +</tbody> +</table> + + + + + + Docs: CVE Scheduler + https://www.eclipse.org/sw360/docs/deployment/deploy-cve-search/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-cve-search/ + + + + <h1 id="how-to-use-sw360-cve-schedule">How to use SW360 CVE schedule</h1> +<p>SW360 gets vulnerability information from Common Vulnerability Enumeration (CVE) data. SW360 can connect to your local cve-search server.<br> +<em>Few years ago, sw360 was able to get vulnerability information from online CVE serverr, but it is not active.</em></p> +<h2 id="install-cve-search">Install CVE-search</h2> +<p>cve-search is a tool to import CVE (Common Vulnerabilities and Exposures) and CPE (Common Platform Enumeration) into a MongoDB to facilitate search and processing of CVEs. You can choose Docker install or Native install.</p> +<h3 id="docker-installation-github-repohttpsgithubcomcve-searchcve-search-docker">Docker Installation <a href="https://github.com/cve-search/CVE-Search-Docker">Github repo</a></h3> +<p>Only clone and &ldquo;docker-compose up&rdquo;.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ git clone https://github.com/cve-search/CVE-Search-Docker.git +</span></span><span style="display:flex;"><span> $ <span style="color:#366">cd</span> CVE-Search-Docker +</span></span><span style="display:flex;"><span> $ docker-compose up +</span></span></code></pre></div><h3 id="native-installation-github-repohttpsgithubcomcve-searchcve-search">Native Installation <a href="https://github.com/cve-search/cve-search">Github repo</a></h3> +<ol> +<li>Clone source</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ git clone https://github.com/cve-search/cve-search +</span></span><span style="display:flex;"><span> $ <span style="color:#366">cd</span> cve-search +</span></span><span style="display:flex;"><span> $ git checkout <span style="color:#555">{</span>tag/branch<span style="color:#555">}</span> +</span></span></code></pre></div><ol start="2"> +<li>Install system requirements</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ sudo apt-get install -y &lt; requirements.system +</span></span></code></pre></div><ol start="3"> +<li>Install CVE-Search and its Python dependencies</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> pip3 install -r requirements.txt +</span></span></code></pre></div><ol start="4"> +<li>Install mongodb</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add - +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ <span style="color:#033">codename</span><span style="color:#555">=</span><span style="color:#069;font-weight:bold">$(</span>lsb_release --codename --short<span style="color:#069;font-weight:bold">)</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ <span style="color:#366">echo</span> <span style="color:#c30">&#34;deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu </span><span style="color:#a00">${</span><span style="color:#033">codename</span><span style="color:#a00">}</span><span style="color:#c30">/mongodb-org/4.4 multiverse&#34;</span> | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ sudo apt-get update +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ sudo apt-get install -y mongodb-org +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ sudo systemctl daemon-reload +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ sudo systemctl start mongod +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># Verify status of mongodb</span> +</span></span><span style="display:flex;"><span> $ sudo systemctl status mongod +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># if all is ok, enable mongodb to start on system startup</span> +</span></span><span style="display:flex;"><span> $ sudo systemctl <span style="color:#366">enable</span> mongod +</span></span></code></pre></div><ol start="5"> +<li>Populating the database</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ sudo apt-get install redis redis-server +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic">#modify: stop-writes-on-bgsave-error yes -&gt; no</span> +</span></span><span style="display:flex;"><span> $ sudo vim /etc/redis/redis.conf +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ sudo systemctl daemon-reload +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ sudo systemctl restart redis +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ ./sbin/db_mgmt_cpe_dictionary.py -p +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ ./sbin/db_mgmt_json.py -p +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ ./sbin/db_updater.py -c <span style="color:#09f;font-style:italic"># This will take &gt; 45minutes on a decent machine, please be patient</span> +</span></span></code></pre></div><ol start="6"> +<li>Updating the database</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ ./sbin/db_updater.py -v +</span></span></code></pre></div><ol start="7"> +<li>Starting and stopping the web-server</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># Install psutil &gt;= 5.7.0</span> +</span></span><span style="display:flex;"><span> $ pip3 install psutil&gt;<span style="color:#555">=</span>5.7.0 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># Starting web server</span> +</span></span><span style="display:flex;"><span> $ python3 web/index.py +</span></span></code></pre></div><p>Default Web server: http://localhost:5000</p> +<p>To stop the server, press the <code>CTRL+C</code></p> +<p><strong>Note</strong>: By default CVE-Search takes assumptions on certain configuration aspects of the application, you can adjust</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ <span style="color:#366">cd</span> cve-search +</span></span><span style="display:flex;"><span> $ cp etc/configuration.ini.sample etc/configuration.ini +</span></span><span style="display:flex;"><span> $ vim etc/configuration.ini +</span></span></code></pre></div><h2 id="setup-sw360-with-cve-server">Setup SW360 with CVE server</h2> +<ol> +<li>Change default CVE server</li> +</ol> +<p>Change <code>cvesearch.host</code> with CVE server address.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ vim <span style="color:#a00">${</span><span style="color:#033">SW360_DIR_INSTALL</span><span style="color:#a00">}</span>/backend/src/src-cvesearch/src/main/resources/cvesearch.properties +</span></span></code></pre></div><ol start="2"> +<li>Setting for schedule the CVE service</li> +</ol> +<p>The offset (first run of the update) and the interval between updates can also be adjusted.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ vim <span style="color:#a00">${</span><span style="color:#033">SW360_DIR_INSTALL</span><span style="color:#a00">}</span>/backend/src/src-schedule/src/main/resources/sw360.properties +</span></span></code></pre></div><p>The <code>offset</code> has to be given in seconds since midnight and also the <code>interval</code> has to be entered in seconds. The default is to update the vulnerabilities by CVEsearch every night at midnight, which corresponds to an offset of 0 and an interval of 24 hours (= 86400 seconds).</p> +<p>According to the default settings, cveSearch is not auto-started with the scheduling service. If want to auto start <code>autostart = cvesearchService</code></p> +<ol start="3"> +<li>Schedule task Adminstration</li> +</ol> +<p>View and start/stop schedule</p> +<p>Click <code>Admin</code> &gt; <code>Schedule</code></p> +<h2 id="reference">Reference</h2> +<p>CVE guide: [https://cve-search.github.io/cve-search/database/database.html]</p> +<p>User Scheduling CVE Search by Admins: [https://github.com/eclipse/sw360/wiki/User-Scheduling-CVE-Search-by-Admins]</p> + + + + + + Docs: Docker Deployment + https://www.eclipse.org/sw360/docs/deployment/deploy-docker/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-docker/ + + + + <h1 id="a-quick-how-to-for-testing-sw360">A quick how-to for testing SW360</h1> +<h2 id="requirements">Requirements</h2> +<h3 id="platform-requirements">Platform Requirements</h3> +<p>As you need Apache Thrift 0.11.0 (see <a href="https://github.com/eclipse/sw360#required-software">https://github.com/eclipse/sw360#required-software</a> ), using the latest Ubuntu LTS (18.04) won&rsquo;t work, so we start on Ubuntu 19.10 if you want to install from packages. As an alternative, consider the following script from the sw360 repository:</p> +<p><a href="https://github.com/eclipse/sw360/blob/master/scripts/install-thrift.sh">https://github.com/eclipse/sw360/blob/master/scripts/install-thrift.sh</a></p> +<p>We&rsquo;ll go the Docker way and follow the instructions of the <a href="https://github.com/sw360/sw360chores">sw360chores project</a>. There is a nice diagram there, explaining the rather complex setup.</p> +<h3 id="sw360chores-requirements">sw360chores Requirements</h3> +<blockquote> +<p>the perl interpreter to run ./sw360chores.pl</p> +</blockquote> +<p>You should already have it in your default, even if minimal, installation</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>$ which perl +</span></span><span style="display:flex;"><span>/usr/bin/perl +</span></span></code></pre></div><blockquote> +<p>git which is used in some prepare scripts</p> +</blockquote> +<p><code>sudo apt install git</code></p> +<blockquote> +<p>a current version of docker (min 1.30) [https://docs.docker.com/]</p> +</blockquote> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt install docker.io +</span></span></code></pre></div><blockquote> +<p>docker-compose (min 1.21) [https://docs.docker.com/compose/install/]</p> +</blockquote> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt install docker-compose +</span></span></code></pre></div><p>And you actually also need curl,</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt install curl +</span></span></code></pre></div><h3 id="sw360-requirements">Sw360 Requirements</h3> +<p>From the <a href="https://github.com/eclipse/sw360#required-software">sw360 Readme</a>:</p> +<blockquote> +<p>Java 1.8.X</p> +</blockquote> +<p>And when they say &ldquo;1.8.X&rdquo;, they mean it: it won&rsquo;t work with a later version. So it&rsquo;s better to uninstall the potential other versions of Java (/!\ this is expected to break other things on your environment if you depend on Java for anything), and then install the required version</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> sudo apt install openjdk-8-jdk openjdk-8-jre +</span></span></code></pre></div><blockquote> +<p>In order to build you will need:</p> +<ul> +<li>A git client</li> +<li>Apache Maven 3.6.X</li> +<li>Apache Thrift 0.11.0</li> +</ul> +</blockquote> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt install maven +</span></span></code></pre></div><p>That will install maven Apache Maven 3.6.1 but you need to have installed the correct version (8) of Java <em>before hand</em> otherwise it will install a too recent one.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt install thrift-compiler +</span></span></code></pre></div><p>That will install Thrift version 0.11.0, if you have not installed thrift using the script above.</p> +<h2 id="cloning-the-repos">Cloning the repos</h2> +<h3 id="generating-an-ssh-key-pair-for-your-machine">Generating an ssh key-pair for your machine</h3> +<p>If you don&rsquo;t already have one, generate a key pair with no passphrase, in default location:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>ssh-keygen -t rsa -b 4096 -C &#34;your_email@example.com&#34; +</span></span></code></pre></div><p>Not 100% sure, but not having one may create problems, so&hellip;</p> +<h3 id="cloning-sw360-chores">Cloning sw360 chores</h3> +<p>I created a <code>code</code> folder at the root of the user&rsquo;s directory, just to make things simple.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>~$ cd code +</span></span><span style="display:flex;"><span>~/code$ git clone https://github.com/sw360/sw360chores.git +</span></span></code></pre></div><h3 id="cloning-eclipsesw360">Cloning eclipse/sw360</h3> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>~/code$ git clone https://github.com/eclipse/sw360.git +</span></span></code></pre></div><h2 id="compiling-and-deploying-sw360-code">Compiling and deploying SW360 Code</h2> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a00;background-color:#faa">~$</span> cd code<span style="color:#555">/</span>sw360<span style="color:#555">/</span> +</span></span><span style="display:flex;"><span><span style="color:#a00;background-color:#faa">~</span><span style="color:#555">/</span>code<span style="color:#555">/</span>sw360<span style="color:#a00;background-color:#faa">$</span> mvn <span style="color:#069;font-weight:bold">package</span> <span style="color:#555">-</span>P deploy <span style="color:#555">-</span>Dbase.deploy.dir=<span style="color:#555">/</span>home<span style="color:#555">/</span>inno3<span style="color:#555">/</span>code<span style="color:#555">/</span>sw360chores<span style="color:#555">/</span>_deploy <span style="color:#555">-</span>DskipTests +</span></span></code></pre></div><h2 id="launching-the-containers">Launching the containers</h2> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>$ cd ~/code/sw360chores/ +</span></span><span style="display:flex;"><span>~/code/sw360chores$ ./sw360chores.pl --build -- up +</span></span></code></pre></div><p>And yes, there is a space between <code>--</code> and <code>up</code>.</p> +<p>If everything goes fine, you should see a line like</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360_1 | 15-Jan-2020 12:33:38.480 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [144,475] milliseconds +</span></span></code></pre></div><p>You should be able to login at <a href="https://localhost:8443">https://localhost:8443</a> with the default credentials <code>setup@sw360.org</code> and the password <code>sw360fossy</code> (found <a href="https://github.com/eclipse/sw360/wiki/Deploy-Liferay#liferay-administrator-steps">here</a>).</p> +<p>Please go ahead now with the setup of the Liferay - links can be found in the main wiki page.</p> + + + + + + Docs: Export and Import + https://www.eclipse.org/sw360/docs/deployment/deploy-export-and-import/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-export-and-import/ + + + + <div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span><span style="background-color:#fcc">- note that only export and import of users is active, +</span></span></span><span style="display:flex;"><span><span style="background-color:#fcc">- everything else is deprecated functionality. +</span></span></span><span style="display:flex;"><span><span style="background-color:#fcc">- The export and import functionality has not been +</span></span></span><span style="display:flex;"><span><span style="background-color:#fcc">- updated at some point and thus will not function +</span></span></span><span style="display:flex;"><span><span style="background-color:#fcc">- properly anymore. +</span></span></span></code></pre></div><h1 id="full-export">Full Export</h1> +<p>The easiest way to fully export the data is to copy all the .couch files of Couch-DB. Where the files are can be found out from Futon. +e.g.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://localhost:5984/_utils/config.html +</span></span></code></pre></div><p>under</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>view_index_dir /var/lib/couchdb +</span></span></code></pre></div><p>This method of exporting has the advantage that all Ids remain the same. +An equally simple method it to use the Couch-DB replicator from Futon.</p> +<p>This method might fail when there are changes to the document structure as Ektorp might stumble over unset required or surplus fields. The method of choice here is to repair the DB (after a backup) with</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://github.com/couchapp/couchapp +</span></span></code></pre></div><p>and then follows the instructions from</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://harthur.github.io/costco/ +</span></span></code></pre></div><p>and</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>couchapp push . http://localhost:5984/sw360users +</span></span></code></pre></div><p>then you go to</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://localhost:5984/sw360users/_design/costco/index.html +</span></span></code></pre></div><p>and you can run functions like:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>function(doc) { +</span></span><span style="display:flex;"><span> if (doc.type == &#39;user&#39;) { +</span></span><span style="display:flex;"><span> if(doc.fullname == &#39;Homer J. Simons&#39;) { +</span></span><span style="display:flex;"><span> doc.fullname = &#39;Homer Jay Simons&#39;; +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> return doc; +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>You can also change the names of properties, e.g.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>function(doc) { +</span></span><span style="display:flex;"><span> if (doc.type == &#39;user&#39;) { +</span></span><span style="display:flex;"><span> if(doc.fullname ) { +</span></span><span style="display:flex;"><span> doc.fullname2 = doc.fullname; +</span></span><span style="display:flex;"><span> delete doc.fullname; +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> return doc; +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><h1 id="csv-export">CSV Export</h1> +<h2 id="users">Users</h2> +<p>The export of users was already described, this is very important as this also creates the users in the liferay database. The mere export of the users.couch is not enough.</p> +<h2 id="projects">Projects</h2> +<p>There is no CSV export or import for projects currently.</p> +<h2 id="components-and-releases">Components and Releases</h2> +<p>To Export the components and releases you need to do the following: +As Components and Releases are identified by their identifier ([name] or [name(version)]), these identifiers need to be unique. When importing duplicates in the identifiers are ignored and they are also not exported. +Therefore in the admin page you can check the database for such duplicates.</p> +<p>After that &ldquo;Download Component CSV&rdquo; creates a CSV with components, releases and their source attachments. +The source attachments are created if the &ldquo;DownloadURL&rdquo; is a valid url. +These remote-only attachments will be download once the first download request occurs. +If the URL does not exist you get an error.</p> +<p>Alternatively you can use</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360/src/backend/utils/src/main/java/com/siemens/sw360/attachments/db/RemoteAttachmentDownloader.java +</span></span></code></pre></div><p>to bulk download the source only attachments. +The command line call to use it from the Siemens network looks like this:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> java -jar -Dhttp.proxyHost=proxyfarm.3dns.netz.sbs.de -Dhttps.proxyHost=proxyfarm.3dns.netz.sbs.de -Dhttp.proxyPort=84 -Dhttps.proxyPort=84 /home/siemagrant/.m2/repository/com/siemens/sw360/backend-utils/0.1.1-SNAPSHOT/backend-utils-0.1.1-SNAPSHOT-jar-with-dependencies.jar -d +</span></span></code></pre></div><h2 id="attachments">Attachments</h2> +<p>Here we have a mixed strategy, as there is a CSV export for the attachments, which only stores the meta information about the files. The files themselves need to be brought into a new instance via the sw360attachments.couch database.</p> +<p>The ids of the attachments are also in the CSV, so they are not portable without the sw360attachments.couch. This is meant as a form of recovery, but it should not be used on an instance that has been worked on, so only a fresh set up.</p> +<p>This will overwrite the auto generated attachments from the component CSV if the have the same URL as one of the imported attachments. This feature is needed to render the procedure idempotent.</p> +<p>The admin interface provides the possibility to delete attachment contents that do not have a project, component or release with an attachment that references it.</p> +<p>If you copy the sw360attachments.couch to your instance and then click this before you import than the db should be empty afterwards.</p> +<p>If there was no error after importing the csv, running this job should yield no deletions if there was no error and the exported attachments where complete.</p> +<p>In general this should only be necessary if errors have occurred. +It is a good idea to run this before you export the attachments.</p> +<h2 id="release-links">Release links</h2> +<p>Links between releases can be exported or imported. +Because release links are stored in maps, the procedure is idempotent by construction. +The old links are overwritten with the imported data.</p> +<h2 id="suggested-order-for-exports">Suggested Order for Exports</h2> +<ol> +<li>Freeze the application, so that others can not change the data at the moment (By external means, like closing a port forwarding)</li> +<li>Clean up the attachments</li> +<li>Look for duplicate identifiers and resolve conflicts (Important as duplicates do not get exported or imported)</li> +<li>Export the Users, Components, Attachment Infos and release links</li> +<li>copy the sw360attachments.couch, this might be a huge files</li> +</ol> +<h2 id="suggested-order-for-imports">Suggested Order for Imports</h2> +<h3 id="on-a-fresh-installation">On a fresh installation</h3> +<ol> +<li>Copy the sw360attachments.couch in its place</li> +<li>Start the licenses importer</li> +<li>restart the backend to make the design documents available and boot the frontend</li> +<li>Import the users</li> +<li>Import the component CSV</li> +<li>Import the Attachment Infos</li> +<li>Import the Release Link Infos.</li> +</ol> +<h3 id="regular-maintenance-operations">Regular Maintenance Operations</h3> +<ol> +<li>Run the attachments clean up</li> +<li>Resolve name crashes with the search for duplicate Identifiers</li> +</ol> +<h3 id="imports-on-a-running-instance">Imports on a running instance</h3> +<ol> +<li>New components can be imported via the CSV at any time. Duplicates to existing components will be ignored, but there is a log message.</li> +<li>Users can be added via CSV.</li> +<li>Release links can be added via CSV, duplicates overwrite existing links</li> +</ol> +<p>Attachments should not be imported on a running instance! +This should not break much, as without the entries in the couchDB there will be no import. +But potentially remote-only Attachments get deleted. +Nevertheless this scenario is not intended and maybe there are unforeseen side effects.</p> +<h2 id="troubleshooting">Troubleshooting</h2> +<h4 id="import-failing-in-the-backend-no-department">Import failing in the Backend: No Department</h4> +<p>The import fails with some error message that a user does not have a department?</p> +<ol> +<li>First of all, the importing admin requires a group assignment. Otherwise the adding component action will fail.</li> +<li>If a group is added to the admin, not that in addition to the Liferay group setting, this information must be also placed into the &ldquo;sw360users&rdquo; database in couchdb.</li> +<li>Note that changes to groups and similar things will require a restart of the Liferay server (=tomcat). Otherwise the user caching kicks in and might not reflect all updates.</li> +</ol> + + + + + + Docs: Security + https://www.eclipse.org/sw360/docs/deployment/deploy-secure-deployment/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-secure-deployment/ + + + + <p>After the basic installation, there are some following steps that should be considered for securing the deployment. The main issue that can be done upfront is the documentation of the involved components:</p> +<ul> +<li>Lifearay</li> +<li>Tomcat</li> +<li>Couchdb</li> +<li>Vagrant</li> +</ul> +<p>For vagrant it is important to understand how to close the provisioning users and not keep default usernames and passwords open.</p> +<p>Then for the applications, the following very first line measure should be considered:</p> +<ul> +<li> +<p>Change password of Liferay administrator user or check if that is appropriately secure.</p> +</li> +<li> +<p>You should check the permissions of the involved users in the user management in Liferay.</p> +</li> +<li> +<p>Assign individual passwords for users, also you could force the users to change their passwords at login if you like.</p> +</li> +<li> +<p>Besides the general advice to check the deployment instructions for the involved components, it is of particular interest to limit couchdb access from localhost only.</p> +</li> +<li> +<p>Also for Tomcat you limit port access from localhost only.</p> +</li> +<li> +<p>Do you need the ssh ports open or can you just go to the machine (physically).</p> +</li> +<li> +<p>Fix the admin party on couchdb</p> +</li> +<li> +<p>Add https access to couchdb</p> +</li> +<li> +<p>check that sw360 eyecuting user does not have sudo rights and config files for sw360 are <code>600</code> only for the executing user.</p> +</li> +</ul> +<p>Note that the Linux vagrant scripts applies somesecurity measures already on the OS level.</p> + + + + + + Docs: System Requirements + https://www.eclipse.org/sw360/docs/deployment/deploy-requirements/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-requirements/ + + + + <p>For deploying the SW360, there are the following hardware requirements below. Please note that the main memory consumer is the tomcat application container. Accordingly, this requires different settings (see <code>$TOMCAT_HOME/bin/setenv.sh</code>).</p> +<p>Please note that you can review the current memory situation of the application in the liferay administration section as well (see <code>Configuration</code>-&gt; <code>Server Administration</code>).</p> +<h2 id="hardware-and-infrastructure">Hardware and Infrastructure</h2> +<h3 id="cd-based-test-instances">CD-based test instances</h3> +<p>When there is a continuous deployment and continuous delivery directly deployed to machine the following machine is recommended:</p> +<ul> +<li>1 core</li> +<li>4GB RAM</li> +<li>40GB normal file system</li> +<li>10Mbit Ethernet link</li> +</ul> +<p>In this case, the sw360 solution runs fairly well for clicking around and creation of a few data sets. Note that Tomcat should have 2GB.</p> +<h3 id="staging-instances">Staging instances</h3> +<p>Testing and working with normal data sets for staging and pre-productive testing. Pre productive does not need to have the same execution speed of the machine, however, requires enough RAM and file system to run a clone on the data set.</p> +<ul> +<li>2 cores</li> +<li>8GB RAM</li> +<li>500GB normal file system</li> +<li>100Mbit Ethernet link</li> +</ul> +<p>The tomcat should be adjusted to 4GB RAM</p> +<h3 id="productive-instances">Productive instances</h3> +<p>Productive with for example: 10K releases, 2k users which deploys the entire solution onto a single larger machine. It does not apply to a docker based setup.</p> +<ul> +<li>4 cores</li> +<li>16GB RAM</li> +<li>500GB SSD based file system</li> +<li>1GBit link Ethernet link</li> +</ul> +<p>Tomcat should be adjusted to 10-12GB RAM. Note: normally, you could also run Tomcat with significantly lees RAM, if you put common dependencies in a shared lib folder.</p> +<h3 id="network">Network</h3> +<p>The following table shall give an overview about the inbound ports</p> +<table> +<thead> +<tr> +<th style="text-align:left">Port</th> +<th style="text-align:left">Service</th> +<th style="text-align:left">Remarks</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">443</td> +<td style="text-align:left">https</td> +<td style="text-align:left">Accessing the application</td> +</tr> +<tr> +<td style="text-align:left">22</td> +<td style="text-align:left">ssh</td> +<td style="text-align:left">Administering the application</td> +</tr> +<tr> +<td style="text-align:left">80</td> +<td style="text-align:left">http</td> +<td style="text-align:left">if you would like to access the solution over http</td> +</tr> +<tr> +<td style="text-align:left">5984/5985</td> +<td style="text-align:left">http/https</td> +<td style="text-align:left">if access to the couchdb (admin) interface is required</td> +</tr> +</tbody> +</table> +<p>Overview about the <em>additional</em> outbound ports:</p> +<table> +<thead> +<tr> +<th style="text-align:left">Port</th> +<th style="text-align:left">Service</th> +<th style="text-align:left">Remarks</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">3269</td> +<td style="text-align:left">sldap</td> +<td style="text-align:left">If you do authentication using secure LDAP</td> +</tr> +<tr> +<td style="text-align:left">443</td> +<td style="text-align:left">sldap</td> +<td style="text-align:left">If you do consume services over https (e.g. vulnerabilty pulling)</td> +</tr> +<tr> +<td style="text-align:left">53</td> +<td style="text-align:left">dns</td> +<td style="text-align:left">&hellip;</td> +</tr> +<tr> +<td style="text-align:left">22</td> +<td style="text-align:left">ssh</td> +<td style="text-align:left">the old way of calling a fossology server</td> +</tr> +</tbody> +</table> +<p>Outbound ports for http / https may be required for downloading system updates. Ports for ssh may not be required outbound.</p> +<h2 id="software">Software:</h2> +<p>As for the software, the sw360 can be run on many platforms, even on Windows seven. We have the following reference platform for development:</p> +<p>until 5:</p> +<ul> +<li>OpenJDK 8</li> +<li>Unbunu 16.04 LTS</li> +</ul> +<p>after 5:</p> +<ul> +<li>openjdk 8</li> +<li>ubuntu 18.04 LTS</li> +</ul> +<p>after 11:</p> +<ul> +<li>openjdk 11</li> +<li>ubuntu 18.04 LTS</li> +</ul> +<p>More information about requirements can be found here: <a href="https://github.com/sw360/sw360vagrant/wiki">https://github.com/sw360/sw360vagrant/wiki</a></p> + + + + + + diff --git a/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11/index.html b/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11/index.html new file mode 100644 index 0000000..b8d2281 --- /dev/null +++ b/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11/index.html @@ -0,0 +1,908 @@ + + + + + + + + + + + + + + + + + + + + +Liferay 7.3 and Java 11 | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Liferay 7.3 and Java 11

+
Upgrading previous sw360 instances to Liferay 7.3.x and Java 11
+ +

Introduction

+

We are covering the update for ubuntu here, because that is our main / agreed base system for running sw360. sw360 may run on a varienty of other linux distributions or OSes such as macosx, but in order to avoid problem we agreed on having a reference OS, which are the ubuntu long term releases.

+

With the update to Java 11, we upgraded from Ubuntu 16.04 to Ubuntu 18.04, both LTS version. This OS is used for example by the https://github.com/sw360/sw360vagrant project.

+

So the update covers the following:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
origntarget
Ubuntu 16.04 LTSUbuntu 18.04 LTS
CoucbdDB 1.X (comes with Ubuntu)CouchDB 2.X (not with Ubuntu anymore)
Postgresql 9.X (comes with Ubuntu)Postgresql 10.X (comes with Ubuntu)
OpenJDK 8 (comes with Ubuntu)openJDK 11 (comes with Ubuntu)
Apache Thrift 0.11/0.12Apache Thrift 0.13
+

Overview

+

The upgrade consists of quite some tasks, as an overview:

+
    +
  1. Make a backup
  2. +
  3. Execute sw360 migration scripts
  4. +
  5. Linux release upgrade
  6. +
  7. Java 11
  8. +
  9. Postgresql
  10. +
  11. CouchDB 2.X
  12. +
  13. Thrift to 0.13
  14. +
  15. Liferay ce 7.3.3
  16. +
  17. Copy your existing portal-ext.properties to now liferay_install location
  18. +
  19. copy from old liferay installation the data/document_library to the new liferay
  20. +
  21. Adjust /etc/ini.d/tomcat with path of new liferay
  22. +
  23. Adjust $liferay_install variable
  24. +
  25. add Java prerequisites to OSGi container
  26. +
  27. Update couchdb-lucene
  28. +
  29. Deploy new version of sw360
  30. +
  31. Adjust Liferay
  32. +
+

Initial steps

+

In order to “calibrate the system” just run the update / upgrade cycle once:

+

# sudo apt update

+

# sudo apt upgrade

+

Keeping More Settings Files

+

apache.conf: Keep also the mod security conf files that are asked to update during installation

+

sshd: Changes on the ssh / sshd conf files should be kept in case you have setup up dome remote public private key login (usually the case for server installation). Otherwise you re locked out maybe.

+

Maven: if you change Maven, for example with your proxy settings, keep it too.

+

In general, whenever there is functionality you need, consider keeping existing settings files.

+

Ubuntu Release Upgrade

+

There is maybe the remark to overwrite the current apache configuration. We propose to keep the currently installed apache files.

+

# sudo do-release-upgrade

+

Answer “yes” for the download of packages and also confirm the update of the glibc, of course. Update the system.conf(install maintainer’s version), depending on if you actually edited this. Some for sysctl.conf.

+

Migration of PostgreSQL

+

The existing 9.5 will not be upgraded, instead this message comes: After the release upgrade, you can check again if postgresql is installed:

+

sudo apt list postgre* --installed

+

Postgresql 9.5 should be the only installed. The old postgresql 9.5 must stay in fact, because the migration tool needs to be executing on a running postgresql 9.5 instance. Just having popstgresql 10 and a database only from postgresql 9.5 will not work. You can go ahead install postgresql 10:

+

sudo apt install postgresql-10

+

Then, apply the instruction to update from 9.5 to 10.0 from this page: https://stackoverflow.com/questions/47029055/how-do-i-upgrade-my-postgresql-9-5-to-postgresql-10-on-ubuntu-16-04

+
# service postgresql stop
+...
+# pg_dropcluster --stop 10 main
+...
+# pg_upgradecluster -m upgrade 9.5 main
+...
+# pg_dropcluster 9.5 main --stop
+...
+# apt-get autoremove --purge postgresql-9.5 
+...
+# service postgresql start
+

(note that # means you need to be root or execute with sudo)

+

Migration of CouchDB

+

CouchDB is not part of the Ubuntu package management anymore. Thus, you need to add the Apache CouchDb package repository to install it, first the key for signing:

+

curl -L https://couchdb.apache.org/repo/bintray-pubkey.asc | sudo apt-key add -

+

The add the repo to the sources:

+

echo "deb https://apache.bintray.com/couchdb-deb bionic main" | sudo tee -a /etc/apt/sources.list

+

Then, add its contents to the package database by updating apt:

+

sudo apt-get update -y

+

Ultimately install CouchDB, we tried with 2.1.2 initiall not to make a too far jump from 1.X, later versions may work as well. Note that for upgrading to CouchDB 3.X you would need an upgrade to 2.X first.

+

sudo apt-get install -y couchdb=2.1.2~bionic

+

The installer will ask a couple of questions:

+
    +
  1. Bind address: for CouchDB and SW360 127.0.0.1 (localhost) is a good bind address, if you would like to access the server from a remote computer because your sw360 runs as a server in the network, you would need to change accordingly.
  2. +
  3. Admin user: Warning The couchdb migration utility does not support authentication! Please do not enter an admin password, but apply it later. You can set the password for CouchDB in couchdb.properties and place it centrally in /etc/sw360
  4. +
  5. Migration: yes you need to use couchup for migrating the databases
  6. +
+

In case you added an admin and need to remove it, try:

+

curl -X DELETE http://admin:password@127.0.0.1:5984/_config/admins/admin

+

where the two occurrences admin is the name of the admin user in the URL, whatever the user was called.

+

Migration of CouchDB Databases

+

As a preparation: the CouchDB migration works by copying the databases, so the file system needs at least as much free space as the CouchDB databases use.

+

CouchDB offers a migration utility. It is advised that you remove all test databases as they do not seem to work with the migration utility. Important links are:

+ +

For some reason after installation, the couchuputility is not part of the path, so execute:

+

/opt/couchdb/bin/couchup list

+

It lists all DBs found. The go ahead with:

+

/opt/couchdb/bin/couchup replicate -a

+

It should replicate all databases in /var/lib/couchdb. Please refer to the couchup documentation, for the subsequent steps. A few remarks from our experience:

+
    +
  1. The rebuold of the couchdb does not work for our test databases. Please refer to the documentation how to do this manually if you like.
  2. +
  3. The couchup utility crashes for large DB sizes with a time out error. Consider using the timeout option: /opt/couchdb/bin/couchup replicate -a --timeout==10000 (with almost infinite timeout here)
  4. +
  5. On very large attachment database sizes (500GB), the couchdb configuration must be changed. We increased almost every related value by factor 10 (timeouts, memory, etc) in /opt/couchdb/etc/default.ini and good success with this.
  6. +
+

Update Thrift

+

For thrift, we need version 0.13. The installation script scripts/install-thrift.shallows for uninstalling old versions:

+

sudo ./install-thrift.sh --uninstall

+

and then install

+

sudo ./install-thrift.sh

+

From OpenJDK 8 to OpenJDK 11

+

First check, what is installed.

+

# sudo apt list openjdk* --installed

+

Then you could check what is available:

+

# sudo apt list openjdk*

+

It should be that OpenJDK 8 is installed and both OpenJDK 8 and 11 are available. Then, remove the OpenJDK 8 and install 11:

+
sudo apt remove openjdk-8-jdk
+sudo apt remove openjdk-8-jre
+sudo apt remove openjdk-8-jdk-headless
+sudo apt remove openjdk-8-jre-headless
+

check if nothing is installed:

+

# sudo apt list openjdk* --installed

+

Then install the openjdk-11-jdk:

+

# sudo apt install openjdk-11-jdk

+

Then the $JAVA_HOME needs to be updated, most likely it is defined in /etc/environment. Please check for your installation how to set the $JAVA_HOME correctly.

+

Updating Liferay

+

Download Liferay from this link

+

https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.3.3%20GA4/liferay-ce-portal-tomcat-7.3.3-ga4-20200701015330959.tar.gz

+

and unpack it, ideally in the /opt directory, so resulting path would look like liferay-ce-portal-7.3.3-ga4.

+

Then, you need to update the $LIFERAY_INSTALL in /etc/environment from LIFERAY_INSTALL=/opt/liferay-portal-7.2.0-ga1/ to LIFERAY_INSTALL=/opt/liferay-ce-portal-7.3.3-ga4.

+

First, you will need to copy the portal-ext.properties from the old liferay folder to the new liferay folder (or new $LIFERAY_HOME):

+

# cp /$old-liferay/portal-ext.properties $LIFERAY_INSTALL/portal-ext.properties

+

Migration of existing database

+

For a version upgrade from Liferay CE 7.2 to Liferay 7.3, migration scripts must be applied, they are located in $LIFERAY_HOME/ tools/portal-tools-db-upgrade-client. From there the following files needs to be adapted:

+
    +
  • app-server.properties: most likely uncomment tomcat, because we re using liferay with tomcat.
  • +
  • portal-upgrade-database.properties: uncomment postgresql section and add database user, default from installation is liferay/liferay, or it is stored in portal-ext.properties right where the JDBC driver is selected. Please note that your portal-ext.properties file in $LIFERAY_INSTALLcan have the following line include-and-override=/etc/sw360/portal-ext.properties. In this case, consider the portal-ext.propertiesat that location.
  • +
  • portal-upgrade-ext.properties: just the liferay home, you can leave it as it is
  • +
+

If everything is done (and the postgresql migration took place), execute:

+

# ./db_upgrade.sh

+

It should return a battery of INFO log level messages end with:

+
Completed Liferay core upgrade process in 96 seconds
+Checking to see if all upgrades have completed... done.
+

More Migration

+

The liferay migration covers apparently only the database, but not the files in the $LIFERAY_HOME/data folder. It would have been nicer, if that would have been covered too. Instead these must be copied manually. In fact, for the migration, it is advised to copy only the /old-liferay/data/document_library to the new location. Something like (different pwd …):

+

# cp -r _attic/liferay-portal-7.2.1-ga2/data/document_library/ liferay-ce-portal-7.3.3-ga4/data/

+

Auto Start

+

For auto start, you need an according init.d entry. It could be a file like /etc/init.d/tomcat. The file could be created if not there already, with the following contents:

+
#!/bin/bash
+
+### BEGIN INIT INFO
+# Provides:        tomcat7
+# Required-Start:  $network
+# Required-Stop:   $network
+# Default-Start:   2 3 4 5
+# Default-Stop:    0 1 6
+# Short-Description: Start/Stop Tomcat server
+### END INIT INFO
+
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+
+start() {
+ su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/startup.sh
+}
+
+stop() {
+ su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/shutdown.sh
+}
+
+case $1 in
+  start|stop) $1;;
+  restart) stop; start;;
+  *) echo "Run as $0 <start|stop|restart>"; exit 1;;
+esac
+

Te user siemagrant is used in the sw360vagrant project. it is the username of the user where the liefray / sw360 server runs under in vagrant. Regardless how the user is named, it is important that liferay runs under an unprivileged user (for security reasons).

+

Adjust Memory

+

When you have downloaded the liferay distribution, Tomcat is likely configured with very basic memory settings. For trying sw360, the standard memory settings are OK. But of course, the memory settings in $LIFERAY_HOME/tomcat-X.0.XX/bin/setenv.sh should be adapted again.

+

Install Prerequisites

+

For old installations, libthrift is not there (which causes an error at container startup), it should be downloaded and deployed:

+
wget https://repo1.maven.org/maven2/org/apache/thrift/libthrift/0.13.0/libthrift-0.13.0.jar
+mv libthrift-0.13.0.jar $LIFEARY_HOME/deploy/
+

The the existing prerequisites needs to be copied from the osgi/modules from the old liferay installation:

+
cp commons-lang-2.4.jar $LIFERAY_HOME/deploy
+cp commons-io-2.6.jar $LIFERAY_HOME/deploy
+cp commons-csv-1.4.jar $LIFERAY_HOME/deploy
+cp commons-collections4-4.1.jar $LIFERAY_HOME/deploy
+cp commons-codec-1.12.jar $LIFERAY_HOME/deploy
+cp commons-logging-1.2.jar $LIFERAY_HOME/deploy
+cp gson-2.8.5.jar $LIFERAY_HOME/deploy
+cp guava-21.0.jar $LIFERAY_HOME/deploy
+cp jackson-annotations-2.9.8.jar $LIFERAY_HOME/deploy
+cp jackson-core-2.9.8.jar $LIFERAY_HOME/deploy
+cp jackson-databind-2.9.8.jar $LIFERAY_HOME/deploy
+

note that with the commit to sw360-13.0.0-M1 you need also another dependency for apache poi:

+
cp commons-compress-1.20.jar $LIFERAY_HOME/deploy
+

Install Couchdb Lucene

+

SW360 uses for searching the contents of the couchdb databases a lucene-based server named couchdb-lucene. The main thing is that it requires pathing for the use in the normal SW3360 setups. The reason for the patch is that the developers presume that couchdb-lucene runs as the only component in the application server, while in the sw360 setup, there is a setup in which couchdb-lucene runs along with other components in the same application container.

+

Start with downloading the couchdb-lucene and rename the archive so the resulting URL path element will be couchdb-lucene:

+

wget https://github.com/rnewson/couchdb-lucene/archive/v2.1.0.tar.gz ./couchdb-lucene.tar.gz

+

Please refer to the script in sw360vagrant how to apply the patch to couchdb-lucene:

+

https://github.com/sw360/sw360vagrant/blob/master/shared/scripts/install-lucene.sh

+

Please note that the patching issue is well known in the project and it is unclear why it is not merged:

+ +

Now, for CouchDB 2.X the hook for integration of a search component has chaned compared to CouchDB 1.X. Accordingly, the old couchdb-lucene component must be replaced with the latest version.

+

Deploy New SW360

+

You will need to checkout new Java-11 based version of the SW360, which is either tagged version 11 or some few commits before that. Then build in the sw360 project root using:

+

mvn clean install -DskipTests

+

This will install new artfacts, such as lib-datahandler in your maven repostiory. Then apply in the same:

+
mvn clean package -P deploy -Dbase.deploy.dir=. -Dliferay.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/deploy/ -Dbackend.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/webapps/ -Drest.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/webapps/ -DskipTests
+

Skipping tests has the reason that usually, the sw360 is tested in the CI and thus, local tests are note necessary, if the code has not been changed locally. Note that the REST API documentation framework is based on building test cases and thus for deploying a version with REST API documentation, tests should be executed:

+
cd rest
+mvn clean package -P deploy -Dbase.deploy.dir=. -Dliferay.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/deploy/ -Dbackend.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/webapps/ -Drest.deploy.dir=/opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/webapps/
+

Final Steps in Liferay

+

Liferay CE 7.3 bring some changes that still require manually applied settings to the running liferay server. Thus, you could start the liferay server or just restart the entire machine. The following two things need to be adaptedin liferay after successful startup in order to get the migration done:

+
    +
  1. +

    The automatic verification of e-mail adresses maybe be needed to be switched off, because it kicks in also for existing users. This can be done in “Control Panerl” -> “Instance Settings” -> “User Authentication” -> ""

    +
  2. +
  3. +

    The JavaScript components jquery and fontawesone (that come with liferay) must be manually enabled now. For this got into “Control Panel” -> “System Settings” -> “Thrid Party”. and from then select the two JavaScript components from the left and enable them accordingly.

    +
  4. +
+

Known Issues

+

Database Availability Right after Update

+

Right after updating, the sw360 will not show up data at all, but sometimes nothing or “portlet unavailable”. The problem is the re-indexing of the DB and the search index which takes a while. You can trigger reindexing in the systems. A lazy way is call all (main) views so the database stumbles accross it and starts the indexing tasks (see job view in the couchdb admin interface of Futon). The sam eis for searches, the first searches will fail and the lucene will do some internal updates. leaving the system working for some time and follow the log will help. Could take 30 minutes.

+

E-Mail Verification Trap

+

Liferay has automatically enabled password verification for all accounts right after migration. Not sure what motivates persons to enable such feature by default right after migration from an instance where it was not there? In case you have attached the system to an external login solution, but your liferay is not configured to send mails, then it is a trap, because you cannot verify the e-mail address and thus, cannot login. You need to disable the external login solution and use the original initial setup user to login (which is not asked for verification by e-mail) to disable this feature (see above).

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/upgrading/index.html b/docs/deployment/upgrading/index.html new file mode 100644 index 0000000..e0cacda --- /dev/null +++ b/docs/deployment/upgrading/index.html @@ -0,0 +1,636 @@ + + + + + + + + + + + + + + + + + + + + + +Upgrade from previous instances | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Upgrade from previous instances

+
SW360 Bare Metal Deployment
+ + +
+ + + + + + + + +
+ + +
+
+ Liferay 7.3 and Java 11 +
+

Upgrading previous sw360 instances to Liferay 7.3.x and Java 11

+
+ + +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deployment/upgrading/index.xml b/docs/deployment/upgrading/index.xml new file mode 100644 index 0000000..70eb8fb --- /dev/null +++ b/docs/deployment/upgrading/index.xml @@ -0,0 +1,277 @@ + + + Eclipse SW360 – Upgrade from previous instances + https://www.eclipse.org/sw360/docs/deployment/upgrading/ + Recent content in Upgrade from previous instances on Eclipse SW360 + Hugo -- gohugo.io + + + + + + + + + + + Docs: Liferay 7.3 and Java 11 + https://www.eclipse.org/sw360/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11/ + + + + <h2 id="introduction">Introduction</h2> +<p>We are covering the update for ubuntu here, because that is our main / agreed base system for running sw360. sw360 may run on a varienty of other linux distributions or OSes such as macosx, but in order to avoid problem we agreed on having a reference OS, which are the ubuntu long term releases.</p> +<p>With the update to Java 11, we upgraded from Ubuntu 16.04 to Ubuntu 18.04, both LTS version. This OS is used for example by the <a href="https://github.com/sw360/sw360vagrant">https://github.com/sw360/sw360vagrant</a> project.</p> +<p>So the update covers the following:</p> +<table> +<thead> +<tr> +<th>orign</th> +<th>target</th> +</tr> +</thead> +<tbody> +<tr> +<td>Ubuntu 16.04 LTS</td> +<td>Ubuntu 18.04 LTS</td> +</tr> +<tr> +<td>CoucbdDB 1.X (comes with Ubuntu)</td> +<td>CouchDB 2.X (not with Ubuntu anymore)</td> +</tr> +<tr> +<td>Postgresql 9.X (comes with Ubuntu)</td> +<td>Postgresql 10.X (comes with Ubuntu)</td> +</tr> +<tr> +<td>OpenJDK 8 (comes with Ubuntu)</td> +<td>openJDK 11 (comes with Ubuntu)</td> +</tr> +<tr> +<td>Apache Thrift 0.11/0.12</td> +<td>Apache Thrift 0.13</td> +</tr> +</tbody> +</table> +<h2 id="overview">Overview</h2> +<p>The upgrade consists of quite some tasks, as an overview:</p> +<ol> +<li>Make a backup</li> +<li>Execute sw360 migration scripts</li> +<li>Linux release upgrade</li> +<li>Java 11</li> +<li>Postgresql</li> +<li>CouchDB 2.X</li> +<li>Thrift to 0.13</li> +<li>Liferay ce 7.3.3</li> +<li>Copy your existing <code>portal-ext.properties</code> to now liferay_install location</li> +<li>copy from old liferay installation the <code>data/document_library</code> to the new liferay</li> +<li>Adjust <code>/etc/ini.d/tomcat</code> with path of new liferay</li> +<li>Adjust <code>$liferay_install</code> variable</li> +<li>add Java prerequisites to OSGi container</li> +<li>Update couchdb-lucene</li> +<li>Deploy new version of sw360</li> +<li>Adjust Liferay</li> +</ol> +<h2 id="initial-steps">Initial steps</h2> +<p>In order to &ldquo;calibrate the system&rdquo; just run the update / upgrade cycle once:</p> +<p><code># sudo apt update</code></p> +<p><code># sudo apt upgrade</code></p> +<h3 id="keeping-more-settings-files">Keeping More Settings Files</h3> +<p><strong>apache.conf:</strong> Keep also the mod security conf files that are asked to update during installation</p> +<p><strong>sshd:</strong> Changes on the ssh / sshd conf files should be kept in case you have setup up dome remote public private key login (usually the case for server installation). Otherwise you re locked out maybe.</p> +<p><strong>Maven:</strong> if you change Maven, for example with your proxy settings, keep it too.</p> +<p>In general, whenever there is functionality you need, consider keeping existing settings files.</p> +<h2 id="ubuntu-release-upgrade">Ubuntu Release Upgrade</h2> +<p>There is maybe the remark to overwrite the current apache configuration. We propose to keep the currently installed apache files.</p> +<p><code># sudo do-release-upgrade</code></p> +<p>Answer &ldquo;yes&rdquo; for the download of packages and also confirm the update of the glibc, of course. Update the <code>system.conf</code>(install maintainer&rsquo;s version), depending on if you actually edited this. Some for <code>sysctl.conf</code>.</p> +<h2 id="migration-of-postgresql">Migration of PostgreSQL</h2> +<p>The existing 9.5 will not be upgraded, instead this message comes: After the release upgrade, you can check again if postgresql is installed:</p> +<p><code>sudo apt list postgre* --installed</code></p> +<p>Postgresql 9.5 should be the only installed. The old postgresql 9.5 must stay in fact, because the migration tool needs to be executing on a running postgresql 9.5 instance. Just having popstgresql 10 and a database only from postgresql 9.5 will not work. You can go ahead install postgresql 10:</p> +<p><code>sudo apt install postgresql-10</code></p> +<p>Then, apply the instruction to update from 9.5 to 10.0 from this page: <a href="https://stackoverflow.com/questions/47029055/how-do-i-upgrade-my-postgresql-9-5-to-postgresql-10-on-ubuntu-16-04">https://stackoverflow.com/questions/47029055/how-do-i-upgrade-my-postgresql-9-5-to-postgresql-10-on-ubuntu-16-04</a></p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span># service postgresql stop +</span></span><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span># pg_dropcluster --stop 10 main +</span></span><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span># pg_upgradecluster -m upgrade 9.5 main +</span></span><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span># pg_dropcluster 9.5 main --stop +</span></span><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span># apt-get autoremove --purge postgresql-9.5 +</span></span><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span># service postgresql start +</span></span></code></pre></div><p>(note that # means you need to be root or execute with sudo)</p> +<h2 id="migration-of-couchdb">Migration of CouchDB</h2> +<p>CouchDB is not part of the Ubuntu package management anymore. Thus, you need to add the Apache CouchDb package repository to install it, first the key for signing:</p> +<p><code>curl -L https://couchdb.apache.org/repo/bintray-pubkey.asc | sudo apt-key add -</code></p> +<p>The add the repo to the sources:</p> +<p><code>echo &quot;deb https://apache.bintray.com/couchdb-deb bionic main&quot; | sudo tee -a /etc/apt/sources.list</code></p> +<p>Then, add its contents to the package database by updating apt:</p> +<p><code>sudo apt-get update -y</code></p> +<p>Ultimately install CouchDB, we tried with 2.1.2 initiall not to make a too far jump from 1.X, later versions may work as well. Note that for upgrading to CouchDB 3.X you would need an upgrade to 2.X first.</p> +<p><code>sudo apt-get install -y couchdb=2.1.2~bionic</code></p> +<p>The installer will ask a couple of questions:</p> +<ol> +<li>Bind address: for CouchDB and SW360 <code>127.0.0.1</code> (localhost) is a good bind address, if you would like to access the server from a remote computer because your sw360 runs as a server in the network, you would need to change accordingly.</li> +<li>Admin user: <strong>Warning</strong> The couchdb migration utility does not support authentication! Please do not enter an admin password, but apply it later. You can set the password for CouchDB in <code>couchdb.properties</code> and place it centrally in <code>/etc/sw360</code></li> +<li>Migration: yes you need to use <code>couchup</code> for migrating the databases</li> +</ol> +<p>In case you added an admin and need to remove it, try:</p> +<p><code>curl -X DELETE http://admin:password@127.0.0.1:5984/_config/admins/admin</code></p> +<p>where the two occurrences <code>admin</code> is the name of the admin user in the URL, whatever the user was called.</p> +<h3 id="migration-of-couchdb-databases">Migration of CouchDB Databases</h3> +<p>As a preparation: the CouchDB migration works by copying the databases, so the file system needs at least as much free space as the CouchDB databases use.</p> +<p>CouchDB offers a migration utility. It is advised that you remove all test databases as they do not seem to work with the migration utility. Important links are:</p> +<ul> +<li><a href="https://docs.couchdb.org/en/2.3.1/install/upgrading.html">https://docs.couchdb.org/en/2.3.1/install/upgrading.html</a></li> +<li><a href="https://github.com/apache/couchdb/pull/483">https://github.com/apache/couchdb/pull/483</a></li> +</ul> +<p>For some reason after installation, the <code>couchup</code>utility is not part of the path, so execute:</p> +<p><code>/opt/couchdb/bin/couchup list</code></p> +<p>It lists all DBs found. The go ahead with:</p> +<p><code>/opt/couchdb/bin/couchup replicate -a</code></p> +<p>It should replicate all databases in <code>/var/lib/couchdb</code>. Please refer to the couchup documentation, for the subsequent steps. A few remarks from our experience:</p> +<ol> +<li>The rebuold of the couchdb does not work for our test databases. Please refer to the documentation how to do this manually if you like.</li> +<li>The couchup utility crashes for large DB sizes with a time out error. Consider using the timeout option: <code>/opt/couchdb/bin/couchup replicate -a --timeout==10000</code> (with almost infinite timeout here)</li> +<li>On very large attachment database sizes (500GB), the couchdb configuration must be changed. We increased almost every related value by factor 10 (timeouts, memory, etc) in <code>/opt/couchdb/etc/default.ini</code> and good success with this.</li> +</ol> +<h2 id="update-thrift">Update Thrift</h2> +<p>For thrift, we need version 0.13. The installation script <code>scripts/install-thrift.sh</code>allows for uninstalling old versions:</p> +<p><code>sudo ./install-thrift.sh --uninstall</code></p> +<p>and then install</p> +<p><code>sudo ./install-thrift.sh</code></p> +<h2 id="from-openjdk-8-to-openjdk-11">From OpenJDK 8 to OpenJDK 11</h2> +<p>First check, what is installed.</p> +<p><code># sudo apt list openjdk* --installed</code></p> +<p>Then you could check what is available:</p> +<p><code># sudo apt list openjdk*</code></p> +<p>It should be that OpenJDK 8 is installed and both OpenJDK 8 and 11 are available. Then, remove the OpenJDK 8 and install 11:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt remove openjdk-8-jdk +</span></span><span style="display:flex;"><span>sudo apt remove openjdk-8-jre +</span></span><span style="display:flex;"><span>sudo apt remove openjdk-8-jdk-headless +</span></span><span style="display:flex;"><span>sudo apt remove openjdk-8-jre-headless +</span></span></code></pre></div><p>check if nothing is installed:</p> +<p><code># sudo apt list openjdk* --installed</code></p> +<p>Then install the openjdk-11-jdk:</p> +<p><code># sudo apt install openjdk-11-jdk</code></p> +<p>Then the <code>$JAVA_HOME</code> needs to be updated, most likely it is defined in <code>/etc/environment</code>. Please check for your installation how to set the <code>$JAVA_HOME</code> correctly.</p> +<h2 id="updating-liferay">Updating Liferay</h2> +<p>Download Liferay from this link</p> +<p><a href="https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.3.3%20GA4/liferay-ce-portal-tomcat-7.3.3-ga4-20200701015330959.tar.gz">https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.3.3%20GA4/liferay-ce-portal-tomcat-7.3.3-ga4-20200701015330959.tar.gz</a></p> +<p>and unpack it, ideally in the <code>/opt</code> directory, so resulting path would look like <code>liferay-ce-portal-7.3.3-ga4</code>.</p> +<p>Then, you need to update the <code>$LIFERAY_INSTALL</code> in <code>/etc/environment</code> from <code>LIFERAY_INSTALL=/opt/liferay-portal-7.2.0-ga1/ </code> to <code>LIFERAY_INSTALL=/opt/liferay-ce-portal-7.3.3-ga4</code>.</p> +<p>First, you will need to copy the <code>portal-ext.properties</code> from the old liferay folder to the new liferay folder (or new <code>$LIFERAY_HOME</code>):</p> +<p><code># cp /$old-liferay/portal-ext.properties $LIFERAY_INSTALL/portal-ext.properties</code></p> +<h3 id="migration-of-existing-database">Migration of existing database</h3> +<p>For a version upgrade from Liferay CE 7.2 to Liferay 7.3, migration scripts must be applied, they are located in <code>$LIFERAY_HOME/ tools/portal-tools-db-upgrade-client</code>. From there the following files needs to be adapted:</p> +<ul> +<li><code>app-server.properties</code>: most likely uncomment tomcat, because we re using liferay with tomcat.</li> +<li><code>portal-upgrade-database.properties</code>: uncomment postgresql section and add database user, default from installation is <code>liferay/liferay</code>, or it is stored in <code>portal-ext.properties</code> right where the JDBC driver is selected. Please note that your <code>portal-ext.properties</code> file in <code>$LIFERAY_INSTALL</code>can have the following line <code>include-and-override=/etc/sw360/portal-ext.properties</code>. In this case, consider the <code>portal-ext.properties</code>at that location.</li> +<li><code>portal-upgrade-ext.properties</code>: just the liferay home, you can leave it as it is</li> +</ul> +<p>If everything is done (and the postgresql migration took place), execute:</p> +<p><code># ./db_upgrade.sh</code></p> +<p>It should return a battery of <code>INFO</code> log level messages end with:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>Completed Liferay core upgrade process in 96 seconds +</span></span><span style="display:flex;"><span>Checking to see if all upgrades have completed... done. +</span></span></code></pre></div><h3 id="more-migration">More Migration</h3> +<p>The liferay migration covers apparently only the database, but not the files in the <code>$LIFERAY_HOME/data</code> folder. It would have been nicer, if that would have been covered too. Instead these must be copied manually. In fact, for the migration, it is advised to copy only the <code>/old-liferay/data/document_library</code> to the new location. Something like (different pwd &hellip;):</p> +<p><code># cp -r _attic/liferay-portal-7.2.1-ga2/data/document_library/ liferay-ce-portal-7.3.3-ga4/data/</code></p> +<h3 id="auto-start">Auto Start</h3> +<p>For auto start, you need an according init.d entry. It could be a file like <code>/etc/init.d/tomcat</code>. The file could be created if not there already, with the following contents:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#099">#!/bin/bash +</span></span></span><span style="display:flex;"><span><span style="color:#099"></span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic">### BEGIN INIT INFO</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Provides: tomcat7</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Required-Start: $network</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Required-Stop: $network</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Default-Start: 2 3 4 5</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Default-Stop: 0 1 6</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Short-Description: Start/Stop Tomcat server</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic">### END INIT INFO</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#033">PATH</span><span style="color:#555">=</span>/sbin:/bin:/usr/sbin:/usr/bin +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>start<span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/startup.sh +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>stop<span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/shutdown.sh +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">case</span> <span style="color:#033">$1</span> in +</span></span><span style="display:flex;"><span> start|stop<span style="color:#555">)</span> <span style="color:#033">$1</span>;; +</span></span><span style="display:flex;"><span> restart<span style="color:#555">)</span> stop; start;; +</span></span><span style="display:flex;"><span> *<span style="color:#555">)</span> <span style="color:#366">echo</span> <span style="color:#c30">&#34;Run as </span><span style="color:#033">$0</span><span style="color:#c30"> &lt;start|stop|restart&gt;&#34;</span>; <span style="color:#366">exit</span> 1;; +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">esac</span> +</span></span></code></pre></div><p>Te user <code>siemagrant</code> is used in the sw360vagrant project. it is the username of the user where the liefray / sw360 server runs under in vagrant. Regardless how the user is named, it is important that liferay runs under an unprivileged user (for security reasons).</p> +<h3 id="adjust-memory">Adjust Memory</h3> +<p>When you have downloaded the liferay distribution, Tomcat is likely configured with very basic memory settings. For trying sw360, the standard memory settings are OK. But of course, the memory settings in <code>$LIFERAY_HOME/tomcat-X.0.XX/bin/setenv.sh</code> should be adapted again.</p> +<h2 id="install-prerequisites">Install Prerequisites</h2> +<p>For old installations, libthrift is not there (which causes an error at container startup), it should be downloaded and deployed:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>wget https://repo1.maven.org/maven2/org/apache/thrift/libthrift/0.13.0/libthrift-0.13.0.jar +</span></span><span style="display:flex;"><span>mv libthrift-0.13.0.jar $LIFEARY_HOME/deploy/ +</span></span></code></pre></div><p>The the existing prerequisites needs to be copied from the <code>osgi/modules</code> from the old liferay installation:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>cp commons-lang-2.4.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp commons-io-2.6.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp commons-csv-1.4.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp commons-collections4-4.1.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp commons-codec-1.12.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp commons-logging-1.2.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp gson-2.8.5.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp guava-21.0.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp jackson-annotations-2.9.8.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp jackson-core-2.9.8.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp jackson-databind-2.9.8.jar $LIFERAY_HOME/deploy +</span></span></code></pre></div><p>note that with the <a href="https://github.com/eclipse/sw360/commit/71348b4fffa6e3e5fd761a3f63590a0a60663827">commit</a> to sw360-13.0.0-M1 you need also another dependency for apache poi:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>cp commons-compress-1.20.jar $LIFERAY_HOME/deploy +</span></span></code></pre></div><h2 id="install-couchdb-lucene">Install Couchdb Lucene</h2> +<p>SW360 uses for searching the contents of the couchdb databases a lucene-based server named couchdb-lucene. The main thing is that it requires pathing for the use in the normal SW3360 setups. The reason for the patch is that the developers presume that couchdb-lucene runs as the only component in the application server, while in the sw360 setup, there is a setup in which couchdb-lucene runs along with other components in the same application container.</p> +<p>Start with downloading the couchdb-lucene and rename the archive so the resulting URL path element will be <code>couchdb-lucene</code>:</p> +<p><code>wget https://github.com/rnewson/couchdb-lucene/archive/v2.1.0.tar.gz ./couchdb-lucene.tar.gz</code></p> +<p>Please refer to the script in sw360vagrant how to apply the patch to couchdb-lucene:</p> +<p><a href="https://github.com/sw360/sw360vagrant/blob/master/shared/scripts/install-lucene.sh">https://github.com/sw360/sw360vagrant/blob/master/shared/scripts/install-lucene.sh</a></p> +<p>Please note that the patching issue is well known in the project and it is unclear why it is not merged:</p> +<ul> +<li><a href="https://github.com/rnewson/couchdb-lucene/issues/161">https://github.com/rnewson/couchdb-lucene/issues/161</a> &ldquo;allow context-root other than &ldquo;/&rdquo; when running in servlet container&rdquo;</li> +<li><a href="https://github.com/rnewson/couchdb-lucene/pull/162">https://github.com/rnewson/couchdb-lucene/pull/162</a></li> +<li><a href="https://github.com/rnewson/couchdb-lucene/pull/152">https://github.com/rnewson/couchdb-lucene/pull/152</a></li> +</ul> +<p>Now, for CouchDB 2.X the hook for integration of a search component has chaned compared to CouchDB 1.X. Accordingly, the old couchdb-lucene component must be replaced with the latest version.</p> +<h2 id="deploy-new-sw360">Deploy New SW360</h2> +<p>You will need to checkout new Java-11 based version of the SW360, which is either tagged version 11 or some few commits before that. Then build in the sw360 project root using:</p> +<p><code>mvn clean install -DskipTests</code></p> +<p>This will install new artfacts, such as lib-datahandler in your maven repostiory. Then apply in the same:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>mvn clean <span style="color:#069;font-weight:bold">package</span> <span style="color:#555">-</span>P deploy <span style="color:#555">-</span>Dbase.deploy.dir=. <span style="color:#555">-</span>Dliferay.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>deploy<span style="color:#555">/</span> <span style="color:#555">-</span>Dbackend.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>Drest.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>DskipTests +</span></span></code></pre></div><p>Skipping tests has the reason that usually, the sw360 is tested in the CI and thus, local tests are note necessary, if the code has not been changed locally. Note that the REST API documentation framework is based on building test cases and thus for deploying a version with REST API documentation, tests should be executed:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>cd rest +</span></span><span style="display:flex;"><span>mvn clean <span style="color:#069;font-weight:bold">package</span> <span style="color:#555">-</span>P deploy <span style="color:#555">-</span>Dbase.deploy.dir=. <span style="color:#555">-</span>Dliferay.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>deploy<span style="color:#555">/</span> <span style="color:#555">-</span>Dbackend.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>Drest.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> +</span></span></code></pre></div><h2 id="final-steps-in-liferay">Final Steps in Liferay</h2> +<p>Liferay CE 7.3 bring some changes that still require manually applied settings to the running liferay server. Thus, you could start the liferay server or just restart the entire machine. The following two things need to be adaptedin liferay after successful startup in order to get the migration done:</p> +<ol> +<li> +<p>The automatic verification of e-mail adresses maybe be needed to be switched off, because it kicks in also for existing users. This can be done in &ldquo;Control Panerl&rdquo; -&gt; &ldquo;Instance Settings&rdquo; -&gt; &ldquo;User Authentication&rdquo; -&gt; &quot;&quot;</p> +</li> +<li> +<p>The JavaScript components jquery and fontawesone (that come with liferay) must be manually enabled now. For this got into &ldquo;Control Panel&rdquo; -&gt; &ldquo;System Settings&rdquo; -&gt; &ldquo;Thrid Party&rdquo;. and from then select the two JavaScript components from the left and enable them accordingly.</p> +</li> +</ol> +<h2 id="known-issues">Known Issues</h2> +<h3 id="database-availability-right-after-update">Database Availability Right after Update</h3> +<p>Right after updating, the sw360 will not show up data at all, but sometimes nothing or &ldquo;portlet unavailable&rdquo;. The problem is the re-indexing of the DB and the search index which takes a while. You can trigger reindexing in the systems. A lazy way is call all (main) views so the database stumbles accross it and starts the indexing tasks (see job view in the couchdb admin interface of Futon). The sam eis for searches, the first searches will fail and the lucene will do some internal updates. leaving the system working for some time and follow the log will help. Could take 30 minutes.</p> +<h3 id="e-mail-verification-trap">E-Mail Verification Trap</h3> +<p>Liferay has automatically enabled password verification for all accounts right after migration. Not sure what motivates persons to enable such feature by default right after migration from an instance where it was not there? In case you have attached the system to an external login solution, but your liferay is not configured to send mails, then it is a trap, because you cannot verify the e-mail address and thus, cannot login. You need to disable the external login solution and use the original initial setup user to login (which is not asked for verification by e-mail) to disable this feature (see above).</p> + + + + + + diff --git a/docs/developers/dev-adding-a-new-portlet-backend/index.html b/docs/developers/dev-adding-a-new-portlet-backend/index.html new file mode 100644 index 0000000..40668a4 --- /dev/null +++ b/docs/developers/dev-adding-a-new-portlet-backend/index.html @@ -0,0 +1,706 @@ + + + + + + + + + + + + + + + + + + + + +How to add a backend portlet to sw360 | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

How to add a backend portlet to sw360

+ + +

This page how to add some operations / service calls on the backend for the portlet writing on the page that covers the front end. Note that this page does not create a new (thrift service), but just explains how to add more operations.

+

This explanation follows bottom up approach where we first add the backend methods and then call them later in the frontend. Quick summary:

+
    +
  1. Add methods to the thrift idl definition
  2. +
  3. Add methods to the data handler interface
  4. +
  5. Add implementation
  6. +
  7. Add tests
  8. +
+

Thrift

+

First we add some methods to the thrift files, components.thrift

+
//new Methods to ensure uniqueness of Identifiers
+map <string, list<string>> getDuplicateComponents();
+map <string, list<string>> getDuplicateReleases();
+

Datahandler

+

then we install lib-datahandler. That way we see which methods we have to implement. +We have chosen to change the interface of the ComponentService. That means we need to implement them in the ComponentHandler.

+
@Override
+public Map<String, List<String>> getDuplicateComponents() throws TException {
+    return handler.getDuplicateComponents();
+}
+
+@Override
+public Map<String, List<String>> getDuplicateReleases() throws TException {
+    return handler.getDuplicateReleases();
+}
+

Implementation

+

The methods there are only a reference to the ComponentDatabaseHandler.java. +In the ComponentHandler we only assert that the input is correct. +Since we implement methods without parameters, there is nothing else for us to do. +In the ComponentDatabaseHandler.java we actually do some work and implement the methods

+
public Map<String, List<String>> getDuplicateComponents() {
+    ListMultimap<String, String> componentIdentifierToComponentId = ArrayListMultimap.create();
+
+    for (Component component : componentRepository.getSummaryForExport()) {
+        componentIdentifierToComponentId.put(SW360Utils.printName(component), component.getId());
+    }
+    return CommonUtils.getIdentifierToListOfDuplicates(componentIdentifierToComponentId);
+}
+
+public Map<String, List<String>> getDuplicateReleases() {
+    ListMultimap<String, String> releaseIdentifierToReleaseId = ArrayListMultimap.create();
+
+    for (Release release : releaseRepository.getReleaseSummary()) {
+        releaseIdentifierToReleaseId.put(SW360Utils.printName(release), release.getId());
+    }
+
+    return CommonUtils.getIdentifierToListOfDuplicates(releaseIdentifierToReleaseId);
+}
+

Tests

+

We then write some tests in ComponentDatabaseHandlerTest.java

+
@Test
+public void testDuplicateComponentIsFound() throws Exception {
+    String originalComponentId = "C3";
+    final Component tmp = handler.getComponent(originalComponentId, user1);
+    tmp.unsetId();
+    tmp.unsetRevision();
+    String newComponentId = handler.addComponent(tmp, email1);
+
+    final Map<String, List<String>> duplicateComponents = handler.getDuplicateComponents();
+
+    assertThat(duplicateComponents.size(), is(1));
+    assertThat(duplicateComponents.get(printName(tmp)), containsInAnyOrder(newComponentId,originalComponentId));
+
+}
+
+
+@Test
+public void testDuplicateReleaseIsFound() throws Exception {
+
+    String originalReleaseId = "R1A";
+    final Release tmp = handler.getRelease(originalReleaseId, user1);
+    tmp.unsetId();
+    tmp.unsetRevision();
+    String newReleaseId = handler.addRelease(tmp, email1);
+
+    final Map<String, List<String>> duplicateReleases = handler.getDuplicateReleases();
+
+    assertThat(duplicateReleases.size(), is(1));
+    assertThat(duplicateReleases.get(printName(tmp)), containsInAnyOrder(newReleaseId,originalReleaseId));
+}
+

Then we install the backend to make our methods available.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-adding-a-new-portlet-frontend/index.html b/docs/developers/dev-adding-a-new-portlet-frontend/index.html new file mode 100644 index 0000000..cdeb903 --- /dev/null +++ b/docs/developers/dev-adding-a-new-portlet-frontend/index.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + + + + + + + + +How to add a frontend portlet to sw360 | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

How to add a frontend portlet to sw360

+ + +

We create a class in

+
sw360/src/frontend/sw360-portlets/src/main/java/com/siemens/sw360/portal/portlets/admin/
+

called

+
DatabaseSanitation.java
+

Here are some code snippets that are important:

+
public class DatabaseSanitation extends Sw360Portlet 
+

the base class Sw360Portlet adds some convenience methods to render the most common return values of functions into messages.

+
@Override
+public void doView(RenderRequest request, RenderResponse response) throws IOException, PortletException {
+    // Proceed with page rendering
+    super.doView(request, response);
+}
+

This method is used to render different pages, a common pattern would be to have if/else tree like

+
//! VIEW and helpers
+@Override
+public void doView(RenderRequest request, RenderResponse response) throws IOException, PortletException {
+    String pageName = request.getParameter(PAGENAME);
+    if (PAGENAME_EDIT.equals(pageName)) {
+        prepareVendorEdit(request);
+        include("/html/vendors/edit.jsp", request, response);
+    } else {
+        prepareStandardView(request);
+        super.doView(request, response);
+    }
+}
+

but since we only have one page this is all we need. The jsp that is rendered by super.doView is set in

+
sw360/src/frontend/sw360-portlets/src/main/webapp/WEB-INF/portlet.xml
+

but more on that later.

+

The next method in DatabaseSanitation handles resource requests, which are responses to AJAX calls:

+
@Override
+public void serveResource(ResourceRequest request, ResourceResponse response) throws IOException, PortletException {
+    String action = request.getParameter(PortalConstants.ACTION);
+    if (PortalConstants.DUPLICATES.equals(action)) {
+              serveDuplicates(request, response);
+    }
+}
+

similar to the PAGENAME tree, here we have an ACTION if/else block. We only have one action, so this is simple.

+

Let’s have a look at

+
private void serveDuplicates(ResourceRequest request, ResourceResponse response) throws IOException, PortletException {
+
+    Map<String, List<String>> duplicateComponents=null;
+    Map<String, List<String>> duplicateReleases=null;
+    try {
+        final ComponentService.Iface componentClient = thriftClients.makeComponentClient();
+        duplicateComponents = componentClient.getDuplicateComponents();
+        duplicateReleases = componentClient.getDuplicateReleases();
+    } catch (TException e) {
+        log.error("Error in component client", e);
+    }
+
+    if(duplicateComponents== null || duplicateReleases==null) {
+        renderRequestStatus(request,response, RequestStatus.FAILURE);
+    } else if(duplicateComponents.isEmpty()  && duplicateReleases.isEmpty()) {
+        renderRequestStatus(request,response, RequestStatus.SUCCESS);
+    } else {
+        request.setAttribute(PortalConstants.DUPLICATE_RELEASES, duplicateReleases);
+        request.setAttribute(PortalConstants.DUPLICATE_COMPONENTS, duplicateComponents);
+        include("/html/admin/databaseSanitation/duplicatesAjax.jsp", request, response, PortletRequest.RESOURCE_PHASE);
+    }
+}
+

The member variable thriftClients is inherited from the Sw360Portlet. This is how we talk to the backend. +We call the methods that we wrote in the first part of the tutorial. +The error handling is reported with renderRequestStatus, also from Sw360Portlet. +When we have findings then we report them by rendering a jsp in the RESOURCE_PHASE. +This is then some html that our AJAX function gets as data.

+

Then we have to register the portlets in some xml files:

+
sw360/src/frontend/sw360-portlets/src/main/webapp/WEB-INF/liferay-display.xml
+
...
+<portlet id="databaseSanitation"/>
+
sw360/src/frontend/sw360-portlets/src/main/webapp/WEB-INF/liferay-portlet.xml
+
...
+<portlet>
+    <portlet-name>databaseSanitation</portlet-name>
+    <icon>/icon.png</icon>
+    <instanceable>false</instanceable>
+    <header-portlet-css>/css/main.css</header-portlet-css>
+    <header-portlet-javascript>/js/main.js</header-portlet-javascript>
+    <header-portlet-javascript>/js/external/jquery-1.11.1.min.js</header-portlet-javascript>
+</portlet>
+

Note that here it is important to include things like jquery in this way so that on multiple portlet pages there are no namespace conflicts.

+
sw360/src/frontend/sw360-portlets/src/main/webapp/WEB-INF/portlet.xml
+
...
+<portlet>
+    <portlet-name>databaseSanitation</portlet-name>
+    <display-name>databaseSanitation</display-name>
+    <portlet-class>
+        com.siemens.sw360.portal.portlets.admin.DatabaseSanitation
+    </portlet-class>
+    <init-param>
+        <name>view-template</name>
+        <value>/html/admin/databaseSanitation/view.jsp</value>
+    </init-param>
+    <expiration-cache>0</expiration-cache>
+    <supports>
+        <mime-type>text/html</mime-type>
+        <portlet-mode>view</portlet-mode>
+    </supports>
+    <portlet-info>
+        <title>databaseSanitation</title>
+        <short-title>databaseSanitation</short-title>
+        <keywords/>
+    </portlet-info>
+    <security-role-ref>
+        <role-name>administrator</role-name>
+    </security-role-ref>
+</portlet>
+

After these changes we compile the frontend and then we have to add new page to the Layout and add it to the lar file. +We sign in as admin, +go to

+
Admin -> Site administration 
+-> Private Pages
+

To add the portlet to the page, we first change the theme of Private Pages to Classic, then select Add Page. We can drag and drop it under the Admin Page. +Then we select the Private Pages under My Sites. +We can then go to the page we have just created. +On the left side there is a plus sign, which opens a side menu with the available portlets that we can add to our page. +Under SW360 we find the portlet DatabaseSanitation and we click add. +Then we can change the option (The cog symbol on the right) Look and Feel to Show Borders -> No and we save that. +Then we change the theme of Private Pages back to SW360-Theme.

+

Now we can change the theme back and export a new lar file as described else where.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-adding-new-fields-to-existing-classes/index.html b/docs/developers/dev-adding-new-fields-to-existing-classes/index.html new file mode 100644 index 0000000..fc836c6 --- /dev/null +++ b/docs/developers/dev-adding-new-fields-to-existing-classes/index.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + +How to add fields to an existing class | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

How to add fields to an existing class

+ + +

The license portlet is different from the other portlets as there is no Details/Edit page for each element. There is only a combined edit/view page. +We will add the license text to licenses in the thrift file:

+
13: optional string text;
+

To update the text we write a liferay Action in the LicensesPortlet:

+
    @UsedAsLiferayAction
+    public void changeText(ActionRequest request, ActionResponse response) throws PortletException, IOException {
+        String licenseId = request.getParameter(LICENSE_ID);
+        String text = request.getParameter(License._Fields.TEXT.name());
+
+        if(!Strings.isNullOrEmpty(licenseId)) {
+
+            try {
+                User user = UserCacheHolder.getUserFromRequest(request);
+                LicenseService.Iface client = thriftClients.makeLicenseClient();
+                final License license = client.getFromID(licenseId);
+
+                license.setText(CommonUtils.nullToEmptyString(text));
+                final RequestStatus requestStatus = client.updateLicense(license, user);
+
+                renderRequestStatus(request,response,requestStatus);
+            } catch (TException e) {
+                log.error("Error updating license", e);
+            }
+        }
+
+        response.setRenderParameter(LICENSE_ID, licenseId);
+        response.setRenderParameter(PAGENAME, PAGENAME_DETAIL);
+        response.setRenderParameter(SELECTED_TAB, "LicenseText");
+    }
+

To integrate it in the jsp we make the according changes, important to note is the ActionUrl that we define:

+
<portlet:actionURL var="changeLicenseTextURL" name="changeText">
+    <portlet:param name="<%=PortalConstants.LICENSE_ID%>" value="${licenseDetail.id}" />
+</portlet:actionURL>
+

A good practice to name fields in jsps is to use the thrift field names:

+
  <textarea name="<portlet:namespace/><%=License._Fields.TEXT%>" rows="5"  style="width: 100%" id="<portlet:namespace/><%=License._Fields.TEXT%>"
+            placeholder="Enter the License-Text here..."
+          >${licenseDetail.text}</textarea>
+
+ + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-branches/index.html b/docs/developers/dev-branches/index.html new file mode 100644 index 0000000..5fce2bf --- /dev/null +++ b/docs/developers/dev-branches/index.html @@ -0,0 +1,626 @@ + + + + + + + + + + + + + + + + + + + + +SW360 Development Branches | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

SW360 Development Branches

+
Helps to see who is responsible and to which issue the Pull Request corresponds
+ +

Branches structure

+

<github-nickname>/<issue>/<description>

+

Examples:

+
    +
  • maierthomas/#1/fix-dowload-bundle
  • +
  • maierthomas/#3/sw360portal-specific-links
  • +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-database-migration-using-costco/index.html b/docs/developers/dev-database-migration-using-costco/index.html new file mode 100644 index 0000000..9a85403 --- /dev/null +++ b/docs/developers/dev-database-migration-using-costco/index.html @@ -0,0 +1,726 @@ + + + + + + + + + + + + + + + + + + + + +Database migration using Costco | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Database migration using Costco

+ + +

Praeamble

+

Please note that database migrations are done now in python scripts at

+
+

https://github.com/eclipse/sw360/tree/master/scripts/migrations

+
+

keeping the following page because Costco might be useful for development / testing / quick adaptations.

+

Problem

+

The main problem with changing field names in thrift is that existing documents in the couchdb need adjustments. Unfortunately, the futon interface of the couchdb does not offer bulk edits. As a consequence, looking into every document is tedious, for more than 100 documents, maybe unfeasible.

+

Solution

+

Use costco, an open source project that

+
    +
  • is a couchapp (right, this implies that you install the couchapp environment)
  • +
  • offers a Web interface as sub path of the couchdb database
  • +
  • allows to iterate through the documents of a database and then apply modifications on a particular document
  • +
  • allows to perform modifications on documents using Java script
  • +
+

More information

+ +

Note that costco does not allow to perform operations involving several documents at once, for example, setting values in one document that results from querying from several other documents. Costco is perfect for corrections on the couchdb document ‘schema’ (not in the classic sense as there is no schema in couchdb).

+

Troubleshooting

+

If you try to install costco, you try to install couchapp mst likely. However, it might be that some python packages are missing which results in a ’not-so-obvious’ python error during install of couchapp. The following line could be th dependencies that you might need:

+
sudo apt-get install python-dev libxml2-dev libxslt-dev
+

Cheat Sheet: Installing costco inside an sw360vagrant deployment

+

OK, if you read until here, to make it easy for you just the few lines to have executed to install costco when youi have a machine that is deployed with our vagrant:

+
$ sudo apt-get install python-dev libxml2-dev libxslt-dev
+$ sudo pip install couchapp
+$ git clone http://github.com/harthur/costco.git
+$ cd costco
+$ couchapp push . http://localhost:5984/sw360db
+

Examples in sw360

+

The following examples show some costco code from the use with sw360.

+

Renaming a key

+

In order to rename a field’s key, the following code might be helpful. In the following example, the field’s key developement into development (correcting a typo in the datamodel).

+
function(doc) {
+   if(doc.type == 'todo') {
+     doc.development = doc.developement;
+     delete doc.developement;
+    }
+  return doc;
+}
+

Renaming a key in a subdocument

+

Similar thing as above, rename a key from comment to createdcomment, but this time inside a nested list of documents.

+
function(doc) {
+  if (doc.type == 'release') {
+     for (var f = 0, len = doc.attachments.length; f < len; f +=1 ) {
+       doc.attachments[f].createdComment = doc.attachments[f].comment;
+       delete  doc.attachments[f].comment;
+     }
+  }
+  return doc;
+}
+

More JavaScript Examples with CouchDB

+

In addition to costco, also the couchdb map-reduce functions can help to track down issues in the data sets.

+

The following example searched for attachments of type SOURCE at releases, which do not have the createdBy set:

+
function(doc) { 
+  if ((doc.type == 'release') 
+       && (doc.attachments)) {
+    for (var attachment in doc.attachments) {
+      if (!doc.attachments[attachment].createdBy) {
+        if (doc.attachments[attachment].attachmentType== 'SOURCE') {
+          emit(doc._id, doc.attachments[attachment].filename);
+        }
+      }
+    }
+  }
+}
+

The following example looks into date fields, in this case createdOn, and checks if it uses dots (for changing them into dashes).

+
function(doc) {
+  if(
+      (doc.type == 'release')
+      && (doc.createdOn.indexOf('.') !== -1)
+    )
+  {
+      emit(doc.name, doc)
+  }
+}
+
+ + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-dod-and-style/index.html b/docs/developers/dev-dod-and-style/index.html new file mode 100644 index 0000000..a79e04c --- /dev/null +++ b/docs/developers/dev-dod-and-style/index.html @@ -0,0 +1,718 @@ + + + + + + + + + + + + + + + + + + + + +Definition of Done | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Definition of Done

+
The definition of done helps to set a common understanding for solving a ticket.
+ +

Policy

+
    +
  • Review points should involve one person from another angle (not just the person you were sitting together with anyways)
  • +
  • Limit items in review to 5, try to coordinate
  • +
  • Using Github assignments to issues or pull requests
  • +
  • Open review items require conversation
  • +
+

Definition of Done

+
    +
  • +

    File headers in file OK

    +
      +
    • EPL-2.0 license header
    • +
    • Or, if the file is too small, configuration file: license note (see code style)
    • +
    • Copyright and author
    • +
    +
  • +
  • +

    Create Branches for sw360

    +
      +
    • Please use conventional branch names for sw360 (Dev-Branches)
    • +
    +
  • +
  • +

    Avoid (serious) compiler warnings

    +
      +
    • Squash your commits into one or more logical units of work. No dozens of hourly/daily commits in your pull request, please
    • +
    • Rebase onto current master so that a fast forward merge is possible
    • +
    • That means that merge to master is prepared
    • +
    +
  • +
  • +

    use conventional change log for commit messages (Dev-Semantic-Commits)
    For more information please go to https://conventionalcommits.org/

    +
  • +
  • +

    No breaking test

    +
      +
    • Unit testing as it is already present
    • +
    • You have more - use them!
    • +
    +
  • +
  • +

    New test

    +
      +
    • For new / added functionality
    • +
    +
  • +
  • +

    Documentation

    +
      +
    • in the Githuib Wiki-Section, if you have done something new
    • +
    • At least a technical note for newly added functionality
    • +
    +
  • +
  • +

    Commit style

    +
      +
    • try to squash commits. In the ideal case, a feature is contained in one commit.
    • +
    • try to use conventional changelog for commit messages. (Dev-Semantic-Commits)
    • +
    +
  • +
+

Review

+

Review basically checks for the D-o-D items, in particular

+
    +
  • Code style, not really formatting, but issues like style attributes in HTML tags or exception handling useful
  • +
  • Design / architecture issues
  • +
  • Community contribution suitability
  • +
  • Issue coverage (does it actually solve the problem?)
  • +
  • Add to commit message of merge commit explicitly:
  • +
+
review-by:email@domain.com
+

and

+
tested-by:email@domain.com
+

Licensing and File Header

+

All files contributed require headers - this will ensure the license and copyright clearing at the end. Also, all contributions must have the same license as the original source.

+

If a file has relevant functionality, note that we should move to Eclipse 2.0

+
/*
+ * Copyright COPYRIGHT HOLDER, 2017.
+ * Copyright NEXT COPYRIGHT HOLDER, 2017.
+ * Part of the SW360 Portal Project.
+ *
+ * SPDX-License-Identifier: EPL-1.0
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+

(please adapt comment characters usage)

+

For small files such as property files, configuration files or standard XML files:

+
# Copyright <COPYRIGHT_HOLDER>, <YEAR>. Part of the SW360 Portal Project.
+#
+# All rights reserved. This configuration file is provided to you under the
+# terms and conditions of the Eclipse Distribution License v1.0 which
+# accompanies this distribution, and is available at
+# http://www.eclipse.org/org/documents/edl-v10.php
+

Code style

+

Just use the standard Java formatting rules of your IDE and do not reformat code from others, because you like to correct formatting of other’s code.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-external-documents-with-couchdb/index.html b/docs/developers/dev-external-documents-with-couchdb/index.html new file mode 100644 index 0000000..a4b4769 --- /dev/null +++ b/docs/developers/dev-external-documents-with-couchdb/index.html @@ -0,0 +1,945 @@ + + + + + + + + + + + + + + + + + + + + +CouchDB External Documents | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

CouchDB External Documents

+ + +

Motivation

+

In some cases inline documents are not sufficient for storing extended information to a document. This is especially the case if these information might be relevant from outside as well. +Projects, components and releases contain attachments. The metadata of these attachments are stored as inline documents inside its parent document (which is the project, component or release). +However these attachments may be used by other documents as well, e.g. license info files which are attached to releases are used by projects to generate the overall license information for that project. +In such cases an external document might be the better model. For example the attachment usage can be stored along the metadata without touching the owner document on update.

+

Advantages of external documents

+
    +
  • single documents with a clear separation to other documents
  • +
  • easy identification
  • +
  • might be loaded and updated standalone
  • +
+

Advantages of internal documents

+
    +
  • Very fast loading along with the owner
  • +
  • Easy handling since only the owner must be loaded or updated
  • +
+

In any case it is highly dependent on the use case whether external documents are to be favored over internal documents.

+

Possible implementations for linked documents

+

Special ResponseHandler with special views from CouchDB

+ + + + + + + + + + + + + + + +
Easy to use?Performance?Effort to use in existing code
:star::star: Middle, special views have to be created, fields of data objects has to be annotated.:star::star::star: Very good, fetching of multiple documents with a single request.:star: High, since existing code has to be changed
+

Couch-DB theory

+

At the time of writing, support of external (or linked) documents in Couch-DB is limited. Consider the following documents:

+
project = {
+   _id: "p1",
+   type: "project",
+   name: "Testproject",
+   attachments: [
+       { _id: "a1" },
+       { _id: "z2" }
+   ]
+}
+attachment1 = {
+    _id: "a1",
+    type: "attachment",
+    name: "SourceFile",
+    sha1: "abc1234"
+}
+attachment2 = {
+    _id: "a2",
+    type: "attachment",
+    name: "LicenseFile",
+    sha1: "fed9876"
+}
+

Unfortunately there is no way to get the project document with the attachments directly included. With the correct view you are able to retrieve all these documents in a single request:

+
function(doc) {
+    if(doc.type === "attachment") {
+        emit(doc._id, null);
+        for(var in in doc.attachments) {
+            emit(doc._id, { _id: doc.attachments[i]._id });
+        }
+    }
+}
+

You might see the trick: the project document as well as the attachment documents are indexed with the id of the project. This way you get all three documents when querying the view with the id of the project:

+
{
+   "total_rows":5,
+   "offset":0,
+   "rows":[{
+         "id":"p1",
+         "key": "p1",
+         "doc":{
+            "_id":"p1",
+            "attachments":[
+               "a1", "a2"
+            ],
+            "name":"Testproject",
+            ...
+         },
+         ...
+      }, {
+         "id":"p1",
+         "doc":{
+            "_id":"a1",
+            name: "SourceFile",
+            ...
+         },
+         ...
+      }, {
+         "id":"p1",
+         "key": "p1",
+         "value":null,
+         "doc":{
+            "_id":"a2",
+            name: "LicenseFile",
+            ...
+         },
+         ...
+      }
+    ]
+}
+

Note is will only work if you query the view with include_docs set to true. +Note include_docs will only work at the top level of a value. In other words it will only recognize the following to situations:

+ +

Implementation with Ektorp

+

https://github.com/eclipse/sw360/pull/596 show an implementation to transparently read such results from Couch-DB. It consists of:

+
    +
  • new methods in the database connector which are aware of loading linked documents
  • +
  • a response handler used for parsing the results when requesting linked documents
  • +
  • two annotation classes to mark fields which contain ids for linked documents +After the branch was merged, the new feature can be used in only three steps. You need:
  • +
+
    +
  1. A view that loads the “main” documents along with there linked documents
  2. +
  3. A special method in your database handler / database repository which calls the new method from the connector
  4. +
  5. A mixin for your data object which annotates the fields which contain ids to linked documents
  6. +
+

Notes for 1.

+

Have a look at mapping function above in the theory section. Of course you may add more than one type of linked documents, e.g. not only attachments but releases as well. +You may also emit whole objects instead of ids only. This way Couch-DB does not have to lookup each entry. However including ids over objects is an own topic.

+

Notes for 2.

+

You should write methods in your repository as well as in your database handler that uses the new methods from the database connector.

+

Notes for 3.

+

Be sure that the used object mapper in your database handler is aware of the mixin. Of course you can annotate more than one field. All annotated fields will be respected on loading. However, if the view does not contain an object that should be resolved, it will be replaced by null. The LinkedDocuments-annotation even allows you to name a different destination field for the resolved objects for easier integration into the existing code.

+

Usage with Ektorp

+ + + + + + + + + + + + + + + +
Easy to use?Performance?Effort to use in existing code
:no_entry: does not work:no_entry::no_entry:
+

Since SW360 is using Ektorp as Objectmapper, a response like above is not suitable. Ektorp is just not able to parse the above response correctly. +However Ektorp has a linking feature as well: You may annotate fields with the @DocumentReference-Annotation to tell Ektorp to store the content within external documents. This only works with fields of type Set at the moment of writing. Since SW360 data objects are generated using Thrift, directly annotating the field is not possible. Due to the mixin feature of Ektorp this is not a big issue. Unfortunately making the @DocumentReference-annotation to work was not possible with a reasonable effort.

+

Internally Ektorp is also using special views for getting linked documents to work. A quick look into the source codes suggests that this feature is implemented using special serializers which would lead to additional requests on loading and storing as well. Therefore the same performance issues might be come across if the annotation would work.

+

Own serializer/deserzialer

+ + + + + + + + + + + + + + + +
Easy to use?Performance?Effort to use in existing code
:star::star::star: Quite easy, just some Jackson configuration necessary:star::star: Good, but every type of linked objects needs an additional request:star::star::star: Low, existing code does not have to be changed
+

This method works just like the Ektorp way. In addition a slow transition from internal to external documents is possible, since the custom serialization methods will handle both cases directly. Any embedded documents will be externalized on first update of the owner object. +The following classes are needed:

+
    +
  1. Repository for the new external documents
  2. +
  3. DatabaseHandler for the new external documents
  4. +
  5. Mixin-Class to add annotations to the field with external documents
  6. +
  7. A new mapper factory to properly configure the custom serializer
  8. +
  9. Custom serializers/deserializer
  10. +
+

Example for externalizing attachments

+
Mixin-Class
+

This will configure Ektorp to use a special class for this field. We use a special serializer for the field instead of for the type (in this case Attachment), so we can do serialization/deserialization for all attachments at once. If we would use a special serializer, every

+
public abstract class SplitAttachmentsMixin extends DatabaseMixIn {
+    @JsonSerialize(using = AttachmentSetSerializer.class)
+    @JsonDeserialize(using = AttachmentSetDeserializer.class)
+    public abstract void setAttachments(Set<Attachment> attachments);
+}
+
Mapper factory
+
public class SplitAttachmentsMapperFactory extends MapperFactory {
+
+    private final AttachmentHandlerInstantiator handlerInitiator;
+
+    public SplitAttachmentsMapperFactory(Supplier<HttpClient> httpClient, String dbName) throws MalformedURLException {
+        handlerInitiator = new AttachmentHandlerInstantiator(httpClient, dbName);
+    }
+
+    @Override
+    public ObjectMapper createObjectMapper() {
+        ObjectMapper objectMapper = super.createObjectMapper();
+
+        objectMapper.addMixInAnnotations(Project.class, SplitAttachmentsMixin.class);
+        objectMapper.setHandlerInstantiator(handlerInitiator);
+
+        return objectMapper;
+    }
+
+    private static class AttachmentHandlerInstantiator extends HandlerInstantiator {
+        private final AttachmentSetSerializer attachmentSetSerializer;
+        private final AttachmentSetDeserializer attachmentSetDeserializer;
+
+        public AttachmentHandlerInstantiator(Supplier<HttpClient> httpClient, String dbName) throws MalformedURLException {
+            attachmentSetSerializer = new AttachmentSetSerializer(httpClient, dbName);
+            attachmentSetDeserializer = new AttachmentSetDeserializer(httpClient, dbName);
+        }
+
+        @Override
+        public JsonDeserializer<?> deserializerInstance(DeserializationConfig config, Annotated annotated, Class<?> deserClass) {
+            if (deserClass.isInstance(attachmentSetDeserializer)) {
+                return attachmentSetDeserializer;
+            }
+            return null;
+        }
+        ...
+    }
+
+}
+
Serializer
+
public class AttachmentSetSerializer extends JsonSerializer<Set<Attachment>> {
+
+    private final AttachmentDatabaseHandler handler;
+
+    public AttachmentSetSerializer(Supplier<HttpClient> httpClient, String dbName) throws MalformedURLException {
+        this.handler = new AttachmentDatabaseHandler(httpClient, dbName);
+    }
+
+    @Override
+    public void serialize(Set<Attachment> attachments, JsonGenerator jsonGenerator, SerializerProvider provider)
+            throws IOException, JsonProcessingException {
+
+        try {
+            List<DocumentOperationResult> results = handler.bulkCreateOrUpdateAttachments(attachments);
+            if (!results.isEmpty()) {
+                throw new IOException("Cannot create or update attachments. Some failed: " + results);
+            }
+        } catch (SW360Exception exception) {
+            throw new IOException("Cannot create or update attachments.", exception);
+        }
+
+        jsonGenerator.writeStartArray();
+        for (Attachment attachment : attachments) {
+            jsonGenerator.writeStartObject();
+            jsonGenerator.writeStringField("_id", attachment.getId());
+            jsonGenerator.writeEndObject();
+        }
+        jsonGenerator.writeEndArray();
+    }
+}
+

Deserializer

+
public class AttachmentSetDeserializer extends JsonDeserializer<Set<Attachment>> {
+
+    private final AttachmentDatabaseHandler handler;
+
+    public AttachmentSetDeserializer(Supplier<HttpClient> httpClient, String dbName) throws MalformedURLException {
+        this.handler = new AttachmentDatabaseHandler(httpClient, dbName);
+    }
+
+    @Override
+    public Set<Attachment> deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
+        Set<Attachment> attachments = Sets.newHashSet();
+
+        if (!jsonParser.isExpectedStartArrayToken()) {
+            throw new IllegalStateException("Expected array token but found: " + jsonParser.getCurrentToken().asString());
+        }
+
+        Set<String> attachmentIds = Sets.newHashSet();
+        JsonToken token = jsonParser.nextToken();
+        while (!JsonToken.END_ARRAY.equals(token)) {
+            switch (token) {
+            case START_OBJECT:
+                Attachment attachment = jsonParser.readValueAs(Attachment.class);
+                if (attachment.isSetId() && !attachment.isSetRevision()) {
+                    attachmentIds.add(attachment.getId());
+                } else {
+                    attachments.add(attachment);
+                }
+                break;
+
+            default:
+                throw new IllegalStateException(
+                        "Unexpected token. Expected object or string but found: " + jsonParser.getCurrentToken().asString());
+            }
+
+            token = jsonParser.nextToken();
+        }
+
+        if (!attachmentIds.isEmpty()) {
+            try {
+                attachments.addAll(handler.retrieveAttachments(attachmentIds));
+            } catch (SW360Exception exception) {
+                throw new IOException("Cannot load attachments (" + attachmentIds + ")", exception);
+            }
+        }
+
+        return attachments;
+    }
+
+}
+
+ + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-filtering-in-portlets/index.html b/docs/developers/dev-filtering-in-portlets/index.html new file mode 100644 index 0000000..291ffbe --- /dev/null +++ b/docs/developers/dev-filtering-in-portlets/index.html @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + + + + +Filtering in Portlets | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Filtering in Portlets

+ + +

For the filters that are shown for components and listings, there are some options:

+
    +
  1. +

    The Keyword search works directly on the table shown on the main right area. For example in the components portlet, this is in components/view.jsp.

    +
  2. +
  3. +

    The filters actually result in a new search request, when hitting apply filters button. The project portlet reads the fields and creates a map. Then, ProjectPortlet calls the thrift service refineSearch(), which is handled in ProjectHandler. This method takes the map and the user as input. The search service has a server-side JavaScript function (LuceneSearchView) defined for this particular filter in ProjectSearchHandler.java. This is called with the LuceneAwareDatabaseConnector.java. After filtering, the visibility constraints for the requesting user are applied.

    +
  4. +
  5. +

    Then for each release table, there is a search field in the upper right corner. This again works on the data of the Release summary object and then filters what is on the client (web browser).

    +
  6. +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-fossology-integration/index.html b/docs/developers/dev-fossology-integration/index.html new file mode 100644 index 0000000..876e490 --- /dev/null +++ b/docs/developers/dev-fossology-integration/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + + + + + + + + +Fossology Integration | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Fossology Integration

+
Basis of communication between SW360 and FOSSology
+ +

Basic communication with the FOSSology server is done over an SSH connection: the fossology service of SW360 executes remote commands on the FOSSology server.

+

The commands that are executed are the bash scripts found inside src-fossology/src/main/resources/scripts/, they are copied into the home directory of the ssh user (either manually or through the admin portlet). +See Setup of connection with Fossology for configuration details.

+
\- src-fossology/src/main/resources/
+ \- scripts/
+  |- duplicateUpload
+  |- folderManager
+  |- getStatusOfUpload
+  |- uploadFromSW360
+  \- utilsSW360
+

These scripts utilize the standard command line tools to interact natively with FOSSology (these are the tools found in the src/cli folder of FOSSology, such as cp2foss fossjobs fossupload_status fo_usergroup fo_chmod fo_folder ...).

+
    +
  • utilsSW360 contains common functions used by the other scripts and some FOSSology configuration such as the user/password pair used to run the cli utils and the UNIX group of the FOSSology processes
  • +
  • folderManager (uses FO:fo_folder): get information about the folder structure of FOSSology to allow sharing of uploads between groups
  • +
  • getStatusOfUpload (uses FO:fossupload_status): to get the clearing status given an uploadId and a group
  • +
  • uploadFromSW360 (uses FO:cp2foss fossjobs): to create a new upload from the standard input and schedule scanners
  • +
  • duplicateUpload (uses FO:fo_chmod SW:folderManager): to make a previously uploaded file available for another group
  • +
+

Java libraries and settings

+

The java code utilizes the package com.jcraft.jsch to connect to the SSH server. It is set to strictly check the fingerprint of the remote server against the accepted which are stored in couchDB.

+

Conventions

+

the sw360 user in FOSSology (the actual name is configured in utilsSW360) must be a member of every group to which it should be able to send Releases to be cleared. +File uploaded from SW360 are placed inside a folder with the same name as the group and permission will be set at the group level (default of cp2foss).

+

Datamodel and thrift service

+
    +
  • +

    each Release object in SW360 can have only one attachment of type SOURCE.

    +
  • +
  • +

    when a Release is sent for the first time to FOSSology through the Thrift method sendToFossology(1: string releaseId, 2: string clearingTeam ) its SOURCE attachement is sent as stdin to the script uploadFromSW360.

    +

    The field map<string, FossologyStatus> clearingTeamToFossologyStatus is then updated to contain the corresponding entry for the chosen Clearing Team (aka. the name of the FOSSology group which will receives the upload for clearing).

    +
  • +
  • +

    when the same Release is sent again for another team a new link in the corresponding group folder is created and the old upload is made available for the new group (as in giving permission using FO:fo_chmod).

    +

    At the moment this gives access only to the files, not to the relative clearing decision. +In order to make the clearing decisions available a reuser needs to be scheduled from the Jobs menu. [ it could be possible to schedule the job from SW360: its user is member of all the groups; but it is not currently implemented since there is no cli interface for reuser yet ]

    +
  • +
  • +

    when the current status is requested using the Thrift method Release getStatusInFossology(1: string releaseId, 2: string clearingTeam ) the newest status is fetched from FOSSology and it is stored in the map for the relative clearingTeam

    +
  • +
+

Notes

+
    +
  • Releases have a ClearingState field, but this is ignored by the Thrift service and used only in the SW360 user interface.
  • +
  • Projects link to Releases and the summary of their FOSSology status can be monitored. This is also ignored by the FOSSology Thrift service and handled by the Component service: the FOSSology service just updates the status of the Release objects.
  • +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-liferay-friendly-url/index.html b/docs/developers/dev-liferay-friendly-url/index.html new file mode 100644 index 0000000..06fcffb --- /dev/null +++ b/docs/developers/dev-liferay-friendly-url/index.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + + + + + + + + +Liferay Friendly | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Liferay Friendly

+
Basis of communication between SW360 and FOSSology
+ +

The normal generated portlet URLs containing a set of internal Liferay request parameters.
+These long URLs of links or forms are mostly not readable and its not easy to share it somewhere else.

+

General Liferay portlet URL:

+
http://localhost:8080/web/guest/examples?p_p_id=example_WAR_ExamplePortlet&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=1&_example_WAR_ExamplePortlet_javax.portlet.action=new
+

Explanation of the Liferay request parameters:
+p_p_id: The portlet ID (example_WAR_ExamplePortlet)
+p_p_state: Liferay windows pages state - 1 (normal) 2 (maximize) 3 (minimize)
+p_p_mode: Mode of the portlet look like - (view) (edit) (help)
+p_p_lifecycle: This is life cycle of portlet - 0 (render) 1 (action) 2 (server)
+p_p_col_id: The reference ID of the column in Liferay template
+p_p_col_pos: Specifiy the column position if the the layout having more than one columns
+p_p_col_count: Shows the no of columns in the current layout

+

Friendly URL Mapper configuration

+

Liferay provides a mechanism to shorten the generated URLs by using the Friendly URL Mapper feature.

+How to configure the friendly URL Mapper in Liferay?

+Configuration of URL routes in XML files

+

CREATE example-friendly-url-routes.xml

+
<?xml version="1.0"?>
+<!DOCTYPE routes PUBLIC "-//Liferay//DTD Friendly URL Routes 6.2.2//EN"
+"http://www.liferay.com/dtd/liferay-friendly-url-routes_6_0_0.dtd">
+<routes>
+	<route>
+		<pattern>/action/{actionName}</pattern>
+		<generated-parameter name="javax.portlet.action">{actionName}</generated-parameter>
+		<ignored-parameter name="p_auth"/>
+		<ignored-parameter name="p_p_id"/>
+		<implicit-parameter name="p_p_lifecycle">1</implicit-parameter>
+		<implicit-parameter name="p_p_state">normal</implicit-parameter>
+		<implicit-parameter name="p_p_mode">view</implicit-parameter>
+	</route>
+</routes>
+

Explanation of the Liferay Friendly Mapper route parameters:
+routes: Routes element which contains all route entries
+route: Single route element entry
+pattern: Pattern of the mapped friendly URL (visible in address bar)
+generated-parameter: These parameters will be generated from parameters in the request URL
+ignored-parameter: These parameters will be igored and not included in generated URLs
+implicit-parameter: Used for static attributes which can be ignored by recognition
+overridden-parameter: Parameter that should be set to a certain value when a URL is recognized
+
+It is necessary to order the parameters as described above.
+These files should located in the resources folder otherwise they will not be available on Apache Tomcat and cannot be initialized by Liferay.
+
+Configuration of friendly URL Java class
+
+MODIFY liferay-portlet.xml +

+
<friendly-url-mapper-class>com.liferay.portal.kernel.portlet.DefaultFriendlyURLMapper</friendly-url-mapper-class>
+<friendly-url-mapping>example</friendly-url-mapping>
+<friendly-url-routes>com/.../example-friendly-url-routes.xml</friendly-url-routes>
+

+In the next step we need one java implementation class to generate the Liferay friendly URLs.
+

Liferay provides the DefaultFriendlyURLMapper class to create the URLs based on our rules.

+

The Liferay Friendly URL Mapper configuration is placed after <icon/> and before <instanceable> +tag.

+

Friendly URL Mapper outcome

+

Liferay will generate the following friendly URL

+
http://localhost:8080/web/guest/examples/-/example/action/new
+

+
    +
  1. The liferay framework will add “-” (dash)
  2. +
  3. Friendly URL mapper name which is configured in <friendly-url-mapping> (liferay-portlet.xml) element
  4. +
  5. Pattern name with generated parameters which is same as in <pattern> (example-friendly-url-routes.xml) defined.
  6. +
+

Additional

+

Friendly URL Mapper functionality is not working if the portletURL API is used to generate the Liferay URL in local Javascript.
+It is helpful to generate <portlet:renderURL> placeholder and replace them by using dummy values.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-moderation-requests/index.html b/docs/developers/dev-moderation-requests/index.html new file mode 100644 index 0000000..99b7ac6 --- /dev/null +++ b/docs/developers/dev-moderation-requests/index.html @@ -0,0 +1,709 @@ + + + + + + + + + + + + + + + + + + + + +Moderation Requests | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Moderation Requests

+ + +

The concept of moderation is good for two things:

+
    +
  • to cope with a large number of potential edits on documents.
  • +
  • to allow every user to propose edits.
  • +
+

Allowing every user to edit opposed to propose edits would lad to a large number of changes, potentially, not making everyone happy. As such, the changes should be reviewed by an experienced person and can be then approved.

+

Application Flow

+

A user changes a moderated document, which are component, release, project and todo’s of licenses (and the white list):

+
    +
  • +

    The user switches in edit mode and applies a change.

    +
  • +
  • +

    The user submits the change by clicking “Update …”

    +
  • +
  • +

    The application checks, if the permissions are sufficient

    +
  • +
  • +

    For sufficient permissions, see here: https://github.com/siemens/sw360portal/wiki/Dev-Role-Authorisation-Model

    +
  • +
  • +

    If the permissions do not allow the edit right away, a moderation request is created.

    +
  • +
  • +

    Moderators can see the moderation request in the moderation portlet

    +
  • +
  • +

    Having selected the moderation request, the moderator can accept the request, decline, postpone or remove himself from the list of moderators

    +
  • +
+

Technical Description

+

Checking Document Permissions

+

If a moderation requests needs to be created, because the user does not have sufficient permissions:

+
    +
  • The request goes through the stack, for example: project portlet, project handler, project database handler.
  • +
  • Then the project database handler checks for permissions using makePermission() (DocumentPermission is the base class, then ProjectPermissions is the referring here for projects) and isActionAllowed().
  • +
  • For moderation requests, we assume that this action is not allowed. Then, the ProjectModerator is called (see package ...sw360.datahandler.entitlement).
  • +
  • This class (which is part of the project service) creates a thrift client to the moderation service (also on the backend) and creates a moderation request using this client.
  • +
+

Every moderation request is created using the thrift-based API.

+

Writing a Moderation Request to the Database

+

The generation of moderation request is performed by the moderation service. The moderation service handles incoming request in the following way:

+
    +
  • The requests arrives in the ModerationDatabaseHandler.
  • +
  • This handler writes the request to the database.
  • +
+

Creation Details in the Service

+

The handler writes one moderation request per user and document. If a moderation request from the same user for the same document exists, added moderation requests are merged. Or, the request is new either with a new user, new document or both, then the moderation request is created.

+

Each moderation requests has recipients, the moderators. The moderation database handler selects the moderators depending on the document type, which are usually the creator of the document and the listed moderators for this document. See details in the ModerationDatabaseHandler class. At the same location the check for deletion is performed.

+

What is in the Database?

+

The moderation request is a document in the couchdb. Technically, the moderation requests holds the affected document as field where the values is a nested JSON dictionary.

+

The following screen shot shows an example for a moderation request for a project.

+

Example Moderation Request in Database

+

Evaluating the Moderation Request

+

On the moderation portlet all moderations will be shown, for which the user is a moderator. +Only open moderation requests can be selected. Approved and declined moderation requests will only be shown. +On selecting the moderation requests, both documents (original and the updated out of the moderation request) will be compared in the merge.jsp and all differences will be shown to the moderator. This is done via tags such as the sw360:CompareProject-tag. Opening the detailed view of the moderation request changes the state to in progress to show other moderators that the moderation request is in work.

+

The following actions are possible:

+
    +
  • Accept request: the document within the moderation request will be accepted and written to the DB via e.g. the ProjectService. The state is set to ACCEPTED.
  • +
  • Remove Me from Moderators: the state of the moderation requests is set to PENDING again and the logged in moderator will be removed from the moderation list.
  • +
  • Decline request: the moderation requests will be set to REJECTED and still shown in the list
  • +
  • Postpone request: the state will be IN PROGRESS.
  • +
  • Cancel: the moderation state is set to PENDING and the moderation request will still be shown in the moderation request list
  • +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-releasing-sw360/index.html b/docs/developers/dev-releasing-sw360/index.html new file mode 100644 index 0000000..1ee67bf --- /dev/null +++ b/docs/developers/dev-releasing-sw360/index.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + + + + + + + + +Release and Versioning | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Release and Versioning

+
Our Versioning and Release Principles
+ +

We have the following main principles for versioning and releases. We consider semantic versioning:

+
+

Given a version number MAJOR.MINOR.PATCH, increment the:

+
    +
  • MAJOR version when you make incompatible API changes,
  • +
  • MINOR version when you add functionality in a backwards-compatible manner, and
  • +
  • PATCH version when you make backwards-compatible bug fixes.
  • +
+

Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.

+
+

with the following implementation in our project:

+

Major Version

+
    +
  • API breaking changes are considered for the upcoming REST API.
  • +
  • Breaking change is also if a migration script is required for the data base.
  • +
  • Thrift API is not considered a public API anymore.
  • +
  • Therefore milestones cannot correspond to our versions like 1.4, 1.5, etc. anymore: we do not know which feature or issue will cause a version jump according to semantic versioning guidelines.
  • +
+

Minor Version

+
    +
  • Changes to the thrift API will cause minor version increment.
  • +
  • Larger new functionality which is backwards compatible, maybe one pull requests or maybe a group of pull requests.
  • +
  • Minor versions requires also tagging in the repo.
  • +
+

Patch Level

+
    +
  • Every push (merged pull request) to master shall generate at least (not there yet) a new patch level version, in order to allow for (clean) deployments at this level.
  • +
  • Could e also minor improvements like adding a button with some functionality
  • +
  • Patch level is not tagged.
  • +
+

Naming and Meaning of Milestones

+
    +
  • Milestones cannot correspond to versions (releases) anymore, because in general the version designator is determined by the level of change.
  • +
  • We use milestones as work packages. We see them as work packages from an organizational point of view. However, it is not a milestone to release a version, because - again in general - the version is determined by the level of change.
  • +
  • However, If the last merged pull quest of a work package, a completing merge: If it is not causing a major or minor version increment, still, this would lead to a minor version increment.
  • +
+

Technical Implementation

+
    +
  • Plan: The artifacts will be build by travis and stored on aws S3 (not there yet) with patch level version increments, but patch level versions will not lead to a tag in the repo.
  • +
  • Currently, the versioning is “manual maven based”, we look for a cleaner more automated approach.
  • +
+

Technical: Maven Universe How to make/tag a release⁽¹⁾:

+

The following information refers to the existing maven-based versioning scheme, as of now we are looking into a system which is not leading to a temporary change in the repo, commit, and then reverting changes.

+

Let us assume, that we want to tag the version 1.2.0 and that the current version in the pom’s is 1.2.0-SNAPSHOT.

+

0. Work in a clean environment

+

Especially should all poms be without uncommitted changes. The safe way is to start with:

+
$ cd /tmp/
+$ git clone https://github.com/eclipse/sw360.git
+$ cd sw360portal
+

1. Write the version of the release into the poms

+
+$ mvn versions:set -DnewVersion=1.2.0
+$ git add pom.xml \*\*/pom.xml
+$ git commit -m "set version to 1.2.0"
+
+

This will actually edit all pom.xml files and change the versions to 1.2.0, i.e. remove the SNAPSHOT.

+

2. Test the project

+
+$ mvn install
+
+

or even better: use vagrant.

+

3. Create and push the tag

+
$ mvn scm:tag
+

This creates the tag and pushes it to github.

+

4. Write the new incremented SNAPSHOT-version into the poms

+
$ mvn versions:set -DnewVersion=<b>1.3.0-SNAPSHOT</b>
+$ git add pom.xml \*\*/pom.xml
+$ git commit -m "set version to <b>1.3.0-SNAPSHOT</b>"
+$ git push origin master
+

– +⁽¹⁾ based on: https://axelfontaine.com/blog/final-nail.html

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-rest-api/index.html b/docs/developers/dev-rest-api/index.html new file mode 100644 index 0000000..89fb2a6 --- /dev/null +++ b/docs/developers/dev-rest-api/index.html @@ -0,0 +1,1083 @@ + + + + + + + + + + + + + + + + + + + + +REST API | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

REST API

+ + +

The sw360 REST API provides access to sw360 resources for external clients. It consists currently of three Maven modules aggregated in one parent module rest in the sw360 distribution.

+

Module Structure

+

The rest module provides a REST API infrastructure for sw360 including:

+
    +
  • Module authorization-server - OAuth2 Authorization Server, offering typical authorization steps of an OAuth2 workflow.
  • +
  • Module resource-server - REST API Gateway, providing access to the data for authenticated and authorized users / clients.
  • +
  • Module rest-common - only library code that is shared between the other rest modules.
  • +
+

The REST API implementation uses:

+
    +
  • Module authorization-server uses the Liferay user management via the Liferay REST API to authenticate users and the users thrift backend service to access user profile data.
  • +
  • Module resource-server uses thrift backend services for accessing sw360 data to deliver it to the external clients.
  • +
+

API Principles

+

Security Principles

+

The basic security principles are following the OAuth2 standards. So there should be an authorization server which can be the one contained in this project. That one provides access tokens after it authenticated the client and the user using this client. In addition it checks which authorities this client should receive for operating in the user’s name. +With this OAuth2 access token the client can query the resource server which will restrict access to the given authorities. +Every client gets an access token as well as an refresh token. As long as the refresh token is valid, the client can gather a new access token without the need of re-authorization of the user.

+

There are currently three different possibilities for an OAuth2 authorization server implemented:

+
    +
  • Using the contained authorization-server with username/password that are known by Liferay, no matter if Liferay is hosting the credentials itself or is attached to some central user management which it uses to authenticate users.
  • +
  • Using the contained authorization-server inside an SSO network where an existing proxy can take care of the authentication and passing authenticated user information in configurable headers to the authorization-server which then performs authorization on top.
  • +
  • Using keycloak as authorization-server. This case is not part of this wiki page and might need special configuration.
  • +
+

Data Principles

+

The REST API provides Hypermedia using HAL (Hypertext Application Language). +The following example shows some ideas of the REST API. It can be obtained by

+
https://[hostname]:[port]/resource/api/browser/index.html#/resource/api
+

Note that the response below is maybe not the exact same response of your current version:

+
{
+  "_links": {
+    "sw360:attachments": {
+      "href": "https://dev.sw360.siemens.com/resource/api/attachments{?sha1}",
+      "templated": true
+    },
+    "sw360:components": {
+      "href": "https://dev.sw360.siemens.com/resource/api/components"
+    },
+    "sw360:licenses": {
+      "href": "https://dev.sw360.siemens.com/resource/api/licenses"
+    },
+    "sw360:licenseinfo": {
+      "href": "https://dev.sw360.siemens.com/resource/api/licenseinfo"
+    },
+    "sw360:projects": {
+      "href": "https://dev.sw360.siemens.com/resource/api/projects"
+    },
+    "sw360:releases": {
+      "href": "https://dev.sw360.siemens.com/resource/api/releases"
+    },
+    "sw360:users": {
+      "href": "https://dev.sw360.siemens.com/resource/api/users"
+    },
+    "sw360:vendors": {
+      "href": "https://dev.sw360.siemens.com/resource/api/vendors"
+    },
+    "sw360:vulnerabilities": {
+      "href": "https://dev.sw360.siemens.com/resource/api/vulnerabilities"
+    },
+    "profile": {
+      "href": "https://dev.sw360.siemens.com/resource/api/profile"
+    },
+    "curies": [
+      {
+        "href": "https://dev.sw360.siemens.com/resource/docs/{rel}.html",
+        "name": "sw360",
+        "templated": true
+      }
+    ]
+  }
+}
+

API Installation

+

Both, the authorization-server and the resource-server can be build using Maven like the rest of the project. Each is generating a Spring Boot server that can be deployed in an application container, e.g. Tomcat.

+

API Configuration

+

Since the authorization-server and the resource-server are Spring Boot servers, they are configured as usual via /src/main/resources/application.yml. In addition some configuration comes historically from sw360.properties. Please note that all configurations could be provided centrally in the /etc/sw360/ directory. As such, the sw360.properties sits directly in /etc/sw360/. For rest-specific configurations the application considers the location /etc/sw360/rest.

+

Authorization Server Configuration

+

Special Liferay Credentials Configuration

+

In addition to the general properties in here the following needs to be configured in the application.yml when the authentication via Liferay username/password credentials should be possible:

+ + + + + + + + + + + + + + + + + + + + +
KeyValuesDefault
sw360:sw360-portal-server-urlthe url of the Liferay instancen/a (but could be given if environment variable is used like ${SW360_PORTAL_SERVER_URL:http://127.0.0.1:8080})
sw360:sw360-liferay-company-idthe id of the company in Liferay that sw360 is run for(but could be given if environment variable is used like ${SW360_LIFERAY_COMPANY_ID:20155})
+

Special SSO Configuration

+

In addition to the general properties in here the following needs to be configured in the application.yml when the authentication via SSO should be possible:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValuesDefault
security:customheader:enabledFlag if the components needed for SSO should be activefalse
security:customheader:headername:intermediateauthstorethe name of the header that can be used for internal data transfer inside one roundtrip - it can be configured here because the proxy has to make sure that this header will not be passed from clients and will be used truly internal onlycustom-header-auth-marker
security:customheader:headername:emailthe name of the header that holds the email of the authenticated user (should be set be the proxy and must never be passed from clients)authenticated-email
security:customheader:headername:extidthe name of the header that holds the extid of the authenticated user (should be set be the proxy and must never be passed from clients)authenticated-extid
+

:heavy_exclamation_mark: Please configure your SSO server and the proxy accordingly. In general, no unauthenticated request should reach the authorization server. And the configured headers should only be set by the proxy. If they are already contained in client requests, they must be removed!

+

Removing Headers in Apache

+

In Apache you may use the mod_headers module to remove headers from the client. Using the default values from the table above, at least the following directives should be present in your configuration for all requests that are routed to the authorization-server:

+
RequestHeader unset custom-header-auth-marker
+RequestHeader unset authenticated-email
+RequestHeader unset authenticated-extid
+

General Configuration

+

Possible properties in sw360.properties file are:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValuesDefault
backend.urlthe url where the thrift services can be foundhttp://127.0.0.1:8080
rest.write.access.usergroupthe user group level (`USERCLEARING_ADMIN
rest.admin.access.usergroupthe user group level (`USERCLEARING_ADMIN
+

The values in sw360.properties should be migrated to the application.yml in the future.

+

Further important properties in application.yml file are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValuesDefault
couchdb:urlthe url of the CouchDB to use as client storen/a
couchdb:databasethe database name of the CouchDB database to use as client storen/a
couchdb:usernameif the CouchDB database needs authentication, enter the username here - if it does not need authentication, do not set this property at all, not even with an empty valuenull
couchdb:passwordif the CouchDB database needs authentication, enter the password here - if it does not need authentication, do not set this property at all, not even with an empty valuenull
sw360:cors:allowed-originvalue for cross origin resource sharingn/a
security:oauth2:resource:idshould just be the same then in the resource servern/a
+

After this configuration is done the normal REST service for client management should be usable. This one is only accessible for authenticated users that get the ADMIN authority (remember, the therefore necessary sw360 usergroup has just been configured). So the clients can be configured now.

+

Client Management

+

In the scenarios of this page, the shipped authorization server is used. So the next step is to configure a valid OAuth2 client in this authorization server. There should be one OAuth2 client per external REST API client (which in turn can have many different users). Therefore the authorization server offers a REST API for basic CRUD operations for configuring the clients that are stored in the just configured CouchDB. Since sw360-ADMIN privileges are needed for client management, an authentication is needed to work with this API.

+

For SSO users (basic-auth Liferay users can use other tools as well because other tools can handle basic auth - but they can also use this workflow):

+
    +
  1. +

    Open a browser with developer tools capabilities

    +
  2. +
  3. +

    Open

    +
    https://[hostname]:[port]/authorization/client-management
    +

    This page always shows the currently configured clients and can be refreshed after every manipulation of a client.

    +
  4. +
  5. +

    To add a new client, enter the following javascript in the dev tools console in the current browser tab - of course after manipulating the client data to suit your needs

    +
    xmlHttpRequest = new XMLHttpRequest();
    +xmlHttpRequest.open('POST', '/authorization/client-management', false);
    +xmlHttpRequest.setRequestHeader('Content-Type', 'application/json');
    +xmlHttpRequest.setRequestHeader('Accept', 'application/json');
    +xmlHttpRequest.send(JSON.stringify(
    +  {
    +    "description" : "my first test client",
    +    "authorities" : [ "BASIC" ],
    +    "scope" : [ "READ" ],
    +    "access_token_validity" : 3600,
    +    "refresh_token_validity" : 3600
    +  }
    +));
    +console.log(xmlHttpRequest.responseText);
    +
  6. +
  7. +

    to manipulate an existing client, do the same but add the clientid to the data object

    +
        "client_id" : "9e358ca832ce4ce99a770c7bd0f8e066"
    +
  8. +
  9. +

    to remove an existing client, enter the following javascript in the dev tools console

    +
    xmlHttpRequest = new XMLHttpRequest();
    +xmlHttpRequest.open('DELETE', '/authorization/client-management/9e358ca832ce4ce99a770c7bd0f8e066', false);
    +xmlHttpRequest.setRequestHeader('Content-Type', 'application/json');
    +xmlHttpRequest.setRequestHeader('Accept', 'application/json');
    +xmlHttpRequest.send();
    +console.log(xmlHttpRequest.responseText);
    +
  10. +
+

This way the session cookie of the SSO login will be used for the REST calls. This might also be possible in postman or curl or similar tools if you want to try to copy cookies (depending also on the SSO configuration). As said before, if Liferay username/password credentials can be used to authenticate then a tool like postman or curl can be used for the whole process. Just pass the credentials as basic-auth.

+

Client Management via Curl

+

The above described call to create a rest client can also be done directly via one curl call:

+
SW360_USER=[admin sw360 user]
+SW360_PW=[corresponding sw360 admin user password]
+curl -s -S \
+     --user "${SW360_USER}:${SW360_PW}" \
+     --header "Content-Type: application/json" \
+     --header "Accept: application/json" \
+     -X POST https://[hostname]:[port]/authorization/client-management \
+     -d @- <<EOF
+{
+    "description" : "my first test client",
+    "authorities" : [ "BASIC" ],
+    "scope" : [ "READ" ],
+    "access_token_validity" : 3600,
+    "refresh_token_validity" : 3600
+}
+EOF
+

This only works with the liferay basic-auth mechanism, SSO is not supported via curl.

+

OAuth2 Access Token

+

Now with a configured client it is possible to retrieve an access token for the REST API from the authorization server. There is again a difference in SSO environments and Liferay username/password environments.

+

SSO Backed Access Token

+

Probably the browser has to be used again because many SSO environments are based on certificates that are read from keycards and the necessary libs are often built into the browser. So just call the URL

+
https://[hostname]:[port]/authorization/oauth/token?grant_type=password&client_id=[clientid]&client_secret=[clientsecret]
+

Of course the client id and the client secret should be replaced by the values of the configured client. The received response should look similar to

+
{
+  "access_token" : "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiZDY4ZWY1YWEtZTQ5My00Y2YxLWI2NGQtNWE5MTdkY2M2ZTYwIiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iO5sLrqRcZfzvMP5gjaJhk3caWyZLkUesdbMfqCGy4V5rbnU9QP1LjdybY0Udh8hvAvhlpqPfaxeKe1c3-gQs5MYlqG0lNQCyWcb7NRHj8VFlwLPuJRZJNk3tybvgITVm9r14pfAXogpVE0S4KihD2W1_SoKH4NzTa2vOEG0CK4VzCLetxUlUuePxZH8ugouqbS2d0SpyeeMTm-PzxzzeTb_4ulGpg63eE1v7GvTsI23uh2WfIgHBa1GRr5jWtE0Meq-5UFCVQkhMm8P-r8wO2iuRblCu6a-bWwy7bfdj3S2VDnqSQskE2dVrC_qMs-V2AGvCV1xvlF0P8A4tgwL-w",
+  "token_type" : "bearer",
+  "refresh_token" : "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJhdGkiOiJkNjhlZjVhYS1lNDkzLTRjZjEtYjY0ZC01YTkxN2RjYzZlNjAiLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiM2VkZDcxODAtMTBlYi00Y2MwLTg0NTUtMGYwZmIyMWMwYmU0IiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iMGfdHWpJNseoxIk7tKCNTyC1w4_AJ4cSv6kO64_BkF54MLudvyf9uVSIHpAeHhSFdvhbjksynRqq_u78vW8ptY1la65Qx8glHz0sktWBfMDJsUA4ynU2iZbKU92f2OOf3wQRVt38-Y1mBUsDMIStyKTDeIXGT3LJr_8k5dRAGvayixaezxDFw3dWK2M6P9h-ZnfEP47HpIUZrG8cgwPmNCZ9gBXsqVnueDYZth6TaEKIvWbkZtwY0ikWKyJL2xLm78O1ii3lA5ENt5I0DTfTm8QuK_zcm679W9jF0jvwIR71fM0JSWjkBoXd2h9oLmE2CF2sFVaJor_ermk-L0LsA",
+  "expires_in" : 3599,
+  "scope" : "READ",
+  "jti" : "d68ef5aa-e493-4cf1-b64d-5a917dcc6e60"
+}
+

From this response the value of the access_token and probably refresh_token field is the one to copy-paste for later usage.

+

Liferay Backed Access Token

+

With a Liferay backed authentication all REST clients that offer basic auth support can be used. For example curl:

+
curl -X POST --user '[clientid]:[clientsecret]' -d 'grant_type=password&username=[username]&password=[password]' https://[hostname]:[port]/authorization/oauth/token -k
+

Example response:

+
{
+  "access_token" : "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiZDY4ZWY1YWEtZTQ5My00Y2YxLWI2NGQtNWE5MTdkY2M2ZTYwIiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iO5sLrqRcZfzvMP5gjaJhk3caWyZLkUesdbMfqCGy4V5rbnU9QP1LjdybY0Udh8hvAvhlpqPfaxeKe1c3-gQs5MYlqG0lNQCyWcb7NRHj8VFlwLPuJRZJNk3tybvgITVm9r14pfAXogpVE0S4KihD2W1_SoKH4NzTa2vOEG0CK4VzCLetxUlUuePxZH8ugouqbS2d0SpyeeMTm-PzxzzeTb_4ulGpg63eE1v7GvTsI23uh2WfIgHBa1GRr5jWtE0Meq-5UFCVQkhMm8P-r8wO2iuRblCu6a-bWwy7bfdj3S2VDnqSQskE2dVrC_qMs-V2AGvCV1xvlF0P8A4tgwL-w",
+  "token_type" : "bearer",
+  "refresh_token" : "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJhdGkiOiJkNjhlZjVhYS1lNDkzLTRjZjEtYjY0ZC01YTkxN2RjYzZlNjAiLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiM2VkZDcxODAtMTBlYi00Y2MwLTg0NTUtMGYwZmIyMWMwYmU0IiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iMGfdHWpJNseoxIk7tKCNTyC1w4_AJ4cSv6kO64_BkF54MLudvyf9uVSIHpAeHhSFdvhbjksynRqq_u78vW8ptY1la65Qx8glHz0sktWBfMDJsUA4ynU2iZbKU92f2OOf3wQRVt38-Y1mBUsDMIStyKTDeIXGT3LJr_8k5dRAGvayixaezxDFw3dWK2M6P9h-ZnfEP47HpIUZrG8cgwPmNCZ9gBXsqVnueDYZth6TaEKIvWbkZtwY0ikWKyJL2xLm78O1ii3lA5ENt5I0DTfTm8QuK_zcm679W9jF0jvwIR71fM0JSWjkBoXd2h9oLmE2CF2sFVaJor_ermk-L0LsA",
+  "expires_in" : 3599,
+  "scope" : "READ",
+  "jti" : "d68ef5aa-e493-4cf1-b64d-5a917dcc6e60"
+}
+

Of course, the username and password must be your user credentials and the client id and secret have to be replaced with the configured values. And again, the wanted value is the value of the field access_token and probably refresh_token.

+

More Links:

+ +

OAuth2 Refresh Token

+

The authorization server supports so called refresh tokens to generate new access tokens after they have been expired. New access tokens can be generated with the use of the refresh_token without further re-authorization of the user. The following url must be used:

+
  http://localhost/authorization/oauth/token?grant_type=refresh_token&refresh_token=<REFRESH_TOKEN>
+

The client must pass its credentials via basic authentication. Though a user authentication is not necessary. +If you are authentication your users on a proxy, you have to configure that proxy in a way that it does not block requests to the above url. As marker the ‘grant_type=refresh_token’ query parameter may be used.

+

Example Apache configuration

+

The following example shows the relevant part for an Apache proxy to configure +authentication of the authorization-server properly:

+
<Location /authorization/oauth/token>
+    Order allow,deny
+    Allow from all
+
+    <If "%{QUERY_STRING} =~ /^grant_type=refresh_token\&/">
+        # No authentication needed
+    </If>
+    <Else>
+        # Configure your authentication here
+    </Else>
+
+    ProxyPass https://localhost:8443/authorization/oauth/token
+    ProxyPassReverse https://localhost:8443/authorization/oauth/token
+</Location>
+

Resource Server Configuration

+

Now that access tokens can be generated, the resource server has to be configured. The same general ideas of general config apply. The properties of the application.yml are

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValuesDefault
sw360:thrift-server-urlthe url where the thrift services can be found, e.g. http://localhost:8080
sw360:test-user-idonly for developing, simple test user short cut, must be pulled off for productive
sw360:test-user-passworssee above
sw360:couchdb-urlthe url of the CouhDB server for attachment handling, e.g. https://localhost:5984
sw360:cors:allowed-originvalue for cross origin resource sharingn/a
+

The REST API is now completely usable via an own client or testwise with integrated tools.

+

Tools

+

To get data and interact with the sw360 REST API the HAL-Browser is recommended. Currently, the HAL-Browser is also deployed on the sw360 development instance, but this is likely to change once the REST API has evolved more. Currently the URL of HAL-Browser is:

+
https://[hostname]:[port]/resource/api/browser/index.html#/resource/api
+

An example for a screenshot is as follows:

+

rest-hal-explorer

+

When using other tools the access token has to be set as header parameter in the REST request. Please add a new header:

+
    +
  • Key: Authorization
  • +
  • As value you need to enter: Bearer [ACCESS_TOKEN] where [ACCESS_TOKEN] actually contains the token
  • +
+

Example – Get a list of projects

+

Here is an example how to query for all projects as HTTP GET Request. As for the resource endpoint, the request:

+
https://sw360.org/resource/api/projects (or /resource/api/projects)
+

will return the following response:

+

rest-explorer2

+

API Documentation

+

sw360 deploys a REST API documentation at every instance. There are the following URLs offered at each instance

+ + + + + + + + + + + + + + + + + + + + + +
URLDescription
https://[hostname]:[port]/resource/docs/index.htmlSmall overview page
https://[hostname]:[port]/resource/docs/api-guide.htmlThe API description for the currently running server
https://[hostname]:[port]/resource/api/browser/index.html#/resource/apiIntegrated HAL browser to directly use the API
+

Known Problems

+

If you use Nginx or Apache as request front end server there maybe some configuration caveats: The REST API objects provides self links to reference to other objects also including the protocol prefix. These links are realized on Hypertext Application Language (HAL) for example you will find in REST responses:

+
"_links": {
+  "self": {
+    "href": "https://localhost:8443/resource/api/projects/065f3aa45c2683297fd1bb39296f519d"
+  }
+}
+

The REST spring boot applications are using the Tomcat environment configuration to generate the HAL links. If the Tomcat is only configured as HTTP, the generated links will contain the http protocol and port - which is a problem if the server should be contacted over httpsonly. This problem occurs, if tomcat is used together with Nginx, Apache httpd or other Web servers, which are configured to repsond only to https.

+

Solution is to set for example in Nginx HTTP ‘X-Forward-*’ headers on a reverse proxy, for example:

+
 location / {
+   ...
+   proxy_set_header        X-Forwarded-Port   443;
+   proxy_set_header        X-Forwarded-Proto  https;
+ }
+

For other Web severs, there might a similar solution.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-role-authorisation-model/index.html b/docs/developers/dev-role-authorisation-model/index.html new file mode 100644 index 0000000..785598c --- /dev/null +++ b/docs/developers/dev-role-authorisation-model/index.html @@ -0,0 +1,859 @@ + + + + + + + + + + + + + + + + + + + + +Roles and Authorization | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Roles and Authorization

+
SW360 Roles and Authorization
+ +

Like any other system, SW360 allows for setting different levels of access for different users. Technically, the decision when user should be able to see or to do something happens (generally) on the backend server. This ensures consistency between the REST API and the portal application.

+

For setting roles of a user, the Liferay control panel is being used (Admin menu -> Control Panel -> Users and Organisations -> Users -> select one user and Edit -> Roles). Setting access at individual records happens in the edit view of that record.

+

Roles Overview

+

SW360 offers two choices for doing the roles: one is setting access rights at every record individually. Another are general roles that can be set for every user. An admin of SW360 can set user roles at the Liferay Users and Roles UI.

+

Setup Admin (Liferay Role)

+

The setup admin is the Liferay administrator, which can configure the entire liferay app, such as which portlets are shown on which page.

+

SW360 Admin (Liferay Role)

+

The SW360 admin can change all data and promote users for more access rights, such as promoting a user to role CLEARING_ADMIN. This role can change data from other groups, limited by visibility setting of a project.

+

Clearing Admin (Liferay Role)

+

The clearing admin can change all component and release records and project records of the same group. This can be seen as group administrator.

+

Security Admin (Liferay Role)

+

In addition to the user rights, the security admin can set security vulnerabilities to irrelevant

+

ECC Admin (Liferay Role)

+

In addition to the user rights, the ECC admin can manipulate ECC data.

+

User

+

A user can create, modify and delete all own (=self created) records. A user cannot change records of others

+

Moderation Requests

+

If a user with user or other access role rights is not entitled to write or change a record, a moderation request will be created. The moderation request contains the changes an will be routed for approval to the users who can write this record.

+

In addition there are ACL-style roles, meaning that per data item access settings can be made:

+
    +
  1. creator - a creator can modify in addition to the user’s read abilities, a user can be creator of a data item
  2. +
  3. moderator - a creator can define moderators for a data item. Moderators can change a data item as a creator can.
  4. +
  5. contributor (Component) - is a contributor to a component, project, similar (but not the same) to a moderator. In addition to moderator, this role has been added to identify contributors (or that contributors get the fame). +In contrast, the contributor cannot delete data items.
  6. +
  7. project responsible (Project) - is a contributor, just named differently to identify the responsible person.
  8. +
  9. lead architect (Project) - is a contributor, just named differently to identify the responsible person. an architect refers to the person who has that role of the project or product. This role has been added to identify architects to have a contact person for technical questions.
  10. +
  11. contact (Release) - deprecated, should be renamed to contributor see #100.
  12. +
+

group (department), contributor, moderator and owner roles are entity specific, user, clearing admin and admin are roles assigned to a user.

+

Additional Project Visibility

+

In addition to the roles mentioned above, each project has a separate visibility setting (technically an attribute of the project document). There are four project visibility levels:

+
    +
  1. Private - no one but the creator can read.
  2. +
  3. Me and moderators - involves all moderators and contributors, basically all names that are named among the attributes (lead architect, project responsible, contributors)
  4. +
  5. Department / business unit (should be renamed) - refer to the group the users are in.
  6. +
  7. Public - all registered users of the liferay / sw360 application (login required).
  8. +
+

The access rules are implemented inlib-datahandler. In the package, com.siemens.sw360.datahandler.permissions this is implemented in ProjectPermissions. See methods isVisible and userIsEquivalentToModeratorinProject() for the actual rules.

+

Overall Access Matrix

+

The following table presents the SW360 Role-Authorisation-Model.

+

The row specifies which action to take, the column the role of the actor. Cell entries specify which entity type can be acted upon.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
creatormoderatorcontributoruserclearing admin(sw360)admin
create---PCRVPCRVLPCRVL
readPPP(P²)CRVL(P²)CRVLPCRVL
editPCRPCRPCR(all created ones)PCRVLPCRVL
deletePCRPCR-(all created ones)LPCRVL
+

P² : only if the user is member of the group of the project (or has created the project)

+

Note that ECC Admins and Security Admins have only the ability to write ECC and security data respectively at given records. However, as for the other access rights this role does not enhance anything above users.

+

Legend

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
acronymdescription
Pproject
Ccomponent
Rrelease
Vvendor
Llicense
+

Technical Info

+

The role access rules are put into lib-datahandler. In the package, com.siemens.sw360.datahandler.permissions there are implementing classes of a template class DocumentPermissions. As an example, ProjectPermissions extends abstract class DocumentPermissions.

+

At run time, a permissions object consisting of a document and a user is created: In PermissionUtils (same package) there is a static method makePermissions<T>() that creates a permissions object. The received permissions object instance can be asked if a particular operation is allowed.

+

Note that the general application of these permission operations runs in the backend (Thrift services). An application in the front end of PermissionUtils for example, is for displaying buttons depending on the user main role (user, clearing admin or admin). Then the portlet makes plain use of the lib-datahandler library.

+

Further plans

+
    +
  1. +

    Actually, creating stuff should be checked in lib-datahandler, starting with creation of licenses,which should ot be permitted to users: Issue #106

    +
  2. +
  3. +

    Issue #101 for

    +
  4. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
contributormoderatorcreatoruserclearing adminadmin
download OSS sources---RRR
download internal sourcesRRR--R
+
    +
  1. Issue #102 for
  2. +
+ + + + + + + + + + + + + + + + + + + + + + + +
contributormoderatorcreatoruserclearing adminadmin
send to clearing-PP--PCRL
+
    +
  1. Issue #103 for
  2. +
+ + + + + + + + + + + + + + + + + + + + + + + +
contributormoderatorcreatoruserclearing adminadmin
edit clearing report-RR-R?PCRL
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-semantic-commits/index.html b/docs/developers/dev-semantic-commits/index.html new file mode 100644 index 0000000..4b24fe9 --- /dev/null +++ b/docs/developers/dev-semantic-commits/index.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + + + + + + + + +Semantic Commits | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Semantic Commits

+ + +

The reason and benefit of semantic commit messages

+
    +
  • automatic generating of the changelog
  • +
  • simple navigation through git history (e.g. ignoring style changes)
  • +
+

Semantic commit message structure

+

<type>(<scope>): <commit message>

+

The following are supported

+
    +
  • feat (new feature for the user, not a new feature for build script)
  • +
  • fix (bug fix for the user, not a fix to a build script)
  • +
  • docs (changes to the documentation)
  • +
  • style (formatting, missing semi colons, etc; no production code change)
  • +
  • refactor (refactoring production code, eg. renaming a variable)
  • +
  • test (adding missing tests, refactoring tests; no production code change)
  • +
  • chore (updating grunt tasks etc; no production code change)
  • +
+

Example values:

+
    +
  • ui (user interface)
  • +
  • rest (REST API)
  • +
  • thrift (apache thrift services)
  • +
  • project (project portlet)
  • +
  • component (component portlet)
  • +
  • user (user portlet)
  • +
  • etc.
  • +
+

Example of semantic commit message

+

fix(rest): change maven plugin order to generate the documentation correctly

+

<type>(<scope>): <commit message>

+

Referencing issues

+

Please reference in the pull request to the open issue

+

closes eclipse/sw360#<issue-number>

+

closes eclipse/sw360#758

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-testing-frameworks/index.html b/docs/developers/dev-testing-frameworks/index.html new file mode 100644 index 0000000..6c9694a --- /dev/null +++ b/docs/developers/dev-testing-frameworks/index.html @@ -0,0 +1,625 @@ + + + + + + + + + + + + + + + + + + + + +Testing Frameworks | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Testing Frameworks

+
Behaviour testing
+ +

The implementation of complicated rules is not always easy to read. +A good way to document and explain the behaviour of rule engines are natural language tests. +A frame work we use for that is jgiven. +We write the tests using the [dataprovider] (https://github.com/TNG/junit-dataprovider) runner. +This is basically a runner that allows to use parametrized tests.

+

The basic testing frame work is still JUnit4, assertions are made using hamcrest and we mock complicated input classes with mockito.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-troubleshooting/index.html b/docs/developers/dev-troubleshooting/index.html new file mode 100644 index 0000000..302c807 --- /dev/null +++ b/docs/developers/dev-troubleshooting/index.html @@ -0,0 +1,734 @@ + + + + + + + + + + + + + + + + + + + + +Troubleshooting | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Troubleshooting

+
List of small issues / tips when developing for SW360
+ +

Development: problems building sw360portal with maven?

+

Before building the sw360portal with maven, ensure that the following components are installed in the development environment:

+
    +
  • A git client
  • +
  • Apache Maven 3.0.X
  • +
  • Apache Thrift 0.9.3
  • +
  • Java 1.8.X
  • +
  • CouchDB, at least 1.5 (only if the tests will be executed locally)
  • +
+

Development: problems using Eclipse?

+

Please do not use Eclipse, because the integration of Apache Thrift is an open issue and we found no plugin for Eclipse to solve the shown compiler errors. +Recommended is IntelliJ IDEA or NetBeans.

+

Liferay: problems with displaying changes to page?

+

When developing changes to a page and these changes do not show in browser - even after redeployment, then the internal liferay optimisation mechanisms may kick in. Try to add to the URL string the following key value parameters:

+
js_fast_load=0&css_fast_load=0&strip=0
+

Liferay: where are the initial admin user settings?

+

It is the file portal-ext.properties in sw360/opt.

+

Maven: build generally fails

+

You just try to compile parts or all of it and it fails? Most of the stuff depends on the module /build-configuration. Execute either “mvn install” on top level or inside build configuration.

+

Backend: problems with company proxy?

+

maybe try instead:

+
/opt/apache-tomcat-/bin/startup.sh
+

just this:

+
CATALINA_OPTS="-Dhttps.proxy..." /opt/apache-tomcat-/bin/startup.sh
+

for lucene it might be necessary to add:

+
[httpd_global_handlers]
+_fti = {couch_httpd_proxy, handle_proxy_req, <<"http://127.0.0.1:8085/couchdblucene">>}
+

in lucene.ini of local.d of your CouchDB installation

+

Backend: are thrift services up?

+
    +
  1. Check tomcat manager (if the services are there)
  2. +
  3. Check if the service is accessible: +
    http://your.url.to.server.com:8085/components  
    +
    Should return “Welcome to …”.
  4. +
  5. Check if the service thrift page is there: +
    http://your.url.to.server.com:8085/components/thrift
    +
    Should return HTTP status code 500, because in the browser, no valid thrift message was formed.
  6. +
+

Backend: org.ektorp.DbAccessException

+

What do I do if I get: org.ektorp.DbAccessException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field “_id”

+

You add the class you have been trying to serialize to +THRIFT_CLASSES in +sw360/src/libraries/lib-datahandler/src/main/java/com/siemens/sw360/datahandler/thrift/ThriftUtils.java

+

Backend: maven failed tomcat7 deploy

+

If the deployment via maven of the backend does fail with an error like this

+
Uploading: http://localhost:8085/manager/text/deploy?path=%2Flicenses
+2302/17930 KB   
+Uploading: http://localhost:8085/manager/text/deploy?path=%2Flicenses
+2102/17930 KB   
+Uploading: http://localhost:8085/manager/text/deploy?path=%2Flicenses
+2064/17930 KB   
+Uploading: http://localhost:8085/manager/text/deploy?path=%2Flicenses
+2064/17930 KB   
+[INFO] ------------------------------------------------------------------------
+[INFO] Reactor Summary:
+[INFO] 
+[INFO] backend ........................................... SUCCESS [2.579s]
+[INFO] backend-src ....................................... SUCCESS [0.058s]
+[INFO] src-licenses ...................................... SUCCESS [10.544s]
+[INFO] src-users ......................................... SUCCESS [1.485s]
+[INFO] src-vendors ....................................... SUCCESS [6.929s]
+[INFO] src-search ........................................ SUCCESS [5.837s]
+[INFO] src-components .................................... SUCCESS [19.439s]
+[INFO] src-projects ...................................... SUCCESS [14.280s]
+[INFO] src-attachments ................................... SUCCESS [6.188s]
+[INFO] src-moderation .................................... SUCCESS [1.169s]
+[INFO] src-fossology ..................................... SUCCESS [6.259s]
+[INFO] backend-svc ....................................... SUCCESS [0.038s]
+[INFO] svc-licenses ...................................... FAILURE [3.630s]
+[INFO] svc-users ......................................... SKIPPED
+[INFO] svc-vendors ....................................... SKIPPED
+[INFO] svc-search ........................................ SKIPPED
+[INFO] svc-components .................................... SKIPPED
+[INFO] svc-projects ...................................... SKIPPED
+[INFO] svc-attachments ................................... SKIPPED
+[INFO] svc-moderation .................................... SKIPPED
+[INFO] svc-fossology ..................................... SKIPPED
+[INFO] backend-utils ..................................... SKIPPED
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD FAILURE
+[INFO] ------------------------------------------------------------------------
+[INFO] Total time: 1:19.836s
+[INFO] Finished at: Mon May 04 15:57:46 CEST 2015
+[INFO] Final Memory: 24M/311M
+[INFO] ------------------------------------------------------------------------
+[ERROR] Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) on project svc-licenses: Cannot invoke Tomcat manager: Broken pipe -> [Help 1]
+[ERROR] 
+[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
+[ERROR] Re-run Maven using the -X switch to enable full debug logging.
+[ERROR] 
+[ERROR] For more information about the errors and possible solutions, please read the following articles:
+[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
+[ERROR] 
+[ERROR] After correcting the problems, you can resume the build with the command
+[ERROR]   mvn <goals> -rf :svc-licenses
+voyager:backend sam$
+

One solution is that you deployed already and the tomcat7 plugin does not like to have multiple deploy commands. Instead you will need to issue a mvn tomcat7:redeploy command.

+

Deployment: liferay not accessible

+

If the virtual machine was shut down and started up again, the backend services and frontend liferay require manual restart. Please contribute a change in the vagrant deployment if you feel that this could be changed. The actual places to call are:

+
/opt/apache-tomcat-.../bin/.startup.sh
+/opt/liferay-.../tomcat-.../bin/.startup.sh
+
+ + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/dev-using-requirejs-for-javascript-modules/index.html b/docs/developers/dev-using-requirejs-for-javascript-modules/index.html new file mode 100644 index 0000000..476857a --- /dev/null +++ b/docs/developers/dev-using-requirejs-for-javascript-modules/index.html @@ -0,0 +1,736 @@ + + + + + + + + + + + + + + + + + + + + +Using RequireJS fro Javascript Modules | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Using RequireJS fro Javascript Modules

+ + +

Today most of the javascript code runs in the global namespace. This increases the risk of overwriting symbols in the global namespace due to different libraries and snippets.

+

Goal

+

We want to use RequireJS (http://requirejs.org/) to modularize our code and to have clear namespaces for each component. In addition some of the code may be reused more easily. Other advantages:

+
    +
  • libraries like jquery or datatables can be imported by name but without a specified version
  • +
  • if necessary, specific versions can be imported for parts of the page
  • +
  • it is very easy to only load needed dependencies
  • +
  • good support of webjars due to webjars-locator. Webjars a are automatically accessible through RequireJS.
  • +
+

How to use - example

+

There is a new jspf-file to be included in jsps to enable RequireJS support:

+
<%@ include file="/html/utils/includes/requirejs.jspf" %>
+
+

When RequireJS is enabled with the above include, all libraries can be accessed and code can be scoped:

+
require(['jquery', 'module/quickfilter', 'module/confirm', /* jquery-plugins: */ 'datatables', 'jquery-ui'], function($, quickfilter, confirm) {
+    // code goes here, libraries can be used through the variables $, quickfilter and confirm
+    // Note: jquery-plugins does not have to be bound to variables since they directly register themselves in the jquery object
+});
+
+

NOTE/WARNING: since not all code is using RequireJS at the moment it is highly recommended to include RequireJS just before the script tag using it. DO NOT include it at the beginning of the file! Therefore use the following pattern:

+
<%@ include file="/html/utils/includes/requirejs.jspf" %>
+<script>
+    require(['jquery'], function($) {
+        // js stuff
+    });
+</script>
+
+

Explanation: some the the jQuery-plugins are already module safe. This means the look if something like RequireJS is available and - if this is the case - register themselves as anonymous modules. If someone in some include in the page loads such a plugin via script plugin it may happen that the plugins registers itself twice as an anonymous module which causes errors in RequireJS. Loading RequireJS after all script tags will prevent this and ensure that every plugin is only registered once.

+

Migration

+

Migrate a JSP

+

To migrate a JSP to use RequireJS the following steps have to be done:

+
    +
  1. Enable RequireJS support by including requirejs.jspf. Do it JUST before the script tag with the main code (see NOTE above).
  2. +
  3. Enclose the existing code in a require-function (Attention: Also read “Co-existence with AUI().use()” below)
  4. +
  5. Remove existing script-tags that loads the javascript files “manually”
  6. +
  7. Rewrite code that access functions inside the new require-function from outside (e.g. click handlers, see below)
  8. +
+

Co-existence with AUI().use()

+

If you need to use AUI().use() in your code, e.g. to grab the PortletURL object, you have to call this function first and call require inside. Otherwise the code may not be executed correclty if the ‘Drag&Drop’ error occurs to early during page loading:

+
AUI().use('liferay-portlet-url', function () {
+    require(['jquery', 'module/quickfilter') {
+        // AUI and require modules loaded and available
+    });
+});
+
+

Migrate click-handlers

+

Since none of the defined functions remains in the global scope click handlers defined in the attributes of a tag would no longer work. Use jQuery to attach a click handler instead:

+
$('#exportSpreadsheetButton').on('click.components', exportSpreadsheet)
+
+

This click handler is added inside the RequireJS-scope where the function exportSpreadsheet is defined. +You may also attach handler for distinct elements in each row of a table:

+
$('#componentsTable').on('click.components', 'img.delete', function(event) {
+     // do stuff
+});
+
+

Make a module out of a jspf-include

+

There are many jspf-includes which contain html as well as javascript code. They should be converted as followed:

+
    +
  1. +

    Move the javascript code to an own file. Place it below the ‘html/js’-folder, following the same structure as the jspf-file. If the jspf-file is html/components/includes/vendors/addVendor.jspf place the javascript code in the file js/components/includes/vendors/addVendor.js.

    +
  2. +
  3. +

    Enclose the code in a define statement to define a new module:

    +
     define('components/includes/vendors/addVendor', [ /* dependencies */ ], function() {
    +     // define module code
    + });
    +
    +
  4. +
+

In order to use the new module include the jspf-file and load the js-code via RequireJS:

+
<%@ include "html/components/includes/vendors/addVendor.jspf" %>
+    
+require(['components/includes/vendors/addVendor'], function(addVendor) {
+    // use addVendor
+});
+
+

Make a module out of a javascript file or function

+

There are several javascript files and functions below `/html/js’. They can be make compatible to RequireJS as follows:

+
    +
  1. +

    Create a new file inside /html/js/component with a proper name that describes the functionality for the new component

    +
  2. +
  3. +

    Define the module and point to the legacy function, e.g.

    +
     define('module/confirm', ['jquery', /* jquery-plugins: */ 'jquery-confirm', /* legacy code */ 'main' ], function($) {
    +     return {
    +         confirmDeletion: deleteConfirmed /* pointer to legacy method in main.js */
    +     };
    + });
    +
    +
  4. +
  5. +

    Afterwards the module can be loaded using the name component/confirm, e.g.

    +
     require(['module/confirm'], function(confirm) {
    +     confirm.confirmDeletion(/*...*/);
    + });
    +
    +
  6. +
+

Note The legacy function should be moved inside the module as soon as the function is no longer accessed directly but via RequireJS only. +Note You can also require legacy javascript files if you need them as dependency as pointed out in the examples above.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/index.html b/docs/developers/index.html new file mode 100644 index 0000000..680497f --- /dev/null +++ b/docs/developers/index.html @@ -0,0 +1,777 @@ + + + + + + + + + + + + + + + + + + + + + +Development | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Development

+
SW360 Development Information
+ + +
+ + + + + + + + +
+ + +
+
+ How to add a backend portlet to sw360 +
+

+
+ + +
+
+ How to add a frontend portlet to sw360 +
+

+
+ + +
+
+ SW360 Development Branches +
+

Helps to see who is responsible and to which issue the Pull Request corresponds

+
+ + +
+
+ How to add fields to an existing class +
+

+
+ + +
+
+ CouchDB External Documents +
+

+
+ + +
+
+ Database migration using Costco +
+

+
+ + +
+
+ Definition of Done +
+

The definition of done helps to set a common understanding for solving a ticket.

+
+ + +
+
+ Filtering in Portlets +
+

+
+ + +
+
+ Fossology Integration +
+

Basis of communication between SW360 and FOSSology

+
+ + +
+
+ Liferay Friendly +
+

Basis of communication between SW360 and FOSSology

+
+ + +
+
+ Moderation Requests +
+

+
+ + +
+
+ Release and Versioning +
+

Our Versioning and Release Principles

+
+ + +
+
+ REST API +
+

+
+ + +
+
+ Roles and Authorization +
+

SW360 Roles and Authorization

+
+ + +
+
+ Semantic Commits +
+

+
+ + +
+
+ Testing Frameworks +
+

Behaviour testing

+
+ + +
+
+ Troubleshooting +
+

List of small issues / tips when developing for SW360

+
+ + +
+
+ Using RequireJS fro Javascript Modules +
+

+
+ + +
+
+ Test Cases +
+

SW360 Assorted Test Cases

+
+ + +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/index.xml b/docs/developers/index.xml new file mode 100644 index 0000000..77c2e67 --- /dev/null +++ b/docs/developers/index.xml @@ -0,0 +1,2142 @@ + + + Eclipse SW360 – Development + https://www.eclipse.org/sw360/docs/developers/ + Recent content in Development on Eclipse SW360 + Hugo -- gohugo.io + + + + + + + + + + + Docs: How to add a backend portlet to sw360 + https://www.eclipse.org/sw360/docs/developers/dev-adding-a-new-portlet-backend/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-adding-a-new-portlet-backend/ + + + + <p>This page how to add some operations / service calls on the backend for the portlet writing on the page that covers the front end. Note that this page does not create a new (thrift service), but just explains how to add more operations.</p> +<p>This explanation follows bottom up approach where we first add the backend methods and then call them later in the frontend. Quick summary:</p> +<ol> +<li>Add methods to the thrift idl definition</li> +<li>Add methods to the data handler interface</li> +<li>Add implementation</li> +<li>Add tests</li> +</ol> +<h4 id="thrift">Thrift</h4> +<p>First we add some methods to the thrift files, components.thrift</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#09f;font-style:italic">//new Methods to ensure uniqueness of Identifiers +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"></span>map <span style="color:#555">&lt;</span>string<span style="color:#555">,</span> list<span style="color:#555">&lt;</span>string<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateComponents</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span>map <span style="color:#555">&lt;</span>string<span style="color:#555">,</span> list<span style="color:#555">&lt;</span>string<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateReleases</span><span style="color:#555">();</span> +</span></span></code></pre></div><h4 id="datahandler">Datahandler</h4> +<p>then we install lib-datahandler. That way we see which methods we have to implement. +We have chosen to change the interface of the ComponentService. That means we need to implement them in the ComponentHandler.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateComponents</span><span style="color:#555">()</span> <span style="color:#069;font-weight:bold">throws</span> TException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> handler<span style="color:#555">.</span><span style="color:#309">getDuplicateComponents</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateReleases</span><span style="color:#555">()</span> <span style="color:#069;font-weight:bold">throws</span> TException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> handler<span style="color:#555">.</span><span style="color:#309">getDuplicateReleases</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><h4 id="implementation">Implementation</h4> +<p>The methods there are only a reference to the ComponentDatabaseHandler.java. +In the ComponentHandler we only assert that the input is correct. +Since we implement methods without parameters, there is nothing else for us to do. +In the ComponentDatabaseHandler.java we actually do some work and implement the methods</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateComponents</span><span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> ListMultimap<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> String<span style="color:#555">&gt;</span> componentIdentifierToComponentId <span style="color:#555">=</span> ArrayListMultimap<span style="color:#555">.</span><span style="color:#309">create</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span> <span style="color:#555">(</span>Component component <span style="color:#555">:</span> componentRepository<span style="color:#555">.</span><span style="color:#309">getSummaryForExport</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> componentIdentifierToComponentId<span style="color:#555">.</span><span style="color:#309">put</span><span style="color:#555">(</span>SW360Utils<span style="color:#555">.</span><span style="color:#309">printName</span><span style="color:#555">(</span>component<span style="color:#555">),</span> component<span style="color:#555">.</span><span style="color:#309">getId</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> CommonUtils<span style="color:#555">.</span><span style="color:#309">getIdentifierToListOfDuplicates</span><span style="color:#555">(</span>componentIdentifierToComponentId<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateReleases</span><span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> ListMultimap<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> String<span style="color:#555">&gt;</span> releaseIdentifierToReleaseId <span style="color:#555">=</span> ArrayListMultimap<span style="color:#555">.</span><span style="color:#309">create</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span> <span style="color:#555">(</span>Release release <span style="color:#555">:</span> releaseRepository<span style="color:#555">.</span><span style="color:#309">getReleaseSummary</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> releaseIdentifierToReleaseId<span style="color:#555">.</span><span style="color:#309">put</span><span style="color:#555">(</span>SW360Utils<span style="color:#555">.</span><span style="color:#309">printName</span><span style="color:#555">(</span>release<span style="color:#555">),</span> release<span style="color:#555">.</span><span style="color:#309">getId</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> CommonUtils<span style="color:#555">.</span><span style="color:#309">getIdentifierToListOfDuplicates</span><span style="color:#555">(</span>releaseIdentifierToReleaseId<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><h4 id="tests">Tests</h4> +<p>We then write some tests in ComponentDatabaseHandlerTest.java</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#99f">@Test</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">testDuplicateComponentIsFound</span><span style="color:#555">()</span> <span style="color:#069;font-weight:bold">throws</span> Exception <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> String originalComponentId <span style="color:#555">=</span> <span style="color:#c30">&#34;C3&#34;</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> Component tmp <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">getComponent</span><span style="color:#555">(</span>originalComponentId<span style="color:#555">,</span> user1<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> tmp<span style="color:#555">.</span><span style="color:#309">unsetId</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> tmp<span style="color:#555">.</span><span style="color:#309">unsetRevision</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> String newComponentId <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">addComponent</span><span style="color:#555">(</span>tmp<span style="color:#555">,</span> email1<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> duplicateComponents <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">getDuplicateComponents</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> assertThat<span style="color:#555">(</span>duplicateComponents<span style="color:#555">.</span><span style="color:#309">size</span><span style="color:#555">(),</span> is<span style="color:#555">(</span>1<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span> assertThat<span style="color:#555">(</span>duplicateComponents<span style="color:#555">.</span><span style="color:#309">get</span><span style="color:#555">(</span>printName<span style="color:#555">(</span>tmp<span style="color:#555">)),</span> containsInAnyOrder<span style="color:#555">(</span>newComponentId<span style="color:#555">,</span>originalComponentId<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#99f">@Test</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">testDuplicateReleaseIsFound</span><span style="color:#555">()</span> <span style="color:#069;font-weight:bold">throws</span> Exception <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> String originalReleaseId <span style="color:#555">=</span> <span style="color:#c30">&#34;R1A&#34;</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> Release tmp <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">getRelease</span><span style="color:#555">(</span>originalReleaseId<span style="color:#555">,</span> user1<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> tmp<span style="color:#555">.</span><span style="color:#309">unsetId</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> tmp<span style="color:#555">.</span><span style="color:#309">unsetRevision</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> String newReleaseId <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">addRelease</span><span style="color:#555">(</span>tmp<span style="color:#555">,</span> email1<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> duplicateReleases <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">getDuplicateReleases</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> assertThat<span style="color:#555">(</span>duplicateReleases<span style="color:#555">.</span><span style="color:#309">size</span><span style="color:#555">(),</span> is<span style="color:#555">(</span>1<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span> assertThat<span style="color:#555">(</span>duplicateReleases<span style="color:#555">.</span><span style="color:#309">get</span><span style="color:#555">(</span>printName<span style="color:#555">(</span>tmp<span style="color:#555">)),</span> containsInAnyOrder<span style="color:#555">(</span>newReleaseId<span style="color:#555">,</span>originalReleaseId<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><p>Then we install the backend to make our methods available.</p> + + + + + + Docs: How to add a frontend portlet to sw360 + https://www.eclipse.org/sw360/docs/developers/dev-adding-a-new-portlet-frontend/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-adding-a-new-portlet-frontend/ + + + + <p>We create a class in</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360/src/frontend/sw360-portlets/src/main/java/com/siemens/sw360/portal/portlets/admin/ +</span></span></code></pre></div><p>called</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>DatabaseSanitation.java +</span></span></code></pre></div><p>Here are some code snippets that are important:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">DatabaseSanitation</span> <span style="color:#069;font-weight:bold">extends</span> Sw360Portlet +</span></span></code></pre></div><p>the base class Sw360Portlet adds some convenience methods to render the most common return values of functions into messages.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">doView</span><span style="color:#555">(</span>RenderRequest request<span style="color:#555">,</span> RenderResponse response<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> IOException<span style="color:#555">,</span> PortletException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic">// Proceed with page rendering +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"></span> <span style="color:#069;font-weight:bold">super</span><span style="color:#555">.</span><span style="color:#309">doView</span><span style="color:#555">(</span>request<span style="color:#555">,</span> response<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><p>This method is used to render different pages, a common pattern would be to have if/else tree like</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#09f;font-style:italic">//! VIEW and helpers +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"></span><span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">doView</span><span style="color:#555">(</span>RenderRequest request<span style="color:#555">,</span> RenderResponse response<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> IOException<span style="color:#555">,</span> PortletException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> String pageName <span style="color:#555">=</span> request<span style="color:#555">.</span><span style="color:#309">getParameter</span><span style="color:#555">(</span>PAGENAME<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(</span>PAGENAME_EDIT<span style="color:#555">.</span><span style="color:#309">equals</span><span style="color:#555">(</span>pageName<span style="color:#555">))</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> prepareVendorEdit<span style="color:#555">(</span>request<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> include<span style="color:#555">(</span><span style="color:#c30">&#34;/html/vendors/edit.jsp&#34;</span><span style="color:#555">,</span> request<span style="color:#555">,</span> response<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">else</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> prepareStandardView<span style="color:#555">(</span>request<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">super</span><span style="color:#555">.</span><span style="color:#309">doView</span><span style="color:#555">(</span>request<span style="color:#555">,</span> response<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><p>but since we only have one page this is all we need. The jsp that is rendered by super.doView is set in</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span>sw360<span style="color:#555">/</span>src<span style="color:#555">/</span>frontend<span style="color:#555">/</span>sw360<span style="color:#555">-</span>portlets<span style="color:#555">/</span>src<span style="color:#555">/</span>main<span style="color:#555">/</span>webapp<span style="color:#555">/</span>WEB<span style="color:#555">-</span>INF<span style="color:#555">/</span>portlet<span style="color:#555">.</span><span style="color:#309">xml</span> +</span></span></code></pre></div><p>but more on that later.</p> +<p>The next method in DatabaseSanitation handles resource requests, which are responses to AJAX calls:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>@Override +</span></span><span style="display:flex;"><span>public void serveResource(ResourceRequest request, ResourceResponse response) throws IOException, PortletException { +</span></span><span style="display:flex;"><span> String action = request.getParameter(PortalConstants.ACTION); +</span></span><span style="display:flex;"><span> if (PortalConstants.DUPLICATES.equals(action)) { +</span></span><span style="display:flex;"><span> serveDuplicates(request, response); +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>similar to the PAGENAME tree, here we have an ACTION if/else block. We only have one action, so this is simple.</p> +<p>Let&rsquo;s have a look at</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">private</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">serveDuplicates</span><span style="color:#555">(</span>ResourceRequest request<span style="color:#555">,</span> ResourceResponse response<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> IOException<span style="color:#555">,</span> PortletException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> duplicateComponents<span style="color:#555">=</span><span style="color:#069;font-weight:bold">null</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> duplicateReleases<span style="color:#555">=</span><span style="color:#069;font-weight:bold">null</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">try</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> ComponentService<span style="color:#555">.</span><span style="color:#309">Iface</span> componentClient <span style="color:#555">=</span> thriftClients<span style="color:#555">.</span><span style="color:#309">makeComponentClient</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> duplicateComponents <span style="color:#555">=</span> componentClient<span style="color:#555">.</span><span style="color:#309">getDuplicateComponents</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> duplicateReleases <span style="color:#555">=</span> componentClient<span style="color:#555">.</span><span style="color:#309">getDuplicateReleases</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">catch</span> <span style="color:#555">(</span>TException e<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> log<span style="color:#555">.</span><span style="color:#309">error</span><span style="color:#555">(</span><span style="color:#c30">&#34;Error in component client&#34;</span><span style="color:#555">,</span> e<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span><span style="color:#555">(</span>duplicateComponents<span style="color:#555">==</span> <span style="color:#069;font-weight:bold">null</span> <span style="color:#555">||</span> duplicateReleases<span style="color:#555">==</span><span style="color:#069;font-weight:bold">null</span><span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> renderRequestStatus<span style="color:#555">(</span>request<span style="color:#555">,</span>response<span style="color:#555">,</span> RequestStatus<span style="color:#555">.</span><span style="color:#309">FAILURE</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">else</span> <span style="color:#069;font-weight:bold">if</span><span style="color:#555">(</span>duplicateComponents<span style="color:#555">.</span><span style="color:#309">isEmpty</span><span style="color:#555">()</span> <span style="color:#555">&amp;&amp;</span> duplicateReleases<span style="color:#555">.</span><span style="color:#309">isEmpty</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> renderRequestStatus<span style="color:#555">(</span>request<span style="color:#555">,</span>response<span style="color:#555">,</span> RequestStatus<span style="color:#555">.</span><span style="color:#309">SUCCESS</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">else</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> request<span style="color:#555">.</span><span style="color:#309">setAttribute</span><span style="color:#555">(</span>PortalConstants<span style="color:#555">.</span><span style="color:#309">DUPLICATE_RELEASES</span><span style="color:#555">,</span> duplicateReleases<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> request<span style="color:#555">.</span><span style="color:#309">setAttribute</span><span style="color:#555">(</span>PortalConstants<span style="color:#555">.</span><span style="color:#309">DUPLICATE_COMPONENTS</span><span style="color:#555">,</span> duplicateComponents<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> include<span style="color:#555">(</span><span style="color:#c30">&#34;/html/admin/databaseSanitation/duplicatesAjax.jsp&#34;</span><span style="color:#555">,</span> request<span style="color:#555">,</span> response<span style="color:#555">,</span> PortletRequest<span style="color:#555">.</span><span style="color:#309">RESOURCE_PHASE</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><p>The member variable thriftClients is inherited from the Sw360Portlet. This is how we talk to the backend. +We call the methods that we wrote in the first part of the tutorial. +The error handling is reported with renderRequestStatus, also from Sw360Portlet. +When we have findings then we report them by rendering a jsp in the RESOURCE_PHASE. +This is then some html that our AJAX function gets as data.</p> +<p>Then we have to register the portlets in some xml files:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360/src/frontend/sw360-portlets/src/main/webapp/WEB-INF/liferay-display.xml +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;portlet</span> <span style="color:#309">id=</span><span style="color:#c30">&#34;databaseSanitation&#34;</span><span style="color:#309;font-weight:bold">/&gt;</span> +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360/src/frontend/sw360-portlets/src/main/webapp/WEB-INF/liferay-portlet.xml +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;portlet&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;portlet-name&gt;</span>databaseSanitation<span style="color:#309;font-weight:bold">&lt;/portlet-name&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;icon&gt;</span>/icon.png<span style="color:#309;font-weight:bold">&lt;/icon&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;instanceable&gt;</span>false<span style="color:#309;font-weight:bold">&lt;/instanceable&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;header-portlet-css&gt;</span>/css/main.css<span style="color:#309;font-weight:bold">&lt;/header-portlet-css&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;header-portlet-javascript&gt;</span>/js/main.js<span style="color:#309;font-weight:bold">&lt;/header-portlet-javascript&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;header-portlet-javascript&gt;</span>/js/external/jquery-1.11.1.min.js<span style="color:#309;font-weight:bold">&lt;/header-portlet-javascript&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;/portlet&gt;</span> +</span></span></code></pre></div><p>Note that here it is important to include things like jquery in this way so that on multiple portlet pages there are no namespace conflicts.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360/src/frontend/sw360-portlets/src/main/webapp/WEB-INF/portlet.xml +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;portlet&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;portlet-name&gt;</span>databaseSanitation<span style="color:#309;font-weight:bold">&lt;/portlet-name&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;display-name&gt;</span>databaseSanitation<span style="color:#309;font-weight:bold">&lt;/display-name&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;portlet-class&gt;</span> +</span></span><span style="display:flex;"><span> com.siemens.sw360.portal.portlets.admin.DatabaseSanitation +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/portlet-class&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;init-param&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;name&gt;</span>view-template<span style="color:#309;font-weight:bold">&lt;/name&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;value&gt;</span>/html/admin/databaseSanitation/view.jsp<span style="color:#309;font-weight:bold">&lt;/value&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/init-param&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;expiration-cache&gt;</span>0<span style="color:#309;font-weight:bold">&lt;/expiration-cache&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;supports&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;mime-type&gt;</span>text/html<span style="color:#309;font-weight:bold">&lt;/mime-type&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;portlet-mode&gt;</span>view<span style="color:#309;font-weight:bold">&lt;/portlet-mode&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/supports&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;portlet-info&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;title&gt;</span>databaseSanitation<span style="color:#309;font-weight:bold">&lt;/title&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;short-title&gt;</span>databaseSanitation<span style="color:#309;font-weight:bold">&lt;/short-title&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;keywords/&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/portlet-info&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;security-role-ref&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;role-name&gt;</span>administrator<span style="color:#309;font-weight:bold">&lt;/role-name&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/security-role-ref&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;/portlet&gt;</span> +</span></span></code></pre></div><p>After these changes we compile the frontend and then we have to add new page to the Layout and add it to the lar file. +We sign in as admin, +go to</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>Admin -&gt; Site administration +</span></span><span style="display:flex;"><span>-&gt; Private Pages +</span></span></code></pre></div><p>To add the portlet to the page, we first change the theme of Private Pages to Classic, then select Add Page. We can drag and drop it under the Admin Page. +Then we select the Private Pages under My Sites. +We can then go to the page we have just created. +On the left side there is a plus sign, which opens a side menu with the available portlets that we can add to our page. +Under SW360 we find the portlet DatabaseSanitation and we click add. +Then we can change the option (The cog symbol on the right) Look and Feel to Show Borders -&gt; No and we save that. +Then we change the theme of Private Pages back to SW360-Theme.</p> +<p>Now we can change the theme back and export a new lar file as described else where.</p> + + + + + + Docs: SW360 Development Branches + https://www.eclipse.org/sw360/docs/developers/dev-branches/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-branches/ + + + + <h2 id="branches-structure">Branches structure</h2> +<p><code>&lt;github-nickname&gt;/&lt;issue&gt;/&lt;description&gt;</code></p> +<h3 id="examples">Examples:</h3> +<ul> +<li>maierthomas/#1/fix-dowload-bundle</li> +<li>maierthomas/#3/sw360portal-specific-links</li> +</ul> + + + + + + Docs: How to add fields to an existing class + https://www.eclipse.org/sw360/docs/developers/dev-adding-new-fields-to-existing-classes/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-adding-new-fields-to-existing-classes/ + + + + <p>The license portlet is different from the other portlets as there is no Details/Edit page for each element. There is only a combined edit/view page. +We will add the license text to licenses in the thrift file:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-thrift" data-lang="thrift"><span style="display:flex;"><span><span style="color:#f60">13</span>:<span style="color:#bbb"> </span><span style="color:#069;font-weight:bold">optional</span><span style="color:#bbb"> </span><span style="color:#078;font-weight:bold">string</span><span style="color:#bbb"> </span>text;<span style="color:#bbb"> +</span></span></span></code></pre></div><p>To update the text we write a liferay Action in the LicensesPortlet:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#99f">@UsedAsLiferayAction</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">changeText</span><span style="color:#555">(</span>ActionRequest request<span style="color:#555">,</span> ActionResponse response<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> PortletException<span style="color:#555">,</span> IOException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> String licenseId <span style="color:#555">=</span> request<span style="color:#555">.</span><span style="color:#309">getParameter</span><span style="color:#555">(</span>LICENSE_ID<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> String text <span style="color:#555">=</span> request<span style="color:#555">.</span><span style="color:#309">getParameter</span><span style="color:#555">(</span>License<span style="color:#555">.</span><span style="color:#309">_Fields</span><span style="color:#555">.</span><span style="color:#309">TEXT</span><span style="color:#555">.</span><span style="color:#309">name</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span><span style="color:#555">(!</span>Strings<span style="color:#555">.</span><span style="color:#309">isNullOrEmpty</span><span style="color:#555">(</span>licenseId<span style="color:#555">))</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">try</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> User user <span style="color:#555">=</span> UserCacheHolder<span style="color:#555">.</span><span style="color:#309">getUserFromRequest</span><span style="color:#555">(</span>request<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> LicenseService<span style="color:#555">.</span><span style="color:#309">Iface</span> client <span style="color:#555">=</span> thriftClients<span style="color:#555">.</span><span style="color:#309">makeLicenseClient</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> License license <span style="color:#555">=</span> client<span style="color:#555">.</span><span style="color:#309">getFromID</span><span style="color:#555">(</span>licenseId<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> license<span style="color:#555">.</span><span style="color:#309">setText</span><span style="color:#555">(</span>CommonUtils<span style="color:#555">.</span><span style="color:#309">nullToEmptyString</span><span style="color:#555">(</span>text<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> RequestStatus requestStatus <span style="color:#555">=</span> client<span style="color:#555">.</span><span style="color:#309">updateLicense</span><span style="color:#555">(</span>license<span style="color:#555">,</span> user<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> renderRequestStatus<span style="color:#555">(</span>request<span style="color:#555">,</span>response<span style="color:#555">,</span>requestStatus<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">catch</span> <span style="color:#555">(</span>TException e<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> log<span style="color:#555">.</span><span style="color:#309">error</span><span style="color:#555">(</span><span style="color:#c30">&#34;Error updating license&#34;</span><span style="color:#555">,</span> e<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> response<span style="color:#555">.</span><span style="color:#309">setRenderParameter</span><span style="color:#555">(</span>LICENSE_ID<span style="color:#555">,</span> licenseId<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> response<span style="color:#555">.</span><span style="color:#309">setRenderParameter</span><span style="color:#555">(</span>PAGENAME<span style="color:#555">,</span> PAGENAME_DETAIL<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> response<span style="color:#555">.</span><span style="color:#309">setRenderParameter</span><span style="color:#555">(</span>SELECTED_TAB<span style="color:#555">,</span> <span style="color:#c30">&#34;LicenseText&#34;</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span></code></pre></div><p>To integrate it in the jsp we make the according changes, important to note is the ActionUrl that we define:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#309;font-weight:bold">portlet:actionURL</span> <span style="color:#309">var</span><span style="color:#555">=</span><span style="color:#c30">&#34;changeLicenseTextURL&#34;</span> <span style="color:#309">name</span><span style="color:#555">=</span><span style="color:#c30">&#34;changeText&#34;</span>&gt; +</span></span><span style="display:flex;"><span> &lt;<span style="color:#309;font-weight:bold">portlet:param</span> <span style="color:#309">name</span><span style="color:#555">=</span><span style="color:#c30">&#34;&lt;%=PortalConstants.LICENSE_ID%&gt;&#34;</span> <span style="color:#309">value</span><span style="color:#555">=</span><span style="color:#c30">&#34;${licenseDetail.id}&#34;</span> /&gt; +</span></span><span style="display:flex;"><span>&lt;/<span style="color:#309;font-weight:bold">portlet:actionURL</span>&gt; +</span></span></code></pre></div><p>A good practice to name fields in jsps is to use the thrift field names:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span> &lt;<span style="color:#309;font-weight:bold">textarea</span> <span style="color:#309">name</span><span style="color:#555">=</span><span style="color:#c30">&#34;&lt;portlet:namespace/&gt;&lt;%=License._Fields.TEXT%&gt;&#34;</span> <span style="color:#309">rows</span><span style="color:#555">=</span><span style="color:#c30">&#34;5&#34;</span> <span style="color:#309">style</span><span style="color:#555">=</span><span style="color:#c30">&#34;width: 100%&#34;</span> <span style="color:#309">id</span><span style="color:#555">=</span><span style="color:#c30">&#34;&lt;portlet:namespace/&gt;&lt;%=License._Fields.TEXT%&gt;&#34;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309">placeholder</span><span style="color:#555">=</span><span style="color:#c30">&#34;Enter the License-Text here...&#34;</span> +</span></span><span style="display:flex;"><span> &gt;${licenseDetail.text}&lt;/<span style="color:#309;font-weight:bold">textarea</span>&gt; +</span></span></code></pre></div> + + + + + Docs: CouchDB External Documents + https://www.eclipse.org/sw360/docs/developers/dev-external-documents-with-couchdb/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-external-documents-with-couchdb/ + + + + <h2 id="motivation">Motivation</h2> +<p>In some cases inline documents are not sufficient for storing extended information to a document. This is especially the case if these information might be relevant from outside as well. +Projects, components and releases contain attachments. The metadata of these attachments are stored as inline documents inside its parent document (which is the project, component or release). +However these attachments may be used by other documents as well, e.g. license info files which are attached to releases are used by projects to generate the overall license information for that project. +In such cases an external document might be the better model. For example the attachment usage can be stored along the metadata without touching the owner document on update.</p> +<h2 id="advantages-of-external-documents">Advantages of external documents</h2> +<ul> +<li>single documents with a clear separation to other documents</li> +<li>easy identification</li> +<li>might be loaded and updated standalone</li> +</ul> +<h2 id="advantages-of-internal-documents">Advantages of internal documents</h2> +<ul> +<li>Very fast loading along with the owner</li> +<li>Easy handling since only the owner must be loaded or updated</li> +</ul> +<p>In any case it is highly dependent on the use case whether external documents are to be favored over internal documents.</p> +<h2 id="possible-implementations-for-linked-documents">Possible implementations for linked documents</h2> +<h3 id="special-responsehandler-with-special-views-from-couchdb">Special ResponseHandler with special views from CouchDB</h3> +<table> +<thead> +<tr> +<th>Easy to use?</th> +<th>Performance?</th> +<th>Effort to use in existing code</th> +</tr> +</thead> +<tbody> +<tr> +<td>:star::star: Middle, special views have to be created, fields of data objects has to be annotated.</td> +<td>:star::star::star: Very good, fetching of multiple documents with a single request.</td> +<td>:star: High, since existing code has to be changed</td> +</tr> +</tbody> +</table> +<h4 id="couch-db-theory">Couch-DB theory</h4> +<p>At the time of writing, support of external (or linked) documents in Couch-DB is limited. Consider the following documents:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span>project <span style="color:#555">=</span> { +</span></span><span style="display:flex;"><span> _id<span style="color:#555">:</span> <span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> type<span style="color:#555">:</span> <span style="color:#c30">&#34;project&#34;</span>, +</span></span><span style="display:flex;"><span> name<span style="color:#555">:</span> <span style="color:#c30">&#34;Testproject&#34;</span>, +</span></span><span style="display:flex;"><span> attachments<span style="color:#555">:</span> [ +</span></span><span style="display:flex;"><span> { _id<span style="color:#555">:</span> <span style="color:#c30">&#34;a1&#34;</span> }, +</span></span><span style="display:flex;"><span> { _id<span style="color:#555">:</span> <span style="color:#c30">&#34;z2&#34;</span> } +</span></span><span style="display:flex;"><span> ] +</span></span><span style="display:flex;"><span>} +</span></span><span style="display:flex;"><span>attachment1 <span style="color:#555">=</span> { +</span></span><span style="display:flex;"><span> _id<span style="color:#555">:</span> <span style="color:#c30">&#34;a1&#34;</span>, +</span></span><span style="display:flex;"><span> type<span style="color:#555">:</span> <span style="color:#c30">&#34;attachment&#34;</span>, +</span></span><span style="display:flex;"><span> name<span style="color:#555">:</span> <span style="color:#c30">&#34;SourceFile&#34;</span>, +</span></span><span style="display:flex;"><span> sha1<span style="color:#555">:</span> <span style="color:#c30">&#34;abc1234&#34;</span> +</span></span><span style="display:flex;"><span>} +</span></span><span style="display:flex;"><span>attachment2 <span style="color:#555">=</span> { +</span></span><span style="display:flex;"><span> _id<span style="color:#555">:</span> <span style="color:#c30">&#34;a2&#34;</span>, +</span></span><span style="display:flex;"><span> type<span style="color:#555">:</span> <span style="color:#c30">&#34;attachment&#34;</span>, +</span></span><span style="display:flex;"><span> name<span style="color:#555">:</span> <span style="color:#c30">&#34;LicenseFile&#34;</span>, +</span></span><span style="display:flex;"><span> sha1<span style="color:#555">:</span> <span style="color:#c30">&#34;fed9876&#34;</span> +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>Unfortunately there is no way to get the project document with the attachments directly included. With the correct view you are able to retrieve all these documents in a single request:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">function</span>(doc) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span>(doc.type <span style="color:#555">===</span> <span style="color:#c30">&#34;attachment&#34;</span>) { +</span></span><span style="display:flex;"><span> emit(doc._id, <span style="color:#069;font-weight:bold">null</span>); +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span>(<span style="color:#069;font-weight:bold">var</span> <span style="color:#069;font-weight:bold">in</span> <span style="color:#069;font-weight:bold">in</span> doc.attachments) { +</span></span><span style="display:flex;"><span> emit(doc._id, { _id<span style="color:#555">:</span> doc.attachments[i]._id }); +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>You might see the trick: the project document as well as the attachment documents are indexed with the id of the project. This way you get all three documents when querying the view with the id of the project:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span>{ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;total_rows&#34;</span><span style="color:#555">:</span><span style="color:#f60">5</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;offset&#34;</span><span style="color:#555">:</span><span style="color:#f60">0</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;rows&#34;</span><span style="color:#555">:</span>[{ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;key&#34;</span><span style="color:#555">:</span> <span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;doc&#34;</span><span style="color:#555">:</span>{ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;_id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;attachments&#34;</span><span style="color:#555">:</span>[ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;a1&#34;</span>, <span style="color:#c30">&#34;a2&#34;</span> +</span></span><span style="display:flex;"><span> ], +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;name&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;Testproject&#34;</span>, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> }, { +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;doc&#34;</span><span style="color:#555">:</span>{ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;_id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;a1&#34;</span>, +</span></span><span style="display:flex;"><span> name<span style="color:#555">:</span> <span style="color:#c30">&#34;SourceFile&#34;</span>, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> }, { +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;key&#34;</span><span style="color:#555">:</span> <span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;value&#34;</span><span style="color:#555">:</span><span style="color:#069;font-weight:bold">null</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;doc&#34;</span><span style="color:#555">:</span>{ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;_id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;a2&#34;</span>, +</span></span><span style="display:flex;"><span> name<span style="color:#555">:</span> <span style="color:#c30">&#34;LicenseFile&#34;</span>, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> ] +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p><strong>Note</strong> is will only work if you query the view with <code>include_docs</code> set to <code>true</code>. +<strong>Note</strong> include_docs will only work at the top level of a value. In other words it will only recognize the following to situations:</p> +<ul> +<li>null: if the value is null, the document which is identified by the key is included</li> +<li>{ _id: &ldquo;&hellip;&rdquo; }: the document identified by the given id is included. +To be clear: transitive inclusions will not work! +<strong>Note</strong> See also <a href="https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Linked_documents">https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Linked_documents</a>.</li> +</ul> +<h3 id="implementation-with-ektorp">Implementation with Ektorp</h3> +<p><a href="https://github.com/eclipse/sw360/pull/596">https://github.com/eclipse/sw360/pull/596</a> show an implementation to transparently read such results from Couch-DB. It consists of:</p> +<ul> +<li>new methods in the database connector which are aware of loading linked documents</li> +<li>a response handler used for parsing the results when requesting linked documents</li> +<li>two annotation classes to mark fields which contain ids for linked documents +After the branch was merged, the new feature can be used in only three steps. You need:</li> +</ul> +<ol> +<li>A view that loads the &ldquo;main&rdquo; documents along with there linked documents</li> +<li>A special method in your database handler / database repository which calls the new method from the connector</li> +<li>A mixin for your data object which annotates the fields which contain ids to linked documents</li> +</ol> +<h4 id="notes-for-1">Notes for 1.</h4> +<p>Have a look at mapping function above in the theory section. Of course you may add more than one type of linked documents, e.g. not only attachments but releases as well. +You may also emit whole objects instead of ids only. This way Couch-DB does not have to lookup each entry. However including ids over objects is an own topic.</p> +<h4 id="notes-for-2">Notes for 2.</h4> +<p>You should write methods in your repository as well as in your database handler that uses the new methods from the database connector.</p> +<h4 id="notes-for-3">Notes for 3.</h4> +<p>Be sure that the used object mapper in your database handler is aware of the mixin. Of course you can annotate more than one field. All annotated fields will be respected on loading. However, if the view does not contain an object that should be resolved, it will be replaced by null. The LinkedDocuments-annotation even allows you to name a different destination field for the resolved objects for easier integration into the existing code.</p> +<h2 id="usage-with-ektorp">Usage with Ektorp</h2> +<table> +<thead> +<tr> +<th>Easy to use?</th> +<th>Performance?</th> +<th>Effort to use in existing code</th> +</tr> +</thead> +<tbody> +<tr> +<td>:no_entry: does not work</td> +<td>:no_entry:</td> +<td>:no_entry:</td> +</tr> +</tbody> +</table> +<p>Since SW360 is using Ektorp as Objectmapper, a response like above is not suitable. Ektorp is just not able to parse the above response correctly. +However Ektorp has a linking feature as well: You may annotate fields with the <code>@DocumentReference</code>-Annotation to tell Ektorp to store the content within external documents. This only works with fields of type <code>Set</code> at the moment of writing. Since SW360 data objects are generated using Thrift, directly annotating the field is not possible. Due to the mixin feature of Ektorp this is not a big issue. Unfortunately making the <code>@DocumentReference</code>-annotation to work was not possible with a reasonable effort.</p> +<p>Internally Ektorp is also using special views for getting linked documents to work. A quick look into the source codes suggests that this feature is implemented using special serializers which would lead to additional requests on loading and storing as well. Therefore the same performance issues might be come across if the annotation would work.</p> +<h3 id="own-serializerdeserzialer">Own serializer/deserzialer</h3> +<table> +<thead> +<tr> +<th>Easy to use?</th> +<th>Performance?</th> +<th>Effort to use in existing code</th> +</tr> +</thead> +<tbody> +<tr> +<td>:star::star::star: Quite easy, just some Jackson configuration necessary</td> +<td>:star::star: Good, but every type of linked objects needs an additional request</td> +<td>:star::star::star: Low, existing code does not have to be changed</td> +</tr> +</tbody> +</table> +<p>This method works just like the Ektorp way. In addition a slow transition from internal to external documents is possible, since the custom serialization methods will handle both cases directly. Any embedded documents will be externalized on first update of the owner object. +The following classes are needed:</p> +<ol> +<li>Repository for the new external documents</li> +<li>DatabaseHandler for the new external documents</li> +<li>Mixin-Class to add annotations to the field with external documents</li> +<li>A new mapper factory to properly configure the custom serializer</li> +<li>Custom serializers/deserializer</li> +</ol> +<h4 id="example-for-externalizing-attachments">Example for externalizing attachments</h4> +<h5 id="mixin-class">Mixin-Class</h5> +<p>This will configure Ektorp to use a special class for this field. We use a special serializer for the field instead of for the type (in this case Attachment), so we can do serialization/deserialization for all attachments at once. If we would use a special serializer, every</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">abstract</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">SplitAttachmentsMixin</span> <span style="color:#069;font-weight:bold">extends</span> DatabaseMixIn <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@JsonSerialize</span><span style="color:#555">(</span>using <span style="color:#555">=</span> AttachmentSetSerializer<span style="color:#555">.</span><span style="color:#309">class</span><span style="color:#555">)</span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@JsonDeserialize</span><span style="color:#555">(</span>using <span style="color:#555">=</span> AttachmentSetDeserializer<span style="color:#555">.</span><span style="color:#309">class</span><span style="color:#555">)</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">abstract</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">setAttachments</span><span style="color:#555">(</span>Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;</span> attachments<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><h5 id="mapper-factory">Mapper factory</h5> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">SplitAttachmentsMapperFactory</span> <span style="color:#069;font-weight:bold">extends</span> MapperFactory <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">final</span> AttachmentHandlerInstantiator handlerInitiator<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#c0f">SplitAttachmentsMapperFactory</span><span style="color:#555">(</span>Supplier<span style="color:#555">&lt;</span>HttpClient<span style="color:#555">&gt;</span> httpClient<span style="color:#555">,</span> String dbName<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> MalformedURLException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> handlerInitiator <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">new</span> AttachmentHandlerInstantiator<span style="color:#555">(</span>httpClient<span style="color:#555">,</span> dbName<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> ObjectMapper <span style="color:#c0f">createObjectMapper</span><span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> ObjectMapper objectMapper <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">super</span><span style="color:#555">.</span><span style="color:#309">createObjectMapper</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> objectMapper<span style="color:#555">.</span><span style="color:#309">addMixInAnnotations</span><span style="color:#555">(</span>Project<span style="color:#555">.</span><span style="color:#309">class</span><span style="color:#555">,</span> SplitAttachmentsMixin<span style="color:#555">.</span><span style="color:#309">class</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> objectMapper<span style="color:#555">.</span><span style="color:#309">setHandlerInstantiator</span><span style="color:#555">(</span>handlerInitiator<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> objectMapper<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">static</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">AttachmentHandlerInstantiator</span> <span style="color:#069;font-weight:bold">extends</span> HandlerInstantiator <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">final</span> AttachmentSetSerializer attachmentSetSerializer<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">final</span> AttachmentSetDeserializer attachmentSetDeserializer<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#c0f">AttachmentHandlerInstantiator</span><span style="color:#555">(</span>Supplier<span style="color:#555">&lt;</span>HttpClient<span style="color:#555">&gt;</span> httpClient<span style="color:#555">,</span> String dbName<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> MalformedURLException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> attachmentSetSerializer <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">new</span> AttachmentSetSerializer<span style="color:#555">(</span>httpClient<span style="color:#555">,</span> dbName<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> attachmentSetDeserializer <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">new</span> AttachmentSetDeserializer<span style="color:#555">(</span>httpClient<span style="color:#555">,</span> dbName<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> JsonDeserializer<span style="color:#555">&lt;?&gt;</span> deserializerInstance<span style="color:#555">(</span>DeserializationConfig config<span style="color:#555">,</span> Annotated annotated<span style="color:#555">,</span> Class<span style="color:#555">&lt;?&gt;</span> deserClass<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(</span>deserClass<span style="color:#555">.</span><span style="color:#309">isInstance</span><span style="color:#555">(</span>attachmentSetDeserializer<span style="color:#555">))</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> attachmentSetDeserializer<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> <span style="color:#069;font-weight:bold">null</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">...</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><h5 id="serializer">Serializer</h5> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">AttachmentSetSerializer</span> <span style="color:#069;font-weight:bold">extends</span> JsonSerializer<span style="color:#555">&lt;</span>Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;&gt;</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">final</span> AttachmentDatabaseHandler handler<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#c0f">AttachmentSetSerializer</span><span style="color:#555">(</span>Supplier<span style="color:#555">&lt;</span>HttpClient<span style="color:#555">&gt;</span> httpClient<span style="color:#555">,</span> String dbName<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> MalformedURLException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">this</span><span style="color:#555">.</span><span style="color:#309">handler</span> <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">new</span> AttachmentDatabaseHandler<span style="color:#555">(</span>httpClient<span style="color:#555">,</span> dbName<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">serialize</span><span style="color:#555">(</span>Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;</span> attachments<span style="color:#555">,</span> JsonGenerator jsonGenerator<span style="color:#555">,</span> SerializerProvider provider<span style="color:#555">)</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throws</span> IOException<span style="color:#555">,</span> JsonProcessingException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">try</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> List<span style="color:#555">&lt;</span>DocumentOperationResult<span style="color:#555">&gt;</span> results <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">bulkCreateOrUpdateAttachments</span><span style="color:#555">(</span>attachments<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(!</span>results<span style="color:#555">.</span><span style="color:#309">isEmpty</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throw</span> <span style="color:#069;font-weight:bold">new</span> IOException<span style="color:#555">(</span><span style="color:#c30">&#34;Cannot create or update attachments. Some failed: &#34;</span> <span style="color:#555">+</span> results<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">catch</span> <span style="color:#555">(</span>SW360Exception exception<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throw</span> <span style="color:#069;font-weight:bold">new</span> IOException<span style="color:#555">(</span><span style="color:#c30">&#34;Cannot create or update attachments.&#34;</span><span style="color:#555">,</span> exception<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> jsonGenerator<span style="color:#555">.</span><span style="color:#309">writeStartArray</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span> <span style="color:#555">(</span>Attachment attachment <span style="color:#555">:</span> attachments<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> jsonGenerator<span style="color:#555">.</span><span style="color:#309">writeStartObject</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> jsonGenerator<span style="color:#555">.</span><span style="color:#309">writeStringField</span><span style="color:#555">(</span><span style="color:#c30">&#34;_id&#34;</span><span style="color:#555">,</span> attachment<span style="color:#555">.</span><span style="color:#309">getId</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> jsonGenerator<span style="color:#555">.</span><span style="color:#309">writeEndObject</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> jsonGenerator<span style="color:#555">.</span><span style="color:#309">writeEndArray</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><h4 id="deserializer">Deserializer</h4> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">AttachmentSetDeserializer</span> <span style="color:#069;font-weight:bold">extends</span> JsonDeserializer<span style="color:#555">&lt;</span>Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;&gt;</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">final</span> AttachmentDatabaseHandler handler<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#c0f">AttachmentSetDeserializer</span><span style="color:#555">(</span>Supplier<span style="color:#555">&lt;</span>HttpClient<span style="color:#555">&gt;</span> httpClient<span style="color:#555">,</span> String dbName<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> MalformedURLException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">this</span><span style="color:#555">.</span><span style="color:#309">handler</span> <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">new</span> AttachmentDatabaseHandler<span style="color:#555">(</span>httpClient<span style="color:#555">,</span> dbName<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;</span> <span style="color:#c0f">deserialize</span><span style="color:#555">(</span>JsonParser jsonParser<span style="color:#555">,</span> DeserializationContext context<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> IOException<span style="color:#555">,</span> JsonProcessingException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;</span> attachments <span style="color:#555">=</span> Sets<span style="color:#555">.</span><span style="color:#309">newHashSet</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(!</span>jsonParser<span style="color:#555">.</span><span style="color:#309">isExpectedStartArrayToken</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throw</span> <span style="color:#069;font-weight:bold">new</span> IllegalStateException<span style="color:#555">(</span><span style="color:#c30">&#34;Expected array token but found: &#34;</span> <span style="color:#555">+</span> jsonParser<span style="color:#555">.</span><span style="color:#309">getCurrentToken</span><span style="color:#555">().</span><span style="color:#309">asString</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> Set<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;</span> attachmentIds <span style="color:#555">=</span> Sets<span style="color:#555">.</span><span style="color:#309">newHashSet</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> JsonToken token <span style="color:#555">=</span> jsonParser<span style="color:#555">.</span><span style="color:#309">nextToken</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">while</span> <span style="color:#555">(!</span>JsonToken<span style="color:#555">.</span><span style="color:#309">END_ARRAY</span><span style="color:#555">.</span><span style="color:#309">equals</span><span style="color:#555">(</span>token<span style="color:#555">))</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">switch</span> <span style="color:#555">(</span>token<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">case</span> START_OBJECT<span style="color:#555">:</span> +</span></span><span style="display:flex;"><span> Attachment attachment <span style="color:#555">=</span> jsonParser<span style="color:#555">.</span><span style="color:#309">readValueAs</span><span style="color:#555">(</span>Attachment<span style="color:#555">.</span><span style="color:#309">class</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(</span>attachment<span style="color:#555">.</span><span style="color:#309">isSetId</span><span style="color:#555">()</span> <span style="color:#555">&amp;&amp;</span> <span style="color:#555">!</span>attachment<span style="color:#555">.</span><span style="color:#309">isSetRevision</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> attachmentIds<span style="color:#555">.</span><span style="color:#309">add</span><span style="color:#555">(</span>attachment<span style="color:#555">.</span><span style="color:#309">getId</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">else</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> attachments<span style="color:#555">.</span><span style="color:#309">add</span><span style="color:#555">(</span>attachment<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">break</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span><span style="color:#99f"> +</span></span></span><span style="display:flex;"><span><span style="color:#99f"> default:</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throw</span> <span style="color:#069;font-weight:bold">new</span> IllegalStateException<span style="color:#555">(</span> +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;Unexpected token. Expected object or string but found: &#34;</span> <span style="color:#555">+</span> jsonParser<span style="color:#555">.</span><span style="color:#309">getCurrentToken</span><span style="color:#555">().</span><span style="color:#309">asString</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> token <span style="color:#555">=</span> jsonParser<span style="color:#555">.</span><span style="color:#309">nextToken</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(!</span>attachmentIds<span style="color:#555">.</span><span style="color:#309">isEmpty</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">try</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> attachments<span style="color:#555">.</span><span style="color:#309">addAll</span><span style="color:#555">(</span>handler<span style="color:#555">.</span><span style="color:#309">retrieveAttachments</span><span style="color:#555">(</span>attachmentIds<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">catch</span> <span style="color:#555">(</span>SW360Exception exception<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throw</span> <span style="color:#069;font-weight:bold">new</span> IOException<span style="color:#555">(</span><span style="color:#c30">&#34;Cannot load attachments (&#34;</span> <span style="color:#555">+</span> attachmentIds <span style="color:#555">+</span> <span style="color:#c30">&#34;)&#34;</span><span style="color:#555">,</span> exception<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> attachments<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div> + + + + + Docs: Database migration using Costco + https://www.eclipse.org/sw360/docs/developers/dev-database-migration-using-costco/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-database-migration-using-costco/ + + + + <h3 id="praeamble">Praeamble</h3> +<p>Please note that database migrations are done now in python scripts at</p> +<blockquote> +<p><a href="https://github.com/eclipse/sw360/tree/master/scripts/migrations">https://github.com/eclipse/sw360/tree/master/scripts/migrations</a></p> +</blockquote> +<p>keeping the following page because Costco might be useful for development / testing / quick adaptations.</p> +<h3 id="problem">Problem</h3> +<p>The main problem with changing field names in thrift is that existing documents in the couchdb need adjustments. Unfortunately, the futon interface of the couchdb does not offer bulk edits. As a consequence, looking into every document is tedious, for more than 100 documents, maybe unfeasible.</p> +<h3 id="solution">Solution</h3> +<p>Use costco, an open source project that</p> +<ul> +<li>is a couchapp (right, this implies that you install the couchapp environment)</li> +<li>offers a Web interface as sub path of the couchdb database</li> +<li>allows to iterate through the documents of a database and then apply modifications on a particular document</li> +<li>allows to perform modifications on documents using Java script</li> +</ul> +<p>More information</p> +<ul> +<li>Project website: <a href="https://github.com/harthur/costco">https://github.com/harthur/costco</a></li> +<li>Useful examples: <a href="http://harthur.github.io/costco/">http://harthur.github.io/costco/</a></li> +</ul> +<p>Note that costco does not allow to perform operations involving several documents at once, for example, setting values in one document that results from querying from several other documents. Costco is perfect for corrections on the couchdb document &lsquo;schema&rsquo; (not in the classic sense as there is no schema in couchdb).</p> +<h3 id="troubleshooting">Troubleshooting</h3> +<p>If you try to install costco, you try to install couchapp mst likely. However, it might be that some python packages are missing which results in a &rsquo;not-so-obvious&rsquo; python error during install of couchapp. The following line could be th dependencies that you might need:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>sudo apt-get install python-dev libxml2-dev libxslt-dev +</span></span></code></pre></div><h3 id="cheat-sheet-installing-costco-inside-an-sw360vagrant-deployment">Cheat Sheet: Installing costco inside an sw360vagrant deployment</h3> +<p>OK, if you read until here, to make it easy for you just the few lines to have executed to install costco when youi have a machine that is deployed with our vagrant:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>$ sudo apt-get install python-dev libxml2-dev libxslt-dev +</span></span><span style="display:flex;"><span>$ sudo pip install couchapp +</span></span><span style="display:flex;"><span>$ git clone http://github.com/harthur/costco.git +</span></span><span style="display:flex;"><span>$ <span style="color:#366">cd</span> costco +</span></span><span style="display:flex;"><span>$ couchapp push . http://localhost:5984/sw360db +</span></span></code></pre></div><h3 id="examples-in-sw360">Examples in sw360</h3> +<p>The following examples show some costco code from the use with sw360.</p> +<h4 id="renaming-a-key">Renaming a key</h4> +<p>In order to rename a field&rsquo;s key, the following code might be helpful. In the following example, the field&rsquo;s key <code>developement</code> into <code>development</code> (correcting a typo in the datamodel).</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JavaScript" data-lang="JavaScript"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">function</span>(doc) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span>(doc.type <span style="color:#555">==</span> <span style="color:#c30">&#39;todo&#39;</span>) { +</span></span><span style="display:flex;"><span> doc.development <span style="color:#555">=</span> doc.developement; +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">delete</span> doc.developement; +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> doc; +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><h4 id="renaming-a-key-in-a-subdocument">Renaming a key in a subdocument</h4> +<p>Similar thing as above, rename a key from <code>comment</code> to <code>createdcomment</code>, but this time inside a nested list of documents.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JavaScript" data-lang="JavaScript"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">function</span>(doc) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> (doc.type <span style="color:#555">==</span> <span style="color:#c30">&#39;release&#39;</span>) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span> (<span style="color:#069;font-weight:bold">var</span> f <span style="color:#555">=</span> <span style="color:#f60">0</span>, len <span style="color:#555">=</span> doc.attachments.length; f <span style="color:#555">&lt;</span> len; f <span style="color:#555">+=</span><span style="color:#f60">1</span> ) { +</span></span><span style="display:flex;"><span> doc.attachments[f].createdComment <span style="color:#555">=</span> doc.attachments[f].comment; +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">delete</span> doc.attachments[f].comment; +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> doc; +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><h3 id="more-javascript-examples-with-couchdb">More JavaScript Examples with CouchDB</h3> +<p>In addition to costco, also the couchdb map-reduce functions can help to track down issues in the data sets.</p> +<p>The following example searched for attachments of type <code>SOURCE</code> at releases, which do not have the <code>createdBy</code> set:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JavaScript" data-lang="JavaScript"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">function</span>(doc) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> ((doc.type <span style="color:#555">==</span> <span style="color:#c30">&#39;release&#39;</span>) +</span></span><span style="display:flex;"><span> <span style="color:#555">&amp;&amp;</span> (doc.attachments)) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span> (<span style="color:#069;font-weight:bold">var</span> attachment <span style="color:#069;font-weight:bold">in</span> doc.attachments) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> (<span style="color:#555">!</span>doc.attachments[attachment].createdBy) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> (doc.attachments[attachment].attachmentType<span style="color:#555">==</span> <span style="color:#c30">&#39;SOURCE&#39;</span>) { +</span></span><span style="display:flex;"><span> emit(doc._id, doc.attachments[attachment].filename); +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>The following example looks into date fields, in this case <code>createdOn</code>, and checks if it uses dots (for changing them into dashes).</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JavaScript" data-lang="JavaScript"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">function</span>(doc) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span>( +</span></span><span style="display:flex;"><span> (doc.type <span style="color:#555">==</span> <span style="color:#c30">&#39;release&#39;</span>) +</span></span><span style="display:flex;"><span> <span style="color:#555">&amp;&amp;</span> (doc.createdOn.indexOf(<span style="color:#c30">&#39;.&#39;</span>) <span style="color:#555">!==</span> <span style="color:#555">-</span><span style="color:#f60">1</span>) +</span></span><span style="display:flex;"><span> ) +</span></span><span style="display:flex;"><span> { +</span></span><span style="display:flex;"><span> emit(doc.name, doc) +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div> + + + + + Docs: Definition of Done + https://www.eclipse.org/sw360/docs/developers/dev-dod-and-style/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-dod-and-style/ + + + + <h3 id="policy">Policy</h3> +<ul> +<li>Review points should involve one person from another angle (not just the person you were sitting together with anyways)</li> +<li>Limit items in review to 5, try to coordinate</li> +<li>Using Github assignments to issues or pull requests</li> +<li>Open review items require conversation</li> +</ul> +<h1 id="definition-of-done">Definition of Done</h1> +<ul> +<li> +<p>File headers in file OK</p> +<ul> +<li>EPL-2.0 license header</li> +<li>Or, if the file is too small, configuration file: license note (see code style)</li> +<li>Copyright and author</li> +</ul> +</li> +<li> +<p>Create Branches for sw360</p> +<ul> +<li>Please use conventional branch names for sw360 (<a href="https://github.com/eclipse/sw360/wiki/Dev-Branches">Dev-Branches</a>)</li> +</ul> +</li> +<li> +<p>Avoid (serious) compiler warnings</p> +<ul> +<li>Squash your commits into one or more logical units of work. No dozens of hourly/daily commits in your pull request, please</li> +<li>Rebase onto current master so that a fast forward merge is possible</li> +<li>That means that merge to master is prepared</li> +</ul> +</li> +<li> +<p>use conventional change log for commit messages (<a href="https://github.com/eclipse/sw360/wiki/Dev-Semantic-Commits">Dev-Semantic-Commits</a>) <br> For more information please go to <a href="https://conventionalcommits.org/">https://conventionalcommits.org/</a></p> +</li> +<li> +<p>No breaking test</p> +<ul> +<li>Unit testing as it is already present</li> +<li>You have more - use them!</li> +</ul> +</li> +<li> +<p>New test</p> +<ul> +<li>For new / added functionality</li> +</ul> +</li> +<li> +<p>Documentation</p> +<ul> +<li>in the Githuib Wiki-Section, if you have done something new</li> +<li>At least a technical note for newly added functionality</li> +</ul> +</li> +<li> +<p>Commit style</p> +<ul> +<li>try to squash commits. In the ideal case, a feature is contained in one commit.</li> +<li>try to use conventional changelog for commit messages. (<a href="https://github.com/eclipse/sw360/wiki/Dev-Semantic-Commits">Dev-Semantic-Commits</a>)</li> +</ul> +</li> +</ul> +<h1 id="review">Review</h1> +<p>Review basically checks for the D-o-D items, in particular</p> +<ul> +<li>Code style, not really formatting, but issues like style attributes in HTML tags or exception handling useful</li> +<li>Design / architecture issues</li> +<li>Community contribution suitability</li> +<li>Issue coverage (does it actually solve the problem?)</li> +<li>Add to commit message of merge commit explicitly:</li> +</ul> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>review-by:email@domain.com +</span></span></code></pre></div><p>and</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>tested-by:email@domain.com +</span></span></code></pre></div><h1 id="licensing-and-file-header">Licensing and File Header</h1> +<p>All files contributed require headers - this will ensure the license and copyright clearing at the end. Also, all contributions must have the same license as the original source.</p> +<p>If a file has relevant functionality, note that we should move to Eclipse 2.0</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Java" data-lang="Java"><span style="display:flex;"><span><span style="color:#09f;font-style:italic">/* +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * Copyright COPYRIGHT HOLDER, 2017. +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * Copyright NEXT COPYRIGHT HOLDER, 2017. +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * Part of the SW360 Portal Project. +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * SPDX-License-Identifier: EPL-1.0 +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * All rights reserved. This program and the accompanying materials +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * are made available under the terms of the Eclipse Public License v1.0 +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * which accompanies this distribution, and is available at +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * http://www.eclipse.org/legal/epl-v10.html +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> */</span> +</span></span></code></pre></div><p>(please adapt comment characters usage)</p> +<p>For small files such as property files, configuration files or standard XML files:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Copyright &lt;COPYRIGHT_HOLDER&gt;, &lt;YEAR&gt;. Part of the SW360 Portal Project.</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic">#</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># All rights reserved. This configuration file is provided to you under the</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># terms and conditions of the Eclipse Distribution License v1.0 which</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># accompanies this distribution, and is available at</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># http://www.eclipse.org/org/documents/edl-v10.php</span> +</span></span></code></pre></div><h1 id="code-style">Code style</h1> +<p>Just use the standard Java formatting rules of your IDE and <strong>do not reformat</strong> code from others, because you like to correct formatting of other&rsquo;s code.</p> + + + + + + Docs: Filtering in Portlets + https://www.eclipse.org/sw360/docs/developers/dev-filtering-in-portlets/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-filtering-in-portlets/ + + + + <p>For the filters that are shown for components and listings, there are some options:</p> +<ol> +<li> +<p>The <strong>Keyword search</strong> works directly on the table shown on the main right area. For example in the components portlet, this is in components/view.jsp.</p> +</li> +<li> +<p>The <strong>filters</strong> actually result in a new search request, when hitting apply filters button. The project portlet reads the fields and creates a map. Then, <code>ProjectPortlet</code> calls the thrift service <code>refineSearch()</code>, which is handled in <code>ProjectHandler</code>. This method takes the map and the user as input. The search service has a server-side JavaScript function (LuceneSearchView) defined for this particular filter in <code>ProjectSearchHandler.java</code>. This is called with the <code>LuceneAwareDatabaseConnector.java</code>. After filtering, the visibility constraints for the requesting user are applied.</p> +</li> +<li> +<p>Then for each release table, there is a search field in the upper right corner. This again works on the data of the Release summary object and then filters what is on the client (web browser).</p> +</li> +</ol> + + + + + + Docs: Fossology Integration + https://www.eclipse.org/sw360/docs/developers/dev-fossology-integration/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-fossology-integration/ + + + + <p>Basic communication with the FOSSology server is done over an SSH connection: the fossology service of SW360 executes remote commands on the FOSSology server.</p> +<p>The commands that are executed are the bash scripts found inside <code>src-fossology/src/main/resources/scripts/</code>, they are copied into the home directory of the ssh user (either manually or through the admin portlet). +See <a href="Fossology-Setup">Setup of connection with Fossology</a> for configuration details.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>\- src-fossology/src/main/resources/ +</span></span><span style="display:flex;"><span> \- scripts/ +</span></span><span style="display:flex;"><span> |- duplicateUpload +</span></span><span style="display:flex;"><span> |- folderManager +</span></span><span style="display:flex;"><span> |- getStatusOfUpload +</span></span><span style="display:flex;"><span> |- uploadFromSW360 +</span></span><span style="display:flex;"><span> \- utilsSW360 +</span></span></code></pre></div><p>These scripts utilize the standard command line tools to interact natively with FOSSology (these are the tools found in the src/cli folder of FOSSology, such as <code>cp2foss fossjobs fossupload_status fo_usergroup fo_chmod fo_folder ...</code>).</p> +<ul> +<li><code>utilsSW360</code> contains common functions used by the other scripts and some FOSSology configuration such as the user/password pair used to run the cli utils and the UNIX group of the FOSSology processes</li> +<li><code>folderManager</code> (uses FO:<code>fo_folder</code>): get information about the folder structure of FOSSology to allow sharing of uploads between groups</li> +<li><code>getStatusOfUpload</code> (uses FO:<code>fossupload_status</code>): to get the clearing status given an uploadId and a group</li> +<li><code>uploadFromSW360</code> (uses FO:<code>cp2foss fossjobs</code>): to create a new upload from the standard input and schedule scanners</li> +<li><code>duplicateUpload</code> (uses FO:<code>fo_chmod</code> SW:<code>folderManager</code>): to make a previously uploaded file available for another group</li> +</ul> +<h3 id="java-libraries-and-settings">Java libraries and settings</h3> +<p>The java code utilizes the package <code>com.jcraft.jsch</code> to connect to the SSH server. It is set to strictly check the fingerprint of the remote server against the accepted which are stored in couchDB.</p> +<h3 id="conventions">Conventions</h3> +<p>the sw360 user in FOSSology (the actual name is configured in <code>utilsSW360</code>) <strong>must be a member of every group</strong> to which it should be able to send Releases to be cleared. +File uploaded from SW360 are placed inside a folder with the same name as the group and permission will be set at the group level (default of cp2foss).</p> +<h3 id="datamodel-and-thrift-service">Datamodel and thrift service</h3> +<ul> +<li> +<p>each Release object in SW360 can have only one attachment of type SOURCE.</p> +</li> +<li> +<p>when a Release is sent <em>for the first time</em> to FOSSology through the Thrift method <code>sendToFossology(1: string releaseId, 2: string clearingTeam )</code> its SOURCE attachement is sent as stdin to the script <code>uploadFromSW360</code>.</p> +<p>The field <code>map&lt;string, FossologyStatus&gt; clearingTeamToFossologyStatus</code> is then updated to contain the corresponding entry for the chosen Clearing Team (aka. the name of the FOSSology group which will receives the upload for clearing).</p> +</li> +<li> +<p>when the same Release is <em>sent again for another team</em> a new <em>link</em> in the corresponding group folder is created and the old upload is made available for the new group (as in giving permission using FO:<code>fo_chmod</code>).</p> +<p>At the moment this gives access only to the files, not to the relative clearing decision. +In order to make the clearing decisions available a reuser needs to be scheduled from the Jobs menu. [ it could be possible to schedule the job from SW360: its user is member of all the groups; but it is not currently implemented since there is no cli interface for reuser yet ]</p> +</li> +<li> +<p>when the current status is requested using the Thrift method <code>Release getStatusInFossology(1: string releaseId, 2: string clearingTeam )</code> the newest status is fetched from FOSSology and it is stored in the map for the relative clearingTeam</p> +</li> +</ul> +<h3 id="notes">Notes</h3> +<ul> +<li>Releases have a ClearingState field, but this is ignored by the Thrift service and used only in the SW360 user interface.</li> +<li>Projects link to Releases and the summary of their FOSSology status can be monitored. This is also ignored by the FOSSology Thrift service and handled by the Component service: the FOSSology service just updates the status of the Release objects.</li> +</ul> + + + + + + Docs: Liferay Friendly + https://www.eclipse.org/sw360/docs/developers/dev-liferay-friendly-url/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-liferay-friendly-url/ + + + + <p>The normal generated portlet URLs containing a set of internal Liferay request parameters. <br> +These long URLs of links or forms are mostly not readable and its not easy to share it somewhere else.</p> +<p>General Liferay portlet URL: <br></p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://localhost:8080/web/guest/examples?p_p_id=example_WAR_ExamplePortlet&amp;p_p_lifecycle=1&amp;p_p_state=normal&amp;p_p_mode=view&amp;p_p_col_id=column-1&amp;p_p_col_count=1&amp;_example_WAR_ExamplePortlet_javax.portlet.action=new +</span></span></code></pre></div><p>Explanation of the Liferay request parameters: <br> +<strong>p_p_id:</strong> The portlet ID (example_WAR_ExamplePortlet)<br> +<strong>p_p_state:</strong> Liferay windows pages state - 1 (normal) 2 (maximize) 3 (minimize) <br> +<strong>p_p_mode</strong>: Mode of the portlet look like - (view) (edit) (help) <br> +<strong>p_p_lifecycle:</strong> This is life cycle of portlet - 0 (render) 1 (action) 2 (server) <br> +<strong>p_p_col_id:</strong> The reference ID of the column in Liferay template <br> +<strong>p_p_col_pos:</strong> Specifiy the column position if the the layout having more than one columns <br> +<strong>p_p_col_count:</strong> Shows the no of columns in the current layout</p> +<h3 id="friendly-url-mapper-configuration">Friendly URL Mapper configuration</h3> +<p>Liferay provides a mechanism to shorten the generated URLs by using the Friendly URL Mapper feature. <br> <br> +How to configure the friendly URL Mapper in Liferay? <br> <br> +<strong>Configuration of URL routes in XML files</strong> <br></p> +<p><em>CREATE example-friendly-url-routes.xml</em> <br></p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Xml" data-lang="Xml"><span style="display:flex;"><span><span style="color:#099">&lt;?xml version=&#34;1.0&#34;?&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#099">&lt;!DOCTYPE routes PUBLIC &#34;-//Liferay//DTD Friendly URL Routes 6.2.2//EN&#34; +</span></span></span><span style="display:flex;"><span><span style="color:#099">&#34;http://www.liferay.com/dtd/liferay-friendly-url-routes_6_0_0.dtd&#34;&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;routes&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;route&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;pattern&gt;</span>/action/{actionName}<span style="color:#309;font-weight:bold">&lt;/pattern&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;generated-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;javax.portlet.action&#34;</span><span style="color:#309;font-weight:bold">&gt;</span>{actionName}<span style="color:#309;font-weight:bold">&lt;/generated-parameter&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;ignored-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;p_auth&#34;</span><span style="color:#309;font-weight:bold">/&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;ignored-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;p_p_id&#34;</span><span style="color:#309;font-weight:bold">/&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;implicit-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;p_p_lifecycle&#34;</span><span style="color:#309;font-weight:bold">&gt;</span>1<span style="color:#309;font-weight:bold">&lt;/implicit-parameter&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;implicit-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;p_p_state&#34;</span><span style="color:#309;font-weight:bold">&gt;</span>normal<span style="color:#309;font-weight:bold">&lt;/implicit-parameter&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;implicit-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;p_p_mode&#34;</span><span style="color:#309;font-weight:bold">&gt;</span>view<span style="color:#309;font-weight:bold">&lt;/implicit-parameter&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/route&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;/routes&gt;</span> +</span></span></code></pre></div><p>Explanation of the Liferay Friendly Mapper route parameters: <br> +<strong>routes:</strong> Routes element which contains all route entries <br> +<strong>route:</strong> Single route element entry <br> +<strong>pattern:</strong> Pattern of the mapped friendly URL (visible in address bar) <br> +<strong>generated-parameter:</strong> These parameters will be generated from parameters in the request URL <br> +<strong>ignored-parameter:</strong> These parameters will be igored and not included in generated URLs <br> +<strong>implicit-parameter:</strong> Used for static attributes which can be ignored by recognition <br> +<strong>overridden-parameter:</strong> Parameter that should be set to a certain value when a URL is recognized <br> +<br> +It is necessary to order the parameters as described above. <br> +These files should located in the resources folder otherwise they will not be available on Apache Tomcat and cannot be initialized by Liferay. <br> +<br> +<strong>Configuration of friendly URL Java class</strong> <br> +<br> +<em>MODIFY liferay-portlet.xml</em> +<br></p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Xml" data-lang="Xml"><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;friendly-url-mapper-class&gt;</span>com.liferay.portal.kernel.portlet.DefaultFriendlyURLMapper<span style="color:#309;font-weight:bold">&lt;/friendly-url-mapper-class&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;friendly-url-mapping&gt;</span>example<span style="color:#309;font-weight:bold">&lt;/friendly-url-mapping&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;friendly-url-routes&gt;</span>com/.../example-friendly-url-routes.xml<span style="color:#309;font-weight:bold">&lt;/friendly-url-routes&gt;</span> +</span></span></code></pre></div><br> +In the next step we need one java implementation class to generate the Liferay friendly URLs. <br> +<p>Liferay provides the <em>DefaultFriendlyURLMapper</em> class to create the URLs based on our rules. <br></p> +<p>The Liferay Friendly URL Mapper configuration is placed after <code>&lt;icon/&gt;</code> and before <code>&lt;instanceable&gt;</code> +tag.</p> +<h3 id="friendly-url-mapper-outcome">Friendly URL Mapper outcome</h3> +<p><strong>Liferay will generate the following friendly URL</strong> <br></p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>http://localhost:8080/web/guest/examples/-/example/action/new +</span></span></code></pre></div><br> +<ol> +<li>The liferay framework will add &ldquo;-&rdquo; (dash)</li> +<li>Friendly URL mapper name which is configured in <code>&lt;friendly-url-mapping&gt;</code> (liferay-portlet.xml) element</li> +<li>Pattern name with generated parameters which is same as in <code>&lt;pattern&gt;</code> (example-friendly-url-routes.xml) defined.</li> +</ol> +<h3 id="additional">Additional</h3> +<p>Friendly URL Mapper functionality is not working if the portletURL API is used to generate the Liferay URL in local Javascript. <br> +It is helpful to generate <code>&lt;portlet:renderURL&gt;</code> placeholder and replace them by using dummy values.</p> + + + + + + Docs: Moderation Requests + https://www.eclipse.org/sw360/docs/developers/dev-moderation-requests/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-moderation-requests/ + + + + <p>The concept of moderation is good for two things:</p> +<ul> +<li>to cope with a large number of potential edits on documents.</li> +<li>to allow every user to propose edits.</li> +</ul> +<p>Allowing every user to edit opposed to propose edits would lad to a large number of changes, potentially, not making everyone happy. As such, the changes should be reviewed by an experienced person and can be then approved.</p> +<h2 id="application-flow">Application Flow</h2> +<p>A user changes a moderated document, which are component, release, project and todo&rsquo;s of licenses (and the white list):</p> +<ul> +<li> +<p>The user switches in edit mode and applies a change.</p> +</li> +<li> +<p>The user submits the change by clicking &ldquo;Update &hellip;&rdquo;</p> +</li> +<li> +<p>The application checks, if the permissions are sufficient</p> +</li> +<li> +<p>For sufficient permissions, see here: <a href="https://github.com/siemens/sw360portal/wiki/Dev-Role-Authorisation-Model">https://github.com/siemens/sw360portal/wiki/Dev-Role-Authorisation-Model</a></p> +</li> +<li> +<p>If the permissions do not allow the edit right away, a moderation request is created.</p> +</li> +<li> +<p>Moderators can see the moderation request in the moderation portlet</p> +</li> +<li> +<p>Having selected the moderation request, the moderator can accept the request, decline, postpone or remove himself from the list of moderators</p> +</li> +</ul> +<h2 id="technical-description">Technical Description</h2> +<h3 id="checking-document-permissions">Checking Document Permissions</h3> +<p>If a moderation requests needs to be created, because the user does not have sufficient permissions:</p> +<ul> +<li>The request goes through the stack, for example: project portlet, project handler, project database handler.</li> +<li>Then the project database handler checks for permissions using <code>makePermission()</code> (<code>DocumentPermission</code> is the base class, then <code>ProjectPermissions</code> is the referring here for projects) and <code>isActionAllowed()</code>.</li> +<li>For moderation requests, we assume that this action is not allowed. Then, the <code>ProjectModerator</code> is called (see package <code>...sw360.datahandler.entitlement</code>).</li> +<li>This class (which is part of the project service) creates a thrift client to the moderation service (also on the backend) and creates a moderation request using this client.</li> +</ul> +<p>Every moderation request is created using the thrift-based API.</p> +<h3 id="writing-a-moderation-request-to-the-database">Writing a Moderation Request to the Database</h3> +<p>The generation of moderation request is performed by the moderation service. The moderation service handles incoming request in the following way:</p> +<ul> +<li>The requests arrives in the <code>ModerationDatabaseHandler</code>.</li> +<li>This handler writes the request to the database.</li> +</ul> +<h3 id="creation-details-in-the-service">Creation Details in the Service</h3> +<p>The handler writes one moderation request per user and document. If a moderation request from the same user for the same document exists, added moderation requests are merged. Or, the request is new either with a new user, new document or both, then the moderation request is created.</p> +<p>Each moderation requests has recipients, the moderators. The moderation database handler selects the moderators depending on the document type, which are usually the creator of the document and the listed moderators for this document. See details in the <code>ModerationDatabaseHandler</code> class. At the same location the check for deletion is performed.</p> +<h3 id="what-is-in-the-database">What is in the Database?</h3> +<p>The moderation request is a document in the couchdb. Technically, the moderation requests holds the affected document as field where the values is a nested JSON dictionary.</p> +<p>The following screen shot shows an example for a moderation request for a project.</p> +<p><img src="https://raw.githubusercontent.com/wiki/siemens/sw360portal/images/036-oss-sw360-20160310-screenshot-moderation-reqeust-document-example.png" alt="Example Moderation Request in Database"></p> +<h3 id="evaluating-the-moderation-request">Evaluating the Moderation Request</h3> +<p>On the moderation portlet all moderations will be shown, for which the user is a moderator. +Only open moderation requests can be selected. Approved and declined moderation requests will only be shown. +On selecting the moderation requests, both documents (original and the updated out of the moderation request) will be compared in the <code>merge.jsp</code> and all differences will be shown to the moderator. This is done via tags such as the <code>sw360:CompareProject</code>-tag. Opening the detailed view of the moderation request changes the state to <code>in progress</code> to show other moderators that the moderation request is in work.</p> +<p>The following actions are possible:</p> +<ul> +<li><code>Accept request</code>: the document within the moderation request will be accepted and written to the DB via e.g. the <code>ProjectService</code>. The state is set to <code>ACCEPTED</code>.</li> +<li><code>Remove Me from Moderators</code>: the state of the moderation requests is set to <code>PENDING</code> again and the logged in moderator will be removed from the moderation list.</li> +<li><code>Decline request</code>: the moderation requests will be set to <code>REJECTED</code> and still shown in the list</li> +<li><code>Postpone request</code>: the state will be <code>IN PROGRESS</code>.</li> +<li><code>Cancel</code>: the moderation state is set to <code>PENDING</code> and the moderation request will still be shown in the moderation request list</li> +</ul> + + + + + + Docs: Release and Versioning + https://www.eclipse.org/sw360/docs/developers/dev-releasing-sw360/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-releasing-sw360/ + + + + <p>We have the following main principles for versioning and releases. We consider <a href="http://semver.org/">semantic versioning</a>:</p> +<blockquote> +<p>Given a version number MAJOR.MINOR.PATCH, increment the:</p> +<ul> +<li>MAJOR version when you make incompatible API changes,</li> +<li>MINOR version when you add functionality in a backwards-compatible manner, and</li> +<li>PATCH version when you make backwards-compatible bug fixes.</li> +</ul> +<p>Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.</p> +</blockquote> +<p>with the following implementation in our project:</p> +<h3 id="major-version">Major Version</h3> +<ul> +<li>API breaking changes are considered for the upcoming REST API.</li> +<li>Breaking change is <em>also</em> if a migration script is required for the data base.</li> +<li>Thrift API is not considered a public API anymore.</li> +<li>Therefore milestones cannot correspond to our versions like <code>1.4</code>, <code>1.5</code>, etc. anymore: we do not know which feature or issue will cause a version jump according to semantic versioning guidelines.</li> +</ul> +<h3 id="minor-version">Minor Version</h3> +<ul> +<li>Changes to the thrift API will cause minor version increment.</li> +<li>Larger new functionality which is backwards compatible, maybe one pull requests or maybe a group of pull requests.</li> +<li>Minor versions requires also tagging in the repo.</li> +</ul> +<h3 id="patch-level">Patch Level</h3> +<ul> +<li>Every push (merged pull request) to master shall generate <em>at least</em> (not there yet) a new patch level version, in order to allow for (clean) deployments at this level.</li> +<li>Could e also minor improvements like adding a button with some functionality</li> +<li>Patch level is not tagged.</li> +</ul> +<h2 id="naming-and-meaning-of-milestones">Naming and Meaning of Milestones</h2> +<ul> +<li>Milestones cannot correspond to versions (releases) anymore, because in general the version designator is determined by the level of change.</li> +<li>We use milestones as work packages. We see them as work packages from an organizational point of view. However, it is not a milestone to release a version, because - again in general - the version is determined by the level of change.</li> +<li>However, If the last merged pull quest of a work package, a completing merge: If it is not causing a major or minor version increment, still, this would lead to a minor version increment.</li> +</ul> +<h2 id="technical-implementation">Technical Implementation</h2> +<ul> +<li>Plan: The artifacts will be build by travis and stored on aws S3 (not there yet) with patch level version increments, but patch level versions will not lead to a tag in the repo.</li> +<li>Currently, the versioning is &ldquo;manual maven based&rdquo;, we look for a cleaner more automated approach.</li> +</ul> +<h1 id="technical-maven-universe-how-to-maketag-a-release">Technical: Maven Universe How to make/tag a release⁽¹⁾:</h1> +<p>The following information refers to the existing maven-based versioning scheme, as of now we are looking into a system which is not leading to a temporary change in the repo, commit, and then reverting changes.</p> +<p>Let us assume, that we want to tag the version <strong>1.2.0</strong> and that the current version in the pom&rsquo;s is <strong>1.2.0-SNAPSHOT</strong>.</p> +<h3 id="0-work-in-a-clean-environment">0. Work in a clean environment</h3> +<p>Especially should all poms be without uncommitted changes. The safe way is to start with:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>$ <span style="color:#366">cd</span> /tmp/ +</span></span><span style="display:flex;"><span>$ git clone https://github.com/eclipse/sw360.git +</span></span><span style="display:flex;"><span>$ <span style="color:#366">cd</span> sw360portal +</span></span></code></pre></div><h3 id="1-write-the-version-of-the-release-into-the-poms">1. Write the version of the release into the poms</h3> +<pre> +$ mvn versions:set -DnewVersion=<b>1.2.0</b> +$ git add pom.xml \*\*/pom.xml +$ git commit -m "set version to <b>1.2.0</b>" +</pre> +<p>This will actually edit all pom.xml files and change the versions to <strong>1.2.0</strong>, i.e. remove the SNAPSHOT.</p> +<h3 id="2-test-the-project">2. Test the project</h3> +<pre> +$ mvn install +</pre> +<p>or even better: use vagrant.</p> +<h3 id="3-create-and-push-the-tag">3. Create and push the tag</h3> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>$ mvn scm:tag +</span></span></code></pre></div><p>This creates the tag and <strong>pushes it to github</strong>.</p> +<h3 id="4-write-the-new-incremented-snapshot-version-into-the-poms">4. Write the new incremented SNAPSHOT-version into the poms</h3> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>$ mvn versions:set -DnewVersion<span style="color:#555">=</span>&lt;b&gt;1.3.0-SNAPSHOT&lt;/b&gt; +</span></span><span style="display:flex;"><span>$ git add pom.xml <span style="color:#c30;font-weight:bold">\*\*</span>/pom.xml +</span></span><span style="display:flex;"><span>$ git commit -m <span style="color:#c30">&#34;set version to &lt;b&gt;1.3.0-SNAPSHOT&lt;/b&gt;&#34;</span> +</span></span><span style="display:flex;"><span>$ git push origin master +</span></span></code></pre></div><p>&ndash; +⁽¹⁾ based on: <a href="https://axelfontaine.com/blog/final-nail.html">https://axelfontaine.com/blog/final-nail.html</a></p> + + + + + + Docs: REST API + https://www.eclipse.org/sw360/docs/developers/dev-rest-api/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-rest-api/ + + + + <p>The sw360 REST API provides access to sw360 resources for external clients. It consists currently of three Maven modules aggregated in one parent module <code>rest</code> in the sw360 distribution.</p> +<h1 id="module-structure">Module Structure</h1> +<p>The <code>rest</code> module provides a REST API infrastructure for sw360 including:</p> +<ul> +<li>Module <code>authorization-server</code> - OAuth2 Authorization Server, offering typical authorization steps of an OAuth2 workflow.</li> +<li>Module <code>resource-server</code> - REST API Gateway, providing access to the data for authenticated and authorized users / clients.</li> +<li>Module <code>rest-common</code> - only library code that is shared between the other rest modules.</li> +</ul> +<p>The REST API implementation uses:</p> +<ul> +<li>Module <code>authorization-server</code> uses the Liferay user management via the Liferay REST API to authenticate users and the users thrift backend service to access user profile data.</li> +<li>Module <code>resource-server</code> uses thrift backend services for accessing sw360 data to deliver it to the external clients.</li> +</ul> +<h1 id="api-principles">API Principles</h1> +<h2 id="security-principles">Security Principles</h2> +<p>The basic security principles are following the OAuth2 standards. So there should be an authorization server which can be the one contained in this project. That one provides access tokens after it authenticated the client and the user using this client. In addition it checks which authorities this client should receive for operating in the user&rsquo;s name. +With this OAuth2 access token the client can query the resource server which will restrict access to the given authorities. +Every client gets an access token as well as an refresh token. As long as the refresh token is valid, the client can gather a new access token without the need of re-authorization of the user.</p> +<p>There are currently three different possibilities for an OAuth2 authorization server implemented:</p> +<ul> +<li>Using the contained authorization-server with username/password that are known by Liferay, no matter if Liferay is hosting the credentials itself or is attached to some central user management which it uses to authenticate users.</li> +<li>Using the contained authorization-server inside an SSO network where an existing proxy can take care of the authentication and passing authenticated user information in configurable headers to the authorization-server which then performs authorization on top.</li> +<li>Using keycloak as authorization-server. This case is not part of this wiki page and might need special configuration.</li> +</ul> +<h2 id="data-principles">Data Principles</h2> +<p>The REST API provides Hypermedia using <a href="http://stateless.co/hal_specification.html">HAL</a> (Hypertext Application Language). +The following example shows some ideas of the REST API. It can be obtained by</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://[hostname]:[port]/resource/api/browser/index.html#/resource/api +</span></span></code></pre></div><p>Note that the response below is maybe not the exact same response of your current version:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;_links&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:attachments&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/attachments{?sha1}&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;templated&#34;</span>: <span style="color:#069;font-weight:bold">true</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:components&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/components&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:licenses&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/licenses&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:licenseinfo&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/licenseinfo&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:projects&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/projects&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:releases&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/releases&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:users&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/users&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:vendors&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/vendors&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:vulnerabilities&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/vulnerabilities&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;profile&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/profile&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;curies&#34;</span>: [ +</span></span><span style="display:flex;"><span> { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/docs/{rel}.html&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;name&#34;</span>: <span style="color:#c30">&#34;sw360&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;templated&#34;</span>: <span style="color:#069;font-weight:bold">true</span> +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> ] +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><h1 id="api-installation">API Installation</h1> +<p>Both, the <code>authorization-server</code> and the <code>resource-server</code> can be build using Maven like the rest of the project. Each is generating a Spring Boot server that can be deployed in an application container, e.g. Tomcat.</p> +<h1 id="api-configuration">API Configuration</h1> +<p>Since the <code>authorization-server</code> and the <code>resource-server</code> are Spring Boot servers, they are configured as usual via <code>/src/main/resources/application.yml</code>. In addition some configuration comes historically from <code>sw360.properties</code>. Please note that all configurations could be provided centrally in the <code>/etc/sw360/</code> directory. As such, the <code>sw360.properties</code> sits directly in <code>/etc/sw360/</code>. For rest-specific configurations the application considers the location <code>/etc/sw360/rest</code>.</p> +<h2 id="authorization-server-configuration">Authorization Server Configuration</h2> +<h3 id="special-liferay-credentials-configuration">Special Liferay Credentials Configuration</h3> +<p>In addition to the general properties in <a href="#general-config">here</a> the following needs to be configured in the <code>application.yml</code> when the authentication via Liferay username/password credentials should be possible:</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Values</th> +<th>Default</th> +</tr> +</thead> +<tbody> +<tr> +<td>sw360:sw360-portal-server-url</td> +<td>the url of the Liferay instance</td> +<td>n/a (but could be given if environment variable is used like <code>${SW360_PORTAL_SERVER_URL:http://127.0.0.1:8080}</code>)</td> +</tr> +<tr> +<td>sw360:sw360-liferay-company-id</td> +<td>the id of the company in Liferay that sw360 is run for</td> +<td>(but could be given if environment variable is used like <code>${SW360_LIFERAY_COMPANY_ID:20155}</code>)</td> +</tr> +</tbody> +</table> +<h3 id="special-sso-configuration">Special SSO Configuration</h3> +<p>In addition to the general properties in <a href="#general-config">here</a> the following needs to be configured in the <code>application.yml</code> when the authentication via SSO should be possible:</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Values</th> +<th>Default</th> +</tr> +</thead> +<tbody> +<tr> +<td>security:customheader:enabled</td> +<td>Flag if the components needed for SSO should be active</td> +<td>false</td> +</tr> +<tr> +<td>security:customheader:headername:intermediateauthstore</td> +<td>the name of the header that can be used for internal data transfer inside one roundtrip - it can be configured here because the proxy has to make sure that this header will not be passed from clients and will be used truly internal only</td> +<td>custom-header-auth-marker</td> +</tr> +<tr> +<td>security:customheader:headername:email</td> +<td>the name of the header that holds the email of the authenticated user (should be set be the proxy and must never be passed from clients)</td> +<td>authenticated-email</td> +</tr> +<tr> +<td>security:customheader:headername:extid</td> +<td>the name of the header that holds the extid of the authenticated user (should be set be the proxy and must never be passed from clients)</td> +<td>authenticated-extid</td> +</tr> +</tbody> +</table> +<p>:heavy_exclamation_mark: Please configure your SSO server and the proxy accordingly. In general, no unauthenticated request should reach the authorization server. And the configured headers should only be set by the proxy. If they are already contained in client requests, they must be removed!</p> +<h4 id="removing-headers-in-apache">Removing Headers in Apache</h4> +<p>In Apache you may use the <a href="https://httpd.apache.org/docs/current/mod/mod_headers.html"><code>mod_headers</code></a> module to remove headers from the client. Using the default values from the table above, at least the following directives should be present in your configuration for all requests that are routed to the <code>authorization-server</code>:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>RequestHeader unset custom-header-auth-marker +</span></span><span style="display:flex;"><span>RequestHeader unset authenticated-email +</span></span><span style="display:flex;"><span>RequestHeader unset authenticated-extid +</span></span></code></pre></div><h3 id="a-namegeneral-configageneral-configuration"><a name="general-config"></a>General Configuration</h3> +<p>Possible properties in <code>sw360.properties</code> file are:</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Values</th> +<th>Default</th> +</tr> +</thead> +<tbody> +<tr> +<td>backend.url</td> +<td>the url where the thrift services can be found</td> +<td>http://127.0.0.1:8080</td> +</tr> +<tr> +<td>rest.write.access.usergroup</td> +<td>the user group level (`USER</td> +<td>CLEARING_ADMIN</td> +</tr> +<tr> +<td>rest.admin.access.usergroup</td> +<td>the user group level (`USER</td> +<td>CLEARING_ADMIN</td> +</tr> +</tbody> +</table> +<p>The values in <code>sw360.properties</code> should be migrated to the <code>application.yml</code> in the future.</p> +<p>Further important properties in <code>application.yml</code> file are:</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Values</th> +<th>Default</th> +</tr> +</thead> +<tbody> +<tr> +<td>couchdb:url</td> +<td>the url of the CouchDB to use as client store</td> +<td>n/a</td> +</tr> +<tr> +<td>couchdb:database</td> +<td>the database name of the CouchDB database to use as client store</td> +<td>n/a</td> +</tr> +<tr> +<td>couchdb:username</td> +<td>if the CouchDB database needs authentication, enter the username here - if it does not need authentication, do not set this property at all, not even with an empty value</td> +<td>null</td> +</tr> +<tr> +<td>couchdb:password</td> +<td>if the CouchDB database needs authentication, enter the password here - if it does not need authentication, do not set this property at all, not even with an empty value</td> +<td>null</td> +</tr> +<tr> +<td>sw360:cors:allowed-origin</td> +<td>value for cross origin resource sharing</td> +<td>n/a</td> +</tr> +<tr> +<td>security:oauth2:resource:id</td> +<td>should just be the same then in the resource server</td> +<td>n/a</td> +</tr> +</tbody> +</table> +<p>After this configuration is done the normal REST service for client management should be usable. This one is only accessible for authenticated users that get the <code>ADMIN</code> authority (remember, the therefore necessary sw360 usergroup has just been configured). So the clients can be configured now.</p> +<h1 id="client-management">Client Management</h1> +<p>In the scenarios of this page, the shipped authorization server is used. So the next step is to configure a valid OAuth2 client in this authorization server. There should be one OAuth2 client per external REST API client (which in turn can have many different users). Therefore the authorization server offers a REST API for basic CRUD operations for configuring the clients that are stored in the just configured CouchDB. Since sw360-<code>ADMIN</code> privileges are needed for client management, an authentication is needed to work with this API.</p> +<p>For SSO users (basic-auth Liferay users can use other tools as well because other tools can handle basic auth - but they can also use this workflow):</p> +<ol> +<li> +<p>Open a browser with developer tools capabilities</p> +</li> +<li> +<p>Open</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://[hostname]:[port]/authorization/client-management +</span></span></code></pre></div><p>This page always shows the currently configured clients and can be refreshed after every manipulation of a client.</p> +</li> +<li> +<p>To add a new client, enter the following javascript in the dev tools console in the current browser tab - of course after manipulating the client data to suit your needs</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>xmlHttpRequest = new XMLHttpRequest(); +</span></span><span style="display:flex;"><span>xmlHttpRequest.open(&#39;POST&#39;, &#39;/authorization/client-management&#39;, false); +</span></span><span style="display:flex;"><span>xmlHttpRequest.setRequestHeader(&#39;Content-Type&#39;, &#39;application/json&#39;); +</span></span><span style="display:flex;"><span>xmlHttpRequest.setRequestHeader(&#39;Accept&#39;, &#39;application/json&#39;); +</span></span><span style="display:flex;"><span>xmlHttpRequest.send(JSON.stringify( +</span></span><span style="display:flex;"><span> { +</span></span><span style="display:flex;"><span> &#34;description&#34; : &#34;my first test client&#34;, +</span></span><span style="display:flex;"><span> &#34;authorities&#34; : [ &#34;BASIC&#34; ], +</span></span><span style="display:flex;"><span> &#34;scope&#34; : [ &#34;READ&#34; ], +</span></span><span style="display:flex;"><span> &#34;access_token_validity&#34; : 3600, +</span></span><span style="display:flex;"><span> &#34;refresh_token_validity&#34; : 3600 +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>)); +</span></span><span style="display:flex;"><span>console.log(xmlHttpRequest.responseText); +</span></span></code></pre></div></li> +<li> +<p>to manipulate an existing client, do the same but add the clientid to the data object</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> &#34;client_id&#34; : &#34;9e358ca832ce4ce99a770c7bd0f8e066&#34; +</span></span></code></pre></div></li> +<li> +<p>to remove an existing client, enter the following javascript in the dev tools console</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>xmlHttpRequest = new XMLHttpRequest(); +</span></span><span style="display:flex;"><span>xmlHttpRequest.open(&#39;DELETE&#39;, &#39;/authorization/client-management/9e358ca832ce4ce99a770c7bd0f8e066&#39;, false); +</span></span><span style="display:flex;"><span>xmlHttpRequest.setRequestHeader(&#39;Content-Type&#39;, &#39;application/json&#39;); +</span></span><span style="display:flex;"><span>xmlHttpRequest.setRequestHeader(&#39;Accept&#39;, &#39;application/json&#39;); +</span></span><span style="display:flex;"><span>xmlHttpRequest.send(); +</span></span><span style="display:flex;"><span>console.log(xmlHttpRequest.responseText); +</span></span></code></pre></div></li> +</ol> +<p>This way the session cookie of the SSO login will be used for the REST calls. This might also be possible in postman or curl or similar tools if you want to try to copy cookies (depending also on the SSO configuration). As said before, if Liferay username/password credentials can be used to authenticate then a tool like postman or curl can be used for the whole process. Just pass the credentials as basic-auth.</p> +<h3 id="client-management-via-curl">Client Management via Curl</h3> +<p>The above described call to create a rest client can also be done directly via one curl call:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#033">SW360_USER</span><span style="color:#555">=[</span>admin sw360 user<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#033">SW360_PW</span><span style="color:#555">=[</span>corresponding sw360 admin user password<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span>curl -s -S <span style="color:#c30;font-weight:bold">\ +</span></span></span><span style="display:flex;"><span><span style="color:#c30;font-weight:bold"></span> --user <span style="color:#c30">&#34;</span><span style="color:#a00">${</span><span style="color:#033">SW360_USER</span><span style="color:#a00">}</span><span style="color:#c30">:</span><span style="color:#a00">${</span><span style="color:#033">SW360_PW</span><span style="color:#a00">}</span><span style="color:#c30">&#34;</span> <span style="color:#c30;font-weight:bold">\ +</span></span></span><span style="display:flex;"><span><span style="color:#c30;font-weight:bold"></span> --header <span style="color:#c30">&#34;Content-Type: application/json&#34;</span> <span style="color:#c30;font-weight:bold">\ +</span></span></span><span style="display:flex;"><span><span style="color:#c30;font-weight:bold"></span> --header <span style="color:#c30">&#34;Accept: application/json&#34;</span> <span style="color:#c30;font-weight:bold">\ +</span></span></span><span style="display:flex;"><span><span style="color:#c30;font-weight:bold"></span> -X POST https://<span style="color:#555">[</span>hostname<span style="color:#555">]</span>:<span style="color:#555">[</span>port<span style="color:#555">]</span>/authorization/client-management <span style="color:#c30;font-weight:bold">\ +</span></span></span><span style="display:flex;"><span><span style="color:#c30;font-weight:bold"></span> -d @- <span style="color:#c30">&lt;&lt;EOF +</span></span></span><span style="display:flex;"><span><span style="color:#c30">{ +</span></span></span><span style="display:flex;"><span><span style="color:#c30"> &#34;description&#34; : &#34;my first test client&#34;, +</span></span></span><span style="display:flex;"><span><span style="color:#c30"> &#34;authorities&#34; : [ &#34;BASIC&#34; ], +</span></span></span><span style="display:flex;"><span><span style="color:#c30"> &#34;scope&#34; : [ &#34;READ&#34; ], +</span></span></span><span style="display:flex;"><span><span style="color:#c30"> &#34;access_token_validity&#34; : 3600, +</span></span></span><span style="display:flex;"><span><span style="color:#c30"> &#34;refresh_token_validity&#34; : 3600 +</span></span></span><span style="display:flex;"><span><span style="color:#c30">} +</span></span></span><span style="display:flex;"><span><span style="color:#c30">EOF</span> +</span></span></code></pre></div><p>This only works with the liferay basic-auth mechanism, SSO is not supported via curl.</p> +<h2 id="oauth2-access-token">OAuth2 Access Token</h2> +<p>Now with a configured client it is possible to retrieve an access token for the REST API from the authorization server. There is again a difference in SSO environments and Liferay username/password environments.</p> +<h3 id="sso-backed-access-token">SSO Backed Access Token</h3> +<p>Probably the browser has to be used again because many SSO environments are based on certificates that are read from keycards and the necessary libs are often built into the browser. So just call the URL</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://[hostname]:[port]/authorization/oauth/token?grant_type=password&amp;client_id=[clientid]&amp;client_secret=[clientsecret] +</span></span></code></pre></div><p>Of course the client id and the client secret should be replaced by the values of the configured client. The received response should look similar to</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;access_token&#34;</span> : <span style="color:#c30">&#34;eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiZDY4ZWY1YWEtZTQ5My00Y2YxLWI2NGQtNWE5MTdkY2M2ZTYwIiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iO5sLrqRcZfzvMP5gjaJhk3caWyZLkUesdbMfqCGy4V5rbnU9QP1LjdybY0Udh8hvAvhlpqPfaxeKe1c3-gQs5MYlqG0lNQCyWcb7NRHj8VFlwLPuJRZJNk3tybvgITVm9r14pfAXogpVE0S4KihD2W1_SoKH4NzTa2vOEG0CK4VzCLetxUlUuePxZH8ugouqbS2d0SpyeeMTm-PzxzzeTb_4ulGpg63eE1v7GvTsI23uh2WfIgHBa1GRr5jWtE0Meq-5UFCVQkhMm8P-r8wO2iuRblCu6a-bWwy7bfdj3S2VDnqSQskE2dVrC_qMs-V2AGvCV1xvlF0P8A4tgwL-w&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;token_type&#34;</span> : <span style="color:#c30">&#34;bearer&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;refresh_token&#34;</span> : <span style="color:#c30">&#34;eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJhdGkiOiJkNjhlZjVhYS1lNDkzLTRjZjEtYjY0ZC01YTkxN2RjYzZlNjAiLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiM2VkZDcxODAtMTBlYi00Y2MwLTg0NTUtMGYwZmIyMWMwYmU0IiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iMGfdHWpJNseoxIk7tKCNTyC1w4_AJ4cSv6kO64_BkF54MLudvyf9uVSIHpAeHhSFdvhbjksynRqq_u78vW8ptY1la65Qx8glHz0sktWBfMDJsUA4ynU2iZbKU92f2OOf3wQRVt38-Y1mBUsDMIStyKTDeIXGT3LJr_8k5dRAGvayixaezxDFw3dWK2M6P9h-ZnfEP47HpIUZrG8cgwPmNCZ9gBXsqVnueDYZth6TaEKIvWbkZtwY0ikWKyJL2xLm78O1ii3lA5ENt5I0DTfTm8QuK_zcm679W9jF0jvwIR71fM0JSWjkBoXd2h9oLmE2CF2sFVaJor_ermk-L0LsA&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;expires_in&#34;</span> : <span style="color:#f60">3599</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;scope&#34;</span> : <span style="color:#c30">&#34;READ&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;jti&#34;</span> : <span style="color:#c30">&#34;d68ef5aa-e493-4cf1-b64d-5a917dcc6e60&#34;</span> +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>From this response the value of the <code>access_token</code> and probably <code>refresh_token</code> field is the one to copy-paste for later usage.</p> +<h3 id="liferay-backed-access-token">Liferay Backed Access Token</h3> +<p>With a Liferay backed authentication all REST clients that offer basic auth support can be used. For example <code>curl</code>:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>curl -X POST --user <span style="color:#c30">&#39;[clientid]:[clientsecret]&#39;</span> -d <span style="color:#c30">&#39;grant_type=password&amp;username=[username]&amp;password=[password]&#39;</span> https://<span style="color:#555">[</span>hostname<span style="color:#555">]</span>:<span style="color:#555">[</span>port<span style="color:#555">]</span>/authorization/oauth/token -k +</span></span></code></pre></div><p>Example response:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;access_token&#34;</span> : <span style="color:#c30">&#34;eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiZDY4ZWY1YWEtZTQ5My00Y2YxLWI2NGQtNWE5MTdkY2M2ZTYwIiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iO5sLrqRcZfzvMP5gjaJhk3caWyZLkUesdbMfqCGy4V5rbnU9QP1LjdybY0Udh8hvAvhlpqPfaxeKe1c3-gQs5MYlqG0lNQCyWcb7NRHj8VFlwLPuJRZJNk3tybvgITVm9r14pfAXogpVE0S4KihD2W1_SoKH4NzTa2vOEG0CK4VzCLetxUlUuePxZH8ugouqbS2d0SpyeeMTm-PzxzzeTb_4ulGpg63eE1v7GvTsI23uh2WfIgHBa1GRr5jWtE0Meq-5UFCVQkhMm8P-r8wO2iuRblCu6a-bWwy7bfdj3S2VDnqSQskE2dVrC_qMs-V2AGvCV1xvlF0P8A4tgwL-w&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;token_type&#34;</span> : <span style="color:#c30">&#34;bearer&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;refresh_token&#34;</span> : <span style="color:#c30">&#34;eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJhdGkiOiJkNjhlZjVhYS1lNDkzLTRjZjEtYjY0ZC01YTkxN2RjYzZlNjAiLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiM2VkZDcxODAtMTBlYi00Y2MwLTg0NTUtMGYwZmIyMWMwYmU0IiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iMGfdHWpJNseoxIk7tKCNTyC1w4_AJ4cSv6kO64_BkF54MLudvyf9uVSIHpAeHhSFdvhbjksynRqq_u78vW8ptY1la65Qx8glHz0sktWBfMDJsUA4ynU2iZbKU92f2OOf3wQRVt38-Y1mBUsDMIStyKTDeIXGT3LJr_8k5dRAGvayixaezxDFw3dWK2M6P9h-ZnfEP47HpIUZrG8cgwPmNCZ9gBXsqVnueDYZth6TaEKIvWbkZtwY0ikWKyJL2xLm78O1ii3lA5ENt5I0DTfTm8QuK_zcm679W9jF0jvwIR71fM0JSWjkBoXd2h9oLmE2CF2sFVaJor_ermk-L0LsA&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;expires_in&#34;</span> : <span style="color:#f60">3599</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;scope&#34;</span> : <span style="color:#c30">&#34;READ&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;jti&#34;</span> : <span style="color:#c30">&#34;d68ef5aa-e493-4cf1-b64d-5a917dcc6e60&#34;</span> +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>Of course, the username and password must be your user credentials and the client id and secret have to be replaced with the configured values. And again, the wanted value is the value of the field <code>access_token</code> and probably <code>refresh_token</code>.</p> +<p>More Links:</p> +<ul> +<li>OAuth2 more information: <a href="https://oauth.net/2/">https://oauth.net/2/</a></li> +<li>Decode Bearer tokens at: <a href="https://jwt.io/">https://jwt.io/</a></li> +</ul> +<h2 id="oauth2-refresh-token">OAuth2 Refresh Token</h2> +<p>The authorization server supports so called refresh tokens to generate new access tokens after they have been expired. New access tokens can be generated with the use of the <code>refresh_token</code> without further re-authorization of the user. The following url must be used:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> http://localhost/authorization/oauth/token?grant_type=refresh_token&amp;refresh_token=&lt;REFRESH_TOKEN&gt; +</span></span></code></pre></div><p>The client must pass its credentials via basic authentication. Though a user authentication is not necessary. +If you are authentication your users on a proxy, you have to configure that proxy in a way that it does not block requests to the above url. As marker the &lsquo;grant_type=refresh_token&rsquo; query parameter may be used.</p> +<h2 id="example-apache-configuration">Example Apache configuration</h2> +<p>The following example shows the relevant part for an Apache proxy to configure +authentication of the <code>authorization-server</code> properly:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-apache" data-lang="apache"><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;Location</span> <span style="color:#c30">/authorization/oauth/token</span><span style="color:#309;font-weight:bold">&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#366">Order</span> allow,deny +</span></span><span style="display:flex;"><span> <span style="color:#366">Allow</span> from <span style="color:#069;font-weight:bold">all</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;If</span> <span style="color:#c30">&#34;%{QUERY_STRING} =~ /^grant_type=refresh_token\&amp;/&#34;</span><span style="color:#309;font-weight:bold">&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># No authentication needed</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/If&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;Else&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># Configure your authentication here</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/Else&gt;</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#366">ProxyPass</span> https://localhost:8443/authorization/oauth/token +</span></span><span style="display:flex;"><span> <span style="color:#366">ProxyPassReverse</span> https://localhost:8443/authorization/oauth/token +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;/Location&gt;</span> +</span></span></code></pre></div><h1 id="resource-server-configuration">Resource Server Configuration</h1> +<p>Now that access tokens can be generated, the resource server has to be configured. The same general ideas of <a href="#general-config">general config</a> apply. The properties of the <code>application.yml</code> are</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Values</th> +<th>Default</th> +</tr> +</thead> +<tbody> +<tr> +<td>sw360:thrift-server-url</td> +<td>the url where the thrift services can be found, e.g. http://localhost:8080</td> +<td></td> +</tr> +<tr> +<td>sw360:test-user-id</td> +<td>only for developing, simple test user short cut, must be pulled off for productive</td> +<td></td> +</tr> +<tr> +<td>sw360:test-user-passwors</td> +<td>see above</td> +<td></td> +</tr> +<tr> +<td>sw360:couchdb-url</td> +<td>the url of the CouhDB server for attachment handling, e.g. https://localhost:5984</td> +<td></td> +</tr> +<tr> +<td>sw360:cors:allowed-origin</td> +<td>value for cross origin resource sharing</td> +<td>n/a</td> +</tr> +</tbody> +</table> +<p>The REST API is now completely usable via an own client or testwise with integrated tools.</p> +<h1 id="tools">Tools</h1> +<p>To get data and interact with the sw360 REST API the HAL-Browser is recommended. Currently, the HAL-Browser is also deployed on the sw360 development instance, but this is likely to change once the REST API has evolved more. Currently the URL of HAL-Browser is:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://[hostname]:[port]/resource/api/browser/index.html#/resource/api +</span></span></code></pre></div><p>An example for a screenshot is as follows:</p> +<p><img src="https://user-images.githubusercontent.com/29916928/39576770-90b2b576-4edf-11e8-9d1b-742c10d88b8e.png" alt="rest-hal-explorer"></p> +<p>When using other tools the access token has to be set as header parameter in the REST request. Please add a new header:</p> +<ul> +<li>Key: Authorization</li> +<li>As value you need to enter: <code>Bearer [ACCESS_TOKEN]</code> where <code>[ACCESS_TOKEN]</code> actually contains the token</li> +</ul> +<h2 id="example--get-a-list-of-projects">Example – Get a list of projects</h2> +<p>Here is an example how to query for all projects as HTTP GET Request. As for the resource endpoint, the request:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://sw360.org/resource/api/projects (or /resource/api/projects) +</span></span></code></pre></div><p>will return the following response:</p> +<p><img src="https://user-images.githubusercontent.com/29916928/39579586-6b1d1736-4ee7-11e8-8faf-da71c8776680.png" alt="rest-explorer2"></p> +<h1 id="api-documentation">API Documentation</h1> +<p>sw360 deploys a REST API documentation at every instance. There are the following URLs offered at each instance</p> +<table> +<thead> +<tr> +<th>URL</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>https://[hostname]:[port]/resource/docs/index.html</td> +<td>Small overview page</td> +</tr> +<tr> +<td>https://[hostname]:[port]/resource/docs/api-guide.html</td> +<td>The API description for the currently running server</td> +</tr> +<tr> +<td>https://[hostname]:[port]/resource/api/browser/index.html#/resource/api</td> +<td>Integrated HAL browser to directly use the API</td> +</tr> +</tbody> +</table> +<h1 id="known-problems">Known Problems</h1> +<p>If you use Nginx or Apache as request front end server there maybe some configuration caveats: The REST API objects provides self links to reference to other objects also including the protocol prefix. These links are realized on Hypertext Application Language (HAL) for example you will find in REST responses:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#c30">&#34;_links&#34;</span><span style="color:#a00;background-color:#faa">:</span> { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;self&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://localhost:8443/resource/api/projects/065f3aa45c2683297fd1bb39296f519d&#34;</span> +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>The REST spring boot applications are using the Tomcat environment configuration to generate the HAL links. If the Tomcat is only configured as HTTP, the generated links will contain the <code>http</code> protocol and port - which is a problem if the server should be contacted over <code>https</code>only. This problem occurs, if tomcat is used together with Nginx, Apache httpd or other Web servers, which are configured to repsond only to <code>https</code>.</p> +<p>Solution is to set for example in Nginx HTTP &lsquo;X-Forward-*&rsquo; headers on a reverse proxy, for example:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">location</span> <span style="color:#c30">/</span> { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">...</span> +</span></span><span style="display:flex;"><span> <span style="color:#c30">proxy_set_header</span> <span style="color:#c30">X-Forwarded-Port</span> <span style="color:#f60">443</span>; +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">proxy_set_header</span> <span style="color:#c30">X-Forwarded-Proto</span> <span style="color:#c30">https</span>; +</span></span><span style="display:flex;"><span> } +</span></span></code></pre></div><p>For other Web severs, there might a similar solution.</p> + + + + + + Docs: Roles and Authorization + https://www.eclipse.org/sw360/docs/developers/dev-role-authorisation-model/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-role-authorisation-model/ + + + + <p>Like any other system, SW360 allows for setting different levels of access for different users. Technically, the decision when user should be able to see or to do something happens (generally) on the backend server. This ensures consistency between the REST API and the portal application.</p> +<p>For setting roles of a user, the Liferay control panel is being used (Admin menu -&gt; Control Panel -&gt; Users and Organisations -&gt; Users -&gt; select one user and Edit -&gt; Roles). Setting access at individual records happens in the edit view of that record.</p> +<h2 id="roles-overview">Roles Overview</h2> +<p>SW360 offers two choices for doing the roles: one is setting access rights at every record individually. Another are general roles that can be set for every user. An admin of SW360 can set user roles at the Liferay Users and Roles UI.</p> +<h4 id="setup-admin-liferay-role">Setup Admin (Liferay Role)</h4> +<p>The setup admin is the Liferay administrator, which can configure the entire liferay app, such as which portlets are shown on which page.</p> +<h4 id="sw360-admin-liferay-role">SW360 Admin (Liferay Role)</h4> +<p>The SW360 admin can change all data and promote users for more access rights, such as promoting a user to role <code>CLEARING_ADMIN</code>. This role can change data from other groups, limited by visibility setting of a project.</p> +<h4 id="clearing-admin-liferay-role">Clearing Admin (Liferay Role)</h4> +<p>The clearing admin can change all component and release records and project records of the same group. This can be seen as group administrator.</p> +<h4 id="security-admin-liferay-role">Security Admin (Liferay Role)</h4> +<p>In addition to the user rights, the security admin can set security vulnerabilities to irrelevant</p> +<h4 id="ecc-admin-liferay-role">ECC Admin (Liferay Role)</h4> +<p>In addition to the user rights, the ECC admin can manipulate ECC data.</p> +<h4 id="user">User</h4> +<p>A user can create, modify and delete all own (=self created) records. A user cannot change records of others</p> +<h3 id="moderation-requests">Moderation Requests</h3> +<p>If a user with user or other access role rights is not entitled to write or change a record, a moderation request will be created. The moderation request contains the changes an will be routed for approval to the users who can write this record.</p> +<p>In addition there are ACL-style roles, meaning that per data item access settings can be made:</p> +<ol> +<li><strong>creator</strong> - a creator can modify in addition to the user&rsquo;s read abilities, a user can be creator of a data item</li> +<li><strong>moderator</strong> - a creator can define moderators for a data item. Moderators can change a data item as a creator can.</li> +<li><strong>contributor</strong> (Component) - is a contributor to a component, project, similar (but not the same) to a moderator. In addition to moderator, this role has been added to identify contributors (or that contributors get the fame). +In contrast, the contributor cannot delete data items.</li> +<li><strong>project responsible</strong> (Project) - is a contributor, just named differently to identify the responsible person.</li> +<li><strong>lead architect</strong> (Project) - is a contributor, just named differently to identify the responsible person. an architect refers to the person who has that role of the project or product. This role has been added to identify architects to have a contact person for technical questions.</li> +<li><strong>contact</strong> (Release) - deprecated, should be renamed to contributor see #100.</li> +</ol> +<p><code>group (department)</code>, <code>contributor</code>, <code>moderator</code> and <code>owner</code> roles are entity specific, <code>user</code>, <code>clearing admin</code> and <code>admin</code> are roles assigned to a user.</p> +<h3 id="additional-project-visibility">Additional Project Visibility</h3> +<p>In addition to the roles mentioned above, each project has a separate visibility setting (technically an attribute of the project document). There are four project visibility levels:</p> +<ol> +<li>Private - no one but the creator can read.</li> +<li>Me and moderators - involves all moderators and contributors, basically all names that are named among the attributes (lead architect, project responsible, contributors)</li> +<li>Department / business unit (should be renamed) - refer to the group the users are in.</li> +<li>Public - all registered users of the liferay / sw360 application (login required).</li> +</ol> +<p>The access rules are implemented in<code>lib-datahandler</code>. In the package, <code>com.siemens.sw360.datahandler.permissions</code> this is implemented in <code>ProjectPermissions</code>. See methods <code>isVisible</code> and <code>userIsEquivalentToModeratorinProject()</code> for the actual rules.</p> +<h3 id="overall-access-matrix">Overall Access Matrix</h3> +<p>The following table presents the SW360 Role-Authorisation-Model.</p> +<p>The row specifies which action to take, the column the role of the actor. Cell entries specify which entity type can be acted upon.</p> +<table> +<thead> +<tr> +<th></th> +<th>creator</th> +<th>moderator</th> +<th>contributor</th> +<th>user</th> +<th>clearing admin</th> +<th>(sw360)admin</th> +</tr> +</thead> +<tbody> +<tr> +<td>create</td> +<td>-</td> +<td>-</td> +<td>-</td> +<td>PCRV</td> +<td>PCRVL</td> +<td>PCRVL</td> +</tr> +<tr> +<td>read</td> +<td>P</td> +<td>P</td> +<td>P</td> +<td>(P²)CRVL</td> +<td>(P²)CRVL</td> +<td>PCRVL</td> +</tr> +<tr> +<td>edit</td> +<td>PCR</td> +<td>PCR</td> +<td>PCR</td> +<td>(all created ones)</td> +<td>PCRVL</td> +<td>PCRVL</td> +</tr> +<tr> +<td>delete</td> +<td>PCR</td> +<td>PCR</td> +<td>-</td> +<td>(all created ones)</td> +<td>L</td> +<td>PCRVL</td> +</tr> +</tbody> +</table> +<p>P² : only if the user is member of the group of the project (or has created the project)</p> +<p>Note that ECC Admins and Security Admins have only the ability to write ECC and security data respectively at given records. However, as for the other access rights this role does not enhance anything above users.</p> +<h4 id="legend">Legend</h4> +<table> +<thead> +<tr> +<th>acronym</th> +<th>description</th> +</tr> +</thead> +<tbody> +<tr> +<td>P</td> +<td>project</td> +</tr> +<tr> +<td>C</td> +<td>component</td> +</tr> +<tr> +<td>R</td> +<td>release</td> +</tr> +<tr> +<td>V</td> +<td>vendor</td> +</tr> +<tr> +<td>L</td> +<td>license</td> +</tr> +</tbody> +</table> +<h2 id="technical-info">Technical Info</h2> +<p>The role access rules are put into <code>lib-datahandler</code>. In the package, <code>com.siemens.sw360.datahandler.permissions</code> there are implementing classes of a template class <code>DocumentPermissions</code>. As an example, <code>ProjectPermissions</code> extends abstract class <code>DocumentPermissions</code>.</p> +<p>At run time, a permissions object consisting of a document and a user is created: In <code>PermissionUtils</code> (same package) there is a static method <code>makePermissions&lt;T&gt;()</code> that creates a permissions object. The received permissions object instance can be asked if a particular operation is allowed.</p> +<p>Note that the general application of these permission operations runs in the backend (Thrift services). An application in the front end of <code>PermissionUtils</code> for example, is for displaying buttons depending on the user main role (user, clearing admin or admin). Then the portlet makes plain use of the <code>lib-datahandler</code> library.</p> +<h2 id="further-plans">Further plans</h2> +<ol> +<li> +<p>Actually, creating stuff should be checked in lib-datahandler, starting with creation of licenses,which should ot be permitted to users: <a href="https://github.com/siemens/sw360portal/issues/106">Issue #106</a></p> +</li> +<li> +<p><a href="https://github.com/siemens/sw360portal/issues/101">Issue #101</a> for</p> +</li> +</ol> +<table> +<thead> +<tr> +<th></th> +<th>contributor</th> +<th>moderator</th> +<th>creator</th> +<th>user</th> +<th>clearing admin</th> +<th>admin</th> +</tr> +</thead> +<tbody> +<tr> +<td>download OSS sources</td> +<td>-</td> +<td>-</td> +<td>-</td> +<td>R</td> +<td>R</td> +<td>R</td> +</tr> +<tr> +<td>download internal sources</td> +<td>R</td> +<td>R</td> +<td>R</td> +<td>-</td> +<td>-</td> +<td>R</td> +</tr> +</tbody> +</table> +<ol start="3"> +<li><a href="https://github.com/siemens/sw360portal/issues/102">Issue #102</a> for</li> +</ol> +<table> +<thead> +<tr> +<th></th> +<th>contributor</th> +<th>moderator</th> +<th>creator</th> +<th>user</th> +<th>clearing admin</th> +<th>admin</th> +</tr> +</thead> +<tbody> +<tr> +<td>send to clearing</td> +<td>-</td> +<td>P</td> +<td>P</td> +<td>-</td> +<td>-</td> +<td>PCRL</td> +</tr> +</tbody> +</table> +<ol start="4"> +<li><a href="https://github.com/siemens/sw360portal/issues/103">Issue #103</a> for</li> +</ol> +<table> +<thead> +<tr> +<th></th> +<th>contributor</th> +<th>moderator</th> +<th>creator</th> +<th>user</th> +<th>clearing admin</th> +<th>admin</th> +</tr> +</thead> +<tbody> +<tr> +<td>edit clearing report</td> +<td>-</td> +<td>R</td> +<td>R</td> +<td>-</td> +<td>R?</td> +<td>PCRL</td> +</tr> +</tbody> +</table> + + + + + + Docs: Semantic Commits + https://www.eclipse.org/sw360/docs/developers/dev-semantic-commits/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-semantic-commits/ + + + + <h2 id="the-reason-and-benefit-of-semantic-commit-messages">The reason and benefit of semantic commit messages</h2> +<ul> +<li>automatic generating of the changelog</li> +<li>simple navigation through git history (e.g. ignoring style changes)</li> +</ul> +<h2 id="semantic-commit-message-structure">Semantic commit message structure</h2> +<p><code>&lt;type&gt;(&lt;scope&gt;): &lt;commit message&gt;</code></p> +<h2 id="the-following-types-are-supported">The following <types> are supported</h2> +<ul> +<li>feat (new feature for the user, not a new feature for build script)</li> +<li>fix (bug fix for the user, not a fix to a build script)</li> +<li>docs (changes to the documentation)</li> +<li>style (formatting, missing semi colons, etc; no production code change)</li> +<li>refactor (refactoring production code, eg. renaming a variable)</li> +<li>test (adding missing tests, refactoring tests; no production code change)</li> +<li>chore (updating grunt tasks etc; no production code change)</li> +</ul> +<p>Example <scope> values:</p> +<ul> +<li>ui (user interface)</li> +<li>rest (REST API)</li> +<li>thrift (apache thrift services)</li> +<li>project (project portlet)</li> +<li>component (component portlet)</li> +<li>user (user portlet)</li> +<li>etc.</li> +</ul> +<h2 id="example-of-semantic-commit-message">Example of semantic commit message</h2> +<p><code>fix(rest): change maven plugin order to generate the documentation correctly</code></p> +<p><code>&lt;type&gt;(&lt;scope&gt;): &lt;commit message&gt;</code></p> +<h2 id="referencing-issues">Referencing issues</h2> +<p>Please reference in the pull request to the open issue</p> +<p><code>closes eclipse/sw360#&lt;issue-number&gt;</code></p> +<p><code>closes eclipse/sw360#758</code></p> + + + + + + Docs: Testing Frameworks + https://www.eclipse.org/sw360/docs/developers/dev-testing-frameworks/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-testing-frameworks/ + + + + <p>The implementation of complicated rules is not always easy to read. +A good way to document and explain the behaviour of rule engines are natural language tests. +A frame work we use for that is <a href="http://jgiven.org/">jgiven</a>. +We write the tests using the [dataprovider] (<a href="https://github.com/TNG/junit-dataprovider">https://github.com/TNG/junit-dataprovider</a>) runner. +This is basically a runner that allows to use parametrized tests.</p> +<p>The basic testing frame work is still <a href="http://junit.org/">JUnit4</a>, assertions are made using <a href="https://code.google.com/p/hamcrest/wiki/Tutorial">hamcrest</a> and we mock complicated input classes with <a href="http://mockito.org/">mockito</a>.</p> + + + + + + Docs: Troubleshooting + https://www.eclipse.org/sw360/docs/developers/dev-troubleshooting/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-troubleshooting/ + + + + <h3 id="development-problems-building-sw360portal-with-maven">Development: problems building sw360portal with maven?</h3> +<p>Before building the sw360portal with maven, ensure that the following components are installed in the development environment:</p> +<ul> +<li>A git client</li> +<li>Apache Maven 3.0.X</li> +<li>Apache Thrift 0.9.3</li> +<li>Java 1.8.X</li> +<li>CouchDB, at least 1.5 (only if the tests will be executed locally)</li> +</ul> +<h3 id="development-problems-using-eclipse">Development: problems using Eclipse?</h3> +<p>Please do not use Eclipse, because the integration of Apache Thrift is an open issue and we found no plugin for Eclipse to solve the shown compiler errors. +Recommended is IntelliJ IDEA or NetBeans.</p> +<h3 id="liferay-problems-with-displaying-changes-to-page">Liferay: problems with displaying changes to page?</h3> +<p>When developing changes to a page and these changes do not show in browser - even after redeployment, then the internal liferay optimisation mechanisms may kick in. Try to add to the URL string the following key value parameters:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>js_fast_load=0&amp;css_fast_load=0&amp;strip=0 +</span></span></code></pre></div><h3 id="liferay-where-are-the-initial-admin-user-settings">Liferay: where are the initial admin user settings?</h3> +<p>It is the file <code>portal-ext.properties</code> in sw360/opt.</p> +<h3 id="maven-build-generally-fails">Maven: build generally fails</h3> +<p>You just try to compile parts or all of it and it fails? Most of the stuff depends on the module /build-configuration. Execute either &ldquo;mvn install&rdquo; on top level or inside build configuration.</p> +<h4 id="backend-problems-with-company-proxy">Backend: problems with company proxy?</h4> +<p>maybe try instead:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>/opt/apache-tomcat-/bin/startup.sh +</span></span></code></pre></div><p>just this:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>CATALINA_OPTS=&#34;-Dhttps.proxy...&#34; /opt/apache-tomcat-/bin/startup.sh +</span></span></code></pre></div><p>for lucene it might be necessary to add:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>[httpd_global_handlers] +</span></span><span style="display:flex;"><span>_fti = {couch_httpd_proxy, handle_proxy_req, &lt;&lt;&#34;http://127.0.0.1:8085/couchdblucene&#34;&gt;&gt;} +</span></span></code></pre></div><p>in lucene.ini of local.d of your CouchDB installation</p> +<h4 id="backend-are-thrift-services-up">Backend: are thrift services up?</h4> +<ol> +<li>Check tomcat manager (if the services are there)</li> +<li>Check if the service is accessible: +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://your.url.to.server.com:8085/components +</span></span></code></pre></div>Should return &ldquo;Welcome to &hellip;&rdquo;.</li> +<li>Check if the service thrift page is there: +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://your.url.to.server.com:8085/components/thrift +</span></span></code></pre></div>Should return HTTP status code 500, because in the browser, no valid thrift message was formed.</li> +</ol> +<h4 id="backend-orgektorpdbaccessexception">Backend: org.ektorp.DbAccessException</h4> +<p>What do I do if I get: org.ektorp.DbAccessException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field &ldquo;_id&rdquo;</p> +<p>You add the class you have been trying to serialize to +THRIFT_CLASSES in +sw360/src/libraries/lib-datahandler/src/main/java/com/siemens/sw360/datahandler/thrift/ThriftUtils.java</p> +<h4 id="backend-maven-failed-tomcat7-deploy">Backend: maven failed tomcat7 deploy</h4> +<p>If the deployment via maven of the backend does fail with an error like this</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>Uploading: http://localhost:8085/manager/text/deploy?path<span style="color:#555">=</span>%2Flicenses +</span></span><span style="display:flex;"><span>2302/17930 KB +</span></span><span style="display:flex;"><span>Uploading: http://localhost:8085/manager/text/deploy?path<span style="color:#555">=</span>%2Flicenses +</span></span><span style="display:flex;"><span>2102/17930 KB +</span></span><span style="display:flex;"><span>Uploading: http://localhost:8085/manager/text/deploy?path<span style="color:#555">=</span>%2Flicenses +</span></span><span style="display:flex;"><span>2064/17930 KB +</span></span><span style="display:flex;"><span>Uploading: http://localhost:8085/manager/text/deploy?path<span style="color:#555">=</span>%2Flicenses +</span></span><span style="display:flex;"><span>2064/17930 KB +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> ------------------------------------------------------------------------ +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> Reactor Summary: +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> backend ........................................... SUCCESS <span style="color:#555">[</span>2.579s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> backend-src ....................................... SUCCESS <span style="color:#555">[</span>0.058s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-licenses ...................................... SUCCESS <span style="color:#555">[</span>10.544s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-users ......................................... SUCCESS <span style="color:#555">[</span>1.485s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-vendors ....................................... SUCCESS <span style="color:#555">[</span>6.929s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-search ........................................ SUCCESS <span style="color:#555">[</span>5.837s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-components .................................... SUCCESS <span style="color:#555">[</span>19.439s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-projects ...................................... SUCCESS <span style="color:#555">[</span>14.280s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-attachments ................................... SUCCESS <span style="color:#555">[</span>6.188s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-moderation .................................... SUCCESS <span style="color:#555">[</span>1.169s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-fossology ..................................... SUCCESS <span style="color:#555">[</span>6.259s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> backend-svc ....................................... SUCCESS <span style="color:#555">[</span>0.038s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-licenses ...................................... FAILURE <span style="color:#555">[</span>3.630s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-users ......................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-vendors ....................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-search ........................................ SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-components .................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-projects ...................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-attachments ................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-moderation .................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-fossology ..................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> backend-utils ..................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> ------------------------------------------------------------------------ +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> BUILD FAILURE +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> ------------------------------------------------------------------------ +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> Total time: 1:19.836s +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> Finished at: Mon May <span style="color:#f60">04</span> 15:57:46 CEST <span style="color:#f60">2015</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> Final Memory: 24M/311M +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> ------------------------------------------------------------------------ +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy <span style="color:#555">(</span>default-cli<span style="color:#555">)</span> on project svc-licenses: Cannot invoke Tomcat manager: Broken pipe -&gt; <span style="color:#555">[</span>Help 1<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> To see the full stack trace of the errors, re-run Maven with the -e switch. +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> Re-run Maven using the -X switch to <span style="color:#366">enable</span> full debug logging. +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> For more information about the errors and possible solutions, please <span style="color:#366">read</span> the following articles: +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> <span style="color:#555">[</span>Help 1<span style="color:#555">]</span> http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> After correcting the problems, you can resume the build with the <span style="color:#366">command</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> mvn &lt;goals&gt; -rf :svc-licenses +</span></span><span style="display:flex;"><span>voyager:backend sam$ +</span></span></code></pre></div><p>One solution is that you deployed already and the tomcat7 plugin does not like to have multiple deploy commands. Instead you will need to issue a <code>mvn tomcat7:redeploy</code> command.</p> +<h4 id="deployment-liferay-not-accessible">Deployment: liferay not accessible</h4> +<p>If the virtual machine was shut down and started up again, the backend services and frontend liferay require manual restart. Please contribute a change in the vagrant deployment if you feel that this could be changed. The actual places to call are:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>/opt/apache-tomcat-.../bin/.startup.sh +</span></span><span style="display:flex;"><span>/opt/liferay-.../tomcat-.../bin/.startup.sh +</span></span></code></pre></div> + + + + + Docs: Using RequireJS fro Javascript Modules + https://www.eclipse.org/sw360/docs/developers/dev-using-requirejs-for-javascript-modules/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-using-requirejs-for-javascript-modules/ + + + + <p>Today most of the javascript code runs in the global namespace. This increases the risk of overwriting symbols in the global namespace due to different libraries and snippets.</p> +<h1 id="goal">Goal</h1> +<p>We want to use RequireJS (<a href="http://requirejs.org/">http://requirejs.org/</a>) to modularize our code and to have clear namespaces for each component. In addition some of the code may be reused more easily. Other advantages:</p> +<ul> +<li>libraries like jquery or datatables can be imported by name but without a specified version</li> +<li>if necessary, specific versions can be imported for parts of the page</li> +<li>it is very easy to only load needed dependencies</li> +<li>good support of webjars due to webjars-locator. Webjars a are automatically accessible through RequireJS.</li> +</ul> +<h1 id="how-to-use---example">How to use - example</h1> +<p>There is a new jspf-file to be included in jsps to enable RequireJS support:</p> +<pre><code>&lt;%@ include file=&quot;/html/utils/includes/requirejs.jspf&quot; %&gt; +</code></pre> +<p>When RequireJS is enabled with the above include, all libraries can be accessed and code can be scoped:</p> +<pre><code>require(['jquery', 'module/quickfilter', 'module/confirm', /* jquery-plugins: */ 'datatables', 'jquery-ui'], function($, quickfilter, confirm) { + // code goes here, libraries can be used through the variables $, quickfilter and confirm + // Note: jquery-plugins does not have to be bound to variables since they directly register themselves in the jquery object +}); +</code></pre> +<p><strong>NOTE/WARNING</strong>: since not all code is using RequireJS at the moment it is highly recommended to include RequireJS just before the script tag using it. DO NOT include it at the beginning of the file! Therefore use the following pattern:</p> +<pre><code>&lt;%@ include file=&quot;/html/utils/includes/requirejs.jspf&quot; %&gt; +&lt;script&gt; + require(['jquery'], function($) { + // js stuff + }); +&lt;/script&gt; +</code></pre> +<p><strong>Explanation</strong>: some the the jQuery-plugins are already module safe. This means the look if something like RequireJS is available and - if this is the case - register themselves as anonymous modules. If someone in some include in the page loads such a plugin via script plugin it may happen that the plugins registers itself twice as an anonymous module which causes errors in RequireJS. Loading RequireJS after all script tags will prevent this and ensure that every plugin is only registered once.</p> +<h1 id="migration">Migration</h1> +<h2 id="migrate-a-jsp">Migrate a JSP</h2> +<p>To migrate a JSP to use RequireJS the following steps have to be done:</p> +<ol> +<li>Enable RequireJS support by including <code>requirejs.jspf</code>. Do it JUST before the script tag with the main code (see NOTE above).</li> +<li>Enclose the existing code in a <code>require</code>-function (<strong>Attention:</strong> Also read &ldquo;Co-existence with AUI().use()&rdquo; below)</li> +<li>Remove existing <code>script</code>-tags that loads the javascript files &ldquo;manually&rdquo;</li> +<li>Rewrite code that access functions inside the new <code>require</code>-function from outside (e.g. click handlers, see below)</li> +</ol> +<h2 id="co-existence-with-auiuse">Co-existence with AUI().use()</h2> +<p>If you need to use AUI().use() in your code, e.g. to grab the PortletURL object, you have to call this function first and call <code>require</code> inside. Otherwise the code may not be executed correclty if the &lsquo;Drag&amp;Drop&rsquo; error occurs to early during page loading:</p> +<pre><code>AUI().use('liferay-portlet-url', function () { + require(['jquery', 'module/quickfilter') { + // AUI and require modules loaded and available + }); +}); +</code></pre> +<h2 id="migrate-click-handlers">Migrate click-handlers</h2> +<p>Since none of the defined functions remains in the global scope click handlers defined in the attributes of a tag would no longer work. Use jQuery to attach a click handler instead:</p> +<pre><code>$('#exportSpreadsheetButton').on('click.components', exportSpreadsheet) +</code></pre> +<p>This click handler is added inside the RequireJS-scope where the function <code>exportSpreadsheet</code> is defined. +You may also attach handler for distinct elements in each row of a table:</p> +<pre><code>$('#componentsTable').on('click.components', 'img.delete', function(event) { + // do stuff +}); +</code></pre> +<h2 id="make-a-module-out-of-a-jspf-include">Make a module out of a jspf-include</h2> +<p>There are many jspf-includes which contain html as well as javascript code. They should be converted as followed:</p> +<ol> +<li> +<p>Move the javascript code to an own file. Place it below the &lsquo;html/js&rsquo;-folder, following the same structure as the jspf-file. If the jspf-file is <code>html/components/includes/vendors/addVendor.jspf</code> place the javascript code in the file <code>js/components/includes/vendors/addVendor.js</code>.</p> +</li> +<li> +<p>Enclose the code in a define statement to define a new module:</p> +<pre><code> define('components/includes/vendors/addVendor', [ /* dependencies */ ], function() { + // define module code + }); +</code></pre> +</li> +</ol> +<p>In order to use the new module include the jspf-file and load the js-code via RequireJS:</p> +<pre><code>&lt;%@ include &quot;html/components/includes/vendors/addVendor.jspf&quot; %&gt; + +require(['components/includes/vendors/addVendor'], function(addVendor) { + // use addVendor +}); +</code></pre> +<h2 id="make-a-module-out-of-a-javascript-file-or-function">Make a module out of a javascript file or function</h2> +<p>There are several javascript files and functions below `/html/js&rsquo;. They can be make compatible to RequireJS as follows:</p> +<ol> +<li> +<p>Create a new file inside <code>/html/js/component</code> with a proper name that describes the functionality for the new component</p> +</li> +<li> +<p>Define the module and point to the legacy function, e.g.</p> +<pre><code> define('module/confirm', ['jquery', /* jquery-plugins: */ 'jquery-confirm', /* legacy code */ 'main' ], function($) { + return { + confirmDeletion: deleteConfirmed /* pointer to legacy method in main.js */ + }; + }); +</code></pre> +</li> +<li> +<p>Afterwards the module can be loaded using the name <code>component/confirm</code>, e.g.</p> +<pre><code> require(['module/confirm'], function(confirm) { + confirm.confirmDeletion(/*...*/); + }); +</code></pre> +</li> +</ol> +<p><strong>Note</strong> The legacy function should be moved inside the module as soon as the function is no longer accessed directly but via RequireJS only. +<strong>Note</strong> You can also require legacy javascript files if you need them as dependency as pointed out in the examples above.</p> + + + + + + Docs: Test Cases + https://www.eclipse.org/sw360/docs/developers/testcases/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/testcases/ + + + + + + + + + diff --git a/docs/developers/testcases/index.html b/docs/developers/testcases/index.html new file mode 100644 index 0000000..9f05d2e --- /dev/null +++ b/docs/developers/testcases/index.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + + + + + + + + + +Test Cases | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Test Cases

+
SW360 Assorted Test Cases
+ + +
+ + + + + + + + +
+ + +
+
+ Component / Release +
+

+
+ + +
+
+ Licenses +
+

+
+ + +
+
+ Moderation +
+

+
+ + +
+
+ Projects +
+

+
+ + +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/testcases/index.xml b/docs/developers/testcases/index.xml new file mode 100644 index 0000000..62073bb --- /dev/null +++ b/docs/developers/testcases/index.xml @@ -0,0 +1,1234 @@ + + + Eclipse SW360 – Test Cases + https://www.eclipse.org/sw360/docs/developers/testcases/ + Recent content in Test Cases on Eclipse SW360 + Hugo -- gohugo.io + + + + + + + + + + + Docs: Component / Release + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-components/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-components/ + + + + <h2 id="add-a-component-and-release-with-vendor-present">Add a component and release with vendor present</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Sign In with a known user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on <em>Components</em> tab</td> +<td style="text-align:left"><em>Components</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click <em>Add Component</em></td> +<td style="text-align:left"><em>New Component</em> page is displayed with mandatory fields marked with red star</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Fill in a component <em>Name</em> and <em>Categories</em> and click <em>Add Component</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page changes to <em>New Release Edit</em> page</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Fill in a release <em>Version</em> and <em>CPE ID</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click <em>Vendor</em> field</td> +<td style="text-align:left"><em>Search Vendor</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left"><em>Search</em> for a Vendor, select it and click <em>Select</em></td> +<td style="text-align:left">Dialog is closed and selected Vendor is added under <em>Vendor</em> field</td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click on <em>Attachments</em> link</td> +<td style="text-align:left"><em>Attachments</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">11</td> +<td style="text-align:left">Click on <em>Add Attachment</em></td> +<td style="text-align:left"><em>Upload Attachment</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Click <em>Browse</em> and select the attachment</td> +<td style="text-align:left">File name is displayed in the dialog</td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Click <em>Upload</em> button</td> +<td style="text-align:left">The file is uploaded and dialog is closed. Also the attached file is listed in the <em>Attachment</em> page</td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Change the <em>Attachment type</em> to real type, e.g. <em>Source file</em> if it is a source file</td> +<td style="text-align:left">Type changed successfully</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Click <em>Update Release</em></td> +<td style="text-align:left"><em>Release updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">16</td> +<td style="text-align:left">Click on <em>Components</em> tab</td> +<td style="text-align:left">The new component should be added to the components list (e.g. filter by <em>Keyword Search</em>)</td> +</tr> +</tbody> +</table> +<h2 id="modify-a-component-and-release-with-vendor-present">Modify a component and release with vendor present</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for an existing component (e.g. created in TC01) and click <em>Edit</em></td> +<td style="text-align:left"><em>You are editing the original document</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Execute steps 5-16 from TC01</td> +<td></td> +</tr> +</tbody> +</table> +<h2 id="add-and-modify-a-component-and-release-with-all-fields-filled-in">Add and modify a component and release with all fields filled in</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Click on <em>Components</em> tab</td> +<td style="text-align:left"><em>Components</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click <em>Add Component</em></td> +<td style="text-align:left"><em>New Component</em> page is displayed with mandatory fields marked with red star</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Fill in all editable fields under <em>Basic Information</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>Add Component</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page changes to <em>New Release Edit</em> page</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Fill in all editable fields under <em>Release Summary</em> and <em>Release Repository</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click on <em>Linked Releases</em> link</td> +<td style="text-align:left"><em>Linked Releases</em> page displayed successfully</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left"><em>Click to add Releases</em></td> +<td style="text-align:left"><em>Search Release</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click <em>Search by name</em> and <em>Select</em> a release to be added</td> +<td style="text-align:left">Dialog is closed and selected release is displayed under <em>Linked Releases</em> section</td> +</tr> +<tr> +<td style="text-align:right">11</td> +<td style="text-align:left">Click on <em>Clearing Details</em> link</td> +<td style="text-align:left"><em>Clearing Details</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Fill in all editable fields</td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Click on <em>Attachments</em> link and upload a file</td> +<td style="text-align:left">File attached successfully</td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Click <em>Update Release</em></td> +<td style="text-align:left"><em>Release updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Check all fields of the release under <em>Summary</em>, <em>Linked Releases</em>, <em>Clearing Details</em> and <em>Attachments</em></td> +<td style="text-align:left">Values are filled in correctly</td> +</tr> +<tr> +<td style="text-align:right">16</td> +<td style="text-align:left">Click <em>Edit</em> button, modify some fields and <em>Update Release</em></td> +<td style="text-align:left">Values are updated successfully</td> +</tr> +</tbody> +</table> +<h2 id="delete-a-component-that-is-first-linked-to-a-project-and-then-not-and-a-project">Delete a component that is first linked to a project and then not, and a project</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Create a new component</td> +<td style="text-align:left">Component is created successfully</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Add a new release to this component</td> +<td style="text-align:left">Release is added successfully</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Create a new project</td> +<td style="text-align:left">Project is created successfully</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Add the linked release created above to this project</td> +<td style="text-align:left">Release linked successfully</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Go to components, try to delete the newly created component (that is linked to a project)</td> +<td style="text-align:left">Message <em>I could not delete the component!</em> is displayed.</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Component is not deleted</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Go to Projects, delete the newly created project</td> +<td style="text-align:left">Project is deleted successfully</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Go to components, delete the newly created components (not linked anymore to a project)</td> +<td style="text-align:left">Message <em>Do you want to delete component?</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Component is deleted successfully</td> +</tr> +</tbody> +</table> +<h2 id="add-new-attachments-to-an-existing-release-and-delete-attachments">Add new attachments to an existing release and delete attachments</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for an existing component (e.g. created in TC01) and click <em>Release Overview</em></td> +<td style="text-align:left">The list of releases are displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on release version that needs a new attachment</td> +<td style="text-align:left"><em>Release Summary: name</em> page is displayed for the selected release</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click on <em>Edit</em></td> +<td style="text-align:left"><em>You are editing the original document.</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click on <em>Attachments</em> link</td> +<td style="text-align:left"><em>Attachments</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click on <em>Add Attachment</em></td> +<td style="text-align:left"><em>Upload Attachment</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>Browse</em> and select several attachments</td> +<td style="text-align:left">File names are displayed in the dialog</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Cancel</em> near some files not to be added</td> +<td style="text-align:left">File names are removed from the list</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click <em>Upload</em> button for the remaining files</td> +<td style="text-align:left">The files are uploaded and dialog is closed. Also the attached file are listed in the <em>Attachment</em> page</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Change some <em>Attachment type</em> to real type, e.g. <em>Source file</em> if it is a source file</td> +<td style="text-align:left">Type changed successfully</td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click <em>Update Release</em></td> +<td style="text-align:left"><em>Release updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">11</td> +<td style="text-align:left">Click on <em>Edit</em></td> +<td style="text-align:left"><em>You are editing the original document.</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Click on <em>Attachments</em> link</td> +<td style="text-align:left"><em>Attachments</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Click on <em>Delete</em> icon to delete an attachment</td> +<td style="text-align:left">Message <em>Do you really want to delete this attachment?</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Attachment is deleted successfully</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Click <em>Update Release</em></td> +<td style="text-align:left"><em>Release updated successfully!</em> message is displayed</td> +</tr> +</tbody> +</table> +<h2 id="duplicate-an-existing-release">Duplicate an existing release</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for an existing component with release with all fields filled in (e.g. created in TC03) and click <em>Release Overview</em></td> +<td style="text-align:left">The list of releases are displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click <em>Duplicate</em> button under Action column</td> +<td style="text-align:left">The page changes to <em>Release name Edit</em></td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Check all fields from copied release</td> +<td style="text-align:left">All fields from <em>Release Summary</em> and <em>Repository</em> are unchanged</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Change the <em>Version</em> field to a new one, fill in a <em>CPE ID</em> and click <em>Add Release</em></td> +<td style="text-align:left"><em>You are editing the original document.</em> message is displayed.</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Modify some other fields, e.g. <em>Release Date</em> and click <em>Clearing Details</em></td> +<td style="text-align:left"><em>Clearing Details</em> page is displayed and does not contain any field from copied release</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>Update Release</em></td> +<td style="text-align:left"><em>Release Component updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click on component name link on top of the page</td> +<td style="text-align:left">Summary page for the component is displayed</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click on _Release Overview</td> +<td style="text-align:left">The new copied release is listed among previous releases</td> +</tr> +</tbody> +</table> +<h2 id="search-for-and-create-a-new-vendor-for-a-new-release">Search for and create a new vendor for a new release</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for an existing component and click <em>Edit</em></td> +<td style="text-align:left"><em>You are editing the original document</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page changes to <em>New Release Edit</em> page</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Fill in a release <em>Version</em> and <em>CPE ID</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>Vendor</em> field</td> +<td style="text-align:left"><em>Search Vendor</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Add New Vendor</em></td> +<td style="text-align:left"><em>Create New Vendor</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Fill in <em>Full name</em>, <em>Short name</em> and <em>URL</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Add Vendor</em></td> +<td style="text-align:left">Dialog closes and the new vendor is displayed in release <em>Vendor</em> field</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Click on component name link on top of the page</td> +<td style="text-align:left">Summary page for the component is displayed. The new vendor for the new release, as well as existing vendors from previous releases are listed under <em>Vendors</em> field for the component</td> +</tr> +</tbody> +</table> + + + + + + Docs: Licenses + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-licenses/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-licenses/ + + + + <h2 id="create-edit-and-delete-license">Create, edit and delete license</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Sign In with a known <em>clearing admin</em> user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on <em>Licenses</em> tab</td> +<td style="text-align:left"><em>Licenses</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click on <em>Add License</em></td> +<td style="text-align:left"><em>New License</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Fill in <em>Fullname</em> and <em>Shortname</em> fields and press <em>Add License</em></td> +<td style="text-align:left"><em>License added successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Write the license or part of newly created license name in <em>Keyword Search</em> field</td> +<td style="text-align:left">License is filtered successfully</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click on license name and then on <em>Edit License Details and Text</em></td> +<td style="text-align:left">License page is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Modify some fields and click <em>Update License</em></td> +<td style="text-align:left"><em>License updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Check all fields on <em>Details</em> and <em>Text</em> pages</td> +<td style="text-align:left">Values are filled in correctly</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Click on <em>Edit License Details and Text</em></td> +<td style="text-align:left">License page is displayed</td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click o <em>Delete</em> license name</td> +<td style="text-align:left"><em>License removed successfully!</em> message is displayed</td> +</tr> +</tbody> +</table> +<h2 id="edit-license-todos-and-obligations">Edit license TODOs and Obligations</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Sign In with a known <em>clearing admin</em> user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on previously created license name</td> +<td style="text-align:left"><em>License Details</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click on <em>Add a Todo</em></td> +<td style="text-align:left">Todo page displayed successfully</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Enter a Todo text (e.g. &ldquo;First todo text&rdquo;), click <em>Applies to development</em>, and click <em>Submit</em></td> +<td style="text-align:left"><em>License updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>TODOs and Obligations</em></td> +<td style="text-align:left">The previously entered Todo is listed on the page with <em>No obligations</em></td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click on <em>Add a Todo</em></td> +<td style="text-align:left">Todo page displayed successfully</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Enter a Todo text (e.g. &ldquo;Second todo text&rdquo;), click on some Obligations and click Submit</td> +<td style="text-align:left"><em>License updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click TODOs and Obligations</td> +<td style="text-align:left">The previously entered Todo is listed on the page together with chosen obligations</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Click on <em>Edit WhiteList</em>, deselect first Todo and click <em>Submit</em></td> +<td style="text-align:left">The deselected Todo is not displayed anymore on <em>TODOs and Obligations</em> page</td> +</tr> +</tbody> +</table> +<h2 id="check-export-licenses">Check Export Licenses</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Sign In with a known user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on <em>Licenses</em> tab</td> +<td style="text-align:left"><em>Licenses</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click on <em>Export Licenses</em></td> +<td style="text-align:left">A dialog for opening <em>Licenses.xlsx</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Open the xlsx file and compare the number of rows with total number of entries from <em>Licenses</em> tab</td> +<td style="text-align:left">All licenses names are exported successfully.</td> +</tr> +</tbody> +</table> + + + + + + Docs: Moderation + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-moderations/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-moderations/ + + + + <h2 id="accept-moderation-request-for-visible-projects-by-other-users">Accept moderation request, for visible projects by other users</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Open first browser instance ((e.g. &ldquo;firefox.exe -p &ldquo;profile1&rdquo; -no-remote&rdquo;) and sign in with a known <em>First</em> user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Open a second browser instance ((e.g. &ldquo;firefox.exe -p &ldquo;profile2&rdquo; -no-remote&rdquo;) and sign in with a known <em>Second</em> user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Activate <em>First</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Create a new project visible for <em>Second</em> user (e.g. <em>Me and Moderators</em>, <em>Group and Moderators</em>, <em>Everyone</em>)</td> +<td style="text-align:left">Project is created successfully</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Activate <em>Second</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Search for the above created project and click <em>Edit</em></td> +<td style="text-align:left"><em>You will create a moderation request if you update.</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Edit Description field or other fields and click <em>Update Project</em></td> +<td style="text-align:left"><em>Moderation request was sent to update the Project name!</em> message is displayed.</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Activate <em>First</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Check <em>My Task Assignments</em> on <em>Home</em> page</td> +<td style="text-align:left">The above project that needs moderation is displayed with status <em>PENDING</em></td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click on <em>Moderation</em> page</td> +<td style="text-align:left">The moderation request of <em>Second</em> user is displayed with state <em>Pending</em></td> +</tr> +<tr> +<td style="text-align:right">11</td> +<td style="text-align:left">Click on moderation request</td> +<td style="text-align:left"><em>Moderation Change Project</em> page is displayed, with proposed changes from step 7 listed</td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Click on <em>Accept Request</em></td> +<td style="text-align:left"><em>You have accepted the previous moderation request.</em> message is displayed, and State changes to <em>Approved</em></td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Check <em>My Task Assignments</em> on <em>Home</em> page</td> +<td style="text-align:left">Status is <em>APPROVED</em></td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Activate <em>Second</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Check _My Task Submissions on <em>Home</em> page</td> +<td style="text-align:left">Status is <em>APPROVED</em></td> +</tr> +<tr> +<td style="text-align:right">16</td> +<td style="text-align:left">Open the <em>Projects</em> tab and click on previously modified project on step 7</td> +<td style="text-align:left">Project <em>Summary</em> page displayed successfully</td> +</tr> +<tr> +<td style="text-align:right">17</td> +<td style="text-align:left">Check the moderation requested changes</td> +<td style="text-align:left">Changes are visible in the corresponding fields</td> +</tr> +</tbody> +</table> +<h2 id="decline-moderation-request-for-visible-projects-by-other-users">Decline moderation request, for visible projects by other users</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1-11</td> +<td style="text-align:left">Same as in TC01</td> +<td></td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Click on <em>Decline Request</em></td> +<td style="text-align:left"><em>You have declined the previous moderation request</em> message is displayed, and State changes to <em>Rejected</em></td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Check <em>My Task Assignments</em> on <em>Home</em> page</td> +<td style="text-align:left">Status is <em>REJECTED</em></td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Activate <em>Second</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Check _My Task Submissions on <em>Home</em> page</td> +<td style="text-align:left">Status is <em>REJECTED</em></td> +</tr> +<tr> +<td style="text-align:right">16</td> +<td style="text-align:left">Open the <em>Projects</em> tab and click on previously modified project on step 7</td> +<td style="text-align:left">Project <em>Summary</em> page displayed successfully</td> +</tr> +<tr> +<td style="text-align:right">17</td> +<td style="text-align:left">Check the moderation requested changes</td> +<td style="text-align:left">Changes are not visible in the corresponding fields</td> +</tr> +</tbody> +</table> +<h2 id="remove-me-from-moderators-for-moderation-request-for-visible-projects-by-other-users">Remove Me from Moderators for moderation request, for visible projects by other users</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1-11</td> +<td style="text-align:left">Same as in TC01</td> +<td></td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Click on <em>Remove Me from Moderators</em></td> +<td style="text-align:left"><em>You are the last moderator for this request - you are not allowed to unsubscribe.</em> message is displayed (assuming only <em>First</em> user was listed under <em>Moderators</em> column in step 10)</td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Click on <em>Decline Request</em></td> +<td style="text-align:left"><em>You have declined the previous moderation request</em> message is displayed, and State changes to <em>Rejected</em></td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Edit the project and add a new moderator (e.g. <em>Third</em> user) under <em>Moderators</em> field</td> +<td style="text-align:left">Project updated successfully.</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Activate <em>Second</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">16</td> +<td style="text-align:left">Edit the project and create a new moderation request</td> +<td style="text-align:left">Moderation request was sent</td> +</tr> +<tr> +<td style="text-align:right">17</td> +<td style="text-align:left">Activate <em>First</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">18</td> +<td style="text-align:left">Click on <em>Moderation</em> page</td> +<td style="text-align:left">The moderation request of <em>Second</em> user is displayed with state <em>Pending</em></td> +</tr> +<tr> +<td style="text-align:right">19</td> +<td style="text-align:left">Click on moderation request</td> +<td style="text-align:left"><em>Moderation Change Project</em> page is displayed, with proposed changes from step 7 listed</td> +</tr> +<tr> +<td style="text-align:right">20</td> +<td style="text-align:left">Click on <em>Remove Me from Moderators</em></td> +<td style="text-align:left"><em>You are removed from the list of moderators for the previous moderation request. You have no open Requests.</em> message is displayed. Also the document is deleted from moderation list.</td> +</tr> +<tr> +<td style="text-align:right">21</td> +<td style="text-align:left">Login with the <em>Third</em> user and check the <em>Moderation</em> tab</td> +<td style="text-align:left">The moderation request of <em>Second</em> user is displayed with state <em>Pending</em></td> +</tr> +</tbody> +</table> + + + + + + Docs: Projects + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-projects/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-projects/ + + + + <h2 id="add-a-simple-project-with-no-relations-and-no-releases">Add a simple project with no relations and no releases</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Sign In with a known user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on <em>Projects</em> tab</td> +<td style="text-align:left"><em>Projects</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left"><em>New Project</em> page is displayed with mandatory fields marked with red star</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Fill mandatory <em>Name</em> with a project name, change other fields if needed</td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>Cancel</em> button</td> +<td style="text-align:left">New project <em>Summary</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click on <em>Projects</em> tab</td> +<td style="text-align:left">The new project should be added to the projects list</td> +</tr> +</tbody> +</table> +<h2 id="add-a-full-project-with-relations-releases-and-send-to-clearing-process">Add a full project with relations, releases and send to clearing process</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Click on <em>Projects</em> tab</td> +<td style="text-align:left"><em>Projects</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left"><em>New Project</em> page is displayed with mandatory fields marked with red star</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Fill mandatory <em>Name</em> with a project name, change other fields if needed</td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>Click to add linked Projects</em></td> +<td style="text-align:left"><em>Search Project</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Search</em> and <em>Select</em> the project to be linked (e.g. created in TC01)</td> +<td style="text-align:left">Dialog is closed and selected project is displayed under <em>Linked Projects</em> section</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>Click to add Releases</em></td> +<td style="text-align:left"><em>Search Release</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Search by name</em> and <em>Select</em> a release to be added</td> +<td style="text-align:left">Dialog is closed and selected release is displayed under <em>Linked Releases</em> section</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Click <em>Cancel</em> button</td> +<td style="text-align:left">New project <em>Summary</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click on <em>Projects</em> tab</td> +<td style="text-align:left">The new project should be added to the projects list</td> +</tr> +<tr> +<td style="text-align:right">11</td> +<td style="text-align:left">Check <em>Clearing Status</em> by hovering mouse over the numbers.</td> +<td style="text-align:left">The message should be <em>new release, under clearing&hellip;</em></td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Send open release to clearing by clicking the button <em>Send to fossology</em>, under <em>Actions</em> column</td> +<td style="text-align:left"><em>Fossology Clearing</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Select the release to be sent for clearing and click <em>Send</em></td> +<td style="text-align:left"><em>Sent</em> message is displayed near the <em>Send to fossology</em> button</td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Click on project name and check <em>Summary</em> page</td> +<td style="text-align:left"><em>Clearing details</em> should have 1 for <em>Under clearing</em></td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Click on <em>Clearing Status</em></td> +<td style="text-align:left">The &ldquo;Release Clearing State_ should be <em>Sent to Fossology</em></td> +</tr> +</tbody> +</table> +<h2 id="add-a-project-with-releases-no-relations-remove-a-release-and-send-to-clearing-process">Add a project with releases, no relations, remove a release, and send to clearing process</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1-5</td> +<td style="text-align:left">Same as in TC02</td> +<td></td> +</tr> +<tr> +<td style="text-align:right">5a</td> +<td style="text-align:left">Click on <em>Delete</em> icon to delete the linked project</td> +<td style="text-align:left"><em>Do you really want to remove the link to this project?</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">5b</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">The project is removed from the list of <em>Linked Projects</em></td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>Click to add Releases</em></td> +<td style="text-align:left"><em>Search Release</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Search by name</em> and <em>Select</em> more than one release to be added</td> +<td style="text-align:left">Dialog is closed and selected releases are displayed under <em>Linked Releases</em> section</td> +</tr> +<tr> +<td style="text-align:right">7a</td> +<td style="text-align:left">Click on <em>Delete</em> icon to delete one of the linked release</td> +<td style="text-align:left"><em>Do you really want to remove the link to this release?</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">7b</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">The release is removed from the list of <em>Linked Releases</em></td> +</tr> +<tr> +<td style="text-align:right">8-15</td> +<td style="text-align:left">Same as in TC02</td> +<td></td> +</tr> +</tbody> +</table> +<p>##TC04: Delete a project that is first linked to another project and then not linked</p> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Create a new project</td> +<td style="text-align:left">Project is created successfully</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Create another project and add first created one as linked project</td> +<td style="text-align:left">Projects are linked successfully</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Go to first created project in the projects table and try to delete it</td> +<td style="text-align:left">Message <em>Do you want to delete project name?</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Message <em>The project is used by another project!</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Project is not deleted (e.g. refresh the page by clicking Projects tab)</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Go to second created project in the projects table and delete it</td> +<td style="text-align:left">Message <em>Do you want to delete project name?</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Project is deleted successfully</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Go to first created project in the table (not linked anymore to second project) and delete it</td> +<td style="text-align:left">Project is deleted successfully</td> +</tr> +</tbody> +</table> +<h2 id="modify-an-existing-project-with-relations-releases-and-send-to-clearing-process">Modify an existing project with relations, releases and send to clearing process</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for a simple project (e.g. created in TC01) and click <em>Edit</em></td> +<td style="text-align:left"><em>You are editing the original document</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Execute steps 5-16 from TC02</td> +<td></td> +</tr> +</tbody> +</table> +<h2 id="add-and-modify-a-project-with-all-project-fields-filled-in">Add and modify a project with all project fields filled in</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Click on <em>Projects</em> tab</td> +<td style="text-align:left"><em>Projects</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left"><em>New Project</em> page is displayed with mandatory fields marked with red star</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Fill in all editable fields under <em>Basic Information</em>, <em>User Information</em> and <em>Admin Information</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Cancel</em> button</td> +<td style="text-align:left">New project <em>Summary</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Check all fields on <em>Summary</em> page</td> +<td style="text-align:left">Values are filled in correctly</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Edit</em> button, modify some fields and <em>Update Project</em></td> +<td style="text-align:left">Values are updated successfully</td> +</tr> +</tbody> +</table> +<h2 id="duplicate-an-existing-project">Duplicate an existing project</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for an existing project with all fields filled in (e.g. created in TC06) and click <em>Duplicate</em> button under <em>Actions</em> column</td> +<td style="text-align:left">Project <em>Information</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Check all fields from copied project</td> +<td style="text-align:left">All fields are unchanged, including <em>Linked Projects</em> and <em>Linked Releases</em></td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Fill mandatory <em>Name</em> with a project name and click <em>Add Project</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>Cancel</em> button</td> +<td style="text-align:left">New project <em>Summary</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Check all fields</td> +<td style="text-align:left">All fields were copied successfully, except the new name of the project</td> +</tr> +</tbody> +</table> + + + + + + diff --git a/docs/developers/testcases/test-cases-components/index.html b/docs/developers/testcases/test-cases-components/index.html new file mode 100644 index 0000000..c5b5958 --- /dev/null +++ b/docs/developers/testcases/test-cases-components/index.html @@ -0,0 +1,1106 @@ + + + + + + + + + + + + + + + + + + + + +Component / Release | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Component / Release

+ + +

Add a component and release with vendor present

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Sign In with a known userUser successfully signed in and Home page is displayed
2Click on Components tabComponents page is displayed
3Click Add ComponentNew Component page is displayed with mandatory fields marked with red star
4Fill in a component Name and Categories and click Add ComponentThe page remain the same and the message You are editing the original document. is displayed
5Click Add ReleaseThe page changes to New Release Edit page
6Fill in a release Version and CPE IDValues are entered in the fields
7Click Add ReleaseThe page remain the same and the message You are editing the original document. is displayed
8Click Vendor fieldSearch Vendor dialog is displayed
9Search for a Vendor, select it and click SelectDialog is closed and selected Vendor is added under Vendor field
10Click on Attachments linkAttachments page is displayed
11Click on Add AttachmentUpload Attachment dialog is displayed
12Click Browse and select the attachmentFile name is displayed in the dialog
13Click Upload buttonThe file is uploaded and dialog is closed. Also the attached file is listed in the Attachment page
14Change the Attachment type to real type, e.g. Source file if it is a source fileType changed successfully
15Click Update ReleaseRelease updated successfully! message is displayed
16Click on Components tabThe new component should be added to the components list (e.g. filter by Keyword Search)
+

Modify a component and release with vendor present

+ + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Search for an existing component (e.g. created in TC01) and click EditYou are editing the original document message is displayed
2Execute steps 5-16 from TC01
+

Add and modify a component and release with all fields filled in

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Click on Components tabComponents page is displayed
2Click Add ComponentNew Component page is displayed with mandatory fields marked with red star
3Fill in all editable fields under Basic InformationValues are entered in the fields
4Click Add ComponentThe page remain the same and the message You are editing the original document. is displayed
5Click Add ReleaseThe page changes to New Release Edit page
6Fill in all editable fields under Release Summary and Release RepositoryValues are entered in the fields
7Click Add ReleaseThe page remain the same and the message You are editing the original document. is displayed
8Click on Linked Releases linkLinked Releases page displayed successfully
9Click to add ReleasesSearch Release dialog is displayed
10Click Search by name and Select a release to be addedDialog is closed and selected release is displayed under Linked Releases section
11Click on Clearing Details linkClearing Details dialog is displayed
12Fill in all editable fieldsValues are entered in the fields
13Click on Attachments link and upload a fileFile attached successfully
14Click Update ReleaseRelease updated successfully! message is displayed
15Check all fields of the release under Summary, Linked Releases, Clearing Details and AttachmentsValues are filled in correctly
16Click Edit button, modify some fields and Update ReleaseValues are updated successfully
+

Delete a component that is first linked to a project and then not, and a project

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Create a new componentComponent is created successfully
2Add a new release to this componentRelease is added successfully
3Create a new projectProject is created successfully
4Add the linked release created above to this projectRelease linked successfully
5Go to components, try to delete the newly created component (that is linked to a project)Message I could not delete the component! is displayed.
6Click OKComponent is not deleted
7Go to Projects, delete the newly created projectProject is deleted successfully
8Go to components, delete the newly created components (not linked anymore to a project)Message Do you want to delete component? is displayed
9Click OKComponent is deleted successfully
+

Add new attachments to an existing release and delete attachments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Search for an existing component (e.g. created in TC01) and click Release OverviewThe list of releases are displayed
2Click on release version that needs a new attachmentRelease Summary: name page is displayed for the selected release
3Click on EditYou are editing the original document. message is displayed
4Click on Attachments linkAttachments page is displayed
5Click on Add AttachmentUpload Attachment dialog is displayed
6Click Browse and select several attachmentsFile names are displayed in the dialog
7Click Cancel near some files not to be addedFile names are removed from the list
8Click Upload button for the remaining filesThe files are uploaded and dialog is closed. Also the attached file are listed in the Attachment page
9Change some Attachment type to real type, e.g. Source file if it is a source fileType changed successfully
10Click Update ReleaseRelease updated successfully! message is displayed
11Click on EditYou are editing the original document. message is displayed
12Click on Attachments linkAttachments page is displayed
13Click on Delete icon to delete an attachmentMessage Do you really want to delete this attachment? is displayed
14Click OKAttachment is deleted successfully
15Click Update ReleaseRelease updated successfully! message is displayed
+

Duplicate an existing release

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Search for an existing component with release with all fields filled in (e.g. created in TC03) and click Release OverviewThe list of releases are displayed
2Click Duplicate button under Action columnThe page changes to Release name Edit
3Check all fields from copied releaseAll fields from Release Summary and Repository are unchanged
4Change the Version field to a new one, fill in a CPE ID and click Add ReleaseYou are editing the original document. message is displayed.
5Modify some other fields, e.g. Release Date and click Clearing DetailsClearing Details page is displayed and does not contain any field from copied release
6Click Update ReleaseRelease Component updated successfully! message is displayed
7Click on component name link on top of the pageSummary page for the component is displayed
8Click on _Release OverviewThe new copied release is listed among previous releases
+

Search for and create a new vendor for a new release

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Search for an existing component and click EditYou are editing the original document message is displayed
2Click Add ReleaseThe page changes to New Release Edit page
3Fill in a release Version and CPE IDValues are entered in the fields
4Click Vendor fieldSearch Vendor dialog is displayed
5Click Add New VendorCreate New Vendor dialog is displayed
6Fill in Full name, Short name and URLValues are entered in the fields
7Click Add VendorDialog closes and the new vendor is displayed in release Vendor field
8Click Add ReleaseThe page remain the same and the message You are editing the original document. is displayed
9Click on component name link on top of the pageSummary page for the component is displayed. The new vendor for the new release, as well as existing vendors from previous releases are listed under Vendors field for the component
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/testcases/test-cases-licenses/index.html b/docs/developers/testcases/test-cases-licenses/index.html new file mode 100644 index 0000000..eea222c --- /dev/null +++ b/docs/developers/testcases/test-cases-licenses/index.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + + + + + + + + +Licenses | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Licenses

+ + +

Create, edit and delete license

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Sign In with a known clearing admin userUser successfully signed in and Home page is displayed
2Click on Licenses tabLicenses page is displayed
3Click on Add LicenseNew License page is displayed
4Fill in Fullname and Shortname fields and press Add LicenseLicense added successfully! message is displayed
5Write the license or part of newly created license name in Keyword Search fieldLicense is filtered successfully
6Click on license name and then on Edit License Details and TextLicense page is displayed
7Modify some fields and click Update LicenseLicense updated successfully! message is displayed
8Check all fields on Details and Text pagesValues are filled in correctly
9Click on Edit License Details and TextLicense page is displayed
10Click o Delete license nameLicense removed successfully! message is displayed
+

Edit license TODOs and Obligations

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Sign In with a known clearing admin userUser successfully signed in and Home page is displayed
2Click on previously created license nameLicense Details page is displayed
3Click on Add a TodoTodo page displayed successfully
4Enter a Todo text (e.g. “First todo text”), click Applies to development, and click SubmitLicense updated successfully! message is displayed
5Click TODOs and ObligationsThe previously entered Todo is listed on the page with No obligations
6Click on Add a TodoTodo page displayed successfully
7Enter a Todo text (e.g. “Second todo text”), click on some Obligations and click SubmitLicense updated successfully! message is displayed
8Click TODOs and ObligationsThe previously entered Todo is listed on the page together with chosen obligations
9Click on Edit WhiteList, deselect first Todo and click SubmitThe deselected Todo is not displayed anymore on TODOs and Obligations page
+

Check Export Licenses

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Sign In with a known userUser successfully signed in and Home page is displayed
2Click on Licenses tabLicenses page is displayed
3Click on Export LicensesA dialog for opening Licenses.xlsx is displayed
4Open the xlsx file and compare the number of rows with total number of entries from Licenses tabAll licenses names are exported successfully.
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/testcases/test-cases-moderations/index.html b/docs/developers/testcases/test-cases-moderations/index.html new file mode 100644 index 0000000..1225481 --- /dev/null +++ b/docs/developers/testcases/test-cases-moderations/index.html @@ -0,0 +1,853 @@ + + + + + + + + + + + + + + + + + + + + +Moderation | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Moderation

+ + +

Accept moderation request, for visible projects by other users

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Open first browser instance ((e.g. “firefox.exe -p “profile1” -no-remote”) and sign in with a known First userUser successfully signed in and Home page is displayed
2Open a second browser instance ((e.g. “firefox.exe -p “profile2” -no-remote”) and sign in with a known Second userUser successfully signed in and Home page is displayed
3Activate First browser instanceInstance is active
4Create a new project visible for Second user (e.g. Me and Moderators, Group and Moderators, Everyone)Project is created successfully
5Activate Second browser instanceInstance is active
6Search for the above created project and click EditYou will create a moderation request if you update. message is displayed
7Edit Description field or other fields and click Update ProjectModeration request was sent to update the Project name! message is displayed.
8Activate First browser instanceInstance is active
9Check My Task Assignments on Home pageThe above project that needs moderation is displayed with status PENDING
10Click on Moderation pageThe moderation request of Second user is displayed with state Pending
11Click on moderation requestModeration Change Project page is displayed, with proposed changes from step 7 listed
12Click on Accept RequestYou have accepted the previous moderation request. message is displayed, and State changes to Approved
13Check My Task Assignments on Home pageStatus is APPROVED
14Activate Second browser instanceInstance is active
15Check _My Task Submissions on Home pageStatus is APPROVED
16Open the Projects tab and click on previously modified project on step 7Project Summary page displayed successfully
17Check the moderation requested changesChanges are visible in the corresponding fields
+

Decline moderation request, for visible projects by other users

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1-11Same as in TC01
12Click on Decline RequestYou have declined the previous moderation request message is displayed, and State changes to Rejected
13Check My Task Assignments on Home pageStatus is REJECTED
14Activate Second browser instanceInstance is active
15Check _My Task Submissions on Home pageStatus is REJECTED
16Open the Projects tab and click on previously modified project on step 7Project Summary page displayed successfully
17Check the moderation requested changesChanges are not visible in the corresponding fields
+

Remove Me from Moderators for moderation request, for visible projects by other users

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1-11Same as in TC01
12Click on Remove Me from ModeratorsYou are the last moderator for this request - you are not allowed to unsubscribe. message is displayed (assuming only First user was listed under Moderators column in step 10)
13Click on Decline RequestYou have declined the previous moderation request message is displayed, and State changes to Rejected
14Edit the project and add a new moderator (e.g. Third user) under Moderators fieldProject updated successfully.
15Activate Second browser instanceInstance is active
16Edit the project and create a new moderation requestModeration request was sent
17Activate First browser instanceInstance is active
18Click on Moderation pageThe moderation request of Second user is displayed with state Pending
19Click on moderation requestModeration Change Project page is displayed, with proposed changes from step 7 listed
20Click on Remove Me from ModeratorsYou are removed from the list of moderators for the previous moderation request. You have no open Requests. message is displayed. Also the document is deleted from moderation list.
21Login with the Third user and check the Moderation tabThe moderation request of Second user is displayed with state Pending
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/developers/testcases/test-cases-projects/index.html b/docs/developers/testcases/test-cases-projects/index.html new file mode 100644 index 0000000..ac9fa34 --- /dev/null +++ b/docs/developers/testcases/test-cases-projects/index.html @@ -0,0 +1,990 @@ + + + + + + + + + + + + + + + + + + + + +Projects | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Projects

+ + +

Add a simple project with no relations and no releases

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Sign In with a known userUser successfully signed in and Home page is displayed
2Click on Projects tabProjects page is displayed
3Click Add ProjectNew Project page is displayed with mandatory fields marked with red star
4Fill mandatory Name with a project name, change other fields if neededValues are entered in the fields
5Click Add ProjectThe page remain the same and the message You are editing the original document. is displayed
6Click Cancel buttonNew project Summary page is displayed
7Click on Projects tabThe new project should be added to the projects list
+

Add a full project with relations, releases and send to clearing process

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Click on Projects tabProjects page is displayed
2Click Add ProjectNew Project page is displayed with mandatory fields marked with red star
3Fill mandatory Name with a project name, change other fields if neededValues are entered in the fields
4Click Click to add linked ProjectsSearch Project dialog is displayed
5Click Search and Select the project to be linked (e.g. created in TC01)Dialog is closed and selected project is displayed under Linked Projects section
6Click Click to add ReleasesSearch Release dialog is displayed
7Click Search by name and Select a release to be addedDialog is closed and selected release is displayed under Linked Releases section
8Click Add ProjectThe page remain the same and the message You are editing the original document. is displayed
9Click Cancel buttonNew project Summary page is displayed
10Click on Projects tabThe new project should be added to the projects list
11Check Clearing Status by hovering mouse over the numbers.The message should be new release, under clearing…
12Send open release to clearing by clicking the button Send to fossology, under Actions columnFossology Clearing dialog is displayed
13Select the release to be sent for clearing and click SendSent message is displayed near the Send to fossology button
14Click on project name and check Summary pageClearing details should have 1 for Under clearing
15Click on Clearing StatusThe “Release Clearing State_ should be Sent to Fossology
+

Add a project with releases, no relations, remove a release, and send to clearing process

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1-5Same as in TC02
5aClick on Delete icon to delete the linked projectDo you really want to remove the link to this project? message is displayed
5bClick OKThe project is removed from the list of Linked Projects
6Click Click to add ReleasesSearch Release dialog is displayed
7Click Search by name and Select more than one release to be addedDialog is closed and selected releases are displayed under Linked Releases section
7aClick on Delete icon to delete one of the linked releaseDo you really want to remove the link to this release? message is displayed
7bClick OKThe release is removed from the list of Linked Releases
8-15Same as in TC02
+

##TC04: Delete a project that is first linked to another project and then not linked

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Create a new projectProject is created successfully
2Create another project and add first created one as linked projectProjects are linked successfully
3Go to first created project in the projects table and try to delete itMessage Do you want to delete project name? is displayed
4Click OKMessage The project is used by another project! is displayed
5Click OKProject is not deleted (e.g. refresh the page by clicking Projects tab)
6Go to second created project in the projects table and delete itMessage Do you want to delete project name? is displayed
7Click OKProject is deleted successfully
8Go to first created project in the table (not linked anymore to second project) and delete itProject is deleted successfully
+

Modify an existing project with relations, releases and send to clearing process

+ + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Search for a simple project (e.g. created in TC01) and click EditYou are editing the original document message is displayed
2Execute steps 5-16 from TC02
+

Add and modify a project with all project fields filled in

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Click on Projects tabProjects page is displayed
2Click Add ProjectNew Project page is displayed with mandatory fields marked with red star
3Fill in all editable fields under Basic Information, User Information and Admin InformationValues are entered in the fields
4Click Add ProjectThe page remain the same and the message You are editing the original document. is displayed
5Click Cancel buttonNew project Summary page is displayed
6Check all fields on Summary pageValues are filled in correctly
7Click Edit button, modify some fields and Update ProjectValues are updated successfully
+

Duplicate an existing project

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StepActionResult
1Search for an existing project with all fields filled in (e.g. created in TC06) and click Duplicate button under Actions columnProject Information page is displayed
2Check all fields from copied projectAll fields are unchanged, including Linked Projects and Linked Releases
3Fill mandatory Name with a project name and click Add ProjectThe page remain the same and the message You are editing the original document. is displayed
4Click Cancel buttonNew project Summary page is displayed
5Check all fieldsAll fields were copied successfully, except the new name of the project
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..4a3177e --- /dev/null +++ b/docs/index.html @@ -0,0 +1,898 @@ + + + + + + + + + + + + + + + + + + + + + +SW360 Documentation | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

SW360 Documentation

+ + +

For development, please see the README.md file of the project first. Please check also the pages on the right widget of pages. Not every page there has a link on this page!

+

Getting started

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameURLRemarks
Main home pagehttps://www.eclipse.org/sw360/main home page with general info
Project @ Githubhttps://github.com/eclipse/sw360where the music plays
Developer mailing listsw360-dev@eclipse.orgfor developers, discussion about developing
Slack Channelhttps://sw360chat.slack.com/the main chat spot, everybody is welcome
Slack Channel Invitation LinkSharable join link to jointhat should bring you in
sw360 developer meetingMeeting InfoEveryone is welcome!
+

Naming Policies for this Wiki

+

Please start every page with a prefix

+
    +
  1. User: topics suitable for admins and end users
  2. +
  3. Deploy: All things about deployment
  4. +
  5. Dev: All topics for developers
  6. +
  7. Test: Also a topic for developers, but also around testing
  8. +
+

Using sw360

+

For using the sw360 as a user, please see the following basic workflows:

+ +

General

+ +

Special

+
    +
  1. Find information about the role and access model
  2. +
  3. If you are interested in the concept about moderation requests, read the documentation here.
  4. +
  5. Explaining [[enumerations used in SW360|https://github.com/eclipse/sw360/wiki/User-Data-Model-Enumerations]]
  6. +
+

Deploying sw360

+

For the deployment of the SW360, it is about deploying a Liferay server application. Please understand, that apart from trying sw360 for a short while, for deployments of SW360 in your organisation you will need knowledge about how to deploy Java server applications. Regardless of the deployment approach the following main elements need to be considered:

+
    +
  • A Liferay Community Edition bundeled with Tomcat.
  • +
  • Install CouchDB (this is where SW360 stores all the source code, SPDX files and metadata), depending on your platform, there are a number of ways to use CouchDB. Currently, we tested with CouchDB 2.1.2, other versions of CouchDB may work as well.
  • +
  • For productive deployments, you do not want to go with the (Hypersonic) DB bundled with Tomcat, but install some normal DB server. We use PostgreSQL. The relation DB server is used by Liferay and should be thus compatible to it.
  • +
  • For searches, consider CouchDB Lucene CouchDb Lucene.
  • +
  • There is a number of additional “prerequisites” for SW360, more detailed in the Vagrant deployment setup.
  • +
+

In order to install sw360, you can choose between the following ways:

+
    +
  • Use the Vagrant-based installation. Please refer to the sw360 vagrant project and the included Readme file. Basic prerequisites are +
      +
    • VirtualBox
    • +
    • Vagrant and some vagrant plugins
    • +
    • Presumeably a git client
    • +
    +
  • +
  • You could install the sw360portal project natively on the machine. This will require more work in order to install the prerequisites. The above mentioned vagrant project documents very precisely what to do in order to install the sw360portal.
  • +
  • Checkout the docker suite sw360chores and generate a pre-built container where you can deploy the *.war files of sw360portal (both frontend and backend). Important this is work in progress now and likely not working out of the box.
  • +
+

Frequently Experienced Problems

+
    +
  1. +

    The most experienced confusion is about the Liferay setup user: the setup user cannot be used to work with the sw360 because the setup user is missing an organisation assignment. For every user an organisation assignment is required for sw360 to work properly. Unfortunately, you cannot assign a liferay setup user to an organisation. So you do need to import users or create users with organisation.

    +
  2. +
  3. +

    Currently, you need Java 11, we test it with OpenJDK. Newer or older versions may work, but currently, reports tell that for example Java 8 does not work.

    +
  4. +
  5. +

    Thrift: for compiling the software you need to install Apache Thrift (a command line tool). We test with version 0.13.

    +
  6. +
+

General Deployment Guides

+ +

Special Deployment Guides

+ +

General Topcis

+ +

Special Topics

+

After installing sw360 more topics may include:

+
    +
  1. Special Coverage of Country Codes, when countries are displayed, then it uses country codes in the DB
  2. +
  3. How to export data and import it to a new instance
  4. +
  5. How to migrate an existing sw360portal to a new instance
  6. +
  7. Using costco to modify the couchdb database
  8. +
+

Developing sw360

+

The sw360 is Java-based application consisting of two main parts:

+
    +
  1. A Liferay/based front end application that allows users to work with sw360
  2. +
  3. A Java-based servlet infrastructure Thrift interfaces that allows the Liferay part and other applications to manage and store data
  4. +
  5. In the backend, couchdb is used for storing project, component, release and license information as well as attachments.
  6. +
+

Submitting Issues

+

Please report issues to the issue tracker, but please keep also in mind that someone else has to read them! Issues should include:

+
    +
  • What you intended to do?
  • +
  • What did you observe?
  • +
  • Why do you think it is wrong?
  • +
  • Screenshots of what you have observed presumably gone wrong or link to pages were another person can follow
  • +
  • Version where you have observed this.
  • +
  • Common written English and use of line breaks!!! Use the preview function!
  • +
+

Please refer to the following pages for writing issues:

+ +

Contribution Workflow

+

As basic introduction, the dev ops works as following:

+
    +
  1. We are issue-based, please do not hesitate to create issues - also for questions (and set the issue tag)
  2. +
  3. The issues are organised by milestones which do not represent releases anymore. Milestone are meant to be useful packages of work done
  4. +
  5. Contributions are made through pull requests
  6. +
  7. We do conversations directly on issues and pull requests
  8. +
+

More topics regarding “how” to develop:

+
    +
  1. Definition of done and code style
  2. +
  3. Creating a sw360 release
  4. +
  5. Brief notes on the jgiven testing
  6. +
  7. For help with problems, you might want to check that
  8. +
+

Architecture

+

sw360 is a server application using Java servlets. It did some faint steps towards micro services (ie. one maintaining licenses, another for vulnerabilities), the front end is a portlet applications using good old JSPs.

+
    +
  1. Introduction and Scope
  2. +
  3. High Level View
  4. +
  5. Architecture Topics
  6. +
+

General

+
    +
  1. How to write a new portlet
  2. +
  3. Adding a new backend service
  4. +
  5. Changing the data model
  6. +
  7. REST API overview
  8. +
  9. Migrating to Javascript modules
  10. +
+

Special

+
    +
  1. Filtering in portlets
  2. +
  3. The FOSSology integration
  4. +
  5. How moderation requests work
  6. +
  7. Roles and access rights
  8. +
  9. Attachment Types Description
  10. +
  11. Our ideas of Google-Summer-of-Code 2019
  12. +
  13. How Friendly URLs work with the Liferay Portlets
  14. +
+

Testing sw360

+

Generally, all modules have unit tests and these are executed (including deployment of couchdb) at CI times. In addtion, to test the front end, there are defined integration test cases for a manual check, if the sw360 is working properly in general:

+
    +
  1. Test Cases: Components Functionality
  2. +
  3. Test Cases: Licenses Functionality
  4. +
  5. Test Cases: Moderations Functionality
  6. +
  7. Test Cases: Projects Functionality
  8. +
+ +
+ + + + + + + + +
+ + +
+
+ User Guides +
+

SW360 User Guides

+
+ + +
+
+ Deployment +
+

SW360 Deployment Guides

+
+ + +
+
+ Development +
+

SW360 Development Information

+
+ + +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/index.xml b/docs/index.xml new file mode 100644 index 0000000..702d662 --- /dev/null +++ b/docs/index.xml @@ -0,0 +1,5667 @@ + + + Eclipse SW360 – SW360 Documentation + https://www.eclipse.org/sw360/docs/ + Recent content in SW360 Documentation on Eclipse SW360 + Hugo -- gohugo.io + + + + + + + + + + + Docs: How to add a backend portlet to sw360 + https://www.eclipse.org/sw360/docs/developers/dev-adding-a-new-portlet-backend/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-adding-a-new-portlet-backend/ + + + + <p>This page how to add some operations / service calls on the backend for the portlet writing on the page that covers the front end. Note that this page does not create a new (thrift service), but just explains how to add more operations.</p> +<p>This explanation follows bottom up approach where we first add the backend methods and then call them later in the frontend. Quick summary:</p> +<ol> +<li>Add methods to the thrift idl definition</li> +<li>Add methods to the data handler interface</li> +<li>Add implementation</li> +<li>Add tests</li> +</ol> +<h4 id="thrift">Thrift</h4> +<p>First we add some methods to the thrift files, components.thrift</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#09f;font-style:italic">//new Methods to ensure uniqueness of Identifiers +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"></span>map <span style="color:#555">&lt;</span>string<span style="color:#555">,</span> list<span style="color:#555">&lt;</span>string<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateComponents</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span>map <span style="color:#555">&lt;</span>string<span style="color:#555">,</span> list<span style="color:#555">&lt;</span>string<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateReleases</span><span style="color:#555">();</span> +</span></span></code></pre></div><h4 id="datahandler">Datahandler</h4> +<p>then we install lib-datahandler. That way we see which methods we have to implement. +We have chosen to change the interface of the ComponentService. That means we need to implement them in the ComponentHandler.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateComponents</span><span style="color:#555">()</span> <span style="color:#069;font-weight:bold">throws</span> TException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> handler<span style="color:#555">.</span><span style="color:#309">getDuplicateComponents</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateReleases</span><span style="color:#555">()</span> <span style="color:#069;font-weight:bold">throws</span> TException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> handler<span style="color:#555">.</span><span style="color:#309">getDuplicateReleases</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><h4 id="implementation">Implementation</h4> +<p>The methods there are only a reference to the ComponentDatabaseHandler.java. +In the ComponentHandler we only assert that the input is correct. +Since we implement methods without parameters, there is nothing else for us to do. +In the ComponentDatabaseHandler.java we actually do some work and implement the methods</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateComponents</span><span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> ListMultimap<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> String<span style="color:#555">&gt;</span> componentIdentifierToComponentId <span style="color:#555">=</span> ArrayListMultimap<span style="color:#555">.</span><span style="color:#309">create</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span> <span style="color:#555">(</span>Component component <span style="color:#555">:</span> componentRepository<span style="color:#555">.</span><span style="color:#309">getSummaryForExport</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> componentIdentifierToComponentId<span style="color:#555">.</span><span style="color:#309">put</span><span style="color:#555">(</span>SW360Utils<span style="color:#555">.</span><span style="color:#309">printName</span><span style="color:#555">(</span>component<span style="color:#555">),</span> component<span style="color:#555">.</span><span style="color:#309">getId</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> CommonUtils<span style="color:#555">.</span><span style="color:#309">getIdentifierToListOfDuplicates</span><span style="color:#555">(</span>componentIdentifierToComponentId<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> <span style="color:#c0f">getDuplicateReleases</span><span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> ListMultimap<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> String<span style="color:#555">&gt;</span> releaseIdentifierToReleaseId <span style="color:#555">=</span> ArrayListMultimap<span style="color:#555">.</span><span style="color:#309">create</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span> <span style="color:#555">(</span>Release release <span style="color:#555">:</span> releaseRepository<span style="color:#555">.</span><span style="color:#309">getReleaseSummary</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> releaseIdentifierToReleaseId<span style="color:#555">.</span><span style="color:#309">put</span><span style="color:#555">(</span>SW360Utils<span style="color:#555">.</span><span style="color:#309">printName</span><span style="color:#555">(</span>release<span style="color:#555">),</span> release<span style="color:#555">.</span><span style="color:#309">getId</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> CommonUtils<span style="color:#555">.</span><span style="color:#309">getIdentifierToListOfDuplicates</span><span style="color:#555">(</span>releaseIdentifierToReleaseId<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><h4 id="tests">Tests</h4> +<p>We then write some tests in ComponentDatabaseHandlerTest.java</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#99f">@Test</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">testDuplicateComponentIsFound</span><span style="color:#555">()</span> <span style="color:#069;font-weight:bold">throws</span> Exception <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> String originalComponentId <span style="color:#555">=</span> <span style="color:#c30">&#34;C3&#34;</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> Component tmp <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">getComponent</span><span style="color:#555">(</span>originalComponentId<span style="color:#555">,</span> user1<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> tmp<span style="color:#555">.</span><span style="color:#309">unsetId</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> tmp<span style="color:#555">.</span><span style="color:#309">unsetRevision</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> String newComponentId <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">addComponent</span><span style="color:#555">(</span>tmp<span style="color:#555">,</span> email1<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> duplicateComponents <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">getDuplicateComponents</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> assertThat<span style="color:#555">(</span>duplicateComponents<span style="color:#555">.</span><span style="color:#309">size</span><span style="color:#555">(),</span> is<span style="color:#555">(</span>1<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span> assertThat<span style="color:#555">(</span>duplicateComponents<span style="color:#555">.</span><span style="color:#309">get</span><span style="color:#555">(</span>printName<span style="color:#555">(</span>tmp<span style="color:#555">)),</span> containsInAnyOrder<span style="color:#555">(</span>newComponentId<span style="color:#555">,</span>originalComponentId<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#99f">@Test</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">testDuplicateReleaseIsFound</span><span style="color:#555">()</span> <span style="color:#069;font-weight:bold">throws</span> Exception <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> String originalReleaseId <span style="color:#555">=</span> <span style="color:#c30">&#34;R1A&#34;</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> Release tmp <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">getRelease</span><span style="color:#555">(</span>originalReleaseId<span style="color:#555">,</span> user1<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> tmp<span style="color:#555">.</span><span style="color:#309">unsetId</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> tmp<span style="color:#555">.</span><span style="color:#309">unsetRevision</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> String newReleaseId <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">addRelease</span><span style="color:#555">(</span>tmp<span style="color:#555">,</span> email1<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> duplicateReleases <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">getDuplicateReleases</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> assertThat<span style="color:#555">(</span>duplicateReleases<span style="color:#555">.</span><span style="color:#309">size</span><span style="color:#555">(),</span> is<span style="color:#555">(</span>1<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span> assertThat<span style="color:#555">(</span>duplicateReleases<span style="color:#555">.</span><span style="color:#309">get</span><span style="color:#555">(</span>printName<span style="color:#555">(</span>tmp<span style="color:#555">)),</span> containsInAnyOrder<span style="color:#555">(</span>newReleaseId<span style="color:#555">,</span>originalReleaseId<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><p>Then we install the backend to make our methods available.</p> + + + + + + Docs: How to add a frontend portlet to sw360 + https://www.eclipse.org/sw360/docs/developers/dev-adding-a-new-portlet-frontend/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-adding-a-new-portlet-frontend/ + + + + <p>We create a class in</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360/src/frontend/sw360-portlets/src/main/java/com/siemens/sw360/portal/portlets/admin/ +</span></span></code></pre></div><p>called</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>DatabaseSanitation.java +</span></span></code></pre></div><p>Here are some code snippets that are important:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">DatabaseSanitation</span> <span style="color:#069;font-weight:bold">extends</span> Sw360Portlet +</span></span></code></pre></div><p>the base class Sw360Portlet adds some convenience methods to render the most common return values of functions into messages.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">doView</span><span style="color:#555">(</span>RenderRequest request<span style="color:#555">,</span> RenderResponse response<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> IOException<span style="color:#555">,</span> PortletException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic">// Proceed with page rendering +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"></span> <span style="color:#069;font-weight:bold">super</span><span style="color:#555">.</span><span style="color:#309">doView</span><span style="color:#555">(</span>request<span style="color:#555">,</span> response<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><p>This method is used to render different pages, a common pattern would be to have if/else tree like</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#09f;font-style:italic">//! VIEW and helpers +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"></span><span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">doView</span><span style="color:#555">(</span>RenderRequest request<span style="color:#555">,</span> RenderResponse response<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> IOException<span style="color:#555">,</span> PortletException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> String pageName <span style="color:#555">=</span> request<span style="color:#555">.</span><span style="color:#309">getParameter</span><span style="color:#555">(</span>PAGENAME<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(</span>PAGENAME_EDIT<span style="color:#555">.</span><span style="color:#309">equals</span><span style="color:#555">(</span>pageName<span style="color:#555">))</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> prepareVendorEdit<span style="color:#555">(</span>request<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> include<span style="color:#555">(</span><span style="color:#c30">&#34;/html/vendors/edit.jsp&#34;</span><span style="color:#555">,</span> request<span style="color:#555">,</span> response<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">else</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> prepareStandardView<span style="color:#555">(</span>request<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">super</span><span style="color:#555">.</span><span style="color:#309">doView</span><span style="color:#555">(</span>request<span style="color:#555">,</span> response<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><p>but since we only have one page this is all we need. The jsp that is rendered by super.doView is set in</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span>sw360<span style="color:#555">/</span>src<span style="color:#555">/</span>frontend<span style="color:#555">/</span>sw360<span style="color:#555">-</span>portlets<span style="color:#555">/</span>src<span style="color:#555">/</span>main<span style="color:#555">/</span>webapp<span style="color:#555">/</span>WEB<span style="color:#555">-</span>INF<span style="color:#555">/</span>portlet<span style="color:#555">.</span><span style="color:#309">xml</span> +</span></span></code></pre></div><p>but more on that later.</p> +<p>The next method in DatabaseSanitation handles resource requests, which are responses to AJAX calls:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>@Override +</span></span><span style="display:flex;"><span>public void serveResource(ResourceRequest request, ResourceResponse response) throws IOException, PortletException { +</span></span><span style="display:flex;"><span> String action = request.getParameter(PortalConstants.ACTION); +</span></span><span style="display:flex;"><span> if (PortalConstants.DUPLICATES.equals(action)) { +</span></span><span style="display:flex;"><span> serveDuplicates(request, response); +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>similar to the PAGENAME tree, here we have an ACTION if/else block. We only have one action, so this is simple.</p> +<p>Let&rsquo;s have a look at</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">private</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">serveDuplicates</span><span style="color:#555">(</span>ResourceRequest request<span style="color:#555">,</span> ResourceResponse response<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> IOException<span style="color:#555">,</span> PortletException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> duplicateComponents<span style="color:#555">=</span><span style="color:#069;font-weight:bold">null</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> Map<span style="color:#555">&lt;</span>String<span style="color:#555">,</span> List<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;&gt;</span> duplicateReleases<span style="color:#555">=</span><span style="color:#069;font-weight:bold">null</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">try</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> ComponentService<span style="color:#555">.</span><span style="color:#309">Iface</span> componentClient <span style="color:#555">=</span> thriftClients<span style="color:#555">.</span><span style="color:#309">makeComponentClient</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> duplicateComponents <span style="color:#555">=</span> componentClient<span style="color:#555">.</span><span style="color:#309">getDuplicateComponents</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> duplicateReleases <span style="color:#555">=</span> componentClient<span style="color:#555">.</span><span style="color:#309">getDuplicateReleases</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">catch</span> <span style="color:#555">(</span>TException e<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> log<span style="color:#555">.</span><span style="color:#309">error</span><span style="color:#555">(</span><span style="color:#c30">&#34;Error in component client&#34;</span><span style="color:#555">,</span> e<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span><span style="color:#555">(</span>duplicateComponents<span style="color:#555">==</span> <span style="color:#069;font-weight:bold">null</span> <span style="color:#555">||</span> duplicateReleases<span style="color:#555">==</span><span style="color:#069;font-weight:bold">null</span><span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> renderRequestStatus<span style="color:#555">(</span>request<span style="color:#555">,</span>response<span style="color:#555">,</span> RequestStatus<span style="color:#555">.</span><span style="color:#309">FAILURE</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">else</span> <span style="color:#069;font-weight:bold">if</span><span style="color:#555">(</span>duplicateComponents<span style="color:#555">.</span><span style="color:#309">isEmpty</span><span style="color:#555">()</span> <span style="color:#555">&amp;&amp;</span> duplicateReleases<span style="color:#555">.</span><span style="color:#309">isEmpty</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> renderRequestStatus<span style="color:#555">(</span>request<span style="color:#555">,</span>response<span style="color:#555">,</span> RequestStatus<span style="color:#555">.</span><span style="color:#309">SUCCESS</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">else</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> request<span style="color:#555">.</span><span style="color:#309">setAttribute</span><span style="color:#555">(</span>PortalConstants<span style="color:#555">.</span><span style="color:#309">DUPLICATE_RELEASES</span><span style="color:#555">,</span> duplicateReleases<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> request<span style="color:#555">.</span><span style="color:#309">setAttribute</span><span style="color:#555">(</span>PortalConstants<span style="color:#555">.</span><span style="color:#309">DUPLICATE_COMPONENTS</span><span style="color:#555">,</span> duplicateComponents<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> include<span style="color:#555">(</span><span style="color:#c30">&#34;/html/admin/databaseSanitation/duplicatesAjax.jsp&#34;</span><span style="color:#555">,</span> request<span style="color:#555">,</span> response<span style="color:#555">,</span> PortletRequest<span style="color:#555">.</span><span style="color:#309">RESOURCE_PHASE</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><p>The member variable thriftClients is inherited from the Sw360Portlet. This is how we talk to the backend. +We call the methods that we wrote in the first part of the tutorial. +The error handling is reported with renderRequestStatus, also from Sw360Portlet. +When we have findings then we report them by rendering a jsp in the RESOURCE_PHASE. +This is then some html that our AJAX function gets as data.</p> +<p>Then we have to register the portlets in some xml files:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360/src/frontend/sw360-portlets/src/main/webapp/WEB-INF/liferay-display.xml +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;portlet</span> <span style="color:#309">id=</span><span style="color:#c30">&#34;databaseSanitation&#34;</span><span style="color:#309;font-weight:bold">/&gt;</span> +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360/src/frontend/sw360-portlets/src/main/webapp/WEB-INF/liferay-portlet.xml +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;portlet&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;portlet-name&gt;</span>databaseSanitation<span style="color:#309;font-weight:bold">&lt;/portlet-name&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;icon&gt;</span>/icon.png<span style="color:#309;font-weight:bold">&lt;/icon&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;instanceable&gt;</span>false<span style="color:#309;font-weight:bold">&lt;/instanceable&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;header-portlet-css&gt;</span>/css/main.css<span style="color:#309;font-weight:bold">&lt;/header-portlet-css&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;header-portlet-javascript&gt;</span>/js/main.js<span style="color:#309;font-weight:bold">&lt;/header-portlet-javascript&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;header-portlet-javascript&gt;</span>/js/external/jquery-1.11.1.min.js<span style="color:#309;font-weight:bold">&lt;/header-portlet-javascript&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;/portlet&gt;</span> +</span></span></code></pre></div><p>Note that here it is important to include things like jquery in this way so that on multiple portlet pages there are no namespace conflicts.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360/src/frontend/sw360-portlets/src/main/webapp/WEB-INF/portlet.xml +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;portlet&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;portlet-name&gt;</span>databaseSanitation<span style="color:#309;font-weight:bold">&lt;/portlet-name&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;display-name&gt;</span>databaseSanitation<span style="color:#309;font-weight:bold">&lt;/display-name&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;portlet-class&gt;</span> +</span></span><span style="display:flex;"><span> com.siemens.sw360.portal.portlets.admin.DatabaseSanitation +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/portlet-class&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;init-param&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;name&gt;</span>view-template<span style="color:#309;font-weight:bold">&lt;/name&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;value&gt;</span>/html/admin/databaseSanitation/view.jsp<span style="color:#309;font-weight:bold">&lt;/value&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/init-param&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;expiration-cache&gt;</span>0<span style="color:#309;font-weight:bold">&lt;/expiration-cache&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;supports&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;mime-type&gt;</span>text/html<span style="color:#309;font-weight:bold">&lt;/mime-type&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;portlet-mode&gt;</span>view<span style="color:#309;font-weight:bold">&lt;/portlet-mode&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/supports&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;portlet-info&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;title&gt;</span>databaseSanitation<span style="color:#309;font-weight:bold">&lt;/title&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;short-title&gt;</span>databaseSanitation<span style="color:#309;font-weight:bold">&lt;/short-title&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;keywords/&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/portlet-info&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;security-role-ref&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;role-name&gt;</span>administrator<span style="color:#309;font-weight:bold">&lt;/role-name&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/security-role-ref&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;/portlet&gt;</span> +</span></span></code></pre></div><p>After these changes we compile the frontend and then we have to add new page to the Layout and add it to the lar file. +We sign in as admin, +go to</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>Admin -&gt; Site administration +</span></span><span style="display:flex;"><span>-&gt; Private Pages +</span></span></code></pre></div><p>To add the portlet to the page, we first change the theme of Private Pages to Classic, then select Add Page. We can drag and drop it under the Admin Page. +Then we select the Private Pages under My Sites. +We can then go to the page we have just created. +On the left side there is a plus sign, which opens a side menu with the available portlets that we can add to our page. +Under SW360 we find the portlet DatabaseSanitation and we click add. +Then we can change the option (The cog symbol on the right) Look and Feel to Show Borders -&gt; No and we save that. +Then we change the theme of Private Pages back to SW360-Theme.</p> +<p>Now we can change the theme back and export a new lar file as described else where.</p> + + + + + + Docs: SW360 Development Branches + https://www.eclipse.org/sw360/docs/developers/dev-branches/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-branches/ + + + + <h2 id="branches-structure">Branches structure</h2> +<p><code>&lt;github-nickname&gt;/&lt;issue&gt;/&lt;description&gt;</code></p> +<h3 id="examples">Examples:</h3> +<ul> +<li>maierthomas/#1/fix-dowload-bundle</li> +<li>maierthomas/#3/sw360portal-specific-links</li> +</ul> + + + + + + Docs: How to add fields to an existing class + https://www.eclipse.org/sw360/docs/developers/dev-adding-new-fields-to-existing-classes/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-adding-new-fields-to-existing-classes/ + + + + <p>The license portlet is different from the other portlets as there is no Details/Edit page for each element. There is only a combined edit/view page. +We will add the license text to licenses in the thrift file:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-thrift" data-lang="thrift"><span style="display:flex;"><span><span style="color:#f60">13</span>:<span style="color:#bbb"> </span><span style="color:#069;font-weight:bold">optional</span><span style="color:#bbb"> </span><span style="color:#078;font-weight:bold">string</span><span style="color:#bbb"> </span>text;<span style="color:#bbb"> +</span></span></span></code></pre></div><p>To update the text we write a liferay Action in the LicensesPortlet:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#99f">@UsedAsLiferayAction</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">changeText</span><span style="color:#555">(</span>ActionRequest request<span style="color:#555">,</span> ActionResponse response<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> PortletException<span style="color:#555">,</span> IOException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> String licenseId <span style="color:#555">=</span> request<span style="color:#555">.</span><span style="color:#309">getParameter</span><span style="color:#555">(</span>LICENSE_ID<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> String text <span style="color:#555">=</span> request<span style="color:#555">.</span><span style="color:#309">getParameter</span><span style="color:#555">(</span>License<span style="color:#555">.</span><span style="color:#309">_Fields</span><span style="color:#555">.</span><span style="color:#309">TEXT</span><span style="color:#555">.</span><span style="color:#309">name</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span><span style="color:#555">(!</span>Strings<span style="color:#555">.</span><span style="color:#309">isNullOrEmpty</span><span style="color:#555">(</span>licenseId<span style="color:#555">))</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">try</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> User user <span style="color:#555">=</span> UserCacheHolder<span style="color:#555">.</span><span style="color:#309">getUserFromRequest</span><span style="color:#555">(</span>request<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> LicenseService<span style="color:#555">.</span><span style="color:#309">Iface</span> client <span style="color:#555">=</span> thriftClients<span style="color:#555">.</span><span style="color:#309">makeLicenseClient</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> License license <span style="color:#555">=</span> client<span style="color:#555">.</span><span style="color:#309">getFromID</span><span style="color:#555">(</span>licenseId<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> license<span style="color:#555">.</span><span style="color:#309">setText</span><span style="color:#555">(</span>CommonUtils<span style="color:#555">.</span><span style="color:#309">nullToEmptyString</span><span style="color:#555">(</span>text<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">final</span> RequestStatus requestStatus <span style="color:#555">=</span> client<span style="color:#555">.</span><span style="color:#309">updateLicense</span><span style="color:#555">(</span>license<span style="color:#555">,</span> user<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> renderRequestStatus<span style="color:#555">(</span>request<span style="color:#555">,</span>response<span style="color:#555">,</span>requestStatus<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">catch</span> <span style="color:#555">(</span>TException e<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> log<span style="color:#555">.</span><span style="color:#309">error</span><span style="color:#555">(</span><span style="color:#c30">&#34;Error updating license&#34;</span><span style="color:#555">,</span> e<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> response<span style="color:#555">.</span><span style="color:#309">setRenderParameter</span><span style="color:#555">(</span>LICENSE_ID<span style="color:#555">,</span> licenseId<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> response<span style="color:#555">.</span><span style="color:#309">setRenderParameter</span><span style="color:#555">(</span>PAGENAME<span style="color:#555">,</span> PAGENAME_DETAIL<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> response<span style="color:#555">.</span><span style="color:#309">setRenderParameter</span><span style="color:#555">(</span>SELECTED_TAB<span style="color:#555">,</span> <span style="color:#c30">&#34;LicenseText&#34;</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span></code></pre></div><p>To integrate it in the jsp we make the according changes, important to note is the ActionUrl that we define:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#309;font-weight:bold">portlet:actionURL</span> <span style="color:#309">var</span><span style="color:#555">=</span><span style="color:#c30">&#34;changeLicenseTextURL&#34;</span> <span style="color:#309">name</span><span style="color:#555">=</span><span style="color:#c30">&#34;changeText&#34;</span>&gt; +</span></span><span style="display:flex;"><span> &lt;<span style="color:#309;font-weight:bold">portlet:param</span> <span style="color:#309">name</span><span style="color:#555">=</span><span style="color:#c30">&#34;&lt;%=PortalConstants.LICENSE_ID%&gt;&#34;</span> <span style="color:#309">value</span><span style="color:#555">=</span><span style="color:#c30">&#34;${licenseDetail.id}&#34;</span> /&gt; +</span></span><span style="display:flex;"><span>&lt;/<span style="color:#309;font-weight:bold">portlet:actionURL</span>&gt; +</span></span></code></pre></div><p>A good practice to name fields in jsps is to use the thrift field names:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span> &lt;<span style="color:#309;font-weight:bold">textarea</span> <span style="color:#309">name</span><span style="color:#555">=</span><span style="color:#c30">&#34;&lt;portlet:namespace/&gt;&lt;%=License._Fields.TEXT%&gt;&#34;</span> <span style="color:#309">rows</span><span style="color:#555">=</span><span style="color:#c30">&#34;5&#34;</span> <span style="color:#309">style</span><span style="color:#555">=</span><span style="color:#c30">&#34;width: 100%&#34;</span> <span style="color:#309">id</span><span style="color:#555">=</span><span style="color:#c30">&#34;&lt;portlet:namespace/&gt;&lt;%=License._Fields.TEXT%&gt;&#34;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309">placeholder</span><span style="color:#555">=</span><span style="color:#c30">&#34;Enter the License-Text here...&#34;</span> +</span></span><span style="display:flex;"><span> &gt;${licenseDetail.text}&lt;/<span style="color:#309;font-weight:bold">textarea</span>&gt; +</span></span></code></pre></div> + + + + + Docs: Component / Release + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-components/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-components/ + + + + <h2 id="add-a-component-and-release-with-vendor-present">Add a component and release with vendor present</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Sign In with a known user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on <em>Components</em> tab</td> +<td style="text-align:left"><em>Components</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click <em>Add Component</em></td> +<td style="text-align:left"><em>New Component</em> page is displayed with mandatory fields marked with red star</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Fill in a component <em>Name</em> and <em>Categories</em> and click <em>Add Component</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page changes to <em>New Release Edit</em> page</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Fill in a release <em>Version</em> and <em>CPE ID</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click <em>Vendor</em> field</td> +<td style="text-align:left"><em>Search Vendor</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left"><em>Search</em> for a Vendor, select it and click <em>Select</em></td> +<td style="text-align:left">Dialog is closed and selected Vendor is added under <em>Vendor</em> field</td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click on <em>Attachments</em> link</td> +<td style="text-align:left"><em>Attachments</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">11</td> +<td style="text-align:left">Click on <em>Add Attachment</em></td> +<td style="text-align:left"><em>Upload Attachment</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Click <em>Browse</em> and select the attachment</td> +<td style="text-align:left">File name is displayed in the dialog</td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Click <em>Upload</em> button</td> +<td style="text-align:left">The file is uploaded and dialog is closed. Also the attached file is listed in the <em>Attachment</em> page</td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Change the <em>Attachment type</em> to real type, e.g. <em>Source file</em> if it is a source file</td> +<td style="text-align:left">Type changed successfully</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Click <em>Update Release</em></td> +<td style="text-align:left"><em>Release updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">16</td> +<td style="text-align:left">Click on <em>Components</em> tab</td> +<td style="text-align:left">The new component should be added to the components list (e.g. filter by <em>Keyword Search</em>)</td> +</tr> +</tbody> +</table> +<h2 id="modify-a-component-and-release-with-vendor-present">Modify a component and release with vendor present</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for an existing component (e.g. created in TC01) and click <em>Edit</em></td> +<td style="text-align:left"><em>You are editing the original document</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Execute steps 5-16 from TC01</td> +<td></td> +</tr> +</tbody> +</table> +<h2 id="add-and-modify-a-component-and-release-with-all-fields-filled-in">Add and modify a component and release with all fields filled in</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Click on <em>Components</em> tab</td> +<td style="text-align:left"><em>Components</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click <em>Add Component</em></td> +<td style="text-align:left"><em>New Component</em> page is displayed with mandatory fields marked with red star</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Fill in all editable fields under <em>Basic Information</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>Add Component</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page changes to <em>New Release Edit</em> page</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Fill in all editable fields under <em>Release Summary</em> and <em>Release Repository</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click on <em>Linked Releases</em> link</td> +<td style="text-align:left"><em>Linked Releases</em> page displayed successfully</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left"><em>Click to add Releases</em></td> +<td style="text-align:left"><em>Search Release</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click <em>Search by name</em> and <em>Select</em> a release to be added</td> +<td style="text-align:left">Dialog is closed and selected release is displayed under <em>Linked Releases</em> section</td> +</tr> +<tr> +<td style="text-align:right">11</td> +<td style="text-align:left">Click on <em>Clearing Details</em> link</td> +<td style="text-align:left"><em>Clearing Details</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Fill in all editable fields</td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Click on <em>Attachments</em> link and upload a file</td> +<td style="text-align:left">File attached successfully</td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Click <em>Update Release</em></td> +<td style="text-align:left"><em>Release updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Check all fields of the release under <em>Summary</em>, <em>Linked Releases</em>, <em>Clearing Details</em> and <em>Attachments</em></td> +<td style="text-align:left">Values are filled in correctly</td> +</tr> +<tr> +<td style="text-align:right">16</td> +<td style="text-align:left">Click <em>Edit</em> button, modify some fields and <em>Update Release</em></td> +<td style="text-align:left">Values are updated successfully</td> +</tr> +</tbody> +</table> +<h2 id="delete-a-component-that-is-first-linked-to-a-project-and-then-not-and-a-project">Delete a component that is first linked to a project and then not, and a project</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Create a new component</td> +<td style="text-align:left">Component is created successfully</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Add a new release to this component</td> +<td style="text-align:left">Release is added successfully</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Create a new project</td> +<td style="text-align:left">Project is created successfully</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Add the linked release created above to this project</td> +<td style="text-align:left">Release linked successfully</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Go to components, try to delete the newly created component (that is linked to a project)</td> +<td style="text-align:left">Message <em>I could not delete the component!</em> is displayed.</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Component is not deleted</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Go to Projects, delete the newly created project</td> +<td style="text-align:left">Project is deleted successfully</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Go to components, delete the newly created components (not linked anymore to a project)</td> +<td style="text-align:left">Message <em>Do you want to delete component?</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Component is deleted successfully</td> +</tr> +</tbody> +</table> +<h2 id="add-new-attachments-to-an-existing-release-and-delete-attachments">Add new attachments to an existing release and delete attachments</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for an existing component (e.g. created in TC01) and click <em>Release Overview</em></td> +<td style="text-align:left">The list of releases are displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on release version that needs a new attachment</td> +<td style="text-align:left"><em>Release Summary: name</em> page is displayed for the selected release</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click on <em>Edit</em></td> +<td style="text-align:left"><em>You are editing the original document.</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click on <em>Attachments</em> link</td> +<td style="text-align:left"><em>Attachments</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click on <em>Add Attachment</em></td> +<td style="text-align:left"><em>Upload Attachment</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>Browse</em> and select several attachments</td> +<td style="text-align:left">File names are displayed in the dialog</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Cancel</em> near some files not to be added</td> +<td style="text-align:left">File names are removed from the list</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click <em>Upload</em> button for the remaining files</td> +<td style="text-align:left">The files are uploaded and dialog is closed. Also the attached file are listed in the <em>Attachment</em> page</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Change some <em>Attachment type</em> to real type, e.g. <em>Source file</em> if it is a source file</td> +<td style="text-align:left">Type changed successfully</td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click <em>Update Release</em></td> +<td style="text-align:left"><em>Release updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">11</td> +<td style="text-align:left">Click on <em>Edit</em></td> +<td style="text-align:left"><em>You are editing the original document.</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Click on <em>Attachments</em> link</td> +<td style="text-align:left"><em>Attachments</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Click on <em>Delete</em> icon to delete an attachment</td> +<td style="text-align:left">Message <em>Do you really want to delete this attachment?</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Attachment is deleted successfully</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Click <em>Update Release</em></td> +<td style="text-align:left"><em>Release updated successfully!</em> message is displayed</td> +</tr> +</tbody> +</table> +<h2 id="duplicate-an-existing-release">Duplicate an existing release</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for an existing component with release with all fields filled in (e.g. created in TC03) and click <em>Release Overview</em></td> +<td style="text-align:left">The list of releases are displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click <em>Duplicate</em> button under Action column</td> +<td style="text-align:left">The page changes to <em>Release name Edit</em></td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Check all fields from copied release</td> +<td style="text-align:left">All fields from <em>Release Summary</em> and <em>Repository</em> are unchanged</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Change the <em>Version</em> field to a new one, fill in a <em>CPE ID</em> and click <em>Add Release</em></td> +<td style="text-align:left"><em>You are editing the original document.</em> message is displayed.</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Modify some other fields, e.g. <em>Release Date</em> and click <em>Clearing Details</em></td> +<td style="text-align:left"><em>Clearing Details</em> page is displayed and does not contain any field from copied release</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>Update Release</em></td> +<td style="text-align:left"><em>Release Component updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click on component name link on top of the page</td> +<td style="text-align:left">Summary page for the component is displayed</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click on _Release Overview</td> +<td style="text-align:left">The new copied release is listed among previous releases</td> +</tr> +</tbody> +</table> +<h2 id="search-for-and-create-a-new-vendor-for-a-new-release">Search for and create a new vendor for a new release</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for an existing component and click <em>Edit</em></td> +<td style="text-align:left"><em>You are editing the original document</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page changes to <em>New Release Edit</em> page</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Fill in a release <em>Version</em> and <em>CPE ID</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>Vendor</em> field</td> +<td style="text-align:left"><em>Search Vendor</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Add New Vendor</em></td> +<td style="text-align:left"><em>Create New Vendor</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Fill in <em>Full name</em>, <em>Short name</em> and <em>URL</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Add Vendor</em></td> +<td style="text-align:left">Dialog closes and the new vendor is displayed in release <em>Vendor</em> field</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click <em>Add Release</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Click on component name link on top of the page</td> +<td style="text-align:left">Summary page for the component is displayed. The new vendor for the new release, as well as existing vendors from previous releases are listed under <em>Vendors</em> field for the component</td> +</tr> +</tbody> +</table> + + + + + + Docs: CouchDB External Documents + https://www.eclipse.org/sw360/docs/developers/dev-external-documents-with-couchdb/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-external-documents-with-couchdb/ + + + + <h2 id="motivation">Motivation</h2> +<p>In some cases inline documents are not sufficient for storing extended information to a document. This is especially the case if these information might be relevant from outside as well. +Projects, components and releases contain attachments. The metadata of these attachments are stored as inline documents inside its parent document (which is the project, component or release). +However these attachments may be used by other documents as well, e.g. license info files which are attached to releases are used by projects to generate the overall license information for that project. +In such cases an external document might be the better model. For example the attachment usage can be stored along the metadata without touching the owner document on update.</p> +<h2 id="advantages-of-external-documents">Advantages of external documents</h2> +<ul> +<li>single documents with a clear separation to other documents</li> +<li>easy identification</li> +<li>might be loaded and updated standalone</li> +</ul> +<h2 id="advantages-of-internal-documents">Advantages of internal documents</h2> +<ul> +<li>Very fast loading along with the owner</li> +<li>Easy handling since only the owner must be loaded or updated</li> +</ul> +<p>In any case it is highly dependent on the use case whether external documents are to be favored over internal documents.</p> +<h2 id="possible-implementations-for-linked-documents">Possible implementations for linked documents</h2> +<h3 id="special-responsehandler-with-special-views-from-couchdb">Special ResponseHandler with special views from CouchDB</h3> +<table> +<thead> +<tr> +<th>Easy to use?</th> +<th>Performance?</th> +<th>Effort to use in existing code</th> +</tr> +</thead> +<tbody> +<tr> +<td>:star::star: Middle, special views have to be created, fields of data objects has to be annotated.</td> +<td>:star::star::star: Very good, fetching of multiple documents with a single request.</td> +<td>:star: High, since existing code has to be changed</td> +</tr> +</tbody> +</table> +<h4 id="couch-db-theory">Couch-DB theory</h4> +<p>At the time of writing, support of external (or linked) documents in Couch-DB is limited. Consider the following documents:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span>project <span style="color:#555">=</span> { +</span></span><span style="display:flex;"><span> _id<span style="color:#555">:</span> <span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> type<span style="color:#555">:</span> <span style="color:#c30">&#34;project&#34;</span>, +</span></span><span style="display:flex;"><span> name<span style="color:#555">:</span> <span style="color:#c30">&#34;Testproject&#34;</span>, +</span></span><span style="display:flex;"><span> attachments<span style="color:#555">:</span> [ +</span></span><span style="display:flex;"><span> { _id<span style="color:#555">:</span> <span style="color:#c30">&#34;a1&#34;</span> }, +</span></span><span style="display:flex;"><span> { _id<span style="color:#555">:</span> <span style="color:#c30">&#34;z2&#34;</span> } +</span></span><span style="display:flex;"><span> ] +</span></span><span style="display:flex;"><span>} +</span></span><span style="display:flex;"><span>attachment1 <span style="color:#555">=</span> { +</span></span><span style="display:flex;"><span> _id<span style="color:#555">:</span> <span style="color:#c30">&#34;a1&#34;</span>, +</span></span><span style="display:flex;"><span> type<span style="color:#555">:</span> <span style="color:#c30">&#34;attachment&#34;</span>, +</span></span><span style="display:flex;"><span> name<span style="color:#555">:</span> <span style="color:#c30">&#34;SourceFile&#34;</span>, +</span></span><span style="display:flex;"><span> sha1<span style="color:#555">:</span> <span style="color:#c30">&#34;abc1234&#34;</span> +</span></span><span style="display:flex;"><span>} +</span></span><span style="display:flex;"><span>attachment2 <span style="color:#555">=</span> { +</span></span><span style="display:flex;"><span> _id<span style="color:#555">:</span> <span style="color:#c30">&#34;a2&#34;</span>, +</span></span><span style="display:flex;"><span> type<span style="color:#555">:</span> <span style="color:#c30">&#34;attachment&#34;</span>, +</span></span><span style="display:flex;"><span> name<span style="color:#555">:</span> <span style="color:#c30">&#34;LicenseFile&#34;</span>, +</span></span><span style="display:flex;"><span> sha1<span style="color:#555">:</span> <span style="color:#c30">&#34;fed9876&#34;</span> +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>Unfortunately there is no way to get the project document with the attachments directly included. With the correct view you are able to retrieve all these documents in a single request:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">function</span>(doc) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span>(doc.type <span style="color:#555">===</span> <span style="color:#c30">&#34;attachment&#34;</span>) { +</span></span><span style="display:flex;"><span> emit(doc._id, <span style="color:#069;font-weight:bold">null</span>); +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span>(<span style="color:#069;font-weight:bold">var</span> <span style="color:#069;font-weight:bold">in</span> <span style="color:#069;font-weight:bold">in</span> doc.attachments) { +</span></span><span style="display:flex;"><span> emit(doc._id, { _id<span style="color:#555">:</span> doc.attachments[i]._id }); +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>You might see the trick: the project document as well as the attachment documents are indexed with the id of the project. This way you get all three documents when querying the view with the id of the project:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span>{ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;total_rows&#34;</span><span style="color:#555">:</span><span style="color:#f60">5</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;offset&#34;</span><span style="color:#555">:</span><span style="color:#f60">0</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;rows&#34;</span><span style="color:#555">:</span>[{ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;key&#34;</span><span style="color:#555">:</span> <span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;doc&#34;</span><span style="color:#555">:</span>{ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;_id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;attachments&#34;</span><span style="color:#555">:</span>[ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;a1&#34;</span>, <span style="color:#c30">&#34;a2&#34;</span> +</span></span><span style="display:flex;"><span> ], +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;name&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;Testproject&#34;</span>, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> }, { +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;doc&#34;</span><span style="color:#555">:</span>{ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;_id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;a1&#34;</span>, +</span></span><span style="display:flex;"><span> name<span style="color:#555">:</span> <span style="color:#c30">&#34;SourceFile&#34;</span>, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> }, { +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;key&#34;</span><span style="color:#555">:</span> <span style="color:#c30">&#34;p1&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;value&#34;</span><span style="color:#555">:</span><span style="color:#069;font-weight:bold">null</span>, +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;doc&#34;</span><span style="color:#555">:</span>{ +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;_id&#34;</span><span style="color:#555">:</span><span style="color:#c30">&#34;a2&#34;</span>, +</span></span><span style="display:flex;"><span> name<span style="color:#555">:</span> <span style="color:#c30">&#34;LicenseFile&#34;</span>, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> ... +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> ] +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p><strong>Note</strong> is will only work if you query the view with <code>include_docs</code> set to <code>true</code>. +<strong>Note</strong> include_docs will only work at the top level of a value. In other words it will only recognize the following to situations:</p> +<ul> +<li>null: if the value is null, the document which is identified by the key is included</li> +<li>{ _id: &ldquo;&hellip;&rdquo; }: the document identified by the given id is included. +To be clear: transitive inclusions will not work! +<strong>Note</strong> See also <a href="https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Linked_documents">https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Linked_documents</a>.</li> +</ul> +<h3 id="implementation-with-ektorp">Implementation with Ektorp</h3> +<p><a href="https://github.com/eclipse/sw360/pull/596">https://github.com/eclipse/sw360/pull/596</a> show an implementation to transparently read such results from Couch-DB. It consists of:</p> +<ul> +<li>new methods in the database connector which are aware of loading linked documents</li> +<li>a response handler used for parsing the results when requesting linked documents</li> +<li>two annotation classes to mark fields which contain ids for linked documents +After the branch was merged, the new feature can be used in only three steps. You need:</li> +</ul> +<ol> +<li>A view that loads the &ldquo;main&rdquo; documents along with there linked documents</li> +<li>A special method in your database handler / database repository which calls the new method from the connector</li> +<li>A mixin for your data object which annotates the fields which contain ids to linked documents</li> +</ol> +<h4 id="notes-for-1">Notes for 1.</h4> +<p>Have a look at mapping function above in the theory section. Of course you may add more than one type of linked documents, e.g. not only attachments but releases as well. +You may also emit whole objects instead of ids only. This way Couch-DB does not have to lookup each entry. However including ids over objects is an own topic.</p> +<h4 id="notes-for-2">Notes for 2.</h4> +<p>You should write methods in your repository as well as in your database handler that uses the new methods from the database connector.</p> +<h4 id="notes-for-3">Notes for 3.</h4> +<p>Be sure that the used object mapper in your database handler is aware of the mixin. Of course you can annotate more than one field. All annotated fields will be respected on loading. However, if the view does not contain an object that should be resolved, it will be replaced by null. The LinkedDocuments-annotation even allows you to name a different destination field for the resolved objects for easier integration into the existing code.</p> +<h2 id="usage-with-ektorp">Usage with Ektorp</h2> +<table> +<thead> +<tr> +<th>Easy to use?</th> +<th>Performance?</th> +<th>Effort to use in existing code</th> +</tr> +</thead> +<tbody> +<tr> +<td>:no_entry: does not work</td> +<td>:no_entry:</td> +<td>:no_entry:</td> +</tr> +</tbody> +</table> +<p>Since SW360 is using Ektorp as Objectmapper, a response like above is not suitable. Ektorp is just not able to parse the above response correctly. +However Ektorp has a linking feature as well: You may annotate fields with the <code>@DocumentReference</code>-Annotation to tell Ektorp to store the content within external documents. This only works with fields of type <code>Set</code> at the moment of writing. Since SW360 data objects are generated using Thrift, directly annotating the field is not possible. Due to the mixin feature of Ektorp this is not a big issue. Unfortunately making the <code>@DocumentReference</code>-annotation to work was not possible with a reasonable effort.</p> +<p>Internally Ektorp is also using special views for getting linked documents to work. A quick look into the source codes suggests that this feature is implemented using special serializers which would lead to additional requests on loading and storing as well. Therefore the same performance issues might be come across if the annotation would work.</p> +<h3 id="own-serializerdeserzialer">Own serializer/deserzialer</h3> +<table> +<thead> +<tr> +<th>Easy to use?</th> +<th>Performance?</th> +<th>Effort to use in existing code</th> +</tr> +</thead> +<tbody> +<tr> +<td>:star::star::star: Quite easy, just some Jackson configuration necessary</td> +<td>:star::star: Good, but every type of linked objects needs an additional request</td> +<td>:star::star::star: Low, existing code does not have to be changed</td> +</tr> +</tbody> +</table> +<p>This method works just like the Ektorp way. In addition a slow transition from internal to external documents is possible, since the custom serialization methods will handle both cases directly. Any embedded documents will be externalized on first update of the owner object. +The following classes are needed:</p> +<ol> +<li>Repository for the new external documents</li> +<li>DatabaseHandler for the new external documents</li> +<li>Mixin-Class to add annotations to the field with external documents</li> +<li>A new mapper factory to properly configure the custom serializer</li> +<li>Custom serializers/deserializer</li> +</ol> +<h4 id="example-for-externalizing-attachments">Example for externalizing attachments</h4> +<h5 id="mixin-class">Mixin-Class</h5> +<p>This will configure Ektorp to use a special class for this field. We use a special serializer for the field instead of for the type (in this case Attachment), so we can do serialization/deserialization for all attachments at once. If we would use a special serializer, every</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">abstract</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">SplitAttachmentsMixin</span> <span style="color:#069;font-weight:bold">extends</span> DatabaseMixIn <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@JsonSerialize</span><span style="color:#555">(</span>using <span style="color:#555">=</span> AttachmentSetSerializer<span style="color:#555">.</span><span style="color:#309">class</span><span style="color:#555">)</span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@JsonDeserialize</span><span style="color:#555">(</span>using <span style="color:#555">=</span> AttachmentSetDeserializer<span style="color:#555">.</span><span style="color:#309">class</span><span style="color:#555">)</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">abstract</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">setAttachments</span><span style="color:#555">(</span>Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;</span> attachments<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><h5 id="mapper-factory">Mapper factory</h5> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">SplitAttachmentsMapperFactory</span> <span style="color:#069;font-weight:bold">extends</span> MapperFactory <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">final</span> AttachmentHandlerInstantiator handlerInitiator<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#c0f">SplitAttachmentsMapperFactory</span><span style="color:#555">(</span>Supplier<span style="color:#555">&lt;</span>HttpClient<span style="color:#555">&gt;</span> httpClient<span style="color:#555">,</span> String dbName<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> MalformedURLException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> handlerInitiator <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">new</span> AttachmentHandlerInstantiator<span style="color:#555">(</span>httpClient<span style="color:#555">,</span> dbName<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> ObjectMapper <span style="color:#c0f">createObjectMapper</span><span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> ObjectMapper objectMapper <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">super</span><span style="color:#555">.</span><span style="color:#309">createObjectMapper</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> objectMapper<span style="color:#555">.</span><span style="color:#309">addMixInAnnotations</span><span style="color:#555">(</span>Project<span style="color:#555">.</span><span style="color:#309">class</span><span style="color:#555">,</span> SplitAttachmentsMixin<span style="color:#555">.</span><span style="color:#309">class</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> objectMapper<span style="color:#555">.</span><span style="color:#309">setHandlerInstantiator</span><span style="color:#555">(</span>handlerInitiator<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> objectMapper<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">static</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">AttachmentHandlerInstantiator</span> <span style="color:#069;font-weight:bold">extends</span> HandlerInstantiator <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">final</span> AttachmentSetSerializer attachmentSetSerializer<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">final</span> AttachmentSetDeserializer attachmentSetDeserializer<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#c0f">AttachmentHandlerInstantiator</span><span style="color:#555">(</span>Supplier<span style="color:#555">&lt;</span>HttpClient<span style="color:#555">&gt;</span> httpClient<span style="color:#555">,</span> String dbName<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> MalformedURLException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> attachmentSetSerializer <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">new</span> AttachmentSetSerializer<span style="color:#555">(</span>httpClient<span style="color:#555">,</span> dbName<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> attachmentSetDeserializer <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">new</span> AttachmentSetDeserializer<span style="color:#555">(</span>httpClient<span style="color:#555">,</span> dbName<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> JsonDeserializer<span style="color:#555">&lt;?&gt;</span> deserializerInstance<span style="color:#555">(</span>DeserializationConfig config<span style="color:#555">,</span> Annotated annotated<span style="color:#555">,</span> Class<span style="color:#555">&lt;?&gt;</span> deserClass<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(</span>deserClass<span style="color:#555">.</span><span style="color:#309">isInstance</span><span style="color:#555">(</span>attachmentSetDeserializer<span style="color:#555">))</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> attachmentSetDeserializer<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> <span style="color:#069;font-weight:bold">null</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">...</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><h5 id="serializer">Serializer</h5> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">AttachmentSetSerializer</span> <span style="color:#069;font-weight:bold">extends</span> JsonSerializer<span style="color:#555">&lt;</span>Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;&gt;</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">final</span> AttachmentDatabaseHandler handler<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#c0f">AttachmentSetSerializer</span><span style="color:#555">(</span>Supplier<span style="color:#555">&lt;</span>HttpClient<span style="color:#555">&gt;</span> httpClient<span style="color:#555">,</span> String dbName<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> MalformedURLException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">this</span><span style="color:#555">.</span><span style="color:#309">handler</span> <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">new</span> AttachmentDatabaseHandler<span style="color:#555">(</span>httpClient<span style="color:#555">,</span> dbName<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#078;font-weight:bold">void</span> <span style="color:#c0f">serialize</span><span style="color:#555">(</span>Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;</span> attachments<span style="color:#555">,</span> JsonGenerator jsonGenerator<span style="color:#555">,</span> SerializerProvider provider<span style="color:#555">)</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throws</span> IOException<span style="color:#555">,</span> JsonProcessingException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">try</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> List<span style="color:#555">&lt;</span>DocumentOperationResult<span style="color:#555">&gt;</span> results <span style="color:#555">=</span> handler<span style="color:#555">.</span><span style="color:#309">bulkCreateOrUpdateAttachments</span><span style="color:#555">(</span>attachments<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(!</span>results<span style="color:#555">.</span><span style="color:#309">isEmpty</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throw</span> <span style="color:#069;font-weight:bold">new</span> IOException<span style="color:#555">(</span><span style="color:#c30">&#34;Cannot create or update attachments. Some failed: &#34;</span> <span style="color:#555">+</span> results<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">catch</span> <span style="color:#555">(</span>SW360Exception exception<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throw</span> <span style="color:#069;font-weight:bold">new</span> IOException<span style="color:#555">(</span><span style="color:#c30">&#34;Cannot create or update attachments.&#34;</span><span style="color:#555">,</span> exception<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> jsonGenerator<span style="color:#555">.</span><span style="color:#309">writeStartArray</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span> <span style="color:#555">(</span>Attachment attachment <span style="color:#555">:</span> attachments<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> jsonGenerator<span style="color:#555">.</span><span style="color:#309">writeStartObject</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> jsonGenerator<span style="color:#555">.</span><span style="color:#309">writeStringField</span><span style="color:#555">(</span><span style="color:#c30">&#34;_id&#34;</span><span style="color:#555">,</span> attachment<span style="color:#555">.</span><span style="color:#309">getId</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> jsonGenerator<span style="color:#555">.</span><span style="color:#309">writeEndObject</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> jsonGenerator<span style="color:#555">.</span><span style="color:#309">writeEndArray</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div><h4 id="deserializer">Deserializer</h4> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">public</span> <span style="color:#069;font-weight:bold">class</span> <span style="color:#0a8;font-weight:bold">AttachmentSetDeserializer</span> <span style="color:#069;font-weight:bold">extends</span> JsonDeserializer<span style="color:#555">&lt;</span>Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;&gt;</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">private</span> <span style="color:#069;font-weight:bold">final</span> AttachmentDatabaseHandler handler<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> <span style="color:#c0f">AttachmentSetDeserializer</span><span style="color:#555">(</span>Supplier<span style="color:#555">&lt;</span>HttpClient<span style="color:#555">&gt;</span> httpClient<span style="color:#555">,</span> String dbName<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> MalformedURLException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">this</span><span style="color:#555">.</span><span style="color:#309">handler</span> <span style="color:#555">=</span> <span style="color:#069;font-weight:bold">new</span> AttachmentDatabaseHandler<span style="color:#555">(</span>httpClient<span style="color:#555">,</span> dbName<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#99f">@Override</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">public</span> Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;</span> <span style="color:#c0f">deserialize</span><span style="color:#555">(</span>JsonParser jsonParser<span style="color:#555">,</span> DeserializationContext context<span style="color:#555">)</span> <span style="color:#069;font-weight:bold">throws</span> IOException<span style="color:#555">,</span> JsonProcessingException <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> Set<span style="color:#555">&lt;</span>Attachment<span style="color:#555">&gt;</span> attachments <span style="color:#555">=</span> Sets<span style="color:#555">.</span><span style="color:#309">newHashSet</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(!</span>jsonParser<span style="color:#555">.</span><span style="color:#309">isExpectedStartArrayToken</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throw</span> <span style="color:#069;font-weight:bold">new</span> IllegalStateException<span style="color:#555">(</span><span style="color:#c30">&#34;Expected array token but found: &#34;</span> <span style="color:#555">+</span> jsonParser<span style="color:#555">.</span><span style="color:#309">getCurrentToken</span><span style="color:#555">().</span><span style="color:#309">asString</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> Set<span style="color:#555">&lt;</span>String<span style="color:#555">&gt;</span> attachmentIds <span style="color:#555">=</span> Sets<span style="color:#555">.</span><span style="color:#309">newHashSet</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> JsonToken token <span style="color:#555">=</span> jsonParser<span style="color:#555">.</span><span style="color:#309">nextToken</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">while</span> <span style="color:#555">(!</span>JsonToken<span style="color:#555">.</span><span style="color:#309">END_ARRAY</span><span style="color:#555">.</span><span style="color:#309">equals</span><span style="color:#555">(</span>token<span style="color:#555">))</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">switch</span> <span style="color:#555">(</span>token<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">case</span> START_OBJECT<span style="color:#555">:</span> +</span></span><span style="display:flex;"><span> Attachment attachment <span style="color:#555">=</span> jsonParser<span style="color:#555">.</span><span style="color:#309">readValueAs</span><span style="color:#555">(</span>Attachment<span style="color:#555">.</span><span style="color:#309">class</span><span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(</span>attachment<span style="color:#555">.</span><span style="color:#309">isSetId</span><span style="color:#555">()</span> <span style="color:#555">&amp;&amp;</span> <span style="color:#555">!</span>attachment<span style="color:#555">.</span><span style="color:#309">isSetRevision</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> attachmentIds<span style="color:#555">.</span><span style="color:#309">add</span><span style="color:#555">(</span>attachment<span style="color:#555">.</span><span style="color:#309">getId</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">else</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> attachments<span style="color:#555">.</span><span style="color:#309">add</span><span style="color:#555">(</span>attachment<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">break</span><span style="color:#555">;</span> +</span></span><span style="display:flex;"><span><span style="color:#99f"> +</span></span></span><span style="display:flex;"><span><span style="color:#99f"> default:</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throw</span> <span style="color:#069;font-weight:bold">new</span> IllegalStateException<span style="color:#555">(</span> +</span></span><span style="display:flex;"><span> <span style="color:#c30">&#34;Unexpected token. Expected object or string but found: &#34;</span> <span style="color:#555">+</span> jsonParser<span style="color:#555">.</span><span style="color:#309">getCurrentToken</span><span style="color:#555">().</span><span style="color:#309">asString</span><span style="color:#555">());</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> token <span style="color:#555">=</span> jsonParser<span style="color:#555">.</span><span style="color:#309">nextToken</span><span style="color:#555">();</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> <span style="color:#555">(!</span>attachmentIds<span style="color:#555">.</span><span style="color:#309">isEmpty</span><span style="color:#555">())</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">try</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> attachments<span style="color:#555">.</span><span style="color:#309">addAll</span><span style="color:#555">(</span>handler<span style="color:#555">.</span><span style="color:#309">retrieveAttachments</span><span style="color:#555">(</span>attachmentIds<span style="color:#555">));</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> <span style="color:#069;font-weight:bold">catch</span> <span style="color:#555">(</span>SW360Exception exception<span style="color:#555">)</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">throw</span> <span style="color:#069;font-weight:bold">new</span> IOException<span style="color:#555">(</span><span style="color:#c30">&#34;Cannot load attachments (&#34;</span> <span style="color:#555">+</span> attachmentIds <span style="color:#555">+</span> <span style="color:#c30">&#34;)&#34;</span><span style="color:#555">,</span> exception<span style="color:#555">);</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> attachments<span style="color:#555">;</span> +</span></span><span style="display:flex;"><span> <span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span></code></pre></div> + + + + + Docs: Database migration using Costco + https://www.eclipse.org/sw360/docs/developers/dev-database-migration-using-costco/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-database-migration-using-costco/ + + + + <h3 id="praeamble">Praeamble</h3> +<p>Please note that database migrations are done now in python scripts at</p> +<blockquote> +<p><a href="https://github.com/eclipse/sw360/tree/master/scripts/migrations">https://github.com/eclipse/sw360/tree/master/scripts/migrations</a></p> +</blockquote> +<p>keeping the following page because Costco might be useful for development / testing / quick adaptations.</p> +<h3 id="problem">Problem</h3> +<p>The main problem with changing field names in thrift is that existing documents in the couchdb need adjustments. Unfortunately, the futon interface of the couchdb does not offer bulk edits. As a consequence, looking into every document is tedious, for more than 100 documents, maybe unfeasible.</p> +<h3 id="solution">Solution</h3> +<p>Use costco, an open source project that</p> +<ul> +<li>is a couchapp (right, this implies that you install the couchapp environment)</li> +<li>offers a Web interface as sub path of the couchdb database</li> +<li>allows to iterate through the documents of a database and then apply modifications on a particular document</li> +<li>allows to perform modifications on documents using Java script</li> +</ul> +<p>More information</p> +<ul> +<li>Project website: <a href="https://github.com/harthur/costco">https://github.com/harthur/costco</a></li> +<li>Useful examples: <a href="http://harthur.github.io/costco/">http://harthur.github.io/costco/</a></li> +</ul> +<p>Note that costco does not allow to perform operations involving several documents at once, for example, setting values in one document that results from querying from several other documents. Costco is perfect for corrections on the couchdb document &lsquo;schema&rsquo; (not in the classic sense as there is no schema in couchdb).</p> +<h3 id="troubleshooting">Troubleshooting</h3> +<p>If you try to install costco, you try to install couchapp mst likely. However, it might be that some python packages are missing which results in a &rsquo;not-so-obvious&rsquo; python error during install of couchapp. The following line could be th dependencies that you might need:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>sudo apt-get install python-dev libxml2-dev libxslt-dev +</span></span></code></pre></div><h3 id="cheat-sheet-installing-costco-inside-an-sw360vagrant-deployment">Cheat Sheet: Installing costco inside an sw360vagrant deployment</h3> +<p>OK, if you read until here, to make it easy for you just the few lines to have executed to install costco when youi have a machine that is deployed with our vagrant:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>$ sudo apt-get install python-dev libxml2-dev libxslt-dev +</span></span><span style="display:flex;"><span>$ sudo pip install couchapp +</span></span><span style="display:flex;"><span>$ git clone http://github.com/harthur/costco.git +</span></span><span style="display:flex;"><span>$ <span style="color:#366">cd</span> costco +</span></span><span style="display:flex;"><span>$ couchapp push . http://localhost:5984/sw360db +</span></span></code></pre></div><h3 id="examples-in-sw360">Examples in sw360</h3> +<p>The following examples show some costco code from the use with sw360.</p> +<h4 id="renaming-a-key">Renaming a key</h4> +<p>In order to rename a field&rsquo;s key, the following code might be helpful. In the following example, the field&rsquo;s key <code>developement</code> into <code>development</code> (correcting a typo in the datamodel).</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JavaScript" data-lang="JavaScript"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">function</span>(doc) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span>(doc.type <span style="color:#555">==</span> <span style="color:#c30">&#39;todo&#39;</span>) { +</span></span><span style="display:flex;"><span> doc.development <span style="color:#555">=</span> doc.developement; +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">delete</span> doc.developement; +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> doc; +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><h4 id="renaming-a-key-in-a-subdocument">Renaming a key in a subdocument</h4> +<p>Similar thing as above, rename a key from <code>comment</code> to <code>createdcomment</code>, but this time inside a nested list of documents.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JavaScript" data-lang="JavaScript"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">function</span>(doc) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> (doc.type <span style="color:#555">==</span> <span style="color:#c30">&#39;release&#39;</span>) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span> (<span style="color:#069;font-weight:bold">var</span> f <span style="color:#555">=</span> <span style="color:#f60">0</span>, len <span style="color:#555">=</span> doc.attachments.length; f <span style="color:#555">&lt;</span> len; f <span style="color:#555">+=</span><span style="color:#f60">1</span> ) { +</span></span><span style="display:flex;"><span> doc.attachments[f].createdComment <span style="color:#555">=</span> doc.attachments[f].comment; +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">delete</span> doc.attachments[f].comment; +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">return</span> doc; +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><h3 id="more-javascript-examples-with-couchdb">More JavaScript Examples with CouchDB</h3> +<p>In addition to costco, also the couchdb map-reduce functions can help to track down issues in the data sets.</p> +<p>The following example searched for attachments of type <code>SOURCE</code> at releases, which do not have the <code>createdBy</code> set:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JavaScript" data-lang="JavaScript"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">function</span>(doc) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> ((doc.type <span style="color:#555">==</span> <span style="color:#c30">&#39;release&#39;</span>) +</span></span><span style="display:flex;"><span> <span style="color:#555">&amp;&amp;</span> (doc.attachments)) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">for</span> (<span style="color:#069;font-weight:bold">var</span> attachment <span style="color:#069;font-weight:bold">in</span> doc.attachments) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> (<span style="color:#555">!</span>doc.attachments[attachment].createdBy) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span> (doc.attachments[attachment].attachmentType<span style="color:#555">==</span> <span style="color:#c30">&#39;SOURCE&#39;</span>) { +</span></span><span style="display:flex;"><span> emit(doc._id, doc.attachments[attachment].filename); +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>The following example looks into date fields, in this case <code>createdOn</code>, and checks if it uses dots (for changing them into dashes).</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JavaScript" data-lang="JavaScript"><span style="display:flex;"><span><span style="color:#069;font-weight:bold">function</span>(doc) { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">if</span>( +</span></span><span style="display:flex;"><span> (doc.type <span style="color:#555">==</span> <span style="color:#c30">&#39;release&#39;</span>) +</span></span><span style="display:flex;"><span> <span style="color:#555">&amp;&amp;</span> (doc.createdOn.indexOf(<span style="color:#c30">&#39;.&#39;</span>) <span style="color:#555">!==</span> <span style="color:#555">-</span><span style="color:#f60">1</span>) +</span></span><span style="display:flex;"><span> ) +</span></span><span style="display:flex;"><span> { +</span></span><span style="display:flex;"><span> emit(doc.name, doc) +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div> + + + + + Docs: Definition of Done + https://www.eclipse.org/sw360/docs/developers/dev-dod-and-style/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-dod-and-style/ + + + + <h3 id="policy">Policy</h3> +<ul> +<li>Review points should involve one person from another angle (not just the person you were sitting together with anyways)</li> +<li>Limit items in review to 5, try to coordinate</li> +<li>Using Github assignments to issues or pull requests</li> +<li>Open review items require conversation</li> +</ul> +<h1 id="definition-of-done">Definition of Done</h1> +<ul> +<li> +<p>File headers in file OK</p> +<ul> +<li>EPL-2.0 license header</li> +<li>Or, if the file is too small, configuration file: license note (see code style)</li> +<li>Copyright and author</li> +</ul> +</li> +<li> +<p>Create Branches for sw360</p> +<ul> +<li>Please use conventional branch names for sw360 (<a href="https://github.com/eclipse/sw360/wiki/Dev-Branches">Dev-Branches</a>)</li> +</ul> +</li> +<li> +<p>Avoid (serious) compiler warnings</p> +<ul> +<li>Squash your commits into one or more logical units of work. No dozens of hourly/daily commits in your pull request, please</li> +<li>Rebase onto current master so that a fast forward merge is possible</li> +<li>That means that merge to master is prepared</li> +</ul> +</li> +<li> +<p>use conventional change log for commit messages (<a href="https://github.com/eclipse/sw360/wiki/Dev-Semantic-Commits">Dev-Semantic-Commits</a>) <br> For more information please go to <a href="https://conventionalcommits.org/">https://conventionalcommits.org/</a></p> +</li> +<li> +<p>No breaking test</p> +<ul> +<li>Unit testing as it is already present</li> +<li>You have more - use them!</li> +</ul> +</li> +<li> +<p>New test</p> +<ul> +<li>For new / added functionality</li> +</ul> +</li> +<li> +<p>Documentation</p> +<ul> +<li>in the Githuib Wiki-Section, if you have done something new</li> +<li>At least a technical note for newly added functionality</li> +</ul> +</li> +<li> +<p>Commit style</p> +<ul> +<li>try to squash commits. In the ideal case, a feature is contained in one commit.</li> +<li>try to use conventional changelog for commit messages. (<a href="https://github.com/eclipse/sw360/wiki/Dev-Semantic-Commits">Dev-Semantic-Commits</a>)</li> +</ul> +</li> +</ul> +<h1 id="review">Review</h1> +<p>Review basically checks for the D-o-D items, in particular</p> +<ul> +<li>Code style, not really formatting, but issues like style attributes in HTML tags or exception handling useful</li> +<li>Design / architecture issues</li> +<li>Community contribution suitability</li> +<li>Issue coverage (does it actually solve the problem?)</li> +<li>Add to commit message of merge commit explicitly:</li> +</ul> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>review-by:email@domain.com +</span></span></code></pre></div><p>and</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>tested-by:email@domain.com +</span></span></code></pre></div><h1 id="licensing-and-file-header">Licensing and File Header</h1> +<p>All files contributed require headers - this will ensure the license and copyright clearing at the end. Also, all contributions must have the same license as the original source.</p> +<p>If a file has relevant functionality, note that we should move to Eclipse 2.0</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Java" data-lang="Java"><span style="display:flex;"><span><span style="color:#09f;font-style:italic">/* +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * Copyright COPYRIGHT HOLDER, 2017. +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * Copyright NEXT COPYRIGHT HOLDER, 2017. +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * Part of the SW360 Portal Project. +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * SPDX-License-Identifier: EPL-1.0 +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * All rights reserved. This program and the accompanying materials +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * are made available under the terms of the Eclipse Public License v1.0 +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * which accompanies this distribution, and is available at +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> * http://www.eclipse.org/legal/epl-v10.html +</span></span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"> */</span> +</span></span></code></pre></div><p>(please adapt comment characters usage)</p> +<p>For small files such as property files, configuration files or standard XML files:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Copyright &lt;COPYRIGHT_HOLDER&gt;, &lt;YEAR&gt;. Part of the SW360 Portal Project.</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic">#</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># All rights reserved. This configuration file is provided to you under the</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># terms and conditions of the Eclipse Distribution License v1.0 which</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># accompanies this distribution, and is available at</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># http://www.eclipse.org/org/documents/edl-v10.php</span> +</span></span></code></pre></div><h1 id="code-style">Code style</h1> +<p>Just use the standard Java formatting rules of your IDE and <strong>do not reformat</strong> code from others, because you like to correct formatting of other&rsquo;s code.</p> + + + + + + Docs: Filtering in Portlets + https://www.eclipse.org/sw360/docs/developers/dev-filtering-in-portlets/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-filtering-in-portlets/ + + + + <p>For the filters that are shown for components and listings, there are some options:</p> +<ol> +<li> +<p>The <strong>Keyword search</strong> works directly on the table shown on the main right area. For example in the components portlet, this is in components/view.jsp.</p> +</li> +<li> +<p>The <strong>filters</strong> actually result in a new search request, when hitting apply filters button. The project portlet reads the fields and creates a map. Then, <code>ProjectPortlet</code> calls the thrift service <code>refineSearch()</code>, which is handled in <code>ProjectHandler</code>. This method takes the map and the user as input. The search service has a server-side JavaScript function (LuceneSearchView) defined for this particular filter in <code>ProjectSearchHandler.java</code>. This is called with the <code>LuceneAwareDatabaseConnector.java</code>. After filtering, the visibility constraints for the requesting user are applied.</p> +</li> +<li> +<p>Then for each release table, there is a search field in the upper right corner. This again works on the data of the Release summary object and then filters what is on the client (web browser).</p> +</li> +</ol> + + + + + + Docs: Fossology Integration + https://www.eclipse.org/sw360/docs/developers/dev-fossology-integration/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-fossology-integration/ + + + + <p>Basic communication with the FOSSology server is done over an SSH connection: the fossology service of SW360 executes remote commands on the FOSSology server.</p> +<p>The commands that are executed are the bash scripts found inside <code>src-fossology/src/main/resources/scripts/</code>, they are copied into the home directory of the ssh user (either manually or through the admin portlet). +See <a href="Fossology-Setup">Setup of connection with Fossology</a> for configuration details.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>\- src-fossology/src/main/resources/ +</span></span><span style="display:flex;"><span> \- scripts/ +</span></span><span style="display:flex;"><span> |- duplicateUpload +</span></span><span style="display:flex;"><span> |- folderManager +</span></span><span style="display:flex;"><span> |- getStatusOfUpload +</span></span><span style="display:flex;"><span> |- uploadFromSW360 +</span></span><span style="display:flex;"><span> \- utilsSW360 +</span></span></code></pre></div><p>These scripts utilize the standard command line tools to interact natively with FOSSology (these are the tools found in the src/cli folder of FOSSology, such as <code>cp2foss fossjobs fossupload_status fo_usergroup fo_chmod fo_folder ...</code>).</p> +<ul> +<li><code>utilsSW360</code> contains common functions used by the other scripts and some FOSSology configuration such as the user/password pair used to run the cli utils and the UNIX group of the FOSSology processes</li> +<li><code>folderManager</code> (uses FO:<code>fo_folder</code>): get information about the folder structure of FOSSology to allow sharing of uploads between groups</li> +<li><code>getStatusOfUpload</code> (uses FO:<code>fossupload_status</code>): to get the clearing status given an uploadId and a group</li> +<li><code>uploadFromSW360</code> (uses FO:<code>cp2foss fossjobs</code>): to create a new upload from the standard input and schedule scanners</li> +<li><code>duplicateUpload</code> (uses FO:<code>fo_chmod</code> SW:<code>folderManager</code>): to make a previously uploaded file available for another group</li> +</ul> +<h3 id="java-libraries-and-settings">Java libraries and settings</h3> +<p>The java code utilizes the package <code>com.jcraft.jsch</code> to connect to the SSH server. It is set to strictly check the fingerprint of the remote server against the accepted which are stored in couchDB.</p> +<h3 id="conventions">Conventions</h3> +<p>the sw360 user in FOSSology (the actual name is configured in <code>utilsSW360</code>) <strong>must be a member of every group</strong> to which it should be able to send Releases to be cleared. +File uploaded from SW360 are placed inside a folder with the same name as the group and permission will be set at the group level (default of cp2foss).</p> +<h3 id="datamodel-and-thrift-service">Datamodel and thrift service</h3> +<ul> +<li> +<p>each Release object in SW360 can have only one attachment of type SOURCE.</p> +</li> +<li> +<p>when a Release is sent <em>for the first time</em> to FOSSology through the Thrift method <code>sendToFossology(1: string releaseId, 2: string clearingTeam )</code> its SOURCE attachement is sent as stdin to the script <code>uploadFromSW360</code>.</p> +<p>The field <code>map&lt;string, FossologyStatus&gt; clearingTeamToFossologyStatus</code> is then updated to contain the corresponding entry for the chosen Clearing Team (aka. the name of the FOSSology group which will receives the upload for clearing).</p> +</li> +<li> +<p>when the same Release is <em>sent again for another team</em> a new <em>link</em> in the corresponding group folder is created and the old upload is made available for the new group (as in giving permission using FO:<code>fo_chmod</code>).</p> +<p>At the moment this gives access only to the files, not to the relative clearing decision. +In order to make the clearing decisions available a reuser needs to be scheduled from the Jobs menu. [ it could be possible to schedule the job from SW360: its user is member of all the groups; but it is not currently implemented since there is no cli interface for reuser yet ]</p> +</li> +<li> +<p>when the current status is requested using the Thrift method <code>Release getStatusInFossology(1: string releaseId, 2: string clearingTeam )</code> the newest status is fetched from FOSSology and it is stored in the map for the relative clearingTeam</p> +</li> +</ul> +<h3 id="notes">Notes</h3> +<ul> +<li>Releases have a ClearingState field, but this is ignored by the Thrift service and used only in the SW360 user interface.</li> +<li>Projects link to Releases and the summary of their FOSSology status can be monitored. This is also ignored by the FOSSology Thrift service and handled by the Component service: the FOSSology service just updates the status of the Release objects.</li> +</ul> + + + + + + Docs: Licenses + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-licenses/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-licenses/ + + + + <h2 id="create-edit-and-delete-license">Create, edit and delete license</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Sign In with a known <em>clearing admin</em> user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on <em>Licenses</em> tab</td> +<td style="text-align:left"><em>Licenses</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click on <em>Add License</em></td> +<td style="text-align:left"><em>New License</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Fill in <em>Fullname</em> and <em>Shortname</em> fields and press <em>Add License</em></td> +<td style="text-align:left"><em>License added successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Write the license or part of newly created license name in <em>Keyword Search</em> field</td> +<td style="text-align:left">License is filtered successfully</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click on license name and then on <em>Edit License Details and Text</em></td> +<td style="text-align:left">License page is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Modify some fields and click <em>Update License</em></td> +<td style="text-align:left"><em>License updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Check all fields on <em>Details</em> and <em>Text</em> pages</td> +<td style="text-align:left">Values are filled in correctly</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Click on <em>Edit License Details and Text</em></td> +<td style="text-align:left">License page is displayed</td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click o <em>Delete</em> license name</td> +<td style="text-align:left"><em>License removed successfully!</em> message is displayed</td> +</tr> +</tbody> +</table> +<h2 id="edit-license-todos-and-obligations">Edit license TODOs and Obligations</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Sign In with a known <em>clearing admin</em> user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on previously created license name</td> +<td style="text-align:left"><em>License Details</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click on <em>Add a Todo</em></td> +<td style="text-align:left">Todo page displayed successfully</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Enter a Todo text (e.g. &ldquo;First todo text&rdquo;), click <em>Applies to development</em>, and click <em>Submit</em></td> +<td style="text-align:left"><em>License updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>TODOs and Obligations</em></td> +<td style="text-align:left">The previously entered Todo is listed on the page with <em>No obligations</em></td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click on <em>Add a Todo</em></td> +<td style="text-align:left">Todo page displayed successfully</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Enter a Todo text (e.g. &ldquo;Second todo text&rdquo;), click on some Obligations and click Submit</td> +<td style="text-align:left"><em>License updated successfully!</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click TODOs and Obligations</td> +<td style="text-align:left">The previously entered Todo is listed on the page together with chosen obligations</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Click on <em>Edit WhiteList</em>, deselect first Todo and click <em>Submit</em></td> +<td style="text-align:left">The deselected Todo is not displayed anymore on <em>TODOs and Obligations</em> page</td> +</tr> +</tbody> +</table> +<h2 id="check-export-licenses">Check Export Licenses</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Sign In with a known user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on <em>Licenses</em> tab</td> +<td style="text-align:left"><em>Licenses</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click on <em>Export Licenses</em></td> +<td style="text-align:left">A dialog for opening <em>Licenses.xlsx</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Open the xlsx file and compare the number of rows with total number of entries from <em>Licenses</em> tab</td> +<td style="text-align:left">All licenses names are exported successfully.</td> +</tr> +</tbody> +</table> + + + + + + Docs: Liferay Friendly + https://www.eclipse.org/sw360/docs/developers/dev-liferay-friendly-url/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-liferay-friendly-url/ + + + + <p>The normal generated portlet URLs containing a set of internal Liferay request parameters. <br> +These long URLs of links or forms are mostly not readable and its not easy to share it somewhere else.</p> +<p>General Liferay portlet URL: <br></p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://localhost:8080/web/guest/examples?p_p_id=example_WAR_ExamplePortlet&amp;p_p_lifecycle=1&amp;p_p_state=normal&amp;p_p_mode=view&amp;p_p_col_id=column-1&amp;p_p_col_count=1&amp;_example_WAR_ExamplePortlet_javax.portlet.action=new +</span></span></code></pre></div><p>Explanation of the Liferay request parameters: <br> +<strong>p_p_id:</strong> The portlet ID (example_WAR_ExamplePortlet)<br> +<strong>p_p_state:</strong> Liferay windows pages state - 1 (normal) 2 (maximize) 3 (minimize) <br> +<strong>p_p_mode</strong>: Mode of the portlet look like - (view) (edit) (help) <br> +<strong>p_p_lifecycle:</strong> This is life cycle of portlet - 0 (render) 1 (action) 2 (server) <br> +<strong>p_p_col_id:</strong> The reference ID of the column in Liferay template <br> +<strong>p_p_col_pos:</strong> Specifiy the column position if the the layout having more than one columns <br> +<strong>p_p_col_count:</strong> Shows the no of columns in the current layout</p> +<h3 id="friendly-url-mapper-configuration">Friendly URL Mapper configuration</h3> +<p>Liferay provides a mechanism to shorten the generated URLs by using the Friendly URL Mapper feature. <br> <br> +How to configure the friendly URL Mapper in Liferay? <br> <br> +<strong>Configuration of URL routes in XML files</strong> <br></p> +<p><em>CREATE example-friendly-url-routes.xml</em> <br></p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Xml" data-lang="Xml"><span style="display:flex;"><span><span style="color:#099">&lt;?xml version=&#34;1.0&#34;?&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#099">&lt;!DOCTYPE routes PUBLIC &#34;-//Liferay//DTD Friendly URL Routes 6.2.2//EN&#34; +</span></span></span><span style="display:flex;"><span><span style="color:#099">&#34;http://www.liferay.com/dtd/liferay-friendly-url-routes_6_0_0.dtd&#34;&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;routes&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;route&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;pattern&gt;</span>/action/{actionName}<span style="color:#309;font-weight:bold">&lt;/pattern&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;generated-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;javax.portlet.action&#34;</span><span style="color:#309;font-weight:bold">&gt;</span>{actionName}<span style="color:#309;font-weight:bold">&lt;/generated-parameter&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;ignored-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;p_auth&#34;</span><span style="color:#309;font-weight:bold">/&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;ignored-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;p_p_id&#34;</span><span style="color:#309;font-weight:bold">/&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;implicit-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;p_p_lifecycle&#34;</span><span style="color:#309;font-weight:bold">&gt;</span>1<span style="color:#309;font-weight:bold">&lt;/implicit-parameter&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;implicit-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;p_p_state&#34;</span><span style="color:#309;font-weight:bold">&gt;</span>normal<span style="color:#309;font-weight:bold">&lt;/implicit-parameter&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;implicit-parameter</span> <span style="color:#309">name=</span><span style="color:#c30">&#34;p_p_mode&#34;</span><span style="color:#309;font-weight:bold">&gt;</span>view<span style="color:#309;font-weight:bold">&lt;/implicit-parameter&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/route&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;/routes&gt;</span> +</span></span></code></pre></div><p>Explanation of the Liferay Friendly Mapper route parameters: <br> +<strong>routes:</strong> Routes element which contains all route entries <br> +<strong>route:</strong> Single route element entry <br> +<strong>pattern:</strong> Pattern of the mapped friendly URL (visible in address bar) <br> +<strong>generated-parameter:</strong> These parameters will be generated from parameters in the request URL <br> +<strong>ignored-parameter:</strong> These parameters will be igored and not included in generated URLs <br> +<strong>implicit-parameter:</strong> Used for static attributes which can be ignored by recognition <br> +<strong>overridden-parameter:</strong> Parameter that should be set to a certain value when a URL is recognized <br> +<br> +It is necessary to order the parameters as described above. <br> +These files should located in the resources folder otherwise they will not be available on Apache Tomcat and cannot be initialized by Liferay. <br> +<br> +<strong>Configuration of friendly URL Java class</strong> <br> +<br> +<em>MODIFY liferay-portlet.xml</em> +<br></p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Xml" data-lang="Xml"><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;friendly-url-mapper-class&gt;</span>com.liferay.portal.kernel.portlet.DefaultFriendlyURLMapper<span style="color:#309;font-weight:bold">&lt;/friendly-url-mapper-class&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;friendly-url-mapping&gt;</span>example<span style="color:#309;font-weight:bold">&lt;/friendly-url-mapping&gt;</span> +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;friendly-url-routes&gt;</span>com/.../example-friendly-url-routes.xml<span style="color:#309;font-weight:bold">&lt;/friendly-url-routes&gt;</span> +</span></span></code></pre></div><br> +In the next step we need one java implementation class to generate the Liferay friendly URLs. <br> +<p>Liferay provides the <em>DefaultFriendlyURLMapper</em> class to create the URLs based on our rules. <br></p> +<p>The Liferay Friendly URL Mapper configuration is placed after <code>&lt;icon/&gt;</code> and before <code>&lt;instanceable&gt;</code> +tag.</p> +<h3 id="friendly-url-mapper-outcome">Friendly URL Mapper outcome</h3> +<p><strong>Liferay will generate the following friendly URL</strong> <br></p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>http://localhost:8080/web/guest/examples/-/example/action/new +</span></span></code></pre></div><br> +<ol> +<li>The liferay framework will add &ldquo;-&rdquo; (dash)</li> +<li>Friendly URL mapper name which is configured in <code>&lt;friendly-url-mapping&gt;</code> (liferay-portlet.xml) element</li> +<li>Pattern name with generated parameters which is same as in <code>&lt;pattern&gt;</code> (example-friendly-url-routes.xml) defined.</li> +</ol> +<h3 id="additional">Additional</h3> +<p>Friendly URL Mapper functionality is not working if the portletURL API is used to generate the Liferay URL in local Javascript. <br> +It is helpful to generate <code>&lt;portlet:renderURL&gt;</code> placeholder and replace them by using dummy values.</p> + + + + + + Docs: Moderation + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-moderations/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-moderations/ + + + + <h2 id="accept-moderation-request-for-visible-projects-by-other-users">Accept moderation request, for visible projects by other users</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Open first browser instance ((e.g. &ldquo;firefox.exe -p &ldquo;profile1&rdquo; -no-remote&rdquo;) and sign in with a known <em>First</em> user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Open a second browser instance ((e.g. &ldquo;firefox.exe -p &ldquo;profile2&rdquo; -no-remote&rdquo;) and sign in with a known <em>Second</em> user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Activate <em>First</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Create a new project visible for <em>Second</em> user (e.g. <em>Me and Moderators</em>, <em>Group and Moderators</em>, <em>Everyone</em>)</td> +<td style="text-align:left">Project is created successfully</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Activate <em>Second</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Search for the above created project and click <em>Edit</em></td> +<td style="text-align:left"><em>You will create a moderation request if you update.</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Edit Description field or other fields and click <em>Update Project</em></td> +<td style="text-align:left"><em>Moderation request was sent to update the Project name!</em> message is displayed.</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Activate <em>First</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Check <em>My Task Assignments</em> on <em>Home</em> page</td> +<td style="text-align:left">The above project that needs moderation is displayed with status <em>PENDING</em></td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click on <em>Moderation</em> page</td> +<td style="text-align:left">The moderation request of <em>Second</em> user is displayed with state <em>Pending</em></td> +</tr> +<tr> +<td style="text-align:right">11</td> +<td style="text-align:left">Click on moderation request</td> +<td style="text-align:left"><em>Moderation Change Project</em> page is displayed, with proposed changes from step 7 listed</td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Click on <em>Accept Request</em></td> +<td style="text-align:left"><em>You have accepted the previous moderation request.</em> message is displayed, and State changes to <em>Approved</em></td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Check <em>My Task Assignments</em> on <em>Home</em> page</td> +<td style="text-align:left">Status is <em>APPROVED</em></td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Activate <em>Second</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Check _My Task Submissions on <em>Home</em> page</td> +<td style="text-align:left">Status is <em>APPROVED</em></td> +</tr> +<tr> +<td style="text-align:right">16</td> +<td style="text-align:left">Open the <em>Projects</em> tab and click on previously modified project on step 7</td> +<td style="text-align:left">Project <em>Summary</em> page displayed successfully</td> +</tr> +<tr> +<td style="text-align:right">17</td> +<td style="text-align:left">Check the moderation requested changes</td> +<td style="text-align:left">Changes are visible in the corresponding fields</td> +</tr> +</tbody> +</table> +<h2 id="decline-moderation-request-for-visible-projects-by-other-users">Decline moderation request, for visible projects by other users</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1-11</td> +<td style="text-align:left">Same as in TC01</td> +<td></td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Click on <em>Decline Request</em></td> +<td style="text-align:left"><em>You have declined the previous moderation request</em> message is displayed, and State changes to <em>Rejected</em></td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Check <em>My Task Assignments</em> on <em>Home</em> page</td> +<td style="text-align:left">Status is <em>REJECTED</em></td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Activate <em>Second</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Check _My Task Submissions on <em>Home</em> page</td> +<td style="text-align:left">Status is <em>REJECTED</em></td> +</tr> +<tr> +<td style="text-align:right">16</td> +<td style="text-align:left">Open the <em>Projects</em> tab and click on previously modified project on step 7</td> +<td style="text-align:left">Project <em>Summary</em> page displayed successfully</td> +</tr> +<tr> +<td style="text-align:right">17</td> +<td style="text-align:left">Check the moderation requested changes</td> +<td style="text-align:left">Changes are not visible in the corresponding fields</td> +</tr> +</tbody> +</table> +<h2 id="remove-me-from-moderators-for-moderation-request-for-visible-projects-by-other-users">Remove Me from Moderators for moderation request, for visible projects by other users</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1-11</td> +<td style="text-align:left">Same as in TC01</td> +<td></td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Click on <em>Remove Me from Moderators</em></td> +<td style="text-align:left"><em>You are the last moderator for this request - you are not allowed to unsubscribe.</em> message is displayed (assuming only <em>First</em> user was listed under <em>Moderators</em> column in step 10)</td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Click on <em>Decline Request</em></td> +<td style="text-align:left"><em>You have declined the previous moderation request</em> message is displayed, and State changes to <em>Rejected</em></td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Edit the project and add a new moderator (e.g. <em>Third</em> user) under <em>Moderators</em> field</td> +<td style="text-align:left">Project updated successfully.</td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Activate <em>Second</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">16</td> +<td style="text-align:left">Edit the project and create a new moderation request</td> +<td style="text-align:left">Moderation request was sent</td> +</tr> +<tr> +<td style="text-align:right">17</td> +<td style="text-align:left">Activate <em>First</em> browser instance</td> +<td style="text-align:left">Instance is active</td> +</tr> +<tr> +<td style="text-align:right">18</td> +<td style="text-align:left">Click on <em>Moderation</em> page</td> +<td style="text-align:left">The moderation request of <em>Second</em> user is displayed with state <em>Pending</em></td> +</tr> +<tr> +<td style="text-align:right">19</td> +<td style="text-align:left">Click on moderation request</td> +<td style="text-align:left"><em>Moderation Change Project</em> page is displayed, with proposed changes from step 7 listed</td> +</tr> +<tr> +<td style="text-align:right">20</td> +<td style="text-align:left">Click on <em>Remove Me from Moderators</em></td> +<td style="text-align:left"><em>You are removed from the list of moderators for the previous moderation request. You have no open Requests.</em> message is displayed. Also the document is deleted from moderation list.</td> +</tr> +<tr> +<td style="text-align:right">21</td> +<td style="text-align:left">Login with the <em>Third</em> user and check the <em>Moderation</em> tab</td> +<td style="text-align:left">The moderation request of <em>Second</em> user is displayed with state <em>Pending</em></td> +</tr> +</tbody> +</table> + + + + + + Docs: Moderation Requests + https://www.eclipse.org/sw360/docs/developers/dev-moderation-requests/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-moderation-requests/ + + + + <p>The concept of moderation is good for two things:</p> +<ul> +<li>to cope with a large number of potential edits on documents.</li> +<li>to allow every user to propose edits.</li> +</ul> +<p>Allowing every user to edit opposed to propose edits would lad to a large number of changes, potentially, not making everyone happy. As such, the changes should be reviewed by an experienced person and can be then approved.</p> +<h2 id="application-flow">Application Flow</h2> +<p>A user changes a moderated document, which are component, release, project and todo&rsquo;s of licenses (and the white list):</p> +<ul> +<li> +<p>The user switches in edit mode and applies a change.</p> +</li> +<li> +<p>The user submits the change by clicking &ldquo;Update &hellip;&rdquo;</p> +</li> +<li> +<p>The application checks, if the permissions are sufficient</p> +</li> +<li> +<p>For sufficient permissions, see here: <a href="https://github.com/siemens/sw360portal/wiki/Dev-Role-Authorisation-Model">https://github.com/siemens/sw360portal/wiki/Dev-Role-Authorisation-Model</a></p> +</li> +<li> +<p>If the permissions do not allow the edit right away, a moderation request is created.</p> +</li> +<li> +<p>Moderators can see the moderation request in the moderation portlet</p> +</li> +<li> +<p>Having selected the moderation request, the moderator can accept the request, decline, postpone or remove himself from the list of moderators</p> +</li> +</ul> +<h2 id="technical-description">Technical Description</h2> +<h3 id="checking-document-permissions">Checking Document Permissions</h3> +<p>If a moderation requests needs to be created, because the user does not have sufficient permissions:</p> +<ul> +<li>The request goes through the stack, for example: project portlet, project handler, project database handler.</li> +<li>Then the project database handler checks for permissions using <code>makePermission()</code> (<code>DocumentPermission</code> is the base class, then <code>ProjectPermissions</code> is the referring here for projects) and <code>isActionAllowed()</code>.</li> +<li>For moderation requests, we assume that this action is not allowed. Then, the <code>ProjectModerator</code> is called (see package <code>...sw360.datahandler.entitlement</code>).</li> +<li>This class (which is part of the project service) creates a thrift client to the moderation service (also on the backend) and creates a moderation request using this client.</li> +</ul> +<p>Every moderation request is created using the thrift-based API.</p> +<h3 id="writing-a-moderation-request-to-the-database">Writing a Moderation Request to the Database</h3> +<p>The generation of moderation request is performed by the moderation service. The moderation service handles incoming request in the following way:</p> +<ul> +<li>The requests arrives in the <code>ModerationDatabaseHandler</code>.</li> +<li>This handler writes the request to the database.</li> +</ul> +<h3 id="creation-details-in-the-service">Creation Details in the Service</h3> +<p>The handler writes one moderation request per user and document. If a moderation request from the same user for the same document exists, added moderation requests are merged. Or, the request is new either with a new user, new document or both, then the moderation request is created.</p> +<p>Each moderation requests has recipients, the moderators. The moderation database handler selects the moderators depending on the document type, which are usually the creator of the document and the listed moderators for this document. See details in the <code>ModerationDatabaseHandler</code> class. At the same location the check for deletion is performed.</p> +<h3 id="what-is-in-the-database">What is in the Database?</h3> +<p>The moderation request is a document in the couchdb. Technically, the moderation requests holds the affected document as field where the values is a nested JSON dictionary.</p> +<p>The following screen shot shows an example for a moderation request for a project.</p> +<p><img src="https://raw.githubusercontent.com/wiki/siemens/sw360portal/images/036-oss-sw360-20160310-screenshot-moderation-reqeust-document-example.png" alt="Example Moderation Request in Database"></p> +<h3 id="evaluating-the-moderation-request">Evaluating the Moderation Request</h3> +<p>On the moderation portlet all moderations will be shown, for which the user is a moderator. +Only open moderation requests can be selected. Approved and declined moderation requests will only be shown. +On selecting the moderation requests, both documents (original and the updated out of the moderation request) will be compared in the <code>merge.jsp</code> and all differences will be shown to the moderator. This is done via tags such as the <code>sw360:CompareProject</code>-tag. Opening the detailed view of the moderation request changes the state to <code>in progress</code> to show other moderators that the moderation request is in work.</p> +<p>The following actions are possible:</p> +<ul> +<li><code>Accept request</code>: the document within the moderation request will be accepted and written to the DB via e.g. the <code>ProjectService</code>. The state is set to <code>ACCEPTED</code>.</li> +<li><code>Remove Me from Moderators</code>: the state of the moderation requests is set to <code>PENDING</code> again and the logged in moderator will be removed from the moderation list.</li> +<li><code>Decline request</code>: the moderation requests will be set to <code>REJECTED</code> and still shown in the list</li> +<li><code>Postpone request</code>: the state will be <code>IN PROGRESS</code>.</li> +<li><code>Cancel</code>: the moderation state is set to <code>PENDING</code> and the moderation request will still be shown in the moderation request list</li> +</ul> + + + + + + Docs: Projects + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-projects/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/testcases/test-cases-projects/ + + + + <h2 id="add-a-simple-project-with-no-relations-and-no-releases">Add a simple project with no relations and no releases</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Sign In with a known user</td> +<td style="text-align:left">User successfully signed in and <em>Home</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click on <em>Projects</em> tab</td> +<td style="text-align:left"><em>Projects</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left"><em>New Project</em> page is displayed with mandatory fields marked with red star</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Fill mandatory <em>Name</em> with a project name, change other fields if needed</td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>Cancel</em> button</td> +<td style="text-align:left">New project <em>Summary</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click on <em>Projects</em> tab</td> +<td style="text-align:left">The new project should be added to the projects list</td> +</tr> +</tbody> +</table> +<h2 id="add-a-full-project-with-relations-releases-and-send-to-clearing-process">Add a full project with relations, releases and send to clearing process</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Click on <em>Projects</em> tab</td> +<td style="text-align:left"><em>Projects</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left"><em>New Project</em> page is displayed with mandatory fields marked with red star</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Fill mandatory <em>Name</em> with a project name, change other fields if needed</td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>Click to add linked Projects</em></td> +<td style="text-align:left"><em>Search Project</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Search</em> and <em>Select</em> the project to be linked (e.g. created in TC01)</td> +<td style="text-align:left">Dialog is closed and selected project is displayed under <em>Linked Projects</em> section</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>Click to add Releases</em></td> +<td style="text-align:left"><em>Search Release</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Search by name</em> and <em>Select</em> a release to be added</td> +<td style="text-align:left">Dialog is closed and selected release is displayed under <em>Linked Releases</em> section</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">9</td> +<td style="text-align:left">Click <em>Cancel</em> button</td> +<td style="text-align:left">New project <em>Summary</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">10</td> +<td style="text-align:left">Click on <em>Projects</em> tab</td> +<td style="text-align:left">The new project should be added to the projects list</td> +</tr> +<tr> +<td style="text-align:right">11</td> +<td style="text-align:left">Check <em>Clearing Status</em> by hovering mouse over the numbers.</td> +<td style="text-align:left">The message should be <em>new release, under clearing&hellip;</em></td> +</tr> +<tr> +<td style="text-align:right">12</td> +<td style="text-align:left">Send open release to clearing by clicking the button <em>Send to fossology</em>, under <em>Actions</em> column</td> +<td style="text-align:left"><em>Fossology Clearing</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">13</td> +<td style="text-align:left">Select the release to be sent for clearing and click <em>Send</em></td> +<td style="text-align:left"><em>Sent</em> message is displayed near the <em>Send to fossology</em> button</td> +</tr> +<tr> +<td style="text-align:right">14</td> +<td style="text-align:left">Click on project name and check <em>Summary</em> page</td> +<td style="text-align:left"><em>Clearing details</em> should have 1 for <em>Under clearing</em></td> +</tr> +<tr> +<td style="text-align:right">15</td> +<td style="text-align:left">Click on <em>Clearing Status</em></td> +<td style="text-align:left">The &ldquo;Release Clearing State_ should be <em>Sent to Fossology</em></td> +</tr> +</tbody> +</table> +<h2 id="add-a-project-with-releases-no-relations-remove-a-release-and-send-to-clearing-process">Add a project with releases, no relations, remove a release, and send to clearing process</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1-5</td> +<td style="text-align:left">Same as in TC02</td> +<td></td> +</tr> +<tr> +<td style="text-align:right">5a</td> +<td style="text-align:left">Click on <em>Delete</em> icon to delete the linked project</td> +<td style="text-align:left"><em>Do you really want to remove the link to this project?</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">5b</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">The project is removed from the list of <em>Linked Projects</em></td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Click <em>Click to add Releases</em></td> +<td style="text-align:left"><em>Search Release</em> dialog is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Search by name</em> and <em>Select</em> more than one release to be added</td> +<td style="text-align:left">Dialog is closed and selected releases are displayed under <em>Linked Releases</em> section</td> +</tr> +<tr> +<td style="text-align:right">7a</td> +<td style="text-align:left">Click on <em>Delete</em> icon to delete one of the linked release</td> +<td style="text-align:left"><em>Do you really want to remove the link to this release?</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">7b</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">The release is removed from the list of <em>Linked Releases</em></td> +</tr> +<tr> +<td style="text-align:right">8-15</td> +<td style="text-align:left">Same as in TC02</td> +<td></td> +</tr> +</tbody> +</table> +<p>##TC04: Delete a project that is first linked to another project and then not linked</p> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Create a new project</td> +<td style="text-align:left">Project is created successfully</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Create another project and add first created one as linked project</td> +<td style="text-align:left">Projects are linked successfully</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Go to first created project in the projects table and try to delete it</td> +<td style="text-align:left">Message <em>Do you want to delete project name?</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Message <em>The project is used by another project!</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Project is not deleted (e.g. refresh the page by clicking Projects tab)</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Go to second created project in the projects table and delete it</td> +<td style="text-align:left">Message <em>Do you want to delete project name?</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>OK</em></td> +<td style="text-align:left">Project is deleted successfully</td> +</tr> +<tr> +<td style="text-align:right">8</td> +<td style="text-align:left">Go to first created project in the table (not linked anymore to second project) and delete it</td> +<td style="text-align:left">Project is deleted successfully</td> +</tr> +</tbody> +</table> +<h2 id="modify-an-existing-project-with-relations-releases-and-send-to-clearing-process">Modify an existing project with relations, releases and send to clearing process</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for a simple project (e.g. created in TC01) and click <em>Edit</em></td> +<td style="text-align:left"><em>You are editing the original document</em> message is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Execute steps 5-16 from TC02</td> +<td></td> +</tr> +</tbody> +</table> +<h2 id="add-and-modify-a-project-with-all-project-fields-filled-in">Add and modify a project with all project fields filled in</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Click on <em>Projects</em> tab</td> +<td style="text-align:left"><em>Projects</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left"><em>New Project</em> page is displayed with mandatory fields marked with red star</td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Fill in all editable fields under <em>Basic Information</em>, <em>User Information</em> and <em>Admin Information</em></td> +<td style="text-align:left">Values are entered in the fields</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>Add Project</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Click <em>Cancel</em> button</td> +<td style="text-align:left">New project <em>Summary</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">6</td> +<td style="text-align:left">Check all fields on <em>Summary</em> page</td> +<td style="text-align:left">Values are filled in correctly</td> +</tr> +<tr> +<td style="text-align:right">7</td> +<td style="text-align:left">Click <em>Edit</em> button, modify some fields and <em>Update Project</em></td> +<td style="text-align:left">Values are updated successfully</td> +</tr> +</tbody> +</table> +<h2 id="duplicate-an-existing-project">Duplicate an existing project</h2> +<table> +<thead> +<tr> +<th style="text-align:right">Step</th> +<th style="text-align:left">Action</th> +<th style="text-align:left">Result</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:right">1</td> +<td style="text-align:left">Search for an existing project with all fields filled in (e.g. created in TC06) and click <em>Duplicate</em> button under <em>Actions</em> column</td> +<td style="text-align:left">Project <em>Information</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">2</td> +<td style="text-align:left">Check all fields from copied project</td> +<td style="text-align:left">All fields are unchanged, including <em>Linked Projects</em> and <em>Linked Releases</em></td> +</tr> +<tr> +<td style="text-align:right">3</td> +<td style="text-align:left">Fill mandatory <em>Name</em> with a project name and click <em>Add Project</em></td> +<td style="text-align:left">The page remain the same and the message <em>You are editing the original document.</em> is displayed</td> +</tr> +<tr> +<td style="text-align:right">4</td> +<td style="text-align:left">Click <em>Cancel</em> button</td> +<td style="text-align:left">New project <em>Summary</em> page is displayed</td> +</tr> +<tr> +<td style="text-align:right">5</td> +<td style="text-align:left">Check all fields</td> +<td style="text-align:left">All fields were copied successfully, except the new name of the project</td> +</tr> +</tbody> +</table> + + + + + + Docs: Release and Versioning + https://www.eclipse.org/sw360/docs/developers/dev-releasing-sw360/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-releasing-sw360/ + + + + <p>We have the following main principles for versioning and releases. We consider <a href="http://semver.org/">semantic versioning</a>:</p> +<blockquote> +<p>Given a version number MAJOR.MINOR.PATCH, increment the:</p> +<ul> +<li>MAJOR version when you make incompatible API changes,</li> +<li>MINOR version when you add functionality in a backwards-compatible manner, and</li> +<li>PATCH version when you make backwards-compatible bug fixes.</li> +</ul> +<p>Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.</p> +</blockquote> +<p>with the following implementation in our project:</p> +<h3 id="major-version">Major Version</h3> +<ul> +<li>API breaking changes are considered for the upcoming REST API.</li> +<li>Breaking change is <em>also</em> if a migration script is required for the data base.</li> +<li>Thrift API is not considered a public API anymore.</li> +<li>Therefore milestones cannot correspond to our versions like <code>1.4</code>, <code>1.5</code>, etc. anymore: we do not know which feature or issue will cause a version jump according to semantic versioning guidelines.</li> +</ul> +<h3 id="minor-version">Minor Version</h3> +<ul> +<li>Changes to the thrift API will cause minor version increment.</li> +<li>Larger new functionality which is backwards compatible, maybe one pull requests or maybe a group of pull requests.</li> +<li>Minor versions requires also tagging in the repo.</li> +</ul> +<h3 id="patch-level">Patch Level</h3> +<ul> +<li>Every push (merged pull request) to master shall generate <em>at least</em> (not there yet) a new patch level version, in order to allow for (clean) deployments at this level.</li> +<li>Could e also minor improvements like adding a button with some functionality</li> +<li>Patch level is not tagged.</li> +</ul> +<h2 id="naming-and-meaning-of-milestones">Naming and Meaning of Milestones</h2> +<ul> +<li>Milestones cannot correspond to versions (releases) anymore, because in general the version designator is determined by the level of change.</li> +<li>We use milestones as work packages. We see them as work packages from an organizational point of view. However, it is not a milestone to release a version, because - again in general - the version is determined by the level of change.</li> +<li>However, If the last merged pull quest of a work package, a completing merge: If it is not causing a major or minor version increment, still, this would lead to a minor version increment.</li> +</ul> +<h2 id="technical-implementation">Technical Implementation</h2> +<ul> +<li>Plan: The artifacts will be build by travis and stored on aws S3 (not there yet) with patch level version increments, but patch level versions will not lead to a tag in the repo.</li> +<li>Currently, the versioning is &ldquo;manual maven based&rdquo;, we look for a cleaner more automated approach.</li> +</ul> +<h1 id="technical-maven-universe-how-to-maketag-a-release">Technical: Maven Universe How to make/tag a release⁽¹⁾:</h1> +<p>The following information refers to the existing maven-based versioning scheme, as of now we are looking into a system which is not leading to a temporary change in the repo, commit, and then reverting changes.</p> +<p>Let us assume, that we want to tag the version <strong>1.2.0</strong> and that the current version in the pom&rsquo;s is <strong>1.2.0-SNAPSHOT</strong>.</p> +<h3 id="0-work-in-a-clean-environment">0. Work in a clean environment</h3> +<p>Especially should all poms be without uncommitted changes. The safe way is to start with:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>$ <span style="color:#366">cd</span> /tmp/ +</span></span><span style="display:flex;"><span>$ git clone https://github.com/eclipse/sw360.git +</span></span><span style="display:flex;"><span>$ <span style="color:#366">cd</span> sw360portal +</span></span></code></pre></div><h3 id="1-write-the-version-of-the-release-into-the-poms">1. Write the version of the release into the poms</h3> +<pre> +$ mvn versions:set -DnewVersion=<b>1.2.0</b> +$ git add pom.xml \*\*/pom.xml +$ git commit -m "set version to <b>1.2.0</b>" +</pre> +<p>This will actually edit all pom.xml files and change the versions to <strong>1.2.0</strong>, i.e. remove the SNAPSHOT.</p> +<h3 id="2-test-the-project">2. Test the project</h3> +<pre> +$ mvn install +</pre> +<p>or even better: use vagrant.</p> +<h3 id="3-create-and-push-the-tag">3. Create and push the tag</h3> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>$ mvn scm:tag +</span></span></code></pre></div><p>This creates the tag and <strong>pushes it to github</strong>.</p> +<h3 id="4-write-the-new-incremented-snapshot-version-into-the-poms">4. Write the new incremented SNAPSHOT-version into the poms</h3> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>$ mvn versions:set -DnewVersion<span style="color:#555">=</span>&lt;b&gt;1.3.0-SNAPSHOT&lt;/b&gt; +</span></span><span style="display:flex;"><span>$ git add pom.xml <span style="color:#c30;font-weight:bold">\*\*</span>/pom.xml +</span></span><span style="display:flex;"><span>$ git commit -m <span style="color:#c30">&#34;set version to &lt;b&gt;1.3.0-SNAPSHOT&lt;/b&gt;&#34;</span> +</span></span><span style="display:flex;"><span>$ git push origin master +</span></span></code></pre></div><p>&ndash; +⁽¹⁾ based on: <a href="https://axelfontaine.com/blog/final-nail.html">https://axelfontaine.com/blog/final-nail.html</a></p> + + + + + + Docs: REST API + https://www.eclipse.org/sw360/docs/developers/dev-rest-api/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-rest-api/ + + + + <p>The sw360 REST API provides access to sw360 resources for external clients. It consists currently of three Maven modules aggregated in one parent module <code>rest</code> in the sw360 distribution.</p> +<h1 id="module-structure">Module Structure</h1> +<p>The <code>rest</code> module provides a REST API infrastructure for sw360 including:</p> +<ul> +<li>Module <code>authorization-server</code> - OAuth2 Authorization Server, offering typical authorization steps of an OAuth2 workflow.</li> +<li>Module <code>resource-server</code> - REST API Gateway, providing access to the data for authenticated and authorized users / clients.</li> +<li>Module <code>rest-common</code> - only library code that is shared between the other rest modules.</li> +</ul> +<p>The REST API implementation uses:</p> +<ul> +<li>Module <code>authorization-server</code> uses the Liferay user management via the Liferay REST API to authenticate users and the users thrift backend service to access user profile data.</li> +<li>Module <code>resource-server</code> uses thrift backend services for accessing sw360 data to deliver it to the external clients.</li> +</ul> +<h1 id="api-principles">API Principles</h1> +<h2 id="security-principles">Security Principles</h2> +<p>The basic security principles are following the OAuth2 standards. So there should be an authorization server which can be the one contained in this project. That one provides access tokens after it authenticated the client and the user using this client. In addition it checks which authorities this client should receive for operating in the user&rsquo;s name. +With this OAuth2 access token the client can query the resource server which will restrict access to the given authorities. +Every client gets an access token as well as an refresh token. As long as the refresh token is valid, the client can gather a new access token without the need of re-authorization of the user.</p> +<p>There are currently three different possibilities for an OAuth2 authorization server implemented:</p> +<ul> +<li>Using the contained authorization-server with username/password that are known by Liferay, no matter if Liferay is hosting the credentials itself or is attached to some central user management which it uses to authenticate users.</li> +<li>Using the contained authorization-server inside an SSO network where an existing proxy can take care of the authentication and passing authenticated user information in configurable headers to the authorization-server which then performs authorization on top.</li> +<li>Using keycloak as authorization-server. This case is not part of this wiki page and might need special configuration.</li> +</ul> +<h2 id="data-principles">Data Principles</h2> +<p>The REST API provides Hypermedia using <a href="http://stateless.co/hal_specification.html">HAL</a> (Hypertext Application Language). +The following example shows some ideas of the REST API. It can be obtained by</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://[hostname]:[port]/resource/api/browser/index.html#/resource/api +</span></span></code></pre></div><p>Note that the response below is maybe not the exact same response of your current version:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;_links&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:attachments&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/attachments{?sha1}&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;templated&#34;</span>: <span style="color:#069;font-weight:bold">true</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:components&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/components&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:licenses&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/licenses&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:licenseinfo&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/licenseinfo&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:projects&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/projects&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:releases&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/releases&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:users&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/users&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:vendors&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/vendors&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;sw360:vulnerabilities&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/vulnerabilities&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;profile&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/api/profile&#34;</span> +</span></span><span style="display:flex;"><span> }, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;curies&#34;</span>: [ +</span></span><span style="display:flex;"><span> { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://dev.sw360.siemens.com/resource/docs/{rel}.html&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;name&#34;</span>: <span style="color:#c30">&#34;sw360&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;templated&#34;</span>: <span style="color:#069;font-weight:bold">true</span> +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> ] +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><h1 id="api-installation">API Installation</h1> +<p>Both, the <code>authorization-server</code> and the <code>resource-server</code> can be build using Maven like the rest of the project. Each is generating a Spring Boot server that can be deployed in an application container, e.g. Tomcat.</p> +<h1 id="api-configuration">API Configuration</h1> +<p>Since the <code>authorization-server</code> and the <code>resource-server</code> are Spring Boot servers, they are configured as usual via <code>/src/main/resources/application.yml</code>. In addition some configuration comes historically from <code>sw360.properties</code>. Please note that all configurations could be provided centrally in the <code>/etc/sw360/</code> directory. As such, the <code>sw360.properties</code> sits directly in <code>/etc/sw360/</code>. For rest-specific configurations the application considers the location <code>/etc/sw360/rest</code>.</p> +<h2 id="authorization-server-configuration">Authorization Server Configuration</h2> +<h3 id="special-liferay-credentials-configuration">Special Liferay Credentials Configuration</h3> +<p>In addition to the general properties in <a href="#general-config">here</a> the following needs to be configured in the <code>application.yml</code> when the authentication via Liferay username/password credentials should be possible:</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Values</th> +<th>Default</th> +</tr> +</thead> +<tbody> +<tr> +<td>sw360:sw360-portal-server-url</td> +<td>the url of the Liferay instance</td> +<td>n/a (but could be given if environment variable is used like <code>${SW360_PORTAL_SERVER_URL:http://127.0.0.1:8080}</code>)</td> +</tr> +<tr> +<td>sw360:sw360-liferay-company-id</td> +<td>the id of the company in Liferay that sw360 is run for</td> +<td>(but could be given if environment variable is used like <code>${SW360_LIFERAY_COMPANY_ID:20155}</code>)</td> +</tr> +</tbody> +</table> +<h3 id="special-sso-configuration">Special SSO Configuration</h3> +<p>In addition to the general properties in <a href="#general-config">here</a> the following needs to be configured in the <code>application.yml</code> when the authentication via SSO should be possible:</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Values</th> +<th>Default</th> +</tr> +</thead> +<tbody> +<tr> +<td>security:customheader:enabled</td> +<td>Flag if the components needed for SSO should be active</td> +<td>false</td> +</tr> +<tr> +<td>security:customheader:headername:intermediateauthstore</td> +<td>the name of the header that can be used for internal data transfer inside one roundtrip - it can be configured here because the proxy has to make sure that this header will not be passed from clients and will be used truly internal only</td> +<td>custom-header-auth-marker</td> +</tr> +<tr> +<td>security:customheader:headername:email</td> +<td>the name of the header that holds the email of the authenticated user (should be set be the proxy and must never be passed from clients)</td> +<td>authenticated-email</td> +</tr> +<tr> +<td>security:customheader:headername:extid</td> +<td>the name of the header that holds the extid of the authenticated user (should be set be the proxy and must never be passed from clients)</td> +<td>authenticated-extid</td> +</tr> +</tbody> +</table> +<p>:heavy_exclamation_mark: Please configure your SSO server and the proxy accordingly. In general, no unauthenticated request should reach the authorization server. And the configured headers should only be set by the proxy. If they are already contained in client requests, they must be removed!</p> +<h4 id="removing-headers-in-apache">Removing Headers in Apache</h4> +<p>In Apache you may use the <a href="https://httpd.apache.org/docs/current/mod/mod_headers.html"><code>mod_headers</code></a> module to remove headers from the client. Using the default values from the table above, at least the following directives should be present in your configuration for all requests that are routed to the <code>authorization-server</code>:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>RequestHeader unset custom-header-auth-marker +</span></span><span style="display:flex;"><span>RequestHeader unset authenticated-email +</span></span><span style="display:flex;"><span>RequestHeader unset authenticated-extid +</span></span></code></pre></div><h3 id="a-namegeneral-configageneral-configuration"><a name="general-config"></a>General Configuration</h3> +<p>Possible properties in <code>sw360.properties</code> file are:</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Values</th> +<th>Default</th> +</tr> +</thead> +<tbody> +<tr> +<td>backend.url</td> +<td>the url where the thrift services can be found</td> +<td>http://127.0.0.1:8080</td> +</tr> +<tr> +<td>rest.write.access.usergroup</td> +<td>the user group level (`USER</td> +<td>CLEARING_ADMIN</td> +</tr> +<tr> +<td>rest.admin.access.usergroup</td> +<td>the user group level (`USER</td> +<td>CLEARING_ADMIN</td> +</tr> +</tbody> +</table> +<p>The values in <code>sw360.properties</code> should be migrated to the <code>application.yml</code> in the future.</p> +<p>Further important properties in <code>application.yml</code> file are:</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Values</th> +<th>Default</th> +</tr> +</thead> +<tbody> +<tr> +<td>couchdb:url</td> +<td>the url of the CouchDB to use as client store</td> +<td>n/a</td> +</tr> +<tr> +<td>couchdb:database</td> +<td>the database name of the CouchDB database to use as client store</td> +<td>n/a</td> +</tr> +<tr> +<td>couchdb:username</td> +<td>if the CouchDB database needs authentication, enter the username here - if it does not need authentication, do not set this property at all, not even with an empty value</td> +<td>null</td> +</tr> +<tr> +<td>couchdb:password</td> +<td>if the CouchDB database needs authentication, enter the password here - if it does not need authentication, do not set this property at all, not even with an empty value</td> +<td>null</td> +</tr> +<tr> +<td>sw360:cors:allowed-origin</td> +<td>value for cross origin resource sharing</td> +<td>n/a</td> +</tr> +<tr> +<td>security:oauth2:resource:id</td> +<td>should just be the same then in the resource server</td> +<td>n/a</td> +</tr> +</tbody> +</table> +<p>After this configuration is done the normal REST service for client management should be usable. This one is only accessible for authenticated users that get the <code>ADMIN</code> authority (remember, the therefore necessary sw360 usergroup has just been configured). So the clients can be configured now.</p> +<h1 id="client-management">Client Management</h1> +<p>In the scenarios of this page, the shipped authorization server is used. So the next step is to configure a valid OAuth2 client in this authorization server. There should be one OAuth2 client per external REST API client (which in turn can have many different users). Therefore the authorization server offers a REST API for basic CRUD operations for configuring the clients that are stored in the just configured CouchDB. Since sw360-<code>ADMIN</code> privileges are needed for client management, an authentication is needed to work with this API.</p> +<p>For SSO users (basic-auth Liferay users can use other tools as well because other tools can handle basic auth - but they can also use this workflow):</p> +<ol> +<li> +<p>Open a browser with developer tools capabilities</p> +</li> +<li> +<p>Open</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://[hostname]:[port]/authorization/client-management +</span></span></code></pre></div><p>This page always shows the currently configured clients and can be refreshed after every manipulation of a client.</p> +</li> +<li> +<p>To add a new client, enter the following javascript in the dev tools console in the current browser tab - of course after manipulating the client data to suit your needs</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>xmlHttpRequest = new XMLHttpRequest(); +</span></span><span style="display:flex;"><span>xmlHttpRequest.open(&#39;POST&#39;, &#39;/authorization/client-management&#39;, false); +</span></span><span style="display:flex;"><span>xmlHttpRequest.setRequestHeader(&#39;Content-Type&#39;, &#39;application/json&#39;); +</span></span><span style="display:flex;"><span>xmlHttpRequest.setRequestHeader(&#39;Accept&#39;, &#39;application/json&#39;); +</span></span><span style="display:flex;"><span>xmlHttpRequest.send(JSON.stringify( +</span></span><span style="display:flex;"><span> { +</span></span><span style="display:flex;"><span> &#34;description&#34; : &#34;my first test client&#34;, +</span></span><span style="display:flex;"><span> &#34;authorities&#34; : [ &#34;BASIC&#34; ], +</span></span><span style="display:flex;"><span> &#34;scope&#34; : [ &#34;READ&#34; ], +</span></span><span style="display:flex;"><span> &#34;access_token_validity&#34; : 3600, +</span></span><span style="display:flex;"><span> &#34;refresh_token_validity&#34; : 3600 +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>)); +</span></span><span style="display:flex;"><span>console.log(xmlHttpRequest.responseText); +</span></span></code></pre></div></li> +<li> +<p>to manipulate an existing client, do the same but add the clientid to the data object</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> &#34;client_id&#34; : &#34;9e358ca832ce4ce99a770c7bd0f8e066&#34; +</span></span></code></pre></div></li> +<li> +<p>to remove an existing client, enter the following javascript in the dev tools console</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>xmlHttpRequest = new XMLHttpRequest(); +</span></span><span style="display:flex;"><span>xmlHttpRequest.open(&#39;DELETE&#39;, &#39;/authorization/client-management/9e358ca832ce4ce99a770c7bd0f8e066&#39;, false); +</span></span><span style="display:flex;"><span>xmlHttpRequest.setRequestHeader(&#39;Content-Type&#39;, &#39;application/json&#39;); +</span></span><span style="display:flex;"><span>xmlHttpRequest.setRequestHeader(&#39;Accept&#39;, &#39;application/json&#39;); +</span></span><span style="display:flex;"><span>xmlHttpRequest.send(); +</span></span><span style="display:flex;"><span>console.log(xmlHttpRequest.responseText); +</span></span></code></pre></div></li> +</ol> +<p>This way the session cookie of the SSO login will be used for the REST calls. This might also be possible in postman or curl or similar tools if you want to try to copy cookies (depending also on the SSO configuration). As said before, if Liferay username/password credentials can be used to authenticate then a tool like postman or curl can be used for the whole process. Just pass the credentials as basic-auth.</p> +<h3 id="client-management-via-curl">Client Management via Curl</h3> +<p>The above described call to create a rest client can also be done directly via one curl call:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#033">SW360_USER</span><span style="color:#555">=[</span>admin sw360 user<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#033">SW360_PW</span><span style="color:#555">=[</span>corresponding sw360 admin user password<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span>curl -s -S <span style="color:#c30;font-weight:bold">\ +</span></span></span><span style="display:flex;"><span><span style="color:#c30;font-weight:bold"></span> --user <span style="color:#c30">&#34;</span><span style="color:#a00">${</span><span style="color:#033">SW360_USER</span><span style="color:#a00">}</span><span style="color:#c30">:</span><span style="color:#a00">${</span><span style="color:#033">SW360_PW</span><span style="color:#a00">}</span><span style="color:#c30">&#34;</span> <span style="color:#c30;font-weight:bold">\ +</span></span></span><span style="display:flex;"><span><span style="color:#c30;font-weight:bold"></span> --header <span style="color:#c30">&#34;Content-Type: application/json&#34;</span> <span style="color:#c30;font-weight:bold">\ +</span></span></span><span style="display:flex;"><span><span style="color:#c30;font-weight:bold"></span> --header <span style="color:#c30">&#34;Accept: application/json&#34;</span> <span style="color:#c30;font-weight:bold">\ +</span></span></span><span style="display:flex;"><span><span style="color:#c30;font-weight:bold"></span> -X POST https://<span style="color:#555">[</span>hostname<span style="color:#555">]</span>:<span style="color:#555">[</span>port<span style="color:#555">]</span>/authorization/client-management <span style="color:#c30;font-weight:bold">\ +</span></span></span><span style="display:flex;"><span><span style="color:#c30;font-weight:bold"></span> -d @- <span style="color:#c30">&lt;&lt;EOF +</span></span></span><span style="display:flex;"><span><span style="color:#c30">{ +</span></span></span><span style="display:flex;"><span><span style="color:#c30"> &#34;description&#34; : &#34;my first test client&#34;, +</span></span></span><span style="display:flex;"><span><span style="color:#c30"> &#34;authorities&#34; : [ &#34;BASIC&#34; ], +</span></span></span><span style="display:flex;"><span><span style="color:#c30"> &#34;scope&#34; : [ &#34;READ&#34; ], +</span></span></span><span style="display:flex;"><span><span style="color:#c30"> &#34;access_token_validity&#34; : 3600, +</span></span></span><span style="display:flex;"><span><span style="color:#c30"> &#34;refresh_token_validity&#34; : 3600 +</span></span></span><span style="display:flex;"><span><span style="color:#c30">} +</span></span></span><span style="display:flex;"><span><span style="color:#c30">EOF</span> +</span></span></code></pre></div><p>This only works with the liferay basic-auth mechanism, SSO is not supported via curl.</p> +<h2 id="oauth2-access-token">OAuth2 Access Token</h2> +<p>Now with a configured client it is possible to retrieve an access token for the REST API from the authorization server. There is again a difference in SSO environments and Liferay username/password environments.</p> +<h3 id="sso-backed-access-token">SSO Backed Access Token</h3> +<p>Probably the browser has to be used again because many SSO environments are based on certificates that are read from keycards and the necessary libs are often built into the browser. So just call the URL</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://[hostname]:[port]/authorization/oauth/token?grant_type=password&amp;client_id=[clientid]&amp;client_secret=[clientsecret] +</span></span></code></pre></div><p>Of course the client id and the client secret should be replaced by the values of the configured client. The received response should look similar to</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;access_token&#34;</span> : <span style="color:#c30">&#34;eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiZDY4ZWY1YWEtZTQ5My00Y2YxLWI2NGQtNWE5MTdkY2M2ZTYwIiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iO5sLrqRcZfzvMP5gjaJhk3caWyZLkUesdbMfqCGy4V5rbnU9QP1LjdybY0Udh8hvAvhlpqPfaxeKe1c3-gQs5MYlqG0lNQCyWcb7NRHj8VFlwLPuJRZJNk3tybvgITVm9r14pfAXogpVE0S4KihD2W1_SoKH4NzTa2vOEG0CK4VzCLetxUlUuePxZH8ugouqbS2d0SpyeeMTm-PzxzzeTb_4ulGpg63eE1v7GvTsI23uh2WfIgHBa1GRr5jWtE0Meq-5UFCVQkhMm8P-r8wO2iuRblCu6a-bWwy7bfdj3S2VDnqSQskE2dVrC_qMs-V2AGvCV1xvlF0P8A4tgwL-w&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;token_type&#34;</span> : <span style="color:#c30">&#34;bearer&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;refresh_token&#34;</span> : <span style="color:#c30">&#34;eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJhdGkiOiJkNjhlZjVhYS1lNDkzLTRjZjEtYjY0ZC01YTkxN2RjYzZlNjAiLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiM2VkZDcxODAtMTBlYi00Y2MwLTg0NTUtMGYwZmIyMWMwYmU0IiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iMGfdHWpJNseoxIk7tKCNTyC1w4_AJ4cSv6kO64_BkF54MLudvyf9uVSIHpAeHhSFdvhbjksynRqq_u78vW8ptY1la65Qx8glHz0sktWBfMDJsUA4ynU2iZbKU92f2OOf3wQRVt38-Y1mBUsDMIStyKTDeIXGT3LJr_8k5dRAGvayixaezxDFw3dWK2M6P9h-ZnfEP47HpIUZrG8cgwPmNCZ9gBXsqVnueDYZth6TaEKIvWbkZtwY0ikWKyJL2xLm78O1ii3lA5ENt5I0DTfTm8QuK_zcm679W9jF0jvwIR71fM0JSWjkBoXd2h9oLmE2CF2sFVaJor_ermk-L0LsA&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;expires_in&#34;</span> : <span style="color:#f60">3599</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;scope&#34;</span> : <span style="color:#c30">&#34;READ&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;jti&#34;</span> : <span style="color:#c30">&#34;d68ef5aa-e493-4cf1-b64d-5a917dcc6e60&#34;</span> +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>From this response the value of the <code>access_token</code> and probably <code>refresh_token</code> field is the one to copy-paste for later usage.</p> +<h3 id="liferay-backed-access-token">Liferay Backed Access Token</h3> +<p>With a Liferay backed authentication all REST clients that offer basic auth support can be used. For example <code>curl</code>:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>curl -X POST --user <span style="color:#c30">&#39;[clientid]:[clientsecret]&#39;</span> -d <span style="color:#c30">&#39;grant_type=password&amp;username=[username]&amp;password=[password]&#39;</span> https://<span style="color:#555">[</span>hostname<span style="color:#555">]</span>:<span style="color:#555">[</span>port<span style="color:#555">]</span>/authorization/oauth/token -k +</span></span></code></pre></div><p>Example response:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;access_token&#34;</span> : <span style="color:#c30">&#34;eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiZDY4ZWY1YWEtZTQ5My00Y2YxLWI2NGQtNWE5MTdkY2M2ZTYwIiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iO5sLrqRcZfzvMP5gjaJhk3caWyZLkUesdbMfqCGy4V5rbnU9QP1LjdybY0Udh8hvAvhlpqPfaxeKe1c3-gQs5MYlqG0lNQCyWcb7NRHj8VFlwLPuJRZJNk3tybvgITVm9r14pfAXogpVE0S4KihD2W1_SoKH4NzTa2vOEG0CK4VzCLetxUlUuePxZH8ugouqbS2d0SpyeeMTm-PzxzzeTb_4ulGpg63eE1v7GvTsI23uh2WfIgHBa1GRr5jWtE0Meq-5UFCVQkhMm8P-r8wO2iuRblCu6a-bWwy7bfdj3S2VDnqSQskE2dVrC_qMs-V2AGvCV1xvlF0P8A4tgwL-w&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;token_type&#34;</span> : <span style="color:#c30">&#34;bearer&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;refresh_token&#34;</span> : <span style="color:#c30">&#34;eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCJdLCJhdGkiOiJkNjhlZjVhYS1lNDkzLTRjZjEtYjY0ZC01YTkxN2RjYzZlNjAiLCJleHAiOjE1NjM4MDYwNDQsImF1dGhvcml0aWVzIjpbIlJFQUQiXSwianRpIjoiM2VkZDcxODAtMTBlYi00Y2MwLTg0NTUtMGYwZmIyMWMwYmU0IiwiY2xpZW50X2lkIjoiMTcyMmZmYzdkZWE3MTU3OGQ5ZWE1ZTZhNmMwMDA4NzMifQ.iMGfdHWpJNseoxIk7tKCNTyC1w4_AJ4cSv6kO64_BkF54MLudvyf9uVSIHpAeHhSFdvhbjksynRqq_u78vW8ptY1la65Qx8glHz0sktWBfMDJsUA4ynU2iZbKU92f2OOf3wQRVt38-Y1mBUsDMIStyKTDeIXGT3LJr_8k5dRAGvayixaezxDFw3dWK2M6P9h-ZnfEP47HpIUZrG8cgwPmNCZ9gBXsqVnueDYZth6TaEKIvWbkZtwY0ikWKyJL2xLm78O1ii3lA5ENt5I0DTfTm8QuK_zcm679W9jF0jvwIR71fM0JSWjkBoXd2h9oLmE2CF2sFVaJor_ermk-L0LsA&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;expires_in&#34;</span> : <span style="color:#f60">3599</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;scope&#34;</span> : <span style="color:#c30">&#34;READ&#34;</span>, +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;jti&#34;</span> : <span style="color:#c30">&#34;d68ef5aa-e493-4cf1-b64d-5a917dcc6e60&#34;</span> +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>Of course, the username and password must be your user credentials and the client id and secret have to be replaced with the configured values. And again, the wanted value is the value of the field <code>access_token</code> and probably <code>refresh_token</code>.</p> +<p>More Links:</p> +<ul> +<li>OAuth2 more information: <a href="https://oauth.net/2/">https://oauth.net/2/</a></li> +<li>Decode Bearer tokens at: <a href="https://jwt.io/">https://jwt.io/</a></li> +</ul> +<h2 id="oauth2-refresh-token">OAuth2 Refresh Token</h2> +<p>The authorization server supports so called refresh tokens to generate new access tokens after they have been expired. New access tokens can be generated with the use of the <code>refresh_token</code> without further re-authorization of the user. The following url must be used:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> http://localhost/authorization/oauth/token?grant_type=refresh_token&amp;refresh_token=&lt;REFRESH_TOKEN&gt; +</span></span></code></pre></div><p>The client must pass its credentials via basic authentication. Though a user authentication is not necessary. +If you are authentication your users on a proxy, you have to configure that proxy in a way that it does not block requests to the above url. As marker the &lsquo;grant_type=refresh_token&rsquo; query parameter may be used.</p> +<h2 id="example-apache-configuration">Example Apache configuration</h2> +<p>The following example shows the relevant part for an Apache proxy to configure +authentication of the <code>authorization-server</code> properly:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-apache" data-lang="apache"><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;Location</span> <span style="color:#c30">/authorization/oauth/token</span><span style="color:#309;font-weight:bold">&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#366">Order</span> allow,deny +</span></span><span style="display:flex;"><span> <span style="color:#366">Allow</span> from <span style="color:#069;font-weight:bold">all</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;If</span> <span style="color:#c30">&#34;%{QUERY_STRING} =~ /^grant_type=refresh_token\&amp;/&#34;</span><span style="color:#309;font-weight:bold">&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># No authentication needed</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/If&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;Else&gt;</span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># Configure your authentication here</span> +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&lt;/Else&gt;</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#366">ProxyPass</span> https://localhost:8443/authorization/oauth/token +</span></span><span style="display:flex;"><span> <span style="color:#366">ProxyPassReverse</span> https://localhost:8443/authorization/oauth/token +</span></span><span style="display:flex;"><span><span style="color:#309;font-weight:bold">&lt;/Location&gt;</span> +</span></span></code></pre></div><h1 id="resource-server-configuration">Resource Server Configuration</h1> +<p>Now that access tokens can be generated, the resource server has to be configured. The same general ideas of <a href="#general-config">general config</a> apply. The properties of the <code>application.yml</code> are</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Values</th> +<th>Default</th> +</tr> +</thead> +<tbody> +<tr> +<td>sw360:thrift-server-url</td> +<td>the url where the thrift services can be found, e.g. http://localhost:8080</td> +<td></td> +</tr> +<tr> +<td>sw360:test-user-id</td> +<td>only for developing, simple test user short cut, must be pulled off for productive</td> +<td></td> +</tr> +<tr> +<td>sw360:test-user-passwors</td> +<td>see above</td> +<td></td> +</tr> +<tr> +<td>sw360:couchdb-url</td> +<td>the url of the CouhDB server for attachment handling, e.g. https://localhost:5984</td> +<td></td> +</tr> +<tr> +<td>sw360:cors:allowed-origin</td> +<td>value for cross origin resource sharing</td> +<td>n/a</td> +</tr> +</tbody> +</table> +<p>The REST API is now completely usable via an own client or testwise with integrated tools.</p> +<h1 id="tools">Tools</h1> +<p>To get data and interact with the sw360 REST API the HAL-Browser is recommended. Currently, the HAL-Browser is also deployed on the sw360 development instance, but this is likely to change once the REST API has evolved more. Currently the URL of HAL-Browser is:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://[hostname]:[port]/resource/api/browser/index.html#/resource/api +</span></span></code></pre></div><p>An example for a screenshot is as follows:</p> +<p><img src="https://user-images.githubusercontent.com/29916928/39576770-90b2b576-4edf-11e8-9d1b-742c10d88b8e.png" alt="rest-hal-explorer"></p> +<p>When using other tools the access token has to be set as header parameter in the REST request. Please add a new header:</p> +<ul> +<li>Key: Authorization</li> +<li>As value you need to enter: <code>Bearer [ACCESS_TOKEN]</code> where <code>[ACCESS_TOKEN]</code> actually contains the token</li> +</ul> +<h2 id="example--get-a-list-of-projects">Example – Get a list of projects</h2> +<p>Here is an example how to query for all projects as HTTP GET Request. As for the resource endpoint, the request:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://sw360.org/resource/api/projects (or /resource/api/projects) +</span></span></code></pre></div><p>will return the following response:</p> +<p><img src="https://user-images.githubusercontent.com/29916928/39579586-6b1d1736-4ee7-11e8-8faf-da71c8776680.png" alt="rest-explorer2"></p> +<h1 id="api-documentation">API Documentation</h1> +<p>sw360 deploys a REST API documentation at every instance. There are the following URLs offered at each instance</p> +<table> +<thead> +<tr> +<th>URL</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>https://[hostname]:[port]/resource/docs/index.html</td> +<td>Small overview page</td> +</tr> +<tr> +<td>https://[hostname]:[port]/resource/docs/api-guide.html</td> +<td>The API description for the currently running server</td> +</tr> +<tr> +<td>https://[hostname]:[port]/resource/api/browser/index.html#/resource/api</td> +<td>Integrated HAL browser to directly use the API</td> +</tr> +</tbody> +</table> +<h1 id="known-problems">Known Problems</h1> +<p>If you use Nginx or Apache as request front end server there maybe some configuration caveats: The REST API objects provides self links to reference to other objects also including the protocol prefix. These links are realized on Hypertext Application Language (HAL) for example you will find in REST responses:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#c30">&#34;_links&#34;</span><span style="color:#a00;background-color:#faa">:</span> { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;self&#34;</span>: { +</span></span><span style="display:flex;"><span> <span style="color:#309;font-weight:bold">&#34;href&#34;</span>: <span style="color:#c30">&#34;https://localhost:8443/resource/api/projects/065f3aa45c2683297fd1bb39296f519d&#34;</span> +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>The REST spring boot applications are using the Tomcat environment configuration to generate the HAL links. If the Tomcat is only configured as HTTP, the generated links will contain the <code>http</code> protocol and port - which is a problem if the server should be contacted over <code>https</code>only. This problem occurs, if tomcat is used together with Nginx, Apache httpd or other Web servers, which are configured to repsond only to <code>https</code>.</p> +<p>Solution is to set for example in Nginx HTTP &lsquo;X-Forward-*&rsquo; headers on a reverse proxy, for example:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">location</span> <span style="color:#c30">/</span> { +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">...</span> +</span></span><span style="display:flex;"><span> <span style="color:#c30">proxy_set_header</span> <span style="color:#c30">X-Forwarded-Port</span> <span style="color:#f60">443</span>; +</span></span><span style="display:flex;"><span> <span style="color:#069;font-weight:bold">proxy_set_header</span> <span style="color:#c30">X-Forwarded-Proto</span> <span style="color:#c30">https</span>; +</span></span><span style="display:flex;"><span> } +</span></span></code></pre></div><p>For other Web severs, there might a similar solution.</p> + + + + + + Docs: Roles and Authorization + https://www.eclipse.org/sw360/docs/developers/dev-role-authorisation-model/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-role-authorisation-model/ + + + + <p>Like any other system, SW360 allows for setting different levels of access for different users. Technically, the decision when user should be able to see or to do something happens (generally) on the backend server. This ensures consistency between the REST API and the portal application.</p> +<p>For setting roles of a user, the Liferay control panel is being used (Admin menu -&gt; Control Panel -&gt; Users and Organisations -&gt; Users -&gt; select one user and Edit -&gt; Roles). Setting access at individual records happens in the edit view of that record.</p> +<h2 id="roles-overview">Roles Overview</h2> +<p>SW360 offers two choices for doing the roles: one is setting access rights at every record individually. Another are general roles that can be set for every user. An admin of SW360 can set user roles at the Liferay Users and Roles UI.</p> +<h4 id="setup-admin-liferay-role">Setup Admin (Liferay Role)</h4> +<p>The setup admin is the Liferay administrator, which can configure the entire liferay app, such as which portlets are shown on which page.</p> +<h4 id="sw360-admin-liferay-role">SW360 Admin (Liferay Role)</h4> +<p>The SW360 admin can change all data and promote users for more access rights, such as promoting a user to role <code>CLEARING_ADMIN</code>. This role can change data from other groups, limited by visibility setting of a project.</p> +<h4 id="clearing-admin-liferay-role">Clearing Admin (Liferay Role)</h4> +<p>The clearing admin can change all component and release records and project records of the same group. This can be seen as group administrator.</p> +<h4 id="security-admin-liferay-role">Security Admin (Liferay Role)</h4> +<p>In addition to the user rights, the security admin can set security vulnerabilities to irrelevant</p> +<h4 id="ecc-admin-liferay-role">ECC Admin (Liferay Role)</h4> +<p>In addition to the user rights, the ECC admin can manipulate ECC data.</p> +<h4 id="user">User</h4> +<p>A user can create, modify and delete all own (=self created) records. A user cannot change records of others</p> +<h3 id="moderation-requests">Moderation Requests</h3> +<p>If a user with user or other access role rights is not entitled to write or change a record, a moderation request will be created. The moderation request contains the changes an will be routed for approval to the users who can write this record.</p> +<p>In addition there are ACL-style roles, meaning that per data item access settings can be made:</p> +<ol> +<li><strong>creator</strong> - a creator can modify in addition to the user&rsquo;s read abilities, a user can be creator of a data item</li> +<li><strong>moderator</strong> - a creator can define moderators for a data item. Moderators can change a data item as a creator can.</li> +<li><strong>contributor</strong> (Component) - is a contributor to a component, project, similar (but not the same) to a moderator. In addition to moderator, this role has been added to identify contributors (or that contributors get the fame). +In contrast, the contributor cannot delete data items.</li> +<li><strong>project responsible</strong> (Project) - is a contributor, just named differently to identify the responsible person.</li> +<li><strong>lead architect</strong> (Project) - is a contributor, just named differently to identify the responsible person. an architect refers to the person who has that role of the project or product. This role has been added to identify architects to have a contact person for technical questions.</li> +<li><strong>contact</strong> (Release) - deprecated, should be renamed to contributor see #100.</li> +</ol> +<p><code>group (department)</code>, <code>contributor</code>, <code>moderator</code> and <code>owner</code> roles are entity specific, <code>user</code>, <code>clearing admin</code> and <code>admin</code> are roles assigned to a user.</p> +<h3 id="additional-project-visibility">Additional Project Visibility</h3> +<p>In addition to the roles mentioned above, each project has a separate visibility setting (technically an attribute of the project document). There are four project visibility levels:</p> +<ol> +<li>Private - no one but the creator can read.</li> +<li>Me and moderators - involves all moderators and contributors, basically all names that are named among the attributes (lead architect, project responsible, contributors)</li> +<li>Department / business unit (should be renamed) - refer to the group the users are in.</li> +<li>Public - all registered users of the liferay / sw360 application (login required).</li> +</ol> +<p>The access rules are implemented in<code>lib-datahandler</code>. In the package, <code>com.siemens.sw360.datahandler.permissions</code> this is implemented in <code>ProjectPermissions</code>. See methods <code>isVisible</code> and <code>userIsEquivalentToModeratorinProject()</code> for the actual rules.</p> +<h3 id="overall-access-matrix">Overall Access Matrix</h3> +<p>The following table presents the SW360 Role-Authorisation-Model.</p> +<p>The row specifies which action to take, the column the role of the actor. Cell entries specify which entity type can be acted upon.</p> +<table> +<thead> +<tr> +<th></th> +<th>creator</th> +<th>moderator</th> +<th>contributor</th> +<th>user</th> +<th>clearing admin</th> +<th>(sw360)admin</th> +</tr> +</thead> +<tbody> +<tr> +<td>create</td> +<td>-</td> +<td>-</td> +<td>-</td> +<td>PCRV</td> +<td>PCRVL</td> +<td>PCRVL</td> +</tr> +<tr> +<td>read</td> +<td>P</td> +<td>P</td> +<td>P</td> +<td>(P²)CRVL</td> +<td>(P²)CRVL</td> +<td>PCRVL</td> +</tr> +<tr> +<td>edit</td> +<td>PCR</td> +<td>PCR</td> +<td>PCR</td> +<td>(all created ones)</td> +<td>PCRVL</td> +<td>PCRVL</td> +</tr> +<tr> +<td>delete</td> +<td>PCR</td> +<td>PCR</td> +<td>-</td> +<td>(all created ones)</td> +<td>L</td> +<td>PCRVL</td> +</tr> +</tbody> +</table> +<p>P² : only if the user is member of the group of the project (or has created the project)</p> +<p>Note that ECC Admins and Security Admins have only the ability to write ECC and security data respectively at given records. However, as for the other access rights this role does not enhance anything above users.</p> +<h4 id="legend">Legend</h4> +<table> +<thead> +<tr> +<th>acronym</th> +<th>description</th> +</tr> +</thead> +<tbody> +<tr> +<td>P</td> +<td>project</td> +</tr> +<tr> +<td>C</td> +<td>component</td> +</tr> +<tr> +<td>R</td> +<td>release</td> +</tr> +<tr> +<td>V</td> +<td>vendor</td> +</tr> +<tr> +<td>L</td> +<td>license</td> +</tr> +</tbody> +</table> +<h2 id="technical-info">Technical Info</h2> +<p>The role access rules are put into <code>lib-datahandler</code>. In the package, <code>com.siemens.sw360.datahandler.permissions</code> there are implementing classes of a template class <code>DocumentPermissions</code>. As an example, <code>ProjectPermissions</code> extends abstract class <code>DocumentPermissions</code>.</p> +<p>At run time, a permissions object consisting of a document and a user is created: In <code>PermissionUtils</code> (same package) there is a static method <code>makePermissions&lt;T&gt;()</code> that creates a permissions object. The received permissions object instance can be asked if a particular operation is allowed.</p> +<p>Note that the general application of these permission operations runs in the backend (Thrift services). An application in the front end of <code>PermissionUtils</code> for example, is for displaying buttons depending on the user main role (user, clearing admin or admin). Then the portlet makes plain use of the <code>lib-datahandler</code> library.</p> +<h2 id="further-plans">Further plans</h2> +<ol> +<li> +<p>Actually, creating stuff should be checked in lib-datahandler, starting with creation of licenses,which should ot be permitted to users: <a href="https://github.com/siemens/sw360portal/issues/106">Issue #106</a></p> +</li> +<li> +<p><a href="https://github.com/siemens/sw360portal/issues/101">Issue #101</a> for</p> +</li> +</ol> +<table> +<thead> +<tr> +<th></th> +<th>contributor</th> +<th>moderator</th> +<th>creator</th> +<th>user</th> +<th>clearing admin</th> +<th>admin</th> +</tr> +</thead> +<tbody> +<tr> +<td>download OSS sources</td> +<td>-</td> +<td>-</td> +<td>-</td> +<td>R</td> +<td>R</td> +<td>R</td> +</tr> +<tr> +<td>download internal sources</td> +<td>R</td> +<td>R</td> +<td>R</td> +<td>-</td> +<td>-</td> +<td>R</td> +</tr> +</tbody> +</table> +<ol start="3"> +<li><a href="https://github.com/siemens/sw360portal/issues/102">Issue #102</a> for</li> +</ol> +<table> +<thead> +<tr> +<th></th> +<th>contributor</th> +<th>moderator</th> +<th>creator</th> +<th>user</th> +<th>clearing admin</th> +<th>admin</th> +</tr> +</thead> +<tbody> +<tr> +<td>send to clearing</td> +<td>-</td> +<td>P</td> +<td>P</td> +<td>-</td> +<td>-</td> +<td>PCRL</td> +</tr> +</tbody> +</table> +<ol start="4"> +<li><a href="https://github.com/siemens/sw360portal/issues/103">Issue #103</a> for</li> +</ol> +<table> +<thead> +<tr> +<th></th> +<th>contributor</th> +<th>moderator</th> +<th>creator</th> +<th>user</th> +<th>clearing admin</th> +<th>admin</th> +</tr> +</thead> +<tbody> +<tr> +<td>edit clearing report</td> +<td>-</td> +<td>R</td> +<td>R</td> +<td>-</td> +<td>R?</td> +<td>PCRL</td> +</tr> +</tbody> +</table> + + + + + + Docs: Semantic Commits + https://www.eclipse.org/sw360/docs/developers/dev-semantic-commits/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-semantic-commits/ + + + + <h2 id="the-reason-and-benefit-of-semantic-commit-messages">The reason and benefit of semantic commit messages</h2> +<ul> +<li>automatic generating of the changelog</li> +<li>simple navigation through git history (e.g. ignoring style changes)</li> +</ul> +<h2 id="semantic-commit-message-structure">Semantic commit message structure</h2> +<p><code>&lt;type&gt;(&lt;scope&gt;): &lt;commit message&gt;</code></p> +<h2 id="the-following-types-are-supported">The following <types> are supported</h2> +<ul> +<li>feat (new feature for the user, not a new feature for build script)</li> +<li>fix (bug fix for the user, not a fix to a build script)</li> +<li>docs (changes to the documentation)</li> +<li>style (formatting, missing semi colons, etc; no production code change)</li> +<li>refactor (refactoring production code, eg. renaming a variable)</li> +<li>test (adding missing tests, refactoring tests; no production code change)</li> +<li>chore (updating grunt tasks etc; no production code change)</li> +</ul> +<p>Example <scope> values:</p> +<ul> +<li>ui (user interface)</li> +<li>rest (REST API)</li> +<li>thrift (apache thrift services)</li> +<li>project (project portlet)</li> +<li>component (component portlet)</li> +<li>user (user portlet)</li> +<li>etc.</li> +</ul> +<h2 id="example-of-semantic-commit-message">Example of semantic commit message</h2> +<p><code>fix(rest): change maven plugin order to generate the documentation correctly</code></p> +<p><code>&lt;type&gt;(&lt;scope&gt;): &lt;commit message&gt;</code></p> +<h2 id="referencing-issues">Referencing issues</h2> +<p>Please reference in the pull request to the open issue</p> +<p><code>closes eclipse/sw360#&lt;issue-number&gt;</code></p> +<p><code>closes eclipse/sw360#758</code></p> + + + + + + Docs: Testing Frameworks + https://www.eclipse.org/sw360/docs/developers/dev-testing-frameworks/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-testing-frameworks/ + + + + <p>The implementation of complicated rules is not always easy to read. +A good way to document and explain the behaviour of rule engines are natural language tests. +A frame work we use for that is <a href="http://jgiven.org/">jgiven</a>. +We write the tests using the [dataprovider] (<a href="https://github.com/TNG/junit-dataprovider">https://github.com/TNG/junit-dataprovider</a>) runner. +This is basically a runner that allows to use parametrized tests.</p> +<p>The basic testing frame work is still <a href="http://junit.org/">JUnit4</a>, assertions are made using <a href="https://code.google.com/p/hamcrest/wiki/Tutorial">hamcrest</a> and we mock complicated input classes with <a href="http://mockito.org/">mockito</a>.</p> + + + + + + Docs: Troubleshooting + https://www.eclipse.org/sw360/docs/developers/dev-troubleshooting/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-troubleshooting/ + + + + <h3 id="development-problems-building-sw360portal-with-maven">Development: problems building sw360portal with maven?</h3> +<p>Before building the sw360portal with maven, ensure that the following components are installed in the development environment:</p> +<ul> +<li>A git client</li> +<li>Apache Maven 3.0.X</li> +<li>Apache Thrift 0.9.3</li> +<li>Java 1.8.X</li> +<li>CouchDB, at least 1.5 (only if the tests will be executed locally)</li> +</ul> +<h3 id="development-problems-using-eclipse">Development: problems using Eclipse?</h3> +<p>Please do not use Eclipse, because the integration of Apache Thrift is an open issue and we found no plugin for Eclipse to solve the shown compiler errors. +Recommended is IntelliJ IDEA or NetBeans.</p> +<h3 id="liferay-problems-with-displaying-changes-to-page">Liferay: problems with displaying changes to page?</h3> +<p>When developing changes to a page and these changes do not show in browser - even after redeployment, then the internal liferay optimisation mechanisms may kick in. Try to add to the URL string the following key value parameters:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>js_fast_load=0&amp;css_fast_load=0&amp;strip=0 +</span></span></code></pre></div><h3 id="liferay-where-are-the-initial-admin-user-settings">Liferay: where are the initial admin user settings?</h3> +<p>It is the file <code>portal-ext.properties</code> in sw360/opt.</p> +<h3 id="maven-build-generally-fails">Maven: build generally fails</h3> +<p>You just try to compile parts or all of it and it fails? Most of the stuff depends on the module /build-configuration. Execute either &ldquo;mvn install&rdquo; on top level or inside build configuration.</p> +<h4 id="backend-problems-with-company-proxy">Backend: problems with company proxy?</h4> +<p>maybe try instead:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>/opt/apache-tomcat-/bin/startup.sh +</span></span></code></pre></div><p>just this:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>CATALINA_OPTS=&#34;-Dhttps.proxy...&#34; /opt/apache-tomcat-/bin/startup.sh +</span></span></code></pre></div><p>for lucene it might be necessary to add:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>[httpd_global_handlers] +</span></span><span style="display:flex;"><span>_fti = {couch_httpd_proxy, handle_proxy_req, &lt;&lt;&#34;http://127.0.0.1:8085/couchdblucene&#34;&gt;&gt;} +</span></span></code></pre></div><p>in lucene.ini of local.d of your CouchDB installation</p> +<h4 id="backend-are-thrift-services-up">Backend: are thrift services up?</h4> +<ol> +<li>Check tomcat manager (if the services are there)</li> +<li>Check if the service is accessible: +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://your.url.to.server.com:8085/components +</span></span></code></pre></div>Should return &ldquo;Welcome to &hellip;&rdquo;.</li> +<li>Check if the service thrift page is there: +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://your.url.to.server.com:8085/components/thrift +</span></span></code></pre></div>Should return HTTP status code 500, because in the browser, no valid thrift message was formed.</li> +</ol> +<h4 id="backend-orgektorpdbaccessexception">Backend: org.ektorp.DbAccessException</h4> +<p>What do I do if I get: org.ektorp.DbAccessException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field &ldquo;_id&rdquo;</p> +<p>You add the class you have been trying to serialize to +THRIFT_CLASSES in +sw360/src/libraries/lib-datahandler/src/main/java/com/siemens/sw360/datahandler/thrift/ThriftUtils.java</p> +<h4 id="backend-maven-failed-tomcat7-deploy">Backend: maven failed tomcat7 deploy</h4> +<p>If the deployment via maven of the backend does fail with an error like this</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>Uploading: http://localhost:8085/manager/text/deploy?path<span style="color:#555">=</span>%2Flicenses +</span></span><span style="display:flex;"><span>2302/17930 KB +</span></span><span style="display:flex;"><span>Uploading: http://localhost:8085/manager/text/deploy?path<span style="color:#555">=</span>%2Flicenses +</span></span><span style="display:flex;"><span>2102/17930 KB +</span></span><span style="display:flex;"><span>Uploading: http://localhost:8085/manager/text/deploy?path<span style="color:#555">=</span>%2Flicenses +</span></span><span style="display:flex;"><span>2064/17930 KB +</span></span><span style="display:flex;"><span>Uploading: http://localhost:8085/manager/text/deploy?path<span style="color:#555">=</span>%2Flicenses +</span></span><span style="display:flex;"><span>2064/17930 KB +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> ------------------------------------------------------------------------ +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> Reactor Summary: +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> backend ........................................... SUCCESS <span style="color:#555">[</span>2.579s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> backend-src ....................................... SUCCESS <span style="color:#555">[</span>0.058s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-licenses ...................................... SUCCESS <span style="color:#555">[</span>10.544s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-users ......................................... SUCCESS <span style="color:#555">[</span>1.485s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-vendors ....................................... SUCCESS <span style="color:#555">[</span>6.929s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-search ........................................ SUCCESS <span style="color:#555">[</span>5.837s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-components .................................... SUCCESS <span style="color:#555">[</span>19.439s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-projects ...................................... SUCCESS <span style="color:#555">[</span>14.280s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-attachments ................................... SUCCESS <span style="color:#555">[</span>6.188s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-moderation .................................... SUCCESS <span style="color:#555">[</span>1.169s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> src-fossology ..................................... SUCCESS <span style="color:#555">[</span>6.259s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> backend-svc ....................................... SUCCESS <span style="color:#555">[</span>0.038s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-licenses ...................................... FAILURE <span style="color:#555">[</span>3.630s<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-users ......................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-vendors ....................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-search ........................................ SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-components .................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-projects ...................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-attachments ................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-moderation .................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> svc-fossology ..................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> backend-utils ..................................... SKIPPED +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> ------------------------------------------------------------------------ +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> BUILD FAILURE +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> ------------------------------------------------------------------------ +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> Total time: 1:19.836s +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> Finished at: Mon May <span style="color:#f60">04</span> 15:57:46 CEST <span style="color:#f60">2015</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> Final Memory: 24M/311M +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>INFO<span style="color:#555">]</span> ------------------------------------------------------------------------ +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy <span style="color:#555">(</span>default-cli<span style="color:#555">)</span> on project svc-licenses: Cannot invoke Tomcat manager: Broken pipe -&gt; <span style="color:#555">[</span>Help 1<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> To see the full stack trace of the errors, re-run Maven with the -e switch. +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> Re-run Maven using the -X switch to <span style="color:#366">enable</span> full debug logging. +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> For more information about the errors and possible solutions, please <span style="color:#366">read</span> the following articles: +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> <span style="color:#555">[</span>Help 1<span style="color:#555">]</span> http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> After correcting the problems, you can resume the build with the <span style="color:#366">command</span> +</span></span><span style="display:flex;"><span><span style="color:#555">[</span>ERROR<span style="color:#555">]</span> mvn &lt;goals&gt; -rf :svc-licenses +</span></span><span style="display:flex;"><span>voyager:backend sam$ +</span></span></code></pre></div><p>One solution is that you deployed already and the tomcat7 plugin does not like to have multiple deploy commands. Instead you will need to issue a <code>mvn tomcat7:redeploy</code> command.</p> +<h4 id="deployment-liferay-not-accessible">Deployment: liferay not accessible</h4> +<p>If the virtual machine was shut down and started up again, the backend services and frontend liferay require manual restart. Please contribute a change in the vagrant deployment if you feel that this could be changed. The actual places to call are:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Bash" data-lang="Bash"><span style="display:flex;"><span>/opt/apache-tomcat-.../bin/.startup.sh +</span></span><span style="display:flex;"><span>/opt/liferay-.../tomcat-.../bin/.startup.sh +</span></span></code></pre></div> + + + + + Docs: Using RequireJS fro Javascript Modules + https://www.eclipse.org/sw360/docs/developers/dev-using-requirejs-for-javascript-modules/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/developers/dev-using-requirejs-for-javascript-modules/ + + + + <p>Today most of the javascript code runs in the global namespace. This increases the risk of overwriting symbols in the global namespace due to different libraries and snippets.</p> +<h1 id="goal">Goal</h1> +<p>We want to use RequireJS (<a href="http://requirejs.org/">http://requirejs.org/</a>) to modularize our code and to have clear namespaces for each component. In addition some of the code may be reused more easily. Other advantages:</p> +<ul> +<li>libraries like jquery or datatables can be imported by name but without a specified version</li> +<li>if necessary, specific versions can be imported for parts of the page</li> +<li>it is very easy to only load needed dependencies</li> +<li>good support of webjars due to webjars-locator. Webjars a are automatically accessible through RequireJS.</li> +</ul> +<h1 id="how-to-use---example">How to use - example</h1> +<p>There is a new jspf-file to be included in jsps to enable RequireJS support:</p> +<pre><code>&lt;%@ include file=&quot;/html/utils/includes/requirejs.jspf&quot; %&gt; +</code></pre> +<p>When RequireJS is enabled with the above include, all libraries can be accessed and code can be scoped:</p> +<pre><code>require(['jquery', 'module/quickfilter', 'module/confirm', /* jquery-plugins: */ 'datatables', 'jquery-ui'], function($, quickfilter, confirm) { + // code goes here, libraries can be used through the variables $, quickfilter and confirm + // Note: jquery-plugins does not have to be bound to variables since they directly register themselves in the jquery object +}); +</code></pre> +<p><strong>NOTE/WARNING</strong>: since not all code is using RequireJS at the moment it is highly recommended to include RequireJS just before the script tag using it. DO NOT include it at the beginning of the file! Therefore use the following pattern:</p> +<pre><code>&lt;%@ include file=&quot;/html/utils/includes/requirejs.jspf&quot; %&gt; +&lt;script&gt; + require(['jquery'], function($) { + // js stuff + }); +&lt;/script&gt; +</code></pre> +<p><strong>Explanation</strong>: some the the jQuery-plugins are already module safe. This means the look if something like RequireJS is available and - if this is the case - register themselves as anonymous modules. If someone in some include in the page loads such a plugin via script plugin it may happen that the plugins registers itself twice as an anonymous module which causes errors in RequireJS. Loading RequireJS after all script tags will prevent this and ensure that every plugin is only registered once.</p> +<h1 id="migration">Migration</h1> +<h2 id="migrate-a-jsp">Migrate a JSP</h2> +<p>To migrate a JSP to use RequireJS the following steps have to be done:</p> +<ol> +<li>Enable RequireJS support by including <code>requirejs.jspf</code>. Do it JUST before the script tag with the main code (see NOTE above).</li> +<li>Enclose the existing code in a <code>require</code>-function (<strong>Attention:</strong> Also read &ldquo;Co-existence with AUI().use()&rdquo; below)</li> +<li>Remove existing <code>script</code>-tags that loads the javascript files &ldquo;manually&rdquo;</li> +<li>Rewrite code that access functions inside the new <code>require</code>-function from outside (e.g. click handlers, see below)</li> +</ol> +<h2 id="co-existence-with-auiuse">Co-existence with AUI().use()</h2> +<p>If you need to use AUI().use() in your code, e.g. to grab the PortletURL object, you have to call this function first and call <code>require</code> inside. Otherwise the code may not be executed correclty if the &lsquo;Drag&amp;Drop&rsquo; error occurs to early during page loading:</p> +<pre><code>AUI().use('liferay-portlet-url', function () { + require(['jquery', 'module/quickfilter') { + // AUI and require modules loaded and available + }); +}); +</code></pre> +<h2 id="migrate-click-handlers">Migrate click-handlers</h2> +<p>Since none of the defined functions remains in the global scope click handlers defined in the attributes of a tag would no longer work. Use jQuery to attach a click handler instead:</p> +<pre><code>$('#exportSpreadsheetButton').on('click.components', exportSpreadsheet) +</code></pre> +<p>This click handler is added inside the RequireJS-scope where the function <code>exportSpreadsheet</code> is defined. +You may also attach handler for distinct elements in each row of a table:</p> +<pre><code>$('#componentsTable').on('click.components', 'img.delete', function(event) { + // do stuff +}); +</code></pre> +<h2 id="make-a-module-out-of-a-jspf-include">Make a module out of a jspf-include</h2> +<p>There are many jspf-includes which contain html as well as javascript code. They should be converted as followed:</p> +<ol> +<li> +<p>Move the javascript code to an own file. Place it below the &lsquo;html/js&rsquo;-folder, following the same structure as the jspf-file. If the jspf-file is <code>html/components/includes/vendors/addVendor.jspf</code> place the javascript code in the file <code>js/components/includes/vendors/addVendor.js</code>.</p> +</li> +<li> +<p>Enclose the code in a define statement to define a new module:</p> +<pre><code> define('components/includes/vendors/addVendor', [ /* dependencies */ ], function() { + // define module code + }); +</code></pre> +</li> +</ol> +<p>In order to use the new module include the jspf-file and load the js-code via RequireJS:</p> +<pre><code>&lt;%@ include &quot;html/components/includes/vendors/addVendor.jspf&quot; %&gt; + +require(['components/includes/vendors/addVendor'], function(addVendor) { + // use addVendor +}); +</code></pre> +<h2 id="make-a-module-out-of-a-javascript-file-or-function">Make a module out of a javascript file or function</h2> +<p>There are several javascript files and functions below `/html/js&rsquo;. They can be make compatible to RequireJS as follows:</p> +<ol> +<li> +<p>Create a new file inside <code>/html/js/component</code> with a proper name that describes the functionality for the new component</p> +</li> +<li> +<p>Define the module and point to the legacy function, e.g.</p> +<pre><code> define('module/confirm', ['jquery', /* jquery-plugins: */ 'jquery-confirm', /* legacy code */ 'main' ], function($) { + return { + confirmDeletion: deleteConfirmed /* pointer to legacy method in main.js */ + }; + }); +</code></pre> +</li> +<li> +<p>Afterwards the module can be loaded using the name <code>component/confirm</code>, e.g.</p> +<pre><code> require(['module/confirm'], function(confirm) { + confirm.confirmDeletion(/*...*/); + }); +</code></pre> +</li> +</ol> +<p><strong>Note</strong> The legacy function should be moved inside the module as soon as the function is no longer accessed directly but via RequireJS only. +<strong>Note</strong> You can also require legacy javascript files if you need them as dependency as pointed out in the examples above.</p> + + + + + + Docs: Attachment File Types + https://www.eclipse.org/sw360/docs/userguide/user-attachment-file-types/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/user-attachment-file-types/ + + + + <p>SW360 maintains attachments for projects, components and releases. Currently, SW360 cannot automatically detect these types and is dependent on that users select the appropriate type accordingly. If not, some functionality will not properly kick of that uses such attachments.</p> +<p>Also, maybe some of the types are redundant by now and are just legacy ideas that should be reviewed after two years now.</p> +<p>In summary, the following the types currently are as follows:</p> +<table> +<thead> +<tr> +<th style="text-align:left">Type name</th> +<th style="text-align:left">Functionality</th> +<th style="text-align:left">Description</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">SOURCE</td> +<td style="text-align:left">for sending to tools</td> +<td style="text-align:left">Source packages of a release as found on the Internet</td> +</tr> +<tr> +<td style="text-align:left">COMPONENT_LICENSE_INFO_XML</td> +<td style="text-align:left">for project documentation generation</td> +<td style="text-align:left">An XML-based description of the licenses and coprights involved</td> +</tr> +<tr> +<td style="text-align:left">DESIGN</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Just nomenclature to name this not document</td> +</tr> +<tr> +<td style="text-align:left">REQUIREMENT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Just a general placeholder for an attachment</td> +</tr> +<tr> +<td style="text-align:left">DOCUMENT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Just a general placeholder for an attachment</td> +</tr> +<tr> +<td style="text-align:left">CLEARING_REPORT</td> +<td style="text-align:left">Setting clearing status</td> +<td style="text-align:left">Reporting information for component license state</td> +</tr> +<tr> +<td style="text-align:left">COMPONENT_LICENSE_INFO_COMBINED</td> +<td style="text-align:left">(should be) for project documentation generation</td> +<td style="text-align:left">Multiple components with component license information</td> +</tr> +<tr> +<td style="text-align:left">SCAN_RESULT_REPORT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Just description what scanners found without conclusions</td> +</tr> +<tr> +<td style="text-align:left">SCAN_RESULT_REPORT_XML</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Just description what scanners found without conclusions in XML</td> +</tr> +<tr> +<td style="text-align:left">SOURCE_SELF</td> +<td style="text-align:left">(should be) for sending to tools</td> +<td style="text-align:left">Source packages build self, because not available in the Internet</td> +</tr> +<tr> +<td style="text-align:left">BINARY</td> +<td style="text-align:left">future: for sending to tool doing binary analysis</td> +<td style="text-align:left">Binary from the publisher</td> +</tr> +<tr> +<td style="text-align:left">BINARY_SELF</td> +<td style="text-align:left">future: for sending to tool doing binary analysis</td> +<td style="text-align:left">Self built binary</td> +</tr> +<tr> +<td style="text-align:left">DECISION_REPORT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Decision information ref. the component</td> +</tr> +<tr> +<td style="text-align:left">LEGAL_EVALUATION</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Internally created legal evaluation</td> +</tr> +<tr> +<td style="text-align:left">LICENSE_AGREEMENT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Document describing the license agreement</td> +</tr> +<tr> +<td style="text-align:left">SCREENSHOT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">If licensing information is captured with screenshot</td> +</tr> +<tr> +<td style="text-align:left">OTHER</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">If not document</td> +</tr> +</tbody> +</table> + + + + + + Docs: Authorization Concept + https://www.eclipse.org/sw360/docs/deployment/deploy-authorization-concept/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-authorization-concept/ + + + + <p>The authorization concept describes the different roles of the solution - mainly for documentation of the authorization of different roles of the sw360. It is not focusing for the roles like being a moderator, it is described on a separate page for users: <a href="https://github.com/eclipse/sw360/wiki/Dev-Role-Authorisation-Model">role and access model</a></p> +<h2 id="roles-overview">Roles Overview</h2> +<p>SW360 offers two choices for doing the roles: one is setting access rights at every record individually. Another are general roles that can be set for every user. An admin of SW360 can set user roles at the Liferay Users and Roles UI.</p> +<h4 id="setup-admin-liferay-role">Setup Admin (Liferay Role)</h4> +<p>The setup admin is the Liferay administrator, which can configure the entire liferay app, such as which portlets are shown on which page.</p> +<h4 id="sw360-admin-liferay-role">SW360 Admin (Liferay Role)</h4> +<p>The SW360 admin can change all data and promote users for more access rights, such as promoting a user to role <code>CLEARING_ADMIN</code>. So its use case is to promote users to clearing admins after some time without always asking the site administrator to do this. To enhance the <code>SW360_ADMIN</code> role to allow users of this role to promote other users&rsquo;s roles, follow these steps:</p> +<ol> +<li>Go to control panel</li> +<li>Select the <code>Users</code> section</li> +<li>To subsection <code>Roles</code></li> +<li>Select row for <code>SW360 Admin</code> and select action <code>Define permissions</code>.</li> +</ol> +<p>When defining permissions the idea is to reduce the permissions to the lowest level possible. Just allow for changing users.</p> +<h4 id="clearing-admin-liferay-role">Clearing Admin (Liferay Role)</h4> +<p>The clearing admin can change all component and release records and project records of the same group.</p> +<h4 id="security-admin-liferay-role">Security Admin (Liferay Role)</h4> +<p>In addition to the user rights, the security admin can set security vulnerabilities to irrelevant</p> +<h4 id="ecc-admin-liferay-role">ECC Admin (Liferay Role)</h4> +<p>In addition to the user rights, the ECC admin can manipulate ECC data.</p> +<h4 id="user">User</h4> +<p>A user can create, modify and delete all own (=self created) records. A user cannot change records of others</p> +<h4 id="summary">Summary</h4> +<h3 id="moderation-requests">Moderation Requests</h3> +<p>If a user with user or other access role rights is not entitled to write or change a record, a moderation request will be created. The moderation request contains the changes an will be routed for approval to the users who can write this record.</p> + + + + + + Docs: Configurable Property Keys + https://www.eclipse.org/sw360/docs/deployment/deploy-configuration-files/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-configuration-files/ + + + + <h3 id="introduction">Introduction</h3> +<p>List of all applicable property files in sw360:</p> +<ul> +<li>sw360.properties</li> +<li>fossology.properties</li> +<li>couchdb.properties</li> +<li>search.properties</li> +<li>orgmapping.properties</li> +<li>databasetest.properties</li> +<li>authorization/application.yml</li> +<li>rest/application.yml</li> +</ul> +<h3 id="sw360properties-etcsw360sw360properties">SW360.properties (/etc/sw360/sw360.properties)</h3> +<p>The following table shall give an overview about the general sw360 configuration settings.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">licenseinfo.spdxparser.use-license-info-from-files</td> +<td style="text-align:left">true/false</td> +</tr> +<tr> +<td style="text-align:left">mainline.state.enabled.for.user</td> +<td style="text-align:left">true/false</td> +</tr> +<tr> +<td style="text-align:left">key.auth.email</td> +<td style="text-align:left">EMAIL</td> +</tr> +<tr> +<td style="text-align:left">key.auth.extid</td> +<td style="text-align:left">EXTID</td> +</tr> +<tr> +<td style="text-align:left">key.auth.givenname</td> +<td style="text-align:left">GIVENNAME</td> +</tr> +<tr> +<td style="text-align:left">key.auth.surname</td> +<td style="text-align:left">SURNAME</td> +</tr> +<tr> +<td style="text-align:left">key.auth.department</td> +<td style="text-align:left">DEPARTMENT</td> +</tr> +<tr> +<td style="text-align:left">backend.url</td> +<td style="text-align:left">http://127.0.0.1:8080</td> +</tr> +<tr> +<td style="text-align:left">cvesearch.vendor.threshold</td> +<td style="text-align:left">1</td> +</tr> +<tr> +<td style="text-align:left">cvesearch.product.threshold</td> +<td style="text-align:left">0</td> +</tr> +<tr> +<td style="text-align:left">cvesearch.cutoff</td> +<td style="text-align:left">6</td> +</tr> +<tr> +<td style="text-align:left">combined.cli.parser.external.id.correlation.key</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">schedule.cvesearch.firstOffset.seconds</td> +<td style="text-align:left">0</td> +</tr> +<tr> +<td style="text-align:left">schedule.cvesearch.interval.seconds</td> +<td style="text-align:left">&ldquo;(24<em>60</em>60)&rdquo;</td> +</tr> +<tr> +<td style="text-align:left">autostart</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">rest.write.access.usergroup</td> +<td style="text-align:left">SW360_ADMIN</td> +</tr> +<tr> +<td style="text-align:left">rest.access.token.validity.seconds</td> +<td style="text-align:left">3600</td> +</tr> +<tr> +<td style="text-align:left">rest.security.client.id</td> +<td style="text-align:left">sw360-trusted-client</td> +</tr> +<tr> +<td style="text-align:left">rest.security.client.secret</td> +<td style="text-align:left">sw360-secret</td> +</tr> +<tr> +<td style="text-align:left">programming.languages</td> +<td style="text-align:left">ActionScript,AppleScript, Asp,Bash,BASIC, C,C++,C#,Cocoa,Clojure, COBOL,ColdFusion,D, Delphi,Erlang,Fortran, Go,Groovy,Haskell, JSP,Java,JavaScript,Objective-C, Ocaml,Lisp,Perl, PHP,Python,Ruby,SQL ,SVG,Scala,SmallTalk Scheme,Tcl,XML, Node.js,JSON</td> +</tr> +<tr> +<td style="text-align:left">software.platforms</td> +<td style="text-align:left">Adobe AIR,Adobe Flash, Adobe Shockwave,Binary Runtime Environment for Wireless,Cocoa (API),Cocoa Touch,Java (software platform)</td> +</tr> +<tr> +<td style="text-align:left">operating.systems</td> +<td style="text-align:left">Android,BSD,iOS, Linux,OS X,QNX, Microsoft Windows,Windows Phone,IBM z/OS</td> +</tr> +<tr> +<td style="text-align:left">clearing.teams</td> +<td style="text-align:left">org1,org2,org3</td> +</tr> +<tr> +<td style="text-align:left">state</td> +<td style="text-align:left">Active,Phase out,Unknown</td> +</tr> +<tr> +<td style="text-align:left">project.type</td> +<td style="text-align:left">Customer Project,Internal Project,Product,Service,Inner Source</td> +</tr> +<tr> +<td style="text-align:left">project.externalkeys</td> +<td style="text-align:left">internal.id</td> +</tr> +<tr> +<td style="text-align:left">license.identifiers</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">component.categories</td> +<td style="text-align:left">framework,SDK,big-data, build-management,cloud,content, database,graphics,http, javaee,library,mail,mobile, security,testing,virtual-machine, web-framework,xml</td> +</tr> +<tr> +<td style="text-align:left">component.externalkeys</td> +<td style="text-align:left">com.github.id,com.gitlab.id,purl.id</td> +</tr> +<tr> +<td style="text-align:left">custommap.project.roles</td> +<td style="text-align:left">Stakeholder,Analyst,Contributor,Accountant,End user,Quality manager,Test manager,Technical writer,Key user</td> +</tr> +<tr> +<td style="text-align:left">custommap.component.roles</td> +<td style="text-align:left">Committer,Contributor,Expert</td> +</tr> +<tr> +<td style="text-align:left">custommap.release.roles</td> +<td style="text-align:left">Committer,Contributor,Expert</td> +</tr> +<tr> +<td style="text-align:left">custommap.release.externalIds</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">release.externalkeys</td> +<td style="text-align:left">org.maven.id,com.github.id,com.gitlab.id,purl.id</td> +</tr> +<tr> +<td style="text-align:left">projectimport.hosts</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">preferred.country.codes</td> +<td style="text-align:left">DE,AT,CH,US</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_from</td> +<td style="text-align:left">_<a href="mailto:No_Reply__@sw360.org">No_Reply__@sw360.org</a></td> +</tr> +<tr> +<td style="text-align:left">MailUtil_host</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_port</td> +<td style="text-align:left">25</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_enableStarttls</td> +<td style="text-align:left">false</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_enableSsl</td> +<td style="text-align:left">false</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_isAuthenticationNecessary</td> +<td style="text-align:left">true</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_login</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_password</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_enableDebug</td> +<td style="text-align:left">false</td> +</tr> +<tr> +<td style="text-align:left">MailUtil_supportMailAddress</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">defaultBegin</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">defaultEnd</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">unsubscribeNoticeBefore</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">unsubscribeNoticeAfter</td> +<td style="text-align:left">-</td> +</tr> +</tbody> +</table> +<h3 id="fossologyproperties-etcsw360fossologyproperties">fossology.properties (/etc/sw360/fossology.properties)</h3> +<p>These configuration parameters are necessary to connect to a fossology server.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">fossology.host</td> +<td style="text-align:left">localhost</td> +</tr> +<tr> +<td style="text-align:left">fossology.port</td> +<td style="text-align:left">22</td> +</tr> +<tr> +<td style="text-align:left">fossology.user</td> +<td style="text-align:left">sw360</td> +</tr> +<tr> +<td style="text-align:left">fossology.key.file</td> +<td style="text-align:left">/fossology.id_rsa</td> +</tr> +<tr> +<td style="text-align:left">fossology.key.pub.file</td> +<td style="text-align:left">[fossology.key.file] + .pub</td> +</tr> +</tbody> +</table> +<h3 id="couchdbproperties-etcsw360couchdbproperties">couchdb.properties (/etc/sw360/couchdb.properties)</h3> +<p>CouchDB and Lucene serach configuration properties.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">couchdb.url</td> +<td style="text-align:left">http://localhost:5984</td> +</tr> +<tr> +<td style="text-align:left">couchdb.database</td> +<td style="text-align:left">sw360db</td> +</tr> +<tr> +<td style="text-align:left">couchdb.user</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">couchdb.password</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">couchdb.userdb</td> +<td style="text-align:left">sw360users</td> +</tr> +<tr> +<td style="text-align:left">couchdb.attachments</td> +<td style="text-align:left">sw360attachments</td> +</tr> +<tr> +<td style="text-align:left">couchdb.fossologyKeys</td> +<td style="text-align:left">sw360fossologyKeys</td> +</tr> +<tr> +<td style="text-align:left">couchdb.vulnerability_management</td> +<td style="text-align:left">sw360vm</td> +</tr> +<tr> +<td style="text-align:left">lucenesearch.limit</td> +<td style="text-align:left">25</td> +</tr> +<tr> +<td style="text-align:left">lucenesearch.leading.wildcard*</td> +<td style="text-align:left">false</td> +</tr> +</tbody> +</table> +<blockquote> +<p>* If you enable lucene leading wildcards you have to enable this configuration also in couchdb-lucene.ini! Leading wildcard search is disabled as default because its a expensive operation. <em>(couchdb-lucene.ini is part of the couchdb-lucene .war package)</em> <br> +[lucene] <br> +allowLeadingWildcard=true</p> +</blockquote> +<h3 id="searchproperties-etcsw360searchproperties">search.properties (/etc/sw360/search.properties)</h3> +<p>The following table shall give an overview about the specific search properties</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">search.name.max.length</td> +<td style="text-align:left">64</td> +</tr> +</tbody> +</table> +<h3 id="orgmappingproperties-etcsw360orgmappingproperties">orgmapping.properties (/etc/sw360/orgmapping.properties)</h3> +<p>This configuration file is used to activate the sw360 orgmapping feature.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">match.prefix</td> +<td style="text-align:left">false</td> +</tr> +<tr> +<td style="text-align:left">enable.custom.mapping</td> +<td style="text-align:left">false</td> +</tr> +</tbody> +</table> +<h3 id="databasetestproperties-etcsw360databasetestproperties">databasetest.properties (/etc/sw360/databasetest.properties)</h3> +<p>Just for couchdb database test purpose.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Property Key</th> +<th style="text-align:left">Default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">couch_db_url</td> +<td style="text-align:left">http://localhost:5984</td> +</tr> +<tr> +<td style="text-align:left">couch_db_database</td> +<td style="text-align:left">datahandlertestdb</td> +</tr> +<tr> +<td style="text-align:left">couchdb.username</td> +<td style="text-align:left">-</td> +</tr> +<tr> +<td style="text-align:left">couchdb.password</td> +<td style="text-align:left">-</td> +</tr> +</tbody> +</table> +<h3 id="authorizationapplicationyml-etcsw360authorizationapplicationyml">authorization/application.yml (/etc/sw360/authorization/application.yml)</h3> +<p>All of the following built-in properties can be overridden:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span># Port to open in standalone mode +</span></span><span style="display:flex;"><span>server: +</span></span><span style="display:flex;"><span> port: 8090 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span># Connection to the couch databases. Will be used to store client credentials +</span></span><span style="display:flex;"><span>couchdb: +</span></span><span style="display:flex;"><span> url: http://localhost:5984 +</span></span><span style="display:flex;"><span> database: sw360oauthclients +</span></span><span style="display:flex;"><span> # if your couchdb does not use authentication, pls just don&#39;t use the settings for username and password +</span></span><span style="display:flex;"><span> #username: +</span></span><span style="display:flex;"><span> #password: +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>spring: +</span></span><span style="display:flex;"><span> jackson: +</span></span><span style="display:flex;"><span> serialization: +</span></span><span style="display:flex;"><span> indent_output: true +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span># Common SW360 properties +</span></span><span style="display:flex;"><span>sw360: +</span></span><span style="display:flex;"><span> # The url of the Liferay instance +</span></span><span style="display:flex;"><span> sw360-portal-server-url: ${SW360_PORTAL_SERVER_URL:http://127.0.0.1:8080} +</span></span><span style="display:flex;"><span> # The id of the company in Liferay that sw360 is run for +</span></span><span style="display:flex;"><span> sw360-liferay-company-id: ${SW360_LIFERAY_COMPANY_ID:20155} +</span></span><span style="display:flex;"><span> # Allowed origins that should be set in the header +</span></span><span style="display:flex;"><span> cors: +</span></span><span style="display:flex;"><span> allowed-origin: ${SW360_CORS_ALLOWED_ORIGIN:#{null}} +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>security: +</span></span><span style="display:flex;"><span> # Configuration for enabling authorization via headers, e.g. when using SSO +</span></span><span style="display:flex;"><span> # in combination with a reverse proxy server +</span></span><span style="display:flex;"><span> customheader: +</span></span><span style="display:flex;"><span> headername: +</span></span><span style="display:flex;"><span> # You have to enable authorization by headers explicitly here +</span></span><span style="display:flex;"><span> enabled: false +</span></span><span style="display:flex;"><span> # Attention: please make sure that the proxy is removing there headers +</span></span><span style="display:flex;"><span> # if they are coming from anywhere else then the authentication server +</span></span><span style="display:flex;"><span> intermediateauthstore: custom-header-auth-marker +</span></span><span style="display:flex;"><span> email: authenticated-email +</span></span><span style="display:flex;"><span> extid: authenticated-extid +</span></span><span style="display:flex;"><span> # also available - at least in saml pre auth - are &#34;givenname&#34;, &#34;surname&#34; and &#34;department&#34; +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> oauth2: +</span></span><span style="display:flex;"><span> resource: +</span></span><span style="display:flex;"><span> id: sw360-REST-API +</span></span></code></pre></div><h3 id="restapplicationyml-etcsw360restapplicationyml">rest/application.yml (/etc/sw360/rest/application.yml)</h3> +<p>All of the following built-in properties can be overridden:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>server: +</span></span><span style="display:flex;"><span> port: 8091 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>spring: +</span></span><span style="display:flex;"><span> http: +</span></span><span style="display:flex;"><span> multipart: +</span></span><span style="display:flex;"><span> max-file-size: 500MB +</span></span><span style="display:flex;"><span> max-request-size: 600MB +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> data: +</span></span><span style="display:flex;"><span> rest: +</span></span><span style="display:flex;"><span> base-path: /api +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span># logging: +</span></span><span style="display:flex;"><span># level: +</span></span><span style="display:flex;"><span># org.springframework.web: DEBUG +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>security: +</span></span><span style="display:flex;"><span> oauth2: +</span></span><span style="display:flex;"><span> resource: +</span></span><span style="display:flex;"><span> id: sw360-REST-API +</span></span><span style="display:flex;"><span> filter-order: 3 +</span></span><span style="display:flex;"><span> jwt: +</span></span><span style="display:flex;"><span> keyValue: | +</span></span><span style="display:flex;"><span> -----BEGIN PUBLIC KEY----- +</span></span><span style="display:flex;"><span> MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApz8Cr1o5yHMv/FUdF5uy +</span></span><span style="display:flex;"><span> VptilqdWtNvw5S6Tr4IaQ4XR9QPt8nlRsjOngfG4QCcKMBWJISldFg8PlJWUBeV+ +</span></span><span style="display:flex;"><span> 6TwQUidxokl2GbO6/+QA+lz1a5Ei1Y1pcnvFeRb2pdYlH3Yg6fXMxS6QwDLk27pZ +</span></span><span style="display:flex;"><span> 5xbpSDIGISDesyaIMvwaKdhAbFW/tTb/oJY7rCPvmYLT80kJzilijJ/W01jMMSHg +</span></span><span style="display:flex;"><span> 9Yi5cCt1eU/s78co+pxHzwNXO0Ul4iRpo/CXprQCsSIsdWkJTo6btal1xzd292Da +</span></span><span style="display:flex;"><span> d+9xq499JEsNbcqLfCq8DBQ7CEz6aJjMvPkvZiCrFIGxC/Gqmw35DQ4688rbkKSJ +</span></span><span style="display:flex;"><span> PQIDAQAB +</span></span><span style="display:flex;"><span> -----END PUBLIC KEY----- +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>sw360: +</span></span><span style="display:flex;"><span> thrift-server-url: ${SW360_THRIFT_SERVER_URL:http://localhost:8080} +</span></span><span style="display:flex;"><span> test-user-id: admin@sw360.org +</span></span><span style="display:flex;"><span> test-user-password: sw360-password +</span></span><span style="display:flex;"><span> couchdb-url: ${SW360_COUCHDB_URL:http://localhost:5984} +</span></span><span style="display:flex;"><span> cors: +</span></span><span style="display:flex;"><span> allowed-origin: ${SW360_CORS_ALLOWED_ORIGIN:#{null}} +</span></span></code></pre></div> + + + + + Docs: Configuring Country Codes + https://www.eclipse.org/sw360/docs/deployment/deploy-configuration-country-codes/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-configuration-country-codes/ + + + + <p>This feature is available on:</p> +<ul> +<li>projects / Owner Country</li> +<li>components / Owner Country</li> +</ul> +<p><img src="https://user-images.githubusercontent.com/29916928/36796378-551cf572-1c9d-11e8-96aa-85ce98e97ff3.jpg" alt="Country Code List"></p> +<p>Its supports preferred country codes, which are shown at the top of the country list. <br> +You can configure them by using the sw360.properties.</p> +<table> +<thead> +<tr> +<th style="text-align:center">sw360 properties key</th> +<th style="text-align:center">value</th> +<th style="text-align:center">default</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:center">preferred.country.codes</td> +<td style="text-align:center">(ISO 3166-1 alpha-2)</td> +<td style="text-align:center">DE,AT,CH,US</td> +</tr> +</tbody> +</table> + + + + + + Docs: CVE Scheduler + https://www.eclipse.org/sw360/docs/deployment/deploy-cve-search/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-cve-search/ + + + + <h1 id="how-to-use-sw360-cve-schedule">How to use SW360 CVE schedule</h1> +<p>SW360 gets vulnerability information from Common Vulnerability Enumeration (CVE) data. SW360 can connect to your local cve-search server.<br> +<em>Few years ago, sw360 was able to get vulnerability information from online CVE serverr, but it is not active.</em></p> +<h2 id="install-cve-search">Install CVE-search</h2> +<p>cve-search is a tool to import CVE (Common Vulnerabilities and Exposures) and CPE (Common Platform Enumeration) into a MongoDB to facilitate search and processing of CVEs. You can choose Docker install or Native install.</p> +<h3 id="docker-installation-github-repohttpsgithubcomcve-searchcve-search-docker">Docker Installation <a href="https://github.com/cve-search/CVE-Search-Docker">Github repo</a></h3> +<p>Only clone and &ldquo;docker-compose up&rdquo;.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ git clone https://github.com/cve-search/CVE-Search-Docker.git +</span></span><span style="display:flex;"><span> $ <span style="color:#366">cd</span> CVE-Search-Docker +</span></span><span style="display:flex;"><span> $ docker-compose up +</span></span></code></pre></div><h3 id="native-installation-github-repohttpsgithubcomcve-searchcve-search">Native Installation <a href="https://github.com/cve-search/cve-search">Github repo</a></h3> +<ol> +<li>Clone source</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ git clone https://github.com/cve-search/cve-search +</span></span><span style="display:flex;"><span> $ <span style="color:#366">cd</span> cve-search +</span></span><span style="display:flex;"><span> $ git checkout <span style="color:#555">{</span>tag/branch<span style="color:#555">}</span> +</span></span></code></pre></div><ol start="2"> +<li>Install system requirements</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ sudo apt-get install -y &lt; requirements.system +</span></span></code></pre></div><ol start="3"> +<li>Install CVE-Search and its Python dependencies</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> pip3 install -r requirements.txt +</span></span></code></pre></div><ol start="4"> +<li>Install mongodb</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add - +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ <span style="color:#033">codename</span><span style="color:#555">=</span><span style="color:#069;font-weight:bold">$(</span>lsb_release --codename --short<span style="color:#069;font-weight:bold">)</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ <span style="color:#366">echo</span> <span style="color:#c30">&#34;deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu </span><span style="color:#a00">${</span><span style="color:#033">codename</span><span style="color:#a00">}</span><span style="color:#c30">/mongodb-org/4.4 multiverse&#34;</span> | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ sudo apt-get update +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ sudo apt-get install -y mongodb-org +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ sudo systemctl daemon-reload +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ sudo systemctl start mongod +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># Verify status of mongodb</span> +</span></span><span style="display:flex;"><span> $ sudo systemctl status mongod +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># if all is ok, enable mongodb to start on system startup</span> +</span></span><span style="display:flex;"><span> $ sudo systemctl <span style="color:#366">enable</span> mongod +</span></span></code></pre></div><ol start="5"> +<li>Populating the database</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ sudo apt-get install redis redis-server +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic">#modify: stop-writes-on-bgsave-error yes -&gt; no</span> +</span></span><span style="display:flex;"><span> $ sudo vim /etc/redis/redis.conf +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ sudo systemctl daemon-reload +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ sudo systemctl restart redis +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ ./sbin/db_mgmt_cpe_dictionary.py -p +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ ./sbin/db_mgmt_json.py -p +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> $ ./sbin/db_updater.py -c <span style="color:#09f;font-style:italic"># This will take &gt; 45minutes on a decent machine, please be patient</span> +</span></span></code></pre></div><ol start="6"> +<li>Updating the database</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ ./sbin/db_updater.py -v +</span></span></code></pre></div><ol start="7"> +<li>Starting and stopping the web-server</li> +</ol> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># Install psutil &gt;= 5.7.0</span> +</span></span><span style="display:flex;"><span> $ pip3 install psutil&gt;<span style="color:#555">=</span>5.7.0 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> <span style="color:#09f;font-style:italic"># Starting web server</span> +</span></span><span style="display:flex;"><span> $ python3 web/index.py +</span></span></code></pre></div><p>Default Web server: http://localhost:5000</p> +<p>To stop the server, press the <code>CTRL+C</code></p> +<p><strong>Note</strong>: By default CVE-Search takes assumptions on certain configuration aspects of the application, you can adjust</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ <span style="color:#366">cd</span> cve-search +</span></span><span style="display:flex;"><span> $ cp etc/configuration.ini.sample etc/configuration.ini +</span></span><span style="display:flex;"><span> $ vim etc/configuration.ini +</span></span></code></pre></div><h2 id="setup-sw360-with-cve-server">Setup SW360 with CVE server</h2> +<ol> +<li>Change default CVE server</li> +</ol> +<p>Change <code>cvesearch.host</code> with CVE server address.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ vim <span style="color:#a00">${</span><span style="color:#033">SW360_DIR_INSTALL</span><span style="color:#a00">}</span>/backend/src/src-cvesearch/src/main/resources/cvesearch.properties +</span></span></code></pre></div><ol start="2"> +<li>Setting for schedule the CVE service</li> +</ol> +<p>The offset (first run of the update) and the interval between updates can also be adjusted.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> $ vim <span style="color:#a00">${</span><span style="color:#033">SW360_DIR_INSTALL</span><span style="color:#a00">}</span>/backend/src/src-schedule/src/main/resources/sw360.properties +</span></span></code></pre></div><p>The <code>offset</code> has to be given in seconds since midnight and also the <code>interval</code> has to be entered in seconds. The default is to update the vulnerabilities by CVEsearch every night at midnight, which corresponds to an offset of 0 and an interval of 24 hours (= 86400 seconds).</p> +<p>According to the default settings, cveSearch is not auto-started with the scheduling service. If want to auto start <code>autostart = cvesearchService</code></p> +<ol start="3"> +<li>Schedule task Adminstration</li> +</ol> +<p>View and start/stop schedule</p> +<p>Click <code>Admin</code> &gt; <code>Schedule</code></p> +<h2 id="reference">Reference</h2> +<p>CVE guide: [https://cve-search.github.io/cve-search/database/database.html]</p> +<p>User Scheduling CVE Search by Admins: [https://github.com/eclipse/sw360/wiki/User-Scheduling-CVE-Search-by-Admins]</p> + + + + + + Docs: CVE-Search Scheduling + https://www.eclipse.org/sw360/docs/userguide/user-scheduling-cve-search-by-admins/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/user-scheduling-cve-search-by-admins/ + + + + <p>SW360 gets vulnerability information from an external provider of Common Vulnerability Enumeration (CVE) data. By default SW360 can connect to cve-search [https://www.circl.lu/services/cve-search/] which is either available as an online service [http://cve.circl.lu] or can be installed locally. For security and privacy reasons it is strongly advised to install a local cve-search service.</p> +<p>In what follows the synchronization between SW360 and the external CVE provider is described.</p> +<p><code>CveSearch-updates</code> can either be scheduled automatically when launching the <code>schedule-service</code> (e.g. when re/starting SW360) or it can be scheduled or unscheduled manually by an <code>SW360 admin</code>. +It is automatically scheduled with the start of the scheduling service, if in the <code>/resources/sw360.properties</code> file of the <code>schedule-service</code> in the backend, <code>cvesearchService</code> is mentioned in the <code>autostart</code>-property:</p> +<p><code>autostart = cvesearchService</code></p> +<p>According to the default settings, cveSearch is <em>not</em> auto-started with the scheduling service.</p> +<p>For manually scheduling the CVE search service, open the <code>Schedule Portlet</code> of the <code>Admin</code> menu. Note that the <code>Admin</code> menu is only visible to <code>SW360 admins</code>.</p> +<p><img src="./images/UCAdminScheduling/01_adminMenu.png" alt=""></p> +<p>In the <code>Schedule Portlet</code> of the <code>Admin</code> menu, a user with <code>admin</code> rights can turn on or off automatic updates of the cve-search service manually. +In the UI of the portlet, the admin can see whether or not the CVE-service is scheduled: if the service is scheduled, the <code>Schedule CveSearch Updates</code>-button is inactive, whereas the <code>Cancel Scheduled CveSearch Updates</code>-button is active and vice versa:</p> +<p><img src="./images/UCAdminScheduling/scheduleAdminPortlet.png" alt=""></p> +<p>The <code>offset</code> (first run of the update) and the <code>interval</code> between updates can also be adjusted in the <code>/resources/sw360.properties</code> file of the <code>src-schedule</code> service. +The corresponding properties are <code>schedule.cvesearch.firstOffset.seconds</code> and <code>schedule.cvesearch.interval.seconds</code>. +The <code>offset</code> has to be given in seconds since midnight and also the <code>interval</code> has to be entered in seconds. +The default is to update the vulnerabilities by CVEsearch every night at midnight, which corresponds to an offset of 0 and an interval of 24 hours (= 86400 seconds).</p> +<p><code>schedule.cvesearch.firstOffset.seconds = 0</code></p> +<p><code>schedule.cvesearch.interval.seconds = 86400</code></p> +<p>With automatic scheduling the next synchronization moment according to the <code>offset</code> and the <code>interval</code> is computed. This will be the first moment when a <code>cveSearch-update</code> is run. +There is nothing like an <code>initial run</code> when autostarting of manually scheduling the <code>CveSearch-updates</code>. +Moreover, the configuration, i.e. <code>offset</code>, <code>interval</code> and <code>next synchronization</code> (where the latter is a consequence of <code>offset</code> and <code> interval</code>) are shown in the portlet:</p> +<p><img src="./images/UCAdminScheduling/scheduleAdminPortletProperties.png" alt=""></p> +<h2 id="setup-of-a-local-instance">Setup of a local instance</h2> +<p>It is recommended to set up and use a local instance instead of the public cve-search instance. +The accompanying project sw360-chores contains a Dockerfile that can easily setup this service.</p> + + + + + + Docs: Docker Deployment + https://www.eclipse.org/sw360/docs/deployment/deploy-docker/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-docker/ + + + + <h1 id="a-quick-how-to-for-testing-sw360">A quick how-to for testing SW360</h1> +<h2 id="requirements">Requirements</h2> +<h3 id="platform-requirements">Platform Requirements</h3> +<p>As you need Apache Thrift 0.11.0 (see <a href="https://github.com/eclipse/sw360#required-software">https://github.com/eclipse/sw360#required-software</a> ), using the latest Ubuntu LTS (18.04) won&rsquo;t work, so we start on Ubuntu 19.10 if you want to install from packages. As an alternative, consider the following script from the sw360 repository:</p> +<p><a href="https://github.com/eclipse/sw360/blob/master/scripts/install-thrift.sh">https://github.com/eclipse/sw360/blob/master/scripts/install-thrift.sh</a></p> +<p>We&rsquo;ll go the Docker way and follow the instructions of the <a href="https://github.com/sw360/sw360chores">sw360chores project</a>. There is a nice diagram there, explaining the rather complex setup.</p> +<h3 id="sw360chores-requirements">sw360chores Requirements</h3> +<blockquote> +<p>the perl interpreter to run ./sw360chores.pl</p> +</blockquote> +<p>You should already have it in your default, even if minimal, installation</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>$ which perl +</span></span><span style="display:flex;"><span>/usr/bin/perl +</span></span></code></pre></div><blockquote> +<p>git which is used in some prepare scripts</p> +</blockquote> +<p><code>sudo apt install git</code></p> +<blockquote> +<p>a current version of docker (min 1.30) [https://docs.docker.com/]</p> +</blockquote> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt install docker.io +</span></span></code></pre></div><blockquote> +<p>docker-compose (min 1.21) [https://docs.docker.com/compose/install/]</p> +</blockquote> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt install docker-compose +</span></span></code></pre></div><p>And you actually also need curl,</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt install curl +</span></span></code></pre></div><h3 id="sw360-requirements">Sw360 Requirements</h3> +<p>From the <a href="https://github.com/eclipse/sw360#required-software">sw360 Readme</a>:</p> +<blockquote> +<p>Java 1.8.X</p> +</blockquote> +<p>And when they say &ldquo;1.8.X&rdquo;, they mean it: it won&rsquo;t work with a later version. So it&rsquo;s better to uninstall the potential other versions of Java (/!\ this is expected to break other things on your environment if you depend on Java for anything), and then install the required version</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> sudo apt install openjdk-8-jdk openjdk-8-jre +</span></span></code></pre></div><blockquote> +<p>In order to build you will need:</p> +<ul> +<li>A git client</li> +<li>Apache Maven 3.6.X</li> +<li>Apache Thrift 0.11.0</li> +</ul> +</blockquote> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt install maven +</span></span></code></pre></div><p>That will install maven Apache Maven 3.6.1 but you need to have installed the correct version (8) of Java <em>before hand</em> otherwise it will install a too recent one.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt install thrift-compiler +</span></span></code></pre></div><p>That will install Thrift version 0.11.0, if you have not installed thrift using the script above.</p> +<h2 id="cloning-the-repos">Cloning the repos</h2> +<h3 id="generating-an-ssh-key-pair-for-your-machine">Generating an ssh key-pair for your machine</h3> +<p>If you don&rsquo;t already have one, generate a key pair with no passphrase, in default location:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>ssh-keygen -t rsa -b 4096 -C &#34;your_email@example.com&#34; +</span></span></code></pre></div><p>Not 100% sure, but not having one may create problems, so&hellip;</p> +<h3 id="cloning-sw360-chores">Cloning sw360 chores</h3> +<p>I created a <code>code</code> folder at the root of the user&rsquo;s directory, just to make things simple.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>~$ cd code +</span></span><span style="display:flex;"><span>~/code$ git clone https://github.com/sw360/sw360chores.git +</span></span></code></pre></div><h3 id="cloning-eclipsesw360">Cloning eclipse/sw360</h3> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>~/code$ git clone https://github.com/eclipse/sw360.git +</span></span></code></pre></div><h2 id="compiling-and-deploying-sw360-code">Compiling and deploying SW360 Code</h2> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a00;background-color:#faa">~$</span> cd code<span style="color:#555">/</span>sw360<span style="color:#555">/</span> +</span></span><span style="display:flex;"><span><span style="color:#a00;background-color:#faa">~</span><span style="color:#555">/</span>code<span style="color:#555">/</span>sw360<span style="color:#a00;background-color:#faa">$</span> mvn <span style="color:#069;font-weight:bold">package</span> <span style="color:#555">-</span>P deploy <span style="color:#555">-</span>Dbase.deploy.dir=<span style="color:#555">/</span>home<span style="color:#555">/</span>inno3<span style="color:#555">/</span>code<span style="color:#555">/</span>sw360chores<span style="color:#555">/</span>_deploy <span style="color:#555">-</span>DskipTests +</span></span></code></pre></div><h2 id="launching-the-containers">Launching the containers</h2> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>$ cd ~/code/sw360chores/ +</span></span><span style="display:flex;"><span>~/code/sw360chores$ ./sw360chores.pl --build -- up +</span></span></code></pre></div><p>And yes, there is a space between <code>--</code> and <code>up</code>.</p> +<p>If everything goes fine, you should see a line like</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360_1 | 15-Jan-2020 12:33:38.480 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [144,475] milliseconds +</span></span></code></pre></div><p>You should be able to login at <a href="https://localhost:8443">https://localhost:8443</a> with the default credentials <code>setup@sw360.org</code> and the password <code>sw360fossy</code> (found <a href="https://github.com/eclipse/sw360/wiki/Deploy-Liferay#liferay-administrator-steps">here</a>).</p> +<p>Please go ahead now with the setup of the Liferay - links can be found in the main wiki page.</p> + + + + + + Docs: Enumerations + https://www.eclipse.org/sw360/docs/userguide/user-data-model-enumerations/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/user-data-model-enumerations/ + + + + <p>SW360 thrift API is comprised of the following methods:</p> +<ul> +<li>attachments</li> +<li>codescoop</li> +<li>components</li> +<li>cvesearch</li> +<li>fossology</li> +<li>importstatus</li> +<li>licenseinfo</li> +<li>licenses</li> +<li>moderation</li> +<li>projectimport</li> +<li>projects</li> +<li>schedule</li> +<li>search</li> +<li>sw360</li> +<li>users</li> +<li>vendors</li> +<li>vulnerabilities</li> +</ul> +<p>Reference: <a href="https://github.com/eclipse/sw360/tree/master/libraries/lib-datahandler/src/main/thrift">https://github.com/eclipse/sw360/tree/master/libraries/lib-datahandler/src/main/thrift</a></p> +<h2 id="attachments">Attachments</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/attachments.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/attachments.thrift</a></p> +<h3 id="attachmenttype">AttachmentType</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description.</th> +</tr> +</thead> +<tbody> +<tr> +<td>DOCUMENT</td> +<td>justa document</td> +</tr> +<tr> +<td>SOURCE</td> +<td>original course code</td> +</tr> +<tr> +<td>DESIGN</td> +<td>design document</td> +</tr> +<tr> +<td>REQUIREMENT</td> +<td>requirements document</td> +</tr> +<tr> +<td>CLEARING_REPORT</td> +<td>OSS licensing reporting</td> +</tr> +<tr> +<td>COMPONENT_LICENSE_INFO_XML</td> +<td>XML document with licenseing information - e.g. SPDX</td> +</tr> +<tr> +<td>COMPONENT_LICENSE_INFO_COMBINED</td> +<td>XML document with licensing information covering multiple componnts at once - e.g. SPDX</td> +</tr> +<tr> +<td>SCAN_RESULT_REPORT</td> +<td>Output what a scanner for licenses has found</td> +</tr> +<tr> +<td>SCAN_RESULT_REPORT_XML</td> +<td>Output what a scanner for licenses has found this time in XML</td> +</tr> +<tr> +<td>SOURCE_SELF</td> +<td>Self assembled source code distribution</td> +</tr> +<tr> +<td>BINARY</td> +<td>Binary of component from vendor</td> +</tr> +<tr> +<td>BINARY_SELF</td> +<td>Self built binary</td> +</tr> +<tr> +<td>DECISION_REPORT</td> +<td>documenting importing decisions for using this item</td> +</tr> +<tr> +<td>LEGAL_EVALUATION</td> +<td>Some legal evaluation created for this item</td> +</tr> +<tr> +<td>LICENSE_AGREEMENT</td> +<td>A ruling license agreement for this item, note that this could be for commercial software for example</td> +</tr> +<tr> +<td>SCREENSHOT</td> +<td>Screenshot, usually screenshot of the Website with licensing information</td> +</tr> +<tr> +<td>OTHER</td> +<td>anything that dos not match to the given above</td> +</tr> +</tbody> +</table> +<h3 id="checkstatus">CheckStatus</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description.</th> +</tr> +</thead> +<tbody> +<tr> +<td>NOTCHECKED</td> +<td>Default value after upload.</td> +</tr> +<tr> +<td>ACCEPTED</td> +<td>Reviewed and confirmed attachment.</td> +</tr> +<tr> +<td>REJECTED</td> +<td>Document or attachment cannot be used.</td> +</tr> +</tbody> +</table> +<h2 id="codescoop-thrift-file">CodeScoop Thrift File</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/codescoop.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/codescoop.thrift</a></p> +<h2 id="components">Components</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/components.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/components.thrift</a></p> +<h2 id="cvesearch">cvesearch</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/cvesearch.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/cvesearch.thrift</a></p> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>NEW</td> +<td>&hellip;</td> +</tr> +<tr> +<td>UPDATED</td> +<td>New information for a notification message, so it is updated</td> +</tr> +<tr> +<td>OLD</td> +<td>&hellip;</td> +</tr> +<tr> +<td>FAILED</td> +<td>&hellip;</td> +</tr> +</tbody> +</table> +<h2 id="fossology">Fossology</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/fossology.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/fossology.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="importstatus">Importstatus</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/importstatus.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/importstatus.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="license-info">License Info</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/licenseinfo.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/licenseinfo.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h3 id="licenseinforequeststatus">LicenseInfoRequestStatus</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>SUCCESS</td> +<td>&hellip;</td> +</tr> +<tr> +<td>NO_APPLICABLE_SOURCE</td> +<td>&hellip;</td> +</tr> +<tr> +<td>FAILURE</td> +<td>&hellip;</td> +</tr> +</tbody> +</table> +<h3 id="outputformatvariant">OutputFormatVariant</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>REPORT</td> +<td>&hellip;</td> +</tr> +<tr> +<td>DISCLOSURE</td> +<td>&hellip;</td> +</tr> +</tbody> +</table> +<h2 id="licenses">Licenses</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/licenses.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/licenses.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="moderation">Moderation</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/moderation.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/moderation.thrift</a></p> +<h3 id="documenttype">DocumentType</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>COMPONENT</td> +<td>&hellip;</td> +</tr> +<tr> +<td>RELEASE</td> +<td>&hellip;</td> +</tr> +<tr> +<td>PROJECT</td> +<td>&hellip;</td> +</tr> +<tr> +<td>LICENSE</td> +<td>&hellip;</td> +</tr> +<tr> +<td>USER</td> +<td>&hellip;</td> +</tr> +</tbody> +</table> +<h2 id="project-import">Project Import</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/projectimport.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/projectimport.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="projects">Projects</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/projects.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/projects.thrift</a></p> +<h3 id="project-state">Project State</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>ACTIVE</td> +<td><em>well</em></td> +</tr> +<tr> +<td>PHASE_OUT</td> +<td><em>well</em></td> +</tr> +<tr> +<td>UNKNOWN</td> +<td><em>well</em></td> +</tr> +</tbody> +</table> +<h3 id="project-type">Project Type</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>CUSTOMER</td> +<td>Project that delivers artifacts to customer outside organisation</td> +</tr> +<tr> +<td>INTERNAL</td> +<td>Project that provides artifacts or service for internal use</td> +</tr> +<tr> +<td>PRODUCT</td> +<td>Just that it is a product instead of a project</td> +</tr> +<tr> +<td>SERVICE</td> +<td>Project that provides services to customer outside organisation</td> +</tr> +<tr> +<td>INNER_SOURCE</td> +<td>Inner source project, meaning that everyone inside org can use it</td> +</tr> +</tbody> +</table> +<h3 id="project-relationship">Project Relationship</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>UNKNOWN</td> +<td><em>unknown</em></td> +</tr> +<tr> +<td>REFERRED</td> +<td>Sister project</td> +</tr> +<tr> +<td>CONTAINED</td> +<td>Sub project</td> +</tr> +<tr> +<td>DUPLICATE</td> +<td><em>duplicate</em></td> +</tr> +</tbody> +</table> +<h3 id="project-clearing-state">Project Clearing State</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>OPEN</td> +<td>not started</td> +</tr> +<tr> +<td>IN_PROGRESS</td> +<td>&hellip;</td> +</tr> +<tr> +<td>CLOSED</td> +<td>&hellip;</td> +</tr> +</tbody> +</table> +<h2 id="schedule">Schedule</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/schedule.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/schedule.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="search">Search</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/search.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/search.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="general-sw360-thrift">General SW360 Thrift</h2> +<h3 id="software-mainline-states">Software Mainline States</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>OPEN</td> +<td>Not decided so far</td> +</tr> +<tr> +<td>MAINLINE</td> +<td>Organisation or person thinks that use of this software is recommended, which included multiple versions.</td> +</tr> +<tr> +<td>SPECIFIC</td> +<td>The software is not recommended in general, but for special use case or for this particular version it is acceptable.</td> +</tr> +<tr> +<td>PHASE_OUT</td> +<td>The software has issues, please consider removing it soon, if in use.</td> +</tr> +<tr> +<td>DENIED</td> +<td>Software which is not allowed for use. For example, software that does not have licensing.</td> +</tr> +</tbody> +</table> +<h2 id="general-sw360-thrift-1">General SW360 Thrift</h2> +<h3 id="software-mainline-states-1">Software Mainline States</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description.</th> +</tr> +</thead> +<tbody> +<tr> +<td>OPEN</td> +<td>Not decided so far</td> +</tr> +<tr> +<td>MAINLINE</td> +<td>Organisation or person thinks that use of this software is recommended, which included multiple versions.</td> +</tr> +<tr> +<td>SPECIFIC</td> +<td>The software is not recommended in general, but for special use case or for this particular version it is acceptable.</td> +</tr> +<tr> +<td>PHASE_OUT</td> +<td>The software has issues, please consider removing it soon, if in use.</td> +</tr> +<tr> +<td>DENIED</td> +<td>Software which is not allowed for use. For example, software that does not have licensing.</td> +</tr> +</tbody> +</table> +<h3 id="moderation-states">Moderation States</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>PENDING</td> +<td>Not opened so far.</td> +</tr> +<tr> +<td>APPROVED</td> +<td>A person who has received the moderation request (which could be creator of the document, a clearing admin, a moderator, etc.) has approved the moderation request. It could be deleted then.</td> +</tr> +<tr> +<td>REJECTED</td> +<td>A person who has received the moderation request (which could be creator of the document, a clearing admin, a moderator, etc.) has rejected the moderation request.</td> +</tr> +<tr> +<td>INPROGRESS</td> +<td>A person who has received the moderation request (which could be creator of the document, a clearing admin, a moderator, etc.) has opened / viewed the moderation request, but did not decide.</td> +</tr> +</tbody> +</table> +<h3 id="visibility">Visibility</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>PRIVATE</td> +<td>Only visible by creator (and admin which applies to all visibility levels).</td> +</tr> +<tr> +<td>ME_AND_MODERATORS</td> +<td>Visible by creator and moderators.</td> +</tr> +<tr> +<td>BUISNESSUNIT_AND_MODERATORS</td> +<td>All users of the same group and the moderators.</td> +</tr> +<tr> +<td>EVERYONE</td> +<td>Every user who is logged into the system.</td> +</tr> +</tbody> +</table> +<h3 id="verification-state">Verification State</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>NOT_CHECKED</td> +<td>No one has yet looked at this and verified it.</td> +</tr> +<tr> +<td>CHECKED</td> +<td>It is verified.</td> +</tr> +<tr> +<td>INCORRECT</td> +<td>It was decided that the verification should be rejected.</td> +</tr> +</tbody> +</table> +<h3 id="release-relationship">Release Relationship</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +<th>Clearing releav nt</th> +</tr> +</thead> +<tbody> +<tr> +<td>CONTAINED</td> +<td>If you just do not know whether it is dynamically linked.</td> +<td>Yes</td> +</tr> +<tr> +<td>REFERRED</td> +<td>Referencing a stand alone used other part.</td> +<td>No</td> +</tr> +<tr> +<td>UNKNOWN</td> +<td>If you just do not know.</td> +<td>Yes</td> +</tr> +<tr> +<td>DYNAMICALLY_LINKED</td> +<td>Software dynamically linked - as the name says.</td> +<td>Yes</td> +</tr> +<tr> +<td>STATICALLY_LINKED</td> +<td>Software statically linked - as the name says.</td> +<td>Yes</td> +</tr> +<tr> +<td>SIDE_BY_SIDE</td> +<td>Not decided so far.</td> +<td>Yes</td> +</tr> +<tr> +<td>STANDALONE</td> +<td>Software is given as standalone delivery, ie. not technically connected.</td> +<td>Yes</td> +</tr> +<tr> +<td>INTERNAL_USE</td> +<td>Used for creating or building or ? the product or projects but not delivered.</td> +<td>Yes</td> +</tr> +<tr> +<td>OPTIONAL</td> +<td>Is not mandatory part of the installation.</td> +<td>Yes</td> +</tr> +<tr> +<td>TO_BE_REPLACED</td> +<td>Is there but should be moved out.</td> +<td>Yes</td> +</tr> +</tbody> +</table> +<h2 id="users">Users</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/users.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/users.thrift</a></p> +<h2 id="vendors">Vendors</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/vendors.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/vendors.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="vulnerabilities">Vulnerabilities</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/vulnerabilities.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/vulnerabilities.thrift</a></p> +<p><em>No enumerations provided</em></p> + + + + + + Docs: Export and Import + https://www.eclipse.org/sw360/docs/deployment/deploy-export-and-import/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-export-and-import/ + + + + <div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span><span style="background-color:#fcc">- note that only export and import of users is active, +</span></span></span><span style="display:flex;"><span><span style="background-color:#fcc">- everything else is deprecated functionality. +</span></span></span><span style="display:flex;"><span><span style="background-color:#fcc">- The export and import functionality has not been +</span></span></span><span style="display:flex;"><span><span style="background-color:#fcc">- updated at some point and thus will not function +</span></span></span><span style="display:flex;"><span><span style="background-color:#fcc">- properly anymore. +</span></span></span></code></pre></div><h1 id="full-export">Full Export</h1> +<p>The easiest way to fully export the data is to copy all the .couch files of Couch-DB. Where the files are can be found out from Futon. +e.g.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://localhost:5984/_utils/config.html +</span></span></code></pre></div><p>under</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>view_index_dir /var/lib/couchdb +</span></span></code></pre></div><p>This method of exporting has the advantage that all Ids remain the same. +An equally simple method it to use the Couch-DB replicator from Futon.</p> +<p>This method might fail when there are changes to the document structure as Ektorp might stumble over unset required or surplus fields. The method of choice here is to repair the DB (after a backup) with</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>https://github.com/couchapp/couchapp +</span></span></code></pre></div><p>and then follows the instructions from</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://harthur.github.io/costco/ +</span></span></code></pre></div><p>and</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>couchapp push . http://localhost:5984/sw360users +</span></span></code></pre></div><p>then you go to</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>http://localhost:5984/sw360users/_design/costco/index.html +</span></span></code></pre></div><p>and you can run functions like:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>function(doc) { +</span></span><span style="display:flex;"><span> if (doc.type == &#39;user&#39;) { +</span></span><span style="display:flex;"><span> if(doc.fullname == &#39;Homer J. Simons&#39;) { +</span></span><span style="display:flex;"><span> doc.fullname = &#39;Homer Jay Simons&#39;; +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> return doc; +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><p>You can also change the names of properties, e.g.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>function(doc) { +</span></span><span style="display:flex;"><span> if (doc.type == &#39;user&#39;) { +</span></span><span style="display:flex;"><span> if(doc.fullname ) { +</span></span><span style="display:flex;"><span> doc.fullname2 = doc.fullname; +</span></span><span style="display:flex;"><span> delete doc.fullname; +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> return doc; +</span></span><span style="display:flex;"><span>} +</span></span></code></pre></div><h1 id="csv-export">CSV Export</h1> +<h2 id="users">Users</h2> +<p>The export of users was already described, this is very important as this also creates the users in the liferay database. The mere export of the users.couch is not enough.</p> +<h2 id="projects">Projects</h2> +<p>There is no CSV export or import for projects currently.</p> +<h2 id="components-and-releases">Components and Releases</h2> +<p>To Export the components and releases you need to do the following: +As Components and Releases are identified by their identifier ([name] or [name(version)]), these identifiers need to be unique. When importing duplicates in the identifiers are ignored and they are also not exported. +Therefore in the admin page you can check the database for such duplicates.</p> +<p>After that &ldquo;Download Component CSV&rdquo; creates a CSV with components, releases and their source attachments. +The source attachments are created if the &ldquo;DownloadURL&rdquo; is a valid url. +These remote-only attachments will be download once the first download request occurs. +If the URL does not exist you get an error.</p> +<p>Alternatively you can use</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sw360/src/backend/utils/src/main/java/com/siemens/sw360/attachments/db/RemoteAttachmentDownloader.java +</span></span></code></pre></div><p>to bulk download the source only attachments. +The command line call to use it from the Siemens network looks like this:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> java -jar -Dhttp.proxyHost=proxyfarm.3dns.netz.sbs.de -Dhttps.proxyHost=proxyfarm.3dns.netz.sbs.de -Dhttp.proxyPort=84 -Dhttps.proxyPort=84 /home/siemagrant/.m2/repository/com/siemens/sw360/backend-utils/0.1.1-SNAPSHOT/backend-utils-0.1.1-SNAPSHOT-jar-with-dependencies.jar -d +</span></span></code></pre></div><h2 id="attachments">Attachments</h2> +<p>Here we have a mixed strategy, as there is a CSV export for the attachments, which only stores the meta information about the files. The files themselves need to be brought into a new instance via the sw360attachments.couch database.</p> +<p>The ids of the attachments are also in the CSV, so they are not portable without the sw360attachments.couch. This is meant as a form of recovery, but it should not be used on an instance that has been worked on, so only a fresh set up.</p> +<p>This will overwrite the auto generated attachments from the component CSV if the have the same URL as one of the imported attachments. This feature is needed to render the procedure idempotent.</p> +<p>The admin interface provides the possibility to delete attachment contents that do not have a project, component or release with an attachment that references it.</p> +<p>If you copy the sw360attachments.couch to your instance and then click this before you import than the db should be empty afterwards.</p> +<p>If there was no error after importing the csv, running this job should yield no deletions if there was no error and the exported attachments where complete.</p> +<p>In general this should only be necessary if errors have occurred. +It is a good idea to run this before you export the attachments.</p> +<h2 id="release-links">Release links</h2> +<p>Links between releases can be exported or imported. +Because release links are stored in maps, the procedure is idempotent by construction. +The old links are overwritten with the imported data.</p> +<h2 id="suggested-order-for-exports">Suggested Order for Exports</h2> +<ol> +<li>Freeze the application, so that others can not change the data at the moment (By external means, like closing a port forwarding)</li> +<li>Clean up the attachments</li> +<li>Look for duplicate identifiers and resolve conflicts (Important as duplicates do not get exported or imported)</li> +<li>Export the Users, Components, Attachment Infos and release links</li> +<li>copy the sw360attachments.couch, this might be a huge files</li> +</ol> +<h2 id="suggested-order-for-imports">Suggested Order for Imports</h2> +<h3 id="on-a-fresh-installation">On a fresh installation</h3> +<ol> +<li>Copy the sw360attachments.couch in its place</li> +<li>Start the licenses importer</li> +<li>restart the backend to make the design documents available and boot the frontend</li> +<li>Import the users</li> +<li>Import the component CSV</li> +<li>Import the Attachment Infos</li> +<li>Import the Release Link Infos.</li> +</ol> +<h3 id="regular-maintenance-operations">Regular Maintenance Operations</h3> +<ol> +<li>Run the attachments clean up</li> +<li>Resolve name crashes with the search for duplicate Identifiers</li> +</ol> +<h3 id="imports-on-a-running-instance">Imports on a running instance</h3> +<ol> +<li>New components can be imported via the CSV at any time. Duplicates to existing components will be ignored, but there is a log message.</li> +<li>Users can be added via CSV.</li> +<li>Release links can be added via CSV, duplicates overwrite existing links</li> +</ol> +<p>Attachments should not be imported on a running instance! +This should not break much, as without the entries in the couchDB there will be no import. +But potentially remote-only Attachments get deleted. +Nevertheless this scenario is not intended and maybe there are unforeseen side effects.</p> +<h2 id="troubleshooting">Troubleshooting</h2> +<h4 id="import-failing-in-the-backend-no-department">Import failing in the Backend: No Department</h4> +<p>The import fails with some error message that a user does not have a department?</p> +<ol> +<li>First of all, the importing admin requires a group assignment. Otherwise the adding component action will fail.</li> +<li>If a group is added to the admin, not that in addition to the Liferay group setting, this information must be also placed into the &ldquo;sw360users&rdquo; database in couchdb.</li> +<li>Note that changes to groups and similar things will require a restart of the Liferay server (=tomcat). Otherwise the user caching kicks in and might not reflect all updates.</li> +</ol> + + + + + + Docs: Importing + https://www.eclipse.org/sw360/docs/userguide/user-bdp-import/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/user-bdp-import/ + + + + <h1 id="how-to-import-projects-from-bdp-into-sw360">How to Import Projects from BDP into SW360</h1> +<p>This page explains how to import a project from BDP into SW360 via the SW360 UI.</p> +<h2 id="the-project-import-portlet">The Project Import Portlet</h2> +<p>In SW360, open the <code>Import Portlet</code> as follows:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/01_OpenImportPortlet.png" alt=""></p> +<p>Make sure that you do not leave the <code>Import Portlet</code> page during the connection, selection an import process.</p> +<p>On the left hand side, you see a mask to enter connection data for the BDP server:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/02_ImportPortlet.png" alt=""></p> +<p>Make sure, that the <code>Selected data source</code> is <code>BDP</code>. As <code>Server URL</code>, enter the domain of the BDP server. +Enter your user credentials for the BDP Server in <code>Server user</code> and <code>Password</code>, respectively. +Now, click <code>Connect</code> and the connection with the BDP Server is established. On the right hand side, you can view the projects +that are available to you on the BDP server.</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/03_ConnectionEstablished.png" alt=""></p> +<p>Select the projects that you want to import by clicking on the respective rows and click <code>Import</code>.</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/04_SelectProjects.png" alt=""></p> +<p>Click <code>Import</code> if you are content with the choice. Now, SW360 tries to import your selected projects. If everything went fine, you see:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/05_ImportSuccess.png" alt=""></p> +<p>The import might fail for some projects. The reason usually is that these projects have been imported earlier and already exist in SW360. +In this case, SW360 does not re-import or overwrite the project. But all new projects are still imported.</p> +<h2 id="inspecting-the-results">Inspecting the Results</h2> +<p>The imported <code>project</code>, <code>components</code> and <code>licenses</code> can be viewed in the <code>Projects Portlet</code>, <code>Components Portlet</code> or <code>License Portlet</code> respectively. +Note that a <code>component</code> in BDP becomes a <code>release</code> in SW360. To view such a release for example, first open the <code>Components Portlet</code> and click on the name of the component:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/06_SelectComponent.png" alt=""></p> +<p>Select <code>Release Overview</code> on the left hand side:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/07_SelectReleaseOverview.png" alt=""></p> +<p>Click on the <code>release version</code> to select a specific release:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/08_SelectRelease.png" alt=""></p> +<p>Now, you can view the release details:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/09_ReleaseDetails.png" alt=""></p> + + + + + + Docs: Liferay 7.3 and Java 11 + https://www.eclipse.org/sw360/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11/ + + + + <h2 id="introduction">Introduction</h2> +<p>We are covering the update for ubuntu here, because that is our main / agreed base system for running sw360. sw360 may run on a varienty of other linux distributions or OSes such as macosx, but in order to avoid problem we agreed on having a reference OS, which are the ubuntu long term releases.</p> +<p>With the update to Java 11, we upgraded from Ubuntu 16.04 to Ubuntu 18.04, both LTS version. This OS is used for example by the <a href="https://github.com/sw360/sw360vagrant">https://github.com/sw360/sw360vagrant</a> project.</p> +<p>So the update covers the following:</p> +<table> +<thead> +<tr> +<th>orign</th> +<th>target</th> +</tr> +</thead> +<tbody> +<tr> +<td>Ubuntu 16.04 LTS</td> +<td>Ubuntu 18.04 LTS</td> +</tr> +<tr> +<td>CoucbdDB 1.X (comes with Ubuntu)</td> +<td>CouchDB 2.X (not with Ubuntu anymore)</td> +</tr> +<tr> +<td>Postgresql 9.X (comes with Ubuntu)</td> +<td>Postgresql 10.X (comes with Ubuntu)</td> +</tr> +<tr> +<td>OpenJDK 8 (comes with Ubuntu)</td> +<td>openJDK 11 (comes with Ubuntu)</td> +</tr> +<tr> +<td>Apache Thrift 0.11/0.12</td> +<td>Apache Thrift 0.13</td> +</tr> +</tbody> +</table> +<h2 id="overview">Overview</h2> +<p>The upgrade consists of quite some tasks, as an overview:</p> +<ol> +<li>Make a backup</li> +<li>Execute sw360 migration scripts</li> +<li>Linux release upgrade</li> +<li>Java 11</li> +<li>Postgresql</li> +<li>CouchDB 2.X</li> +<li>Thrift to 0.13</li> +<li>Liferay ce 7.3.3</li> +<li>Copy your existing <code>portal-ext.properties</code> to now liferay_install location</li> +<li>copy from old liferay installation the <code>data/document_library</code> to the new liferay</li> +<li>Adjust <code>/etc/ini.d/tomcat</code> with path of new liferay</li> +<li>Adjust <code>$liferay_install</code> variable</li> +<li>add Java prerequisites to OSGi container</li> +<li>Update couchdb-lucene</li> +<li>Deploy new version of sw360</li> +<li>Adjust Liferay</li> +</ol> +<h2 id="initial-steps">Initial steps</h2> +<p>In order to &ldquo;calibrate the system&rdquo; just run the update / upgrade cycle once:</p> +<p><code># sudo apt update</code></p> +<p><code># sudo apt upgrade</code></p> +<h3 id="keeping-more-settings-files">Keeping More Settings Files</h3> +<p><strong>apache.conf:</strong> Keep also the mod security conf files that are asked to update during installation</p> +<p><strong>sshd:</strong> Changes on the ssh / sshd conf files should be kept in case you have setup up dome remote public private key login (usually the case for server installation). Otherwise you re locked out maybe.</p> +<p><strong>Maven:</strong> if you change Maven, for example with your proxy settings, keep it too.</p> +<p>In general, whenever there is functionality you need, consider keeping existing settings files.</p> +<h2 id="ubuntu-release-upgrade">Ubuntu Release Upgrade</h2> +<p>There is maybe the remark to overwrite the current apache configuration. We propose to keep the currently installed apache files.</p> +<p><code># sudo do-release-upgrade</code></p> +<p>Answer &ldquo;yes&rdquo; for the download of packages and also confirm the update of the glibc, of course. Update the <code>system.conf</code>(install maintainer&rsquo;s version), depending on if you actually edited this. Some for <code>sysctl.conf</code>.</p> +<h2 id="migration-of-postgresql">Migration of PostgreSQL</h2> +<p>The existing 9.5 will not be upgraded, instead this message comes: After the release upgrade, you can check again if postgresql is installed:</p> +<p><code>sudo apt list postgre* --installed</code></p> +<p>Postgresql 9.5 should be the only installed. The old postgresql 9.5 must stay in fact, because the migration tool needs to be executing on a running postgresql 9.5 instance. Just having popstgresql 10 and a database only from postgresql 9.5 will not work. You can go ahead install postgresql 10:</p> +<p><code>sudo apt install postgresql-10</code></p> +<p>Then, apply the instruction to update from 9.5 to 10.0 from this page: <a href="https://stackoverflow.com/questions/47029055/how-do-i-upgrade-my-postgresql-9-5-to-postgresql-10-on-ubuntu-16-04">https://stackoverflow.com/questions/47029055/how-do-i-upgrade-my-postgresql-9-5-to-postgresql-10-on-ubuntu-16-04</a></p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span># service postgresql stop +</span></span><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span># pg_dropcluster --stop 10 main +</span></span><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span># pg_upgradecluster -m upgrade 9.5 main +</span></span><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span># pg_dropcluster 9.5 main --stop +</span></span><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span># apt-get autoremove --purge postgresql-9.5 +</span></span><span style="display:flex;"><span>... +</span></span><span style="display:flex;"><span># service postgresql start +</span></span></code></pre></div><p>(note that # means you need to be root or execute with sudo)</p> +<h2 id="migration-of-couchdb">Migration of CouchDB</h2> +<p>CouchDB is not part of the Ubuntu package management anymore. Thus, you need to add the Apache CouchDb package repository to install it, first the key for signing:</p> +<p><code>curl -L https://couchdb.apache.org/repo/bintray-pubkey.asc | sudo apt-key add -</code></p> +<p>The add the repo to the sources:</p> +<p><code>echo &quot;deb https://apache.bintray.com/couchdb-deb bionic main&quot; | sudo tee -a /etc/apt/sources.list</code></p> +<p>Then, add its contents to the package database by updating apt:</p> +<p><code>sudo apt-get update -y</code></p> +<p>Ultimately install CouchDB, we tried with 2.1.2 initiall not to make a too far jump from 1.X, later versions may work as well. Note that for upgrading to CouchDB 3.X you would need an upgrade to 2.X first.</p> +<p><code>sudo apt-get install -y couchdb=2.1.2~bionic</code></p> +<p>The installer will ask a couple of questions:</p> +<ol> +<li>Bind address: for CouchDB and SW360 <code>127.0.0.1</code> (localhost) is a good bind address, if you would like to access the server from a remote computer because your sw360 runs as a server in the network, you would need to change accordingly.</li> +<li>Admin user: <strong>Warning</strong> The couchdb migration utility does not support authentication! Please do not enter an admin password, but apply it later. You can set the password for CouchDB in <code>couchdb.properties</code> and place it centrally in <code>/etc/sw360</code></li> +<li>Migration: yes you need to use <code>couchup</code> for migrating the databases</li> +</ol> +<p>In case you added an admin and need to remove it, try:</p> +<p><code>curl -X DELETE http://admin:password@127.0.0.1:5984/_config/admins/admin</code></p> +<p>where the two occurrences <code>admin</code> is the name of the admin user in the URL, whatever the user was called.</p> +<h3 id="migration-of-couchdb-databases">Migration of CouchDB Databases</h3> +<p>As a preparation: the CouchDB migration works by copying the databases, so the file system needs at least as much free space as the CouchDB databases use.</p> +<p>CouchDB offers a migration utility. It is advised that you remove all test databases as they do not seem to work with the migration utility. Important links are:</p> +<ul> +<li><a href="https://docs.couchdb.org/en/2.3.1/install/upgrading.html">https://docs.couchdb.org/en/2.3.1/install/upgrading.html</a></li> +<li><a href="https://github.com/apache/couchdb/pull/483">https://github.com/apache/couchdb/pull/483</a></li> +</ul> +<p>For some reason after installation, the <code>couchup</code>utility is not part of the path, so execute:</p> +<p><code>/opt/couchdb/bin/couchup list</code></p> +<p>It lists all DBs found. The go ahead with:</p> +<p><code>/opt/couchdb/bin/couchup replicate -a</code></p> +<p>It should replicate all databases in <code>/var/lib/couchdb</code>. Please refer to the couchup documentation, for the subsequent steps. A few remarks from our experience:</p> +<ol> +<li>The rebuold of the couchdb does not work for our test databases. Please refer to the documentation how to do this manually if you like.</li> +<li>The couchup utility crashes for large DB sizes with a time out error. Consider using the timeout option: <code>/opt/couchdb/bin/couchup replicate -a --timeout==10000</code> (with almost infinite timeout here)</li> +<li>On very large attachment database sizes (500GB), the couchdb configuration must be changed. We increased almost every related value by factor 10 (timeouts, memory, etc) in <code>/opt/couchdb/etc/default.ini</code> and good success with this.</li> +</ol> +<h2 id="update-thrift">Update Thrift</h2> +<p>For thrift, we need version 0.13. The installation script <code>scripts/install-thrift.sh</code>allows for uninstalling old versions:</p> +<p><code>sudo ./install-thrift.sh --uninstall</code></p> +<p>and then install</p> +<p><code>sudo ./install-thrift.sh</code></p> +<h2 id="from-openjdk-8-to-openjdk-11">From OpenJDK 8 to OpenJDK 11</h2> +<p>First check, what is installed.</p> +<p><code># sudo apt list openjdk* --installed</code></p> +<p>Then you could check what is available:</p> +<p><code># sudo apt list openjdk*</code></p> +<p>It should be that OpenJDK 8 is installed and both OpenJDK 8 and 11 are available. Then, remove the OpenJDK 8 and install 11:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo apt remove openjdk-8-jdk +</span></span><span style="display:flex;"><span>sudo apt remove openjdk-8-jre +</span></span><span style="display:flex;"><span>sudo apt remove openjdk-8-jdk-headless +</span></span><span style="display:flex;"><span>sudo apt remove openjdk-8-jre-headless +</span></span></code></pre></div><p>check if nothing is installed:</p> +<p><code># sudo apt list openjdk* --installed</code></p> +<p>Then install the openjdk-11-jdk:</p> +<p><code># sudo apt install openjdk-11-jdk</code></p> +<p>Then the <code>$JAVA_HOME</code> needs to be updated, most likely it is defined in <code>/etc/environment</code>. Please check for your installation how to set the <code>$JAVA_HOME</code> correctly.</p> +<h2 id="updating-liferay">Updating Liferay</h2> +<p>Download Liferay from this link</p> +<p><a href="https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.3.3%20GA4/liferay-ce-portal-tomcat-7.3.3-ga4-20200701015330959.tar.gz">https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.3.3%20GA4/liferay-ce-portal-tomcat-7.3.3-ga4-20200701015330959.tar.gz</a></p> +<p>and unpack it, ideally in the <code>/opt</code> directory, so resulting path would look like <code>liferay-ce-portal-7.3.3-ga4</code>.</p> +<p>Then, you need to update the <code>$LIFERAY_INSTALL</code> in <code>/etc/environment</code> from <code>LIFERAY_INSTALL=/opt/liferay-portal-7.2.0-ga1/ </code> to <code>LIFERAY_INSTALL=/opt/liferay-ce-portal-7.3.3-ga4</code>.</p> +<p>First, you will need to copy the <code>portal-ext.properties</code> from the old liferay folder to the new liferay folder (or new <code>$LIFERAY_HOME</code>):</p> +<p><code># cp /$old-liferay/portal-ext.properties $LIFERAY_INSTALL/portal-ext.properties</code></p> +<h3 id="migration-of-existing-database">Migration of existing database</h3> +<p>For a version upgrade from Liferay CE 7.2 to Liferay 7.3, migration scripts must be applied, they are located in <code>$LIFERAY_HOME/ tools/portal-tools-db-upgrade-client</code>. From there the following files needs to be adapted:</p> +<ul> +<li><code>app-server.properties</code>: most likely uncomment tomcat, because we re using liferay with tomcat.</li> +<li><code>portal-upgrade-database.properties</code>: uncomment postgresql section and add database user, default from installation is <code>liferay/liferay</code>, or it is stored in <code>portal-ext.properties</code> right where the JDBC driver is selected. Please note that your <code>portal-ext.properties</code> file in <code>$LIFERAY_INSTALL</code>can have the following line <code>include-and-override=/etc/sw360/portal-ext.properties</code>. In this case, consider the <code>portal-ext.properties</code>at that location.</li> +<li><code>portal-upgrade-ext.properties</code>: just the liferay home, you can leave it as it is</li> +</ul> +<p>If everything is done (and the postgresql migration took place), execute:</p> +<p><code># ./db_upgrade.sh</code></p> +<p>It should return a battery of <code>INFO</code> log level messages end with:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>Completed Liferay core upgrade process in 96 seconds +</span></span><span style="display:flex;"><span>Checking to see if all upgrades have completed... done. +</span></span></code></pre></div><h3 id="more-migration">More Migration</h3> +<p>The liferay migration covers apparently only the database, but not the files in the <code>$LIFERAY_HOME/data</code> folder. It would have been nicer, if that would have been covered too. Instead these must be copied manually. In fact, for the migration, it is advised to copy only the <code>/old-liferay/data/document_library</code> to the new location. Something like (different pwd &hellip;):</p> +<p><code># cp -r _attic/liferay-portal-7.2.1-ga2/data/document_library/ liferay-ce-portal-7.3.3-ga4/data/</code></p> +<h3 id="auto-start">Auto Start</h3> +<p>For auto start, you need an according init.d entry. It could be a file like <code>/etc/init.d/tomcat</code>. The file could be created if not there already, with the following contents:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#099">#!/bin/bash +</span></span></span><span style="display:flex;"><span><span style="color:#099"></span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic">### BEGIN INIT INFO</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Provides: tomcat7</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Required-Start: $network</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Required-Stop: $network</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Default-Start: 2 3 4 5</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Default-Stop: 0 1 6</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Short-Description: Start/Stop Tomcat server</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic">### END INIT INFO</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#033">PATH</span><span style="color:#555">=</span>/sbin:/bin:/usr/sbin:/usr/bin +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>start<span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/startup.sh +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>stop<span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/shutdown.sh +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">case</span> <span style="color:#033">$1</span> in +</span></span><span style="display:flex;"><span> start|stop<span style="color:#555">)</span> <span style="color:#033">$1</span>;; +</span></span><span style="display:flex;"><span> restart<span style="color:#555">)</span> stop; start;; +</span></span><span style="display:flex;"><span> *<span style="color:#555">)</span> <span style="color:#366">echo</span> <span style="color:#c30">&#34;Run as </span><span style="color:#033">$0</span><span style="color:#c30"> &lt;start|stop|restart&gt;&#34;</span>; <span style="color:#366">exit</span> 1;; +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">esac</span> +</span></span></code></pre></div><p>Te user <code>siemagrant</code> is used in the sw360vagrant project. it is the username of the user where the liefray / sw360 server runs under in vagrant. Regardless how the user is named, it is important that liferay runs under an unprivileged user (for security reasons).</p> +<h3 id="adjust-memory">Adjust Memory</h3> +<p>When you have downloaded the liferay distribution, Tomcat is likely configured with very basic memory settings. For trying sw360, the standard memory settings are OK. But of course, the memory settings in <code>$LIFERAY_HOME/tomcat-X.0.XX/bin/setenv.sh</code> should be adapted again.</p> +<h2 id="install-prerequisites">Install Prerequisites</h2> +<p>For old installations, libthrift is not there (which causes an error at container startup), it should be downloaded and deployed:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>wget https://repo1.maven.org/maven2/org/apache/thrift/libthrift/0.13.0/libthrift-0.13.0.jar +</span></span><span style="display:flex;"><span>mv libthrift-0.13.0.jar $LIFEARY_HOME/deploy/ +</span></span></code></pre></div><p>The the existing prerequisites needs to be copied from the <code>osgi/modules</code> from the old liferay installation:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>cp commons-lang-2.4.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp commons-io-2.6.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp commons-csv-1.4.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp commons-collections4-4.1.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp commons-codec-1.12.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp commons-logging-1.2.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp gson-2.8.5.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp guava-21.0.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp jackson-annotations-2.9.8.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp jackson-core-2.9.8.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span>cp jackson-databind-2.9.8.jar $LIFERAY_HOME/deploy +</span></span></code></pre></div><p>note that with the <a href="https://github.com/eclipse/sw360/commit/71348b4fffa6e3e5fd761a3f63590a0a60663827">commit</a> to sw360-13.0.0-M1 you need also another dependency for apache poi:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>cp commons-compress-1.20.jar $LIFERAY_HOME/deploy +</span></span></code></pre></div><h2 id="install-couchdb-lucene">Install Couchdb Lucene</h2> +<p>SW360 uses for searching the contents of the couchdb databases a lucene-based server named couchdb-lucene. The main thing is that it requires pathing for the use in the normal SW3360 setups. The reason for the patch is that the developers presume that couchdb-lucene runs as the only component in the application server, while in the sw360 setup, there is a setup in which couchdb-lucene runs along with other components in the same application container.</p> +<p>Start with downloading the couchdb-lucene and rename the archive so the resulting URL path element will be <code>couchdb-lucene</code>:</p> +<p><code>wget https://github.com/rnewson/couchdb-lucene/archive/v2.1.0.tar.gz ./couchdb-lucene.tar.gz</code></p> +<p>Please refer to the script in sw360vagrant how to apply the patch to couchdb-lucene:</p> +<p><a href="https://github.com/sw360/sw360vagrant/blob/master/shared/scripts/install-lucene.sh">https://github.com/sw360/sw360vagrant/blob/master/shared/scripts/install-lucene.sh</a></p> +<p>Please note that the patching issue is well known in the project and it is unclear why it is not merged:</p> +<ul> +<li><a href="https://github.com/rnewson/couchdb-lucene/issues/161">https://github.com/rnewson/couchdb-lucene/issues/161</a> &ldquo;allow context-root other than &ldquo;/&rdquo; when running in servlet container&rdquo;</li> +<li><a href="https://github.com/rnewson/couchdb-lucene/pull/162">https://github.com/rnewson/couchdb-lucene/pull/162</a></li> +<li><a href="https://github.com/rnewson/couchdb-lucene/pull/152">https://github.com/rnewson/couchdb-lucene/pull/152</a></li> +</ul> +<p>Now, for CouchDB 2.X the hook for integration of a search component has chaned compared to CouchDB 1.X. Accordingly, the old couchdb-lucene component must be replaced with the latest version.</p> +<h2 id="deploy-new-sw360">Deploy New SW360</h2> +<p>You will need to checkout new Java-11 based version of the SW360, which is either tagged version 11 or some few commits before that. Then build in the sw360 project root using:</p> +<p><code>mvn clean install -DskipTests</code></p> +<p>This will install new artfacts, such as lib-datahandler in your maven repostiory. Then apply in the same:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>mvn clean <span style="color:#069;font-weight:bold">package</span> <span style="color:#555">-</span>P deploy <span style="color:#555">-</span>Dbase.deploy.dir=. <span style="color:#555">-</span>Dliferay.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>deploy<span style="color:#555">/</span> <span style="color:#555">-</span>Dbackend.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>Drest.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>DskipTests +</span></span></code></pre></div><p>Skipping tests has the reason that usually, the sw360 is tested in the CI and thus, local tests are note necessary, if the code has not been changed locally. Note that the REST API documentation framework is based on building test cases and thus for deploying a version with REST API documentation, tests should be executed:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>cd rest +</span></span><span style="display:flex;"><span>mvn clean <span style="color:#069;font-weight:bold">package</span> <span style="color:#555">-</span>P deploy <span style="color:#555">-</span>Dbase.deploy.dir=. <span style="color:#555">-</span>Dliferay.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>deploy<span style="color:#555">/</span> <span style="color:#555">-</span>Dbackend.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>Drest.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> +</span></span></code></pre></div><h2 id="final-steps-in-liferay">Final Steps in Liferay</h2> +<p>Liferay CE 7.3 bring some changes that still require manually applied settings to the running liferay server. Thus, you could start the liferay server or just restart the entire machine. The following two things need to be adaptedin liferay after successful startup in order to get the migration done:</p> +<ol> +<li> +<p>The automatic verification of e-mail adresses maybe be needed to be switched off, because it kicks in also for existing users. This can be done in &ldquo;Control Panerl&rdquo; -&gt; &ldquo;Instance Settings&rdquo; -&gt; &ldquo;User Authentication&rdquo; -&gt; &quot;&quot;</p> +</li> +<li> +<p>The JavaScript components jquery and fontawesone (that come with liferay) must be manually enabled now. For this got into &ldquo;Control Panel&rdquo; -&gt; &ldquo;System Settings&rdquo; -&gt; &ldquo;Thrid Party&rdquo;. and from then select the two JavaScript components from the left and enable them accordingly.</p> +</li> +</ol> +<h2 id="known-issues">Known Issues</h2> +<h3 id="database-availability-right-after-update">Database Availability Right after Update</h3> +<p>Right after updating, the sw360 will not show up data at all, but sometimes nothing or &ldquo;portlet unavailable&rdquo;. The problem is the re-indexing of the DB and the search index which takes a while. You can trigger reindexing in the systems. A lazy way is call all (main) views so the database stumbles accross it and starts the indexing tasks (see job view in the couchdb admin interface of Futon). The sam eis for searches, the first searches will fail and the lucene will do some internal updates. leaving the system working for some time and follow the log will help. Could take 30 minutes.</p> +<h3 id="e-mail-verification-trap">E-Mail Verification Trap</h3> +<p>Liferay has automatically enabled password verification for all accounts right after migration. Not sure what motivates persons to enable such feature by default right after migration from an instance where it was not there? In case you have attached the system to an external login solution, but your liferay is not configured to send mails, then it is a trap, because you cannot verify the e-mail address and thus, cannot login. You need to disable the external login solution and use the original initial setup user to login (which is not asked for verification by e-mail) to disable this feature (see above).</p> + + + + + + Docs: Search + https://www.eclipse.org/sw360/docs/userguide/user-search/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/user-search/ + + + + <p><img src="https://github.com/eclipse/sw360/wiki/images/general-search.png" alt="general-search"></p> +<p>The user can use the general Search. He can find that under Search at the navigation bar. There he can choose, for what elements (Projects, Components, Releases, Licences, Users, Vendors) he wants to search. Therefore he toogle the elements which should be included in the search.</p> +<h3 id="wildcards">Wildcards</h3> +<p>The user can search with wildcards. A wildcard is a character which substitue for zero or more characters in a string. For a single character users can use &lsquo;?&rsquo; and for multiple character wildcard he can use &lsquo;*&rsquo;. The Wildcard can stand in the middle of characters or at the end, but not at the beginning.</p> +<h2 id="search-in-projects-components-and-licenses">Search in Projects, Components and Licenses</h2> +<p><img src="https://github.com/eclipse/sw360/wiki/images/navigationbar-search.png" alt="specific-search"></p> +<p>The user can use besides of the general search the specific search at the specific view of projects, components and licenses. There he has a Quickfilter and the Advanced Search where he has the option to search more refined.</p> +<h2 id="heading"></h2> +<p><img src="https://github.com/eclipse/sw360/wiki/images/sw360_specific_search.png"/><img src="https://github.com/eclipse/sw360/wiki/images/specific-search.png"/></p> +<h3 id="quickfilter">Quickfilter</h3> +<p>The Quickfilter let the user see the search result immediately when he starts typing. Therefore the Data has to be loaded. At the specific search for components, the user can choose under &rsquo;loading&rsquo; how much components sw360 should load. He can choose between the &lsquo;200 newest&rsquo; up to &lsquo;all&rsquo;. If the user did not use the quickfilter, it makes sense to set the loading option on 200 newest, so he does not unnecessarily slow down the site. <br> +At the specific search for projects, the user has the option to choose the group for the projects which should get loaded for the quick filter. If the user is just interested in the projects of his group, he should set the group to his group. So he does not load unnecessary projects every time he goes on the project site. Note that you cannot use wildcards for the quick search.</p> +<h3 id="advanced-search">Advanced Search</h3> +<p>The user has for components and projects the option to use the advanced search if he wants a more refined search. At the advanced search, the user can search for the different attributes projects or components have. For example, the user wants to search for all components which are for Linux; therefore he writes Linux in the field &lsquo;Operating System&rsquo; and click search. For the advanced search, the search result does not depend on the setting the user has chosen at the loading selection.</p> +<h3 id="export-spreadsheet">Export Spreadsheet</h3> +<p>With the Export Spreadsheet button at the bottom of the site, users can export the search result as a xlsx file (Excel). He can choose between a file with &lsquo;only components&rsquo; or &lsquo;components with releases&rsquo;. If he chooses &lsquo;only components&rsquo; he gets a file with just the Components and its attributes. If the user chooses the option &lsquo;with release&rsquo;, he will get all the release of the components with their attributes, for example the clearing state of releases, in the xlsx file.</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/Export-Spreadsheet.png" alt="Export-Spreadsheet"></p> + + + + + + Docs: Search Vulnerabilities + https://www.eclipse.org/sw360/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project/ + + + + <p>The CVE-Search service of SW360 checks for vulnerabilities that affect releases present in SW360. +The CVE-search service runs automatically at the time that has been scheduled by one of the <code>SW360-admins</code>. +Typically, this will happen at night. So, in the beginning, SW360 does not know any vulnerabilities for your project.</p> +<h2 id="vulnerabilites-in-the-project-portlet">Vulnerabilites in the Project Portlet</h2> +<p>After a CVE-search run has been finished, you can see the number of vulnerabilities associated with your project in the <code>Projects Portlet</code>. +To that end, open the <code>Projects Portlet</code> and click on your project:</p> +<p><img src="./images/UCVulnerabilitiesProject/01_SelectProject.png" alt=""></p> +<p>In the <code>Vulnerabilities tab</code> on the left hand side, you see the number of vulnerabilites that have been found for the releases that are directly linked +to your project. Actually, you see two numbers. The left number indicates how many vulnerabilities have not been evaluated or <code>rated</code> for this project yet. +Whenever this number is positive, the bullet surrounding the numbers will be red. Otherwise the bullet is grey.</p> +<p><img src="./images/UCVulnerabilitiesProject/02_NumberOfVulnerabilities.png" alt=""></p> +<h2 id="the-vulnerabilities-tab">The Vulnerabilities Tab</h2> +<p>To view (and to rate the vulnerabilities for the project), click on the <code>Vulnerabilities Tab</code>. A list of vulnerabilities occurs. Each vulnerability has been found +for one of the releases that are directly linked to your project. In the first column, you see the name of that release.</p> +<p><img src="./images/UCVulnerabilitiesProject/03_VulnerabilityListProject.png" alt=""></p> +<p>By clicking on the <code>external id</code> of a vulnerability, you can view the details of the vulnerability in the <code>Vulnerability Portlet</code>. +More details about the <code>Vulnerability Portlet</code> can be found <a href="https://github.com/eclipse/sw360/wiki/Doc-Vulnerability-Management#the-vulnerability-portlet">here</a>. +The column <code>Priority</code> contains no special information when using <code>CVE-Search</code>, it is used when importing vulnerability information from different sources. +In the column <code>Matched By</code>, you see the <code>distance</code> with which the vulnerability was found, and in the mouse-over the corresponding <code>needle</code> is displayed. +Below the table, you see a report about how many vulnerabilities in your project were found with which <code>distance</code> by <code>heuristics</code> and how many of them have been found by a <code>matching CPE</code> respectively. +For more details on <code>distances</code>, <code>matches</code> and <code>needles</code>, click <a href="https://github.com/eclipse/sw360/wiki/Doc-Vulnerability-Management#heuristics">here</a>. +In the column <code>Title</code>, the <code>External id</code> is repeated, and in the mouse-over, you can read the <code>description</code> of the vulnerability.</p> +<h2 id="evaluating-vulnerabilities-for-your-project">Evaluating Vulnerabilities for your Project</h2> +<p>If you are allowed to edit the project, you can also <code>rate</code> the relevance of the vulnerability for your project. In this case, the column <code>Relevance for project</code> contains +drop-down menus, where you can select a <code>rating</code> for each vulnerability (compare <a href="https://github.com/eclipse/sw360/wiki/Doc-Vulnerability-Management#vulnerability-rating-for-projects">here</a>). +To change the rating for a project, simply select a different value from the drop-down menu, enter a comment and click <code>OK</code>.</p> +<p><img src="./images/UCVulnerabilitiesProject/04_ChangeRating.png" alt=""></p> +<p>In order to update the number of checked and unchecked vulnerabilities in the bullet of the <code>Vulnerability tab</code>, you have to reload. +After that, you can also view the <code>history of rating changes</code> in the mouse-over of the corresponding vulnerability, +see also <a href="https://github.com/eclipse/sw360/wiki/Doc-Vulnerability-Management#change-history-for-vulnerability-ratings-and-verifications">here</a>.</p> +<p>You can also view the vulnerabilities associated with a <code>component</code> and those associated with a <code>release</code> in the <code>Components Portlet</code>. +CVE Search associates vulnerabilities with a release in SW360 based on the data that SW360 knows for that release. +For a <code>release</code>, a <code>security admin</code> or an <code>admin</code> can judge whether a vulnerability does indeed refer to the <code>release</code>. +Vulnerabilities that have been classified as <code>INCORRECT</code> by an <code>admin</code> or <code>security admin</code> are not displayed to <code>USERs</code> any more and therefore do not distort the picture for your project.</p> + + + + + + Docs: Security + https://www.eclipse.org/sw360/docs/deployment/deploy-secure-deployment/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-secure-deployment/ + + + + <p>After the basic installation, there are some following steps that should be considered for securing the deployment. The main issue that can be done upfront is the documentation of the involved components:</p> +<ul> +<li>Lifearay</li> +<li>Tomcat</li> +<li>Couchdb</li> +<li>Vagrant</li> +</ul> +<p>For vagrant it is important to understand how to close the provisioning users and not keep default usernames and passwords open.</p> +<p>Then for the applications, the following very first line measure should be considered:</p> +<ul> +<li> +<p>Change password of Liferay administrator user or check if that is appropriately secure.</p> +</li> +<li> +<p>You should check the permissions of the involved users in the user management in Liferay.</p> +</li> +<li> +<p>Assign individual passwords for users, also you could force the users to change their passwords at login if you like.</p> +</li> +<li> +<p>Besides the general advice to check the deployment instructions for the involved components, it is of particular interest to limit couchdb access from localhost only.</p> +</li> +<li> +<p>Also for Tomcat you limit port access from localhost only.</p> +</li> +<li> +<p>Do you need the ssh ports open or can you just go to the machine (physically).</p> +</li> +<li> +<p>Fix the admin party on couchdb</p> +</li> +<li> +<p>Add https access to couchdb</p> +</li> +<li> +<p>check that sw360 eyecuting user does not have sudo rights and config files for sw360 are <code>600</code> only for the executing user.</p> +</li> +</ul> +<p>Note that the Linux vagrant scripts applies somesecurity measures already on the OS level.</p> + + + + + + Docs: System Requirements + https://www.eclipse.org/sw360/docs/deployment/deploy-requirements/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/deploy-requirements/ + + + + <p>For deploying the SW360, there are the following hardware requirements below. Please note that the main memory consumer is the tomcat application container. Accordingly, this requires different settings (see <code>$TOMCAT_HOME/bin/setenv.sh</code>).</p> +<p>Please note that you can review the current memory situation of the application in the liferay administration section as well (see <code>Configuration</code>-&gt; <code>Server Administration</code>).</p> +<h2 id="hardware-and-infrastructure">Hardware and Infrastructure</h2> +<h3 id="cd-based-test-instances">CD-based test instances</h3> +<p>When there is a continuous deployment and continuous delivery directly deployed to machine the following machine is recommended:</p> +<ul> +<li>1 core</li> +<li>4GB RAM</li> +<li>40GB normal file system</li> +<li>10Mbit Ethernet link</li> +</ul> +<p>In this case, the sw360 solution runs fairly well for clicking around and creation of a few data sets. Note that Tomcat should have 2GB.</p> +<h3 id="staging-instances">Staging instances</h3> +<p>Testing and working with normal data sets for staging and pre-productive testing. Pre productive does not need to have the same execution speed of the machine, however, requires enough RAM and file system to run a clone on the data set.</p> +<ul> +<li>2 cores</li> +<li>8GB RAM</li> +<li>500GB normal file system</li> +<li>100Mbit Ethernet link</li> +</ul> +<p>The tomcat should be adjusted to 4GB RAM</p> +<h3 id="productive-instances">Productive instances</h3> +<p>Productive with for example: 10K releases, 2k users which deploys the entire solution onto a single larger machine. It does not apply to a docker based setup.</p> +<ul> +<li>4 cores</li> +<li>16GB RAM</li> +<li>500GB SSD based file system</li> +<li>1GBit link Ethernet link</li> +</ul> +<p>Tomcat should be adjusted to 10-12GB RAM. Note: normally, you could also run Tomcat with significantly lees RAM, if you put common dependencies in a shared lib folder.</p> +<h3 id="network">Network</h3> +<p>The following table shall give an overview about the inbound ports</p> +<table> +<thead> +<tr> +<th style="text-align:left">Port</th> +<th style="text-align:left">Service</th> +<th style="text-align:left">Remarks</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">443</td> +<td style="text-align:left">https</td> +<td style="text-align:left">Accessing the application</td> +</tr> +<tr> +<td style="text-align:left">22</td> +<td style="text-align:left">ssh</td> +<td style="text-align:left">Administering the application</td> +</tr> +<tr> +<td style="text-align:left">80</td> +<td style="text-align:left">http</td> +<td style="text-align:left">if you would like to access the solution over http</td> +</tr> +<tr> +<td style="text-align:left">5984/5985</td> +<td style="text-align:left">http/https</td> +<td style="text-align:left">if access to the couchdb (admin) interface is required</td> +</tr> +</tbody> +</table> +<p>Overview about the <em>additional</em> outbound ports:</p> +<table> +<thead> +<tr> +<th style="text-align:left">Port</th> +<th style="text-align:left">Service</th> +<th style="text-align:left">Remarks</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">3269</td> +<td style="text-align:left">sldap</td> +<td style="text-align:left">If you do authentication using secure LDAP</td> +</tr> +<tr> +<td style="text-align:left">443</td> +<td style="text-align:left">sldap</td> +<td style="text-align:left">If you do consume services over https (e.g. vulnerabilty pulling)</td> +</tr> +<tr> +<td style="text-align:left">53</td> +<td style="text-align:left">dns</td> +<td style="text-align:left">&hellip;</td> +</tr> +<tr> +<td style="text-align:left">22</td> +<td style="text-align:left">ssh</td> +<td style="text-align:left">the old way of calling a fossology server</td> +</tr> +</tbody> +</table> +<p>Outbound ports for http / https may be required for downloading system updates. Ports for ssh may not be required outbound.</p> +<h2 id="software">Software:</h2> +<p>As for the software, the sw360 can be run on many platforms, even on Windows seven. We have the following reference platform for development:</p> +<p>until 5:</p> +<ul> +<li>OpenJDK 8</li> +<li>Unbunu 16.04 LTS</li> +</ul> +<p>after 5:</p> +<ul> +<li>openjdk 8</li> +<li>ubuntu 18.04 LTS</li> +</ul> +<p>after 11:</p> +<ul> +<li>openjdk 11</li> +<li>ubuntu 18.04 LTS</li> +</ul> +<p>More information about requirements can be found here: <a href="https://github.com/sw360/sw360vagrant/wiki">https://github.com/sw360/sw360vagrant/wiki</a></p> + + + + + + Docs: Ubuntu 18.04 LTS, Java 11 + https://www.eclipse.org/sw360/docs/deployment/baremetal/deploy-natively-11/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/deployment/baremetal/deploy-natively-11/ + + + + <h2 id="introduction">Introduction</h2> +<p>We are covering the update for ubuntu 18.04 LTS here, because that is our main / agreed base system for running sw360. sw360 may run on a varienty of other linux distributions or OSes such as macosx, but in order to avoid problem we agreed on having a reference OS, which are the ubuntu long term releases. The author of this guide also uses macosx and homebrew which also works fairly well.</p> +<p>Please note that during the time, the dependencies are updated and the version info might change.</p> +<h2 id="overview">Overview</h2> +<p>The installation consists of quite some tasks, as an overview:</p> +<ol start="5"> +<li>Java 11</li> +<li>Postgresql, if we want to use it instead of hypersonic db</li> +<li>CouchDB 2.X at the time of starting this guide, but 3.1.X seems to work well</li> +<li>Thrift to 0.13, later updated to 0.14</li> +<li>Liferay CE 7.3.3 and 7.3.4 has been also tested</li> +<li>Adjust <code>/etc/ini.d/tomcat</code> with path of new liferay</li> +<li>Adjust <code>$liferay_install</code> variable</li> +<li>add Java prerequisites to OSGi container</li> +<li>Install couchdb-lucene (2.1)</li> +<li>Deploy new version of sw360</li> +<li>Go ahead with Liferay steps</li> +</ol> +<h2 id="initial-steps">Initial steps</h2> +<p>In order to &ldquo;calibrate the system&rdquo; just run the update / upgrade cycle once:</p> +<p><code># sudo apt update</code></p> +<p><code># sudo apt upgrade</code></p> +<h2 id="postgresql">PostgreSQL</h2> +<p>You can go ahead install postgresql 10:</p> +<p><code>sudo apt install postgresql-10</code></p> +<p>or whatever package version is suitable here, for example version 12 for ubuntu 20.04.</p> +<p>The configuration for Liferay will come later.</p> +<h2 id="couchdb">CouchDB</h2> +<p>CouchDB is not part of the Ubuntu package management anymore. Thus, you need to add the Apache CouchDB package repository to install it, first the key for signing:</p> +<p><code>curl -L https://couchdb.apache.org/repo/bintray-pubkey.asc | sudo apt-key add -</code></p> +<p>The add the repo to the sources:</p> +<p><code>echo &quot;deb https://apache.bintray.com/couchdb-deb bionic main&quot; | sudo tee -a /etc/apt/sources.list</code></p> +<p>Then, add its contents to the package database by updating apt:</p> +<p><code>sudo apt-get update -y</code></p> +<p>Ultimately install CouchDB, we tried with 2.1.2 install:</p> +<p><code>sudo apt-get install -y couchdb=2.1.2~bionic</code></p> +<p>The installer will ask a couple of questions:</p> +<ol> +<li>Bind address: for CouchDB and SW360 <code>127.0.0.1</code> (localhost) is a good bind address, if you would like to access the server from a remote computer because your sw360 runs as a server in the network, you would need to change accordingly.</li> +<li>Admin user: For fresh installation for sure a very good idea. You can set the password at sw360 for CouchDB in <code>couchdb.properties</code> and place it centrally in <code>/etc/sw360</code></li> +</ol> +<p>In case you added an admin accidentally and would like to remove it,</p> +<h2 id="thrift">Thrift</h2> +<p>For thrift, we need version 0.13. The installation script in <code>scripts/install-thrift.sh</code> will help you:</p> +<p><code>sudo ./install-thrift.sh</code></p> +<p>In case there is thrift in the package management of the OS you re running on, just make sure, you have version 0.13</p> +<h2 id="openjdk-11">OpenJDK 11</h2> +<p>First check, what is installed.</p> +<p><code># sudo apt list openjdk* --installed</code></p> +<p>Then you could check what is available:</p> +<p><code># sudo apt list openjdk*</code></p> +<p>And install OpenJDK 11</p> +<p><code># sudo apt install openjdk-11-jdk</code></p> +<p>Then the <code>$JAVA_HOME</code> needs to be updated, most likely in <code>/etc/environment</code>. Please check for your installation how to set the <code>$JAVA_HOME</code> correctly (most likely: <code>JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64</code>).</p> +<h2 id="liferay-ce-733">Liferay CE 7.3.3</h2> +<p>Download Liferay from this link</p> +<p><a href="https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.3.3%20GA4/liferay-ce-portal-tomcat-7.3.3-ga4-20200701015330959.tar.gz">https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.3.3%20GA4/liferay-ce-portal-tomcat-7.3.3-ga4-20200701015330959.tar.gz</a></p> +<p>and unpack it, ideally in the <code>/opt</code> directory, so resulting path would look like <code>/opt/liferay-ce-portal-7.3.3-ga4</code>.</p> +<p>Then, you need to update the <code>$LIFERAY_INSTALL</code> in <code>/etc/environment</code> from <code>LIFERAY_INSTALL=/opt/liferay-portal-7.2.0-ga1/ </code> to `LIFERAY_INSTALL=/opt/liferay-ce-portal-7.3.3-ga4.</p> +<h3 id="auto-start">Auto Start</h3> +<p>For auto start, you need an according init.d entry. It could be a file like <code>/etc/init.d/tomcat</code>. The file could be created if not there already, with the following contents:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#099">#!/bin/bash +</span></span></span><span style="display:flex;"><span><span style="color:#099"></span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic">### BEGIN INIT INFO</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Provides: tomcat7</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Required-Start: $network</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Required-Stop: $network</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Default-Start: 2 3 4 5</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Default-Stop: 0 1 6</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic"># Short-Description: Start/Stop Tomcat server</span> +</span></span><span style="display:flex;"><span><span style="color:#09f;font-style:italic">### END INIT INFO</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#033">PATH</span><span style="color:#555">=</span>/sbin:/bin:/usr/sbin:/usr/bin +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>start<span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/startup.sh +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>stop<span style="color:#555">()</span> <span style="color:#555">{</span> +</span></span><span style="display:flex;"><span> su -l siemagrant -c /opt/liferay-ce-portal-7.3.3-ga4/tomcat-9.0.33/bin/shutdown.sh +</span></span><span style="display:flex;"><span><span style="color:#555">}</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">case</span> <span style="color:#033">$1</span> in +</span></span><span style="display:flex;"><span> start|stop<span style="color:#555">)</span> <span style="color:#033">$1</span>;; +</span></span><span style="display:flex;"><span> restart<span style="color:#555">)</span> stop; start;; +</span></span><span style="display:flex;"><span> *<span style="color:#555">)</span> <span style="color:#366">echo</span> <span style="color:#c30">&#34;Run as </span><span style="color:#033">$0</span><span style="color:#c30"> &lt;start|stop|restart&gt;&#34;</span>; <span style="color:#366">exit</span> 1;; +</span></span><span style="display:flex;"><span><span style="color:#069;font-weight:bold">esac</span> +</span></span></code></pre></div><p>Te user <code>siemagrant</code> is used in the sw360vagrant project. it is the username of the user where the liefray / sw360 server should run under. In the ideal case, it is unprivileged user.</p> +<h3 id="adjust-memory">Adjust Memory</h3> +<p>When you have downloaded the liferay distribution, Tomcat is likely configured with very basic memory settings. For trying sw360, the standard memory settings are OK. But of course, the memory settings in <code>$LIFERAY_HOME/tomcat-X.0.XX/bin/setenv.sh</code> should be adapted again.</p> +<h3 id="postgresql-instead-of-hypersonic">PostgreSQL instead of Hypersonic</h3> +<p>Liferay CE comes with the hypersonic database. Just for making a long-term setup in the berginning, we are advising to use postgresql from the start. The settings for postgrsql can be found in <code>portal-ext.properties</code>. Please do not forget to create the user and the database in the database server first.</p> +<h2 id="install-prerequisites">Install Prerequisites</h2> +<p>There are some install libraries to be downloaded and installed as OSGi modules. You can check the download script from the sw360vaghrant project for list of URLs that help you.</p> +<p><a href="https://github.com/sw360/sw360vagrant/blob/master/download-packages.sh">https://github.com/sw360/sw360vagrant/blob/master/download-packages.sh</a></p> +<p>An URL for libtrift is:</p> +<p><a href="https://repo1.maven.org/maven2/org/apache/thrift/libthrift/0.13.0/libthrift-0.13.0.jar">https://repo1.maven.org/maven2/org/apache/thrift/libthrift/0.13.0/libthrift-0.13.0.jar</a></p> +<p>An URL for commons-compress is:</p> +<p><a href="https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.20/commons-compress-1.20.jar">https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.20/commons-compress-1.20.jar</a></p> +<p>If you have downloaded every thing, copy them to the <code>deploy</code> folder of your liferay installation:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span># cp libthrift-0.13.0.jar $LIFEARY_HOME/deploy/ +</span></span><span style="display:flex;"><span># cp commons-lang-2.4.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-io-2.6.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-csv-1.4.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-collections4-4.4.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-codec-1.12.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-compress-1.20.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp commons-logging-1.2.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp gson-2.8.5.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp guava-21.0.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp jackson-annotations-2.11.3.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp jackson-core-2.11.3.jar $LIFERAY_HOME/deploy +</span></span><span style="display:flex;"><span># cp jackson-databind-2.11.3.jar $LIFERAY_HOME/deploy +</span></span></code></pre></div><p>if you use PostgreSQL as your database, you need to install postgres.jar in Liferay.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span># wget https://jdbc.postgresql.org/download/postgresql-42.2.9.jar postgresql-42.2.9.jar +</span></span><span style="display:flex;"><span># cp postgresql-42.2.9.jar $LIFERAY_HOME/tomcat-9.0.33/lib/ext +</span></span></code></pre></div><p>[Note] In case you use other database with Liferay, you need to set other jar file of corresponding database.</p> +<h2 id="install-couchdb-lucene">Install Couchdb Lucene</h2> +<p>SW360 uses for searching the contents of the couchdb databases a lucene-based server named couchdb-lucene. The main issue here is that it requires a patch for the use in the normal SW3360 setups. The reason for the patch is that the developers presume that couchdb-lucene runs as the only component in the application server, while in the sw360 setup, there is a setup in which couchdb-lucene runs along with other components in the same application container.</p> +<p>Start with downloading the couchdb-lucene and rename the archive so the resulting URL path element will be <code>couchdb-lucene</code>:</p> +<p><code># wget https://github.com/rnewson/couchdb-lucene/archive/v2.1.0.tar.gz ./couchdb-lucene.tar.gz</code></p> +<p>Please refer to the script in sw360vagrant how to apply the patch to couchdb-lucene:</p> +<p><a href="https://github.com/sw360/sw360vagrant/blob/master/shared/scripts/install-lucene.sh">https://github.com/sw360/sw360vagrant/blob/master/shared/scripts/install-lucene.sh</a></p> +<p>Please note that the patching issue is well known in the project and it is unclear why it is not merged:</p> +<ul> +<li><a href="https://github.com/rnewson/couchdb-lucene/issues/161">https://github.com/rnewson/couchdb-lucene/issues/161</a> &ldquo;allow context-root other than &ldquo;/&rdquo; when running in servlet container&rdquo;</li> +<li><a href="https://github.com/rnewson/couchdb-lucene/pull/162">https://github.com/rnewson/couchdb-lucene/pull/162</a></li> +<li><a href="https://github.com/rnewson/couchdb-lucene/pull/152">https://github.com/rnewson/couchdb-lucene/pull/152</a></li> +</ul> +<h2 id="deploy-new-sw360">Deploy New SW360</h2> +<p>You will need to checkout new Java-11 based version of the SW360, which is either tagged version 11 (or later) or some few commits before that. Then build in the sw360 project root using:</p> +<p><code>mvn clean install -DskipTests</code></p> +<p>This will install new artfacts, such as lib-datahandler in your maven repostiory. Then apply in the same directory:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a00;background-color:#faa">#</span> mvn clean <span style="color:#069;font-weight:bold">package</span> <span style="color:#555">-</span>P deploy <span style="color:#555">-</span>Dbase.deploy.dir=. <span style="color:#555">-</span>Dliferay.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>deploy<span style="color:#555">/</span> <span style="color:#555">-</span>Dbackend.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>Drest.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>DskipTests +</span></span></code></pre></div><p>Skipping tests has the reason that usually, the sw360 is tested in the CI and thus, local tests are note necessary, if the code has not been changed locally. Note that the REST API documentation framework is based on building test cases and thus for deploying a version with REST API documentation, tests should be executed:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a00;background-color:#faa">#</span> cd rest +</span></span><span style="display:flex;"><span><span style="color:#a00;background-color:#faa">#</span> mvn clean <span style="color:#069;font-weight:bold">package</span> <span style="color:#555">-</span>P deploy <span style="color:#555">-</span>Dbase.deploy.dir=. <span style="color:#555">-</span>Dliferay.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>deploy<span style="color:#555">/</span> <span style="color:#555">-</span>Dbackend.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> <span style="color:#555">-</span>Drest.deploy.dir=<span style="color:#555">/</span>opt<span style="color:#555">/</span>liferay<span style="color:#555">-</span>ce<span style="color:#555">-</span>portal<span style="color:#555">-</span><span style="color:#f60">7.3.3</span><span style="color:#555">-</span>ga4<span style="color:#555">/</span>tomcat<span style="color:#555">-</span><span style="color:#f60">9.0.33</span><span style="color:#555">/</span>webapps<span style="color:#555">/</span> +</span></span></code></pre></div><h2 id="final-steps-in-liferay">Final Steps in Liferay</h2> +<p>Liferay CE 7.3 will need to have some manual steps applied in order to complete the setup. Unfortunately, these cannot be automated (if you know how, please let us know). For earlier versions of Liferay, please refer to the main wiki page. For Liferay CE 7.3.3 please continue here:</p> +<p><a href="https://github.com/eclipse/sw360/wiki/Deploy-Liferay7.3">https://github.com/eclipse/sw360/wiki/Deploy-Liferay7.3</a></p> + + + + + + diff --git a/docs/userguide/index.html b/docs/userguide/index.html new file mode 100644 index 0000000..8b79a66 --- /dev/null +++ b/docs/userguide/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + + + + + + + + + +User Guides | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

User Guides

+
SW360 User Guides
+ + +
+ + + + + + + + +
+ + +
+
+ Vulnerability Management +
+

SW360 Vulnerability Portlet

+
+ + +
+
+ Workflows +
+

SW360 User Workflows

+
+ + +
+
+ Attachment File Types +
+

+
+ + +
+
+ CVE-Search Scheduling +
+

How to schedule the CVE-Search Service

+
+ + +
+
+ Enumerations +
+

SW360 enumeration values for the internal thrift API

+
+ + +
+
+ Importing +
+

+
+ + +
+
+ Search +
+

SW360 General Search

+
+ + +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/userguide/index.xml b/docs/userguide/index.xml new file mode 100644 index 0000000..b152b6e --- /dev/null +++ b/docs/userguide/index.xml @@ -0,0 +1,986 @@ + + + Eclipse SW360 – User Guides + https://www.eclipse.org/sw360/docs/userguide/ + Recent content in User Guides on Eclipse SW360 + Hugo -- gohugo.io + + + + + + + + + + + Docs: Vulnerability Management + https://www.eclipse.org/sw360/docs/userguide/vulnerabilitymanagement/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/vulnerabilitymanagement/ + + + + <p>In the <code>vulnerability portlet</code>, you can view the vulnerabilites that are currently present in SW360 in more detail, independent of the release or project they apply to. Clicking on the top level entry <code>Vulnerabilities</code>, a table listing all vulnerabilities is shown:</p> +<p><img src="./images/vulnerabilityView.png" alt=""></p> +<p>Clicking on a vulnerability entry in the table, the details view of this vulnerability is shown.</p> +<p><img src="./images/vulnerabilityDetail.png" alt=""></p> +<p>The details view is also linked from the <code>vulnerabilities view</code> in the <code>project portlet</code> and <code>component and release portlet</code>, respectively.</p> +<h1 id="vulnerability-verification-for-releases">Vulnerability Verification for Releases</h1> +<p>Vulnerabilities automatically imported into SW360 - e.g. via the CVE search connection of SW360 - can be applicable for a release or not. The latter can happen, because release data in SW360 is incorrect or not complete. Then the CVE search service uses a more general search pattern yielding a lot of vulnerabilities, only some of which actually apply to the release. Therefore, in SW360 a vulnerability can be marked for a given release with one of the following <code>verification states</code>:</p> +<ol> +<li>NOT CHECKED</li> +<li>CHECKED</li> +<li>INCORRECT</li> +</ol> +<p>Only <code>admins</code> can mark a vulnerability or change the <code>verification state</code> and enter a comment to give reasons for the change. The verification state and the meta-information (when and by whom the verification state was changed and the comment) are stored as <code>VerificationStateInfo</code> at the appropriate <code>ReleaseVulnerabilityRelation</code>.</p> +<p>The <code>verification state</code> is displayed in the detail mode of a <code>release</code>, at <code>vulnerabilities</code> in the column <code>Verification</code> of the <code>vulnerability table</code>. User without <code>admin</code>-rights can only see the vulnerabilities that are <code>NOT CHECKED</code> or <code>CHECKED</code> together with a tooltip containing the meta-info. The <code>INCORRECT</code> vulnerabilities are hidden from users without admin rights in the release detail view and also in the component detail view and in the project detail view.</p> +<p>Admins see in the same table a dropdown menu, where they can adjust the state. An admin is shown all vulnerabilities belonging to a project, component or release, also those that are marked as <code>INCORRECT</code>.</p> +<p><img src="./images/releaseVulnerabilities.png" alt=""></p> +<h1 id="vulnerability-rating-for-projects">Vulnerability Rating for Projects</h1> +<p>In the detail view of a <code>project</code>, in the category <code>Vulnerabilites</code>, the vulnerabilities belonging to the linked releases of the project are shown. Such a vulnerability in the context of a certain project can be assigned one of the following <code>Ratings</code>:</p> +<ol> +<li>NOT CHECKED</li> +<li>IRRELEVANT</li> +<li>RESOLVED</li> +<li>APPLICABLE</li> +</ol> +<p>Those ratings are shown in the vulnerability table of the project details view. A user that has writing permission for the project can change the rating via a drop-down menu. If he changes the value, he is asked to enter a comment. The <code>VulnerabilityRating</code> together with the meta-data (who has changed the rating, date of change of the rating and comment) is stored in one database object <code>ProjectVulnerabilityRating</code> per project.</p> +<p>A user that has no writing permission on the project is shown the <code>Vulnerability Rating</code> in the table without the possibility to change the value.</p> +<p>The number of vulnerabilities for a project with rating <code>NOT CHECKED</code> is displayed in the bullet of the <code>Vulnerability</code> tab of the <code>project detail</code> view. The bullet is red if there are vulnerabilities with status <code>NOT CHECKED</code> for the project. In the example 7 of the 10 existing vulnerabilities are <code>NOT CHECKED</code>.</p> +<p><img src="./images/VulnerabilitiesBullet.png" alt=""></p> +<p><img src="./images/projectVulnerabilities.png" alt=""></p> +<h1 id="change-history-for-vulnerability-ratings-and-verifications">Change History for Vulnerability Ratings and Verifications</h1> +<p>The complete list of status changes for vulnerability ratings in the project portlet and for vulnerability verifications in the component portlet is shown when hovering with the mouse over the vulnerability rating/verification in the table. This is shown for the project vulnerability table in the picture below.</p> +<p><img src="./images/modifiedHistoryLayoutProjectVulnerabilities.png" alt=""></p> +<p>#CVE-Search</p> +<h2 id="automatic-update-of-vulnerabilities">Automatic update of vulnerabilities</h2> +<p>See this <a href="https://github.com/eclipse/sw360/wiki/Doc-Use-Case:-Scheduling-CVE-Search-by-Admins">use case</a>.</p> +<h2 id="heuristics">Heuristics</h2> +<p>All heuristics start by looking at the cpe. If the cpe is valid, i.e. start with the string &ldquo;cpe:&rdquo; and are longer then 10 chars, this is used for the search. If the search fails it falls back to the other search levels.</p> +<p>There are at the moment two different heuristics implemented which define how and in which order to search the cveSearch DB.</p> +<p>They can actually be combined, i.e. one could be the fallback of the other.</p> +<h3 id="guessing-heuristic-the-new-one">Guessing heuristic (the new one)</h3> +<p>The matching of vendor- and product-names is improved by using a lists of actual vendors resp. actual products of an vendor.</p> +<p>From the information given for a release, which is expected to be either of the form</p> +<ol> +<li>vendor=<code>&quot;VENDOR_NAME&quot;</code>, name=<code>&quot;PRODUCT_NAME&quot;</code> and a version or</li> +<li>vendor=<code>&quot;&quot;</code>, name=<code>&quot;VENDOR_NAME PRODUCT_NAME&quot;</code> and a version (as generated by the bdpimport).</li> +</ol> +<p>we try to find the best matches from the vendors list and then for these ones the best matches in their respective product lists. +The first run includes the version, and if no matching product with the correct version is found, a second run is made without the version restriction.</p> +<h5 id="modified-levenshtein-distance">Modified Levenshtein distance</h5> +<p>For the definition which matches are good we use a variation of the Levenshtein distance with some asymmetric modifications. In the following we will call the left side <strong>needle</strong> and the right side <strong>haystack</strong>. The <strong>needles</strong> will come from the lists and the <strong>haystack</strong> will be (parts of) the raw information extracted from the release. The defining rules are</p> +<ol> +<li>Our Levenshtein distance is equal to the regular Levenshtein distance, if the <strong>haystack</strong> does not contain any spaces.</li> +<li>Skipping a <strong>prefix ending with a space</strong> or of the <strong>haystack</strong> does not cost anything, i.e. does not increase the distance</li> +<li>Skipping a <strong>postfix starting with a space</strong> of the <strong>haystack</strong> does not cost anything, i.e. does not increase the distance</li> +<li>If either the <strong>needle</strong> or the <strong>haystack</strong> is empty, the distance is <code>Integer.MAX_VALUE</code></li> +</ol> +<p>This means that the string <code>&quot;needle&quot;</code> has</p> +<ul> +<li>distance 0 to itself, i.e. <code>&quot;needle&quot;</code></li> +<li>distance 0 to itself plus a postfix separated by a space, e.g. <code>&quot;needle postfix&quot;</code></li> +<li>distance 0 to itself plus a prefix separated by a space, e.g. <code>&quot;prefix needle&quot;</code></li> +<li>distance 2 to something which has regular distance of 2 surrounded by a prefix and a postfix which are separated by spaces, e.g. <code>&quot;prefix nedles postfix&quot;</code></li> +</ul> +<h5 id="configuration">Configuration</h5> +<p>The finetuning parameters can be configured by setting the following properties in <code>/etc/sw360/sw360.properties</code> or in the <code>configuration.yml</code></p> +<pre><code>cvesearch.default.vendor.threshold=1 +cvesearch.default.product.threshold=0 +cvesearch.default.cutoff=6 +</code></pre> +<h5 id="finetuning">Finetuning</h5> +<p>There are three variables which can be used for finetuning of the algorithm</p> +<ul> +<li><code>cutoff</code> (defaults to <code>Integer.MAX_VALUE</code>, i.e. no cutoff)</li> +<li><code>vendorThreshold</code> (defaults to <code>0</code>, i.e. no vendor threshold)</li> +<li><code>productThreshold</code> (defaults to <code>0</code>, i.e. no product threshold)</li> +</ul> +<h4 id="cons">Cons</h4> +<ul> +<li>is not able to find anything if no vendor but a unique product is given</li> +<li>many search queries</li> +<li>it will always try find the best match, e.g. also very bad matches, if cutoff is to large</li> +</ul> +<h3 id="display-how-a-vulnerability-was-found">Display How a Vulnerability was Found</h3> +<p>In the <code>vulnerability tables</code> of the <code>projects portlet</code> and the <code>component and release portlet</code> you can see, whether a vulnerability was found directly by the <code>CPE</code> or by <code>heuristics</code>. In the latter case, also the distance (and therefore the quality of the match with <code>0 = best possible match</code>) is displayed.</p> +<p><img src="./images/matchedBy.png" alt=""></p> +<p>In addition, below the <code>vulnerability tables</code> of the <code>projects portlet</code> and the <code>component and release portlet</code>, you can see the number of directly linked releases that was found by <code>CPE</code> or <code>heuristic</code>, respectively:</p> +<p><img src="./images/projectVulnerabilitiesWithStatisticsHighlighted.png" alt=""></p> +<h3 id="example-1-vendorapachenamemavenversion304">Example 1: <code>{vendor=&quot;Apache&quot;,name=&quot;Maven&quot;,version=&quot;3.0.4&quot;}</code></h3> +<h4 id="basic-heuristic">Basic heuristic</h4> +<p>This heuristic builds in the first step the correct needle +<code>cpe:2.3:.:.*apache.*maven.*3.0.4.*</code> and finds the cpe <code>cpe:2.3:a:apache:maven:3.0.4</code></p> +<h4 id="guessing-heuristic">Guessing heuristic</h4> +<p>The heuristic guesses the vendor <code>apache</code> and the product <code>maven</code>. Together with the version this results in the same cpe-needle <code>cpe:2.3:.:.*apache.*maven.*3.0.4.*</code>.</p> +<h3 id="example-2-vendornameapache-mavenversion304">Example 2: <code>{vendor=&quot;&quot;,name=&quot;Apache Maven&quot;,version=&quot;3.0.4&quot;}</code></h3> +<h4 id="basic-heuristic-1">Basic heuristic</h4> +<p>The first levels of this heuristic fails until the sixth level which does not use the vendor. The resulting needle is then <code>cpe:2.3:.:.*apache.*maven.*3.0.4.*</code> and finds the cpe <code>cpe:2.3:a:apache:maven:3.0.4</code></p> +<h4 id="guessing-heuristic-1">Guessing heuristic</h4> +<p>The heuristic guesses the vendor <code>apache</code> since it is a substring of <code>apache maven</code> and thus has distance <code>0</code>, the same is true for the productname <code>maven</code> which results in the same cpe-needle as above.</p> + + + + + + Docs: Workflows + https://www.eclipse.org/sw360/docs/userguide/workflows/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/workflows/ + + + + <p>This page is one of the basic user workflow documentation pages. It can give orientation how the sw360 can be used - as guidance or orientation. There is no particular need to follow these workflows, it is just one way. Workflows are shown as flow charts.</p> +<h3 id="create-component-and-release">Create Component and Release</h3> +<p>So, the user would like to create an entry for zlib-1.2.8 for example in sw360. The main thing to know (see page basic concepts)is that sw360 separates releases from components: the release is the zlib-1.2.8 but the component is the zlib. By this approach, components as a kind of container type in sw360, holding several releases.</p> +<p>Therefore, for a new component the user needs to create a component entry first, and then add a release to it. Just adding a release will not work. If a component with a different release already exists, the users add a release to the existing component.</p> +<p>The intended roles for this can be a developer that would like to start caring for an OSS component or release. In addition a project owner / project owner can care for the components and releases part of the product or process.</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images-workflow/worklfow-adding-component-and-release-to-a-project.png" alt="worklfow-adding-component-and-release-to-a-project"></p> +<h3 id="create-a-project">Create a Project</h3> +<p>A project is a structure to keep track on releases inside project, as well as other projects. Please note that a project can be also a product, depending on the type of business. the use of the term &lsquo;project&rsquo; is used also for subsuming the term &lsquo;product&rsquo;.</p> +<p>As for the integration case with the OSS software FOSSology, the project view allows for an overview, which of the used components have been analyzed with FOSSology already.</p> +<p>In the diagram, the &ldquo;clearing process&rdquo; is mentioned, because the clearing process affects the software components of a project. The main approach is the following:</p> +<ul> +<li>A project responsible sets up a project with used releases.</li> +<li>For the releases that were not analyzed before, the project responsible requests a clearing - source files can be transferred to FOSSology.</li> +<li>Once analyses for all releases are complete, the &ldquo;clearing process&rdquo; is finished for this project.</li> +</ul> +<p>A project it self does not need much information, it is just about the name and the version. Note that some of the information is like to be set at that time:</p> +<ul> +<li>Visibility level</li> +<li>Project contacts</li> +<li>Important Dates for the project</li> +</ul> +<p><img src="https://github.com/eclipse/sw360/wiki/images-workflow/workflow-add-project.png" alt="workflow-add-project"></p> +<h3 id="moderation">Moderation</h3> +<p>The moderation is the basic way of applying changes if the document is not created by someone else. In sw360 the following person can edit documents right away (without moderation request):</p> +<ul> +<li>The creator of a document (document is a project entry, a release entry etc)</li> +<li>Admins</li> +<li>Clearing admins</li> +<li>Moderators of this document</li> +<li>Other special roles, such as project responsible</li> +</ul> +<p>Please see the page <a href="https://github.com/eclipse/sw360/wiki/Dev-Role-Authorisation-Model">about the Role Authorization Model</a> for more information.</p> +<p>If the user who wishes to change a document and is not one of these, the moderator workflow kicks in. Then changes applied to the document are not really applied, but are sent to a moderator. Moderators are:</p> +<ul> +<li>The creator of a document (document is a project entry, a release entry etc)</li> +<li>Admins</li> +<li>Clearing admins</li> +<li>Moderators of this document</li> +</ul> +<p>The moderator can review, approve or decline the request. Then, the requesting user can delete the request. The moderator request workflow is shown below.</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images-workflow/workflow-moderation.png" alt="workflow-moderation"></p> + + + + + + Docs: Attachment File Types + https://www.eclipse.org/sw360/docs/userguide/user-attachment-file-types/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/user-attachment-file-types/ + + + + <p>SW360 maintains attachments for projects, components and releases. Currently, SW360 cannot automatically detect these types and is dependent on that users select the appropriate type accordingly. If not, some functionality will not properly kick of that uses such attachments.</p> +<p>Also, maybe some of the types are redundant by now and are just legacy ideas that should be reviewed after two years now.</p> +<p>In summary, the following the types currently are as follows:</p> +<table> +<thead> +<tr> +<th style="text-align:left">Type name</th> +<th style="text-align:left">Functionality</th> +<th style="text-align:left">Description</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">SOURCE</td> +<td style="text-align:left">for sending to tools</td> +<td style="text-align:left">Source packages of a release as found on the Internet</td> +</tr> +<tr> +<td style="text-align:left">COMPONENT_LICENSE_INFO_XML</td> +<td style="text-align:left">for project documentation generation</td> +<td style="text-align:left">An XML-based description of the licenses and coprights involved</td> +</tr> +<tr> +<td style="text-align:left">DESIGN</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Just nomenclature to name this not document</td> +</tr> +<tr> +<td style="text-align:left">REQUIREMENT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Just a general placeholder for an attachment</td> +</tr> +<tr> +<td style="text-align:left">DOCUMENT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Just a general placeholder for an attachment</td> +</tr> +<tr> +<td style="text-align:left">CLEARING_REPORT</td> +<td style="text-align:left">Setting clearing status</td> +<td style="text-align:left">Reporting information for component license state</td> +</tr> +<tr> +<td style="text-align:left">COMPONENT_LICENSE_INFO_COMBINED</td> +<td style="text-align:left">(should be) for project documentation generation</td> +<td style="text-align:left">Multiple components with component license information</td> +</tr> +<tr> +<td style="text-align:left">SCAN_RESULT_REPORT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Just description what scanners found without conclusions</td> +</tr> +<tr> +<td style="text-align:left">SCAN_RESULT_REPORT_XML</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Just description what scanners found without conclusions in XML</td> +</tr> +<tr> +<td style="text-align:left">SOURCE_SELF</td> +<td style="text-align:left">(should be) for sending to tools</td> +<td style="text-align:left">Source packages build self, because not available in the Internet</td> +</tr> +<tr> +<td style="text-align:left">BINARY</td> +<td style="text-align:left">future: for sending to tool doing binary analysis</td> +<td style="text-align:left">Binary from the publisher</td> +</tr> +<tr> +<td style="text-align:left">BINARY_SELF</td> +<td style="text-align:left">future: for sending to tool doing binary analysis</td> +<td style="text-align:left">Self built binary</td> +</tr> +<tr> +<td style="text-align:left">DECISION_REPORT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Decision information ref. the component</td> +</tr> +<tr> +<td style="text-align:left">LEGAL_EVALUATION</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Internally created legal evaluation</td> +</tr> +<tr> +<td style="text-align:left">LICENSE_AGREEMENT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">Document describing the license agreement</td> +</tr> +<tr> +<td style="text-align:left">SCREENSHOT</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">If licensing information is captured with screenshot</td> +</tr> +<tr> +<td style="text-align:left">OTHER</td> +<td style="text-align:left">n.a.</td> +<td style="text-align:left">If not document</td> +</tr> +</tbody> +</table> + + + + + + Docs: CVE-Search Scheduling + https://www.eclipse.org/sw360/docs/userguide/user-scheduling-cve-search-by-admins/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/user-scheduling-cve-search-by-admins/ + + + + <p>SW360 gets vulnerability information from an external provider of Common Vulnerability Enumeration (CVE) data. By default SW360 can connect to cve-search [https://www.circl.lu/services/cve-search/] which is either available as an online service [http://cve.circl.lu] or can be installed locally. For security and privacy reasons it is strongly advised to install a local cve-search service.</p> +<p>In what follows the synchronization between SW360 and the external CVE provider is described.</p> +<p><code>CveSearch-updates</code> can either be scheduled automatically when launching the <code>schedule-service</code> (e.g. when re/starting SW360) or it can be scheduled or unscheduled manually by an <code>SW360 admin</code>. +It is automatically scheduled with the start of the scheduling service, if in the <code>/resources/sw360.properties</code> file of the <code>schedule-service</code> in the backend, <code>cvesearchService</code> is mentioned in the <code>autostart</code>-property:</p> +<p><code>autostart = cvesearchService</code></p> +<p>According to the default settings, cveSearch is <em>not</em> auto-started with the scheduling service.</p> +<p>For manually scheduling the CVE search service, open the <code>Schedule Portlet</code> of the <code>Admin</code> menu. Note that the <code>Admin</code> menu is only visible to <code>SW360 admins</code>.</p> +<p><img src="./images/UCAdminScheduling/01_adminMenu.png" alt=""></p> +<p>In the <code>Schedule Portlet</code> of the <code>Admin</code> menu, a user with <code>admin</code> rights can turn on or off automatic updates of the cve-search service manually. +In the UI of the portlet, the admin can see whether or not the CVE-service is scheduled: if the service is scheduled, the <code>Schedule CveSearch Updates</code>-button is inactive, whereas the <code>Cancel Scheduled CveSearch Updates</code>-button is active and vice versa:</p> +<p><img src="./images/UCAdminScheduling/scheduleAdminPortlet.png" alt=""></p> +<p>The <code>offset</code> (first run of the update) and the <code>interval</code> between updates can also be adjusted in the <code>/resources/sw360.properties</code> file of the <code>src-schedule</code> service. +The corresponding properties are <code>schedule.cvesearch.firstOffset.seconds</code> and <code>schedule.cvesearch.interval.seconds</code>. +The <code>offset</code> has to be given in seconds since midnight and also the <code>interval</code> has to be entered in seconds. +The default is to update the vulnerabilities by CVEsearch every night at midnight, which corresponds to an offset of 0 and an interval of 24 hours (= 86400 seconds).</p> +<p><code>schedule.cvesearch.firstOffset.seconds = 0</code></p> +<p><code>schedule.cvesearch.interval.seconds = 86400</code></p> +<p>With automatic scheduling the next synchronization moment according to the <code>offset</code> and the <code>interval</code> is computed. This will be the first moment when a <code>cveSearch-update</code> is run. +There is nothing like an <code>initial run</code> when autostarting of manually scheduling the <code>CveSearch-updates</code>. +Moreover, the configuration, i.e. <code>offset</code>, <code>interval</code> and <code>next synchronization</code> (where the latter is a consequence of <code>offset</code> and <code> interval</code>) are shown in the portlet:</p> +<p><img src="./images/UCAdminScheduling/scheduleAdminPortletProperties.png" alt=""></p> +<h2 id="setup-of-a-local-instance">Setup of a local instance</h2> +<p>It is recommended to set up and use a local instance instead of the public cve-search instance. +The accompanying project sw360-chores contains a Dockerfile that can easily setup this service.</p> + + + + + + Docs: Enumerations + https://www.eclipse.org/sw360/docs/userguide/user-data-model-enumerations/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/user-data-model-enumerations/ + + + + <p>SW360 thrift API is comprised of the following methods:</p> +<ul> +<li>attachments</li> +<li>codescoop</li> +<li>components</li> +<li>cvesearch</li> +<li>fossology</li> +<li>importstatus</li> +<li>licenseinfo</li> +<li>licenses</li> +<li>moderation</li> +<li>projectimport</li> +<li>projects</li> +<li>schedule</li> +<li>search</li> +<li>sw360</li> +<li>users</li> +<li>vendors</li> +<li>vulnerabilities</li> +</ul> +<p>Reference: <a href="https://github.com/eclipse/sw360/tree/master/libraries/lib-datahandler/src/main/thrift">https://github.com/eclipse/sw360/tree/master/libraries/lib-datahandler/src/main/thrift</a></p> +<h2 id="attachments">Attachments</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/attachments.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/attachments.thrift</a></p> +<h3 id="attachmenttype">AttachmentType</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description.</th> +</tr> +</thead> +<tbody> +<tr> +<td>DOCUMENT</td> +<td>justa document</td> +</tr> +<tr> +<td>SOURCE</td> +<td>original course code</td> +</tr> +<tr> +<td>DESIGN</td> +<td>design document</td> +</tr> +<tr> +<td>REQUIREMENT</td> +<td>requirements document</td> +</tr> +<tr> +<td>CLEARING_REPORT</td> +<td>OSS licensing reporting</td> +</tr> +<tr> +<td>COMPONENT_LICENSE_INFO_XML</td> +<td>XML document with licenseing information - e.g. SPDX</td> +</tr> +<tr> +<td>COMPONENT_LICENSE_INFO_COMBINED</td> +<td>XML document with licensing information covering multiple componnts at once - e.g. SPDX</td> +</tr> +<tr> +<td>SCAN_RESULT_REPORT</td> +<td>Output what a scanner for licenses has found</td> +</tr> +<tr> +<td>SCAN_RESULT_REPORT_XML</td> +<td>Output what a scanner for licenses has found this time in XML</td> +</tr> +<tr> +<td>SOURCE_SELF</td> +<td>Self assembled source code distribution</td> +</tr> +<tr> +<td>BINARY</td> +<td>Binary of component from vendor</td> +</tr> +<tr> +<td>BINARY_SELF</td> +<td>Self built binary</td> +</tr> +<tr> +<td>DECISION_REPORT</td> +<td>documenting importing decisions for using this item</td> +</tr> +<tr> +<td>LEGAL_EVALUATION</td> +<td>Some legal evaluation created for this item</td> +</tr> +<tr> +<td>LICENSE_AGREEMENT</td> +<td>A ruling license agreement for this item, note that this could be for commercial software for example</td> +</tr> +<tr> +<td>SCREENSHOT</td> +<td>Screenshot, usually screenshot of the Website with licensing information</td> +</tr> +<tr> +<td>OTHER</td> +<td>anything that dos not match to the given above</td> +</tr> +</tbody> +</table> +<h3 id="checkstatus">CheckStatus</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description.</th> +</tr> +</thead> +<tbody> +<tr> +<td>NOTCHECKED</td> +<td>Default value after upload.</td> +</tr> +<tr> +<td>ACCEPTED</td> +<td>Reviewed and confirmed attachment.</td> +</tr> +<tr> +<td>REJECTED</td> +<td>Document or attachment cannot be used.</td> +</tr> +</tbody> +</table> +<h2 id="codescoop-thrift-file">CodeScoop Thrift File</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/codescoop.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/codescoop.thrift</a></p> +<h2 id="components">Components</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/components.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/components.thrift</a></p> +<h2 id="cvesearch">cvesearch</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/cvesearch.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/cvesearch.thrift</a></p> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>NEW</td> +<td>&hellip;</td> +</tr> +<tr> +<td>UPDATED</td> +<td>New information for a notification message, so it is updated</td> +</tr> +<tr> +<td>OLD</td> +<td>&hellip;</td> +</tr> +<tr> +<td>FAILED</td> +<td>&hellip;</td> +</tr> +</tbody> +</table> +<h2 id="fossology">Fossology</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/fossology.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/fossology.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="importstatus">Importstatus</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/importstatus.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/importstatus.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="license-info">License Info</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/licenseinfo.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/licenseinfo.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h3 id="licenseinforequeststatus">LicenseInfoRequestStatus</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>SUCCESS</td> +<td>&hellip;</td> +</tr> +<tr> +<td>NO_APPLICABLE_SOURCE</td> +<td>&hellip;</td> +</tr> +<tr> +<td>FAILURE</td> +<td>&hellip;</td> +</tr> +</tbody> +</table> +<h3 id="outputformatvariant">OutputFormatVariant</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>REPORT</td> +<td>&hellip;</td> +</tr> +<tr> +<td>DISCLOSURE</td> +<td>&hellip;</td> +</tr> +</tbody> +</table> +<h2 id="licenses">Licenses</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/licenses.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/licenses.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="moderation">Moderation</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/moderation.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/moderation.thrift</a></p> +<h3 id="documenttype">DocumentType</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>COMPONENT</td> +<td>&hellip;</td> +</tr> +<tr> +<td>RELEASE</td> +<td>&hellip;</td> +</tr> +<tr> +<td>PROJECT</td> +<td>&hellip;</td> +</tr> +<tr> +<td>LICENSE</td> +<td>&hellip;</td> +</tr> +<tr> +<td>USER</td> +<td>&hellip;</td> +</tr> +</tbody> +</table> +<h2 id="project-import">Project Import</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/projectimport.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/projectimport.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="projects">Projects</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/projects.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/projects.thrift</a></p> +<h3 id="project-state">Project State</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>ACTIVE</td> +<td><em>well</em></td> +</tr> +<tr> +<td>PHASE_OUT</td> +<td><em>well</em></td> +</tr> +<tr> +<td>UNKNOWN</td> +<td><em>well</em></td> +</tr> +</tbody> +</table> +<h3 id="project-type">Project Type</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>CUSTOMER</td> +<td>Project that delivers artifacts to customer outside organisation</td> +</tr> +<tr> +<td>INTERNAL</td> +<td>Project that provides artifacts or service for internal use</td> +</tr> +<tr> +<td>PRODUCT</td> +<td>Just that it is a product instead of a project</td> +</tr> +<tr> +<td>SERVICE</td> +<td>Project that provides services to customer outside organisation</td> +</tr> +<tr> +<td>INNER_SOURCE</td> +<td>Inner source project, meaning that everyone inside org can use it</td> +</tr> +</tbody> +</table> +<h3 id="project-relationship">Project Relationship</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>UNKNOWN</td> +<td><em>unknown</em></td> +</tr> +<tr> +<td>REFERRED</td> +<td>Sister project</td> +</tr> +<tr> +<td>CONTAINED</td> +<td>Sub project</td> +</tr> +<tr> +<td>DUPLICATE</td> +<td><em>duplicate</em></td> +</tr> +</tbody> +</table> +<h3 id="project-clearing-state">Project Clearing State</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>OPEN</td> +<td>not started</td> +</tr> +<tr> +<td>IN_PROGRESS</td> +<td>&hellip;</td> +</tr> +<tr> +<td>CLOSED</td> +<td>&hellip;</td> +</tr> +</tbody> +</table> +<h2 id="schedule">Schedule</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/schedule.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/schedule.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="search">Search</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/search.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/search.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="general-sw360-thrift">General SW360 Thrift</h2> +<h3 id="software-mainline-states">Software Mainline States</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>OPEN</td> +<td>Not decided so far</td> +</tr> +<tr> +<td>MAINLINE</td> +<td>Organisation or person thinks that use of this software is recommended, which included multiple versions.</td> +</tr> +<tr> +<td>SPECIFIC</td> +<td>The software is not recommended in general, but for special use case or for this particular version it is acceptable.</td> +</tr> +<tr> +<td>PHASE_OUT</td> +<td>The software has issues, please consider removing it soon, if in use.</td> +</tr> +<tr> +<td>DENIED</td> +<td>Software which is not allowed for use. For example, software that does not have licensing.</td> +</tr> +</tbody> +</table> +<h2 id="general-sw360-thrift-1">General SW360 Thrift</h2> +<h3 id="software-mainline-states-1">Software Mainline States</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description.</th> +</tr> +</thead> +<tbody> +<tr> +<td>OPEN</td> +<td>Not decided so far</td> +</tr> +<tr> +<td>MAINLINE</td> +<td>Organisation or person thinks that use of this software is recommended, which included multiple versions.</td> +</tr> +<tr> +<td>SPECIFIC</td> +<td>The software is not recommended in general, but for special use case or for this particular version it is acceptable.</td> +</tr> +<tr> +<td>PHASE_OUT</td> +<td>The software has issues, please consider removing it soon, if in use.</td> +</tr> +<tr> +<td>DENIED</td> +<td>Software which is not allowed for use. For example, software that does not have licensing.</td> +</tr> +</tbody> +</table> +<h3 id="moderation-states">Moderation States</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>PENDING</td> +<td>Not opened so far.</td> +</tr> +<tr> +<td>APPROVED</td> +<td>A person who has received the moderation request (which could be creator of the document, a clearing admin, a moderator, etc.) has approved the moderation request. It could be deleted then.</td> +</tr> +<tr> +<td>REJECTED</td> +<td>A person who has received the moderation request (which could be creator of the document, a clearing admin, a moderator, etc.) has rejected the moderation request.</td> +</tr> +<tr> +<td>INPROGRESS</td> +<td>A person who has received the moderation request (which could be creator of the document, a clearing admin, a moderator, etc.) has opened / viewed the moderation request, but did not decide.</td> +</tr> +</tbody> +</table> +<h3 id="visibility">Visibility</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>PRIVATE</td> +<td>Only visible by creator (and admin which applies to all visibility levels).</td> +</tr> +<tr> +<td>ME_AND_MODERATORS</td> +<td>Visible by creator and moderators.</td> +</tr> +<tr> +<td>BUISNESSUNIT_AND_MODERATORS</td> +<td>All users of the same group and the moderators.</td> +</tr> +<tr> +<td>EVERYONE</td> +<td>Every user who is logged into the system.</td> +</tr> +</tbody> +</table> +<h3 id="verification-state">Verification State</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>NOT_CHECKED</td> +<td>No one has yet looked at this and verified it.</td> +</tr> +<tr> +<td>CHECKED</td> +<td>It is verified.</td> +</tr> +<tr> +<td>INCORRECT</td> +<td>It was decided that the verification should be rejected.</td> +</tr> +</tbody> +</table> +<h3 id="release-relationship">Release Relationship</h3> +<table> +<thead> +<tr> +<th>Value</th> +<th>Description</th> +<th>Clearing releav nt</th> +</tr> +</thead> +<tbody> +<tr> +<td>CONTAINED</td> +<td>If you just do not know whether it is dynamically linked.</td> +<td>Yes</td> +</tr> +<tr> +<td>REFERRED</td> +<td>Referencing a stand alone used other part.</td> +<td>No</td> +</tr> +<tr> +<td>UNKNOWN</td> +<td>If you just do not know.</td> +<td>Yes</td> +</tr> +<tr> +<td>DYNAMICALLY_LINKED</td> +<td>Software dynamically linked - as the name says.</td> +<td>Yes</td> +</tr> +<tr> +<td>STATICALLY_LINKED</td> +<td>Software statically linked - as the name says.</td> +<td>Yes</td> +</tr> +<tr> +<td>SIDE_BY_SIDE</td> +<td>Not decided so far.</td> +<td>Yes</td> +</tr> +<tr> +<td>STANDALONE</td> +<td>Software is given as standalone delivery, ie. not technically connected.</td> +<td>Yes</td> +</tr> +<tr> +<td>INTERNAL_USE</td> +<td>Used for creating or building or ? the product or projects but not delivered.</td> +<td>Yes</td> +</tr> +<tr> +<td>OPTIONAL</td> +<td>Is not mandatory part of the installation.</td> +<td>Yes</td> +</tr> +<tr> +<td>TO_BE_REPLACED</td> +<td>Is there but should be moved out.</td> +<td>Yes</td> +</tr> +</tbody> +</table> +<h2 id="users">Users</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/users.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/users.thrift</a></p> +<h2 id="vendors">Vendors</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/vendors.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/vendors.thrift</a></p> +<p><em>No enumerations provided</em></p> +<h2 id="vulnerabilities">Vulnerabilities</h2> +<p><a href="https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/vulnerabilities.thrift">https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/vulnerabilities.thrift</a></p> +<p><em>No enumerations provided</em></p> + + + + + + Docs: Importing + https://www.eclipse.org/sw360/docs/userguide/user-bdp-import/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/user-bdp-import/ + + + + <h1 id="how-to-import-projects-from-bdp-into-sw360">How to Import Projects from BDP into SW360</h1> +<p>This page explains how to import a project from BDP into SW360 via the SW360 UI.</p> +<h2 id="the-project-import-portlet">The Project Import Portlet</h2> +<p>In SW360, open the <code>Import Portlet</code> as follows:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/01_OpenImportPortlet.png" alt=""></p> +<p>Make sure that you do not leave the <code>Import Portlet</code> page during the connection, selection an import process.</p> +<p>On the left hand side, you see a mask to enter connection data for the BDP server:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/02_ImportPortlet.png" alt=""></p> +<p>Make sure, that the <code>Selected data source</code> is <code>BDP</code>. As <code>Server URL</code>, enter the domain of the BDP server. +Enter your user credentials for the BDP Server in <code>Server user</code> and <code>Password</code>, respectively. +Now, click <code>Connect</code> and the connection with the BDP Server is established. On the right hand side, you can view the projects +that are available to you on the BDP server.</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/03_ConnectionEstablished.png" alt=""></p> +<p>Select the projects that you want to import by clicking on the respective rows and click <code>Import</code>.</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/04_SelectProjects.png" alt=""></p> +<p>Click <code>Import</code> if you are content with the choice. Now, SW360 tries to import your selected projects. If everything went fine, you see:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/05_ImportSuccess.png" alt=""></p> +<p>The import might fail for some projects. The reason usually is that these projects have been imported earlier and already exist in SW360. +In this case, SW360 does not re-import or overwrite the project. But all new projects are still imported.</p> +<h2 id="inspecting-the-results">Inspecting the Results</h2> +<p>The imported <code>project</code>, <code>components</code> and <code>licenses</code> can be viewed in the <code>Projects Portlet</code>, <code>Components Portlet</code> or <code>License Portlet</code> respectively. +Note that a <code>component</code> in BDP becomes a <code>release</code> in SW360. To view such a release for example, first open the <code>Components Portlet</code> and click on the name of the component:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/06_SelectComponent.png" alt=""></p> +<p>Select <code>Release Overview</code> on the left hand side:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/07_SelectReleaseOverview.png" alt=""></p> +<p>Click on the <code>release version</code> to select a specific release:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/08_SelectRelease.png" alt=""></p> +<p>Now, you can view the release details:</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/UCBDPImport/09_ReleaseDetails.png" alt=""></p> + + + + + + Docs: Search + https://www.eclipse.org/sw360/docs/userguide/user-search/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/user-search/ + + + + <p><img src="https://github.com/eclipse/sw360/wiki/images/general-search.png" alt="general-search"></p> +<p>The user can use the general Search. He can find that under Search at the navigation bar. There he can choose, for what elements (Projects, Components, Releases, Licences, Users, Vendors) he wants to search. Therefore he toogle the elements which should be included in the search.</p> +<h3 id="wildcards">Wildcards</h3> +<p>The user can search with wildcards. A wildcard is a character which substitue for zero or more characters in a string. For a single character users can use &lsquo;?&rsquo; and for multiple character wildcard he can use &lsquo;*&rsquo;. The Wildcard can stand in the middle of characters or at the end, but not at the beginning.</p> +<h2 id="search-in-projects-components-and-licenses">Search in Projects, Components and Licenses</h2> +<p><img src="https://github.com/eclipse/sw360/wiki/images/navigationbar-search.png" alt="specific-search"></p> +<p>The user can use besides of the general search the specific search at the specific view of projects, components and licenses. There he has a Quickfilter and the Advanced Search where he has the option to search more refined.</p> +<h2 id="heading"></h2> +<p><img src="https://github.com/eclipse/sw360/wiki/images/sw360_specific_search.png"/><img src="https://github.com/eclipse/sw360/wiki/images/specific-search.png"/></p> +<h3 id="quickfilter">Quickfilter</h3> +<p>The Quickfilter let the user see the search result immediately when he starts typing. Therefore the Data has to be loaded. At the specific search for components, the user can choose under &rsquo;loading&rsquo; how much components sw360 should load. He can choose between the &lsquo;200 newest&rsquo; up to &lsquo;all&rsquo;. If the user did not use the quickfilter, it makes sense to set the loading option on 200 newest, so he does not unnecessarily slow down the site. <br> +At the specific search for projects, the user has the option to choose the group for the projects which should get loaded for the quick filter. If the user is just interested in the projects of his group, he should set the group to his group. So he does not load unnecessary projects every time he goes on the project site. Note that you cannot use wildcards for the quick search.</p> +<h3 id="advanced-search">Advanced Search</h3> +<p>The user has for components and projects the option to use the advanced search if he wants a more refined search. At the advanced search, the user can search for the different attributes projects or components have. For example, the user wants to search for all components which are for Linux; therefore he writes Linux in the field &lsquo;Operating System&rsquo; and click search. For the advanced search, the search result does not depend on the setting the user has chosen at the loading selection.</p> +<h3 id="export-spreadsheet">Export Spreadsheet</h3> +<p>With the Export Spreadsheet button at the bottom of the site, users can export the search result as a xlsx file (Excel). He can choose between a file with &lsquo;only components&rsquo; or &lsquo;components with releases&rsquo;. If he chooses &lsquo;only components&rsquo; he gets a file with just the Components and its attributes. If the user chooses the option &lsquo;with release&rsquo;, he will get all the release of the components with their attributes, for example the clearing state of releases, in the xlsx file.</p> +<p><img src="https://github.com/eclipse/sw360/wiki/images/Export-Spreadsheet.png" alt="Export-Spreadsheet"></p> + + + + + + diff --git a/docs/userguide/user-attachment-file-types/index.html b/docs/userguide/user-attachment-file-types/index.html new file mode 100644 index 0000000..d8e3e2c --- /dev/null +++ b/docs/userguide/user-attachment-file-types/index.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + + + + + + + + + +Attachment File Types | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Attachment File Types

+ + +

SW360 maintains attachments for projects, components and releases. Currently, SW360 cannot automatically detect these types and is dependent on that users select the appropriate type accordingly. If not, some functionality will not properly kick of that uses such attachments.

+

Also, maybe some of the types are redundant by now and are just legacy ideas that should be reviewed after two years now.

+

In summary, the following the types currently are as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Type nameFunctionalityDescription
SOURCEfor sending to toolsSource packages of a release as found on the Internet
COMPONENT_LICENSE_INFO_XMLfor project documentation generationAn XML-based description of the licenses and coprights involved
DESIGNn.a.Just nomenclature to name this not document
REQUIREMENTn.a.Just a general placeholder for an attachment
DOCUMENTn.a.Just a general placeholder for an attachment
CLEARING_REPORTSetting clearing statusReporting information for component license state
COMPONENT_LICENSE_INFO_COMBINED(should be) for project documentation generationMultiple components with component license information
SCAN_RESULT_REPORTn.a.Just description what scanners found without conclusions
SCAN_RESULT_REPORT_XMLn.a.Just description what scanners found without conclusions in XML
SOURCE_SELF(should be) for sending to toolsSource packages build self, because not available in the Internet
BINARYfuture: for sending to tool doing binary analysisBinary from the publisher
BINARY_SELFfuture: for sending to tool doing binary analysisSelf built binary
DECISION_REPORTn.a.Decision information ref. the component
LEGAL_EVALUATIONn.a.Internally created legal evaluation
LICENSE_AGREEMENTn.a.Document describing the license agreement
SCREENSHOTn.a.If licensing information is captured with screenshot
OTHERn.a.If not document
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/userguide/user-bdp-import/index.html b/docs/userguide/user-bdp-import/index.html new file mode 100644 index 0000000..fcf94f3 --- /dev/null +++ b/docs/userguide/user-bdp-import/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + + + + + + + + +Importing | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Importing

+ + +

How to Import Projects from BDP into SW360

+

This page explains how to import a project from BDP into SW360 via the SW360 UI.

+

The Project Import Portlet

+

In SW360, open the Import Portlet as follows:

+

+

Make sure that you do not leave the Import Portlet page during the connection, selection an import process.

+

On the left hand side, you see a mask to enter connection data for the BDP server:

+

+

Make sure, that the Selected data source is BDP. As Server URL, enter the domain of the BDP server. +Enter your user credentials for the BDP Server in Server user and Password, respectively. +Now, click Connect and the connection with the BDP Server is established. On the right hand side, you can view the projects +that are available to you on the BDP server.

+

+

Select the projects that you want to import by clicking on the respective rows and click Import.

+

+

Click Import if you are content with the choice. Now, SW360 tries to import your selected projects. If everything went fine, you see:

+

+

The import might fail for some projects. The reason usually is that these projects have been imported earlier and already exist in SW360. +In this case, SW360 does not re-import or overwrite the project. But all new projects are still imported.

+

Inspecting the Results

+

The imported project, components and licenses can be viewed in the Projects Portlet, Components Portlet or License Portlet respectively. +Note that a component in BDP becomes a release in SW360. To view such a release for example, first open the Components Portlet and click on the name of the component:

+

+

Select Release Overview on the left hand side:

+

+

Click on the release version to select a specific release:

+

+

Now, you can view the release details:

+

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/userguide/user-data-model-enumerations/index.html b/docs/userguide/user-data-model-enumerations/index.html new file mode 100644 index 0000000..27ee011 --- /dev/null +++ b/docs/userguide/user-data-model-enumerations/index.html @@ -0,0 +1,1245 @@ + + + + + + + + + + + + + + + + + + + + +Enumerations | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Enumerations

+
SW360 enumeration values for the internal thrift API
+ +

SW360 thrift API is comprised of the following methods:

+
    +
  • attachments
  • +
  • codescoop
  • +
  • components
  • +
  • cvesearch
  • +
  • fossology
  • +
  • importstatus
  • +
  • licenseinfo
  • +
  • licenses
  • +
  • moderation
  • +
  • projectimport
  • +
  • projects
  • +
  • schedule
  • +
  • search
  • +
  • sw360
  • +
  • users
  • +
  • vendors
  • +
  • vulnerabilities
  • +
+

Reference: https://github.com/eclipse/sw360/tree/master/libraries/lib-datahandler/src/main/thrift

+

Attachments

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/attachments.thrift

+

AttachmentType

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription.
DOCUMENTjusta document
SOURCEoriginal course code
DESIGNdesign document
REQUIREMENTrequirements document
CLEARING_REPORTOSS licensing reporting
COMPONENT_LICENSE_INFO_XMLXML document with licenseing information - e.g. SPDX
COMPONENT_LICENSE_INFO_COMBINEDXML document with licensing information covering multiple componnts at once - e.g. SPDX
SCAN_RESULT_REPORTOutput what a scanner for licenses has found
SCAN_RESULT_REPORT_XMLOutput what a scanner for licenses has found this time in XML
SOURCE_SELFSelf assembled source code distribution
BINARYBinary of component from vendor
BINARY_SELFSelf built binary
DECISION_REPORTdocumenting importing decisions for using this item
LEGAL_EVALUATIONSome legal evaluation created for this item
LICENSE_AGREEMENTA ruling license agreement for this item, note that this could be for commercial software for example
SCREENSHOTScreenshot, usually screenshot of the Website with licensing information
OTHERanything that dos not match to the given above
+

CheckStatus

+ + + + + + + + + + + + + + + + + + + + + +
ValueDescription.
NOTCHECKEDDefault value after upload.
ACCEPTEDReviewed and confirmed attachment.
REJECTEDDocument or attachment cannot be used.
+

CodeScoop Thrift File

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/codescoop.thrift

+

Components

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/components.thrift

+

cvesearch

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/cvesearch.thrift

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
NEW
UPDATEDNew information for a notification message, so it is updated
OLD
FAILED
+

Fossology

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/fossology.thrift

+

No enumerations provided

+

Importstatus

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/importstatus.thrift

+

No enumerations provided

+

License Info

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/licenseinfo.thrift

+

No enumerations provided

+

LicenseInfoRequestStatus

+ + + + + + + + + + + + + + + + + + + + + +
ValueDescription
SUCCESS
NO_APPLICABLE_SOURCE
FAILURE
+

OutputFormatVariant

+ + + + + + + + + + + + + + + + + +
ValueDescription
REPORT
DISCLOSURE
+

Licenses

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/licenses.thrift

+

No enumerations provided

+

Moderation

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/moderation.thrift

+

DocumentType

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
COMPONENT
RELEASE
PROJECT
LICENSE
USER
+

Project Import

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/projectimport.thrift

+

No enumerations provided

+

Projects

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/projects.thrift

+

Project State

+ + + + + + + + + + + + + + + + + + + + + +
ValueDescription
ACTIVEwell
PHASE_OUTwell
UNKNOWNwell
+

Project Type

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
CUSTOMERProject that delivers artifacts to customer outside organisation
INTERNALProject that provides artifacts or service for internal use
PRODUCTJust that it is a product instead of a project
SERVICEProject that provides services to customer outside organisation
INNER_SOURCEInner source project, meaning that everyone inside org can use it
+

Project Relationship

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
UNKNOWNunknown
REFERREDSister project
CONTAINEDSub project
DUPLICATEduplicate
+

Project Clearing State

+ + + + + + + + + + + + + + + + + + + + + +
ValueDescription
OPENnot started
IN_PROGRESS
CLOSED
+

Schedule

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/schedule.thrift

+

No enumerations provided

+ +

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/search.thrift

+

No enumerations provided

+

General SW360 Thrift

+

Software Mainline States

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
OPENNot decided so far
MAINLINEOrganisation or person thinks that use of this software is recommended, which included multiple versions.
SPECIFICThe software is not recommended in general, but for special use case or for this particular version it is acceptable.
PHASE_OUTThe software has issues, please consider removing it soon, if in use.
DENIEDSoftware which is not allowed for use. For example, software that does not have licensing.
+

General SW360 Thrift

+

Software Mainline States

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription.
OPENNot decided so far
MAINLINEOrganisation or person thinks that use of this software is recommended, which included multiple versions.
SPECIFICThe software is not recommended in general, but for special use case or for this particular version it is acceptable.
PHASE_OUTThe software has issues, please consider removing it soon, if in use.
DENIEDSoftware which is not allowed for use. For example, software that does not have licensing.
+

Moderation States

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
PENDINGNot opened so far.
APPROVEDA person who has received the moderation request (which could be creator of the document, a clearing admin, a moderator, etc.) has approved the moderation request. It could be deleted then.
REJECTEDA person who has received the moderation request (which could be creator of the document, a clearing admin, a moderator, etc.) has rejected the moderation request.
INPROGRESSA person who has received the moderation request (which could be creator of the document, a clearing admin, a moderator, etc.) has opened / viewed the moderation request, but did not decide.
+

Visibility

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
PRIVATEOnly visible by creator (and admin which applies to all visibility levels).
ME_AND_MODERATORSVisible by creator and moderators.
BUISNESSUNIT_AND_MODERATORSAll users of the same group and the moderators.
EVERYONEEvery user who is logged into the system.
+

Verification State

+ + + + + + + + + + + + + + + + + + + + + +
ValueDescription
NOT_CHECKEDNo one has yet looked at this and verified it.
CHECKEDIt is verified.
INCORRECTIt was decided that the verification should be rejected.
+

Release Relationship

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescriptionClearing releav nt
CONTAINEDIf you just do not know whether it is dynamically linked.Yes
REFERREDReferencing a stand alone used other part.No
UNKNOWNIf you just do not know.Yes
DYNAMICALLY_LINKEDSoftware dynamically linked - as the name says.Yes
STATICALLY_LINKEDSoftware statically linked - as the name says.Yes
SIDE_BY_SIDENot decided so far.Yes
STANDALONESoftware is given as standalone delivery, ie. not technically connected.Yes
INTERNAL_USEUsed for creating or building or ? the product or projects but not delivered.Yes
OPTIONALIs not mandatory part of the installation.Yes
TO_BE_REPLACEDIs there but should be moved out.Yes
+

Users

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/users.thrift

+

Vendors

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/vendors.thrift

+

No enumerations provided

+

Vulnerabilities

+

https://github.com/eclipse/sw360/blob/master/libraries/lib-datahandler/src/main/thrift/vulnerabilities.thrift

+

No enumerations provided

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/userguide/user-scheduling-cve-search-by-admins/index.html b/docs/userguide/user-scheduling-cve-search-by-admins/index.html new file mode 100644 index 0000000..52fd7f4 --- /dev/null +++ b/docs/userguide/user-scheduling-cve-search-by-admins/index.html @@ -0,0 +1,643 @@ + + + + + + + + + + + + + + + + + + + + +CVE-Search Scheduling | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

CVE-Search Scheduling

+
How to schedule the CVE-Search Service
+ +

SW360 gets vulnerability information from an external provider of Common Vulnerability Enumeration (CVE) data. By default SW360 can connect to cve-search [https://www.circl.lu/services/cve-search/] which is either available as an online service [http://cve.circl.lu] or can be installed locally. For security and privacy reasons it is strongly advised to install a local cve-search service.

+

In what follows the synchronization between SW360 and the external CVE provider is described.

+

CveSearch-updates can either be scheduled automatically when launching the schedule-service (e.g. when re/starting SW360) or it can be scheduled or unscheduled manually by an SW360 admin. +It is automatically scheduled with the start of the scheduling service, if in the /resources/sw360.properties file of the schedule-service in the backend, cvesearchService is mentioned in the autostart-property:

+

autostart = cvesearchService

+

According to the default settings, cveSearch is not auto-started with the scheduling service.

+

For manually scheduling the CVE search service, open the Schedule Portlet of the Admin menu. Note that the Admin menu is only visible to SW360 admins.

+

+

In the Schedule Portlet of the Admin menu, a user with admin rights can turn on or off automatic updates of the cve-search service manually. +In the UI of the portlet, the admin can see whether or not the CVE-service is scheduled: if the service is scheduled, the Schedule CveSearch Updates-button is inactive, whereas the Cancel Scheduled CveSearch Updates-button is active and vice versa:

+

+

The offset (first run of the update) and the interval between updates can also be adjusted in the /resources/sw360.properties file of the src-schedule service. +The corresponding properties are schedule.cvesearch.firstOffset.seconds and schedule.cvesearch.interval.seconds. +The offset has to be given in seconds since midnight and also the interval has to be entered in seconds. +The default is to update the vulnerabilities by CVEsearch every night at midnight, which corresponds to an offset of 0 and an interval of 24 hours (= 86400 seconds).

+

schedule.cvesearch.firstOffset.seconds = 0

+

schedule.cvesearch.interval.seconds = 86400

+

With automatic scheduling the next synchronization moment according to the offset and the interval is computed. This will be the first moment when a cveSearch-update is run. +There is nothing like an initial run when autostarting of manually scheduling the CveSearch-updates. +Moreover, the configuration, i.e. offset, interval and next synchronization (where the latter is a consequence of offset and interval) are shown in the portlet:

+

+

Setup of a local instance

+

It is recommended to set up and use a local instance instead of the public cve-search instance. +The accompanying project sw360-chores contains a Dockerfile that can easily setup this service.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/userguide/user-search/index.html b/docs/userguide/user-search/index.html new file mode 100644 index 0000000..3e11671 --- /dev/null +++ b/docs/userguide/user-search/index.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + + + + + + + + +Search | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Search

+
SW360 General Search
+ +

general-search

+

The user can use the general Search. He can find that under Search at the navigation bar. There he can choose, for what elements (Projects, Components, Releases, Licences, Users, Vendors) he wants to search. Therefore he toogle the elements which should be included in the search.

+

Wildcards

+

The user can search with wildcards. A wildcard is a character which substitue for zero or more characters in a string. For a single character users can use ‘?’ and for multiple character wildcard he can use ‘*’. The Wildcard can stand in the middle of characters or at the end, but not at the beginning.

+

Search in Projects, Components and Licenses

+

specific-search

+

The user can use besides of the general search the specific search at the specific view of projects, components and licenses. There he has a Quickfilter and the Advanced Search where he has the option to search more refined.

+

+

+

Quickfilter

+

The Quickfilter let the user see the search result immediately when he starts typing. Therefore the Data has to be loaded. At the specific search for components, the user can choose under ’loading’ how much components sw360 should load. He can choose between the ‘200 newest’ up to ‘all’. If the user did not use the quickfilter, it makes sense to set the loading option on 200 newest, so he does not unnecessarily slow down the site.
+At the specific search for projects, the user has the option to choose the group for the projects which should get loaded for the quick filter. If the user is just interested in the projects of his group, he should set the group to his group. So he does not load unnecessary projects every time he goes on the project site. Note that you cannot use wildcards for the quick search.

+ +

The user has for components and projects the option to use the advanced search if he wants a more refined search. At the advanced search, the user can search for the different attributes projects or components have. For example, the user wants to search for all components which are for Linux; therefore he writes Linux in the field ‘Operating System’ and click search. For the advanced search, the search result does not depend on the setting the user has chosen at the loading selection.

+

Export Spreadsheet

+

With the Export Spreadsheet button at the bottom of the site, users can export the search result as a xlsx file (Excel). He can choose between a file with ‘only components’ or ‘components with releases’. If he chooses ‘only components’ he gets a file with just the Components and its attributes. If the user chooses the option ‘with release’, he will get all the release of the components with their attributes, for example the clearing state of releases, in the xlsx file.

+

Export-Spreadsheet

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/userguide/vulnerabilitymanagement/index.html b/docs/userguide/vulnerabilitymanagement/index.html new file mode 100644 index 0000000..f4f3b54 --- /dev/null +++ b/docs/userguide/vulnerabilitymanagement/index.html @@ -0,0 +1,748 @@ + + + + + + + + + + + + + + + + + + + + + +Vulnerability Management | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Vulnerability Management

+
SW360 Vulnerability Portlet
+ +

In the vulnerability portlet, you can view the vulnerabilites that are currently present in SW360 in more detail, independent of the release or project they apply to. Clicking on the top level entry Vulnerabilities, a table listing all vulnerabilities is shown:

+

+

Clicking on a vulnerability entry in the table, the details view of this vulnerability is shown.

+

+

The details view is also linked from the vulnerabilities view in the project portlet and component and release portlet, respectively.

+

Vulnerability Verification for Releases

+

Vulnerabilities automatically imported into SW360 - e.g. via the CVE search connection of SW360 - can be applicable for a release or not. The latter can happen, because release data in SW360 is incorrect or not complete. Then the CVE search service uses a more general search pattern yielding a lot of vulnerabilities, only some of which actually apply to the release. Therefore, in SW360 a vulnerability can be marked for a given release with one of the following verification states:

+
    +
  1. NOT CHECKED
  2. +
  3. CHECKED
  4. +
  5. INCORRECT
  6. +
+

Only admins can mark a vulnerability or change the verification state and enter a comment to give reasons for the change. The verification state and the meta-information (when and by whom the verification state was changed and the comment) are stored as VerificationStateInfo at the appropriate ReleaseVulnerabilityRelation.

+

The verification state is displayed in the detail mode of a release, at vulnerabilities in the column Verification of the vulnerability table. User without admin-rights can only see the vulnerabilities that are NOT CHECKED or CHECKED together with a tooltip containing the meta-info. The INCORRECT vulnerabilities are hidden from users without admin rights in the release detail view and also in the component detail view and in the project detail view.

+

Admins see in the same table a dropdown menu, where they can adjust the state. An admin is shown all vulnerabilities belonging to a project, component or release, also those that are marked as INCORRECT.

+

+

Vulnerability Rating for Projects

+

In the detail view of a project, in the category Vulnerabilites, the vulnerabilities belonging to the linked releases of the project are shown. Such a vulnerability in the context of a certain project can be assigned one of the following Ratings:

+
    +
  1. NOT CHECKED
  2. +
  3. IRRELEVANT
  4. +
  5. RESOLVED
  6. +
  7. APPLICABLE
  8. +
+

Those ratings are shown in the vulnerability table of the project details view. A user that has writing permission for the project can change the rating via a drop-down menu. If he changes the value, he is asked to enter a comment. The VulnerabilityRating together with the meta-data (who has changed the rating, date of change of the rating and comment) is stored in one database object ProjectVulnerabilityRating per project.

+

A user that has no writing permission on the project is shown the Vulnerability Rating in the table without the possibility to change the value.

+

The number of vulnerabilities for a project with rating NOT CHECKED is displayed in the bullet of the Vulnerability tab of the project detail view. The bullet is red if there are vulnerabilities with status NOT CHECKED for the project. In the example 7 of the 10 existing vulnerabilities are NOT CHECKED.

+

+

+

Change History for Vulnerability Ratings and Verifications

+

The complete list of status changes for vulnerability ratings in the project portlet and for vulnerability verifications in the component portlet is shown when hovering with the mouse over the vulnerability rating/verification in the table. This is shown for the project vulnerability table in the picture below.

+

+

#CVE-Search

+

Automatic update of vulnerabilities

+

See this use case.

+

Heuristics

+

All heuristics start by looking at the cpe. If the cpe is valid, i.e. start with the string “cpe:” and are longer then 10 chars, this is used for the search. If the search fails it falls back to the other search levels.

+

There are at the moment two different heuristics implemented which define how and in which order to search the cveSearch DB.

+

They can actually be combined, i.e. one could be the fallback of the other.

+

Guessing heuristic (the new one)

+

The matching of vendor- and product-names is improved by using a lists of actual vendors resp. actual products of an vendor.

+

From the information given for a release, which is expected to be either of the form

+
    +
  1. vendor="VENDOR_NAME", name="PRODUCT_NAME" and a version or
  2. +
  3. vendor="", name="VENDOR_NAME PRODUCT_NAME" and a version (as generated by the bdpimport).
  4. +
+

we try to find the best matches from the vendors list and then for these ones the best matches in their respective product lists. +The first run includes the version, and if no matching product with the correct version is found, a second run is made without the version restriction.

+
Modified Levenshtein distance
+

For the definition which matches are good we use a variation of the Levenshtein distance with some asymmetric modifications. In the following we will call the left side needle and the right side haystack. The needles will come from the lists and the haystack will be (parts of) the raw information extracted from the release. The defining rules are

+
    +
  1. Our Levenshtein distance is equal to the regular Levenshtein distance, if the haystack does not contain any spaces.
  2. +
  3. Skipping a prefix ending with a space or of the haystack does not cost anything, i.e. does not increase the distance
  4. +
  5. Skipping a postfix starting with a space of the haystack does not cost anything, i.e. does not increase the distance
  6. +
  7. If either the needle or the haystack is empty, the distance is Integer.MAX_VALUE
  8. +
+

This means that the string "needle" has

+
    +
  • distance 0 to itself, i.e. "needle"
  • +
  • distance 0 to itself plus a postfix separated by a space, e.g. "needle postfix"
  • +
  • distance 0 to itself plus a prefix separated by a space, e.g. "prefix needle"
  • +
  • distance 2 to something which has regular distance of 2 surrounded by a prefix and a postfix which are separated by spaces, e.g. "prefix nedles postfix"
  • +
+
Configuration
+

The finetuning parameters can be configured by setting the following properties in /etc/sw360/sw360.properties or in the configuration.yml

+
cvesearch.default.vendor.threshold=1
+cvesearch.default.product.threshold=0
+cvesearch.default.cutoff=6
+
+
Finetuning
+

There are three variables which can be used for finetuning of the algorithm

+
    +
  • cutoff (defaults to Integer.MAX_VALUE, i.e. no cutoff)
  • +
  • vendorThreshold (defaults to 0, i.e. no vendor threshold)
  • +
  • productThreshold (defaults to 0, i.e. no product threshold)
  • +
+

Cons

+
    +
  • is not able to find anything if no vendor but a unique product is given
  • +
  • many search queries
  • +
  • it will always try find the best match, e.g. also very bad matches, if cutoff is to large
  • +
+

Display How a Vulnerability was Found

+

In the vulnerability tables of the projects portlet and the component and release portlet you can see, whether a vulnerability was found directly by the CPE or by heuristics. In the latter case, also the distance (and therefore the quality of the match with 0 = best possible match) is displayed.

+

+

In addition, below the vulnerability tables of the projects portlet and the component and release portlet, you can see the number of directly linked releases that was found by CPE or heuristic, respectively:

+

+

Example 1: {vendor="Apache",name="Maven",version="3.0.4"}

+

Basic heuristic

+

This heuristic builds in the first step the correct needle +cpe:2.3:.:.*apache.*maven.*3.0.4.* and finds the cpe cpe:2.3:a:apache:maven:3.0.4

+

Guessing heuristic

+

The heuristic guesses the vendor apache and the product maven. Together with the version this results in the same cpe-needle cpe:2.3:.:.*apache.*maven.*3.0.4.*.

+

Example 2: {vendor="",name="Apache Maven",version="3.0.4"}

+

Basic heuristic

+

The first levels of this heuristic fails until the sixth level which does not use the vendor. The resulting needle is then cpe:2.3:.:.*apache.*maven.*3.0.4.* and finds the cpe cpe:2.3:a:apache:maven:3.0.4

+

Guessing heuristic

+

The heuristic guesses the vendor apache since it is a substring of apache maven and thus has distance 0, the same is true for the productname maven which results in the same cpe-needle as above.

+ +
+ + + + + + + + +
+ + +
+
+ Search Vulnerabilities +
+

How to Check for Vulnerabilities Affecting Your Project

+
+ + +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/userguide/vulnerabilitymanagement/index.xml b/docs/userguide/vulnerabilitymanagement/index.xml new file mode 100644 index 0000000..3ba7b86 --- /dev/null +++ b/docs/userguide/vulnerabilitymanagement/index.xml @@ -0,0 +1,64 @@ + + + Eclipse SW360 – Vulnerability Management + https://www.eclipse.org/sw360/docs/userguide/vulnerabilitymanagement/ + Recent content in Vulnerability Management on Eclipse SW360 + Hugo -- gohugo.io + + + + + + + + + + + Docs: Search Vulnerabilities + https://www.eclipse.org/sw360/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://www.eclipse.org/sw360/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project/ + + + + <p>The CVE-Search service of SW360 checks for vulnerabilities that affect releases present in SW360. +The CVE-search service runs automatically at the time that has been scheduled by one of the <code>SW360-admins</code>. +Typically, this will happen at night. So, in the beginning, SW360 does not know any vulnerabilities for your project.</p> +<h2 id="vulnerabilites-in-the-project-portlet">Vulnerabilites in the Project Portlet</h2> +<p>After a CVE-search run has been finished, you can see the number of vulnerabilities associated with your project in the <code>Projects Portlet</code>. +To that end, open the <code>Projects Portlet</code> and click on your project:</p> +<p><img src="./images/UCVulnerabilitiesProject/01_SelectProject.png" alt=""></p> +<p>In the <code>Vulnerabilities tab</code> on the left hand side, you see the number of vulnerabilites that have been found for the releases that are directly linked +to your project. Actually, you see two numbers. The left number indicates how many vulnerabilities have not been evaluated or <code>rated</code> for this project yet. +Whenever this number is positive, the bullet surrounding the numbers will be red. Otherwise the bullet is grey.</p> +<p><img src="./images/UCVulnerabilitiesProject/02_NumberOfVulnerabilities.png" alt=""></p> +<h2 id="the-vulnerabilities-tab">The Vulnerabilities Tab</h2> +<p>To view (and to rate the vulnerabilities for the project), click on the <code>Vulnerabilities Tab</code>. A list of vulnerabilities occurs. Each vulnerability has been found +for one of the releases that are directly linked to your project. In the first column, you see the name of that release.</p> +<p><img src="./images/UCVulnerabilitiesProject/03_VulnerabilityListProject.png" alt=""></p> +<p>By clicking on the <code>external id</code> of a vulnerability, you can view the details of the vulnerability in the <code>Vulnerability Portlet</code>. +More details about the <code>Vulnerability Portlet</code> can be found <a href="https://github.com/eclipse/sw360/wiki/Doc-Vulnerability-Management#the-vulnerability-portlet">here</a>. +The column <code>Priority</code> contains no special information when using <code>CVE-Search</code>, it is used when importing vulnerability information from different sources. +In the column <code>Matched By</code>, you see the <code>distance</code> with which the vulnerability was found, and in the mouse-over the corresponding <code>needle</code> is displayed. +Below the table, you see a report about how many vulnerabilities in your project were found with which <code>distance</code> by <code>heuristics</code> and how many of them have been found by a <code>matching CPE</code> respectively. +For more details on <code>distances</code>, <code>matches</code> and <code>needles</code>, click <a href="https://github.com/eclipse/sw360/wiki/Doc-Vulnerability-Management#heuristics">here</a>. +In the column <code>Title</code>, the <code>External id</code> is repeated, and in the mouse-over, you can read the <code>description</code> of the vulnerability.</p> +<h2 id="evaluating-vulnerabilities-for-your-project">Evaluating Vulnerabilities for your Project</h2> +<p>If you are allowed to edit the project, you can also <code>rate</code> the relevance of the vulnerability for your project. In this case, the column <code>Relevance for project</code> contains +drop-down menus, where you can select a <code>rating</code> for each vulnerability (compare <a href="https://github.com/eclipse/sw360/wiki/Doc-Vulnerability-Management#vulnerability-rating-for-projects">here</a>). +To change the rating for a project, simply select a different value from the drop-down menu, enter a comment and click <code>OK</code>.</p> +<p><img src="./images/UCVulnerabilitiesProject/04_ChangeRating.png" alt=""></p> +<p>In order to update the number of checked and unchecked vulnerabilities in the bullet of the <code>Vulnerability tab</code>, you have to reload. +After that, you can also view the <code>history of rating changes</code> in the mouse-over of the corresponding vulnerability, +see also <a href="https://github.com/eclipse/sw360/wiki/Doc-Vulnerability-Management#change-history-for-vulnerability-ratings-and-verifications">here</a>.</p> +<p>You can also view the vulnerabilities associated with a <code>component</code> and those associated with a <code>release</code> in the <code>Components Portlet</code>. +CVE Search associates vulnerabilities with a release in SW360 based on the data that SW360 knows for that release. +For a <code>release</code>, a <code>security admin</code> or an <code>admin</code> can judge whether a vulnerability does indeed refer to the <code>release</code>. +Vulnerabilities that have been classified as <code>INCORRECT</code> by an <code>admin</code> or <code>security admin</code> are not displayed to <code>USERs</code> any more and therefore do not distort the picture for your project.</p> + + + + + + diff --git a/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project/index.html b/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project/index.html new file mode 100644 index 0000000..ff849ea --- /dev/null +++ b/docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project/index.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + + + + + + + + +Search Vulnerabilities | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Search Vulnerabilities

+
How to Check for Vulnerabilities Affecting Your Project
+ +

The CVE-Search service of SW360 checks for vulnerabilities that affect releases present in SW360. +The CVE-search service runs automatically at the time that has been scheduled by one of the SW360-admins. +Typically, this will happen at night. So, in the beginning, SW360 does not know any vulnerabilities for your project.

+

Vulnerabilites in the Project Portlet

+

After a CVE-search run has been finished, you can see the number of vulnerabilities associated with your project in the Projects Portlet. +To that end, open the Projects Portlet and click on your project:

+

+

In the Vulnerabilities tab on the left hand side, you see the number of vulnerabilites that have been found for the releases that are directly linked +to your project. Actually, you see two numbers. The left number indicates how many vulnerabilities have not been evaluated or rated for this project yet. +Whenever this number is positive, the bullet surrounding the numbers will be red. Otherwise the bullet is grey.

+

+

The Vulnerabilities Tab

+

To view (and to rate the vulnerabilities for the project), click on the Vulnerabilities Tab. A list of vulnerabilities occurs. Each vulnerability has been found +for one of the releases that are directly linked to your project. In the first column, you see the name of that release.

+

+

By clicking on the external id of a vulnerability, you can view the details of the vulnerability in the Vulnerability Portlet. +More details about the Vulnerability Portlet can be found here. +The column Priority contains no special information when using CVE-Search, it is used when importing vulnerability information from different sources. +In the column Matched By, you see the distance with which the vulnerability was found, and in the mouse-over the corresponding needle is displayed. +Below the table, you see a report about how many vulnerabilities in your project were found with which distance by heuristics and how many of them have been found by a matching CPE respectively. +For more details on distances, matches and needles, click here. +In the column Title, the External id is repeated, and in the mouse-over, you can read the description of the vulnerability.

+

Evaluating Vulnerabilities for your Project

+

If you are allowed to edit the project, you can also rate the relevance of the vulnerability for your project. In this case, the column Relevance for project contains +drop-down menus, where you can select a rating for each vulnerability (compare here). +To change the rating for a project, simply select a different value from the drop-down menu, enter a comment and click OK.

+

+

In order to update the number of checked and unchecked vulnerabilities in the bullet of the Vulnerability tab, you have to reload. +After that, you can also view the history of rating changes in the mouse-over of the corresponding vulnerability, +see also here.

+

You can also view the vulnerabilities associated with a component and those associated with a release in the Components Portlet. +CVE Search associates vulnerabilities with a release in SW360 based on the data that SW360 knows for that release. +For a release, a security admin or an admin can judge whether a vulnerability does indeed refer to the release. +Vulnerabilities that have been classified as INCORRECT by an admin or security admin are not displayed to USERs any more and therefore do not distort the picture for your project.

+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/userguide/workflows/index.html b/docs/userguide/workflows/index.html new file mode 100644 index 0000000..0f1cf69 --- /dev/null +++ b/docs/userguide/workflows/index.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + + + + + + + + + +Workflows | Eclipse SW360 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ + +
+ + + + + +
+

Workflows

+
SW360 User Workflows
+ +

This page is one of the basic user workflow documentation pages. It can give orientation how the sw360 can be used - as guidance or orientation. There is no particular need to follow these workflows, it is just one way. Workflows are shown as flow charts.

+

Create Component and Release

+

So, the user would like to create an entry for zlib-1.2.8 for example in sw360. The main thing to know (see page basic concepts)is that sw360 separates releases from components: the release is the zlib-1.2.8 but the component is the zlib. By this approach, components as a kind of container type in sw360, holding several releases.

+

Therefore, for a new component the user needs to create a component entry first, and then add a release to it. Just adding a release will not work. If a component with a different release already exists, the users add a release to the existing component.

+

The intended roles for this can be a developer that would like to start caring for an OSS component or release. In addition a project owner / project owner can care for the components and releases part of the product or process.

+

worklfow-adding-component-and-release-to-a-project

+

Create a Project

+

A project is a structure to keep track on releases inside project, as well as other projects. Please note that a project can be also a product, depending on the type of business. the use of the term ‘project’ is used also for subsuming the term ‘product’.

+

As for the integration case with the OSS software FOSSology, the project view allows for an overview, which of the used components have been analyzed with FOSSology already.

+

In the diagram, the “clearing process” is mentioned, because the clearing process affects the software components of a project. The main approach is the following:

+
    +
  • A project responsible sets up a project with used releases.
  • +
  • For the releases that were not analyzed before, the project responsible requests a clearing - source files can be transferred to FOSSology.
  • +
  • Once analyses for all releases are complete, the “clearing process” is finished for this project.
  • +
+

A project it self does not need much information, it is just about the name and the version. Note that some of the information is like to be set at that time:

+
    +
  • Visibility level
  • +
  • Project contacts
  • +
  • Important Dates for the project
  • +
+

workflow-add-project

+

Moderation

+

The moderation is the basic way of applying changes if the document is not created by someone else. In sw360 the following person can edit documents right away (without moderation request):

+
    +
  • The creator of a document (document is a project entry, a release entry etc)
  • +
  • Admins
  • +
  • Clearing admins
  • +
  • Moderators of this document
  • +
  • Other special roles, such as project responsible
  • +
+

Please see the page about the Role Authorization Model for more information.

+

If the user who wishes to change a document and is not one of these, the moderator workflow kicks in. Then changes applied to the document are not really applied, but are sent to a moderator. Moderators are:

+
    +
  • The creator of a document (document is a project entry, a release entry etc)
  • +
  • Admins
  • +
  • Clearing admins
  • +
  • Moderators of this document
  • +
+

The moderator can review, approve or decline the request. Then, the requesting user can delete the request. The moderator request workflow is shown below.

+

workflow-moderation

+ +
+ + + + + + + + + +
+ + + +
+ Last modified June 22, 2022: SW360 website remodeling (#9) (032e0f6) +
+ +
+ +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/userguide/workflows/index.xml b/docs/userguide/workflows/index.xml new file mode 100644 index 0000000..b6257d3 --- /dev/null +++ b/docs/userguide/workflows/index.xml @@ -0,0 +1,17 @@ + + + Eclipse SW360 – Workflows + https://www.eclipse.org/sw360/docs/userguide/workflows/ + Recent content in Workflows on Eclipse SW360 + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/favicons/android-144x144.png b/favicons/android-144x144.png new file mode 100644 index 0000000..3c59520 Binary files /dev/null and b/favicons/android-144x144.png differ diff --git a/favicons/android-192x192.png b/favicons/android-192x192.png new file mode 100644 index 0000000..304478e Binary files /dev/null and b/favicons/android-192x192.png differ diff --git a/favicons/android-36x36.png b/favicons/android-36x36.png new file mode 100644 index 0000000..556c58f Binary files /dev/null and b/favicons/android-36x36.png differ diff --git a/favicons/android-48x48.png b/favicons/android-48x48.png new file mode 100644 index 0000000..9ba2273 Binary files /dev/null and b/favicons/android-48x48.png differ diff --git a/favicons/android-72x72.png b/favicons/android-72x72.png new file mode 100644 index 0000000..8e7561f Binary files /dev/null and b/favicons/android-72x72.png differ diff --git a/favicons/android-96x96.png b/favicons/android-96x96.png new file mode 100644 index 0000000..fac53cd Binary files /dev/null and b/favicons/android-96x96.png differ diff --git a/favicons/android-chrome-192x192.png b/favicons/android-chrome-192x192.png new file mode 100644 index 0000000..304478e Binary files /dev/null and b/favicons/android-chrome-192x192.png differ diff --git a/favicons/android-chrome-512x512.png b/favicons/android-chrome-512x512.png new file mode 100644 index 0000000..b52b779 Binary files /dev/null and b/favicons/android-chrome-512x512.png differ diff --git a/favicons/android-chrome-maskable-192x192.png b/favicons/android-chrome-maskable-192x192.png new file mode 100644 index 0000000..5a5de36 Binary files /dev/null and b/favicons/android-chrome-maskable-192x192.png differ diff --git a/favicons/android-chrome-maskable-512x512.png b/favicons/android-chrome-maskable-512x512.png new file mode 100644 index 0000000..f52e86c Binary files /dev/null and b/favicons/android-chrome-maskable-512x512.png differ diff --git a/favicons/apple-touch-icon-120x120.png b/favicons/apple-touch-icon-120x120.png new file mode 100644 index 0000000..7f87882 Binary files /dev/null and b/favicons/apple-touch-icon-120x120.png differ diff --git a/favicons/apple-touch-icon-152x152.png b/favicons/apple-touch-icon-152x152.png new file mode 100644 index 0000000..7e74a5c Binary files /dev/null and b/favicons/apple-touch-icon-152x152.png differ diff --git a/favicons/apple-touch-icon-167x167.png b/favicons/apple-touch-icon-167x167.png new file mode 100644 index 0000000..6e8f592 Binary files /dev/null and b/favicons/apple-touch-icon-167x167.png differ diff --git a/favicons/apple-touch-icon-180x180.png b/favicons/apple-touch-icon-180x180.png new file mode 100644 index 0000000..03d0b51 Binary files /dev/null and b/favicons/apple-touch-icon-180x180.png differ diff --git a/favicons/apple-touch-icon-60x60.png b/favicons/apple-touch-icon-60x60.png new file mode 100644 index 0000000..0b8eabd Binary files /dev/null and b/favicons/apple-touch-icon-60x60.png differ diff --git a/favicons/apple-touch-icon-76x76.png b/favicons/apple-touch-icon-76x76.png new file mode 100644 index 0000000..65cce89 Binary files /dev/null and b/favicons/apple-touch-icon-76x76.png differ diff --git a/favicons/apple-touch-icon.png b/favicons/apple-touch-icon.png new file mode 100644 index 0000000..e1a00ba Binary files /dev/null and b/favicons/apple-touch-icon.png differ diff --git a/favicons/coast-228x228.png b/favicons/coast-228x228.png new file mode 100644 index 0000000..072cac2 Binary files /dev/null and b/favicons/coast-228x228.png differ diff --git a/favicons/favicon-1024.png b/favicons/favicon-1024.png new file mode 100644 index 0000000..920f107 Binary files /dev/null and b/favicons/favicon-1024.png differ diff --git a/favicons/favicon-128x128.png b/favicons/favicon-128x128.png new file mode 100644 index 0000000..7096f99 Binary files /dev/null and b/favicons/favicon-128x128.png differ diff --git a/favicons/favicon-16x16.png b/favicons/favicon-16x16.png new file mode 100644 index 0000000..097e069 Binary files /dev/null and b/favicons/favicon-16x16.png differ diff --git a/favicons/favicon-256.png b/favicons/favicon-256.png new file mode 100644 index 0000000..ebd3f8c Binary files /dev/null and b/favicons/favicon-256.png differ diff --git a/favicons/favicon-256x256.png b/favicons/favicon-256x256.png new file mode 100644 index 0000000..1a383ad Binary files /dev/null and b/favicons/favicon-256x256.png differ diff --git a/favicons/favicon-32x32.png b/favicons/favicon-32x32.png new file mode 100644 index 0000000..442d059 Binary files /dev/null and b/favicons/favicon-32x32.png differ diff --git a/favicons/favicon-48x48.png b/favicons/favicon-48x48.png new file mode 100644 index 0000000..9ba2273 Binary files /dev/null and b/favicons/favicon-48x48.png differ diff --git a/favicons/favicon-64x64.png b/favicons/favicon-64x64.png new file mode 100644 index 0000000..11c0c57 Binary files /dev/null and b/favicons/favicon-64x64.png differ diff --git a/favicons/favicon-96x96.png b/favicons/favicon-96x96.png new file mode 100644 index 0000000..fac53cd Binary files /dev/null and b/favicons/favicon-96x96.png differ diff --git a/favicons/favicon.ico b/favicons/favicon.ico new file mode 100644 index 0000000..78ae422 Binary files /dev/null and b/favicons/favicon.ico differ diff --git a/favicons/msapplication-icon-144x144.png b/favicons/msapplication-icon-144x144.png new file mode 100644 index 0000000..3c59520 Binary files /dev/null and b/favicons/msapplication-icon-144x144.png differ diff --git a/favicons/mstile-150x150.png b/favicons/mstile-150x150.png new file mode 100644 index 0000000..796e2d8 Binary files /dev/null and b/favicons/mstile-150x150.png differ diff --git a/favicons/pwa-192x192.png b/favicons/pwa-192x192.png new file mode 100644 index 0000000..94b2ad2 Binary files /dev/null and b/favicons/pwa-192x192.png differ diff --git a/favicons/pwa-512x512.png b/favicons/pwa-512x512.png new file mode 100644 index 0000000..89258a4 Binary files /dev/null and b/favicons/pwa-512x512.png differ diff --git a/favicons/tile150x150.png b/favicons/tile150x150.png new file mode 100644 index 0000000..f9e8c97 Binary files /dev/null and b/favicons/tile150x150.png differ diff --git a/favicons/tile310x150.png b/favicons/tile310x150.png new file mode 100644 index 0000000..ec2cac5 Binary files /dev/null and b/favicons/tile310x150.png differ diff --git a/favicons/tile310x310.png b/favicons/tile310x310.png new file mode 100644 index 0000000..c98fad1 Binary files /dev/null and b/favicons/tile310x310.png differ diff --git a/favicons/tile70x70.png b/favicons/tile70x70.png new file mode 100644 index 0000000..7096f99 Binary files /dev/null and b/favicons/tile70x70.png differ diff --git a/img/cyber-bg.jpg b/img/cyber-bg.jpg deleted file mode 100644 index 2136ee6..0000000 Binary files a/img/cyber-bg.jpg and /dev/null differ diff --git a/img/favicons.zip b/img/favicons.zip deleted file mode 100644 index 6bc1544..0000000 Binary files a/img/favicons.zip and /dev/null differ diff --git a/img/favicons/android-chrome-192x192.png b/img/favicons/android-chrome-192x192.png deleted file mode 100644 index 40481f5..0000000 Binary files a/img/favicons/android-chrome-192x192.png and /dev/null differ diff --git a/img/favicons/android-chrome-512x512.png b/img/favicons/android-chrome-512x512.png deleted file mode 100644 index 867e1b0..0000000 Binary files a/img/favicons/android-chrome-512x512.png and /dev/null differ diff --git a/img/favicons/apple-touch-icon.png b/img/favicons/apple-touch-icon.png deleted file mode 100644 index 9c8770a..0000000 Binary files a/img/favicons/apple-touch-icon.png and /dev/null differ diff --git a/img/favicons/browserconfig.xml b/img/favicons/browserconfig.xml deleted file mode 100644 index b3930d0..0000000 --- a/img/favicons/browserconfig.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - #da532c - - - diff --git a/img/favicons/favicon-16x16.png b/img/favicons/favicon-16x16.png deleted file mode 100644 index 41eee1b..0000000 Binary files a/img/favicons/favicon-16x16.png and /dev/null differ diff --git a/img/favicons/favicon-32x32.png b/img/favicons/favicon-32x32.png deleted file mode 100644 index ac0b69f..0000000 Binary files a/img/favicons/favicon-32x32.png and /dev/null differ diff --git a/img/favicons/manifest.json b/img/favicons/manifest.json deleted file mode 100644 index 4fbe181..0000000 --- a/img/favicons/manifest.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} \ No newline at end of file diff --git a/img/favicons/mstile-150x150.png b/img/favicons/mstile-150x150.png deleted file mode 100644 index 3e77d4f..0000000 Binary files a/img/favicons/mstile-150x150.png and /dev/null differ diff --git a/img/favicons/safari-pinned-tab.svg b/img/favicons/safari-pinned-tab.svg deleted file mode 100644 index 299cf6a..0000000 --- a/img/favicons/safari-pinned-tab.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/featured-background.jpg b/img/featured-background.jpg new file mode 100644 index 0000000..8317024 Binary files /dev/null and b/img/featured-background.jpg differ diff --git a/img/fixed-background-2.jpg b/img/fixed-background-2.jpg deleted file mode 100644 index 5d41ebb..0000000 Binary files a/img/fixed-background-2.jpg and /dev/null differ diff --git a/img/logos/logo_full.svg b/img/logos/logo_full.svg new file mode 100644 index 0000000..782095e --- /dev/null +++ b/img/logos/logo_full.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/photogrid.jpg b/img/photogrid.jpg deleted file mode 100644 index 137e111..0000000 Binary files a/img/photogrid.jpg and /dev/null differ diff --git a/img/sw360-h-208x79.png b/img/sw360-h-208x79.png deleted file mode 100644 index 438ad12..0000000 Binary files a/img/sw360-h-208x79.png and /dev/null differ diff --git a/img/sw360-icon.png b/img/sw360-icon.png deleted file mode 100644 index 5a3a4a6..0000000 Binary files a/img/sw360-icon.png and /dev/null differ diff --git a/img/sw360-logo-icon.png b/img/sw360-logo-icon.png deleted file mode 100644 index 5c9eca0..0000000 Binary files a/img/sw360-logo-icon.png and /dev/null differ diff --git a/img/sw360.png b/img/sw360.png deleted file mode 100644 index 87eb27a..0000000 Binary files a/img/sw360.png and /dev/null differ diff --git a/img/texture-green.png b/img/texture-green.png deleted file mode 100644 index 21b9231..0000000 Binary files a/img/texture-green.png and /dev/null differ diff --git a/img/texture-turquoise.png b/img/texture-turquoise.png deleted file mode 100644 index 8da5351..0000000 Binary files a/img/texture-turquoise.png and /dev/null differ diff --git a/img/texture-violet.png b/img/texture-violet.png deleted file mode 100644 index 81a4e1a..0000000 Binary files a/img/texture-violet.png and /dev/null differ diff --git a/index.html b/index.html index 41b603e..8850c09 100644 --- a/index.html +++ b/index.html @@ -1,406 +1,464 @@ - - - + + - - - - - Eclipse SW360 - + + + + + - - - - - - + + + + + + + + + + + +Eclipse SW360 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - + + + - -
+ + Software …"> + + + + -
-
+ + + + - -
-
-
-
- - - -
-
- -
-
-
-
- -
-
-
- -
- - +
+ + +
+
+
+
+
+ +
+

Central SW Component Database

+
+360 degree coverage for SW development beside the ‚Coding‘ as the Central SW + component database - +
+
- +
+
+ +
+

E2E Integration for Software Compliance

+
- +Having a stable, precise, transparent, controllable and easy extendable OSS toolchain for + long term running +
- +
-
-
-
-
-

Our latest news

-
+
+
+
+
+ +
+

Long Term Controlled OSS Toolchain

+
-

- -

+As automated + as possible, end-to-end compliance (Legal, Security/SBOM, Export Control) + tool-chain, seamlessly integrated in the SW development process (e.g. + DevOps) - +
-
+
- - -
-
-
-
- - - -
-
-
-

- Read more -

-
-
- -
-

Eclipse Con France 2017 Talk

-

- - on July 11, 2017 -

-

Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. -

-

- Continue reading -

-
-
- - -
- -
- +
+
+ +
+

Embracing New Technologies

+
- +Enable easy onboarding of + new technolgies and new tools (e.g. container, new kind of packages) + +
+ +
-
- +
+ + +
+ + -
- -
- - + - - @@ -412,29 +470,15 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= -
- - - - - - - - - - - - - + - - + \ No newline at end of file diff --git a/index.xml b/index.xml index 7e7f965..b44cd76 100644 --- a/index.xml +++ b/index.xml @@ -1,63 +1,16 @@ - - Eclipse SW360 + Eclipse SW360 – SW360 https://www.eclipse.org/sw360/ - Recent content on Eclipse SW360 + Recent content in SW360 on Eclipse SW360 Hugo -- gohugo.io - en-us - Wed, 29 May 2019 14:38:06 +0200 - + - - Eclipse SW360 - Screenshots - https://www.eclipse.org/sw360/screenshots/ - Wed, 29 May 2019 14:38:06 +0200 - https://www.eclipse.org/sw360/screenshots/ - A picture is worth a thousand words The SW360 application is divided into several sections around managing a catalogue of software components and the software bill-of-material of your software projects, products or services. The menu bar as shown on home screen cover the following main sections. -Home A dashboard listing the components and projects created by the user logged in. With this overview, the own projects and components can be directly accessed. - - - - Eclipse SW360 - Presentations - https://www.eclipse.org/sw360/presentations/ - Mon, 10 Sep 2018 16:06:41 +0200 - - https://www.eclipse.org/sw360/presentations/ - Events and Presentations 2018 Bitkom Forum Open Source 2018: &ldquo;Eclipse SW360 – Lessons Learned From Automated License Compliance&rdquo; (Johannes Kristan, Bosch Software Innovations GmbH &amp; Michael C. Jaeger, Siemens AG) Inner Source Commons 2018: &ldquo;Committing to Change: Inner Source at Siemens&rdquo; (Karsten Gerloff, Siemens AG) The Free Software Legal and Licensing Workshop 2018: &ldquo;Eclipse SW360: Generating License Information for Products with SDPX Docs&rdquo; (Michael C. Jaeger, Siemens AG) Yanking the Chain: Open Source Software Compliance in the Supply Chain: &ldquo;Eclipse SW360 – Open Source Management with Open Source&rdquo; (Michael C. - - - - Eclipse SW360 - Resources - https://www.eclipse.org/sw360/resources/ - Thu, 06 Sep 2018 14:38:06 +0200 - https://www.eclipse.org/sw360/resources/ - GitHub Repository Eclipse SW360: https://github.com/eclipse/sw360 Eclipse SW360antenna: https://github.com/eclipse/antenna Eclipse SW360 Website: https://github.com/eclipse/sw360.website More SW360-Related Projects on Github sw360chores, a docker-compose-based deployment environment: https://github.com/sw360/sw360chores sw360vagrant, deploying sw360 using puppet and vagrant: https://github.com/sw360/sw360vagrant sw360bdpimporter, a import implementation for importing proejcts from other applications: https://github.com/sw360/sw360bdpImportService ldapOrganizationMappingExt, small module to perform a mapping between (maybe more detailed) LDAP groups and (maybe less detailed) groups in SW360: https://github.com/sw360/ldapOrganizationMappingExt Documentation sw360slides, a collection powerpoint of slides for various presentations: https://github. - - - Eclipse SW360 - About - https://www.eclipse.org/sw360/about/ - Thu, 06 Sep 2018 14:29:18 +0200 - - https://www.eclipse.org/sw360/about/ - In most cases, software today is not built from scratch, but rather assembled from various prepackaged third-party software components. As a result, organizations face the following challenges: - Verifying various aspects of compliance when using third-party software components: license compliance, ECC checks, IP assessments, etc. Sharing knowledge about software components and their qualities. For example, which software components should be recommended, which should be phased out based on which criteria? - - - - Eclipse Con France 2017 Talk - https://www.eclipse.org/sw360/blog/ecf2017/ - Tue, 11 Jul 2017 11:27:33 +0200 - - https://www.eclipse.org/sw360/blog/ecf2017/ - Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. - - - \ No newline at end of file + diff --git a/js/deflate.js b/js/deflate.js new file mode 100644 index 0000000..b452c84 --- /dev/null +++ b/js/deflate.js @@ -0,0 +1,1652 @@ +/* Copyright (C) 1999 Masanao Izumo +* Version: 1.0.1 +* LastModified: Dec 25 1999 +*/ + +/* Interface: +* data = deflate(src); +*/ +const deflate = (function () { + /* constant parameters */ + var zip_WSIZE = 32768; // Sliding Window size + var zip_STORED_BLOCK = 0; + var zip_STATIC_TREES = 1; + var zip_DYN_TREES = 2; + + /* for deflate */ + var zip_DEFAULT_LEVEL = 6; + var zip_FULL_SEARCH = true; + var zip_INBUFSIZ = 32768; // Input buffer size + var zip_INBUF_EXTRA = 64; // Extra buffer + var zip_OUTBUFSIZ = 1024 * 8; + var zip_window_size = 2 * zip_WSIZE; + var zip_MIN_MATCH = 3; + var zip_MAX_MATCH = 258; + var zip_BITS = 16; + // for SMALL_MEM + var zip_LIT_BUFSIZE = 0x2000; + var zip_HASH_BITS = 13; + // for MEDIUM_MEM + // var zip_LIT_BUFSIZE = 0x4000; + // var zip_HASH_BITS = 14; + // for BIG_MEM + // var zip_LIT_BUFSIZE = 0x8000; + // var zip_HASH_BITS = 15; + //if(zip_LIT_BUFSIZE > zip_INBUFSIZ) + // alert("error: zip_INBUFSIZ is too small"); + //if((zip_WSIZE<<1) > (1< zip_BITS-1) + // alert("error: zip_HASH_BITS is too large"); + //if(zip_HASH_BITS < 8 || zip_MAX_MATCH != 258) + // alert("error: Code too clever"); + var zip_DIST_BUFSIZE = zip_LIT_BUFSIZE; + var zip_HASH_SIZE = 1 << zip_HASH_BITS; + var zip_HASH_MASK = zip_HASH_SIZE - 1; + var zip_WMASK = zip_WSIZE - 1; + var zip_NIL = 0; // Tail of hash chains + var zip_TOO_FAR = 4096; + var zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1; + var zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD; + var zip_SMALLEST = 1; + var zip_MAX_BITS = 15; + var zip_MAX_BL_BITS = 7; + var zip_LENGTH_CODES = 29; + var zip_LITERALS = 256; + var zip_END_BLOCK = 256; + var zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES; + var zip_D_CODES = 30; + var zip_BL_CODES = 19; + var zip_REP_3_6 = 16; + var zip_REPZ_3_10 = 17; + var zip_REPZ_11_138 = 18; + var zip_HEAP_SIZE = 2 * zip_L_CODES + 1; + var zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / + zip_MIN_MATCH); + + /* variables */ + var zip_free_queue; + var zip_qhead, zip_qtail; + var zip_initflag; + var zip_outbuf = null; + var zip_outcnt, zip_outoff; + var zip_complete; + var zip_window; + var zip_d_buf; + var zip_l_buf; + var zip_prev; + var zip_bi_buf; + var zip_bi_valid; + var zip_block_start; + var zip_ins_h; + var zip_hash_head; + var zip_prev_match; + var zip_match_available; + var zip_match_length; + var zip_prev_length; + var zip_strstart; + var zip_match_start; + var zip_eofile; + var zip_lookahead; + var zip_max_chain_length; + var zip_max_lazy_match; + var zip_compr_level; + var zip_good_match; + var zip_nice_match; + var zip_dyn_ltree; + var zip_dyn_dtree; + var zip_static_ltree; + var zip_static_dtree; + var zip_bl_tree; + var zip_l_desc; + var zip_d_desc; + var zip_bl_desc; + var zip_bl_count; + var zip_heap; + var zip_heap_len; + var zip_heap_max; + var zip_depth; + var zip_length_code; + var zip_dist_code; + var zip_base_length; + var zip_base_dist; + var zip_flag_buf; + var zip_last_lit; + var zip_last_dist; + var zip_last_flags; + var zip_flags; + var zip_flag_bit; + var zip_opt_len; + var zip_static_len; + var zip_deflate_data; + var zip_deflate_pos; + + /* objects (deflate) */ + + function zip_DeflateCT() { + this.fc = 0; // frequency count or bit string + this.dl = 0; // father node in Huffman tree or length of bit string + } + + function zip_DeflateTreeDesc() { + this.dyn_tree = null; // the dynamic tree + this.static_tree = null; // corresponding static tree or NULL + this.extra_bits = null; // extra bits for each code or NULL + this.extra_base = 0; // base index for extra_bits + this.elems = 0; // max number of elements in the tree + this.max_length = 0; // max bit length for the codes + this.max_code = 0; // largest code with non zero frequency + } + + /* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ + function zip_DeflateConfiguration(a, b, c, d) { + this.good_length = a; // reduce lazy search above this match length + this.max_lazy = b; // do not perform lazy search above this match length + this.nice_length = c; // quit search above this match length + this.max_chain = d; + } + + function zip_DeflateBuffer() { + this.next = null; + this.len = 0; + this.ptr = new Array(zip_OUTBUFSIZ); + this.off = 0; + } + + /* constant tables */ + var zip_extra_lbits = [ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]; + var zip_extra_dbits = [ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]; + var zip_extra_blbits = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]; + var zip_bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; + var zip_configuration_table = [ + new zip_DeflateConfiguration(0, 0, 0, 0), + new zip_DeflateConfiguration(4, 4, 8, 4), + new zip_DeflateConfiguration(4, 5, 16, 8), + new zip_DeflateConfiguration(4, 6, 32, 32), + new zip_DeflateConfiguration(4, 4, 16, 16), + new zip_DeflateConfiguration(8, 16, 32, 32), + new zip_DeflateConfiguration(8, 16, 128, 128), + new zip_DeflateConfiguration(8, 32, 128, 256), + new zip_DeflateConfiguration(32, 128, 258, 1024), + new zip_DeflateConfiguration(32, 258, 258, 4096)]; + + + /* routines (deflate) */ + + function zip_deflate_start(level) { + var i; + + if (!level) + level = zip_DEFAULT_LEVEL; + else if (level < 1) + level = 1; + else if (level > 9) + level = 9; + + zip_compr_level = level; + zip_initflag = false; + zip_eofile = false; + if (zip_outbuf != null) + return; + + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = new Array(zip_OUTBUFSIZ); + zip_window = new Array(zip_window_size); + zip_d_buf = new Array(zip_DIST_BUFSIZE); + zip_l_buf = new Array(zip_INBUFSIZ + zip_INBUF_EXTRA); + zip_prev = new Array(1 << zip_BITS); + zip_dyn_ltree = new Array(zip_HEAP_SIZE); + for (i = 0; i < zip_HEAP_SIZE; i++) + zip_dyn_ltree[i] = new zip_DeflateCT(); + zip_dyn_dtree = new Array(2 * zip_D_CODES + 1); + for (i = 0; i < 2 * zip_D_CODES + 1; i++) + zip_dyn_dtree[i] = new zip_DeflateCT(); + zip_static_ltree = new Array(zip_L_CODES + 2); + for (i = 0; i < zip_L_CODES + 2; i++) + zip_static_ltree[i] = new zip_DeflateCT(); + zip_static_dtree = new Array(zip_D_CODES); + for (i = 0; i < zip_D_CODES; i++) + zip_static_dtree[i] = new zip_DeflateCT(); + zip_bl_tree = new Array(2 * zip_BL_CODES + 1); + for (i = 0; i < 2 * zip_BL_CODES + 1; i++) + zip_bl_tree[i] = new zip_DeflateCT(); + zip_l_desc = new zip_DeflateTreeDesc(); + zip_d_desc = new zip_DeflateTreeDesc(); + zip_bl_desc = new zip_DeflateTreeDesc(); + zip_bl_count = new Array(zip_MAX_BITS + 1); + zip_heap = new Array(2 * zip_L_CODES + 1); + zip_depth = new Array(2 * zip_L_CODES + 1); + zip_length_code = new Array(zip_MAX_MATCH - zip_MIN_MATCH + 1); + zip_dist_code = new Array(512); + zip_base_length = new Array(zip_LENGTH_CODES); + zip_base_dist = new Array(zip_D_CODES); + zip_flag_buf = new Array(parseInt(zip_LIT_BUFSIZE / 8)); + } + + function zip_deflate_end() { + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = null; + zip_window = null; + zip_d_buf = null; + zip_l_buf = null; + zip_prev = null; + zip_dyn_ltree = null; + zip_dyn_dtree = null; + zip_static_ltree = null; + zip_static_dtree = null; + zip_bl_tree = null; + zip_l_desc = null; + zip_d_desc = null; + zip_bl_desc = null; + zip_bl_count = null; + zip_heap = null; + zip_depth = null; + zip_length_code = null; + zip_dist_code = null; + zip_base_length = null; + zip_base_dist = null; + zip_flag_buf = null; + } + + function zip_reuse_queue(p) { + p.next = zip_free_queue; + zip_free_queue = p; + } + + function zip_new_queue() { + var p; + + if (zip_free_queue != null) { + p = zip_free_queue; + zip_free_queue = zip_free_queue.next; + } + else + p = new zip_DeflateBuffer(); + p.next = null; + p.len = p.off = 0; + + return p; + } + + function zip_head1(i) { + return zip_prev[zip_WSIZE + i]; + } + + function zip_head2(i, val) { + return zip_prev[zip_WSIZE + i] = val; + } + + /* put_byte is used for the compressed output, put_ubyte for the + * uncompressed output. However unlzw() uses window for its + * suffix table instead of its output buffer, so it does not use put_ubyte + * (to be cleaned up). + */ + function zip_put_byte(c) { + zip_outbuf[zip_outoff + zip_outcnt++] = c; + if (zip_outoff + zip_outcnt == zip_OUTBUFSIZ) + zip_qoutbuf(); + } + + /* Output a 16 bit value, lsb first */ + function zip_put_short(w) { + w &= 0xffff; + if (zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { + zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); + zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8); + } else { + zip_put_byte(w & 0xff); + zip_put_byte(w >>> 8); + } + } + + /* ========================================================================== + * Insert string s in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of s are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ + function zip_INSERT_STRING() { + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) + ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff)) + & zip_HASH_MASK; + zip_hash_head = zip_head1(zip_ins_h); + zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; + zip_head2(zip_ins_h, zip_strstart); + } + + /* Send a code of the given tree. c and tree must not have side effects */ + function zip_SEND_CODE(c, tree) { + zip_send_bits(tree[c].fc, tree[c].dl); + } + + /* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. dist_code[256] and dist_code[257] are never + * used. + */ + function zip_D_CODE(dist) { + return (dist < 256 ? zip_dist_code[dist] + : zip_dist_code[256 + (dist >> 7)]) & 0xff; + } + + /* ========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ + function zip_SMALLER(tree, n, m) { + return tree[n].fc < tree[m].fc || + (tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]); + } + + /* ========================================================================== + * read string data + */ + function zip_read_buff(buff, offset, n) { + var i; + for (i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) + buff[offset + i] = + zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff; + return i; + } + + /* ========================================================================== + * Initialize the "longest match" routines for a new file + */ + function zip_lm_init() { + var j; + + /* Initialize the hash table. */ + for (j = 0; j < zip_HASH_SIZE; j++) + // zip_head2(j, zip_NIL); + zip_prev[zip_WSIZE + j] = 0; + /* prev will be initialized on the fly */ + + /* Set the default configuration parameters: + */ + zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; + zip_good_match = zip_configuration_table[zip_compr_level].good_length; + if (!zip_FULL_SEARCH) + zip_nice_match = zip_configuration_table[zip_compr_level].nice_length; + zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; + + zip_strstart = 0; + zip_block_start = 0; + + zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); + if (zip_lookahead <= 0) { + zip_eofile = true; + zip_lookahead = 0; + return; + } + zip_eofile = false; + /* Make sure that we always have enough lookahead. This is important + * if input comes from a device such as a tty. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + + /* If lookahead < MIN_MATCH, ins_h is garbage, but this is + * not important since only literal bytes will be emitted. + */ + zip_ins_h = 0; + for (j = 0; j < zip_MIN_MATCH - 1; j++) { + // UPDATE_HASH(ins_h, window[j]); + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK; + } + } + + /* ========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + */ + function zip_longest_match(cur_match) { + var chain_length = zip_max_chain_length; // max hash chain length + var scanp = zip_strstart; // current string + var matchp; // matched string + var len; // length of current match + var best_len = zip_prev_length; // best match length so far + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL); + + var strendp = zip_strstart + zip_MAX_MATCH; + var scan_end1 = zip_window[scanp + best_len - 1]; + var scan_end = zip_window[scanp + best_len]; + + /* Do not waste too much time if we already have a good match: */ + if (zip_prev_length >= zip_good_match) + chain_length >>= 2; + + // Assert(encoder->strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead"); + + do { + // Assert(cur_match < encoder->strstart, "no future"); + matchp = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2: + */ + if (zip_window[matchp + best_len] != scan_end || + zip_window[matchp + best_len - 1] != scan_end1 || + zip_window[matchp] != zip_window[scanp] || + zip_window[++matchp] != zip_window[scanp + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scanp += 2; + matchp++; + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + scanp < strendp); + + len = zip_MAX_MATCH - (strendp - scanp); + scanp = strendp - zip_MAX_MATCH; + + if (len > best_len) { + zip_match_start = cur_match; + best_len = len; + if (zip_FULL_SEARCH) { + if (len >= zip_MAX_MATCH) break; + } else { + if (len >= zip_nice_match) break; + } + + scan_end1 = zip_window[scanp + best_len - 1]; + scan_end = zip_window[scanp + best_len]; + } + } while ((cur_match = zip_prev[cur_match & zip_WMASK]) > limit + && --chain_length != 0); + + return best_len; + } + + /* ========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead, and sets eofile if end of input file. + * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0 + * OUT assertions: at least one byte has been read, or eofile is set; + * file reads are performed for at least two bytes (required for the + * translate_eol option). + */ + function zip_fill_window() { + var n, m; + + // Amount of free space at the end of the window. + var more = zip_window_size - zip_lookahead - zip_strstart; + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (more == -1) { + /* Very unlikely, but possible on 16 bit machine if strstart == 0 + * and lookahead == 1 (input done one byte at time) + */ + more--; + } else if (zip_strstart >= zip_WSIZE + zip_MAX_DIST) { + /* By the IN assertion, the window is not empty so we can't confuse + * more == 0 with more == 64K on a 16 bit machine. + */ + // Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM"); + + // System.arraycopy(window, WSIZE, window, 0, WSIZE); + for (n = 0; n < zip_WSIZE; n++) + zip_window[n] = zip_window[n + zip_WSIZE]; + + zip_match_start -= zip_WSIZE; + zip_strstart -= zip_WSIZE; /* we now have strstart >= MAX_DIST: */ + zip_block_start -= zip_WSIZE; + + for (n = 0; n < zip_HASH_SIZE; n++) { + m = zip_head1(n); + zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); + } + for (n = 0; n < zip_WSIZE; n++) { + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + m = zip_prev[n]; + zip_prev[n] = (m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); + } + more += zip_WSIZE; + } + // At this point, more >= 2 + if (!zip_eofile) { + n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); + if (n <= 0) + zip_eofile = true; + else + zip_lookahead += n; + } + } + + /* ========================================================================== + * Processes a new input file and return its compressed length. This + * function does not perform lazy evaluationof matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ + function zip_deflate_fast() { + while (zip_lookahead != 0 && zip_qhead == null) { + var flush; // set if current block must be flushed + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (zip_hash_head != zip_NIL && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) + zip_match_length = zip_lookahead; + } + if (zip_match_length >= zip_MIN_MATCH) { + // check_match(strstart, match_start, match_length); + + flush = zip_ct_tally(zip_strstart - zip_match_start, + zip_match_length - zip_MIN_MATCH); + zip_lookahead -= zip_match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (zip_match_length <= zip_max_lazy_match) { + zip_match_length--; // string at strstart already in hash table + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since + * the next lookahead bytes will be emitted as literals. + */ + } while (--zip_match_length != 0); + zip_strstart++; + } else { + zip_strstart += zip_match_length; + zip_match_length = 0; + zip_ins_h = zip_window[zip_strstart] & 0xff; + // UPDATE_HASH(ins_h, window[strstart + 1]); + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[zip_strstart + 1] & 0xff)) & zip_HASH_MASK; + + //#if MIN_MATCH != 3 + // Call UPDATE_HASH() MIN_MATCH-3 more times + //#endif + + } + } else { + /* No match, output a literal byte */ + flush = zip_ct_tally(0, zip_window[zip_strstart] & 0xff); + zip_lookahead--; + zip_strstart++; + } + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + } + } + + function zip_deflate_better() { + /* Process the input block. */ + while (zip_lookahead != 0 && zip_qhead == null) { + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + */ + zip_prev_length = zip_match_length; + zip_prev_match = zip_match_start; + zip_match_length = zip_MIN_MATCH - 1; + + if (zip_hash_head != zip_NIL && + zip_prev_length < zip_max_lazy_match && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) + zip_match_length = zip_lookahead; + + /* Ignore a length 3 match if it is too distant: */ + if (zip_match_length == zip_MIN_MATCH && + zip_strstart - zip_match_start > zip_TOO_FAR) { + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + zip_match_length--; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (zip_prev_length >= zip_MIN_MATCH && + zip_match_length <= zip_prev_length) { + var flush; // set if current block must be flushed + + // check_match(strstart - 1, prev_match, prev_length); + flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, + zip_prev_length - zip_MIN_MATCH); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. + */ + zip_lookahead -= zip_prev_length - 1; + zip_prev_length -= 2; + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since the + * next lookahead bytes will always be emitted as literals. + */ + } while (--zip_prev_length != 0); + zip_match_available = 0; + zip_match_length = zip_MIN_MATCH - 1; + zip_strstart++; + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + } else if (zip_match_available != 0) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + if (zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + zip_strstart++; + zip_lookahead--; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + zip_match_available = 1; + zip_strstart++; + zip_lookahead--; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + } + } + + function zip_init_deflate() { + if (zip_eofile) + return; + zip_bi_buf = 0; + zip_bi_valid = 0; + zip_ct_init(); + zip_lm_init(); + + zip_qhead = null; + zip_outcnt = 0; + zip_outoff = 0; + + if (zip_compr_level <= 3) { + zip_prev_length = zip_MIN_MATCH - 1; + zip_match_length = 0; + } + else { + zip_match_length = zip_MIN_MATCH - 1; + zip_match_available = 0; + } + + zip_complete = false; + } + + /* ========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ + function zip_deflate_internal(buff, off, buff_size) { + var n; + + if (!zip_initflag) { + zip_init_deflate(); + zip_initflag = true; + if (zip_lookahead == 0) { // empty + zip_complete = true; + return 0; + } + } + + if ((n = zip_qcopy(buff, off, buff_size)) == buff_size) + return buff_size; + + if (zip_complete) + return n; + + if (zip_compr_level <= 3) // optimized for speed + zip_deflate_fast(); + else + zip_deflate_better(); + if (zip_lookahead == 0) { + if (zip_match_available != 0) + zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff); + zip_flush_block(1); + zip_complete = true; + } + return n + zip_qcopy(buff, n + off, buff_size - n); + } + + function zip_qcopy(buff, off, buff_size) { + var n, i, j; + + n = 0; + while (zip_qhead != null && n < buff_size) { + i = buff_size - n; + if (i > zip_qhead.len) + i = zip_qhead.len; + // System.arraycopy(qhead.ptr, qhead.off, buff, off + n, i); + for (j = 0; j < i; j++) + buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j]; + + zip_qhead.off += i; + zip_qhead.len -= i; + n += i; + if (zip_qhead.len == 0) { + var p; + p = zip_qhead; + zip_qhead = zip_qhead.next; + zip_reuse_queue(p); + } + } + + if (n == buff_size) + return n; + + if (zip_outoff < zip_outcnt) { + i = buff_size - n; + if (i > zip_outcnt - zip_outoff) + i = zip_outcnt - zip_outoff; + // System.arraycopy(outbuf, outoff, buff, off + n, i); + for (j = 0; j < i; j++) + buff[off + n + j] = zip_outbuf[zip_outoff + j]; + zip_outoff += i; + n += i; + if (zip_outcnt == zip_outoff) + zip_outcnt = zip_outoff = 0; + } + return n; + } + + /* ========================================================================== + * Allocate the match buffer, initialize the various tables and save the + * location of the internal file attribute (ascii/binary) and method + * (DEFLATE/STORE). + */ + function zip_ct_init() { + var n; // iterates over tree elements + var bits; // bit counter + var length; // length value + var code; // code value + var dist; // distance index + + if (zip_static_dtree[0].dl != 0) return; // ct_init already called + + zip_l_desc.dyn_tree = zip_dyn_ltree; + zip_l_desc.static_tree = zip_static_ltree; + zip_l_desc.extra_bits = zip_extra_lbits; + zip_l_desc.extra_base = zip_LITERALS + 1; + zip_l_desc.elems = zip_L_CODES; + zip_l_desc.max_length = zip_MAX_BITS; + zip_l_desc.max_code = 0; + + zip_d_desc.dyn_tree = zip_dyn_dtree; + zip_d_desc.static_tree = zip_static_dtree; + zip_d_desc.extra_bits = zip_extra_dbits; + zip_d_desc.extra_base = 0; + zip_d_desc.elems = zip_D_CODES; + zip_d_desc.max_length = zip_MAX_BITS; + zip_d_desc.max_code = 0; + + zip_bl_desc.dyn_tree = zip_bl_tree; + zip_bl_desc.static_tree = null; + zip_bl_desc.extra_bits = zip_extra_blbits; + zip_bl_desc.extra_base = 0; + zip_bl_desc.elems = zip_BL_CODES; + zip_bl_desc.max_length = zip_MAX_BL_BITS; + zip_bl_desc.max_code = 0; + + // Initialize the mapping length (0..255) -> length code (0..28) + length = 0; + for (code = 0; code < zip_LENGTH_CODES - 1; code++) { + zip_base_length[code] = length; + for (n = 0; n < (1 << zip_extra_lbits[code]); n++) + zip_length_code[length++] = code; + } + // Assert (length == 256, "ct_init: length != 256"); + + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + zip_length_code[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + zip_base_dist[code] = dist; + for (n = 0; n < (1 << zip_extra_dbits[code]); n++) { + zip_dist_code[dist++] = code; + } + } + // Assert (dist == 256, "ct_init: dist != 256"); + dist >>= 7; // from now on, all distances are divided by 128 + for (; code < zip_D_CODES; code++) { + zip_base_dist[code] = dist << 7; + for (n = 0; n < (1 << (zip_extra_dbits[code] - 7)); n++) + zip_dist_code[256 + dist++] = code; + } + // Assert (dist == 256, "ct_init: 256+dist != 512"); + + // Construct the codes of the static literal tree + for (bits = 0; bits <= zip_MAX_BITS; bits++) + zip_bl_count[bits] = 0; + n = 0; + while (n <= 143) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } + while (n <= 255) { zip_static_ltree[n++].dl = 9; zip_bl_count[9]++; } + while (n <= 279) { zip_static_ltree[n++].dl = 7; zip_bl_count[7]++; } + while (n <= 287) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); + + /* The static distance tree is trivial: */ + for (n = 0; n < zip_D_CODES; n++) { + zip_static_dtree[n].dl = 5; + zip_static_dtree[n].fc = zip_bi_reverse(n, 5); + } + + // Initialize the first block of the first file: + zip_init_block(); + } + + /* ========================================================================== + * Initialize a new block. + */ + function zip_init_block() { + var n; // iterates over tree elements + + // Initialize the trees. + for (n = 0; n < zip_L_CODES; n++) zip_dyn_ltree[n].fc = 0; + for (n = 0; n < zip_D_CODES; n++) zip_dyn_dtree[n].fc = 0; + for (n = 0; n < zip_BL_CODES; n++) zip_bl_tree[n].fc = 0; + + zip_dyn_ltree[zip_END_BLOCK].fc = 1; + zip_opt_len = zip_static_len = 0; + zip_last_lit = zip_last_dist = zip_last_flags = 0; + zip_flags = 0; + zip_flag_bit = 1; + } + + /* ========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ + function zip_pqdownheap( + tree, // the tree to restore + k) { // node to move down + var v = zip_heap[k]; + var j = k << 1; // left son of k + + while (j <= zip_heap_len) { + // Set j to the smallest of the two sons: + if (j < zip_heap_len && + zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) + j++; + + // Exit if v is smaller than both sons + if (zip_SMALLER(tree, v, zip_heap[j])) + break; + + // Exchange v with the smallest son + zip_heap[k] = zip_heap[j]; + k = j; + + // And continue down the tree, setting j to the left son of k + j <<= 1; + } + zip_heap[k] = v; + } + + /* ========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ + function zip_gen_bitlen(desc) { // the tree descriptor + var tree = desc.dyn_tree; + var extra = desc.extra_bits; + var base = desc.extra_base; + var max_code = desc.max_code; + var max_length = desc.max_length; + var stree = desc.static_tree; + var h; // heap index + var n, m; // iterate over the tree elements + var bits; // bit length + var xbits; // extra bits + var f; // frequency + var overflow = 0; // number of elements with bit length too large + + for (bits = 0; bits <= zip_MAX_BITS; bits++) + zip_bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[zip_heap[zip_heap_max]].dl = 0; // root of the heap + + for (h = zip_heap_max + 1; h < zip_HEAP_SIZE; h++) { + n = zip_heap[h]; + bits = tree[tree[n].dl].dl + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n].dl = bits; + // We overwrite tree[n].dl which is no longer needed + + if (n > max_code) + continue; // not a leaf node + + zip_bl_count[bits]++; + xbits = 0; + if (n >= base) + xbits = extra[n - base]; + f = tree[n].fc; + zip_opt_len += f * (bits + xbits); + if (stree != null) + zip_static_len += f * (stree[n].dl + xbits); + } + if (overflow == 0) + return; + + // This happens for example on obj2 and pic of the Calgary corpus + + // Find the first bit length which could increase: + do { + bits = max_length - 1; + while (zip_bl_count[bits] == 0) + bits--; + zip_bl_count[bits]--; // move one leaf down the tree + zip_bl_count[bits + 1] += 2; // move one overflow item as its brother + zip_bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = zip_bl_count[bits]; + while (n != 0) { + m = zip_heap[--h]; + if (m > max_code) + continue; + if (tree[m].dl != bits) { + zip_opt_len += (bits - tree[m].dl) * tree[m].fc; + tree[m].fc = bits; + } + n--; + } + } + } + + /* ========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ + function zip_gen_codes(tree, // the tree to decorate + max_code) { // largest code with non zero frequency + var next_code = new Array(zip_MAX_BITS + 1); // next code value for each bit length + var code = 0; // running code value + var bits; // bit index + var n; // code index + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= zip_MAX_BITS; bits++) { + code = ((code + zip_bl_count[bits - 1]) << 1); + next_code[bits] = code; + } + + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + // Assert (code + encoder->bl_count[MAX_BITS]-1 == (1<> 1; n >= 1; n--) + zip_pqdownheap(tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + do { + n = zip_heap[zip_SMALLEST]; + zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; + zip_pqdownheap(tree, zip_SMALLEST); + + m = zip_heap[zip_SMALLEST]; // m = node of next least frequency + + // keep the nodes sorted by frequency + zip_heap[--zip_heap_max] = n; + zip_heap[--zip_heap_max] = m; + + // Create a new node father of n and m + tree[node].fc = tree[n].fc + tree[m].fc; + // depth[node] = (char)(MAX(depth[n], depth[m]) + 1); + if (zip_depth[n] > zip_depth[m] + 1) + zip_depth[node] = zip_depth[n]; + else + zip_depth[node] = zip_depth[m] + 1; + tree[n].dl = tree[m].dl = node; + + // and insert the new node in the heap + zip_heap[zip_SMALLEST] = node++; + zip_pqdownheap(tree, zip_SMALLEST); + + } while (zip_heap_len >= 2); + + zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + zip_gen_bitlen(desc); + + // The field len is now set, we can generate the bit codes + zip_gen_codes(tree, max_code); + } + + /* ========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. Updates opt_len to take into account the repeat + * counts. (The contribution of the bit length codes will be added later + * during the construction of bl_tree.) + */ + function zip_scan_tree(tree,// the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } + tree[max_code + 1].dl = 0xffff; // guard + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen == nextlen) + continue; + else if (count < min_count) + zip_bl_tree[curlen].fc += count; + else if (curlen != 0) { + if (curlen != prevlen) + zip_bl_tree[curlen].fc++; + zip_bl_tree[zip_REP_3_6].fc++; + } else if (count <= 10) + zip_bl_tree[zip_REPZ_3_10].fc++; + else + zip_bl_tree[zip_REPZ_11_138].fc++; + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } else if (curlen == nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + } + + /* ========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ + function zip_send_tree(tree, // the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + /* tree[max_code+1].dl = -1; */ /* guard already set */ + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { zip_SEND_CODE(curlen, zip_bl_tree); } while (--count != 0); + } else if (curlen != 0) { + if (curlen != prevlen) { + zip_SEND_CODE(curlen, zip_bl_tree); + count--; + } + // Assert(count >= 3 && count <= 6, " 3_6?"); + zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); + zip_send_bits(count - 3, 2); + } else if (count <= 10) { + zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); + zip_send_bits(count - 3, 3); + } else { + zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); + zip_send_bits(count - 11, 7); + } + count = 0; + prevlen = curlen; + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } else if (curlen == nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + } + + /* ========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ + function zip_build_bl_tree() { + var max_blindex; // index of last bit length code of non zero freq + + // Determine the bit length frequencies for literal and distance trees + zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); + zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); + + // Build the bit length tree: + zip_build_tree(zip_bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = zip_BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (zip_bl_tree[zip_bl_order[max_blindex]].dl != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + zip_opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + // Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + + return max_blindex; + } + + /* ========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ + function zip_send_all_trees(lcodes, dcodes, blcodes) { // number of codes for each tree + var rank; // index in bl_order + + // Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + // Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + // Tracev((stderr, "\nbl counts: ")); + zip_send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt + zip_send_bits(dcodes - 1, 5); + zip_send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt + for (rank = 0; rank < blcodes; rank++) { + // Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3); + } + + // send the literal tree + zip_send_tree(zip_dyn_ltree, lcodes - 1); + + // send the distance tree + zip_send_tree(zip_dyn_dtree, dcodes - 1); + } + + /* ========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ + function zip_flush_block(eof) { // true if this is the last block for a file + var opt_lenb, static_lenb; // opt_len and static_len in bytes + var max_blindex; // index of last bit length code of non zero freq + var stored_len; // length of input block + + stored_len = zip_strstart - zip_block_start; + zip_flag_buf[zip_last_flags] = zip_flags; // Save the flags for the last 8 items + + // Construct the literal and distance trees + zip_build_tree(zip_l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + + zip_build_tree(zip_d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = zip_build_bl_tree(); + + // Determine the best encoding. Compute first the block length in bytes + opt_lenb = (zip_opt_len + 3 + 7) >> 3; + static_lenb = (zip_static_len + 3 + 7) >> 3; + + // Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ", + // opt_lenb, encoder->opt_len, + // static_lenb, encoder->static_len, stored_len, + // encoder->last_lit, encoder->last_dist)); + + if (static_lenb <= opt_lenb) + opt_lenb = static_lenb; + if (stored_len + 4 <= opt_lenb // 4: two words for the lengths + && zip_block_start >= 0) { + var i; + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + zip_send_bits((zip_STORED_BLOCK << 1) + eof, 3); /* send block type */ + zip_bi_windup(); /* align on byte boundary */ + zip_put_short(stored_len); + zip_put_short(~stored_len); + + // copy block + /* + p = &window[block_start]; + for(i = 0; i < stored_len; i++) + put_byte(p[i]); + */ + for (i = 0; i < stored_len; i++) + zip_put_byte(zip_window[zip_block_start + i]); + + } else if (static_lenb == opt_lenb) { + zip_send_bits((zip_STATIC_TREES << 1) + eof, 3); + zip_compress_block(zip_static_ltree, zip_static_dtree); + } else { + zip_send_bits((zip_DYN_TREES << 1) + eof, 3); + zip_send_all_trees(zip_l_desc.max_code + 1, + zip_d_desc.max_code + 1, + max_blindex + 1); + zip_compress_block(zip_dyn_ltree, zip_dyn_dtree); + } + + zip_init_block(); + + if (eof != 0) + zip_bi_windup(); + } + + /* ========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ + function zip_ct_tally( + dist, // distance of matched string + lc) { // match length-MIN_MATCH or unmatched char (if dist==0) + zip_l_buf[zip_last_lit++] = lc; + if (dist == 0) { + // lc is the unmatched char + zip_dyn_ltree[lc].fc++; + } else { + // Here, lc is the match length - MIN_MATCH + dist--; // dist = match distance - 1 + // Assert((ush)dist < (ush)MAX_DIST && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)D_CODE(dist) < (ush)D_CODES, "ct_tally: bad match"); + + zip_dyn_ltree[zip_length_code[lc] + zip_LITERALS + 1].fc++; + zip_dyn_dtree[zip_D_CODE(dist)].fc++; + + zip_d_buf[zip_last_dist++] = dist; + zip_flags |= zip_flag_bit; + } + zip_flag_bit <<= 1; + + // Output the flags if they fill a byte + if ((zip_last_lit & 7) == 0) { + zip_flag_buf[zip_last_flags++] = zip_flags; + zip_flags = 0; + zip_flag_bit = 1; + } + // Try to guess if it is profitable to stop the current block here + if (zip_compr_level > 2 && (zip_last_lit & 0xfff) == 0) { + // Compute an upper bound for the compressed length + var out_length = zip_last_lit * 8; + var in_length = zip_strstart - zip_block_start; + var dcode; + + for (dcode = 0; dcode < zip_D_CODES; dcode++) { + out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]); + } + out_length >>= 3; + // Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ", + // encoder->last_lit, encoder->last_dist, in_length, out_length, + // 100L - out_length*100L/in_length)); + if (zip_last_dist < parseInt(zip_last_lit / 2) && + out_length < parseInt(in_length / 2)) + return true; + } + return (zip_last_lit == zip_LIT_BUFSIZE - 1 || + zip_last_dist == zip_DIST_BUFSIZE); + /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + } + + /* ========================================================================== + * Send the block data compressed using the given Huffman trees + */ + function zip_compress_block( + ltree, // literal tree + dtree) { // distance tree + var dist; // distance of matched string + var lc; // match length or unmatched char (if dist == 0) + var lx = 0; // running index in l_buf + var dx = 0; // running index in d_buf + var fx = 0; // running index in flag_buf + var flag = 0; // current flags + var code; // the code to send + var extra; // number of extra bits to send + + if (zip_last_lit != 0) do { + if ((lx & 7) == 0) + flag = zip_flag_buf[fx++]; + lc = zip_l_buf[lx++] & 0xff; + if ((flag & 1) == 0) { + zip_SEND_CODE(lc, ltree); /* send a literal byte */ + // Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + // Here, lc is the match length - MIN_MATCH + code = zip_length_code[lc]; + zip_SEND_CODE(code + zip_LITERALS + 1, ltree); // send the length code + extra = zip_extra_lbits[code]; + if (extra != 0) { + lc -= zip_base_length[code]; + zip_send_bits(lc, extra); // send the extra length bits + } + dist = zip_d_buf[dx++]; + // Here, dist is the match distance - 1 + code = zip_D_CODE(dist); + // Assert (code < D_CODES, "bad d_code"); + + zip_SEND_CODE(code, dtree); // send the distance code + extra = zip_extra_dbits[code]; + if (extra != 0) { + dist -= zip_base_dist[code]; + zip_send_bits(dist, extra); // send the extra distance bits + } + } // literal or match pair ? + flag >>= 1; + } while (lx < zip_last_lit); + + zip_SEND_CODE(zip_END_BLOCK, ltree); + } + + /* ========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ + var zip_Buf_size = 16; // bit size of bi_buf + function zip_send_bits( + value, // value to send + length) { // number of bits + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (zip_bi_valid > zip_Buf_size - length) { + zip_bi_buf |= (value << zip_bi_valid); + zip_put_short(zip_bi_buf); + zip_bi_buf = (value >> (zip_Buf_size - zip_bi_valid)); + zip_bi_valid += length - zip_Buf_size; + } else { + zip_bi_buf |= value << zip_bi_valid; + zip_bi_valid += length; + } + } + + /* ========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ + function zip_bi_reverse( + code, // the value to invert + len) { // its bit length + var res = 0; + do { + res |= code & 1; + code >>= 1; + res <<= 1; + } while (--len > 0); + return res >> 1; + } + + /* ========================================================================== + * Write out any remaining bits in an incomplete byte. + */ + function zip_bi_windup() { + if (zip_bi_valid > 8) { + zip_put_short(zip_bi_buf); + } else if (zip_bi_valid > 0) { + zip_put_byte(zip_bi_buf); + } + zip_bi_buf = 0; + zip_bi_valid = 0; + } + + function zip_qoutbuf() { + if (zip_outcnt != 0) { + var q, i; + q = zip_new_queue(); + if (zip_qhead == null) + zip_qhead = zip_qtail = q; + else + zip_qtail = zip_qtail.next = q; + q.len = zip_outcnt - zip_outoff; + // System.arraycopy(zip_outbuf, zip_outoff, q.ptr, 0, q.len); + for (i = 0; i < q.len; i++) + q.ptr[i] = zip_outbuf[zip_outoff + i]; + zip_outcnt = zip_outoff = 0; + } + } + + return function deflate(str, level) { + var i, j; + + zip_deflate_data = str; + zip_deflate_pos = 0; + if (typeof level == "undefined") + level = zip_DEFAULT_LEVEL; + zip_deflate_start(level); + + var buff = new Array(1024); + var aout = []; + while ((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { + var cbuf = new Array(i); + for (j = 0; j < i; j++) { + cbuf[j] = String.fromCharCode(buff[j]); + } + aout[aout.length] = cbuf.join(""); + } + zip_deflate_data = null; // G.C. + return aout.join(""); + }; +})(); \ No newline at end of file diff --git a/js/front.js b/js/front.js deleted file mode 100644 index 45c0cf1..0000000 --- a/js/front.js +++ /dev/null @@ -1,384 +0,0 @@ -/* global $this: true */ -/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "animationsSlider" }] */ - -if ($.cookie('themeCSSpath')) { - $('link#theme-stylesheet').attr('href', $.cookie('themeCSSpath')) -} -if ($.cookie('themeLayout')) { - $('body').addClass($.cookie('themeLayout')) -} - -$(function () { - sliderHomepage() - sliders() - fullScreenContainer() - productDetailGallery(4000) - menuSliding() - productDetailSizes() - utils() - animations() - counters() - demo() - contactForm() -}) - -// Ajax contact -function contactForm () { - var form = $('.contact-form') - form.submit(function () { - $this = $(this) - $.post($(this).attr('action'), - $this.serialize(), - function () { - $this[0].reset() // clear form - - $('#contact-message') - .html('') - .fadeIn() - } - , 'json') - return false - }) -} - -/* for demo purpose only - can be deleted */ -function demo () { - if ($.cookie('themeCSSpath')) { - $('link#theme-stylesheet').attr('href', $.cookie('themeCSSpath')) - } - - $('#colour').change(function () { - if ($(this).val() !== '') { - var themeCSSpath = 'css/style.' + $(this).val() + '.css' - - $('link#theme-stylesheet').attr('href', themeCSSpath) - - $.cookie('themeCSSpath', themeCSSpath, {expires: 365, path: '/'}) - } - - return false - }) - - $('#layout').change(function () { - if ($(this).val() !== '') { - var themeLayout = $(this).val() - - $('body').removeClass('wide') - $('body').removeClass('boxed') - - $('body').addClass(themeLayout) - - $.cookie('themeLayout', themeLayout, {expires: 365, path: '/'}) - } - - return false - }) -} - -/* slider homepage */ -function sliderHomepage () { - if ($('#slider').length) { - // var owl = $('#slider') - - $('#slider').owlCarousel({ - autoPlay: 3000, - items: 4, - itemsDesktopSmall: [900, 3], - itemsTablet: [600, 3], - itemsMobile: [500, 2] - }) - } -} - -/* sliders */ -function sliders () { - if ($('.owl-carousel').length) { - $('.customers').owlCarousel({ - items: 6, - itemsDesktopSmall: [990, 4], - itemsTablet: [768, 2], - itemsMobile: [480, 1] - }) - - $('.testimonials').owlCarousel({ - items: 4, - itemsDesktopSmall: [990, 3], - itemsTablet: [768, 2], - itemsMobile: [480, 1] - }) - - $('.project').owlCarousel({ - navigation: true, // Show next and prev buttons - navigationText: ['', ''], - slideSpeed: 300, - paginationSpeed: 400, - autoPlay: true, - stopOnHover: true, - singleItem: true, - afterInit: '', - lazyLoad: true - }) - - $('.homepage').owlCarousel({ - navigation: false, // Show next and prev buttons - navigationText: ['', ''], - slideSpeed: 2000, - paginationSpeed: 1000, - autoPlay: true, - stopOnHover: true, - singleItem: true, - lazyLoad: false, - addClassActive: true, - afterInit: function () { - // animationsSlider() - }, - afterMove: function () { - // animationsSlider() - } - }) - } -} - -/* menu sliding */ -function menuSliding () { - $('.dropdown').on('show.bs.dropdown', function () { - if ($(window).width() > 750) { - $(this).find('.dropdown-menu').first().stop(true, true).slideDown() - } else { - $(this).find('.dropdown-menu').first().stop(true, true).show() - } - }) - - $('.dropdown').on('hide.bs.dropdown', function () { - if ($(window).width() > 750) { - $(this).find('.dropdown-menu').first().stop(true, true).slideUp() - } else { - $(this).find('.dropdown-menu').first().stop(true, true).hide() - } - }) -} - -/* animations */ -function animations () { - var delayTime = 0 - $('[data-animate]').css({opacity: '0'}) - $('[data-animate]').waypoint(function () { - delayTime += 150 - $(this).delay(delayTime).queue(function (next) { - $(this).toggleClass('animated') - $(this).toggleClass($(this).data('animate')) - delayTime = 0 - next() - // $(this).removeClass('animated') - // $(this).toggleClass($(this).data('animate')) - }) - }, { - offset: '90%', - triggerOnce: true - }) - - $('[data-animate-hover]').hover(function () { - $(this).css({opacity: 1}) - $(this).addClass('animated') - $(this).removeClass($(this).data('animate')) - $(this).addClass($(this).data('animate-hover')) - }, function () { - $(this).removeClass('animated') - $(this).removeClass($(this).data('animate-hover')) - }) -} - -function animationsSlider () { - var delayTimeSlider = 400 - - $('.owl-item:not(.active) [data-animate-always]').each(function () { - $(this).removeClass('animated') - $(this).removeClass($(this).data('animate-always')) - $(this).stop(true, true, true).css({opacity: 0}) - }) - - $('.owl-item.active [data-animate-always]').each(function () { - delayTimeSlider += 500 - - $(this).delay(delayTimeSlider).queue(function () { - $(this).addClass('animated') - $(this).addClass($(this).data('animate-always')) - - console.log($(this).data('animate-always')) - }) - }) -} - -/* counters */ -function counters () { - $('.counter').counterUp({ - delay: 10, - time: 1000 - }) -} - -/* picture zoom */ -function pictureZoom () { - $('.product .image, .post .image, .photostream div').each(function () { - var imgHeight = $(this).find('img').height() - if (imgHeight) { - $(this).height(imgHeight) - } - }) -} - -/* full screen intro */ -function fullScreenContainer () { - var screenWidth = $(window).width() + 'px' - var screenHeight = '500px' - - if ($(window).height() > 500) { - screenHeight = $(window).height() + 'px' - } - - $('#intro, #intro .item').css({ - width: screenWidth, - height: screenHeight - }) -} - -function utils () { - /* tooltips */ - $('[data-toggle="tooltip"]').tooltip() - - /* click on the box activates the radio */ - $('#checkout').on('click', '.box.shipping-method, .box.payment-method', function () { - var radio = $(this).find(':radio') - radio.prop('checked', true) - }) - - /* click on the box activates the link in it */ - $('.box.clickable').on('click', function () { - window.location = $(this).find('a').attr('href') - }) - - /* external links in new window */ - $('.external').on('click', function (e) { - e.preventDefault() - window.open($(this).attr('href')) - }) - - /* animated scrolling */ - $('.scroll-to, .scroll-to-top').click(function (event) { - var fullUrl = this.href - var parts = fullUrl.split('#') - - if (parts.length > 1) { - scrollTo(fullUrl) - event.preventDefault() - } - }) - - function scrollTo (fullUrl) { - var parts = fullUrl.split('#') - var trgt = parts[1] - var targetOffset = $('#' + trgt).offset() - var targetTop = targetOffset.top - 100 - - if (targetTop < 0) { - targetTop = 0 - } - - $('html, body').animate({ - scrollTop: targetTop - }, 1000) - } -} - -/* product detail gallery */ -function productDetailGallery (confDetailSwitch) { - $('.thumb:first').addClass('active') - var timer = setInterval(autoSwitch, confDetailSwitch) - - $('.thumb').click(function (e) { - switchImage($(this)) - clearInterval(timer) - timer = setInterval(autoSwitch, confDetailSwitch) - e.preventDefault() - }) - - $('#mainImage').hover(function () { - clearInterval(timer) - }, function () { - timer = setInterval(autoSwitch, confDetailSwitch) - }) - - function autoSwitch () { - var nextThumb = $('.thumb.active').closest('div').next('div').find('.thumb') - if (nextThumb.length === 0) { - nextThumb = $('.thumb:first') - } - switchImage(nextThumb) - } - - function switchImage (thumb) { - $('.thumb').removeClass('active') - var bigUrl = thumb.attr('href') - thumb.addClass('active') - $('#mainImage img').attr('src', bigUrl) - } -} - -/* product detail sizes */ -function productDetailSizes () { - $('.sizes a').click(function (e) { - e.preventDefault() - $('.sizes a').removeClass('active') - $('.size-input').prop('checked', false) - $(this).addClass('active') - $(this).next('input').prop('checked', true) - }) -} - -$.fn.alignElementsSameHeight = function () { - $('.same-height-row').each(function () { - var maxHeight = 0 - var children = $(this).find('.same-height') - children.height('auto') - - if ($(window).width() > 768) { - children.each(function () { - if ($(this).innerHeight() > maxHeight) { - maxHeight = $(this).innerHeight() - } - }) - children.innerHeight(maxHeight) - } - - maxHeight = 0 - children = $(this).find('.same-height-always') - children.height('auto') - children.each(function () { - if ($(this).height() > maxHeight) { - maxHeight = $(this).innerHeight() - } - }) - children.innerHeight(maxHeight) - }) -} - -var windowWidth -$(function () { - windowWidth = $(window).width() - - $(this).alignElementsSameHeight() - pictureZoom() -}) - -$(window).resize(function () { - var newWindowWidth = $(window).width() - - if (windowWidth !== newWindowWidth) { - setTimeout(function () { - $(this).alignElementsSameHeight() - fullScreenContainer() - pictureZoom() - }, 205) - windowWidth = newWindowWidth - } -}) diff --git a/js/gmaps.init.js b/js/gmaps.init.js deleted file mode 100644 index 2227dda..0000000 --- a/js/gmaps.init.js +++ /dev/null @@ -1,71 +0,0 @@ -/* global GMaps: true */ - -$(document).ready(function () { - map() -}) - -function map () { - if ($('#map').length) { - var lat = $('#gmap-lat').val() - var lng = $('#gmap-lng').val() - var direction = $('#gmap-dir').val() - var image = $('#gmap-marker').val() - - var styles = - [ - { - 'featureType': 'landscape', 'stylers': [{'saturation': -100}, {'lightness': 65}, {'visibility': 'on'}] - }, { - 'featureType': 'poi', 'stylers': [{'saturation': -100}, {'lightness': 51}, {'visibility': 'simplified'}] - }, { - 'featureType': 'road.highway', 'stylers': [{'saturation': -100}, {'visibility': 'simplified'}] - }, { - 'featureType': 'road.arterial', 'stylers': [{'saturation': -100}, {'lightness': 30}, {'visibility': 'on'}] - }, { - 'featureType': 'road.local', 'stylers': [{'saturation': -100}, {'lightness': 40}, {'visibility': 'on'}] - }, { - 'featureType': 'transit', 'stylers': [{'saturation': -100}, {'visibility': 'simplified'}] - }, { - 'featureType': 'administrative.province', 'stylers': [{'visibility': 'off'}] - }, { - 'featureType': 'water', 'elementType': 'labels', 'stylers': [{'visibility': 'on'}, {'lightness': -25}, {'saturation': -100}] - }, { - 'featureType': 'water', 'elementType': 'geometry', 'stylers': [{'hue': '#ffff00'}, {'lightness': -25}, {'saturation': -97}] - } - ] - - var map = new GMaps({ - el: '#map', - lat: lat, - lng: lng, - zoomControl: true, - zoomControlOpt: { - style: 'SMALL', - position: 'TOP_LEFT' - }, - panControl: false, - streetViewControl: false, - mapTypeControl: false, - overviewMapControl: false, - scrollwheel: false, - draggable: false, - styles: styles - }) - - map.addMarker({ - lat: lat, - lng: lng, - icon: image, - click: function (e) { - // when we get an address with spaces ... - var url = 'https://maps.google.com?daddr=' + direction.split('match').join('replace') - window.open(url, '_blank') - }, - title: direction - /* , - infoWindow: { - content: '

HTML Content

' - } */ - }) - } -} diff --git a/js/hpneo.gmaps.js b/js/hpneo.gmaps.js deleted file mode 100644 index 66b4959..0000000 --- a/js/hpneo.gmaps.js +++ /dev/null @@ -1,2132 +0,0 @@ -(function(root, factory) { - if(typeof exports === 'object') { - module.exports = factory(); - } - else if(typeof define === 'function' && define.amd) { - define('GMaps', [], factory); - } - - root.GMaps = factory(); - -}(this, function() { - -/*! - * GMaps.js v0.4.15 - * http://hpneo.github.com/gmaps/ - * - * Copyright 2014, Gustavo Leon - * Released under the MIT License. - */ - -if (!(typeof window.google === 'object' && window.google.maps)) { - throw 'Google Maps API is required. Please register the following JavaScript library http://maps.google.com/maps/api/js?sensor=true.' -} - -var extend_object = function(obj, new_obj) { - var name; - - if (obj === new_obj) { - return obj; - } - - for (name in new_obj) { - obj[name] = new_obj[name]; - } - - return obj; -}; - -var replace_object = function(obj, replace) { - var name; - - if (obj === replace) { - return obj; - } - - for (name in replace) { - if (obj[name] != undefined) { - obj[name] = replace[name]; - } - } - - return obj; -}; - -var array_map = function(array, callback) { - var original_callback_params = Array.prototype.slice.call(arguments, 2), - array_return = [], - array_length = array.length, - i; - - if (Array.prototype.map && array.map === Array.prototype.map) { - array_return = Array.prototype.map.call(array, function(item) { - callback_params = original_callback_params; - callback_params.splice(0, 0, item); - - return callback.apply(this, callback_params); - }); - } - else { - for (i = 0; i < array_length; i++) { - callback_params = original_callback_params; - callback_params.splice(0, 0, array[i]); - array_return.push(callback.apply(this, callback_params)); - } - } - - return array_return; -}; - -var array_flat = function(array) { - var new_array = [], - i; - - for (i = 0; i < array.length; i++) { - new_array = new_array.concat(array[i]); - } - - return new_array; -}; - -var coordsToLatLngs = function(coords, useGeoJSON) { - var first_coord = coords[0], - second_coord = coords[1]; - - if (useGeoJSON) { - first_coord = coords[1]; - second_coord = coords[0]; - } - - return new google.maps.LatLng(first_coord, second_coord); -}; - -var arrayToLatLng = function(coords, useGeoJSON) { - var i; - - for (i = 0; i < coords.length; i++) { - if (!(coords[i] instanceof google.maps.LatLng)) { - if (coords[i].length > 0 && typeof(coords[i][0]) == "object") { - coords[i] = arrayToLatLng(coords[i], useGeoJSON); - } - else { - coords[i] = coordsToLatLngs(coords[i], useGeoJSON); - } - } - } - - return coords; -}; - -var getElementById = function(id, context) { - var element, - id = id.replace('#', ''); - - if ('jQuery' in this && context) { - element = $("#" + id, context)[0]; - } else { - element = document.getElementById(id); - }; - - return element; -}; - -var findAbsolutePosition = function(obj) { - var curleft = 0, - curtop = 0; - - if (obj.offsetParent) { - do { - curleft += obj.offsetLeft; - curtop += obj.offsetTop; - } while (obj = obj.offsetParent); - } - - return [curleft, curtop]; -}; - -var GMaps = (function(global) { - "use strict"; - - var doc = document; - - var GMaps = function(options) { - if (!this) return new GMaps(options); - - options.zoom = options.zoom || 15; - options.mapType = options.mapType || 'roadmap'; - - var self = this, - i, - events_that_hide_context_menu = ['bounds_changed', 'center_changed', 'click', 'dblclick', 'drag', 'dragend', 'dragstart', 'idle', 'maptypeid_changed', 'projection_changed', 'resize', 'tilesloaded', 'zoom_changed'], - events_that_doesnt_hide_context_menu = ['mousemove', 'mouseout', 'mouseover'], - options_to_be_deleted = ['el', 'lat', 'lng', 'mapType', 'width', 'height', 'markerClusterer', 'enableNewStyle'], - container_id = options.el || options.div, - markerClustererFunction = options.markerClusterer, - mapType = google.maps.MapTypeId[options.mapType.toUpperCase()], - map_center = new google.maps.LatLng(options.lat, options.lng), - zoomControl = options.zoomControl || true, - zoomControlOpt = options.zoomControlOpt || { - style: 'DEFAULT', - position: 'TOP_LEFT' - }, - zoomControlStyle = zoomControlOpt.style || 'DEFAULT', - zoomControlPosition = zoomControlOpt.position || 'TOP_LEFT', - panControl = options.panControl || true, - mapTypeControl = options.mapTypeControl || true, - scaleControl = options.scaleControl || true, - streetViewControl = options.streetViewControl || true, - overviewMapControl = overviewMapControl || true, - map_options = {}, - map_base_options = { - zoom: this.zoom, - center: map_center, - mapTypeId: mapType - }, - map_controls_options = { - panControl: panControl, - zoomControl: zoomControl, - zoomControlOptions: { - style: google.maps.ZoomControlStyle[zoomControlStyle], - position: google.maps.ControlPosition[zoomControlPosition] - }, - mapTypeControl: mapTypeControl, - scaleControl: scaleControl, - streetViewControl: streetViewControl, - overviewMapControl: overviewMapControl - }; - - if (typeof(options.el) === 'string' || typeof(options.div) === 'string') { - this.el = getElementById(container_id, options.context); - } else { - this.el = container_id; - } - - if (typeof(this.el) === 'undefined' || this.el === null) { - throw 'No element defined.'; - } - - window.context_menu = window.context_menu || {}; - window.context_menu[self.el.id] = {}; - - this.controls = []; - this.overlays = []; - this.layers = []; // array with kml/georss and fusiontables layers, can be as many - this.singleLayers = {}; // object with the other layers, only one per layer - this.markers = []; - this.polylines = []; - this.routes = []; - this.polygons = []; - this.infoWindow = null; - this.overlay_el = null; - this.zoom = options.zoom; - this.registered_events = {}; - - this.el.style.width = options.width || this.el.scrollWidth || this.el.offsetWidth; - this.el.style.height = options.height || this.el.scrollHeight || this.el.offsetHeight; - - google.maps.visualRefresh = options.enableNewStyle; - - for (i = 0; i < options_to_be_deleted.length; i++) { - delete options[options_to_be_deleted[i]]; - } - - if(options.disableDefaultUI != true) { - map_base_options = extend_object(map_base_options, map_controls_options); - } - - map_options = extend_object(map_base_options, options); - - for (i = 0; i < events_that_hide_context_menu.length; i++) { - delete map_options[events_that_hide_context_menu[i]]; - } - - for (i = 0; i < events_that_doesnt_hide_context_menu.length; i++) { - delete map_options[events_that_doesnt_hide_context_menu[i]]; - } - - this.map = new google.maps.Map(this.el, map_options); - - if (markerClustererFunction) { - this.markerClusterer = markerClustererFunction.apply(this, [this.map]); - } - - var buildContextMenuHTML = function(control, e) { - var html = '', - options = window.context_menu[self.el.id][control]; - - for (var i in options){ - if (options.hasOwnProperty(i)) { - var option = options[i]; - - html += '
  • ' + option.title + '
  • '; - } - } - - if (!getElementById('gmaps_context_menu')) return; - - var context_menu_element = getElementById('gmaps_context_menu'); - - context_menu_element.innerHTML = html; - - var context_menu_items = context_menu_element.getElementsByTagName('a'), - context_menu_items_count = context_menu_items.length, - i; - - for (i = 0; i < context_menu_items_count; i++) { - var context_menu_item = context_menu_items[i]; - - var assign_menu_item_action = function(ev){ - ev.preventDefault(); - - options[this.id.replace(control + '_', '')].action.apply(self, [e]); - self.hideContextMenu(); - }; - - google.maps.event.clearListeners(context_menu_item, 'click'); - google.maps.event.addDomListenerOnce(context_menu_item, 'click', assign_menu_item_action, false); - } - - var position = findAbsolutePosition.apply(this, [self.el]), - left = position[0] + e.pixel.x - 15, - top = position[1] + e.pixel.y- 15; - - context_menu_element.style.left = left + "px"; - context_menu_element.style.top = top + "px"; - - context_menu_element.style.display = 'block'; - }; - - this.buildContextMenu = function(control, e) { - if (control === 'marker') { - e.pixel = {}; - - var overlay = new google.maps.OverlayView(); - overlay.setMap(self.map); - - overlay.draw = function() { - var projection = overlay.getProjection(), - position = e.marker.getPosition(); - - e.pixel = projection.fromLatLngToContainerPixel(position); - - buildContextMenuHTML(control, e); - }; - } - else { - buildContextMenuHTML(control, e); - } - }; - - this.setContextMenu = function(options) { - window.context_menu[self.el.id][options.control] = {}; - - var i, - ul = doc.createElement('ul'); - - for (i in options.options) { - if (options.options.hasOwnProperty(i)) { - var option = options.options[i]; - - window.context_menu[self.el.id][options.control][option.name] = { - title: option.title, - action: option.action - }; - } - } - - ul.id = 'gmaps_context_menu'; - ul.style.display = 'none'; - ul.style.position = 'absolute'; - ul.style.minWidth = '100px'; - ul.style.background = 'white'; - ul.style.listStyle = 'none'; - ul.style.padding = '8px'; - ul.style.boxShadow = '2px 2px 6px #ccc'; - - doc.body.appendChild(ul); - - var context_menu_element = getElementById('gmaps_context_menu') - - google.maps.event.addDomListener(context_menu_element, 'mouseout', function(ev) { - if (!ev.relatedTarget || !this.contains(ev.relatedTarget)) { - window.setTimeout(function(){ - context_menu_element.style.display = 'none'; - }, 400); - } - }, false); - }; - - this.hideContextMenu = function() { - var context_menu_element = getElementById('gmaps_context_menu'); - - if (context_menu_element) { - context_menu_element.style.display = 'none'; - } - }; - - var setupListener = function(object, name) { - google.maps.event.addListener(object, name, function(e){ - if (e == undefined) { - e = this; - } - - options[name].apply(this, [e]); - - self.hideContextMenu(); - }); - }; - - //google.maps.event.addListener(this.map, 'idle', this.hideContextMenu); - google.maps.event.addListener(this.map, 'zoom_changed', this.hideContextMenu); - - for (var ev = 0; ev < events_that_hide_context_menu.length; ev++) { - var name = events_that_hide_context_menu[ev]; - - if (name in options) { - setupListener(this.map, name); - } - } - - for (var ev = 0; ev < events_that_doesnt_hide_context_menu.length; ev++) { - var name = events_that_doesnt_hide_context_menu[ev]; - - if (name in options) { - setupListener(this.map, name); - } - } - - google.maps.event.addListener(this.map, 'rightclick', function(e) { - if (options.rightclick) { - options.rightclick.apply(this, [e]); - } - - if(window.context_menu[self.el.id]['map'] != undefined) { - self.buildContextMenu('map', e); - } - }); - - this.refresh = function() { - google.maps.event.trigger(this.map, 'resize'); - }; - - this.fitZoom = function() { - var latLngs = [], - markers_length = this.markers.length, - i; - - for (i = 0; i < markers_length; i++) { - if(typeof(this.markers[i].visible) === 'boolean' && this.markers[i].visible) { - latLngs.push(this.markers[i].getPosition()); - } - } - - this.fitLatLngBounds(latLngs); - }; - - this.fitLatLngBounds = function(latLngs) { - var total = latLngs.length; - var bounds = new google.maps.LatLngBounds(); - - for(var i=0; i < total; i++) { - bounds.extend(latLngs[i]); - } - - this.map.fitBounds(bounds); - }; - - this.setCenter = function(lat, lng, callback) { - this.map.panTo(new google.maps.LatLng(lat, lng)); - - if (callback) { - callback(); - } - }; - - this.getElement = function() { - return this.el; - }; - - this.zoomIn = function(value) { - value = value || 1; - - this.zoom = this.map.getZoom() + value; - this.map.setZoom(this.zoom); - }; - - this.zoomOut = function(value) { - value = value || 1; - - this.zoom = this.map.getZoom() - value; - this.map.setZoom(this.zoom); - }; - - var native_methods = [], - method; - - for (method in this.map) { - if (typeof(this.map[method]) == 'function' && !this[method]) { - native_methods.push(method); - } - } - - for (i=0; i < native_methods.length; i++) { - (function(gmaps, scope, method_name) { - gmaps[method_name] = function(){ - return scope[method_name].apply(scope, arguments); - }; - })(this, this.map, native_methods[i]); - } - }; - - return GMaps; -})(this); - -GMaps.prototype.createControl = function(options) { - var control = document.createElement('div'); - - control.style.cursor = 'pointer'; - - if (options.disableDefaultStyles !== true) { - control.style.fontFamily = 'Roboto, Arial, sans-serif'; - control.style.fontSize = '11px'; - control.style.boxShadow = 'rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px'; - } - - for (var option in options.style) { - control.style[option] = options.style[option]; - } - - if (options.id) { - control.id = options.id; - } - - if (options.classes) { - control.className = options.classes; - } - - if (options.content) { - if (typeof options.content === 'string') { - control.innerHTML = options.content; - } - else if (options.content instanceof HTMLElement) { - control.appendChild(options.content); - } - } - - if (options.position) { - control.position = google.maps.ControlPosition[options.position.toUpperCase()]; - } - - for (var ev in options.events) { - (function(object, name) { - google.maps.event.addDomListener(object, name, function(){ - options.events[name].apply(this, [this]); - }); - })(control, ev); - } - - control.index = 1; - - return control; -}; - -GMaps.prototype.addControl = function(options) { - var control = this.createControl(options); - this.controls.push(control); - this.map.controls[control.position].push(control); - - return control; -}; - -GMaps.prototype.removeControl = function(control) { - var position = null; - - for (var i = 0; i < this.controls.length; i++) { - if (this.controls[i] == control) { - position = this.controls[i].position; - this.controls.splice(i, 1); - } - } - - if (position) { - for (i = 0; i < this.map.controls.length; i++) { - var controlsForPosition = this.map.controls[control.position] - if (controlsForPosition.getAt(i) == control) { - controlsForPosition.removeAt(i); - break; - } - } - } - - return control; -}; - -GMaps.prototype.createMarker = function(options) { - if (options.lat == undefined && options.lng == undefined && options.position == undefined) { - throw 'No latitude or longitude defined.'; - } - - var self = this, - details = options.details, - fences = options.fences, - outside = options.outside, - base_options = { - position: new google.maps.LatLng(options.lat, options.lng), - map: null - }, - marker_options = extend_object(base_options, options); - - delete marker_options.lat; - delete marker_options.lng; - delete marker_options.fences; - delete marker_options.outside; - - var marker = new google.maps.Marker(marker_options); - - marker.fences = fences; - - if (options.infoWindow) { - marker.infoWindow = new google.maps.InfoWindow(options.infoWindow); - - var info_window_events = ['closeclick', 'content_changed', 'domready', 'position_changed', 'zindex_changed']; - - for (var ev = 0; ev < info_window_events.length; ev++) { - (function(object, name) { - if (options.infoWindow[name]) { - google.maps.event.addListener(object, name, function(e){ - options.infoWindow[name].apply(this, [e]); - }); - } - })(marker.infoWindow, info_window_events[ev]); - } - } - - var marker_events = ['animation_changed', 'clickable_changed', 'cursor_changed', 'draggable_changed', 'flat_changed', 'icon_changed', 'position_changed', 'shadow_changed', 'shape_changed', 'title_changed', 'visible_changed', 'zindex_changed']; - - var marker_events_with_mouse = ['dblclick', 'drag', 'dragend', 'dragstart', 'mousedown', 'mouseout', 'mouseover', 'mouseup']; - - for (var ev = 0; ev < marker_events.length; ev++) { - (function(object, name) { - if (options[name]) { - google.maps.event.addListener(object, name, function(){ - options[name].apply(this, [this]); - }); - } - })(marker, marker_events[ev]); - } - - for (var ev = 0; ev < marker_events_with_mouse.length; ev++) { - (function(map, object, name) { - if (options[name]) { - google.maps.event.addListener(object, name, function(me){ - if(!me.pixel){ - me.pixel = map.getProjection().fromLatLngToPoint(me.latLng) - } - - options[name].apply(this, [me]); - }); - } - })(this.map, marker, marker_events_with_mouse[ev]); - } - - google.maps.event.addListener(marker, 'click', function() { - this.details = details; - - if (options.click) { - options.click.apply(this, [this]); - } - - if (marker.infoWindow) { - self.hideInfoWindows(); - marker.infoWindow.open(self.map, marker); - } - }); - - google.maps.event.addListener(marker, 'rightclick', function(e) { - e.marker = this; - - if (options.rightclick) { - options.rightclick.apply(this, [e]); - } - - if (window.context_menu[self.el.id]['marker'] != undefined) { - self.buildContextMenu('marker', e); - } - }); - - if (marker.fences) { - google.maps.event.addListener(marker, 'dragend', function() { - self.checkMarkerGeofence(marker, function(m, f) { - outside(m, f); - }); - }); - } - - return marker; -}; - -GMaps.prototype.addMarker = function(options) { - var marker; - if(options.hasOwnProperty('gm_accessors_')) { - // Native google.maps.Marker object - marker = options; - } - else { - if ((options.hasOwnProperty('lat') && options.hasOwnProperty('lng')) || options.position) { - marker = this.createMarker(options); - } - else { - throw 'No latitude or longitude defined.'; - } - } - - marker.setMap(this.map); - - if(this.markerClusterer) { - this.markerClusterer.addMarker(marker); - } - - this.markers.push(marker); - - GMaps.fire('marker_added', marker, this); - - return marker; -}; - -GMaps.prototype.addMarkers = function(array) { - for (var i = 0, marker; marker=array[i]; i++) { - this.addMarker(marker); - } - - return this.markers; -}; - -GMaps.prototype.hideInfoWindows = function() { - for (var i = 0, marker; marker = this.markers[i]; i++){ - if (marker.infoWindow) { - marker.infoWindow.close(); - } - } -}; - -GMaps.prototype.removeMarker = function(marker) { - for (var i = 0; i < this.markers.length; i++) { - if (this.markers[i] === marker) { - this.markers[i].setMap(null); - this.markers.splice(i, 1); - - if(this.markerClusterer) { - this.markerClusterer.removeMarker(marker); - } - - GMaps.fire('marker_removed', marker, this); - - break; - } - } - - return marker; -}; - -GMaps.prototype.removeMarkers = function (collection) { - var new_markers = []; - - if (typeof collection == 'undefined') { - for (var i = 0; i < this.markers.length; i++) { - this.markers[i].setMap(null); - } - - this.markers = new_markers; - } - else { - for (var i = 0; i < collection.length; i++) { - if (this.markers.indexOf(collection[i]) > -1) { - this.markers[i].setMap(null); - } - } - - for (var i = 0; i < this.markers.length; i++) { - if (this.markers[i].getMap() != null) { - new_markers.push(this.markers[i]); - } - } - - this.markers = new_markers; - } -}; - -GMaps.prototype.drawOverlay = function(options) { - var overlay = new google.maps.OverlayView(), - auto_show = true; - - overlay.setMap(this.map); - - if (options.auto_show != null) { - auto_show = options.auto_show; - } - - overlay.onAdd = function() { - var el = document.createElement('div'); - - el.style.borderStyle = "none"; - el.style.borderWidth = "0px"; - el.style.position = "absolute"; - el.style.zIndex = 100; - el.innerHTML = options.content; - - overlay.el = el; - - if (!options.layer) { - options.layer = 'overlayLayer'; - } - - var panes = this.getPanes(), - overlayLayer = panes[options.layer], - stop_overlay_events = ['contextmenu', 'DOMMouseScroll', 'dblclick', 'mousedown']; - - overlayLayer.appendChild(el); - - for (var ev = 0; ev < stop_overlay_events.length; ev++) { - (function(object, name) { - google.maps.event.addDomListener(object, name, function(e){ - if (navigator.userAgent.toLowerCase().indexOf('msie') != -1 && document.all) { - e.cancelBubble = true; - e.returnValue = false; - } - else { - e.stopPropagation(); - } - }); - })(el, stop_overlay_events[ev]); - } - - if (options.click) { - panes.overlayMouseTarget.appendChild(overlay.el); - google.maps.event.addDomListener(overlay.el, 'click', function() { - options.click.apply(overlay, [overlay]); - }); - } - - google.maps.event.trigger(this, 'ready'); - }; - - overlay.draw = function() { - var projection = this.getProjection(), - pixel = projection.fromLatLngToDivPixel(new google.maps.LatLng(options.lat, options.lng)); - - options.horizontalOffset = options.horizontalOffset || 0; - options.verticalOffset = options.verticalOffset || 0; - - var el = overlay.el, - content = el.children[0], - content_height = content.clientHeight, - content_width = content.clientWidth; - - switch (options.verticalAlign) { - case 'top': - el.style.top = (pixel.y - content_height + options.verticalOffset) + 'px'; - break; - default: - case 'middle': - el.style.top = (pixel.y - (content_height / 2) + options.verticalOffset) + 'px'; - break; - case 'bottom': - el.style.top = (pixel.y + options.verticalOffset) + 'px'; - break; - } - - switch (options.horizontalAlign) { - case 'left': - el.style.left = (pixel.x - content_width + options.horizontalOffset) + 'px'; - break; - default: - case 'center': - el.style.left = (pixel.x - (content_width / 2) + options.horizontalOffset) + 'px'; - break; - case 'right': - el.style.left = (pixel.x + options.horizontalOffset) + 'px'; - break; - } - - el.style.display = auto_show ? 'block' : 'none'; - - if (!auto_show) { - options.show.apply(this, [el]); - } - }; - - overlay.onRemove = function() { - var el = overlay.el; - - if (options.remove) { - options.remove.apply(this, [el]); - } - else { - overlay.el.parentNode.removeChild(overlay.el); - overlay.el = null; - } - }; - - this.overlays.push(overlay); - return overlay; -}; - -GMaps.prototype.removeOverlay = function(overlay) { - for (var i = 0; i < this.overlays.length; i++) { - if (this.overlays[i] === overlay) { - this.overlays[i].setMap(null); - this.overlays.splice(i, 1); - - break; - } - } -}; - -GMaps.prototype.removeOverlays = function() { - for (var i = 0, item; item = this.overlays[i]; i++) { - item.setMap(null); - } - - this.overlays = []; -}; - -GMaps.prototype.drawPolyline = function(options) { - var path = [], - points = options.path; - - if (points.length) { - if (points[0][0] === undefined) { - path = points; - } - else { - for (var i=0, latlng; latlng=points[i]; i++) { - path.push(new google.maps.LatLng(latlng[0], latlng[1])); - } - } - } - - var polyline_options = { - map: this.map, - path: path, - strokeColor: options.strokeColor, - strokeOpacity: options.strokeOpacity, - strokeWeight: options.strokeWeight, - geodesic: options.geodesic, - clickable: true, - editable: false, - visible: true - }; - - if (options.hasOwnProperty("clickable")) { - polyline_options.clickable = options.clickable; - } - - if (options.hasOwnProperty("editable")) { - polyline_options.editable = options.editable; - } - - if (options.hasOwnProperty("icons")) { - polyline_options.icons = options.icons; - } - - if (options.hasOwnProperty("zIndex")) { - polyline_options.zIndex = options.zIndex; - } - - var polyline = new google.maps.Polyline(polyline_options); - - var polyline_events = ['click', 'dblclick', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'rightclick']; - - for (var ev = 0; ev < polyline_events.length; ev++) { - (function(object, name) { - if (options[name]) { - google.maps.event.addListener(object, name, function(e){ - options[name].apply(this, [e]); - }); - } - })(polyline, polyline_events[ev]); - } - - this.polylines.push(polyline); - - GMaps.fire('polyline_added', polyline, this); - - return polyline; -}; - -GMaps.prototype.removePolyline = function(polyline) { - for (var i = 0; i < this.polylines.length; i++) { - if (this.polylines[i] === polyline) { - this.polylines[i].setMap(null); - this.polylines.splice(i, 1); - - GMaps.fire('polyline_removed', polyline, this); - - break; - } - } -}; - -GMaps.prototype.removePolylines = function() { - for (var i = 0, item; item = this.polylines[i]; i++) { - item.setMap(null); - } - - this.polylines = []; -}; - -GMaps.prototype.drawCircle = function(options) { - options = extend_object({ - map: this.map, - center: new google.maps.LatLng(options.lat, options.lng) - }, options); - - delete options.lat; - delete options.lng; - - var polygon = new google.maps.Circle(options), - polygon_events = ['click', 'dblclick', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'rightclick']; - - for (var ev = 0; ev < polygon_events.length; ev++) { - (function(object, name) { - if (options[name]) { - google.maps.event.addListener(object, name, function(e){ - options[name].apply(this, [e]); - }); - } - })(polygon, polygon_events[ev]); - } - - this.polygons.push(polygon); - - return polygon; -}; - -GMaps.prototype.drawRectangle = function(options) { - options = extend_object({ - map: this.map - }, options); - - var latLngBounds = new google.maps.LatLngBounds( - new google.maps.LatLng(options.bounds[0][0], options.bounds[0][1]), - new google.maps.LatLng(options.bounds[1][0], options.bounds[1][1]) - ); - - options.bounds = latLngBounds; - - var polygon = new google.maps.Rectangle(options), - polygon_events = ['click', 'dblclick', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'rightclick']; - - for (var ev = 0; ev < polygon_events.length; ev++) { - (function(object, name) { - if (options[name]) { - google.maps.event.addListener(object, name, function(e){ - options[name].apply(this, [e]); - }); - } - })(polygon, polygon_events[ev]); - } - - this.polygons.push(polygon); - - return polygon; -}; - -GMaps.prototype.drawPolygon = function(options) { - var useGeoJSON = false; - - if(options.hasOwnProperty("useGeoJSON")) { - useGeoJSON = options.useGeoJSON; - } - - delete options.useGeoJSON; - - options = extend_object({ - map: this.map - }, options); - - if (useGeoJSON == false) { - options.paths = [options.paths.slice(0)]; - } - - if (options.paths.length > 0) { - if (options.paths[0].length > 0) { - options.paths = array_flat(array_map(options.paths, arrayToLatLng, useGeoJSON)); - } - } - - var polygon = new google.maps.Polygon(options), - polygon_events = ['click', 'dblclick', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'rightclick']; - - for (var ev = 0; ev < polygon_events.length; ev++) { - (function(object, name) { - if (options[name]) { - google.maps.event.addListener(object, name, function(e){ - options[name].apply(this, [e]); - }); - } - })(polygon, polygon_events[ev]); - } - - this.polygons.push(polygon); - - GMaps.fire('polygon_added', polygon, this); - - return polygon; -}; - -GMaps.prototype.removePolygon = function(polygon) { - for (var i = 0; i < this.polygons.length; i++) { - if (this.polygons[i] === polygon) { - this.polygons[i].setMap(null); - this.polygons.splice(i, 1); - - GMaps.fire('polygon_removed', polygon, this); - - break; - } - } -}; - -GMaps.prototype.removePolygons = function() { - for (var i = 0, item; item = this.polygons[i]; i++) { - item.setMap(null); - } - - this.polygons = []; -}; - -GMaps.prototype.getFromFusionTables = function(options) { - var events = options.events; - - delete options.events; - - var fusion_tables_options = options, - layer = new google.maps.FusionTablesLayer(fusion_tables_options); - - for (var ev in events) { - (function(object, name) { - google.maps.event.addListener(object, name, function(e) { - events[name].apply(this, [e]); - }); - })(layer, ev); - } - - this.layers.push(layer); - - return layer; -}; - -GMaps.prototype.loadFromFusionTables = function(options) { - var layer = this.getFromFusionTables(options); - layer.setMap(this.map); - - return layer; -}; - -GMaps.prototype.getFromKML = function(options) { - var url = options.url, - events = options.events; - - delete options.url; - delete options.events; - - var kml_options = options, - layer = new google.maps.KmlLayer(url, kml_options); - - for (var ev in events) { - (function(object, name) { - google.maps.event.addListener(object, name, function(e) { - events[name].apply(this, [e]); - }); - })(layer, ev); - } - - this.layers.push(layer); - - return layer; -}; - -GMaps.prototype.loadFromKML = function(options) { - var layer = this.getFromKML(options); - layer.setMap(this.map); - - return layer; -}; - -GMaps.prototype.addLayer = function(layerName, options) { - //var default_layers = ['weather', 'clouds', 'traffic', 'transit', 'bicycling', 'panoramio', 'places']; - options = options || {}; - var layer; - - switch(layerName) { - case 'weather': this.singleLayers.weather = layer = new google.maps.weather.WeatherLayer(); - break; - case 'clouds': this.singleLayers.clouds = layer = new google.maps.weather.CloudLayer(); - break; - case 'traffic': this.singleLayers.traffic = layer = new google.maps.TrafficLayer(); - break; - case 'transit': this.singleLayers.transit = layer = new google.maps.TransitLayer(); - break; - case 'bicycling': this.singleLayers.bicycling = layer = new google.maps.BicyclingLayer(); - break; - case 'panoramio': - this.singleLayers.panoramio = layer = new google.maps.panoramio.PanoramioLayer(); - layer.setTag(options.filter); - delete options.filter; - - //click event - if (options.click) { - google.maps.event.addListener(layer, 'click', function(event) { - options.click(event); - delete options.click; - }); - } - break; - case 'places': - this.singleLayers.places = layer = new google.maps.places.PlacesService(this.map); - - //search, nearbySearch, radarSearch callback, Both are the same - if (options.search || options.nearbySearch || options.radarSearch) { - var placeSearchRequest = { - bounds : options.bounds || null, - keyword : options.keyword || null, - location : options.location || null, - name : options.name || null, - radius : options.radius || null, - rankBy : options.rankBy || null, - types : options.types || null - }; - - if (options.radarSearch) { - layer.radarSearch(placeSearchRequest, options.radarSearch); - } - - if (options.search) { - layer.search(placeSearchRequest, options.search); - } - - if (options.nearbySearch) { - layer.nearbySearch(placeSearchRequest, options.nearbySearch); - } - } - - //textSearch callback - if (options.textSearch) { - var textSearchRequest = { - bounds : options.bounds || null, - location : options.location || null, - query : options.query || null, - radius : options.radius || null - }; - - layer.textSearch(textSearchRequest, options.textSearch); - } - break; - } - - if (layer !== undefined) { - if (typeof layer.setOptions == 'function') { - layer.setOptions(options); - } - if (typeof layer.setMap == 'function') { - layer.setMap(this.map); - } - - return layer; - } -}; - -GMaps.prototype.removeLayer = function(layer) { - if (typeof(layer) == "string" && this.singleLayers[layer] !== undefined) { - this.singleLayers[layer].setMap(null); - - delete this.singleLayers[layer]; - } - else { - for (var i = 0; i < this.layers.length; i++) { - if (this.layers[i] === layer) { - this.layers[i].setMap(null); - this.layers.splice(i, 1); - - break; - } - } - } -}; - -var travelMode, unitSystem; - -GMaps.prototype.getRoutes = function(options) { - switch (options.travelMode) { - case 'bicycling': - travelMode = google.maps.TravelMode.BICYCLING; - break; - case 'transit': - travelMode = google.maps.TravelMode.TRANSIT; - break; - case 'driving': - travelMode = google.maps.TravelMode.DRIVING; - break; - default: - travelMode = google.maps.TravelMode.WALKING; - break; - } - - if (options.unitSystem === 'imperial') { - unitSystem = google.maps.UnitSystem.IMPERIAL; - } - else { - unitSystem = google.maps.UnitSystem.METRIC; - } - - var base_options = { - avoidHighways: false, - avoidTolls: false, - optimizeWaypoints: false, - waypoints: [] - }, - request_options = extend_object(base_options, options); - - request_options.origin = /string/.test(typeof options.origin) ? options.origin : new google.maps.LatLng(options.origin[0], options.origin[1]); - request_options.destination = /string/.test(typeof options.destination) ? options.destination : new google.maps.LatLng(options.destination[0], options.destination[1]); - request_options.travelMode = travelMode; - request_options.unitSystem = unitSystem; - - delete request_options.callback; - delete request_options.error; - - var self = this, - service = new google.maps.DirectionsService(); - - service.route(request_options, function(result, status) { - if (status === google.maps.DirectionsStatus.OK) { - for (var r in result.routes) { - if (result.routes.hasOwnProperty(r)) { - self.routes.push(result.routes[r]); - } - } - - if (options.callback) { - options.callback(self.routes); - } - } - else { - if (options.error) { - options.error(result, status); - } - } - }); -}; - -GMaps.prototype.removeRoutes = function() { - this.routes = []; -}; - -GMaps.prototype.getElevations = function(options) { - options = extend_object({ - locations: [], - path : false, - samples : 256 - }, options); - - if (options.locations.length > 0) { - if (options.locations[0].length > 0) { - options.locations = array_flat(array_map([options.locations], arrayToLatLng, false)); - } - } - - var callback = options.callback; - delete options.callback; - - var service = new google.maps.ElevationService(); - - //location request - if (!options.path) { - delete options.path; - delete options.samples; - - service.getElevationForLocations(options, function(result, status) { - if (callback && typeof(callback) === "function") { - callback(result, status); - } - }); - //path request - } else { - var pathRequest = { - path : options.locations, - samples : options.samples - }; - - service.getElevationAlongPath(pathRequest, function(result, status) { - if (callback && typeof(callback) === "function") { - callback(result, status); - } - }); - } -}; - -GMaps.prototype.cleanRoute = GMaps.prototype.removePolylines; - -GMaps.prototype.drawRoute = function(options) { - var self = this; - - this.getRoutes({ - origin: options.origin, - destination: options.destination, - travelMode: options.travelMode, - waypoints: options.waypoints, - unitSystem: options.unitSystem, - error: options.error, - callback: function(e) { - if (e.length > 0) { - self.drawPolyline({ - path: e[e.length - 1].overview_path, - strokeColor: options.strokeColor, - strokeOpacity: options.strokeOpacity, - strokeWeight: options.strokeWeight - }); - - if (options.callback) { - options.callback(e[e.length - 1]); - } - } - } - }); -}; - -GMaps.prototype.travelRoute = function(options) { - if (options.origin && options.destination) { - this.getRoutes({ - origin: options.origin, - destination: options.destination, - travelMode: options.travelMode, - waypoints : options.waypoints, - unitSystem: options.unitSystem, - error: options.error, - callback: function(e) { - //start callback - if (e.length > 0 && options.start) { - options.start(e[e.length - 1]); - } - - //step callback - if (e.length > 0 && options.step) { - var route = e[e.length - 1]; - if (route.legs.length > 0) { - var steps = route.legs[0].steps; - for (var i=0, step; step=steps[i]; i++) { - step.step_number = i; - options.step(step, (route.legs[0].steps.length - 1)); - } - } - } - - //end callback - if (e.length > 0 && options.end) { - options.end(e[e.length - 1]); - } - } - }); - } - else if (options.route) { - if (options.route.legs.length > 0) { - var steps = options.route.legs[0].steps; - for (var i=0, step; step=steps[i]; i++) { - step.step_number = i; - options.step(step); - } - } - } -}; - -GMaps.prototype.drawSteppedRoute = function(options) { - var self = this; - - if (options.origin && options.destination) { - this.getRoutes({ - origin: options.origin, - destination: options.destination, - travelMode: options.travelMode, - waypoints : options.waypoints, - error: options.error, - callback: function(e) { - //start callback - if (e.length > 0 && options.start) { - options.start(e[e.length - 1]); - } - - //step callback - if (e.length > 0 && options.step) { - var route = e[e.length - 1]; - if (route.legs.length > 0) { - var steps = route.legs[0].steps; - for (var i=0, step; step=steps[i]; i++) { - step.step_number = i; - self.drawPolyline({ - path: step.path, - strokeColor: options.strokeColor, - strokeOpacity: options.strokeOpacity, - strokeWeight: options.strokeWeight - }); - options.step(step, (route.legs[0].steps.length - 1)); - } - } - } - - //end callback - if (e.length > 0 && options.end) { - options.end(e[e.length - 1]); - } - } - }); - } - else if (options.route) { - if (options.route.legs.length > 0) { - var steps = options.route.legs[0].steps; - for (var i=0, step; step=steps[i]; i++) { - step.step_number = i; - self.drawPolyline({ - path: step.path, - strokeColor: options.strokeColor, - strokeOpacity: options.strokeOpacity, - strokeWeight: options.strokeWeight - }); - options.step(step); - } - } - } -}; - -GMaps.Route = function(options) { - this.origin = options.origin; - this.destination = options.destination; - this.waypoints = options.waypoints; - - this.map = options.map; - this.route = options.route; - this.step_count = 0; - this.steps = this.route.legs[0].steps; - this.steps_length = this.steps.length; - - this.polyline = this.map.drawPolyline({ - path: new google.maps.MVCArray(), - strokeColor: options.strokeColor, - strokeOpacity: options.strokeOpacity, - strokeWeight: options.strokeWeight - }).getPath(); -}; - -GMaps.Route.prototype.getRoute = function(options) { - var self = this; - - this.map.getRoutes({ - origin : this.origin, - destination : this.destination, - travelMode : options.travelMode, - waypoints : this.waypoints || [], - error: options.error, - callback : function() { - self.route = e[0]; - - if (options.callback) { - options.callback.call(self); - } - } - }); -}; - -GMaps.Route.prototype.back = function() { - if (this.step_count > 0) { - this.step_count--; - var path = this.route.legs[0].steps[this.step_count].path; - - for (var p in path){ - if (path.hasOwnProperty(p)){ - this.polyline.pop(); - } - } - } -}; - -GMaps.Route.prototype.forward = function() { - if (this.step_count < this.steps_length) { - var path = this.route.legs[0].steps[this.step_count].path; - - for (var p in path){ - if (path.hasOwnProperty(p)){ - this.polyline.push(path[p]); - } - } - this.step_count++; - } -}; - -GMaps.prototype.checkGeofence = function(lat, lng, fence) { - return fence.containsLatLng(new google.maps.LatLng(lat, lng)); -}; - -GMaps.prototype.checkMarkerGeofence = function(marker, outside_callback) { - if (marker.fences) { - for (var i = 0, fence; fence = marker.fences[i]; i++) { - var pos = marker.getPosition(); - if (!this.checkGeofence(pos.lat(), pos.lng(), fence)) { - outside_callback(marker, fence); - } - } - } -}; - -GMaps.prototype.toImage = function(options) { - var options = options || {}, - static_map_options = {}; - - static_map_options['size'] = options['size'] || [this.el.clientWidth, this.el.clientHeight]; - static_map_options['lat'] = this.getCenter().lat(); - static_map_options['lng'] = this.getCenter().lng(); - - if (this.markers.length > 0) { - static_map_options['markers'] = []; - - for (var i = 0; i < this.markers.length; i++) { - static_map_options['markers'].push({ - lat: this.markers[i].getPosition().lat(), - lng: this.markers[i].getPosition().lng() - }); - } - } - - if (this.polylines.length > 0) { - var polyline = this.polylines[0]; - - static_map_options['polyline'] = {}; - static_map_options['polyline']['path'] = google.maps.geometry.encoding.encodePath(polyline.getPath()); - static_map_options['polyline']['strokeColor'] = polyline.strokeColor - static_map_options['polyline']['strokeOpacity'] = polyline.strokeOpacity - static_map_options['polyline']['strokeWeight'] = polyline.strokeWeight - } - - return GMaps.staticMapURL(static_map_options); -}; - -GMaps.staticMapURL = function(options){ - var parameters = [], - data, - static_root = 'https://maps.googleapis.com/maps/api/staticmap'; - - if (options.url) { - static_root = options.url; - delete options.url; - } - - static_root += '?'; - - var markers = options.markers; - - delete options.markers; - - if (!markers && options.marker) { - markers = [options.marker]; - delete options.marker; - } - - var styles = options.styles; - - delete options.styles; - - var polyline = options.polyline; - delete options.polyline; - - /** Map options **/ - if (options.center) { - parameters.push('center=' + options.center); - delete options.center; - } - else if (options.address) { - parameters.push('center=' + options.address); - delete options.address; - } - else if (options.lat) { - parameters.push(['center=', options.lat, ',', options.lng].join('')); - delete options.lat; - delete options.lng; - } - else if (options.visible) { - var visible = encodeURI(options.visible.join('|')); - parameters.push('visible=' + visible); - } - - var size = options.size; - if (size) { - if (size.join) { - size = size.join('x'); - } - delete options.size; - } - else { - size = '630x300'; - } - parameters.push('size=' + size); - - if (!options.zoom && options.zoom !== false) { - options.zoom = 15; - } - - var sensor = options.hasOwnProperty('sensor') ? !!options.sensor : true; - delete options.sensor; - parameters.push('sensor=' + sensor); - - for (var param in options) { - if (options.hasOwnProperty(param)) { - parameters.push(param + '=' + options[param]); - } - } - - /** Markers **/ - if (markers) { - var marker, loc; - - for (var i=0; data=markers[i]; i++) { - marker = []; - - if (data.size && data.size !== 'normal') { - marker.push('size:' + data.size); - delete data.size; - } - else if (data.icon) { - marker.push('icon:' + encodeURI(data.icon)); - delete data.icon; - } - - if (data.color) { - marker.push('color:' + data.color.replace('#', '0x')); - delete data.color; - } - - if (data.label) { - marker.push('label:' + data.label[0].toUpperCase()); - delete data.label; - } - - loc = (data.address ? data.address : data.lat + ',' + data.lng); - delete data.address; - delete data.lat; - delete data.lng; - - for(var param in data){ - if (data.hasOwnProperty(param)) { - marker.push(param + ':' + data[param]); - } - } - - if (marker.length || i === 0) { - marker.push(loc); - marker = marker.join('|'); - parameters.push('markers=' + encodeURI(marker)); - } - // New marker without styles - else { - marker = parameters.pop() + encodeURI('|' + loc); - parameters.push(marker); - } - } - } - - /** Map Styles **/ - if (styles) { - for (var i = 0; i < styles.length; i++) { - var styleRule = []; - if (styles[i].featureType){ - styleRule.push('feature:' + styles[i].featureType.toLowerCase()); - } - - if (styles[i].elementType) { - styleRule.push('element:' + styles[i].elementType.toLowerCase()); - } - - for (var j = 0; j < styles[i].stylers.length; j++) { - for (var p in styles[i].stylers[j]) { - var ruleArg = styles[i].stylers[j][p]; - if (p == 'hue' || p == 'color') { - ruleArg = '0x' + ruleArg.substring(1); - } - styleRule.push(p + ':' + ruleArg); - } - } - - var rule = styleRule.join('|'); - if (rule != '') { - parameters.push('style=' + rule); - } - } - } - - /** Polylines **/ - function parseColor(color, opacity) { - if (color[0] === '#'){ - color = color.replace('#', '0x'); - - if (opacity) { - opacity = parseFloat(opacity); - opacity = Math.min(1, Math.max(opacity, 0)); - if (opacity === 0) { - return '0x00000000'; - } - opacity = (opacity * 255).toString(16); - if (opacity.length === 1) { - opacity += opacity; - } - - color = color.slice(0,8) + opacity; - } - } - return color; - } - - if (polyline) { - data = polyline; - polyline = []; - - if (data.strokeWeight) { - polyline.push('weight:' + parseInt(data.strokeWeight, 10)); - } - - if (data.strokeColor) { - var color = parseColor(data.strokeColor, data.strokeOpacity); - polyline.push('color:' + color); - } - - if (data.fillColor) { - var fillcolor = parseColor(data.fillColor, data.fillOpacity); - polyline.push('fillcolor:' + fillcolor); - } - - var path = data.path; - if (path.join) { - for (var j=0, pos; pos=path[j]; j++) { - polyline.push(pos.join(',')); - } - } - else { - polyline.push('enc:' + path); - } - - polyline = polyline.join('|'); - parameters.push('path=' + encodeURI(polyline)); - } - - /** Retina support **/ - var dpi = window.devicePixelRatio || 1; - parameters.push('scale=' + dpi); - - parameters = parameters.join('&'); - return static_root + parameters; -}; - -GMaps.prototype.addMapType = function(mapTypeId, options) { - if (options.hasOwnProperty("getTileUrl") && typeof(options["getTileUrl"]) == "function") { - options.tileSize = options.tileSize || new google.maps.Size(256, 256); - - var mapType = new google.maps.ImageMapType(options); - - this.map.mapTypes.set(mapTypeId, mapType); - } - else { - throw "'getTileUrl' function required."; - } -}; - -GMaps.prototype.addOverlayMapType = function(options) { - if (options.hasOwnProperty("getTile") && typeof(options["getTile"]) == "function") { - var overlayMapTypeIndex = options.index; - - delete options.index; - - this.map.overlayMapTypes.insertAt(overlayMapTypeIndex, options); - } - else { - throw "'getTile' function required."; - } -}; - -GMaps.prototype.removeOverlayMapType = function(overlayMapTypeIndex) { - this.map.overlayMapTypes.removeAt(overlayMapTypeIndex); -}; - -GMaps.prototype.addStyle = function(options) { - var styledMapType = new google.maps.StyledMapType(options.styles, { name: options.styledMapName }); - - this.map.mapTypes.set(options.mapTypeId, styledMapType); -}; - -GMaps.prototype.setStyle = function(mapTypeId) { - this.map.setMapTypeId(mapTypeId); -}; - -GMaps.prototype.createPanorama = function(streetview_options) { - if (!streetview_options.hasOwnProperty('lat') || !streetview_options.hasOwnProperty('lng')) { - streetview_options.lat = this.getCenter().lat(); - streetview_options.lng = this.getCenter().lng(); - } - - this.panorama = GMaps.createPanorama(streetview_options); - - this.map.setStreetView(this.panorama); - - return this.panorama; -}; - -GMaps.createPanorama = function(options) { - var el = getElementById(options.el, options.context); - - options.position = new google.maps.LatLng(options.lat, options.lng); - - delete options.el; - delete options.context; - delete options.lat; - delete options.lng; - - var streetview_events = ['closeclick', 'links_changed', 'pano_changed', 'position_changed', 'pov_changed', 'resize', 'visible_changed'], - streetview_options = extend_object({visible : true}, options); - - for (var i = 0; i < streetview_events.length; i++) { - delete streetview_options[streetview_events[i]]; - } - - var panorama = new google.maps.StreetViewPanorama(el, streetview_options); - - for (var i = 0; i < streetview_events.length; i++) { - (function(object, name) { - if (options[name]) { - google.maps.event.addListener(object, name, function(){ - options[name].apply(this); - }); - } - })(panorama, streetview_events[i]); - } - - return panorama; -}; - -GMaps.prototype.on = function(event_name, handler) { - return GMaps.on(event_name, this, handler); -}; - -GMaps.prototype.off = function(event_name) { - GMaps.off(event_name, this); -}; - -GMaps.custom_events = ['marker_added', 'marker_removed', 'polyline_added', 'polyline_removed', 'polygon_added', 'polygon_removed', 'geolocated', 'geolocation_failed']; - -GMaps.on = function(event_name, object, handler) { - if (GMaps.custom_events.indexOf(event_name) == -1) { - if(object instanceof GMaps) object = object.map; - return google.maps.event.addListener(object, event_name, handler); - } - else { - var registered_event = { - handler : handler, - eventName : event_name - }; - - object.registered_events[event_name] = object.registered_events[event_name] || []; - object.registered_events[event_name].push(registered_event); - - return registered_event; - } -}; - -GMaps.off = function(event_name, object) { - if (GMaps.custom_events.indexOf(event_name) == -1) { - if(object instanceof GMaps) object = object.map; - google.maps.event.clearListeners(object, event_name); - } - else { - object.registered_events[event_name] = []; - } -}; - -GMaps.fire = function(event_name, object, scope) { - if (GMaps.custom_events.indexOf(event_name) == -1) { - google.maps.event.trigger(object, event_name, Array.prototype.slice.apply(arguments).slice(2)); - } - else { - if(event_name in scope.registered_events) { - var firing_events = scope.registered_events[event_name]; - - for(var i = 0; i < firing_events.length; i++) { - (function(handler, scope, object) { - handler.apply(scope, [object]); - })(firing_events[i]['handler'], scope, object); - } - } - } -}; - -GMaps.geolocate = function(options) { - var complete_callback = options.always || options.complete; - - if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition(function(position) { - options.success(position); - - if (complete_callback) { - complete_callback(); - } - }, function(error) { - options.error(error); - - if (complete_callback) { - complete_callback(); - } - }, options.options); - } - else { - options.not_supported(); - - if (complete_callback) { - complete_callback(); - } - } -}; - -GMaps.geocode = function(options) { - this.geocoder = new google.maps.Geocoder(); - var callback = options.callback; - if (options.hasOwnProperty('lat') && options.hasOwnProperty('lng')) { - options.latLng = new google.maps.LatLng(options.lat, options.lng); - } - - delete options.lat; - delete options.lng; - delete options.callback; - - this.geocoder.geocode(options, function(results, status) { - callback(results, status); - }); -}; - -//========================== -// Polygon containsLatLng -// https://github.com/tparkin/Google-Maps-Point-in-Polygon -// Poygon getBounds extension - google-maps-extensions -// http://code.google.com/p/google-maps-extensions/source/browse/google.maps.Polygon.getBounds.js -if (!google.maps.Polygon.prototype.getBounds) { - google.maps.Polygon.prototype.getBounds = function(latLng) { - var bounds = new google.maps.LatLngBounds(); - var paths = this.getPaths(); - var path; - - for (var p = 0; p < paths.getLength(); p++) { - path = paths.getAt(p); - for (var i = 0; i < path.getLength(); i++) { - bounds.extend(path.getAt(i)); - } - } - - return bounds; - }; -} - -if (!google.maps.Polygon.prototype.containsLatLng) { - // Polygon containsLatLng - method to determine if a latLng is within a polygon - google.maps.Polygon.prototype.containsLatLng = function(latLng) { - // Exclude points outside of bounds as there is no way they are in the poly - var bounds = this.getBounds(); - - if (bounds !== null && !bounds.contains(latLng)) { - return false; - } - - // Raycast point in polygon method - var inPoly = false; - - var numPaths = this.getPaths().getLength(); - for (var p = 0; p < numPaths; p++) { - var path = this.getPaths().getAt(p); - var numPoints = path.getLength(); - var j = numPoints - 1; - - for (var i = 0; i < numPoints; i++) { - var vertex1 = path.getAt(i); - var vertex2 = path.getAt(j); - - if (vertex1.lng() < latLng.lng() && vertex2.lng() >= latLng.lng() || vertex2.lng() < latLng.lng() && vertex1.lng() >= latLng.lng()) { - if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < latLng.lat()) { - inPoly = !inPoly; - } - } - - j = i; - } - } - - return inPoly; - }; -} - -if (!google.maps.Circle.prototype.containsLatLng) { - google.maps.Circle.prototype.containsLatLng = function(latLng) { - if (google.maps.geometry) { - return google.maps.geometry.spherical.computeDistanceBetween(this.getCenter(), latLng) <= this.getRadius(); - } - else { - return true; - } - }; -} - -google.maps.LatLngBounds.prototype.containsLatLng = function(latLng) { - return this.contains(latLng); -}; - -google.maps.Marker.prototype.setFences = function(fences) { - this.fences = fences; -}; - -google.maps.Marker.prototype.addFence = function(fence) { - this.fences.push(fence); -}; - -google.maps.Marker.prototype.getId = function() { - return this['__gm_id']; -}; - -//========================== -// Array indexOf -// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf -if (!Array.prototype.indexOf) { - Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { - "use strict"; - if (this == null) { - throw new TypeError(); - } - var t = Object(this); - var len = t.length >>> 0; - if (len === 0) { - return -1; - } - var n = 0; - if (arguments.length > 1) { - n = Number(arguments[1]); - if (n != n) { // shortcut for verifying if it's NaN - n = 0; - } else if (n != 0 && n != Infinity && n != -Infinity) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - } - if (n >= len) { - return -1; - } - var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); - for (; k < len; k++) { - if (k in t && t[k] === searchElement) { - return k; - } - } - return -1; - } -} - -return GMaps; -})); diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..101a305 --- /dev/null +++ b/js/main.js @@ -0,0 +1,278 @@ +/* + * Copyright 2018 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +(function($) { + + 'use strict'; + + $(function() { + $('[data-toggle="tooltip"]').tooltip(); + $('[data-toggle="popover"]').popover(); + + $('.popover-dismiss').popover({ + trigger: 'focus' + }) + }); + + + function bottomPos(element) { + return element.offset().top + element.outerHeight(); + } + + // Bootstrap Fixed Header + $(function() { + var promo = $(".js-td-cover"); + if (!promo.length) { + return + } + + var promoOffset = bottomPos(promo); + var navbarOffset = $('.js-navbar-scroll').offset().top; + + var threshold = Math.ceil($('.js-navbar-scroll').outerHeight()); + if ((promoOffset - navbarOffset) < threshold) { + $('.js-navbar-scroll').addClass('navbar-bg-onscroll'); + } + + + $(window).on('scroll', function() { + var navtop = $('.js-navbar-scroll').offset().top - $(window).scrollTop(); + var promoOffset = bottomPos($('.js-td-cover')); + var navbarOffset = $('.js-navbar-scroll').offset().top; + if ((promoOffset - navbarOffset) < threshold) { + $('.js-navbar-scroll').addClass('navbar-bg-onscroll'); + } else { + $('.js-navbar-scroll').removeClass('navbar-bg-onscroll'); + $('.js-navbar-scroll').addClass('navbar-bg-onscroll--fade'); + } + }); + }); + + +}(jQuery)); + +; +/* + * Copyright 2018 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +(function ($) { + 'use strict'; + + // Headers' anchor link that shows on hover + $(function () { + // append anchor links to headings in markdown. + var article = document.getElementsByTagName('main')[0]; + if (!article) { + return; + } + var headings = article.querySelectorAll('h1, h2, h3, h4, h5, h6'); + headings.forEach(function (heading) { + if (heading.id) { + var a = document.createElement('a'); + // set visibility: hidden, not display: none to avoid layout change + a.style.visibility = 'hidden'; + // [a11y] hide this from screen readers, etc.. + a.setAttribute('aria-hidden', 'true'); + // material insert_link icon in svg format + a.innerHTML = ' '; + a.href = '#' + heading.id; + heading.insertAdjacentElement('beforeend', a); + heading.addEventListener('mouseenter', function () { + a.style.visibility = 'initial'; + }); + heading.addEventListener('mouseleave', function () { + a.style.visibility = 'hidden'; + }); + } + }); + }); + +}(jQuery)); + +; +/* +Copyright 2018 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +(function($) { + + 'use strict'; + + var Search = { + init: function() { + $(document).ready(function() { + $(document).on('keypress', '.td-search-input', function(e) { + if (e.keyCode !== 13) { + return + } + + var query = $(this).val(); + var searchPage = "https://www.eclipse.org/sw360/search/?q=" + query; + document.location = searchPage; + + return false; + }); + + }); + }, + }; + + Search.init(); + + +}(jQuery)); + +; + + +; + + +; + + +; + + +(function () { + var shade; + var iframe; + + var insertFrame = function () { + shade = document.createElement('div'); + shade.classList.add('drawioframe'); + iframe = document.createElement('iframe'); + shade.appendChild(iframe); + document.body.appendChild(shade); + } + + var closeFrame = function () { + if (shade) { + document.body.removeChild(shade); + shade = undefined; + iframe = undefined; + } + } + + var imghandler = function (img, imgdata) { + var url = "https://embed.diagrams.net/"; + url += '?embed=1&ui=atlas&spin=1&modified=unsavedChanges&proto=json&saveAndEdit=1&noSaveBtn=1'; + + var wrapper = document.createElement('div'); + wrapper.classList.add('drawio'); + img.parentNode.insertBefore(wrapper, img); + wrapper.appendChild(img); + + var btn = document.createElement('button'); + btn.classList.add('drawiobtn'); + btn.insertAdjacentHTML('beforeend', ''); + wrapper.appendChild(btn); + + btn.addEventListener('click', function (evt) { + if (iframe) return; + insertFrame(); + var handler = function (evt) { + var wind = iframe.contentWindow; + if (evt.data.length > 0 && evt.source == wind) { + var msg = JSON.parse(evt.data); + + if (msg.event == 'init') { + wind.postMessage(JSON.stringify({action: 'load', xml: imgdata}), '*'); + + } else if (msg.event == 'save') { + var fmt = imgdata.indexOf('data:image/png') == 0 ? 'xmlpng' : 'xmlsvg'; + wind.postMessage(JSON.stringify({action: 'export', format: fmt}), '*'); + + } else if (msg.event == 'export') { + const fn = img.src.replace(/^.*?([^/]+)$/, '$1'); + const dl = document.createElement('a'); + dl.setAttribute('href', msg.data); + dl.setAttribute('download', fn); + document.body.appendChild(dl); + dl.click(); + dl.parentNode.removeChild(dl); + } + + if (msg.event == 'exit' || msg.event == 'export') { + window.removeEventListener('message', handler); + closeFrame(); + } + } + }; + + window.addEventListener('message', handler); + iframe.setAttribute('src', url); + }); + }; + + +document.addEventListener('DOMContentLoaded', function () { + // find all the png and svg images that may have embedded xml diagrams + for (const el of document.getElementsByTagName('img')) { + const img = el; + const src = img.getAttribute('src'); + if (!src.endsWith('.svg') && !src.endsWith('.png')) { + continue; + } + + const xhr = new XMLHttpRequest(); + xhr.responseType = 'blob'; + xhr.open("GET", src); + xhr.addEventListener("load", function () { + const fr = new FileReader(); + fr.addEventListener('load', function () { + if (fr.result.indexOf('mxfile') != -1) { + const fr = new FileReader(); + fr.addEventListener('load', function () { + const imgdata = fr.result; + imghandler(img, imgdata); + }); + fr.readAsDataURL(xhr.response); + } + }); + fr.readAsBinaryString(xhr.response); + }); + xhr.send(); + }; +}); +}()); + + diff --git a/js/owl.carousel.min.js b/js/owl.carousel.min.js deleted file mode 100644 index 98ae16e..0000000 --- a/js/owl.carousel.min.js +++ /dev/null @@ -1 +0,0 @@ -eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7(A 3c.3q!=="9"){3c.3q=9(e){9 t(){}t.5S=e;p 5R t}}(9(e,t,n){h r={1N:9(t,n){h r=c;r.$k=e(n);r.6=e.4M({},e.37.2B.6,r.$k.v(),t);r.2A=t;r.4L()},4L:9(){9 r(e){h n,r="";7(A t.6.33==="9"){t.6.33.R(c,[e])}l{1A(n 38 e.d){7(e.d.5M(n)){r+=e.d[n].1K}}t.$k.2y(r)}t.3t()}h t=c,n;7(A t.6.2H==="9"){t.6.2H.R(c,[t.$k])}7(A t.6.2O==="2Y"){n=t.6.2O;e.5K(n,r)}l{t.3t()}},3t:9(){h e=c;e.$k.v("d-4I",e.$k.2x("2w")).v("d-4F",e.$k.2x("H"));e.$k.z({2u:0});e.2t=e.6.q;e.4E();e.5v=0;e.1X=14;e.23()},23:9(){h e=c;7(e.$k.25().N===0){p b}e.1M();e.4C();e.$S=e.$k.25();e.E=e.$S.N;e.4B();e.$G=e.$k.17(".d-1K");e.$K=e.$k.17(".d-1p");e.3u="U";e.13=0;e.26=[0];e.m=0;e.4A();e.4z()},4z:9(){h e=c;e.2V();e.2W();e.4t();e.30();e.4r();e.4q();e.2p();e.4o();7(e.6.2o!==b){e.4n(e.6.2o)}7(e.6.O===j){e.6.O=4Q}e.19();e.$k.17(".d-1p").z("4i","4h");7(!e.$k.2m(":3n")){e.3o()}l{e.$k.z("2u",1)}e.5O=b;e.2l();7(A e.6.3s==="9"){e.6.3s.R(c,[e.$k])}},2l:9(){h e=c;7(e.6.1Z===j){e.1Z()}7(e.6.1B===j){e.1B()}e.4g();7(A e.6.3w==="9"){e.6.3w.R(c,[e.$k])}},3x:9(){h e=c;7(A e.6.3B==="9"){e.6.3B.R(c,[e.$k])}e.3o();e.2V();e.2W();e.4f();e.30();e.2l();7(A e.6.3D==="9"){e.6.3D.R(c,[e.$k])}},3F:9(){h e=c;t.1c(9(){e.3x()},0)},3o:9(){h e=c;7(e.$k.2m(":3n")===b){e.$k.z({2u:0});t.18(e.1C);t.18(e.1X)}l{p b}e.1X=t.4d(9(){7(e.$k.2m(":3n")){e.3F();e.$k.4b({2u:1},2M);t.18(e.1X)}},5x)},4B:9(){h e=c;e.$S.5n(\'\').4a(\'\');e.$k.17(".d-1p").4a(\'\');e.1H=e.$k.17(".d-1p-49");e.$k.z("4i","4h")},1M:9(){h e=c,t=e.$k.1I(e.6.1M),n=e.$k.1I(e.6.2i);7(!t){e.$k.I(e.6.1M)}7(!n){e.$k.I(e.6.2i)}},2V:9(){h t=c,n,r;7(t.6.2Z===b){p b}7(t.6.48===j){t.6.q=t.2t=1;t.6.1h=b;t.6.1s=b;t.6.1O=b;t.6.22=b;t.6.1Q=b;t.6.1R=b;p b}n=e(t.6.47).1f();7(n>(t.6.1s[0]||t.2t)){t.6.q=t.2t}7(t.6.1h!==b){t.6.1h.5g(9(e,t){p e[0]-t[0]});1A(r=0;rt.E&&t.6.46===j){t.6.q=t.E}},4r:9(){h n=c,r,i;7(n.6.2Z!==j){p b}i=e(t).1f();n.3d=9(){7(e(t).1f()!==i){7(n.6.O!==b){t.18(n.1C)}t.5d(r);r=t.1c(9(){i=e(t).1f();n.3x()},n.6.45)}};e(t).44(n.3d)},4f:9(){h e=c;e.2g(e.m);7(e.6.O!==b){e.3j()}},43:9(){h t=c,n=0,r=t.E-t.6.q;t.$G.2f(9(i){h s=e(c);s.z({1f:t.M}).v("d-1K",3p(i));7(i%t.6.q===0||i===r){7(!(i>r)){n+=1}}s.v("d-24",n)})},42:9(){h e=c,t=e.$G.N*e.M;e.$K.z({1f:t*2,T:0});e.43()},2W:9(){h e=c;e.40();e.42();e.3Z();e.3v()},40:9(){h e=c;e.M=1F.4O(e.$k.1f()/e.6.q)},3v:9(){h e=c,t=(e.E*e.M-e.6.q*e.M)*-1;7(e.6.q>e.E){e.D=0;t=0;e.3z=0}l{e.D=e.E-e.6.q;e.3z=t}p t},3Y:9(){p 0},3Z:9(){h t=c,n=0,r=0,i,s,o;t.J=[0];t.3E=[];1A(i=0;i\').5m("5l",!t.F.15).5c(t.$k)}7(t.6.1v===j){t.3T()}7(t.6.2a===j){t.3S()}},3S:9(){h t=c,n=e(\'\');t.B.1o(n);t.1u=e("",{"H":"d-1n",2y:t.6.2U[0]||""});t.1q=e("",{"H":"d-U",2y:t.6.2U[1]||""});n.1o(t.1u).1o(t.1q);n.w("2X.B 21.B",\'L[H^="d"]\',9(e){e.1l()});n.w("2n.B 28.B",\'L[H^="d"]\',9(n){n.1l();7(e(c).1I("d-U")){t.U()}l{t.1n()}})},3T:9(){h t=c;t.1k=e(\'\');t.B.1o(t.1k);t.1k.w("2n.B 28.B",".d-1j",9(n){n.1l();7(3p(e(c).v("d-1j"))!==t.m){t.1g(3p(e(c).v("d-1j")),j)}})},3P:9(){h t=c,n,r,i,s,o,u;7(t.6.1v===b){p b}t.1k.2y("");n=0;r=t.E-t.E%t.6.q;1A(s=0;s",{"H":"d-1j"});u=e("<3N>",{4R:t.6.39===j?n:"","H":t.6.39===j?"d-59":""});o.1o(u);o.v("d-1j",r===s?i:s);o.v("d-24",n);t.1k.1o(o)}}t.35()},35:9(){h t=c;7(t.6.1v===b){p b}t.1k.17(".d-1j").2f(9(){7(e(c).v("d-24")===e(t.$G[t.m]).v("d-24")){t.1k.17(".d-1j").Z("2d");e(c).I("2d")}})},3e:9(){h e=c;7(e.6.2a===b){p b}7(e.6.2e===b){7(e.m===0&&e.D===0){e.1u.I("1b");e.1q.I("1b")}l 7(e.m===0&&e.D!==0){e.1u.I("1b");e.1q.Z("1b")}l 7(e.m===e.D){e.1u.Z("1b");e.1q.I("1b")}l 7(e.m!==0&&e.m!==e.D){e.1u.Z("1b");e.1q.Z("1b")}}},30:9(){h e=c;e.3P();e.3e();7(e.B){7(e.6.q>=e.E){e.B.3K()}l{e.B.3J()}}},55:9(){h e=c;7(e.B){e.B.3k()}},U:9(e){h t=c;7(t.1E){p b}t.m+=t.6.12===j?t.6.q:1;7(t.m>t.D+(t.6.12===j?t.6.q-1:0)){7(t.6.2e===j){t.m=0;e="2k"}l{t.m=t.D;p b}}t.1g(t.m,e)},1n:9(e){h t=c;7(t.1E){p b}7(t.6.12===j&&t.m>0&&t.m=i.D){e=i.D}l 7(e<=0){e=0}i.m=i.d.m=e;7(i.6.2o!==b&&r!=="4e"&&i.6.q===1&&i.F.1x===j){i.1t(0);7(i.F.1x===j){i.1L(i.J[e])}l{i.1r(i.J[e],1)}i.2r();i.4l();p b}s=i.J[e];7(i.F.1x===j){i.1T=b;7(n===j){i.1t("1w");t.1c(9(){i.1T=j},i.6.1w)}l 7(n==="2k"){i.1t(i.6.2v);t.1c(9(){i.1T=j},i.6.2v)}l{i.1t("1m");t.1c(9(){i.1T=j},i.6.1m)}i.1L(s)}l{7(n===j){i.1r(s,i.6.1w)}l 7(n==="2k"){i.1r(s,i.6.2v)}l{i.1r(s,i.6.1m)}}i.2r()},2g:9(e){h t=c;7(A t.6.1Y==="9"){t.6.1Y.R(c,[t.$k])}7(e>=t.D||e===-1){e=t.D}l 7(e<=0){e=0}t.1t(0);7(t.F.1x===j){t.1L(t.J[e])}l{t.1r(t.J[e],1)}t.m=t.d.m=e;t.2r()},2r:9(){h e=c;e.26.2D(e.m);e.13=e.d.13=e.26[e.26.N-2];e.26.5f(0);7(e.13!==e.m){e.35();e.3e();e.2l();7(e.6.O!==b){e.3j()}}7(A e.6.3y==="9"&&e.13!==e.m){e.6.3y.R(c,[e.$k])}},X:9(){h e=c;e.3A="X";t.18(e.1C)},3j:9(){h e=c;7(e.3A!=="X"){e.19()}},19:9(){h e=c;e.3A="19";7(e.6.O===b){p b}t.18(e.1C);e.1C=t.4d(9(){e.U(j)},e.6.O)},1t:9(e){h t=c;7(e==="1m"){t.$K.z(t.2z(t.6.1m))}l 7(e==="1w"){t.$K.z(t.2z(t.6.1w))}l 7(A e!=="2Y"){t.$K.z(t.2z(e))}},2z:9(e){p{"-1G-1a":"2C "+e+"1z 2s","-1W-1a":"2C "+e+"1z 2s","-o-1a":"2C "+e+"1z 2s",1a:"2C "+e+"1z 2s"}},3H:9(){p{"-1G-1a":"","-1W-1a":"","-o-1a":"",1a:""}},3I:9(e){p{"-1G-P":"1i("+e+"V, C, C)","-1W-P":"1i("+e+"V, C, C)","-o-P":"1i("+e+"V, C, C)","-1z-P":"1i("+e+"V, C, C)",P:"1i("+e+"V, C,C)"}},1L:9(e){h t=c;t.$K.z(t.3I(e))},3L:9(e){h t=c;t.$K.z({T:e})},1r:9(e,t){h n=c;n.29=b;n.$K.X(j,j).4b({T:e},{54:t||n.6.1m,3M:9(){n.29=j}})},4E:9(){h e=c,r="1i(C, C, C)",i=n.56("L"),s,o,u,a;i.2w.3O=" -1W-P:"+r+"; -1z-P:"+r+"; -o-P:"+r+"; -1G-P:"+r+"; P:"+r;s=/1i\\(C, C, C\\)/g;o=i.2w.3O.5i(s);u=o!==14&&o.N===1;a="5z"38 t||t.5Q.4P;e.F={1x:u,15:a}},4q:9(){h e=c;7(e.6.27!==b||e.6.1U!==b){e.3Q();e.3R()}},4C:9(){h e=c,t=["s","e","x"];e.16={};7(e.6.27===j&&e.6.1U===j){t=["2X.d 21.d","2N.d 3U.d","2n.d 3V.d 28.d"]}l 7(e.6.27===b&&e.6.1U===j){t=["2X.d","2N.d","2n.d 3V.d"]}l 7(e.6.27===j&&e.6.1U===b){t=["21.d","3U.d","28.d"]}e.16.3W=t[0];e.16.2K=t[1];e.16.2J=t[2]},3R:9(){h t=c;t.$k.w("5y.d",9(e){e.1l()});t.$k.w("21.3X",9(t){p e(t.1d).2m("5C, 5E, 5F, 5N")})},3Q:9(){9 s(e){7(e.2b!==W){p{x:e.2b[0].2c,y:e.2b[0].41}}7(e.2b===W){7(e.2c!==W){p{x:e.2c,y:e.41}}7(e.2c===W){p{x:e.52,y:e.53}}}}9 o(t){7(t==="w"){e(n).w(r.16.2K,a);e(n).w(r.16.2J,f)}l 7(t==="Q"){e(n).Q(r.16.2K);e(n).Q(r.16.2J)}}9 u(n){h u=n.3h||n||t.3g,a;7(u.5a===3){p b}7(r.E<=r.6.q){p}7(r.29===b&&!r.6.3f){p b}7(r.1T===b&&!r.6.3f){p b}7(r.6.O!==b){t.18(r.1C)}7(r.F.15!==j&&!r.$K.1I("3b")){r.$K.I("3b")}r.11=0;r.Y=0;e(c).z(r.3H());a=e(c).2h();i.2S=a.T;i.2R=s(u).x-a.T;i.2P=s(u).y-a.5o;o("w");i.2j=b;i.2L=u.1d||u.4c}9 a(o){h u=o.3h||o||t.3g,a,f;r.11=s(u).x-i.2R;r.2I=s(u).y-i.2P;r.Y=r.11-i.2S;7(A r.6.2E==="9"&&i.3C!==j&&r.Y!==0){i.3C=j;r.6.2E.R(r,[r.$k])}7((r.Y>8||r.Y<-8)&&r.F.15===j){7(u.1l!==W){u.1l()}l{u.5L=b}i.2j=j}7((r.2I>10||r.2I<-10)&&i.2j===b){e(n).Q("2N.d")}a=9(){p r.Y/5};f=9(){p r.3z+r.Y/5};r.11=1F.3v(1F.3Y(r.11,a()),f());7(r.F.1x===j){r.1L(r.11)}l{r.3L(r.11)}}9 f(n){h s=n.3h||n||t.3g,u,a,f;s.1d=s.1d||s.4c;i.3C=b;7(r.F.15!==j){r.$K.Z("3b")}7(r.Y<0){r.1y=r.d.1y="T"}l{r.1y=r.d.1y="3i"}7(r.Y!==0){u=r.4j();r.1g(u,b,"4e");7(i.2L===s.1d&&r.F.15!==j){e(s.1d).w("3a.4k",9(t){t.4S();t.4T();t.1l();e(t.1d).Q("3a.4k")});a=e.4N(s.1d,"4V").3a;f=a.4W();a.4X(0,0,f)}}o("Q")}h r=c,i={2R:0,2P:0,4Y:0,2S:0,2h:14,4Z:14,50:14,2j:14,51:14,2L:14};r.29=j;r.$k.w(r.16.3W,".d-1p",u)},4j:9(){h e=c,t=e.4m();7(t>e.D){e.m=e.D;t=e.D}l 7(e.11>=0){t=0;e.m=0}p t},4m:9(){h t=c,n=t.6.12===j?t.3E:t.J,r=t.11,i=14;e.2f(n,9(s,o){7(r-t.M/20>n[s+1]&&r-t.M/20(n[s+1]||n[s]-t.M)&&t.34()==="3i"){7(t.6.12===j){i=n[s+1]||n[n.N-1];t.m=e.4p(i,t.J)}l{i=n[s+1];t.m=s+1}}});p t.m},34:9(){h e=c,t;7(e.Y<0){t="3i";e.3u="U"}l{t="T";e.3u="1n"}p t},4A:9(){h e=c;e.$k.w("d.U",9(){e.U()});e.$k.w("d.1n",9(){e.1n()});e.$k.w("d.19",9(t,n){e.6.O=n;e.19();e.32="19"});e.$k.w("d.X",9(){e.X();e.32="X"});e.$k.w("d.1g",9(t,n){e.1g(n)});e.$k.w("d.2g",9(t,n){e.2g(n)})},2p:9(){h e=c;7(e.6.2p===j&&e.F.15!==j&&e.6.O!==b){e.$k.w("57",9(){e.X()});e.$k.w("58",9(){7(e.32!=="X"){e.19()}})}},1Z:9(){h t=c,n,r,i,s,o;7(t.6.1Z===b){p b}1A(n=0;n=t.m}l{o=j}7(o&&i=n.$S.N||r===-1){n.$S.1S(-1).5X(e)}l{n.$S.1S(r).5Y(e)}n.23()},5Z:9(e){h t=c,n;7(t.$k.25().N===0){p b}7(e===W||e===-1){n=-1}l{n=e}t.1V();t.$S.1S(n).3k();t.23()}};e.37.2B=9(t){p c.2f(9(){7(e(c).v("d-1N")===j){p b}e(c).v("d-1N",j);h n=3c.3q(r);n.1N(t,c);e.v(c,"2B",n)})};e.37.2B.6={q:5,1h:b,1s:[60,4],1O:[61,3],22:[62,2],1Q:b,1R:[63,1],48:b,46:b,1m:2M,1w:64,2v:65,O:b,2p:b,2a:b,2U:["1n","U"],2e:j,12:b,1v:j,39:b,2Z:j,45:2M,47:t,1M:"d-66",2i:"d-2i",1Z:b,4v:j,4x:"4y",1B:b,2O:b,33:b,3f:j,27:j,1U:j,2F:b,2o:b,3B:b,3D:b,2H:b,3s:b,1Y:b,3y:b,3w:b,2E:b,2T:b}})(67,68,69)',62,382,'||||||options|if||function||false|this|owl||||var||true|elem|else|currentItem|||return|items|||||data|on|||css|typeof|owlControls|0px|maximumItem|itemsAmount|browser|owlItems|class|addClass|positionsInArray|owlWrapper|div|itemWidth|length|autoPlay|transform|off|apply|userItems|left|next|px|undefined|stop|newRelativeX|removeClass||newPosX|scrollPerPage|prevItem|null|isTouch|ev_types|find|clearInterval|play|transition|disabled|setTimeout|target|loaded|width|goTo|itemsCustom|translate3d|page|paginationWrapper|preventDefault|slideSpeed|prev|append|wrapper|buttonNext|css2slide|itemsDesktop|swapSpeed|buttonPrev|pagination|paginationSpeed|support3d|dragDirection|ms|for|autoHeight|autoPlayInterval|visibleItems|isTransition|Math|webkit|wrapperOuter|hasClass|src|item|transition3d|baseClass|init|itemsDesktopSmall|origin|itemsTabletSmall|itemsMobile|eq|isCss3Finish|touchDrag|unWrap|moz|checkVisible|beforeMove|lazyLoad||mousedown|itemsTablet|setVars|roundPages|children|prevArr|mouseDrag|mouseup|isCssFinish|navigation|touches|pageX|active|rewindNav|each|jumpTo|position|theme|sliding|rewind|eachMoveUpdate|is|touchend|transitionStyle|stopOnHover|100|afterGo|ease|orignalItems|opacity|rewindSpeed|style|attr|html|addCssSpeed|userOptions|owlCarousel|all|push|startDragging|addClassActive|height|beforeInit|newPosY|end|move|targetElement|200|touchmove|jsonPath|offsetY|completeImg|offsetX|relativePos|afterLazyLoad|navigationText|updateItems|calculateAll|touchstart|string|responsive|updateControls|clearTransStyle|hoverStatus|jsonSuccess|moveDirection|checkPagination|endCurrent|fn|in|paginationNumbers|click|grabbing|Object|resizer|checkNavigation|dragBeforeAnimFinish|event|originalEvent|right|checkAp|remove|get|endPrev|visible|watchVisibility|Number|create|unwrap|afterInit|logIn|playDirection|max|afterAction|updateVars|afterMove|maximumPixels|apStatus|beforeUpdate|dragging|afterUpdate|pagesInArray|reload|clearEvents|removeTransition|doTranslate|show|hide|css2move|complete|span|cssText|updatePagination|gestures|disabledEvents|buildButtons|buildPagination|mousemove|touchcancel|start|disableTextSelect|min|loops|calculateWidth|pageY|appendWrapperSizes|appendItemsSizes|resize|responsiveRefreshRate|itemsScaleUp|responsiveBaseWidth|singleItem|outer|wrap|animate|srcElement|setInterval|drag|updatePosition|onVisibleItems|block|display|getNewPosition|disable|singleItemTransition|closestItem|transitionTypes|owlStatus|inArray|moveEvents|response|continue|buildControls|loading|lazyFollow|lazyPreload|lazyEffect|fade|onStartup|customEvents|wrapItems|eventTypes|naturalWidth|checkBrowser|originalClasses|outClass|inClass|originalStyles|abs|perspective|loadContent|extend|_data|round|msMaxTouchPoints|5e3|text|stopImmediatePropagation|stopPropagation|buttons|events|pop|splice|baseElWidth|minSwipe|maxSwipe|dargging|clientX|clientY|duration|destroyControls|createElement|mouseover|mouseout|numbers|which|lazyOwl|appendTo|clearTimeout|checked|shift|sort|removeAttr|match|fadeIn|400|clickable|toggleClass|wrapAll|top|prop|tagName|DIV|background|image|url|wrapperWidth|img|500|dragstart|ontouchstart|controls|out|input|relative|textarea|select|webkitAnimationEnd|oAnimationEnd|MSAnimationEnd|animationend|getJSON|returnValue|hasOwnProperty|option|onstartup|baseElement|navigator|new|prototype|destroy|removeData|reinit|addItem|after|before|removeItem|1199|979|768|479|800|1e3|carousel|jQuery|window|document'.split('|'),0,{})) \ No newline at end of file diff --git a/js/prism.js b/js/prism.js new file mode 100644 index 0000000..ae881ac --- /dev/null +++ b/js/prism.js @@ -0,0 +1,21 @@ +/* PrismJS 1.21.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+c+csharp+cpp+go+java+markdown+python+scss+sql+toml+yaml&plugins=toolbar+copy-to-clipboard */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);k+=y.value.length,y=y.next){var b=y.value;if(t.length>n.length)return;if(!(b instanceof W)){var x=1;if(h&&y!=t.tail.prev){m.lastIndex=k;var w=m.exec(n);if(!w)break;var A=w.index+(f&&w[1]?w[1].length:0),P=w.index+w[0].length,S=k;for(S+=y.value.length;S<=A;)y=y.next,S+=y.value.length;if(S-=y.value.length,k=S,y.value instanceof W)continue;for(var E=y;E!==t.tail&&(Sl.reach&&(l.reach=j);var C=y.prev;L&&(C=I(t,C,L),k+=L.length),z(t,C,x);var _=new W(o,g?M.tokenize(O,g):O,v,O);y=I(t,C,_),N&&I(t,y,N),1"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var e=M.util.currentScript();function t(){M.manual||M.highlightAll()}if(e&&(M.filename=e.src,e.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var r=document.readyState;"loading"===r||"interactive"===r&&e&&e.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:s}};n["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var t={};t[a]={pattern:RegExp("(<__[^]*?>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(e){var s=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+s.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+s.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+s.source+")*?(?=\\s*\\{)"),string:{pattern:s,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript; +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\](?:\\\\)*)(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\2)[^\\])*\2/,lookbehind:!0,greedy:!0,inside:n}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}};for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],r=n.variable[1].inside,s=0;s>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean; +!function(s){function a(e,s){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+s[+n]+")"})}function t(e,n,s){return RegExp(a(e,n),s||"")}function e(e,n){for(var s=0;s>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface struct",i="add alias and ascending async await by descending from get global group into join let nameof not notnull on or orderby partial remove select set unmanaged value when where where",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(n+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(n+" "+r+" "+o),g=e("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=e("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=a("<<0>>(?:\\s*<<1>>)?",[h,g]),m=a("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=a("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=a("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[a("\\(<<0>>+(?:,<<0>>+)+\\)",[a("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k])]),m,k]),v={keyword:p,punctuation:/[<>()?,.:[\]]/},x="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",$='"(?:\\\\.|[^\\\\"\r\n])*"';s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[$]),lookbehind:!0,greedy:!0},{pattern:RegExp(x),greedy:!0,alias:"character"}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,w]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:v},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:v},{pattern:t("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:v},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[w,u,h]),inside:v}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|typeof|sizeof)\\s*\\(\\s*)(?:[^()\\s]|\\s(?!\\s*\\))|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:v},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[w,m]),inside:v,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[w]),lookbehind:!0,inside:v,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:t("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:v}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>)(?:\\s*,\\s*(?:<<3>>|<<4>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,w,p.source]),lookbehind:!0,inside:{keyword:p,"class-name":{pattern:RegExp(w),greedy:!0,inside:v},punctuation:/,/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=$+"|"+x,B=a("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[_]),E=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),R="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",P=a("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,E]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[R,P]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[R]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[E]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var z=":[^}\r\n]+",S=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),j=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[S,z]),A=e(a("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[_]),2),F=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[A,z]);function U(e,n){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[e]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[n,z]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[j]),lookbehind:!0,greedy:!0,inside:U(j,S)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[F]),lookbehind:!0,greedy:!0,inside:U(F,A)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp; +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/;e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),e.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)(?:[^;{}"'])+?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","operator",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); +Prism.languages.go=Prism.languages.extend("clike",{keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,number:/(?:\b0x[a-f\d]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[-+]?\d+)?)i?/i,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0}}),delete Prism.languages.go["class-name"]; +!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|record|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,a=/\b[A-Z](?:\w*[a-z]\w*)?\b/;e.languages.java=e.languages.extend("clike",{"class-name":[a,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:t,function:[e.languages.clike.function,{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism); +!function(d){function n(n){return n=n.replace(//g,function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?!\n|\r\n?))"}),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var e="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",t="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|$)".replace(/__/g,function(){return e}),a="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";d.languages.markdown=d.languages.extend("markup",{}),d.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+t+a+"(?:"+t+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+t+a+")(?:"+t+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(e),inside:d.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+t+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+t+"$"),inside:{"table-header":{pattern:RegExp(e),alias:"important",inside:d.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\r\n]+`/,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#+.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n("(~~?)(?:(?!~))+?\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},url:{pattern:n('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)| ?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(\[)[^\]]+(?=\]$)/,lookbehind:!0},content:{pattern:/(^!?\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},string:{pattern:/"(?:\\.|[^"\\])*"(?=\)$)/}}}}),["url","bold","italic","strike"].forEach(function(e){["url","bold","italic","strike"].forEach(function(n){e!==n&&(d.languages.markdown[e].inside.content.inside[n]=d.languages.markdown[n])})}),d.hooks.add("after-tokenize",function(n){"markdown"!==n.language&&"md"!==n.language||!function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-]+(?:\([^()]+\)|[^(])*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()]|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}]+[:{][^}]+))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[\w-]|\$[-\w]+|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:S|ING)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+\.?\d*|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|IN|LIKE|NOT|OR|IS|DIV|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; +!function(e){function n(e){return e.replace(/__/g,function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"})}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^\\s*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^\\s*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:true|false)\b/,punctuation:/[.,=[\]{}]/}}(Prism); +!function(n){var t=/[*&][^\s[\]{},]+/,e=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+e.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+e.source+")?)";function a(n,t){t=(t||"").replace(/m/g,"")+"m";var e="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|]|}|\\s*#))".replace(/<>/g,function(){return r}).replace(/<>/g,function(){return n});return RegExp(e,t)}n.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\\2[^\r\n]+)*)".replace(/<>/g,function(){return r})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)[^\r\n{[\\]},#\\s]+?(?=\\s*:\\s)".replace(/<>/g,function(){return r})),lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:a("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?)?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:a("true|false","i"),lookbehind:!0,alias:"important"},null:{pattern:a("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:a("(\"|')(?:(?!\\2)[^\\\\\r\n]|\\\\.)*\\2"),lookbehind:!0,greedy:!0},number:{pattern:a("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+\\.?\\d*|\\.?\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:e,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},n.languages.yml=n.languages.yaml}(Prism); +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var i=[],l={},c=function(){};Prism.plugins.toolbar={};var e=Prism.plugins.toolbar.registerButton=function(e,n){var t;t="function"==typeof n?n:function(e){var t;return"function"==typeof n.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",function(){n.onClick.call(this,e)})):"string"==typeof n.url?(t=document.createElement("a")).href=n.url:t=document.createElement("span"),n.className&&t.classList.add(n.className),t.textContent=n.text,t},e in l?console.warn('There is a button with the key "'+e+'" registered already.'):i.push(l[e]=t)},t=Prism.plugins.toolbar.hook=function(a){var e=a.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&!e.parentNode.classList.contains("code-toolbar")){var t=document.createElement("div");t.classList.add("code-toolbar"),e.parentNode.insertBefore(t,e),t.appendChild(e);var r=document.createElement("div");r.classList.add("toolbar");var n=i,o=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);o&&(n=o.map(function(e){return l[e]||c})),n.forEach(function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),r.appendChild(n)}}),t.appendChild(r)}};e("label",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}}),Prism.hooks.add("complete",t)}}(); +!function(){if("undefined"!=typeof self&&self.Prism&&self.document)if(Prism.plugins.toolbar){var i=window.ClipboardJS||void 0;i||"function"!=typeof require||(i=require("clipboard"));var c=[];if(!i){var o=document.createElement("script"),t=document.querySelector("head");o.onload=function(){if(i=window.ClipboardJS)for(;c.length;)c.pop()()},o.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",t.appendChild(o)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(o){var t=document.createElement("button");t.textContent="Copy";var e=o.element;return i?n():c.push(n),t;function n(){var o=new i(t,{text:function(){return e.textContent}});o.on("success",function(){t.textContent="Copied!",r()}),o.on("error",function(){t.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){t.textContent="Copy"},5e3)}})}else console.warn("Copy to Clipboard plugin loaded before Toolbar plugin.")}(); diff --git a/js/respond.min.js b/js/respond.min.js deleted file mode 100644 index e8d6207..0000000 --- a/js/respond.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! Respond.js v1.4.2: min/max-width media query polyfill - * Copyright 2014 Scott Jehl - * Licensed under MIT - * http://j.mp/respondjs */ - -!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?C(e)+t:t}function O(){return!0}function A(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function T(e,t){return P(e,t,0)}function j(e,t){return P(e,t,t)}function P(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var I=0,M=1,N=2,R="function"==typeof Symbol&&Symbol.iterator,D="@@iterator",L=R||D;function U(e){this.next=e}function q(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function F(){return{value:void 0,done:!0}}function B(e){return!!H(e)}function z(e){return e&&"function"==typeof e.next}function V(e){var t=H(e);return t&&t.call(e)}function H(e){var t=e&&(R&&e[R]||e[D]);if("function"==typeof t)return t}function W(e){return e&&"number"==typeof e.length}function J(e){return null==e?ie():a(e)?e.toSeq():function(e){var t=ue(e)||"object"==typeof e&&new te(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}(e)}function K(e){return null==e?ie().toKeyedSeq():a(e)?s(e)?e.toSeq():e.fromEntrySeq():ae(e)}function Y(e){return null==e?ie():a(e)?s(e)?e.entrySeq():e.toIndexedSeq():se(e)}function $(e){return(null==e?ie():a(e)?s(e)?e.entrySeq():e:se(e)).toSetSeq()}U.prototype.toString=function(){return"[Iterator]"},U.KEYS=I,U.VALUES=M,U.ENTRIES=N,U.prototype.inspect=U.prototype.toSource=function(){return this.toString()},U.prototype[L]=function(){return this},t(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString("Seq {","}")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(e,t){return ce(this,e,t,!0)},J.prototype.__iterator=function(e,t){return le(this,e,t,!0)},t(K,J),K.prototype.toKeyedSeq=function(){return this},t(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString("Seq [","]")},Y.prototype.__iterate=function(e,t){return ce(this,e,t,!1)},Y.prototype.__iterator=function(e,t){return le(this,e,t,!1)},t($,J),$.of=function(){return $(arguments)},$.prototype.toSetSeq=function(){return this},J.isSeq=oe,J.Keyed=K,J.Set=$,J.Indexed=Y;var G,Z,X,Q="@@__IMMUTABLE_SEQ__@@";function ee(e){this._array=e,this.size=e.length}function te(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function ne(e){this._iterable=e,this.size=e.length||e.size}function re(e){this._iterator=e,this._iteratorCache=[]}function oe(e){return!(!e||!e[Q])}function ie(){return G||(G=new ee([]))}function ae(e){var t=Array.isArray(e)?new ee(e).fromEntrySeq():z(e)?new re(e).fromEntrySeq():B(e)?new ne(e).fromEntrySeq():"object"==typeof e?new te(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function se(e){var t=ue(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function ue(e){return W(e)?new ee(e):z(e)?new re(e):B(e)?new ne(e):void 0}function ce(e,t,n,r){var o=e._cache;if(o){for(var i=o.length-1,a=0;a<=i;a++){var s=o[n?i-a:a];if(!1===t(s[1],r?s[0]:a,e))return a+1}return a}return e.__iterateUncached(t,n)}function le(e,t,n,r){var o=e._cache;if(o){var i=o.length-1,a=0;return new U(function(){var e=o[n?i-a:a];return a++>i?{value:void 0,done:!0}:q(t,r?e[0]:a-1,e[1])})}return e.__iteratorUncached(t,n)}function pe(e,t){return t?function e(t,n,r,o){return Array.isArray(n)?t.call(o,r,Y(n).map(function(r,o){return e(t,r,o,n)})):he(n)?t.call(o,r,K(n).map(function(r,o){return e(t,r,o,n)})):n}(t,e,"",{"":e}):fe(e)}function fe(e){return Array.isArray(e)?Y(e).map(fe).toList():he(e)?K(e).map(fe).toMap():e}function he(e){return e&&(e.constructor===Object||void 0===e.constructor)}function de(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function me(e,t){if(e===t)return!0;if(!a(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||s(e)!==s(t)||u(e)!==u(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!c(e);if(l(e)){var r=e.entries();return t.every(function(e,t){var o=r.next().value;return o&&de(o[1],e)&&(n||de(o[0],t))})&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var i=e;e=t,t=i}var p=!0,f=t.__iterate(function(t,r){if(n?!e.has(t):o?!de(t,e.get(r,y)):!de(e.get(r,y),t))return p=!1,!1});return p&&e.size===f}function ve(e,t){if(!(this instanceof ve))return new ve(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(Z)return Z;Z=this}}function ge(e,t){if(!e)throw new Error(t)}function ye(e,t,n){if(!(this instanceof ye))return new ye(e,t,n);if(ge(0!==n,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),tr?{value:void 0,done:!0}:q(e,o,n[t?r-o++:o++])})},t(te,K),te.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},te.prototype.has=function(e){return this._object.hasOwnProperty(e)},te.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,i=0;i<=o;i++){var a=r[t?o-i:i];if(!1===e(n[a],a,this))return i+1}return i},te.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,i=0;return new U(function(){var a=r[t?o-i:i];return i++>o?{value:void 0,done:!0}:q(e,a,n[a])})},te.prototype[d]=!0,t(ne,Y),ne.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=V(this._iterable),r=0;if(z(n))for(var o;!(o=n.next()).done&&!1!==e(o.value,r++,this););return r},ne.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=V(this._iterable);if(!z(n))return new U(F);var r=0;return new U(function(){var t=n.next();return t.done?t:q(e,r++,t.value)})},t(re,Y),re.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n,r=this._iterator,o=this._iteratorCache,i=0;i=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return q(e,o,r[o++])})},t(ve,Y),ve.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},ve.prototype.get=function(e,t){return this.has(e)?this._value:t},ve.prototype.includes=function(e){return de(this._value,e)},ve.prototype.slice=function(e,t){var n=this.size;return A(e,t,n)?this:new ve(this._value,j(t,n)-T(e,n))},ve.prototype.reverse=function(){return this},ve.prototype.indexOf=function(e){return de(this._value,e)?0:-1},ve.prototype.lastIndexOf=function(e){return de(this._value,e)?this.size:-1},ve.prototype.__iterate=function(e,t){for(var n=0;n=0&&t=0&&nn?{value:void 0,done:!0}:q(e,i++,a)})},ye.prototype.equals=function(e){return e instanceof ye?this._start===e._start&&this._end===e._end&&this._step===e._step:me(this,e)},t(be,n),t(_e,be),t(we,be),t(xe,be),be.Keyed=_e,be.Indexed=we,be.Set=xe;var Ee="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function Se(e){return e>>>1&1073741824|3221225471&e}function Ce(e){if(!1===e||null==e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null==e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){if(e!=e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)n^=e/=4294967295;return Se(n)}if("string"===t)return e.length>Me?function(e){var t=De[e];return void 0===t&&(t=ke(e),Re===Ne&&(Re=0,De={}),Re++,De[e]=t),t}(e):ke(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return function(e){var t;if(je&&void 0!==(t=Oe.get(e)))return t;if(void 0!==(t=e[Ie]))return t;if(!Te){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Ie]))return t;if(void 0!==(t=function(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}(e)))return t}if(t=++Pe,1073741824&Pe&&(Pe=0),je)Oe.set(e,t);else{if(void 0!==Ae&&!1===Ae(e))throw new Error("Non-extensible objects are not allowed as keys.");if(Te)Object.defineProperty(e,Ie,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Ie]=t;else{if(void 0===e.nodeType)throw new Error("Unable to set a non-enumerable property on object.");e[Ie]=t}}return t}(e);if("function"==typeof e.toString)return ke(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function ke(e){for(var t=0,n=0;n=t.length)throw new Error("Missing value for key: "+t[n]);e.set(t[n],t[n+1])}})},Ue.prototype.toString=function(){return this.__toString("Map {","}")},Ue.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},Ue.prototype.set=function(e,t){return Qe(this,e,t)},Ue.prototype.setIn=function(e,t){return this.updateIn(e,y,function(){return t})},Ue.prototype.remove=function(e){return Qe(this,e,y)},Ue.prototype.deleteIn=function(e){return this.updateIn(e,function(){return y})},Ue.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},Ue.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=function e(t,n,r,o){var i=t===y,a=n.next();if(a.done){var s=i?r:t,u=o(s);return u===s?t:u}ge(i||t&&t.set,"invalid keyPath");var c=a.value,l=i?y:t.get(c,y),p=e(l,n,r,o);return p===l?t:p===y?t.remove(c):(i?Xe():t).set(c,p)}(this,rn(e),t,n);return r===y?void 0:r},Ue.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):Xe()},Ue.prototype.merge=function(){return rt(this,void 0,arguments)},Ue.prototype.mergeWith=function(t){var n=e.call(arguments,1);return rt(this,t,n)},Ue.prototype.mergeIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,Xe(),function(e){return"function"==typeof e.merge?e.merge.apply(e,n):n[n.length-1]})},Ue.prototype.mergeDeep=function(){return rt(this,ot,arguments)},Ue.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return rt(this,it(t),n)},Ue.prototype.mergeDeepIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,Xe(),function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,n):n[n.length-1]})},Ue.prototype.sort=function(e){return Tt(Jt(this,e))},Ue.prototype.sortBy=function(e,t){return Tt(Jt(this,t,e))},Ue.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},Ue.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new E)},Ue.prototype.asImmutable=function(){return this.__ensureOwner()},Ue.prototype.wasAltered=function(){return this.__altered},Ue.prototype.__iterator=function(e,t){return new Ye(this,e,t)},Ue.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate(function(t){return r++,e(t[1],t[0],n)},t),r},Ue.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Ze(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Ue.isMap=qe;var Fe,Be="@@__IMMUTABLE_MAP__@@",ze=Ue.prototype;function Ve(e,t){this.ownerID=e,this.entries=t}function He(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function We(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function Je(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function Ke(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function Ye(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&Ge(e._root)}function $e(e,t){return q(e,t[0],t[1])}function Ge(e,t){return{node:e,index:0,__prev:t}}function Ze(e,t,n,r){var o=Object.create(ze);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Xe(){return Fe||(Fe=Ze(0))}function Qe(e,t,n){var r,o;if(e._root){var i=w(b),a=w(_);if(r=et(e._root,e.__ownerID,0,void 0,t,n,i,a),!a.value)return e;o=e.size+(i.value?n===y?-1:1:0)}else{if(n===y)return e;o=1,r=new Ve(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?Ze(o,r):Xe()}function et(e,t,n,r,o,i,a,s){return e?e.update(t,n,r,o,i,a,s):i===y?e:(x(s),x(a),new Ke(t,r,[o,i]))}function tt(e){return e.constructor===Ke||e.constructor===Je}function nt(e,t,n,r,o){if(e.keyHash===r)return new Je(t,r,[e.entry,o]);var i,a=(0===n?e.keyHash:e.keyHash>>>n)&g,s=(0===n?r:r>>>n)&g;return new He(t,1<>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function ut(e,t,n,r){var o=r?e:S(e);return o[t]=n,o}ze[Be]=!0,ze.delete=ze.remove,ze.removeIn=ze.deleteIn,Ve.prototype.get=function(e,t,n,r){for(var o=this.entries,i=0,a=o.length;i=ct)return function(e,t,n,r){e||(e=new E);for(var o=new Ke(e,Ce(n),[n,r]),i=0;i>>e)&g),i=this.bitmap;return 0==(i&o)?r:this.nodes[st(i&o-1)].get(e+m,t,n,r)},He.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=Ce(r));var s=(0===t?n:n>>>t)&g,u=1<=lt)return function(e,t,n,r,o){for(var i=0,a=new Array(v),s=0;0!==n;s++,n>>>=1)a[s]=1&n?t[i++]:void 0;return a[r]=o,new We(e,i+1,a)}(e,f,c,s,d);if(l&&!d&&2===f.length&&tt(f[1^p]))return f[1^p];if(l&&d&&1===f.length&&tt(d))return d;var b=e&&e===this.ownerID,_=l?d?c:c^u:c|u,w=l?d?ut(f,p,d,b):function(e,t,n){var r=e.length-1;if(n&&t===r)return e.pop(),e;for(var o=new Array(r),i=0,a=0;a>>e)&g,i=this.nodes[o];return i?i.get(e+m,t,n,r):r},We.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=Ce(r));var s=(0===t?n:n>>>t)&g,u=o===y,c=this.nodes,l=c[s];if(u&&!l)return this;var p=et(l,e,t+m,n,r,o,i,a);if(p===l)return this;var f=this.count;if(l){if(!p&&--f0&&r=0&&e=e.size||t<0)return e.withMutations(function(e){t<0?kt(e,t).set(0,n):kt(e,0,t+1).set(t,n)});t+=e._origin;var r=e._tail,o=e._root,i=w(_);return t>=At(e._capacity)?r=Et(r,e.__ownerID,0,t,n,i):o=Et(o,e.__ownerID,e._level,t,n,i),i.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):wt(e._origin,e._capacity,e._level,o,r):e}(this,e,t)},ft.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},ft.prototype.insert=function(e,t){return this.splice(e,0,t)},ft.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=m,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):xt()},ft.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations(function(n){kt(n,0,t+e.length);for(var r=0;r>>t&g;if(r>=this.array.length)return new vt([],e);var o,i=0===r;if(t>0){var a=this.array[r];if((o=a&&a.removeBefore(e,t-m,n))===a&&i)return this}if(i&&!o)return this;var s=St(this,e);if(!i)for(var u=0;u>>t&g;if(o>=this.array.length)return this;if(t>0){var i=this.array[o];if((r=i&&i.removeAfter(e,t-m,n))===i&&o===this.array.length-1)return this}var a=St(this,e);return a.array.splice(o+1),r&&(a.array[o]=r),a};var gt,yt,bt={};function _t(e,t){var n=e._origin,r=e._capacity,o=At(r),i=e._tail;return a(e._root,e._level,0);function a(e,s,u){return 0===s?function(e,a){var s=a===o?i&&i.array:e&&e.array,u=a>n?0:n-a,c=r-a;return c>v&&(c=v),function(){if(u===c)return bt;var e=t?--c:u++;return s&&s[e]}}(e,u):function(e,o,i){var s,u=e&&e.array,c=i>n?0:n-i>>o,l=1+(r-i>>o);return l>v&&(l=v),function(){for(;;){if(s){var e=s();if(e!==bt)return e;s=null}if(c===l)return bt;var n=t?--l:c++;s=a(u&&u[n],o-m,i+(n<>>n&g,u=e&&s0){var c=e&&e.array[s],l=Et(c,t,n-m,r,o,i);return l===c?e:((a=St(e,t)).array[s]=l,a)}return u&&e.array[s]===o?e:(x(i),a=St(e,t),void 0===o&&s===a.array.length-1?a.array.pop():a.array[s]=o,a)}function St(e,t){return t&&e&&t===e.ownerID?e:new vt(e?e.array.slice():[],t)}function Ct(e,t){if(t>=At(e._capacity))return e._tail;if(t<1<0;)n=n.array[t>>>r&g],r-=m;return n}}function kt(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new E,o=e._origin,i=e._capacity,a=o+t,s=void 0===n?i:n<0?i+n:o+n;if(a===o&&s===i)return e;if(a>=s)return e.clear();for(var u=e._level,c=e._root,l=0;a+l<0;)c=new vt(c&&c.array.length?[void 0,c]:[],r),l+=1<<(u+=m);l&&(a+=l,o+=l,s+=l,i+=l);for(var p=At(i),f=At(s);f>=1<p?new vt([],r):h;if(h&&f>p&&am;y-=m){var b=p>>>y&g;v=v.array[b]=St(v.array[b],r)}v.array[p>>>m&g]=h}if(s=f)a-=f,s-=f,u=m,c=null,d=d&&d.removeBefore(r,0,a);else if(a>o||f>>u&g;if(_!==f>>>u&g)break;_&&(l+=(1<o&&(c=c.removeBefore(r,u,a-l)),c&&fi&&(i=c.size),a(u)||(c=c.map(function(e){return pe(e)})),r.push(c)}return i>e.size&&(e=e.setSize(i)),at(e,t,r)}function At(e){return e>>m<=v&&a.size>=2*i.size?(r=(o=a.filter(function(e,t){return void 0!==e&&s!==t})).toKeyedSeq().map(function(e){return e[0]}).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=i.remove(t),o=s===a.size-1?a.pop():a.set(s,void 0))}else if(u){if(n===a.get(s)[1])return e;r=i,o=a.set(s,[t,n])}else r=i.set(t,a.size),o=a.set(a.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):Pt(r,o)}function Nt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function Rt(e){this._iter=e,this.size=e.size}function Dt(e){this._iter=e,this.size=e.size}function Lt(e){this._iter=e,this.size=e.size}function Ut(e){var t=en(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=tn,t.__iterateUncached=function(t,n){var r=this;return e.__iterate(function(e,n){return!1!==t(n,e,r)},n)},t.__iteratorUncached=function(t,n){if(t===N){var r=e.__iterator(t,n);return new U(function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e})}return e.__iterator(t===M?I:M,n)},t}function qt(e,t,n){var r=en(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var i=e.get(r,y);return i===y?o:t.call(n,i,r,e)},r.__iterateUncached=function(r,o){var i=this;return e.__iterate(function(e,o,a){return!1!==r(t.call(n,e,o,a),o,i)},o)},r.__iteratorUncached=function(r,o){var i=e.__iterator(N,o);return new U(function(){var o=i.next();if(o.done)return o;var a=o.value,s=a[0];return q(r,s,t.call(n,a[1],s,e),o)})},r}function Ft(e,t){var n=en(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=Ut(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=tn,n.__iterate=function(t,n){var r=this;return e.__iterate(function(e,n){return t(e,n,r)},!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function Bt(e,t,n,r){var o=en(e);return r&&(o.has=function(r){var o=e.get(r,y);return o!==y&&!!t.call(n,o,r,e)},o.get=function(r,o){var i=e.get(r,y);return i!==y&&t.call(n,i,r,e)?i:o}),o.__iterateUncached=function(o,i){var a=this,s=0;return e.__iterate(function(e,i,u){if(t.call(n,e,i,u))return s++,o(e,r?i:s-1,a)},i),s},o.__iteratorUncached=function(o,i){var a=e.__iterator(N,i),s=0;return new U(function(){for(;;){var i=a.next();if(i.done)return i;var u=i.value,c=u[0],l=u[1];if(t.call(n,l,c,e))return q(o,r?c:s++,l,i)}})},o}function zt(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),A(t,n,o))return e;var i=T(t,o),a=j(n,o);if(i!=i||a!=a)return zt(e.toSeq().cacheResult(),t,n,r);var s,u=a-i;u==u&&(s=u<0?0:u);var c=en(e);return c.size=0===s?s:e.size&&s||void 0,!r&&oe(e)&&s>=0&&(c.get=function(t,n){return(t=k(this,t))>=0&&ts)return{value:void 0,done:!0};var e=o.next();return r||t===M?e:q(t,u-1,t===I?void 0:e.value[1],e)})},c}function Vt(e,t,n,r){var o=en(e);return o.__iterateUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterate(o,i);var s=!0,u=0;return e.__iterate(function(e,i,c){if(!s||!(s=t.call(n,e,i,c)))return u++,o(e,r?i:u-1,a)}),u},o.__iteratorUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterator(o,i);var s=e.__iterator(N,i),u=!0,c=0;return new U(function(){var e,i,l;do{if((e=s.next()).done)return r||o===M?e:q(o,c++,o===I?void 0:e.value[1],e);var p=e.value;i=p[0],l=p[1],u&&(u=t.call(n,l,i,a))}while(u);return o===N?e:q(o,i,l,e)})},o}function Ht(e,t){var n=s(e),o=[e].concat(t).map(function(e){return a(e)?n&&(e=r(e)):e=n?ae(e):se(Array.isArray(e)?e:[e]),e}).filter(function(e){return 0!==e.size});if(0===o.length)return e;if(1===o.length){var i=o[0];if(i===e||n&&s(i)||u(e)&&u(i))return i}var c=new ee(o);return n?c=c.toKeyedSeq():u(e)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=o.reduce(function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}},0),c}function Wt(e,t,n){var r=en(e);return r.__iterateUncached=function(r,o){var i=0,s=!1;return function e(u,c){var l=this;u.__iterate(function(o,u){return(!t||c0}function $t(e,t,r){var o=en(e);return o.size=new ee(r).map(function(e){return e.size}).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(M,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var i=r.map(function(e){return e=n(e),V(o?e.reverse():e)}),a=0,s=!1;return new U(function(){var n;return s||(n=i.map(function(e){return e.next()}),s=n.some(function(e){return e.done})),s?{value:void 0,done:!0}:q(e,a++,t.apply(null,n.map(function(e){return e.value})))})},o}function Gt(e,t){return oe(e)?t:e.constructor(t)}function Zt(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function Xt(e){return Le(e.size),C(e)}function Qt(e){return s(e)?r:u(e)?o:i}function en(e){return Object.create((s(e)?K:u(e)?Y:$).prototype)}function tn(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function nn(e,t){return e>t?1:e=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):An(e,t)},En.prototype.pushAll=function(e){if(0===(e=o(e)).size)return this;Le(e.size);var t=this.size,n=this._head;return e.reverse().forEach(function(e){t++,n={value:e,next:n}}),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):An(t,n)},En.prototype.pop=function(){return this.slice(1)},En.prototype.unshift=function(){return this.push.apply(this,arguments)},En.prototype.unshiftAll=function(e){return this.pushAll(e)},En.prototype.shift=function(){return this.pop.apply(this,arguments)},En.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Tn()},En.prototype.slice=function(e,t){if(A(e,t,this.size))return this;var n=T(e,this.size);if(j(t,this.size)!==this.size)return we.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):An(r,o)},En.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?An(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},En.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},En.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new U(function(){if(r){var t=r.value;return r=r.next,q(e,n++,t)}return{value:void 0,done:!0}})},En.isStack=Sn;var Cn,kn="@@__IMMUTABLE_STACK__@@",On=En.prototype;function An(e,t,n,r){var o=Object.create(On);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Tn(){return Cn||(Cn=An(0))}function jn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}On[kn]=!0,On.withMutations=ze.withMutations,On.asMutable=ze.asMutable,On.asImmutable=ze.asImmutable,On.wasAltered=ze.wasAltered,n.Iterator=U,jn(n,{toArray:function(){Le(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate(function(t,n){e[n]=t}),e},toIndexedSeq:function(){return new Rt(this)},toJS:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJS?e.toJS():e}).__toJS()},toJSON:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e}).__toJS()},toKeyedSeq:function(){return new Nt(this,!0)},toMap:function(){return Ue(this.toKeyedSeq())},toObject:function(){Le(this.size);var e={};return this.__iterate(function(t,n){e[n]=t}),e},toOrderedMap:function(){return Tt(this.toKeyedSeq())},toOrderedSet:function(){return gn(s(this)?this.valueSeq():this)},toSet:function(){return cn(s(this)?this.valueSeq():this)},toSetSeq:function(){return new Dt(this)},toSeq:function(){return u(this)?this.toIndexedSeq():s(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return En(s(this)?this.valueSeq():this)},toList:function(){return ft(s(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){var t=e.call(arguments,0);return Gt(this,Ht(this,t))},includes:function(e){return this.some(function(t){return de(t,e)})},entries:function(){return this.__iterator(N)},every:function(e,t){Le(this.size);var n=!0;return this.__iterate(function(r,o,i){if(!e.call(t,r,o,i))return n=!1,!1}),n},filter:function(e,t){return Gt(this,Bt(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return Le(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Le(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate(function(r){n?n=!1:t+=e,t+=null!=r?r.toString():""}),t},keys:function(){return this.__iterator(I)},map:function(e,t){return Gt(this,qt(this,e,t))},reduce:function(e,t,n){var r,o;return Le(this.size),arguments.length<2?o=!0:r=t,this.__iterate(function(t,i,a){o?(o=!1,r=t):r=e.call(n,r,t,i,a)}),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return Gt(this,Ft(this,!0))},slice:function(e,t){return Gt(this,zt(this,e,t,!0))},some:function(e,t){return!this.every(Rn(e),t)},sort:function(e){return Gt(this,Jt(this,e))},values:function(){return this.__iterator(M)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(e,t){return C(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return function(e,t,n){var r=Ue().asMutable();return e.__iterate(function(o,i){r.update(t.call(n,o,i,e),0,function(e){return e+1})}),r.asImmutable()}(this,e,t)},equals:function(e){return me(this,e)},entrySeq:function(){var e=this;if(e._cache)return new ee(e._cache);var t=e.toSeq().map(Nn).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(Rn(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate(function(n,o,i){if(e.call(t,n,o,i))return r=[o,n],!1}),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(O)},flatMap:function(e,t){return Gt(this,function(e,t,n){var r=Qt(e);return e.toSeq().map(function(o,i){return r(t.call(n,o,i,e))}).flatten(!0)}(this,e,t))},flatten:function(e){return Gt(this,Wt(this,e,!0))},fromEntrySeq:function(){return new Lt(this)},get:function(e,t){return this.find(function(t,n){return de(n,e)},void 0,t)},getIn:function(e,t){for(var n,r=this,o=rn(e);!(n=o.next()).done;){var i=n.value;if((r=r&&r.get?r.get(i,y):y)===y)return t}return r},groupBy:function(e,t){return function(e,t,n){var r=s(e),o=(l(e)?Tt():Ue()).asMutable();e.__iterate(function(i,a){o.update(t.call(n,i,a,e),function(e){return(e=e||[]).push(r?[a,i]:i),e})});var i=Qt(e);return o.map(function(t){return Gt(e,i(t))})}(this,e,t)},has:function(e){return this.get(e,y)!==y},hasIn:function(e){return this.getIn(e,y)!==y},isSubset:function(e){return e="function"==typeof e.includes?e:n(e),this.every(function(t){return e.includes(t)})},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:n(e)).isSubset(this)},keyOf:function(e){return this.findKey(function(t){return de(t,e)})},keySeq:function(){return this.toSeq().map(Mn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return Kt(this,e)},maxBy:function(e,t){return Kt(this,t,e)},min:function(e){return Kt(this,e?Dn(e):qn)},minBy:function(e,t){return Kt(this,t?Dn(t):qn,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return Gt(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return Gt(this,Vt(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(Rn(e),t)},sortBy:function(e,t){return Gt(this,Jt(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return Gt(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return Gt(this,function(e,t,n){var r=en(e);return r.__iterateUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterate(r,o);var a=0;return e.__iterate(function(e,o,s){return t.call(n,e,o,s)&&++a&&r(e,o,i)}),a},r.__iteratorUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterator(r,o);var a=e.__iterator(N,o),s=!0;return new U(function(){if(!s)return{value:void 0,done:!0};var e=a.next();if(e.done)return e;var o=e.value,u=o[0],c=o[1];return t.call(n,c,u,i)?r===N?e:q(r,u,c,e):(s=!1,{value:void 0,done:!0})})},r}(this,e,t))},takeUntil:function(e,t){return this.takeWhile(Rn(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function(e){if(e.size===1/0)return 0;var t=l(e),n=s(e),r=t?1:0;return function(e,t){return t=Ee(t,3432918353),t=Ee(t<<15|t>>>-15,461845907),t=Ee(t<<13|t>>>-13,5),t=Ee((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=Se((t=Ee(t^t>>>13,3266489909))^t>>>16)}(e.__iterate(n?t?function(e,t){r=31*r+Fn(Ce(e),Ce(t))|0}:function(e,t){r=r+Fn(Ce(e),Ce(t))|0}:t?function(e){r=31*r+Ce(e)|0}:function(e){r=r+Ce(e)|0}),r)}(this))}});var Pn=n.prototype;Pn[p]=!0,Pn[L]=Pn.values,Pn.__toJS=Pn.toArray,Pn.__toStringMapper=Ln,Pn.inspect=Pn.toSource=function(){return this.toString()},Pn.chain=Pn.flatMap,Pn.contains=Pn.includes,jn(r,{flip:function(){return Gt(this,Ut(this))},mapEntries:function(e,t){var n=this,r=0;return Gt(this,this.toSeq().map(function(o,i){return e.call(t,[i,o],r++,n)}).fromEntrySeq())},mapKeys:function(e,t){var n=this;return Gt(this,this.toSeq().flip().map(function(r,o){return e.call(t,r,o,n)}).flip())}});var In=r.prototype;function Mn(e,t){return t}function Nn(e,t){return[t,e]}function Rn(e){return function(){return!e.apply(this,arguments)}}function Dn(e){return function(){return-e.apply(this,arguments)}}function Ln(e){return"string"==typeof e?JSON.stringify(e):String(e)}function Un(){return S(arguments)}function qn(e,t){return et?-1:0}function Fn(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return In[f]=!0,In[L]=Pn.entries,In.__toJS=Pn.toObject,In.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+Ln(e)},jn(o,{toKeyedSeq:function(){return new Nt(this,!1)},filter:function(e,t){return Gt(this,Bt(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return Gt(this,Ft(this,!1))},slice:function(e,t){return Gt(this,zt(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=T(e,e<0?this.count():this.size);var r=this.slice(0,e);return Gt(this,1===n?r:r.concat(S(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return Gt(this,Wt(this,e,!1))},get:function(e,t){return(e=k(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find(function(t,n){return n===e},void 0,t)},has:function(e){return(e=k(this,e))>=0&&(void 0!==this.size?this.size===1/0||e5e3)return e.textContent;return function(e){for(var n,r,o,i,a,s=e.textContent,u=0,c=s[0],l=1,p=e.innerHTML="",f=0;r=n,n=f<7&&"\\"==n?1:l;){if(l=c,c=s[++u],i=p.length>1,!l||f>8&&"\n"==l||[/\S/.test(l),1,1,!/[$\w]/.test(l),("/"==n||"\n"==n)&&i,'"'==n&&i,"'"==n&&i,s[u-4]+r+n=="--\x3e",r+n=="*/"][f])for(p&&(e.appendChild(a=t.createElement("span")).setAttribute("style",["color: #555; font-weight: bold;","","","color: #555;",""][f?f<3?2:f>6?4:f>3?3:+/^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(icrolight|odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/.test(p):0]),a.appendChild(t.createTextNode(p))),o=f&&f<7?f:o,p="",f=11;![1,/[\/{}[(\-+*=<>:;|\\.,?!&@~]/.test(l),/[\])]/.test(l),/[$\w]/.test(l),"/"==l&&o<2&&"<"!=n,'"'==l,"'"==l,l+c+s[u+1]+s[u+2]=="\x3c!--",l+c=="/*",l+c=="//","#"==l][--f];);p+=l}}(e)}function Q(e){var t;if([/filename\*=[^']+'\w*'"([^"]+)";?/i,/filename\*=[^']+'\w*'([^;]+);?/i,/filename="([^;]*);?"/i,/filename=([^;]*);?/i].some(function(n){return null!==(t=n.exec(e))}),null!==t&&t.length>1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function ee(e){return t=e.replace(/\.[^.\/]*$/,""),b()(g()(t));var t}var te=function(e,t){if(e>t)return"Value must be less than Maximum"},ne=function(e,t){if(et)return"Value must be less than MaxLength"},pe=function(e,t){if(e.length2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,o=void 0!==r&&r,i=n.bypassRequiredCheck,a=void 0!==i&&i,s=[],u=e.get("required"),c=Object(P.a)(e,{isOAS3:o}),p=c.schema,h=c.parameterContentMediaType;if(!p)return s;var m=p.get("required"),v=p.get("maximum"),g=p.get("minimum"),y=p.get("type"),b=p.get("format"),_=p.get("maxLength"),w=p.get("minLength"),x=p.get("pattern");if(y&&(u||m||t)){var E="string"===y&&t,S="array"===y&&l()(t)&&t.length,C="array"===y&&d.a.List.isList(t)&&t.count(),k="array"===y&&"string"==typeof t&&t,O="file"===y&&t instanceof A.a.File,T="boolean"===y&&(t||!1===t),j="number"===y&&(t||0===t),I="integer"===y&&(t||0===t),M="object"===y&&"object"===f()(t)&&null!==t,N="object"===y&&"string"==typeof t&&t,R=[E,S,C,k,O,T,j,I,M,N],D=R.some(function(e){return!!e});if((u||m)&&!D&&!a)return s.push("Required field is not provided"),s;if("object"===y&&"string"==typeof t&&(null===h||"application/json"===h))try{JSON.parse(t)}catch(e){return s.push("Parameter string value must be valid JSON"),s}if(x){var L=fe(t,x);L&&s.push(L)}if(_||0===_){var U=le(t,_);U&&s.push(U)}if(w){var q=pe(t,w);q&&s.push(q)}if(v||0===v){var F=te(t,v);F&&s.push(F)}if(g||0===g){var B=ne(t,g);B&&s.push(B)}if("string"===y){var z;if(!(z="date-time"===b?ue(t):"uuid"===b?ce(t):se(t)))return s;s.push(z)}else if("boolean"===y){var V=ae(t);if(!V)return s;s.push(V)}else if("number"===y){var H=re(t);if(!H)return s;s.push(H)}else if("integer"===y){var W=oe(t);if(!W)return s;s.push(W)}else if("array"===y){var J;if(!C||!t.count())return s;J=p.getIn(["items","type"]),t.forEach(function(e,t){var n;"number"===J?n=re(e):"integer"===J?n=oe(e):"string"===J&&(n=se(e)),n&&s.push({index:t,error:n})})}else if("file"===y){var K=ie(t);if(!K)return s;s.push(K)}}return s},de=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(/xml/.test(t)){if(!e.xml||!e.xml.name){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var r=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=r[1]}return Object(k.memoizedCreateXMLExample)(e,n)}var i=Object(k.memoizedSampleFromSchema)(e,n);return"object"===f()(i)?o()(i,null,2):i},me=function(){var e={},t=A.a.location.search;if(!t)return{};if(""!=t){var n=t.substr(1).split("&");for(var r in n)n.hasOwnProperty(r)&&(r=n[r].split("="),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||"")}return e},ve=function(t){return(t instanceof e?t:new e(t.toString(),"utf-8")).toString("base64")},ge={operationsSorter:{alpha:function(e,t){return e.get("path").localeCompare(t.get("path"))},method:function(e,t){return e.get("method").localeCompare(t.get("method"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},ye=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&""!==r&&t.push([n,"=",encodeURIComponent(r).replace(/%20/g,"+")].join(""))}return t.join("&")},be=function(e,t,n){return!!E()(n,function(n){return C()(e[n],t[n])})};function _e(e){return"string"!=typeof e||""===e?"":Object(m.sanitizeUrl)(e)}function we(e){if(!d.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=e.find(function(e,t){return t.startsWith("2")&&u()(e.get("content")||{}).length>0}),n=e.get("default")||d.a.OrderedMap(),r=(n.get("content")||d.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var xe=function(e){return"string"==typeof e||e instanceof String?e.trim().replace(/\s/g,"%20"):""},Ee=function(e){return j()(xe(e).replace(/%20/g,"_"))},Se=function(e){return e.filter(function(e,t){return/^x-/.test(t)})},Ce=function(e){return e.filter(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)})};function ke(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==f()(e)||l()(e)||null===e||!t)return e;var r=a()({},e);return u()(r).forEach(function(e){e===t&&n(r[e],e)?delete r[e]:r[e]=ke(r[e],t,n)}),r}function Oe(e){if("string"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),"object"===f()(e)&&null!==e)try{return o()(e,null,2)}catch(t){return String(e)}return null==e?"":e.toString()}function Ae(e){return"number"==typeof e?e.toString():e}function Te(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,o=t.allowHashes,i=void 0===o||o;if(!d.a.Map.isMap(e))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var a=e.get("name"),s=e.get("in"),u=[];return e&&e.hashCode&&s&&a&&i&&u.push("".concat(s,".").concat(a,".hash-").concat(e.hashCode())),s&&a&&u.push("".concat(s,".").concat(a)),u.push(a),r?u:u[0]||""}function je(e,t){return Te(e,{returnAll:!0}).map(function(e){return t[e]}).filter(function(e){return void 0!==e})[0]}function Pe(){return Me(M()(32).toString("base64"))}function Ie(e){return Me(R()("sha256").update(e).digest("base64"))}function Me(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}}).call(this,n(64).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t,n){var r=n(54);function o(e,t){for(var n=0;n1?t-1:0),o=1;o2?n-2:0),i=2;i>",i={listOf:function(e){return c(e,"List",r.List.isList)},mapOf:function(e,t){return l(e,t,"Map",r.Map.isMap)},orderedMapOf:function(e,t){return l(e,t,"OrderedMap",r.OrderedMap.isOrderedMap)},setOf:function(e){return c(e,"Set",r.Set.isSet)},orderedSetOf:function(e){return c(e,"OrderedSet",r.OrderedSet.isOrderedSet)},stackOf:function(e){return c(e,"Stack",r.Stack.isStack)},iterableOf:function(e){return c(e,"Iterable",r.Iterable.isIterable)},recordOf:function(e){return s(function(t,n,o,i,s){for(var u=arguments.length,c=Array(u>5?u-5:0),l=5;l6?u-6:0),l=6;l5?c-5:0),p=5;p5?i-5:0),s=5;s key("+l[p]+")"].concat(a));if(h instanceof Error)return h}})).apply(void 0,i);var u})}function p(e){var t=void 0===arguments[1]?"Iterable":arguments[1],n=void 0===arguments[2]?r.Iterable.isIterable:arguments[2];return s(function(r,o,i,s,u){for(var c=arguments.length,l=Array(c>5?c-5:0),p=5;p4)}function u(e){var t=e.get("swagger");return"string"==typeof t&&t.startsWith("2.0")}function c(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?s(n.specSelectors.specJson())?a.a.createElement(e,o()({},r,n,{Ori:t})):a.a.createElement(t,r):(console.warn("OAS3 wrapper: couldn't get spec"),null)}}}},function(e,t,n){"use strict"; +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,u=a(e),c=1;c0){var o=n.map(function(e){return console.error(e),e.line=e.fullPath?g(y,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",A()(e,"message",{enumerable:!0,value:e.message}),e});i.newThrownErrBatch(o)}return r.updateResolved(t)})}},_e=[],we=V()(k()(S.a.mark(function e(){var t,n,r,o,i,a,s,u,c,l,p,f,h,d,m,v,g;return S.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=_e.system){e.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),e.abrupt("return");case 4:if(n=t.errActions,r=t.errSelectors,o=t.fn,i=o.resolveSubtree,a=o.AST,s=void 0===a?{}:a,u=t.specSelectors,c=t.specActions,i){e.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),e.abrupt("return");case 8:return l=s.getLineNumberForPath?s.getLineNumberForPath:function(){},p=u.specStr(),f=t.getConfigs(),h=f.modelPropertyMacro,d=f.parameterMacro,m=f.requestInterceptor,v=f.responseInterceptor,e.prev=11,e.next=14,_e.reduce(function(){var e=k()(S.a.mark(function e(t,o){var a,s,c,f,g,y,b;return S.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return a=e.sent,s=a.resultMap,c=a.specWithCurrentSubtrees,e.next=7,i(c,o,{baseDoc:u.url(),modelPropertyMacro:h,parameterMacro:d,requestInterceptor:m,responseInterceptor:v});case 7:return f=e.sent,g=f.errors,y=f.spec,r.allErrors().size&&n.clearBy(function(e){return"thrown"!==e.get("type")||"resolver"!==e.get("source")||!e.get("fullPath").every(function(e,t){return e===o[t]||void 0===o[t]})}),j()(g)&&g.length>0&&(b=g.map(function(e){return e.line=e.fullPath?l(p,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",A()(e,"message",{enumerable:!0,value:e.message}),e}),n.newThrownErrBatch(b)),W()(s,o,y),W()(c,o,y),e.abrupt("return",{resultMap:s,specWithCurrentSubtrees:c});case 15:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),x.a.resolve({resultMap:(u.specResolvedSubtree([])||Object(R.Map)()).toJS(),specWithCurrentSubtrees:u.specJson().toJS()}));case 14:g=e.sent,delete _e.system,_e=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:c.updateResolvedSubtree([],g.resultMap);case 23:case"end":return e.stop()}},e,null,[[11,19]])})),35),xe=function(e){return function(t){_e.map(function(e){return e.join("@@")}).indexOf(e.join("@@"))>-1||(_e.push(e),_e.system=t,we())}};function Ee(e,t,n,r,o){return{type:X,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:o}}}function Se(e,t,n,r){return{type:X,payload:{path:e,param:t,value:n,isXml:r}}}var Ce=function(e,t){return{type:le,payload:{path:e,value:t}}},ke=function(){return{type:le,payload:{path:[],value:Object(R.Map)()}}},Oe=function(e,t){return{type:ee,payload:{pathMethod:e,isOAS3:t}}},Ae=function(e,t,n,r){return{type:Q,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Te(e){return{type:se,payload:{pathMethod:e}}}function je(e,t){return{type:ue,payload:{path:e,value:t,key:"consumes_value"}}}function Pe(e,t){return{type:ue,payload:{path:e,value:t,key:"produces_value"}}}var Ie=function(e,t,n){return{payload:{path:e,method:t,res:n},type:te}},Me=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ne}},Ne=function(e,t,n){return{payload:{path:e,method:t,req:n},type:re}},Re=function(e){return{payload:e,type:oe}},De=function(e){return function(t){var n=t.fn,r=t.specActions,o=t.specSelectors,i=t.getConfigs,a=t.oas3Selectors,s=e.pathName,u=e.method,c=e.operation,l=i(),p=l.requestInterceptor,f=l.responseInterceptor,h=c.toJS();if(c&&c.get("parameters")&&c.get("parameters").filter(function(e){return e&&!0===e.get("allowEmptyValue")}).forEach(function(t){if(o.parameterInclusionSettingFor([s,u],t.get("name"),t.get("in"))){e.parameters=e.parameters||{};var n=Object(J.C)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get("name")]="")}}),e.contextUrl=L()(o.url()).toString(),h&&h.operationId?e.operationId=h.operationId:h&&s&&u&&(e.operationId=n.opId(h,s,u)),o.isOAS3()){var d="".concat(s,":").concat(u);e.server=a.selectedServer(d)||a.selectedServer();var m=a.serverVariables({server:e.server,namespace:d}).toJS(),g=a.serverVariables({server:e.server}).toJS();e.serverVariables=_()(m).length?m:g,e.requestContentType=a.requestContentType(s,u),e.responseContentType=a.responseContentType(s,u)||"*/*";var b=a.requestBodyValue(s,u);Object(J.t)(b)?e.requestBody=JSON.parse(b):b&&b.toJS?e.requestBody=b.toJS():e.requestBody=b}var w=y()({},e);w=n.buildRequest(w),r.setRequest(e.pathName,e.method,w);e.requestInterceptor=function(t){var n=p.apply(this,[t]),o=y()({},n);return r.setMutatedRequest(e.pathName,e.method,o),n},e.responseInterceptor=f;var x=v()();return n.execute(e).then(function(t){t.duration=v()()-x,r.setResponse(e.pathName,e.method,t)}).catch(function(t){console.error(t),r.setResponse(e.pathName,e.method,{error:!0,err:q()(t)})})}},Le=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=d()(e,["path","method"]);return function(e){var o=e.fn.fetch,i=e.specSelectors,a=e.specActions,s=i.specJsonWithResolvedSubtrees().toJS(),u=i.operationScheme(t,n),c=i.contentTypeValues([t,n]).toJS(),l=c.requestContentType,p=c.responseContentType,f=/xml/i.test(l),h=i.parameterValues([t,n],f).toJS();return a.executeRequest(Y({},r,{fetch:o,spec:s,pathName:t,method:n,parameters:h,requestContentType:l,scheme:u,responseContentType:p}))}};function Ue(e,t){return{type:ie,payload:{path:e,method:t}}}function qe(e,t){return{type:ae,payload:{path:e,method:t}}}function Fe(e,t,n){return{type:pe,payload:{scheme:e,path:t,method:n}}}},function(e,t,n){var r=n(32),o=n(22),i=n(63),a=n(77),s=n(75),u=function(e,t,n){var c,l,p,f=e&u.F,h=e&u.G,d=e&u.S,m=e&u.P,v=e&u.B,g=e&u.W,y=h?o:o[t]||(o[t]={}),b=y.prototype,_=h?r:d?r[t]:(r[t]||{}).prototype;for(c in h&&(n=t),n)(l=!f&&_&&void 0!==_[c])&&s(y,c)||(p=l?_[c]:n[c],y[c]=h&&"function"!=typeof _[c]?n[c]:v&&l?i(p,r):g&&_[c]==p?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(p):m&&"function"==typeof p?i(Function.call,p):p,m&&((y.virtual||(y.virtual={}))[c]=p,e&u.R&&b&&!b[c]&&a(b,c,p)))};u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t,n){"use strict";var r=n(138),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],i=["scalar","sequence","mapping"];e.exports=function(e,t){var n,a;if(t=t||{},Object.keys(t).forEach(function(t){if(-1===o.indexOf(t))throw new r('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=(n=t.styleAliases||null,a={},null!==n&&Object.keys(n).forEach(function(e){n[e].forEach(function(t){a[String(t)]=e})}),a),-1===i.indexOf(this.kind))throw new r('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var r=n(197)("wks"),o=n(199),i=n(41).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t,n){var r=n(214)("wks"),o=n(159),i=n(32).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t,n){var r=n(41),o=n(72),i=n(81),a=n(97),s=n(153),u=function(e,t,n){var c,l,p,f,h=e&u.F,d=e&u.G,m=e&u.S,v=e&u.P,g=e&u.B,y=d?r:m?r[t]||(r[t]={}):(r[t]||{}).prototype,b=d?o:o[t]||(o[t]={}),_=b.prototype||(b.prototype={});for(c in d&&(n=t),n)p=((l=!h&&y&&void 0!==y[c])?y:n)[c],f=g&&l?s(p,r):v&&"function"==typeof p?s(Function.call,p):p,y&&a(y,c,p,e&u.U),b[c]!=p&&i(b,c,f),v&&_[c]!=p&&(_[c]=p)};r.core=o,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){"use strict";var r=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:r,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=o},function(e,t,n){"use strict";var r=Object.prototype.hasOwnProperty;function o(e,t){return!!e&&r.call(e,t)}var i=/\\([\\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;function a(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function s(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var u=/&([a-z#][a-z0-9]{1,31});/gi,c=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,l=n(463);function p(e,t){var n=0;return o(l,t)?l[t]:35===t.charCodeAt(0)&&c.test(t)&&a(n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?s(n):e}var f=/[&<>"]/,h=/[&<>"]/g,d={"&":"&","<":"<",">":">",'"':"""};function m(e){return d[e]}t.assign=function(e){return[].slice.call(arguments,1).forEach(function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach(function(n){e[n]=t[n]})}}),e},t.isString=function(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)},t.has=o,t.unescapeMd=function(e){return e.indexOf("\\")<0?e:e.replace(i,"$1")},t.isValidEntityCode=a,t.fromCodePoint=s,t.replaceEntities=function(e){return e.indexOf("&")<0?e:e.replace(u,p)},t.escapeHtml=function(e){return f.test(e)?e.replace(h,m):e}},function(e,t,n){var r=n(55),o=n(771);e.exports=function(e,t){if(null==e)return{};var n,i,a=o(e,t);if(r){var s=r(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var r=n(35),o=n(99),i=n(73),a=/"/g,s=function(e,t,n,r){var o=String(i(e)),s="<"+t;return""!==n&&(s+=" "+n+'="'+String(r).replace(a,""")+'"'),s+">"+o+""};e.exports=function(e,t){var n={};n[e]=t(s),r(r.P+r.F*o(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",n)}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){"use strict";n.r(t),n.d(t,"NEW_THROWN_ERR",function(){return i}),n.d(t,"NEW_THROWN_ERR_BATCH",function(){return a}),n.d(t,"NEW_SPEC_ERR",function(){return s}),n.d(t,"NEW_SPEC_ERR_BATCH",function(){return u}),n.d(t,"NEW_AUTH_ERR",function(){return c}),n.d(t,"CLEAR",function(){return l}),n.d(t,"CLEAR_BY",function(){return p}),n.d(t,"newThrownErr",function(){return f}),n.d(t,"newThrownErrBatch",function(){return h}),n.d(t,"newSpecErr",function(){return d}),n.d(t,"newSpecErrBatch",function(){return m}),n.d(t,"newAuthErr",function(){return v}),n.d(t,"clear",function(){return g}),n.d(t,"clearBy",function(){return y});var r=n(119),o=n.n(r),i="err_new_thrown_err",a="err_new_thrown_err_batch",s="err_new_spec_err",u="err_new_spec_err_batch",c="err_new_auth_err",l="err_clear",p="err_clear_by";function f(e){return{type:i,payload:o()(e)}}function h(e){return{type:a,payload:e}}function d(e){return{type:s,payload:e}}function m(e){return{type:u,payload:e}}function v(e){return{type:c,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:l,payload:e}}function y(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:p,payload:e}}},function(e,t,n){var r=n(98);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){var r=n(43);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t,n){var r=n(64),o=r.Buffer;function i(e,t){for(var n in e)t[n]=e[n]}function a(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(i(r,t),t.Buffer=a),i(o,a),a.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return o(e,t,n)},a.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=o(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},a.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return o(e)},a.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){var r=n(46),o=n(349),i=n(218),a=Object.defineProperty;t.f=n(50)?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){e.exports=!n(82)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){var r=n(366),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();e.exports=i},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){"use strict";e.exports={debugTool:null}},function(e,t,n){e.exports=n(573)},function(e,t,n){e.exports=n(770)},function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=45)}([function(e,t){e.exports=n(17)},function(e,t){e.exports=n(14)},function(e,t){e.exports=n(26)},function(e,t){e.exports=n(16)},function(e,t){e.exports=n(123)},function(e,t){e.exports=n(60)},function(e,t){e.exports=n(61)},function(e,t){e.exports=n(55)},function(e,t){e.exports=n(2)},function(e,t){e.exports=n(54)},function(e,t){e.exports=n(94)},function(e,t){e.exports=n(28)},function(e,t){e.exports=n(930)},function(e,t){e.exports=n(12)},function(e,t){e.exports=n(192)},function(e,t){e.exports=n(936)},function(e,t){e.exports=n(93)},function(e,t){e.exports=n(193)},function(e,t){e.exports=n(939)},function(e,t){e.exports=n(943)},function(e,t){e.exports=n(944)},function(e,t){e.exports=n(92)},function(e,t){e.exports=n(13)},function(e,t){e.exports=n(146)},function(e,t){e.exports=n(4)},function(e,t){e.exports=n(5)},function(e,t){e.exports=n(946)},function(e,t){e.exports=n(421)},function(e,t){e.exports=n(949)},function(e,t){e.exports=n(52)},function(e,t){e.exports=n(64)},function(e,t){e.exports=n(283)},function(e,t){e.exports=n(272)},function(e,t){e.exports=n(950)},function(e,t){e.exports=n(145)},function(e,t){e.exports=n(951)},function(e,t){e.exports=n(959)},function(e,t){e.exports=n(960)},function(e,t){e.exports=n(961)},function(e,t){e.exports=n(40)},function(e,t){e.exports=n(264)},function(e,t){e.exports=n(37)},function(e,t){e.exports=n(964)},function(e,t){e.exports=n(965)},function(e,t){e.exports=n(966)},function(e,t,n){e.exports=n(50)},function(e,t){e.exports=n(967)},function(e,t){e.exports=n(968)},function(e,t){e.exports=n(969)},function(e,t){e.exports=n(970)},function(e,t,n){"use strict";n.r(t);var r={};n.r(r),n.d(r,"path",function(){return mn}),n.d(r,"query",function(){return vn}),n.d(r,"header",function(){return yn}),n.d(r,"cookie",function(){return bn});var o=n(9),i=n.n(o),a=n(10),s=n.n(a),u=n(5),c=n.n(u),l=n(6),p=n.n(l),f=n(7),h=n.n(f),d=n(0),m=n.n(d),v=n(8),g=n.n(v),y=(n(46),n(15)),b=n.n(y),_=n(20),w=n.n(_),x=n(12),E=n.n(x),S=n(4),C=n.n(S),k=n(22),O=n.n(k),A=n(11),T=n.n(A),j=n(2),P=n.n(j),I=n(1),M=n.n(I),N=n(17),R=n.n(N),D=(n(47),n(26)),L=n.n(D),U=n(23),q=n.n(U),F=n(31),B=n.n(F),z={serializeRes:J,mergeInQueryOrForm:Z};function V(e){return H.apply(this,arguments)}function H(){return(H=R()(C.a.mark(function e(t){var n,r,o,i,a,s=arguments;return C.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n=s.length>1&&void 0!==s[1]?s[1]:{},"object"===P()(t)&&(t=(n=t).url),n.headers=n.headers||{},z.mergeInQueryOrForm(n),n.headers&&m()(n.headers).forEach(function(e){var t=n.headers[e];"string"==typeof t&&(n.headers[e]=t.replace(/\n+/g," "))}),!n.requestInterceptor){e.next=12;break}return e.next=8,n.requestInterceptor(n);case 8:if(e.t0=e.sent,e.t0){e.next=11;break}e.t0=n;case 11:n=e.t0;case 12:return r=n.headers["content-type"]||n.headers["Content-Type"],/multipart\/form-data/i.test(r)&&(delete n.headers["content-type"],delete n.headers["Content-Type"]),e.prev=14,e.next=17,(n.userFetch||fetch)(n.url,n);case 17:return o=e.sent,e.next=20,z.serializeRes(o,t,n);case 20:if(o=e.sent,!n.responseInterceptor){e.next=28;break}return e.next=24,n.responseInterceptor(o);case 24:if(e.t1=e.sent,e.t1){e.next=27;break}e.t1=o;case 27:o=e.t1;case 28:e.next=38;break;case 30:if(e.prev=30,e.t2=e.catch(14),o){e.next=34;break}throw e.t2;case 34:throw(i=new Error(o.statusText)).statusCode=i.status=o.status,i.responseError=e.t2,i;case 38:if(o.ok){e.next=43;break}throw(a=new Error(o.statusText)).statusCode=a.status=o.status,a.response=o,a;case 43:return e.abrupt("return",o);case 44:case"end":return e.stop()}},e,null,[[14,30]])}))).apply(this,arguments)}var W=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return/(json|xml|yaml|text)\b/.test(e)};function J(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).loadSpec,r=void 0!==n&&n,o={ok:e.ok,url:e.url||t,status:e.status,statusText:e.statusText,headers:K(e.headers)},i=o.headers["content-type"],a=r||W(i);return(a?e.text:e.blob||e.buffer).call(e).then(function(e){if(o.text=e,o.data=e,a)try{var t=function(e,t){return t&&(0===t.indexOf("application/json")||t.indexOf("+json")>0)?JSON.parse(e):q.a.safeLoad(e)}(e,i);o.body=t,o.obj=t}catch(e){o.parseError=e}return o})}function K(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={};return"function"==typeof e.forEach?(e.forEach(function(e,n){void 0!==t[n]?(t[n]=M()(t[n])?t[n]:[t[n]],t[n].push(e)):t[n]=e}),t):t}function Y(e,t){return t||"undefined"==typeof navigator||(t=navigator),t&&"ReactNative"===t.product?!(!e||"object"!==P()(e)||"string"!=typeof e.uri):"undefined"!=typeof File?e instanceof File:null!==e&&"object"===P()(e)&&"function"==typeof e.pipe}function $(e,t){var n=e.collectionFormat,r=e.allowEmptyValue,o="object"===P()(e)?e.value:e;if(void 0===o&&r)return"";if(Y(o)||"boolean"==typeof o)return o;var i=encodeURIComponent;return t&&(i=B()(o)?function(e){return e}:function(e){return T()(e)}),"object"!==P()(o)||M()(o)?M()(o)?M()(o)&&!n?o.map(i).join(","):"multi"===n?o.map(i):o.map(i).join({csv:",",ssv:"%20",tsv:"%09",pipes:"|"}[n]):i(o):""}function G(e){var t=m()(e).reduce(function(t,n){var r,o=e[n],i=!!o.skipEncoding,a=i?n:encodeURIComponent(n),s=(r=o)&&"object"===P()(r)&&!M()(o);return t[a]=$(s?o:{value:o},i),t},{});return L.a.stringify(t,{encode:!1,indices:!1})||""}function Z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,r=void 0===t?"":t,o=e.query,i=e.form;if(i){var a=m()(i).some(function(e){return Y(i[e].value)}),s=e.headers["content-type"]||e.headers["Content-Type"];if(a||/multipart\/form-data/i.test(s)){var u=n(48);e.body=new u,m()(i).forEach(function(t){e.body.append(t,$(i[t],!0))})}else e.body=G(i);delete e.form}if(o){var c=r.split("?"),l=O()(c,2),p=l[0],f=l[1],h="";if(f){var d=L.a.parse(f);m()(o).forEach(function(e){return delete d[e]}),h=L.a.stringify(d,{encode:!0})}var v=function(){for(var e=arguments.length,t=new Array(e),n=0;n0){var o=t(e,n[n.length-1],n);o&&(r=r.concat(o))}if(M()(e)){var i=e.map(function(e,r){return Ce(e,t,n.concat(r))});i&&(r=r.concat(i))}else if(Te(e)){var a=m()(e).map(function(r){return Ce(e[r],t,n.concat(r))});a&&(r=r.concat(a))}return r=Oe(r)}function ke(e){return M()(e)?e:[e]}function Oe(e){var t;return(t=[]).concat.apply(t,he()(e.map(function(e){return M()(e)?Oe(e):e})))}function Ae(e){return e.filter(function(e){return void 0!==e})}function Te(e){return e&&"object"===P()(e)}function je(e){return e&&"function"==typeof e}function Pe(e){if(Ne(e)){var t=e.op;return"add"===t||"remove"===t||"replace"===t}return!1}function Ie(e){return Pe(e)||Ne(e)&&"mutation"===e.type}function Me(e){return Ie(e)&&("add"===e.op||"replace"===e.op||"merge"===e.op||"mergeDeep"===e.op)}function Ne(e){return e&&"object"===P()(e)}function Re(e,t){try{return me.a.getValueByPointer(e,t)}catch(e){return console.error(e),{}}}var De=n(35),Le=n.n(De),Ue=n(36),qe=n(28),Fe=n.n(qe);function Be(e,t){function n(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var e=arguments.length,n=new Array(e),r=0;r-1&&-1===We.indexOf(n)||Je.indexOf(r)>-1||Ke.some(function(e){return r.indexOf(e)>-1})}function $e(e,t){var n=e.split("#"),r=O()(n,2),o=r[0],i=r[1],a=E.a.resolve(o||"",t||"");return i?"".concat(a,"#").concat(i):a}var Ge="application/json, application/yaml",Ze=new RegExp("^([a-z]+://|//)","i"),Xe=Be("JSONRefError",function(e,t,n){this.originalError=n,ie()(this,t||{})}),Qe={},et=new Le.a,tt=[function(e){return"paths"===e[0]&&"responses"===e[3]&&"content"===e[5]&&"example"===e[7]},function(e){return"paths"===e[0]&&"requestBody"===e[3]&&"content"===e[4]&&"example"===e[6]}],nt={key:"$ref",plugin:function(e,t,n,r){var o=r.getInstance(),i=n.slice(0,-1);if(!Ye(i)&&(a=i,!tt.some(function(e){return e(a)}))){var a,s=r.getContext(n).baseDoc;if("string"!=typeof e)return new Xe("$ref: must be a string (JSON-Ref)",{$ref:e,baseDoc:s,fullPath:n});var u,c,l,p=st(e),f=p[0],h=p[1]||"";try{u=s||f?it(f,s):null}catch(t){return at(t,{pointer:h,$ref:e,basePath:u,fullPath:n})}if(function(e,t,n,r){var o=et.get(r);o||(o={},et.set(r,o));var i=function(e){if(0===e.length)return"";return"/".concat(e.map(ht).join("/"))}(n),a="".concat(t||"","#").concat(e),s=i.replace(/allOf\/\d+\/?/g,""),u=r.contextTree.get([]).baseDoc;if(t==u&&mt(s,e))return!0;var c="";if(n.some(function(e){return c="".concat(c,"/").concat(ht(e)),o[c]&&o[c].some(function(e){return mt(e,a)||mt(a,e)})}))return!0;o[s]=(o[s]||[]).concat(a)}(h,u,i,r)&&!o.useCircularStructures){var d=$e(e,u);return e===d?null:_e.replace(n,d)}if(null==u?(l=pt(h),void 0===(c=r.get(l))&&(c=new Xe("Could not resolve reference: ".concat(e),{pointer:h,$ref:e,baseDoc:s,fullPath:n}))):c=null!=(c=ut(u,h)).__value?c.__value:c.catch(function(t){throw at(t,{pointer:h,$ref:e,baseDoc:s,fullPath:n})}),c instanceof Error)return[_e.remove(n),c];var v=$e(e,u),g=_e.replace(i,c,{$$ref:v});if(u&&u!==s)return[g,_e.context(i,{baseDoc:u})];try{if(!function(e,t){var n=[e];return t.path.reduce(function(e,t){return n.push(e[t]),e[t]},e),function e(t){return _e.isObject(t)&&(n.indexOf(t)>=0||m()(t).some(function(n){return e(t[n])}))}(t.value)}(r.state,g)||o.useCircularStructures)return g}catch(e){return null}}}},rt=ie()(nt,{docCache:Qe,absoluteify:it,clearCache:function(e){void 0!==e?delete Qe[e]:m()(Qe).forEach(function(e){delete Qe[e]})},JSONRefError:Xe,wrapError:at,getDoc:ct,split:st,extractFromDoc:ut,fetchJSON:function(e){return Object(Ue.fetch)(e,{headers:{Accept:Ge},loadSpec:!0}).then(function(e){return e.text()}).then(function(e){return q.a.safeLoad(e)})},extract:lt,jsonPointerToArray:pt,unescapeJsonPointerToken:ft}),ot=rt;function it(e,t){if(!Ze.test(e)){if(!t)throw new Xe("Tried to resolve a relative URL, without having a basePath. path: '".concat(e,"' basePath: '").concat(t,"'"));return E.a.resolve(t,e)}return e}function at(e,t){var n;return n=e&&e.response&&e.response.body?"".concat(e.response.body.code," ").concat(e.response.body.message):e.message,new Xe("Could not resolve reference: ".concat(n),t,e)}function st(e){return(e+"").split("#")}function ut(e,t){var n=Qe[e];if(n&&!_e.isPromise(n))try{var r=lt(t,n);return ie()(Q.a.resolve(r),{__value:r})}catch(e){return Q.a.reject(e)}return ct(e).then(function(e){return lt(t,e)})}function ct(e){var t=Qe[e];return t?_e.isPromise(t)?t:Q.a.resolve(t):(Qe[e]=rt.fetchJSON(e).then(function(t){return Qe[e]=t,t}),Qe[e])}function lt(e,t){var n=pt(e);if(n.length<1)return t;var r=_e.getIn(t,n);if(void 0===r)throw new Xe("Could not resolve pointer: ".concat(e," does not exist in document"),{pointer:e});return r}function pt(e){if("string"!=typeof e)throw new TypeError("Expected a string, got a ".concat(P()(e)));return"/"===e[0]&&(e=e.substr(1)),""===e?[]:e.split("/").map(ft)}function ft(e){return"string"!=typeof e?e:Fe.a.unescape(e.replace(/~1/g,"/").replace(/~0/g,"~"))}function ht(e){return Fe.a.escape(e.replace(/~/g,"~0").replace(/\//g,"~1"))}var dt=function(e){return!e||"/"===e||"#"===e};function mt(e,t){if(dt(t))return!0;var n=e.charAt(t.length),r=t.slice(-1);return 0===e.indexOf(t)&&(!n||"/"===n||"#"===n)&&"#"!==r}var vt={key:"allOf",plugin:function(e,t,n,r,o){if(!o.meta||!o.meta.$$ref){var i=n.slice(0,-1);if(!Ye(i)){if(!M()(e)){var a=new TypeError("allOf must be an array");return a.fullPath=n,a}var s=!1,u=o.value;i.forEach(function(e){u&&(u=u[e])}),delete(u=ie()({},u)).allOf;var c=[];return c.push(r.replace(i,{})),e.forEach(function(e,t){if(!r.isObject(e)){if(s)return null;s=!0;var o=new TypeError("Elements in allOf must be objects");return o.fullPath=n,c.push(o)}c.push(r.mergeDeep(i,e));var a=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.specmap,o=n.getBaseUrlForNodePath,i=void 0===o?function(e){return r.getContext([].concat(he()(t),he()(e))).baseDoc}:o,a=n.targetKeys,s=void 0===a?["$ref","$$ref"]:a,u=[];return Ve()(e).forEach(function(){if(s.indexOf(this.key)>-1){var e=this.path,n=t.concat(this.path),o=$e(this.node,i(e));u.push(r.replace(n,o))}}),u}(e,n.slice(0,-1),{getBaseUrlForNodePath:function(e){return r.getContext([].concat(he()(n),[t],he()(e))).baseDoc},specmap:r});c.push.apply(c,he()(a))}),c.push(r.mergeDeep(i,u)),u.$$ref||c.push(r.remove([].concat(i,"$$ref"))),c}}}},gt={key:"parameters",plugin:function(e,t,n,r,o){if(M()(e)&&e.length){var i=ie()([],e),a=n.slice(0,-1),s=ie()({},_e.getIn(r.spec,a));return e.forEach(function(e,t){try{i[t].default=r.parameterMacro(s,e)}catch(e){var o=new Error(e);return o.fullPath=n,o}}),_e.replace(n,i)}return _e.replace(n,e)}},yt={key:"properties",plugin:function(e,t,n,r){var o=ie()({},e);for(var i in e)try{o[i].default=r.modelPropertyMacro(o[i])}catch(e){var a=new Error(e);return a.fullPath=n,a}return _e.replace(n,o)}};function bt(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}var _t=function(){function e(t){se()(this,e),this.root=wt(t||{})}return ce()(e,[{key:"set",value:function(e,t){var n=this.getParent(e,!0);if(n){var r=e[e.length-1],o=n.children;o[r]?xt(o[r],t,n):o[r]=wt(t,n)}else xt(this.root,t,null)}},{key:"get",value:function(e){if((e=e||[]).length<1)return this.root.value;for(var t,n,r=this.root,o=0;o1?n-1:0),o=1;o1?n-1:0),o=1;o0})}},{key:"nextPromisedPatch",value:function(){if(this.promisedPatches.length>0)return Q.a.race(this.promisedPatches.map(function(e){return e.value}))}},{key:"getPluginHistory",value:function(e){var t=this.getPluginName(e);return this.pluginHistory[t]||[]}},{key:"getPluginRunCount",value:function(e){return this.getPluginHistory(e).length}},{key:"getPluginHistoryTip",value:function(e){var t=this.getPluginHistory(e);return t&&t[t.length-1]||{}}},{key:"getPluginMutationIndex",value:function(e){var t=this.getPluginHistoryTip(e).mutationIndex;return"number"!=typeof t?-1:t}},{key:"getPluginName",value:function(e){return e.pluginName}},{key:"updatePluginHistory",value:function(e,t){var n=this.getPluginName(e);(this.pluginHistory[n]=this.pluginHistory[n]||[]).push(t)}},{key:"updatePatches",value:function(e,t){var n=this;_e.normalizeArray(e).forEach(function(e){if(e instanceof Error)n.errors.push(e);else try{if(!_e.isObject(e))return void n.debug("updatePatches","Got a non-object patch",e);if(n.showDebug&&n.allPatches.push(e),_e.isPromise(e.value))return n.promisedPatches.push(e),void n.promisedPatchThen(e);if(_e.isContextPatch(e))return void n.setContext(e.path,e.value);if(_e.isMutation(e))return void n.updateMutations(e)}catch(e){console.error(e),n.errors.push(e)}})}},{key:"updateMutations",value:function(e){"object"===P()(e.value)&&!M()(e.value)&&this.allowMetaPatches&&(e.value=ie()({},e.value));var t=_e.applyPatch(this.state,e,{allowMetaPatches:this.allowMetaPatches});t&&(this.mutations.push(e),this.state=t)}},{key:"removePromisedPatch",value:function(e){var t=this.promisedPatches.indexOf(e);t<0?this.debug("Tried to remove a promisedPatch that isn't there!"):this.promisedPatches.splice(t,1)}},{key:"promisedPatchThen",value:function(e){var t=this;return e.value=e.value.then(function(n){var r=ie()({},e,{value:n});t.removePromisedPatch(e),t.updatePatches(r)}).catch(function(n){t.removePromisedPatch(e),t.updatePatches(n)})}},{key:"getMutations",value:function(e,t){return e=e||0,"number"!=typeof t&&(t=this.mutations.length),this.mutations.slice(e,t)}},{key:"getCurrentMutations",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:"getMutationsForPlugin",value:function(e){var t=this.getPluginMutationIndex(e);return this.getMutations(t+1)}},{key:"getCurrentPlugin",value:function(){return this.currentPlugin}},{key:"getPatchesOfType",value:function(e,t){return e.filter(t)}},{key:"getLib",value:function(){return this.libMethods}},{key:"_get",value:function(e){return _e.getIn(this.state,e)}},{key:"_getContext",value:function(e){return this.contextTree.get(e)}},{key:"setContext",value:function(e,t){return this.contextTree.set(e,t)}},{key:"_hasRun",value:function(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}},{key:"_clone",value:function(e){return JSON.parse(T()(e))}},{key:"dispatch",value:function(){var e=this,t=this,n=this.nextPlugin();if(!n){var r=this.nextPromisedPatch();if(r)return r.then(function(){return e.dispatch()}).catch(function(){return e.dispatch()});var o={spec:this.state,errors:this.errors};return this.showDebug&&(o.patches=this.allPatches),Q.a.resolve(o)}if(t.pluginCount=t.pluginCount||{},t.pluginCount[n]=(t.pluginCount[n]||0)+1,t.pluginCount[n]>100)return Q.a.resolve({spec:t.state,errors:t.errors.concat(new Error("We've reached a hard limit of ".concat(100," plugin runs")))});if(n!==this.currentPlugin&&this.promisedPatches.length){var i=this.promisedPatches.map(function(e){return e.value});return Q.a.all(i.map(function(e){return e.then(Function,Function)})).then(function(){return e.dispatch()})}return function(){t.currentPlugin=n;var e=t.getCurrentMutations(),r=t.mutations.length-1;try{if(n.isGenerator){var o=!0,i=!1,s=void 0;try{for(var u,c=te()(n(e,t.getLib()));!(o=(u=c.next()).done);o=!0){a(u.value)}}catch(e){i=!0,s=e}finally{try{o||null==c.return||c.return()}finally{if(i)throw s}}}else{a(n(e,t.getLib()))}}catch(e){console.error(e),a([ie()(re()(e),{plugin:n})])}finally{t.updatePluginHistory(n,{mutationIndex:r})}return t.dispatch()}();function a(e){e&&(e=_e.fullyNormalizeArray(e),t.updatePatches(e,n))}}}]),e}();var St={refs:ot,allOf:vt,parameters:gt,properties:yt},Ct=n(29),kt=n.n(Ct),Ot=function(e){return String.prototype.toLowerCase.call(e)},At=function(e){return e.replace(/[^\w]/gi,"_")};function Tt(e){var t=e.openapi;return!!t&&w()(t,"3")}function jt(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=(arguments.length>3&&void 0!==arguments[3]?arguments[3]:{}).v2OperationIdCompatibilityMode;return e&&"object"===P()(e)?(e.operationId||"").replace(/\s/g,"").length?At(e.operationId):function(e,t){if((arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).v2OperationIdCompatibilityMode){var n="".concat(t.toLowerCase(),"_").concat(e).replace(/[\s!@#$%^&*()_+=[{\]};:<>|.\/?,\\'""-]/g,"_");return(n=n||"".concat(e.substring(1),"_").concat(t)).replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return"".concat(Ot(t)).concat(At(e))}(t,n,{v2OperationIdCompatibilityMode:r}):null}function Pt(e,t){return"".concat(Ot(t),"-").concat(e)}function It(e,t){return e&&e.paths?function(e,t){return Mt(e,t,!0)||null}(e,function(e){var n=e.pathName,r=e.method,o=e.operation;if(!o||"object"!==P()(o))return!1;var i=o.operationId;return[jt(o,n,r),Pt(n,r),i].some(function(e){return e&&e===t})}):null}function Mt(e,t,n){if(!e||"object"!==P()(e)||!e.paths||"object"!==P()(e.paths))return null;var r=e.paths;for(var o in r)for(var i in r[o])if("PARAMETERS"!==i.toUpperCase()){var a=r[o][i];if(a&&"object"===P()(a)){var s={spec:e,pathName:o,method:i.toUpperCase(),operation:a},u=t(s);if(n&&u)return s}}}function Nt(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var o in n){var i=n[o];if(kt()(i)){var a=i.parameters,s=function(e){var n=i[e];if(!kt()(n))return"continue";var s=jt(n,o,e);if(s){r[s]?r[s].push(n):r[s]=[n];var u=r[s];if(u.length>1)u.forEach(function(e,t){e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId="".concat(s).concat(t+1)});else if(void 0!==n.operationId){var c=u[0];c.__originalOperationId=c.__originalOperationId||n.operationId,c.operationId=s}}if("parameters"!==e){var l=[],p={};for(var f in t)"produces"!==f&&"consumes"!==f&&"security"!==f||(p[f]=t[f],l.push(p));if(a&&(p.parameters=a,l.push(p)),l.length)for(var h=0,d=l;h1&&void 0!==arguments[1]?arguments[1]:{},n=t.requestInterceptor,r=t.responseInterceptor,o=e.withCredentials?"include":"same-origin";return function(t){return e({url:t,loadSpec:!0,requestInterceptor:n,responseInterceptor:r,headers:{Accept:Ge},credentials:o}).then(function(e){return e.body})}}function Dt(e){var t=e.fetch,n=e.spec,r=e.url,o=e.mode,i=e.allowMetaPatches,a=void 0===i||i,s=e.pathDiscriminator,u=e.modelPropertyMacro,c=e.parameterMacro,l=e.requestInterceptor,p=e.responseInterceptor,f=e.skipNormalization,h=e.useCircularStructures,d=e.http,m=e.baseDoc;return m=m||r,d=t||d||V,n?v(n):Rt(d,{requestInterceptor:l,responseInterceptor:p})(m).then(v);function v(e){m&&(St.refs.docCache[m]=e),St.refs.fetchJSON=Rt(d,{requestInterceptor:l,responseInterceptor:p});var t,n=[St.refs];return"function"==typeof c&&n.push(St.parameters),"function"==typeof u&&n.push(St.properties),"strict"!==o&&n.push(St.allOf),(t={spec:e,context:{baseDoc:m},plugins:n,allowMetaPatches:a,pathDiscriminator:s,parameterMacro:c,modelPropertyMacro:u,useCircularStructures:h},new Et(t).dispatch()).then(f?function(){var e=R()(C.a.mark(function e(t){return C.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",t);case 1:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}():Nt)}}var Lt=n(16),Ut=n.n(Lt);function qt(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Ft(e){for(var t=1;t2&&void 0!==m[2]?m[2]:{},o=r.returnEntireTree,i=r.baseDoc,a=r.requestInterceptor,s=r.responseInterceptor,u=r.parameterMacro,c=r.modelPropertyMacro,l=r.useCircularStructures,p={pathDiscriminator:n,baseDoc:i,requestInterceptor:a,responseInterceptor:s,parameterMacro:u,modelPropertyMacro:c,useCircularStructures:l},f=Nt({spec:t}),h=f.spec,e.next=6,Dt(Ft({},p,{spec:h,allowMetaPatches:!0,skipNormalization:!0}));case 6:return d=e.sent,!o&&M()(n)&&n.length&&(d.spec=Ut()(d.spec,n)||null),e.abrupt("return",d);case 9:case"end":return e.stop()}},e)}))).apply(this,arguments)}var zt=n(38),Vt=n.n(zt);function Ht(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Wt(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{};return function(t){var n=t.pathName,r=t.method,o=t.operationId;return function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.execute(Wt({spec:e.spec},Vt()(e,"requestInterceptor","responseInterceptor","userFetch"),{pathName:n,method:r,parameters:t,operationId:o},i))}}}};var $t=n(39),Gt=n.n($t),Zt=n(40),Xt=n.n(Zt),Qt=n(41),en=n.n(Qt),tn=n(19),nn=n.n(tn),rn=n(42),on=n.n(rn),an={body:function(e){var t=e.req,n=e.value;t.body=n},header:function(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{},void 0!==r&&(t.headers[n.name]=r)},query:function(e){var t=e.req,n=e.value,r=e.parameter;t.query=t.query||{},!1===n&&"boolean"===r.type&&(n="false");0===n&&["number","integer"].indexOf(r.type)>-1&&(n="0");if(n)t.query[r.name]={collectionFormat:r.collectionFormat,value:n};else if(r.allowEmptyValue&&void 0!==n){var o=r.name;t.query[o]=t.query[o]||{},t.query[o].allowEmptyValue=!0}},path:function(e){var t=e.req,n=e.value,r=e.parameter;t.url=t.url.split("{".concat(r.name,"}")).join(encodeURIComponent(n))},formData:function(e){var t=e.req,n=e.value,r=e.parameter;(n||r.allowEmptyValue)&&(t.form=t.form||{},t.form[r.name]={value:n,allowEmptyValue:r.allowEmptyValue,collectionFormat:r.collectionFormat})}};n(49);var sn=n(43),un=n.n(sn),cn=n(44),ln=function(e){return":/?#[]@!$&'()*+,;=".indexOf(e)>-1},pn=function(e){return/^[a-z0-9\-._~]+$/i.test(e)};function fn(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).escape,n=arguments.length>2?arguments[2]:void 0;return"number"==typeof e&&(e=e.toString()),"string"==typeof e&&e.length&&t?n?JSON.parse(e):Object(cn.stringToCharArray)(e).map(function(e){return pn(e)?e:ln(e)&&"unsafe"===t?e:(un()(e)||[]).map(function(e){return"0".concat(e.toString(16).toUpperCase()).slice(-2)}).map(function(e){return"%".concat(e)}).join("")}).join(""):e}function hn(e){var t=e.value;return M()(t)?function(e){var t=e.key,n=e.value,r=e.style,o=e.explode,i=e.escape,a=function(e){return fn(e,{escape:i})};if("simple"===r)return n.map(function(e){return a(e)}).join(",");if("label"===r)return".".concat(n.map(function(e){return a(e)}).join("."));if("matrix"===r)return n.map(function(e){return a(e)}).reduce(function(e,n){return!e||o?"".concat(e||"",";").concat(t,"=").concat(n):"".concat(e,",").concat(n)},"");if("form"===r){var s=o?"&".concat(t,"="):",";return n.map(function(e){return a(e)}).join(s)}if("spaceDelimited"===r){var u=o?"".concat(t,"="):"";return n.map(function(e){return a(e)}).join(" ".concat(u))}if("pipeDelimited"===r){var c=o?"".concat(t,"="):"";return n.map(function(e){return a(e)}).join("|".concat(c))}}(e):"object"===P()(t)?function(e){var t=e.key,n=e.value,r=e.style,o=e.explode,i=e.escape,a=function(e){return fn(e,{escape:i})},s=m()(n);if("simple"===r)return s.reduce(function(e,t){var r=a(n[t]),i=o?"=":",",s=e?"".concat(e,","):"";return"".concat(s).concat(t).concat(i).concat(r)},"");if("label"===r)return s.reduce(function(e,t){var r=a(n[t]),i=o?"=":".",s=e?"".concat(e,"."):".";return"".concat(s).concat(t).concat(i).concat(r)},"");if("matrix"===r&&o)return s.reduce(function(e,t){var r=a(n[t]),o=e?"".concat(e,";"):";";return"".concat(o).concat(t,"=").concat(r)},"");if("matrix"===r)return s.reduce(function(e,r){var o=a(n[r]),i=e?"".concat(e,","):";".concat(t,"=");return"".concat(i).concat(r,",").concat(o)},"");if("form"===r)return s.reduce(function(e,t){var r=a(n[t]),i=e?"".concat(e).concat(o?"&":","):"",s=o?"=":",";return"".concat(i).concat(t).concat(s).concat(r)},"")}(e):function(e){var t=e.key,n=e.value,r=e.style,o=e.escape,i=function(e){return fn(e,{escape:o})};if("simple"===r)return i(n);if("label"===r)return".".concat(i(n));if("matrix"===r)return";".concat(t,"=").concat(i(n));if("form"===r)return i(n);if("deepObject"===r)return i(n)}(e)}function dn(e,t){return t.includes("application/json")?"string"==typeof e?e:T()(e):e.toString()}function mn(e){var t=e.req,n=e.value,r=e.parameter,o=r.name,i=r.style,a=r.explode,s=r.content;if(s){var u=m()(s)[0];t.url=t.url.split("{".concat(o,"}")).join(fn(dn(n,u),{escape:!0}))}else{var c=hn({key:r.name,value:n,style:i||"simple",explode:a||!1,escape:!0});t.url=t.url.split("{".concat(o,"}")).join(c)}}function vn(e){var t=e.req,n=e.value,r=e.parameter;if(t.query=t.query||{},r.content){var o=m()(r.content)[0];t.query[r.name]=dn(n,o)}else if(!1===n&&(n="false"),0===n&&(n="0"),n){var i=P()(n);if("deepObject"===r.style)m()(n).forEach(function(e){var o=n[e];t.query["".concat(r.name,"[").concat(e,"]")]={value:hn({key:e,value:o,style:"deepObject",escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}});else if("object"!==i||M()(n)||"form"!==r.style&&r.style||!r.explode&&void 0!==r.explode){var a=encodeURIComponent(r.name);t.query[a]={value:hn({key:a,value:n,style:r.style||"form",explode:void 0===r.explode||r.explode,escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}}else{m()(n).forEach(function(e){var o=n[e];t.query[e]={value:hn({key:e,value:o,style:r.style||"form",escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}})}}else if(r.allowEmptyValue&&void 0!==n){var s=r.name;t.query[s]=t.query[s]||{},t.query[s].allowEmptyValue=!0}}var gn=["accept","authorization","content-type"];function yn(e){var t=e.req,n=e.parameter,r=e.value;if(t.headers=t.headers||{},!(gn.indexOf(n.name.toLowerCase())>-1))if(n.content){var o=m()(n.content)[0];t.headers[n.name]=dn(r,o)}else void 0!==r&&(t.headers[n.name]=hn({key:n.name,value:r,style:n.style||"simple",explode:void 0!==n.explode&&n.explode,escape:!1}))}function bn(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{};var o=P()(r);if(n.content){var i=m()(n.content)[0];t.headers.Cookie="".concat(n.name,"=").concat(dn(r,i))}else if("undefined"!==o){var a="object"===o&&!M()(r)&&n.explode?"":"".concat(n.name,"=");t.headers.Cookie=a+hn({key:n.name,value:r,escape:!1,style:n.style||"form",explode:void 0!==n.explode&&n.explode})}}var _n=n(30),wn=function(e,t){var n=e.operation,r=e.requestBody,o=e.securities,i=e.spec,a=e.attachContentTypeForEmptyPayload,s=e.requestContentType;t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,i=void 0===o?{}:o,a=e.spec,s=b()({},t),u=r.authorized,c=void 0===u?{}:u,l=i.security||a.security||[],p=c&&!!m()(c).length,f=Ut()(a,["components","securitySchemes"])||{};if(s.headers=s.headers||{},s.query=s.query||{},!m()(r).length||!p||!l||M()(i.security)&&!i.security.length)return t;return l.forEach(function(e,t){for(var n in e){var r=c[n],o=f[n];if(r){var i=r.value||r,a=o.type;if(r)if("apiKey"===a)"query"===o.in&&(s.query[o.name]=i),"header"===o.in&&(s.headers[o.name]=i),"cookie"===o.in&&(s.cookies[o.name]=i);else if("http"===a){if("basic"===o.scheme){var u=i.username,l=i.password,p=nn()("".concat(u,":").concat(l));s.headers.Authorization="Basic ".concat(p)}"bearer"===o.scheme&&(s.headers.Authorization="Bearer ".concat(i))}else if("oauth2"===a){var h=r.token||{},d=h[o["x-tokenName"]||"access_token"],m=h.token_type;m&&"bearer"!==m.toLowerCase()||(m="Bearer"),s.headers.Authorization="".concat(m," ").concat(d)}}}}),s}({request:t,securities:o,operation:n,spec:i});var u=n.requestBody||{},c=m()(u.content||{}),l=s&&c.indexOf(s)>-1;if(r||a){if(s&&l)t.headers["Content-Type"]=s;else if(!s){var p=c[0];p&&(t.headers["Content-Type"]=p,s=p)}}else s&&l&&(t.headers["Content-Type"]=s);return r&&(s?c.indexOf(s)>-1&&("application/x-www-form-urlencoded"===s||0===s.indexOf("multipart/")?"object"===P()(r)?(t.form={},m()(r).forEach(function(e){var n,o,i=r[e];"undefined"!=typeof File&&(o=i instanceof File),"undefined"!=typeof Blob&&(o=o||i instanceof Blob),void 0!==_n.Buffer&&(o=o||_n.Buffer.isBuffer(i)),n="object"!==P()(i)||o?i:M()(i)?i.toString():T()(i),t.form[e]={value:n}})):t.form=r:t.body=r):t.body=r),t};var xn=function(e,t){var n=e.spec,r=e.operation,o=e.securities,i=e.requestContentType,a=e.attachContentTypeForEmptyPayload;if((t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,i=void 0===o?{}:o,a=e.spec,s=b()({},t),u=r.authorized,c=void 0===u?{}:u,l=r.specSecurity,p=void 0===l?[]:l,f=i.security||p,h=c&&!!m()(c).length,d=a.securityDefinitions;if(s.headers=s.headers||{},s.query=s.query||{},!m()(r).length||!h||!f||M()(i.security)&&!i.security.length)return t;return f.forEach(function(e,t){for(var n in e){var r=c[n];if(r){var o=r.token,i=r.value||r,a=d[n],u=a.type,l=a["x-tokenName"]||"access_token",p=o&&o[l],f=o&&o.token_type;if(r)if("apiKey"===u){var h="query"===a.in?"query":"headers";s[h]=s[h]||{},s[h][a.name]=i}else"basic"===u?i.header?s.headers.authorization=i.header:(i.base64=nn()("".concat(i.username,":").concat(i.password)),s.headers.authorization="Basic ".concat(i.base64)):"oauth2"===u&&p&&(f=f&&"bearer"!==f.toLowerCase()?f:"Bearer",s.headers.authorization="".concat(f," ").concat(p))}}}),s}({request:t,securities:o,operation:r,spec:n})).body||t.form||a)i?t.headers["Content-Type"]=i:M()(r.consumes)?t.headers["Content-Type"]=r.consumes[0]:M()(n.consumes)?t.headers["Content-Type"]=n.consumes[0]:r.parameters&&r.parameters.filter(function(e){return"file"===e.type}).length?t.headers["Content-Type"]="multipart/form-data":r.parameters&&r.parameters.filter(function(e){return"formData"===e.in}).length&&(t.headers["Content-Type"]="application/x-www-form-urlencoded");else if(i){var s=r.parameters&&r.parameters.filter(function(e){return"body"===e.in}).length>0,u=r.parameters&&r.parameters.filter(function(e){return"formData"===e.in}).length>0;(s||u)&&(t.headers["Content-Type"]=i)}return t};function En(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Sn(e){for(var t=1;t-1&&(c=o,l=u[p.indexOf(o)])}return!c&&u&&u.length&&(c=u[0].url,l=u[0]),c.indexOf("{")>-1&&function(e){for(var t,n=[],r=/{([^}]+)}/g;t=r.exec(e);)n.push(t[1]);return n}(c).forEach(function(e){if(l.variables&&l.variables[e]){var t=l.variables[e],n=s[e]||t.default,r=new RegExp("{".concat(e,"}"),"g");c=c.replace(r,n)}}),function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=E.a.parse(t),o=E.a.parse(n),i=Pn(r.protocol)||Pn(o.protocol)||"",a=r.host||o.host,s=r.pathname||"";return"/"===(e=i&&a?"".concat(i,"://").concat(a+s):s)[e.length-1]?e.slice(0,-1):e}(c,i)}(b):function(e){var t,n=e.spec,r=e.scheme,o=e.contextUrl,i=void 0===o?"":o,a=E.a.parse(i),s=M()(n.schemes)?n.schemes[0]:null,u=r||s||Pn(a.protocol)||"http",c=n.host||a.host||"",l=n.basePath||"";return"/"===(t=u&&c?"".concat(u,"://").concat(c+l):l)[t.length-1]?t.slice(0,-1):t}(b),!n)return delete g.cookies,g;g.url+=S,g.method="".concat(x).toUpperCase(),h=h||{};var C=t.paths[S]||{};o&&(g.headers.accept=o);var k=An([].concat(Cn(w.parameters)).concat(Cn(C.parameters)));k.forEach(function(e){var n,r=d[e.in];if("body"===e.in&&e.schema&&e.schema.properties&&(n=h),void 0===(n=e&&e.name&&h[e.name])?n=e&&e.name&&h["".concat(e.in,".").concat(e.name)]:On(e.name,k).length>1&&console.warn("Parameter '".concat(e.name,"' is ambiguous because the defined spec has more than one parameter with the name: '").concat(e.name,"' and the passed-in parameter values did not define an 'in' value.")),null!==n){if(void 0!==e.default&&void 0===n&&(n=e.default),void 0===n&&e.required&&!e.allowEmptyValue)throw new Error("Required parameter ".concat(e.name," is not provided"));if(v&&e.schema&&"object"===e.schema.type&&"string"==typeof n)try{n=JSON.parse(n)}catch(e){throw new Error("Could not parse object parameter value string as JSON")}r&&r({req:g,parameter:e,value:n,operation:w,spec:t})}});var O=Sn({},e,{operation:w});if((g=v?wn(O,g):xn(O,g)).cookies&&m()(g.cookies).length){var A=m()(g.cookies).reduce(function(e,t){var n=g.cookies[t];return e+(e?"&":"")+on.a.serialize(t,n)},"");g.headers.Cookie=A}return g.cookies&&delete g.cookies,Z(g),g}var Pn=function(e){return e?e.replace(/\W/g,""):null};function In(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Mn(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("string"==typeof e?n.url=e:n=e,!(this instanceof Mn))return new Mn(n);b()(this,n);var r=this.resolve().then(function(){return t.disableInterfaces||b()(t,Mn.makeApisTagOperation(t)),t});return r.client=this,r}Mn.http=V,Mn.makeHttp=function(e,t,n){return n=n||function(e){return e},t=t||function(e){return e},function(r){return"string"==typeof r&&(r={url:r}),z.mergeInQueryOrForm(r),r=t(r),n(e(r))}}.bind(null,Mn.http),Mn.resolve=Dt,Mn.resolveSubtree=function(e,t){return Bt.apply(this,arguments)},Mn.execute=function(e){var t=e.http,n=e.fetch,r=e.spec,o=e.operationId,i=e.pathName,a=e.method,s=e.parameters,u=e.securities,c=Gt()(e,["http","fetch","spec","operationId","pathName","method","parameters","securities"]),l=t||n||V;i&&a&&!o&&(o=Pt(i,a));var p=Tn.buildRequest(Sn({spec:r,operationId:o,parameters:s,securities:u,http:l},c));return p.body&&(Xt()(p.body)||en()(p.body))&&(p.body=T()(p.body)),l(p)},Mn.serializeRes=J,Mn.serializeHeaders=K,Mn.clearCache=function(){St.refs.clearCache()},Mn.makeApisTagOperation=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Yt.makeExecute(e);return{apis:Yt.mapTagOperations({v2OperationIdCompatibilityMode:e.v2OperationIdCompatibilityMode,spec:e.spec,cb:t})}},Mn.buildRequest=jn,Mn.helpers={opId:jt},Mn.prototype={http:V,execute:function(e){return this.applyDefaults(),Mn.execute(function(e){for(var t=1;t + * @license MIT + */ +var r=n(569),o=n(570),i=n(355);function a(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(a()=a())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a().toString(16)+" bytes");return 0|e}function d(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return B(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return z(e).length;default:if(r)return B(e).length;t=(""+t).toLowerCase(),r=!0}}function m(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return j(this,t,n);case"utf8":case"utf-8":return k(this,t,n);case"ascii":return A(this,t,n);case"latin1":case"binary":return T(this,t,n);case"base64":return C(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=u.from(t,r)),u.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,o);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,r,o){var i,a=1,s=e.length,u=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;a=2,s/=2,u/=2,n/=2}function c(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(o){var l=-1;for(i=n;is&&(n=s-u),i=n;i>=0;i--){for(var p=!0,f=0;fo&&(r=o):r=o;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var a=0;a>8,o=n%256,i.push(o),i.push(r);return i}(t,e.length-n),e,n,r)}function C(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function k(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o239?4:c>223?3:c>191?2:1;if(o+p<=n)switch(p){case 1:c<128&&(l=c);break;case 2:128==(192&(i=e[o+1]))&&(u=(31&c)<<6|63&i)>127&&(l=u);break;case 3:i=e[o+1],a=e[o+2],128==(192&i)&&128==(192&a)&&(u=(15&c)<<12|(63&i)<<6|63&a)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:i=e[o+1],a=e[o+2],s=e[o+3],128==(192&i)&&128==(192&a)&&128==(192&s)&&(u=(15&c)<<18|(63&i)<<12|(63&a)<<6|63&s)>65535&&u<1114112&&(l=u)}null===l?(l=65533,p=1):l>65535&&(l-=65536,r.push(l>>>10&1023|55296),l=56320|1023&l),r.push(l),o+=p}return function(e){var t=e.length;if(t<=O)return String.fromCharCode.apply(String,e);var n="",r=0;for(;r0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},u.prototype.compare=function(e,t,n,r,o){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),a=(n>>>=0)-(t>>>=0),s=Math.min(i,a),c=this.slice(r,o),l=e.slice(t,n),p=0;po)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return b(this,e,t,n);case"utf8":case"utf-8":return _(this,e,t,n);case"ascii":return w(this,e,t,n);case"latin1":case"binary":return x(this,e,t,n);case"base64":return E(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function A(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;or)&&(n=r);for(var o="",i=t;in)throw new RangeError("Trying to access beyond buffer length")}function M(e,t,n,r,o,i){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function N(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-n,2);o>>8*(r?o:1-o)}function R(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-n,4);o>>8*(r?o:3-o)&255}function D(e,t,n,r,o,i){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function L(e,t,n,r,i){return i||D(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function U(e,t,n,r,i){return i||D(e,0,n,8),o.write(e,t,n,r,52,8),n+8}u.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(o*=256);)r+=this[e+--t]*o;return r},u.prototype.readUInt8=function(e,t){return t||I(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||I(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||I(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||I(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||I(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||I(e,t,this.length);for(var r=this[e],o=1,i=0;++i=(o*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||I(e,t,this.length);for(var r=t,o=1,i=this[e+--r];r>0&&(o*=256);)i+=this[e+--r]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*t)),i},u.prototype.readInt8=function(e,t){return t||I(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||I(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||I(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||I(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||I(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||I(e,4,this.length),o.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||I(e,4,this.length),o.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||I(e,8,this.length),o.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||I(e,8,this.length),o.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||M(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,i=0;for(this[t]=255&e;++i=0&&(i*=256);)this[t+o]=e/i&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);M(this,e,t,n,o-1,-o)}var i=0,a=1,s=0;for(this[t]=255&e;++i>0)-s&255;return t+n},u.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);M(this,e,t,n,o-1,-o)}var i=n-1,a=1,s=0;for(this[t+i]=255&e;--i>=0&&(a*=256);)e<0&&0===s&&0!==this[t+i+1]&&(s=1),this[t+i]=(e/a>>0)-s&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return L(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return L(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return U(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return U(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(i<1e3||!u.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(i=t;i55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(a+1===r){(t-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;i.push(n)}else if(n<2048){if((t-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(q,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function V(e,t,n,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(36))},function(e,t,n){"use strict";e.exports={current:null}},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var u,c=[],l=!1,p=-1;function f(){l&&u&&(l=!1,u.length?c=u.concat(c):p=-1,c.length&&h())}function h(){if(!l){var e=s(f);l=!0;for(var t=c.length;t;){for(u=c,c=[];++p1)for(var n=1;n0&&"/"!==t[0]});function oe(e,t,n){return t=t||[],te.apply(void 0,[e].concat(u()(t))).get("parameters",Object(p.List)()).reduce(function(e,t){var r=n&&"body"===t.get("in")?t.get("value_xml"):t.get("value");return e.set(Object(l.B)(t,{allowHashes:!1}),r)},Object(p.fromJS)({}))}function ie(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(p.List.isList(e))return e.some(function(e){return p.Map.isMap(e)&&e.get("in")===t})}function ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(p.List.isList(e))return e.some(function(e){return p.Map.isMap(e)&&e.get("type")===t})}function se(e,t){t=t||[];var n=x(e).getIn(["paths"].concat(u()(t)),Object(p.fromJS)({})),r=e.getIn(["meta","paths"].concat(u()(t)),Object(p.fromJS)({})),o=ue(e,t),i=n.get("parameters")||new p.List,a=r.get("consumes_value")?r.get("consumes_value"):ae(i,"file")?"multipart/form-data":ae(i,"formData")?"application/x-www-form-urlencoded":void 0;return Object(p.fromJS)({requestContentType:a,responseContentType:o})}function ue(e,t){t=t||[];var n=x(e).getIn(["paths"].concat(u()(t)),null);if(null!==n){var r=e.getIn(["meta","paths"].concat(u()(t),["produces_value"]),null),o=n.getIn(["produces",0],null);return r||o||"application/json"}}function ce(e,t){t=t||[];var n=x(e),r=n.getIn(["paths"].concat(u()(t)),null);if(null!==r){var o=t,i=a()(o,1)[0],s=r.get("produces",null),c=n.getIn(["paths",i,"produces"],null),l=n.getIn(["produces"],null);return s||c||l}}function le(e,t){t=t||[];var n=x(e),r=n.getIn(["paths"].concat(u()(t)),null);if(null!==r){var o=t,i=a()(o,1)[0],s=r.get("consumes",null),c=n.getIn(["paths",i,"consumes"],null),l=n.getIn(["consumes"],null);return s||c||l}}var pe=function(e,t,n){var r=e.get("url").match(/^([a-z][a-z0-9+\-.]*):/),i=o()(r)?r[1]:null;return e.getIn(["scheme",t,n])||e.getIn(["scheme","_defaultScheme"])||i||""},fe=function(e,t,n){return["http","https"].indexOf(pe(e,t,n))>-1},he=function(e,t){t=t||[];var n=e.getIn(["meta","paths"].concat(u()(t),["parameters"]),Object(p.fromJS)([])),r=!0;return n.forEach(function(e){var t=e.get("errors");t&&t.count()&&(r=!1)}),r};function de(e){return p.Map.isMap(e)?e:new p.Map}},function(e,t,n){"use strict";n.r(t),n.d(t,"SHOW_AUTH_POPUP",function(){return d}),n.d(t,"AUTHORIZE",function(){return m}),n.d(t,"LOGOUT",function(){return v}),n.d(t,"PRE_AUTHORIZE_OAUTH2",function(){return g}),n.d(t,"AUTHORIZE_OAUTH2",function(){return y}),n.d(t,"VALIDATE",function(){return b}),n.d(t,"CONFIGURE_AUTH",function(){return _}),n.d(t,"showDefinitions",function(){return w}),n.d(t,"authorize",function(){return x}),n.d(t,"logout",function(){return E}),n.d(t,"preAuthorizeImplicit",function(){return S}),n.d(t,"authorizeOauth2",function(){return C}),n.d(t,"authorizePassword",function(){return k}),n.d(t,"authorizeApplication",function(){return O}),n.d(t,"authorizeAccessCodeWithFormParams",function(){return A}),n.d(t,"authorizeAccessCodeWithBasicAuthentication",function(){return T}),n.d(t,"authorizeRequest",function(){return j}),n.d(t,"configureAuth",function(){return P});var r=n(26),o=n.n(r),i=n(16),a=n.n(i),s=n(28),u=n.n(s),c=n(95),l=n.n(c),p=n(18),f=n.n(p),h=n(3),d="show_popup",m="authorize",v="logout",g="pre_authorize_oauth2",y="authorize_oauth2",b="validate",_="configure_auth";function w(e){return{type:d,payload:e}}function x(e){return{type:m,payload:e}}function E(e){return{type:v,payload:e}}var S=function(e){return function(t){var n=t.authActions,r=t.errActions,o=e.auth,i=e.token,a=e.isValid,s=o.schema,c=o.name,l=s.get("flow");delete f.a.swaggerUIRedirectOauth2,"accessCode"===l||a||r.newAuthErr({authId:c,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),i.error?r.newAuthErr({authId:c,source:"auth",level:"error",message:u()(i)}):n.authorizeOauth2({auth:o,token:i})}};function C(e){return{type:y,payload:e}}var k=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.name,i=e.username,s=e.password,u=e.passwordType,c=e.clientId,l=e.clientSecret,p={grant_type:"password",scope:e.scopes.join(" "),username:i,password:s},f={};switch(u){case"request-body":!function(e,t,n){t&&a()(e,{client_id:t});n&&a()(e,{client_secret:n})}(p,c,l);break;case"basic":f.Authorization="Basic "+Object(h.a)(c+":"+l);break;default:console.warn("Warning: invalid passwordType ".concat(u," was passed, not including client id and secret"))}return n.authorizeRequest({body:Object(h.b)(p),url:r.get("tokenUrl"),name:o,headers:f,query:{},auth:e})}};var O=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.scopes,i=e.name,a=e.clientId,s=e.clientSecret,u={Authorization:"Basic "+Object(h.a)(a+":"+s)},c={grant_type:"client_credentials",scope:o.join(" ")};return n.authorizeRequest({body:Object(h.b)(c),name:i,url:r.get("tokenUrl"),auth:e,headers:u})}},A=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,i=t.name,a=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={grant_type:"authorization_code",code:t.code,client_id:a,client_secret:s,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(h.b)(c),name:i,url:o.get("tokenUrl"),auth:t})}},T=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,i=t.name,a=t.clientId,s=t.clientSecret,u={Authorization:"Basic "+Object(h.a)(a+":"+s)},c={grant_type:"authorization_code",code:t.code,client_id:a,redirect_uri:n};return r.authorizeRequest({body:Object(h.b)(c),name:i,url:o.get("tokenUrl"),auth:t,headers:u})}},j=function(e){return function(t){var n,r=t.fn,i=t.getConfigs,s=t.authActions,c=t.errActions,p=t.oas3Selectors,f=t.specSelectors,h=t.authSelectors,d=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,_=e.url,w=e.auth,x=(h.getConfigs()||{}).additionalQueryStringParams;n=f.isOAS3()?l()(_,p.selectedServer(),!0):l()(_,f.url(),!0),"object"===o()(x)&&(n.query=a()({},n.query,x));var E=n.toString(),S=a()({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},y);r.fetch({url:E,method:"post",headers:S,query:v,body:d,requestInterceptor:i().requestInterceptor,responseInterceptor:i().responseInterceptor}).then(function(e){var t=JSON.parse(e.data),n=t&&(t.error||""),r=t&&(t.parseError||"");e.ok?n||r?c.newAuthErr({authId:b,level:"error",source:"auth",message:u()(t)}):s.authorizeOauth2({auth:w,token:t}):c.newAuthErr({authId:b,level:"error",source:"auth",message:e.statusText})}).catch(function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r="string"==typeof n?JSON.parse(n):n;r.error&&(t+=", error: ".concat(r.error)),r.error_description&&(t+=", description: ".concat(r.error_description))}catch(e){}}c.newAuthErr({authId:b,level:"error",source:"auth",message:t})})}};function P(e){return{type:_,payload:e}}},function(e,t){var n=e.exports={version:"2.6.5"};"number"==typeof __e&&(__e=n)},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){var r=n(127),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){var r=n(211),o=n(210);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(49),o=n(133);e.exports=n(50)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw new TypeError(e+" is not a function");return e}},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_LAYOUT",function(){return o}),n.d(t,"UPDATE_FILTER",function(){return i}),n.d(t,"UPDATE_MODE",function(){return a}),n.d(t,"SHOW",function(){return s}),n.d(t,"updateLayout",function(){return u}),n.d(t,"updateFilter",function(){return c}),n.d(t,"show",function(){return l}),n.d(t,"changeMode",function(){return p});var r=n(3),o="layout_update_layout",i="layout_update_filter",a="layout_update_mode",s="layout_show";function u(e){return{type:o,payload:e}}function c(e){return{type:i,payload:e}}function l(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=Object(r.w)(e),{type:s,payload:{thing:e,shown:t}}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=Object(r.w)(e),{type:a,payload:{thing:e,mode:t}}}},function(e,t,n){"use strict";(function(t){ +/*! + * @description Recursive object extending + * @author Viacheslav Lotsmanov + * @license MIT + * + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Viacheslav Lotsmanov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +function n(e){return e instanceof t||e instanceof Date||e instanceof RegExp}function r(e){if(e instanceof t){var n=t.alloc?t.alloc(e.length):new t(e.length);return e.copy(n),n}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e);throw new Error("Unexpected situation")}function o(e){var t=[];return e.forEach(function(e,i){"object"==typeof e&&null!==e?Array.isArray(e)?t[i]=o(e):n(e)?t[i]=r(e):t[i]=a({},e):t[i]=e}),t}function i(e,t){return"__proto__"===t?void 0:e[t]}var a=e.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var e,t,s=arguments[0],u=Array.prototype.slice.call(arguments,1);return u.forEach(function(u){"object"!=typeof u||null===u||Array.isArray(u)||Object.keys(u).forEach(function(c){return t=i(s,c),(e=i(u,c))===s?void 0:"object"!=typeof e||null===e?void(s[c]=e):Array.isArray(e)?void(s[c]=o(e)):n(e)?void(s[c]=r(e)):"object"!=typeof t||null===t||Array.isArray(t)?void(s[c]=a({},e)):void(s[c]=a(t,e))})}),s}}).call(this,n(64).Buffer)},function(e,t,n){var r=n(151),o=n(336);e.exports=n(126)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var r=n(106),o=n(603),i=n(604),a="[object Null]",s="[object Undefined]",u=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?s:a:u&&u in Object(e)?o(e):i(e)}},function(e,t,n){var r=n(621),o=n(624);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},function(e,t,n){var r=n(380),o=n(661),i=n(107);e.exports=function(e){return i(e)?r(e):o(e)}},function(e,t,n){"use strict";var r=n(178),o=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};e.exports=p;var i=n(137);i.inherits=n(47);var a=n(390),s=n(240);i.inherits(p,a);for(var u=o(s.prototype),c=0;c=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t){e.exports={}},function(e,t,n){n(561);for(var r=n(32),o=n(77),i=n(102),a=n(34)("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(","),u=0;u1){for(var d=Array(h),m=0;m1){for(var g=Array(v),y=0;y=this._finalSize&&(this._update(this._block),this._block.fill(0));var n=8*this._len;if(n<=4294967295)this._block.writeUInt32BE(n,this._blockSize-4);else{var r=(4294967295&n)>>>0,o=(n-r)/4294967296;this._block.writeUInt32BE(o,this._blockSize-8),this._block.writeUInt32BE(r,this._blockSize-4)}this._update(this._block);var i=this._hash();return e?i.toString(e):i},o.prototype._update=function(){throw new Error("_update must be implemented by subclass")},e.exports=o},function(e,t,n){var r=n(63),o=n(406),i=n(407),a=n(46),s=n(158),u=n(225),c={},l={};(t=e.exports=function(e,t,n,p,f){var h,d,m,v,g=f?function(){return e}:u(e),y=r(n,p,t?2:1),b=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(i(g)){for(h=s(e.length);h>b;b++)if((v=t?y(a(d=e[b])[0],d[1]):y(e[b]))===c||v===l)return v}else for(m=g.call(e);!(d=m.next()).done;)if((v=o(m,y,d.value,t))===c||v===l)return v}).BREAK=c,t.RETURN=l},function(e,t,n){"use strict";function r(e){return null==e}e.exports.isNothing=r,e.exports.isObject=function(e){return"object"==typeof e&&null!==e},e.exports.toArray=function(e){return Array.isArray(e)?e:r(e)?[]:[e]},e.exports.repeat=function(e,t){var n,r="";for(n=0;n1&&void 0!==arguments[1]?arguments[1]:{},r=Object(i.A)(t),a=r.type,s=r.example,u=r.properties,c=r.additionalProperties,l=r.items,p=n.includeReadOnly,f=n.includeWriteOnly;if(void 0!==s)return Object(i.e)(s,"$$ref",function(e){return"string"==typeof e&&e.indexOf("#")>-1});if(!a)if(u)a="object";else{if(!l)return;a="array"}if("object"===a){var d=Object(i.A)(u),m={};for(var v in d)d[v]&&d[v].deprecated||d[v]&&d[v].readOnly&&!p||d[v]&&d[v].writeOnly&&!f||(m[v]=e(d[v],n));if(!0===c)m.additionalProp1={};else if(c)for(var g=Object(i.A)(c),y=e(g,n),b=1;b<4;b++)m["additionalProp"+b]=y;return m}return"array"===a?o()(l.anyOf)?l.anyOf.map(function(t){return e(t,n)}):o()(l.oneOf)?l.oneOf.map(function(t){return e(t,n)}):[e(l,n)]:t.enum?t.default?t.default:Object(i.w)(t.enum)[0]:"file"!==a?h(t):void 0},m=function(e){return e.schema&&(e=e.schema),e.properties&&(e.type="object"),e},v=function e(t){var n,r,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=p()({},Object(i.A)(t)),u=s.type,c=s.properties,l=s.additionalProperties,f=s.items,d=s.example,m=a.includeReadOnly,v=a.includeWriteOnly,g=s.default,y={},b={},_=t.xml,w=_.name,x=_.prefix,E=_.namespace,S=s.enum;if(!u)if(c||l)u="object";else{if(!f)return;u="array"}if(n=(x?x+":":"")+(w=w||"notagname"),E){var C=x?"xmlns:"+x:"xmlns";b[C]=E}if("array"===u&&f){if(f.xml=f.xml||_||{},f.xml.name=f.xml.name||_.name,_.wrapped)return y[n]=[],o()(d)?d.forEach(function(t){f.example=t,y[n].push(e(f,a))}):o()(g)?g.forEach(function(t){f.default=t,y[n].push(e(f,a))}):y[n]=[e(f,a)],b&&y[n].push({_attr:b}),y;var k=[];return o()(d)?(d.forEach(function(t){f.example=t,k.push(e(f,a))}),k):o()(g)?(g.forEach(function(t){f.default=t,k.push(e(f,a))}),k):e(f,a)}if("object"===u){var O=Object(i.A)(c);for(var A in y[n]=[],d=d||{},O)if(O.hasOwnProperty(A)&&(!O[A].readOnly||m)&&(!O[A].writeOnly||v))if(O[A].xml=O[A].xml||{},O[A].xml.attribute){var T=o()(O[A].enum)&&O[A].enum[0],j=O[A].example,P=O[A].default;b[O[A].xml.name||A]=void 0!==j&&j||void 0!==d[A]&&d[A]||void 0!==P&&P||T||h(O[A])}else{O[A].xml.name=O[A].xml.name||A,void 0===O[A].example&&void 0!==d[A]&&(O[A].example=d[A]);var I=e(O[A]);o()(I)?y[n]=y[n].concat(I):y[n].push(I)}return!0===l?y[n].push({additionalProp:"Anything can be here"}):l&&y[n].push({additionalProp:h(l)}),b&&y[n].push({_attr:b}),y}return r=void 0!==d?d:void 0!==g?g:o()(S)?S[0]:h(t),y[n]=b?[{_attr:b},r]:r,y};function g(e,t){var n=v(e,t);if(n)return s()(n,{declaration:!0,indent:"\t"})}var y=c()(g),b=c()(d)},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_CONFIGS",function(){return i}),n.d(t,"TOGGLE_CONFIGS",function(){return a}),n.d(t,"update",function(){return s}),n.d(t,"toggle",function(){return u}),n.d(t,"loaded",function(){return c});var r=n(2),o=n.n(r),i="configs_update",a="configs_toggle";function s(e,t){return{type:i,payload:o()({},e,t)}}function u(e){return{type:a,payload:e}}var c=function(){return function(){}}},function(e,t,n){"use strict";n.d(t,"a",function(){return a});var r=n(1),o=n.n(r),i=o.a.Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");function a(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).isOAS3;if(!o.a.Map.isMap(e))return{schema:o.a.Map(),parameterContentMediaType:null};if(!t)return"body"===e.get("in")?{schema:e.get("schema",o.a.Map()),parameterContentMediaType:null}:{schema:e.filter(function(e,t){return i.includes(t)}),parameterContentMediaType:null};if(e.get("content")){var n=e.get("content",o.a.Map({})).keySeq().first();return{schema:e.getIn(["content",n,"schema"],o.a.Map()),parameterContentMediaType:n}}return{schema:e.get("schema",o.a.Map()),parameterContentMediaType:null}}},function(e,t,n){e.exports=n(781)},function(e,t,n){"use strict";n.r(t);var r=n(469),o="object"==typeof self&&self&&self.Object===Object&&self,i=(r.a||o||Function("return this")()).Symbol,a=Object.prototype,s=a.hasOwnProperty,u=a.toString,c=i?i.toStringTag:void 0;var l=function(e){var t=s.call(e,c),n=e[c];try{e[c]=void 0;var r=!0}catch(e){}var o=u.call(e);return r&&(t?e[c]=n:delete e[c]),o},p=Object.prototype.toString;var f=function(e){return p.call(e)},h="[object Null]",d="[object Undefined]",m=i?i.toStringTag:void 0;var v=function(e){return null==e?void 0===e?d:h:m&&m in Object(e)?l(e):f(e)};var g=function(e,t){return function(n){return e(t(n))}}(Object.getPrototypeOf,Object);var y=function(e){return null!=e&&"object"==typeof e},b="[object Object]",_=Function.prototype,w=Object.prototype,x=_.toString,E=w.hasOwnProperty,S=x.call(Object);var C=function(e){if(!y(e)||v(e)!=b)return!1;var t=g(e);if(null===t)return!0;var n=E.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&x.call(n)==S},k=n(330),O={INIT:"@@redux/INIT"};function A(e,t,n){var r;if("function"==typeof t&&void 0===n&&(n=t,t=void 0),void 0!==n){if("function"!=typeof n)throw new Error("Expected the enhancer to be a function.");return n(A)(e,t)}if("function"!=typeof e)throw new Error("Expected the reducer to be a function.");var o=e,i=t,a=[],s=a,u=!1;function c(){s===a&&(s=a.slice())}function l(){return i}function p(e){if("function"!=typeof e)throw new Error("Expected listener to be a function.");var t=!0;return c(),s.push(e),function(){if(t){t=!1,c();var n=s.indexOf(e);s.splice(n,1)}}}function f(e){if(!C(e))throw new Error("Actions must be plain objects. Use custom middleware for async actions.");if(void 0===e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?');if(u)throw new Error("Reducers may not dispatch actions.");try{u=!0,i=o(i,e)}finally{u=!1}for(var t=a=s,n=0;n0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];if(a)throw a;for(var r=!1,o={},s=0;s0?r:n)(e)}},function(e,t){e.exports={}},function(e,t,n){var r=n(348),o=n(215);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){e.exports=!0},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var r=n(49).f,o=n(75),i=n(34)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){var r=n(159)("meta"),o=n(43),i=n(75),a=n(49).f,s=0,u=Object.isExtensible||function(){return!0},c=!n(82)(function(){return u(Object.preventExtensions({}))}),l=function(e){a(e,r,{value:{i:"O"+ ++s,w:{}}})},p=e.exports={KEY:r,NEED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,r)){if(!u(e))return"F";if(!t)return"E";l(e)}return e[r].i},getWeak:function(e,t){if(!i(e,r)){if(!u(e))return!0;if(!t)return!1;l(e)}return e[r].w},onFreeze:function(e){return c&&p.NEED&&u(e)&&!i(e,r)&&l(e),e}}},function(e,t,n){"use strict";e.exports=function(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,r=0;r1&&void 0!==arguments[1]?arguments[1]:[],n={arrayBehaviour:(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).arrayBehaviour||"replace"},r=t.map(function(e){return e||{}}),i=e||{},c=0;c1?t-1:0),r=1;r")}),p=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();e.exports=function(e,t,n){var f=s(e),h=!i(function(){var t={};return t[f]=function(){return 7},7!=""[e](t)}),d=h?!i(function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[c]=function(){return n}),n[f](""),!t}):void 0;if(!h||!d||"replace"===e&&!l||"split"===e&&!p){var m=/./[f],v=n(a,f,""[e],function(e,t,n,r,o){return t.exec===u?h&&!o?{done:!0,value:m.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),g=v[0],y=v[1];r(String.prototype,e,g),o(RegExp.prototype,f,2==t?function(e,t){return y.call(e,this,t)}:function(e){return y.call(e,this)})}}},function(e,t,n){var r=n(212),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t,n){var r=n(46),o=n(350),i=n(215),a=n(213)("IE_PROTO"),s=function(){},u=function(){var e,t=n(217)("iframe"),r=i.length;for(t.style.display="none",n(351).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" - - - - + + + + + + + + + Events and Presentations …"> + + + + -
    + + + + -
    -
    -
    -
    -
    -
    -

    Eclipse SW360 - Presentations

    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    + + +
    +
    +

    Events and Presentations

    -
    - -
    - -
    - -
    - - -

    Events and Presentations

    + +
    +
    +
    +
    +
    + +
    +
    +
    +

    2018

    -
    • Bitkom Forum Open Source 2018: “Eclipse SW360 – Lessons Learned From Automated License Compliance” (Johannes Kristan, Bosch Software Innovations GmbH & Michael C. Jaeger, Siemens AG)
    • Inner Source Commons 2018: “Committing to Change: Inner Source at Siemens” (Karsten Gerloff, Siemens AG)
    • @@ -193,9 +194,7 @@
    • Yanking the Chain: Open Source Software Compliance in the Supply Chain: “Eclipse SW360 – Open Source Management with Open Source” (Michael C. Jaeger, Siemens AG)
    • Bitkom AK Open Source: “Eclipse SW360 – Automatisierte License Compliance” (Johannes Kristan, Bosch Software Innovations GmbH & Michael C. Jaeger, Siemens AG)
    -

    2017

    -
    • EclipseCon Europe 2017: “Leveraging Open Source Projects for Open Source Management” (Marcel Kurzmann, Bosch Software Innovations GmbH) [slides] [video]
    • EclipseCon France 2017: “SW360 – The Component Management Hub” (Johannes Kristan, Bosch Software Innovations GmbH & Michael C. Jaeger, Siemens AG) [slides] [video]
    • @@ -204,76 +203,167 @@
    • Open Source Leadership Summit 2017: “SW360 - An Open Component Hub” (Steffen Evers, Bosch Software Innovations GmbH)
    • The Seoul Copyright Forum 2017: “License compliance: FOSS tools for speed and scale” (Karsten Gerloff, Siemens AG)
    -

    2016

    -
    • Bitkom AK Open Source: “SW360 – Your Open Component Hub” (Johannes Kristan, Bosch Software Innovations GmbH & Michael C. Jaeger, Siemens AG)
    • JAXenter: “Neu im Eclipse-Universum: SW360 – das Katalogisierungsprogramm für Software-Komponenten” (Dominik Mohilo, JAXenter)
    • EclipseCon Europe 2016: “Open Source Component Management – Unconference Session” (Johannes Kristan, Bosch Software Innovations GmbH & Michael C. Jaeger, Siemens AG)
    • Linux Foundation Collab Summit 2016: “SW360: A Place like Home for OSS” (Michael C. Jaeger, Siemens AG)
    +
    + + + + +
    + +
    + + + +
    +
    + + + - - - - - + + + - + - - @@ -286,27 +376,14 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= - - - - - - - - - - - - - + - - + \ No newline at end of file diff --git a/presentations/index.xml b/presentations/index.xml new file mode 100644 index 0000000..a339c2e --- /dev/null +++ b/presentations/index.xml @@ -0,0 +1,17 @@ + + + Eclipse SW360 – Events and Presentations + https://www.eclipse.org/sw360/presentations/ + Recent content in Events and Presentations on Eclipse SW360 + Hugo -- gohugo.io + + + + + + + + + + + diff --git a/resources/index.html b/resources/index.html deleted file mode 100644 index c2f26d4..0000000 --- a/resources/index.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - - - Eclipse SW360 - Resources - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - - - - -
    - -
    -
    -
    -
    -

    Eclipse SW360 - Resources

    -
    -
    -
    -
    - - -
    - - -
    - -
    - -
    - -
    - - -

    GitHub Repository

    - - - - - - - -

    Documentation

    - - - -

    Builds

    - - - -
    - -
    - -
    - - -
    - - - -
    - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..4f9540b --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +User-agent: * \ No newline at end of file diff --git a/screenshots/index.html b/screenshots/index.html index 680aaf8..38225ae 100644 --- a/screenshots/index.html +++ b/screenshots/index.html @@ -1,458 +1,490 @@ - - - + + - - - - - Eclipse SW360 - Screenshots - + + + + - - - - - - + + + + + + + + + + - +Screenshots | Eclipse SW360 + + + + + - + - - - + + + + + + + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - + - + + +
    + + + + +
    +
    +
    + - -
    -
    -
    - -
    -
    -
    -
    -

    Eclipse SW360 - Screenshots

    -
    -
    -
    -
    - - -
    - - -
    - -
    - -
    - -
    - - -

    A picture is worth a thousand words

    +
    + + +

    The SW360 application is divided into several sections around managing a catalogue of software components and the software bill-of-material of your software projects, products or services. The menu bar as shown on home screen cover the following main sections.

    - -

    Home

    - +
    +

    Home

    A dashboard listing the components and projects created by the user logged in. With this overview, the own projects and components can be directly accessed.

    + + +
    + + +
    + Card image cap +
    +
    Home
    +

    + +

    +
    +
    +
    -
    - - - - -
    - - -



    -

    Projects

    +
    +

    Project

    +

    As for individual projects, a number of subsections is provided, allowing for managing different aspects of a project: license compliance, export control (ECC), vulnerabilities, locking of attachments for project use, and vulnerabilities. +For each project, a number of attributes can be maintained, most notably external ids, which allow for a mapping to the dataset in SW360 with external systems.

    The main area of work in the projects section. SW360 uses the term project as synonym for products, services, or internal projects. The projects area starts with a listing of all projects which are visible to the user, according to the visibility setting of the project.

    - -


    - - -
    - - - - -
    - - -


    - -

    As for individual projects, a number of subsections is provided, allowing for managing different aspects of a project: license compliance, export control (ECC), vulnerabilities, locking of attachments for project use, and vulnerabilities.

    - -

    For each project, a number of attributes can be maintained, most notably external ids, which allow for a mapping to the dataset in SW360 with external systems.

    - -


    - - -
    - - - - -
    - - -


    -

    For the license compliance, SW360 allows for maintaining a global clearing status for each release of a component. In addition, a clearing status can be set for use at each individual project.

    - -


    - - -
    - - - - -
    - - -


    -

    Not only the clearing status for each use of a release can be captured by SW360. Also, the type of usage (contained, side-by-side installation, etc.) can be saved as attribute.

    + + +
    + + +
    + Card image cap +
    +
    Main area
    +

    +

    +
    +
    +
    -


    - - -
    - - - - -
    + +
    + Card image cap +
    +
    Summary
    +

    +

    +
    +
    +
    -



    -

    Components

    + +
    + Card image cap +
    +
    Clearing Status
    +

    +

    +
    +
    +
    -

    Components in SW360 can have multiple types, such as OSS, commercial component or a service (and more types), since license compliance matters for type of software, not only OSS. Components are in fact a container for releases, because license compliance information and other attributes change between different releases of a component.

    -


    + +
    + Card image cap +
    +
    ECC Clearing Status
    +

    +

    +
    +
    +
    -
    - - - - -
    + +
    + Card image cap +
    +
    Releases and Projects
    +

    +

    +
    +
    +
    -


    +
    +

    Components

    +

    Components in SW360 can have multiple types, such as OSS, commercial component or a service (and more types), since license compliance matters for type of software, not only OSS. Components are in fact a container for releases, because license compliance information and other attributes change between different releases of a component.

    At each release, basic attributes can be stored, some of them are informal, but can give relevant input to usage statistics of software in an organisation.

    + + +
    + + +
    + Card image cap +
    +
    Component
    +

    +

    +
    +
    +
    -


    - - -
    - - - - -
    - - -


    - -

    Of course, when if comes to license clearing, more relevant attributes can be found.

    - -


    - - -
    - - - - -
    - - -



    - -

    Special: Export Control and Customs

    - -

    Once the software bill-of-material has been setup, not only license compliance per component can be checked. But also the export control and customs (ECC) relevant information can be assessed for each project.

    - -


    - - -
    - - - - -
    - - -


    - -

    ECC classifications can be set for each release of a component - SW360 supports a specific role for ECC experts who are the only users which can modify ECC data. Other users can enter ECC data which requires approval by ECC experts with the particular role.

    -


    + +
    + Card image cap +
    +
    Component Edit
    +

    +

    +
    +
    +
    -
    - - - - -
    + +
    + Card image cap +
    +
    Component Clearance
    +

    +

    +
    +
    +
    -



    - +
    +

    SW360 provides an index for all data, thus searching for keywords will yield results for all different datasets, such as projects, components, licenses, etc. Search for terms can be filtered by data set types.

    + + +
    + + +
    + Card image cap +
    +
    Search
    +

    +

    +
    +
    +
    -


    - - -
    - - - - -
    - - -



    - -

    Preferences

    - -


    - -

    The preferences section of SW360 shows the basic user information. In addition, this is the area where users can generate access tokens for the REST API. Access tokens can be configured to have a limited validity or set for only allowing for read access. Once issued access tokens cannot be shown anymore because SW360 stores only a hash. Thus deletion of access tokens requires a designating name for each token.

    - -


    - - -
    - - - - -
    - - -


    - -

    Moreover, in the preferences section, each user can define own notification settings - depending on the user’s needs.

    -


    +
    -
    - - - - -
    +
    -
    -
    +
    +
    + + - - - - - + + + - + - - @@ -465,27 +497,14 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= - - - - - - - - - - - - - + - - + \ No newline at end of file diff --git a/scss/main.css b/scss/main.css new file mode 100644 index 0000000..42d1e55 --- /dev/null +++ b/scss/main.css @@ -0,0 +1,20585 @@ +/* + +Bootstrap variables overrides for theme. +See https://github.com/twbs/bootstrap/pull/23260 +*/ +@import url("https://cdn.jsdelivr.net/gh/rastikerdar/vazir-font@v27.0.1/dist/font-face.css"); +@fa-font-path : "../webfonts"; +/*! + * Bootstrap v4.6.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --blue: #72A1E5; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #BA5A31; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #797676; + --gray-dark: #333; + --primary: #1a3f51; + --secondary: #102129; + --success: #3772FF; + --info: #C0E0DE; + --warning: #ED6A5A; + --danger: #ED6A5A; + --light: #D3F3EE; + --dark: #403F4C; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } + +*, +*::before, +*::after { + box-sizing: border-box; } + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; } + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #222; + text-align: left; + background-color: #fff; } + +[tabindex="-1"]:focus:not(:focus-visible) { + outline: 0 !important; } + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; } + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; } + +p { + margin-top: 0; + margin-bottom: 1rem; } + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none; } + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; } + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; } + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; } + +dt { + font-weight: 700; } + +dd { + margin-bottom: .5rem; + margin-left: 0; } + +blockquote { + margin: 0 0 1rem; } + +b, +strong { + font-weight: bolder; } + +small { + font-size: 80%; } + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; } + +sub { + bottom: -.25em; } + +sup { + top: -.5em; } + +a { + color: #3176d9; + text-decoration: none; + background-color: transparent; } + a:hover { + color: #1e53a0; + text-decoration: none; } + +a:not([href]):not([class]) { + color: inherit; + text-decoration: none; } + a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; } + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; } + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + -ms-overflow-style: scrollbar; } + +figure { + margin: 0 0 1rem; } + +img { + vertical-align: middle; + border-style: none; } + +svg { + overflow: hidden; + vertical-align: middle; } + +table { + border-collapse: collapse; } + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #797676; + text-align: left; + caption-side: bottom; } + +th { + text-align: inherit; + text-align: -webkit-match-parent; } + +label { + display: inline-block; + margin-bottom: 0.5rem; } + +button { + border-radius: 0; } + +button:focus:not(:focus-visible) { + outline: 0; } + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; } + +button, +input { + overflow: visible; } + +button, +select { + text-transform: none; } + +[role="button"] { + cursor: pointer; } + +select { + word-wrap: normal; } + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; } + +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; } + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; } + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; } + +textarea { + overflow: auto; + resize: vertical; } + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; } + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; } + +progress { + vertical-align: baseline; } + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; } + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; } + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; } + +output { + display: inline-block; } + +summary { + display: list-item; + cursor: pointer; } + +template { + display: none; } + +[hidden] { + display: none !important; } + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; } + +h1, .h1 { + font-size: 2.25rem; } + +h2, .h2 { + font-size: 2rem; } + +h3, .h3 { + font-size: 1.5rem; } + +h4, .h4 { + font-size: 1.35rem; } + +h5, .h5 { + font-size: 1.15rem; } + +h6, .h6 { + font-size: 1rem; } + +.lead { + font-size: 1.25rem; + font-weight: 300; } + +.display-1 { + font-size: 3rem; + font-weight: 700; + line-height: 1.2; } + +.display-2 { + font-size: 2.5rem; + font-weight: 700; + line-height: 1.2; } + +.display-3 { + font-size: 2rem; + font-weight: 700; + line-height: 1.2; } + +.display-4 { + font-size: 1.75rem; + font-weight: 700; + line-height: 1.2; } + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); } + +small, +.small { + font-size: 80%; + font-weight: 400; } + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; } + +.list-unstyled { + padding-left: 0; + list-style: none; } + +.list-inline { + padding-left: 0; + list-style: none; } + +.list-inline-item { + display: inline-block; } + .list-inline-item:not(:last-child) { + margin-right: 0.5rem; } + +.initialism { + font-size: 90%; + text-transform: uppercase; } + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; } + +.blockquote-footer { + display: block; + font-size: 80%; + color: #797676; } + .blockquote-footer::before { + content: "\2014\00A0"; } + +.img-fluid, .td-content img { + max-width: 100%; + height: auto; } + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + max-width: 100%; + height: auto; } + +.figure { + display: inline-block; } + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; } + +.figure-caption { + font-size: 90%; + color: #797676; } + +code { + font-size: 87.5%; + color: black; + word-wrap: break-word; } + a > code { + color: inherit; } + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #222; + border-radius: 0.2rem; + box-shadow: inset 0 -0.1rem 0 rgba(0, 0, 0, 0.25); } + kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; + box-shadow: none; } + +pre { + display: block; + font-size: 87.5%; + color: #222; } + pre code { + font-size: inherit; + color: inherit; + word-break: normal; } + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; } + +.container, +.container-fluid, +.container-xl, +.container-lg, +.container-md, +.container-sm { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + +@media (min-width: 576px) { + .container-sm, .container { + max-width: 540px; } } + +@media (min-width: 768px) { + .container-md, .container-sm, .container { + max-width: 720px; } } + +@media (min-width: 992px) { + .container-lg, .container-md, .container-sm, .container { + max-width: 960px; } } + +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1140px; } } + +.row { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; } + +.no-gutters { + margin-right: 0; + margin-left: 0; } + .no-gutters > .col, + .no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; } + +.col-xl, +.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg, +.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md, +.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm, +.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col, +.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; } + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + +.row-cols-1 > * { + flex: 0 0 100%; + max-width: 100%; } + +.row-cols-2 > * { + flex: 0 0 50%; + max-width: 50%; } + +.row-cols-3 > * { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; } + +.row-cols-4 > * { + flex: 0 0 25%; + max-width: 25%; } + +.row-cols-5 > * { + flex: 0 0 20%; + max-width: 20%; } + +.row-cols-6 > * { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; } + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + +.col-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; } + +.col-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; } + +.col-3 { + flex: 0 0 25%; + max-width: 25%; } + +.col-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; } + +.col-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; } + +.col-6 { + flex: 0 0 50%; + max-width: 50%; } + +.col-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; } + +.col-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; } + +.col-9 { + flex: 0 0 75%; + max-width: 75%; } + +.col-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; } + +.col-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; } + +.col-12 { + flex: 0 0 100%; + max-width: 100%; } + +.order-first { + order: -1; } + +.order-last { + order: 13; } + +.order-0 { + order: 0; } + +.order-1 { + order: 1; } + +.order-2 { + order: 2; } + +.order-3 { + order: 3; } + +.order-4 { + order: 4; } + +.order-5 { + order: 5; } + +.order-6 { + order: 6; } + +.order-7 { + order: 7; } + +.order-8 { + order: 8; } + +.order-9 { + order: 9; } + +.order-10 { + order: 10; } + +.order-11 { + order: 11; } + +.order-12 { + order: 12; } + +.offset-1 { + margin-left: 8.33333333%; } + +.offset-2 { + margin-left: 16.66666667%; } + +.offset-3 { + margin-left: 25%; } + +.offset-4 { + margin-left: 33.33333333%; } + +.offset-5 { + margin-left: 41.66666667%; } + +.offset-6 { + margin-left: 50%; } + +.offset-7 { + margin-left: 58.33333333%; } + +.offset-8 { + margin-left: 66.66666667%; } + +.offset-9 { + margin-left: 75%; } + +.offset-10 { + margin-left: 83.33333333%; } + +.offset-11 { + margin-left: 91.66666667%; } + +@media (min-width: 576px) { + .col-sm { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + .row-cols-sm-1 > * { + flex: 0 0 100%; + max-width: 100%; } + .row-cols-sm-2 > * { + flex: 0 0 50%; + max-width: 50%; } + .row-cols-sm-3 > * { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; } + .row-cols-sm-4 > * { + flex: 0 0 25%; + max-width: 25%; } + .row-cols-sm-5 > * { + flex: 0 0 20%; + max-width: 20%; } + .row-cols-sm-6 > * { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + .col-sm-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; } + .col-sm-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; } + .col-sm-3 { + flex: 0 0 25%; + max-width: 25%; } + .col-sm-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; } + .col-sm-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; } + .col-sm-6 { + flex: 0 0 50%; + max-width: 50%; } + .col-sm-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; } + .col-sm-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; } + .col-sm-9 { + flex: 0 0 75%; + max-width: 75%; } + .col-sm-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; } + .col-sm-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; } + .col-sm-12 { + flex: 0 0 100%; + max-width: 100%; } + .order-sm-first { + order: -1; } + .order-sm-last { + order: 13; } + .order-sm-0 { + order: 0; } + .order-sm-1 { + order: 1; } + .order-sm-2 { + order: 2; } + .order-sm-3 { + order: 3; } + .order-sm-4 { + order: 4; } + .order-sm-5 { + order: 5; } + .order-sm-6 { + order: 6; } + .order-sm-7 { + order: 7; } + .order-sm-8 { + order: 8; } + .order-sm-9 { + order: 9; } + .order-sm-10 { + order: 10; } + .order-sm-11 { + order: 11; } + .order-sm-12 { + order: 12; } + .offset-sm-0 { + margin-left: 0; } + .offset-sm-1 { + margin-left: 8.33333333%; } + .offset-sm-2 { + margin-left: 16.66666667%; } + .offset-sm-3 { + margin-left: 25%; } + .offset-sm-4 { + margin-left: 33.33333333%; } + .offset-sm-5 { + margin-left: 41.66666667%; } + .offset-sm-6 { + margin-left: 50%; } + .offset-sm-7 { + margin-left: 58.33333333%; } + .offset-sm-8 { + margin-left: 66.66666667%; } + .offset-sm-9 { + margin-left: 75%; } + .offset-sm-10 { + margin-left: 83.33333333%; } + .offset-sm-11 { + margin-left: 91.66666667%; } } + +@media (min-width: 768px) { + .col-md { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + .row-cols-md-1 > * { + flex: 0 0 100%; + max-width: 100%; } + .row-cols-md-2 > * { + flex: 0 0 50%; + max-width: 50%; } + .row-cols-md-3 > * { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; } + .row-cols-md-4 > * { + flex: 0 0 25%; + max-width: 25%; } + .row-cols-md-5 > * { + flex: 0 0 20%; + max-width: 20%; } + .row-cols-md-6 > * { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; } + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + .col-md-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; } + .col-md-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; } + .col-md-3 { + flex: 0 0 25%; + max-width: 25%; } + .col-md-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; } + .col-md-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; } + .col-md-6 { + flex: 0 0 50%; + max-width: 50%; } + .col-md-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; } + .col-md-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; } + .col-md-9 { + flex: 0 0 75%; + max-width: 75%; } + .col-md-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; } + .col-md-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; } + .col-md-12 { + flex: 0 0 100%; + max-width: 100%; } + .order-md-first { + order: -1; } + .order-md-last { + order: 13; } + .order-md-0 { + order: 0; } + .order-md-1 { + order: 1; } + .order-md-2 { + order: 2; } + .order-md-3 { + order: 3; } + .order-md-4 { + order: 4; } + .order-md-5 { + order: 5; } + .order-md-6 { + order: 6; } + .order-md-7 { + order: 7; } + .order-md-8 { + order: 8; } + .order-md-9 { + order: 9; } + .order-md-10 { + order: 10; } + .order-md-11 { + order: 11; } + .order-md-12 { + order: 12; } + .offset-md-0 { + margin-left: 0; } + .offset-md-1 { + margin-left: 8.33333333%; } + .offset-md-2 { + margin-left: 16.66666667%; } + .offset-md-3 { + margin-left: 25%; } + .offset-md-4 { + margin-left: 33.33333333%; } + .offset-md-5 { + margin-left: 41.66666667%; } + .offset-md-6 { + margin-left: 50%; } + .offset-md-7 { + margin-left: 58.33333333%; } + .offset-md-8 { + margin-left: 66.66666667%; } + .offset-md-9 { + margin-left: 75%; } + .offset-md-10 { + margin-left: 83.33333333%; } + .offset-md-11 { + margin-left: 91.66666667%; } } + +@media (min-width: 992px) { + .col-lg { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + .row-cols-lg-1 > * { + flex: 0 0 100%; + max-width: 100%; } + .row-cols-lg-2 > * { + flex: 0 0 50%; + max-width: 50%; } + .row-cols-lg-3 > * { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; } + .row-cols-lg-4 > * { + flex: 0 0 25%; + max-width: 25%; } + .row-cols-lg-5 > * { + flex: 0 0 20%; + max-width: 20%; } + .row-cols-lg-6 > * { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + .col-lg-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; } + .col-lg-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; } + .col-lg-3 { + flex: 0 0 25%; + max-width: 25%; } + .col-lg-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; } + .col-lg-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; } + .col-lg-6 { + flex: 0 0 50%; + max-width: 50%; } + .col-lg-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; } + .col-lg-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; } + .col-lg-9 { + flex: 0 0 75%; + max-width: 75%; } + .col-lg-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; } + .col-lg-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; } + .col-lg-12 { + flex: 0 0 100%; + max-width: 100%; } + .order-lg-first { + order: -1; } + .order-lg-last { + order: 13; } + .order-lg-0 { + order: 0; } + .order-lg-1 { + order: 1; } + .order-lg-2 { + order: 2; } + .order-lg-3 { + order: 3; } + .order-lg-4 { + order: 4; } + .order-lg-5 { + order: 5; } + .order-lg-6 { + order: 6; } + .order-lg-7 { + order: 7; } + .order-lg-8 { + order: 8; } + .order-lg-9 { + order: 9; } + .order-lg-10 { + order: 10; } + .order-lg-11 { + order: 11; } + .order-lg-12 { + order: 12; } + .offset-lg-0 { + margin-left: 0; } + .offset-lg-1 { + margin-left: 8.33333333%; } + .offset-lg-2 { + margin-left: 16.66666667%; } + .offset-lg-3 { + margin-left: 25%; } + .offset-lg-4 { + margin-left: 33.33333333%; } + .offset-lg-5 { + margin-left: 41.66666667%; } + .offset-lg-6 { + margin-left: 50%; } + .offset-lg-7 { + margin-left: 58.33333333%; } + .offset-lg-8 { + margin-left: 66.66666667%; } + .offset-lg-9 { + margin-left: 75%; } + .offset-lg-10 { + margin-left: 83.33333333%; } + .offset-lg-11 { + margin-left: 91.66666667%; } } + +@media (min-width: 1200px) { + .col-xl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + .row-cols-xl-1 > * { + flex: 0 0 100%; + max-width: 100%; } + .row-cols-xl-2 > * { + flex: 0 0 50%; + max-width: 50%; } + .row-cols-xl-3 > * { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; } + .row-cols-xl-4 > * { + flex: 0 0 25%; + max-width: 25%; } + .row-cols-xl-5 > * { + flex: 0 0 20%; + max-width: 20%; } + .row-cols-xl-6 > * { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + .col-xl-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; } + .col-xl-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; } + .col-xl-3 { + flex: 0 0 25%; + max-width: 25%; } + .col-xl-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; } + .col-xl-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; } + .col-xl-6 { + flex: 0 0 50%; + max-width: 50%; } + .col-xl-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; } + .col-xl-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; } + .col-xl-9 { + flex: 0 0 75%; + max-width: 75%; } + .col-xl-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; } + .col-xl-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; } + .col-xl-12 { + flex: 0 0 100%; + max-width: 100%; } + .order-xl-first { + order: -1; } + .order-xl-last { + order: 13; } + .order-xl-0 { + order: 0; } + .order-xl-1 { + order: 1; } + .order-xl-2 { + order: 2; } + .order-xl-3 { + order: 3; } + .order-xl-4 { + order: 4; } + .order-xl-5 { + order: 5; } + .order-xl-6 { + order: 6; } + .order-xl-7 { + order: 7; } + .order-xl-8 { + order: 8; } + .order-xl-9 { + order: 9; } + .order-xl-10 { + order: 10; } + .order-xl-11 { + order: 11; } + .order-xl-12 { + order: 12; } + .offset-xl-0 { + margin-left: 0; } + .offset-xl-1 { + margin-left: 8.33333333%; } + .offset-xl-2 { + margin-left: 16.66666667%; } + .offset-xl-3 { + margin-left: 25%; } + .offset-xl-4 { + margin-left: 33.33333333%; } + .offset-xl-5 { + margin-left: 41.66666667%; } + .offset-xl-6 { + margin-left: 50%; } + .offset-xl-7 { + margin-left: 58.33333333%; } + .offset-xl-8 { + margin-left: 66.66666667%; } + .offset-xl-9 { + margin-left: 75%; } + .offset-xl-10 { + margin-left: 83.33333333%; } + .offset-xl-11 { + margin-left: 91.66666667%; } } + +.table, .td-content > table, .td-box .row.section > table { + width: 100%; + margin-bottom: 1rem; + color: #222; } + .table th, .td-content > table th, .td-box .row.section > table th, + .table td, + .td-content > table td, + .td-box .row.section > table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #dee2e6; } + .table thead th, .td-content > table thead th, .td-box .row.section > table thead th { + vertical-align: bottom; + border-bottom: 2px solid #dee2e6; } + .table tbody + tbody, .td-content > table tbody + tbody, .td-box .row.section > table tbody + tbody { + border-top: 2px solid #dee2e6; } + +.table-sm th, +.table-sm td { + padding: 0.3rem; } + +.table-bordered { + border: 1px solid #dee2e6; } + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6; } + .table-bordered thead th, + .table-bordered thead td { + border-bottom-width: 2px; } + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; } + +.table-striped tbody tr:nth-of-type(odd), .td-content > table tbody tr:nth-of-type(odd), .td-box .row.section > table tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); } + +.table-hover tbody tr:hover { + color: #222; + background-color: rgba(0, 0, 0, 0.075); } + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #bfc9ce; } + +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #889ba5; } + +.table-hover .table-primary:hover { + background-color: #b1bdc3; } + .table-hover .table-primary:hover > td, + .table-hover .table-primary:hover > th { + background-color: #b1bdc3; } + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #bcc1c3; } + +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #838c90; } + +.table-hover .table-secondary:hover { + background-color: #afb5b7; } + .table-hover .table-secondary:hover > td, + .table-hover .table-secondary:hover > th { + background-color: #afb5b7; } + +.table-success, +.table-success > th, +.table-success > td { + background-color: #c7d8ff; } + +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #97b6ff; } + +.table-hover .table-success:hover { + background-color: #aec6ff; } + .table-hover .table-success:hover > td, + .table-hover .table-success:hover > th { + background-color: #aec6ff; } + +.table-info, +.table-info > th, +.table-info > td { + background-color: #edf6f6; } + +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #deefee; } + +.table-hover .table-info:hover { + background-color: #dceeee; } + .table-hover .table-info:hover > td, + .table-hover .table-info:hover > th { + background-color: #dceeee; } + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #fad5d1; } + +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #f6b2a9; } + +.table-hover .table-warning:hover { + background-color: #f8c0ba; } + .table-hover .table-warning:hover > td, + .table-hover .table-warning:hover > th { + background-color: #f8c0ba; } + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #fad5d1; } + +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #f6b2a9; } + +.table-hover .table-danger:hover { + background-color: #f8c0ba; } + .table-hover .table-danger:hover > td, + .table-hover .table-danger:hover > th { + background-color: #f8c0ba; } + +.table-light, +.table-light > th, +.table-light > td { + background-color: #f3fcfa; } + +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #e8f9f6; } + +.table-hover .table-light:hover { + background-color: #dff7f2; } + .table-hover .table-light:hover > td, + .table-hover .table-light:hover > th { + background-color: #dff7f2; } + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #cac9cd; } + +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #9c9ba2; } + +.table-hover .table-dark:hover { + background-color: #bdbcc1; } + .table-hover .table-dark:hover > td, + .table-hover .table-dark:hover > th { + background-color: #bdbcc1; } + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); } + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); } + .table-hover .table-active:hover > td, + .table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); } + +.table .thead-dark th, .td-content > table .thead-dark th, .td-box .row.section > table .thead-dark th { + color: #fff; + background-color: #333; + border-color: #464646; } + +.table .thead-light th, .td-content > table .thead-light th, .td-box .row.section > table .thead-light th { + color: #495057; + background-color: #eee; + border-color: #dee2e6; } + +.table-dark { + color: #fff; + background-color: #333; } + .table-dark th, + .table-dark td, + .table-dark thead th { + border-color: #464646; } + .table-dark.table-bordered { + border: 0; } + .table-dark.table-striped tbody tr:nth-of-type(odd), .td-content > table.table-dark tbody tr:nth-of-type(odd), .td-box .row.section > table.table-dark tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); } + .table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, 0.075); } + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-sm > .table-bordered { + border: 0; } } + +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-md > .table-bordered { + border: 0; } } + +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-lg > .table-bordered { + border: 0; } } + +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-xl > .table-bordered { + border: 0; } } + +.table-responsive, .td-content > table, .td-box .row.section > table { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive > .table-bordered, .td-content > table > .table-bordered, .td-box .row.section > table > .table-bordered { + border: 0; } + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border-radius: 0.25rem; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; } } + .form-control::-ms-expand { + background-color: transparent; + border: 0; } + .form-control:focus { + color: #495057; + background-color: #fff; + border-color: #398ab2; + outline: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(26, 63, 81, 0.25); } + .form-control::placeholder { + color: #797676; + opacity: 1; } + .form-control:disabled, .form-control[readonly] { + background-color: #eee; + opacity: 1; } + +input[type="date"].form-control, +input[type="time"].form-control, +input[type="datetime-local"].form-control, +input[type="month"].form-control { + appearance: none; } + +select.form-control:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; } + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff; } + +.form-control-file, +.form-control-range { + display: block; + width: 100%; } + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; } + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; } + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; } + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + font-size: 1rem; + line-height: 1.5; + color: #222; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; } + .form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; } + +.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; } + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; } + +select.form-control[size], select.form-control[multiple] { + height: auto; } + +textarea.form-control { + height: auto; } + +.form-group { + margin-bottom: 1rem; } + +.form-text { + display: block; + margin-top: 0.25rem; } + +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; } + .form-row > .col, + .form-row > [class*="col-"] { + padding-right: 5px; + padding-left: 5px; } + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; } + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; } + .form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + color: #797676; } + +.form-check-label { + margin-bottom: 0; } + +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; } + .form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; } + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #3772FF; } + +.valid-tooltip { + position: absolute; + top: 100%; + left: 0; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(55, 114, 255, 0.9); + border-radius: 0.25rem; } + .form-row > .col > .valid-tooltip, .form-row > [class*="col-"] > .valid-tooltip { + left: 5px; } + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #3772FF; + padding-right: calc(1.5em + 0.75rem) !important; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%233772FF' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #3772FF; + box-shadow: 0 0 0 0.2rem rgba(55, 114, 255, 0.25); } + +.was-validated select.form-control:valid, select.form-control.is-valid { + padding-right: 3rem !important; + background-position: right 1.5rem center; } + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #3772FF; + padding-right: calc(0.75em + 2.3125rem) !important; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%233772FF' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat; } + .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #3772FF; + box-shadow: 0 0 0 0.2rem rgba(55, 114, 255, 0.25); } + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #3772FF; } + +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #3772FF; } + .was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #3772FF; } + +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #6a96ff; + background: #6a96ff linear-gradient(180deg, #80a6ff, #6a96ff) repeat-x; } + +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(55, 114, 255, 0.25); } + +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #3772FF; } + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #3772FF; } + +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #3772FF; + box-shadow: 0 0 0 0.2rem rgba(55, 114, 255, 0.25); } + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #ED6A5A; } + +.invalid-tooltip { + position: absolute; + top: 100%; + left: 0; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(237, 106, 90, 0.9); + border-radius: 0.25rem; } + .form-row > .col > .invalid-tooltip, .form-row > [class*="col-"] > .invalid-tooltip { + left: 5px; } + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #ED6A5A; + padding-right: calc(1.5em + 0.75rem) !important; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23ED6A5A' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ED6A5A' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #ED6A5A; + box-shadow: 0 0 0 0.2rem rgba(237, 106, 90, 0.25); } + +.was-validated select.form-control:invalid, select.form-control.is-invalid { + padding-right: 3rem !important; + background-position: right 1.5rem center; } + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #ED6A5A; + padding-right: calc(0.75em + 2.3125rem) !important; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23ED6A5A' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ED6A5A' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat; } + .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #ED6A5A; + box-shadow: 0 0 0 0.2rem rgba(237, 106, 90, 0.25); } + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #ED6A5A; } + +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #ED6A5A; } + .was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #ED6A5A; } + +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #f29488; + background: #f29488 linear-gradient(180deg, #f4a49a, #f29488) repeat-x; } + +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(237, 106, 90, 0.25); } + +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #ED6A5A; } + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #ED6A5A; } + +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #ED6A5A; + box-shadow: 0 0 0 0.2rem rgba(237, 106, 90, 0.25); } + +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center; } + .form-inline .form-check { + width: 100%; } + @media (min-width: 576px) { + .form-inline label { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 0; } + .form-inline .form-group { + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: 0; } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; } + .form-inline .form-control-plaintext { + display: inline-block; } + .form-inline .input-group, + .form-inline .custom-select { + width: auto; } + .form-inline .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0; } + .form-inline .form-check-input { + position: relative; + flex-shrink: 0; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; } + .form-inline .custom-control { + align-items: center; + justify-content: center; } + .form-inline .custom-control-label { + margin-bottom: 0; } } +.btn { + display: inline-block; + font-weight: 400; + color: #222; + text-align: center; + vertical-align: middle; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .btn { + transition: none; } } + .btn:hover { + color: #222; + text-decoration: none; } + .btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(26, 63, 81, 0.25); } + .btn.disabled, .btn:disabled { + opacity: 0.65; + box-shadow: none; } + .btn:not(:disabled):not(.disabled) { + cursor: pointer; } + .btn:not(:disabled):not(.disabled):active, .btn:not(:disabled):not(.disabled).active { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } + .btn:not(:disabled):not(.disabled):active:focus, .btn:not(:disabled):not(.disabled).active:focus { + box-shadow: 0 0 0 0.2rem rgba(26, 63, 81, 0.25), inset 0 3px 5px rgba(0, 0, 0, 0.125); } + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; } + +.btn-primary { + color: #fff; + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x; + border-color: #1a3f51; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } + .btn-primary:hover { + color: #fff; + background: #112834 linear-gradient(180deg, #344952, #112834) repeat-x; + border-color: #0e212a; } + .btn-primary:focus, .btn-primary.focus { + color: #fff; + background: #112834 linear-gradient(180deg, #344952, #112834) repeat-x; + border-color: #0e212a; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(60, 92, 107, 0.5); } + .btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #1a3f51; + border-color: #1a3f51; + background-image: none; } + .btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0e212a; + background-image: none; + border-color: #0b1921; } + .btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(60, 92, 107, 0.5); } + +.btn-secondary { + color: #fff; + background: #102129 linear-gradient(180deg, #344249, #102129) repeat-x; + border-color: #102129; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } + .btn-secondary:hover { + color: #fff; + background: #050b0d linear-gradient(180deg, #2b2f32, #050b0d) repeat-x; + border-color: #020304; } + .btn-secondary:focus, .btn-secondary.focus { + color: #fff; + background: #050b0d linear-gradient(180deg, #2b2f32, #050b0d) repeat-x; + border-color: #020304; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(52, 66, 73, 0.5); } + .btn-secondary.disabled, .btn-secondary:disabled { + color: #fff; + background-color: #102129; + border-color: #102129; + background-image: none; } + .btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #020304; + background-image: none; + border-color: black; } + .btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(52, 66, 73, 0.5); } + +.btn-success { + color: #fff; + background: #3772FF linear-gradient(180deg, #5587ff, #3772FF) repeat-x; + border-color: #3772FF; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } + .btn-success:hover { + color: #fff; + background: #1157ff linear-gradient(180deg, #3470ff, #1157ff) repeat-x; + border-color: #044eff; } + .btn-success:focus, .btn-success.focus { + color: #fff; + background: #1157ff linear-gradient(180deg, #3470ff, #1157ff) repeat-x; + border-color: #044eff; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(85, 135, 255, 0.5); } + .btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #3772FF; + border-color: #3772FF; + background-image: none; } + .btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #044eff; + background-image: none; + border-color: #0049f6; } + .btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(85, 135, 255, 0.5); } + +.btn-info { + color: #222; + background: #C0E0DE linear-gradient(180deg, #c9e5e3, #C0E0DE) repeat-x; + border-color: #C0E0DE; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } + .btn-info:hover { + color: #fff; + background: #a6d3d1 linear-gradient(180deg, #b4dad8, #a6d3d1) repeat-x; + border-color: #9ecfcc; } + .btn-info:focus, .btn-info.focus { + color: #fff; + background: #a6d3d1 linear-gradient(180deg, #b4dad8, #a6d3d1) repeat-x; + border-color: #9ecfcc; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(168, 196, 194, 0.5); } + .btn-info.disabled, .btn-info:disabled { + color: #222; + background-color: #C0E0DE; + border-color: #C0E0DE; + background-image: none; } + .btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #9ecfcc; + background-image: none; + border-color: #95cbc8; } + .btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(168, 196, 194, 0.5); } + +.btn-warning { + color: #fff; + background: #ED6A5A linear-gradient(180deg, #f08073, #ED6A5A) repeat-x; + border-color: #ED6A5A; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } + .btn-warning:hover { + color: #fff; + background: #e94b38 linear-gradient(180deg, #ed6655, #e94b38) repeat-x; + border-color: #e8402c; } + .btn-warning:focus, .btn-warning.focus { + color: #fff; + background: #e94b38 linear-gradient(180deg, #ed6655, #e94b38) repeat-x; + border-color: #e8402c; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(240, 128, 115, 0.5); } + .btn-warning.disabled, .btn-warning:disabled { + color: #fff; + background-color: #ED6A5A; + border-color: #ED6A5A; + background-image: none; } + .btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #e8402c; + background-image: none; + border-color: #e73621; } + .btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(240, 128, 115, 0.5); } + +.btn-danger { + color: #fff; + background: #ED6A5A linear-gradient(180deg, #f08073, #ED6A5A) repeat-x; + border-color: #ED6A5A; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } + .btn-danger:hover { + color: #fff; + background: #e94b38 linear-gradient(180deg, #ed6655, #e94b38) repeat-x; + border-color: #e8402c; } + .btn-danger:focus, .btn-danger.focus { + color: #fff; + background: #e94b38 linear-gradient(180deg, #ed6655, #e94b38) repeat-x; + border-color: #e8402c; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(240, 128, 115, 0.5); } + .btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #ED6A5A; + border-color: #ED6A5A; + background-image: none; } + .btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #e8402c; + background-image: none; + border-color: #e73621; } + .btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(240, 128, 115, 0.5); } + +.btn-light { + color: #222; + background: #D3F3EE linear-gradient(180deg, #daf5f1, #D3F3EE) repeat-x; + border-color: #D3F3EE; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } + .btn-light:hover { + color: #222; + background: #b5ebe2 linear-gradient(180deg, #c0eee7, #b5ebe2) repeat-x; + border-color: #abe8df; } + .btn-light:focus, .btn-light.focus { + color: #222; + background: #b5ebe2 linear-gradient(180deg, #c0eee7, #b5ebe2) repeat-x; + border-color: #abe8df; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(184, 212, 207, 0.5); } + .btn-light.disabled, .btn-light:disabled { + color: #222; + background-color: #D3F3EE; + border-color: #D3F3EE; + background-image: none; } + .btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle { + color: #222; + background-color: #abe8df; + background-image: none; + border-color: #a1e5db; } + .btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(184, 212, 207, 0.5); } + +.btn-dark { + color: #fff; + background: #403F4C linear-gradient(180deg, #5d5c67, #403F4C) repeat-x; + border-color: #403F4C; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } + .btn-dark:hover { + color: #fff; + background: #2e2e37 linear-gradient(180deg, #4e4d55, #2e2e37) repeat-x; + border-color: #292830; } + .btn-dark:focus, .btn-dark.focus { + color: #fff; + background: #2e2e37 linear-gradient(180deg, #4e4d55, #2e2e37) repeat-x; + border-color: #292830; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(93, 92, 103, 0.5); } + .btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #403F4C; + border-color: #403F4C; + background-image: none; } + .btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #292830; + background-image: none; + border-color: #232229; } + .btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(93, 92, 103, 0.5); } + +.btn-outline-primary { + color: #1a3f51; + border-color: #1a3f51; } + .btn-outline-primary:hover { + color: #fff; + background-color: #1a3f51; + border-color: #1a3f51; } + .btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(26, 63, 81, 0.5); } + .btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #1a3f51; + background-color: transparent; } + .btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #1a3f51; + border-color: #1a3f51; } + .btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(26, 63, 81, 0.5); } + +.btn-outline-secondary { + color: #102129; + border-color: #102129; } + .btn-outline-secondary:hover { + color: #fff; + background-color: #102129; + border-color: #102129; } + .btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(16, 33, 41, 0.5); } + .btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #102129; + background-color: transparent; } + .btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #102129; + border-color: #102129; } + .btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(16, 33, 41, 0.5); } + +.btn-outline-success { + color: #3772FF; + border-color: #3772FF; } + .btn-outline-success:hover { + color: #fff; + background-color: #3772FF; + border-color: #3772FF; } + .btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(55, 114, 255, 0.5); } + .btn-outline-success.disabled, .btn-outline-success:disabled { + color: #3772FF; + background-color: transparent; } + .btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #3772FF; + border-color: #3772FF; } + .btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(55, 114, 255, 0.5); } + +.btn-outline-info { + color: #C0E0DE; + border-color: #C0E0DE; } + .btn-outline-info:hover { + color: #222; + background-color: #C0E0DE; + border-color: #C0E0DE; } + .btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(192, 224, 222, 0.5); } + .btn-outline-info.disabled, .btn-outline-info:disabled { + color: #C0E0DE; + background-color: transparent; } + .btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { + color: #222; + background-color: #C0E0DE; + border-color: #C0E0DE; } + .btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(192, 224, 222, 0.5); } + +.btn-outline-warning { + color: #ED6A5A; + border-color: #ED6A5A; } + .btn-outline-warning:hover { + color: #fff; + background-color: #ED6A5A; + border-color: #ED6A5A; } + .btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(237, 106, 90, 0.5); } + .btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ED6A5A; + background-color: transparent; } + .btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle { + color: #fff; + background-color: #ED6A5A; + border-color: #ED6A5A; } + .btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(237, 106, 90, 0.5); } + +.btn-outline-danger { + color: #ED6A5A; + border-color: #ED6A5A; } + .btn-outline-danger:hover { + color: #fff; + background-color: #ED6A5A; + border-color: #ED6A5A; } + .btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(237, 106, 90, 0.5); } + .btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #ED6A5A; + background-color: transparent; } + .btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #ED6A5A; + border-color: #ED6A5A; } + .btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(237, 106, 90, 0.5); } + +.btn-outline-light { + color: #D3F3EE; + border-color: #D3F3EE; } + .btn-outline-light:hover { + color: #222; + background-color: #D3F3EE; + border-color: #D3F3EE; } + .btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(211, 243, 238, 0.5); } + .btn-outline-light.disabled, .btn-outline-light:disabled { + color: #D3F3EE; + background-color: transparent; } + .btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle { + color: #222; + background-color: #D3F3EE; + border-color: #D3F3EE; } + .btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(211, 243, 238, 0.5); } + +.btn-outline-dark { + color: #403F4C; + border-color: #403F4C; } + .btn-outline-dark:hover { + color: #fff; + background-color: #403F4C; + border-color: #403F4C; } + .btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(64, 63, 76, 0.5); } + .btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #403F4C; + background-color: transparent; } + .btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #403F4C; + border-color: #403F4C; } + .btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(64, 63, 76, 0.5); } + +.btn-link { + font-weight: 400; + color: #3176d9; + text-decoration: none; } + .btn-link:hover { + color: #1e53a0; + text-decoration: none; } + .btn-link:focus, .btn-link.focus { + text-decoration: none; } + .btn-link:disabled, .btn-link.disabled { + color: #797676; + pointer-events: none; } + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; } + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; } + +.btn-block { + display: block; + width: 100%; } + .btn-block + .btn-block { + margin-top: 0.5rem; } + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; } + +.fade { + transition: opacity 0.15s linear; } + @media (prefers-reduced-motion: reduce) { + .fade { + transition: none; } } + .fade:not(.show) { + opacity: 0; } + +.collapse:not(.show) { + display: none; } + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; } + @media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; } } +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; } + +.dropdown-toggle { + white-space: nowrap; } + .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; } + .dropdown-toggle:empty::after { + margin-left: 0; } + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #222; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.175); } + +.dropdown-menu-left { + right: auto; + left: 0; } + +.dropdown-menu-right { + right: 0; + left: auto; } + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; } + .dropdown-menu-sm-right { + right: 0; + left: auto; } } + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; } + .dropdown-menu-md-right { + right: 0; + left: auto; } } + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; } + .dropdown-menu-lg-right { + right: 0; + left: auto; } } + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; } + .dropdown-menu-xl-right { + right: 0; + left: auto; } } + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; } + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; } + +.dropup .dropdown-toggle:empty::after { + margin-left: 0; } + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; } + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; } + +.dropright .dropdown-toggle:empty::after { + margin-left: 0; } + +.dropright .dropdown-toggle::after { + vertical-align: 0; } + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; } + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; } + +.dropleft .dropdown-toggle::after { + display: none; } + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; } + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; } + +.dropleft .dropdown-toggle::before { + vertical-align: 0; } + +.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { + right: auto; + bottom: auto; } + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #eee; } + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #222; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; } + .dropdown-item:hover, .dropdown-item:focus { + color: #151515; + text-decoration: none; + background: #eee linear-gradient(180deg, #f1f1f1, #eee) repeat-x; } + .dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x; } + .dropdown-item.disabled, .dropdown-item:disabled { + color: #adb5bd; + pointer-events: none; + background-color: transparent; + background-image: none; } + +.dropdown-menu.show { + display: block; } + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #797676; + white-space: nowrap; } + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #222; } + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; } + .btn-group > .btn, + .btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; } + .btn-group > .btn:hover, + .btn-group-vertical > .btn:hover { + z-index: 1; } + .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, + .btn-group-vertical > .btn:focus, + .btn-group-vertical > .btn:active, + .btn-group-vertical > .btn.active { + z-index: 1; } + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .btn-toolbar .input-group { + width: auto; } + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; } + +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; } + .dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after { + margin-left: 0; } + .dropleft .dropdown-toggle-split::before { + margin-right: 0; } + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; } + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; } + +.btn-group.show .dropdown-toggle { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } + .btn-group.show .dropdown-toggle.btn-link { + box-shadow: none; } + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; } + .btn-group-vertical > .btn, + .btn-group-vertical > .btn-group { + width: 100%; } + .btn-group-vertical > .btn:not(:first-child), + .btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; } + .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), + .btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .btn-group-vertical > .btn:not(:first-child), + .btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; } + .btn-group-toggle > .btn input[type="radio"], + .btn-group-toggle > .btn input[type="checkbox"], + .btn-group-toggle > .btn-group > .btn input[type="radio"], + .btn-group-toggle > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; } + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; } + .input-group > .form-control, + .input-group > .form-control-plaintext, + .input-group > .custom-select, + .input-group > .custom-file { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; + margin-bottom: 0; } + .input-group > .form-control + .form-control, + .input-group > .form-control + .custom-select, + .input-group > .form-control + .custom-file, + .input-group > .form-control-plaintext + .form-control, + .input-group > .form-control-plaintext + .custom-select, + .input-group > .form-control-plaintext + .custom-file, + .input-group > .custom-select + .form-control, + .input-group > .custom-select + .custom-select, + .input-group > .custom-select + .custom-file, + .input-group > .custom-file + .form-control, + .input-group > .custom-file + .custom-select, + .input-group > .custom-file + .custom-file { + margin-left: -1px; } + .input-group > .form-control:focus, + .input-group > .custom-select:focus, + .input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; } + .input-group > .custom-file .custom-file-input:focus { + z-index: 4; } + .input-group > .form-control:not(:first-child), + .input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .input-group > .custom-file { + display: flex; + align-items: center; } + .input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .input-group:not(.has-validation) > .form-control:not(:last-child), + .input-group:not(.has-validation) > .custom-select:not(:last-child), + .input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label, + .input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .input-group.has-validation > .form-control:nth-last-child(n + 3), + .input-group.has-validation > .custom-select:nth-last-child(n + 3), + .input-group.has-validation > .custom-file:nth-last-child(n + 3) .custom-file-label, + .input-group.has-validation > .custom-file:nth-last-child(n + 3) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.input-group-prepend, +.input-group-append { + display: flex; } + .input-group-prepend .btn, + .input-group-append .btn { + position: relative; + z-index: 2; } + .input-group-prepend .btn:focus, + .input-group-append .btn:focus { + z-index: 3; } + .input-group-prepend .btn + .btn, + .input-group-prepend .btn + .input-group-text, + .input-group-prepend .input-group-text + .input-group-text, + .input-group-prepend .input-group-text + .btn, + .input-group-append .btn + .btn, + .input-group-append .btn + .input-group-text, + .input-group-append .input-group-text + .input-group-text, + .input-group-append .input-group-text + .btn { + margin-left: -1px; } + +.input-group-prepend { + margin-right: -1px; } + +.input-group-append { + margin-left: -1px; } + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + text-align: center; + white-space: nowrap; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 0.25rem; } + .input-group-text input[type="radio"], + .input-group-text input[type="checkbox"] { + margin-top: 0; } + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); } + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; } + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); } + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; } + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; } + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn, +.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text, +.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .btn, +.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.custom-control { + position: relative; + z-index: 1; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; + color-adjust: exact; } + +.custom-control-inline { + display: inline-flex; + margin-right: 1rem; } + +.custom-control-input { + position: absolute; + left: 0; + z-index: -1; + width: 1rem; + height: 1.25rem; + opacity: 0; } + .custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + border-color: #1a3f51; + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x; + box-shadow:; } + .custom-control-input:focus ~ .custom-control-label::before { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(26, 63, 81, 0.25); } + .custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #398ab2; } + .custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #fff; + background-color: #55a3c8; + border-color: #55a3c8; + box-shadow:; } + .custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label { + color: #797676; } + .custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before { + background-color: #eee; } + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; } + .custom-control-label::before { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #fff; + border: #adb5bd solid 1px; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .custom-control-label::after { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background: 50% / 50% 50% no-repeat; } + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; } + +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e"); } + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #1a3f51; + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x; + box-shadow:; } + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); } + +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background: rgba(26, 63, 81, 0.5) linear-gradient(180deg, rgba(105, 129, 141, 0.575), rgba(26, 63, 81, 0.5)) repeat-x; } + +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background: rgba(26, 63, 81, 0.5) linear-gradient(180deg, rgba(105, 129, 141, 0.575), rgba(26, 63, 81, 0.5)) repeat-x; } + +.custom-radio .custom-control-label::before { + border-radius: 50%; } + +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); } + +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background: rgba(26, 63, 81, 0.5) linear-gradient(180deg, rgba(105, 129, 141, 0.575), rgba(26, 63, 81, 0.5)) repeat-x; } + +.custom-switch { + padding-left: 2.25rem; } + .custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; } + .custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #adb5bd; + border-radius: 0.5rem; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; } } + .custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + transform: translateX(0.75rem); } + .custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background: rgba(26, 63, 81, 0.5) linear-gradient(180deg, rgba(105, 129, 141, 0.575), rgba(26, 63, 81, 0.5)) repeat-x; } + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat; + border: 1px solid #ccc; + border-radius: 0.25rem; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + appearance: none; } + .custom-select:focus { + border-color: #398ab2; + outline: 0; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(26, 63, 81, 0.25); } + .custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; } + .custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; } + .custom-select:disabled { + color: #797676; + background-color: #eee; } + .custom-select::-ms-expand { + display: none; } + .custom-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; } + +.custom-select-sm { + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; } + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; } + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin-bottom: 0; } + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin: 0; + overflow: hidden; + opacity: 0; } + .custom-file-input:focus ~ .custom-file-label { + border-color: #398ab2; + box-shadow: 0 0 0 0.2rem rgba(26, 63, 81, 0.25); } + .custom-file-input[disabled] ~ .custom-file-label, .custom-file-input:disabled ~ .custom-file-label { + background-color: #eee; } + .custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; } + .custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); } + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + overflow: hidden; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 0.25rem; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + 0.75rem); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + content: "Browse"; + background: #eee linear-gradient(180deg, #f1f1f1, #eee) repeat-x; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; } + +.custom-range { + width: 100%; + height: 1.4rem; + padding: 0; + background-color: transparent; + appearance: none; } + .custom-range:focus { + outline: 0; } + .custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(26, 63, 81, 0.25); } + .custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(26, 63, 81, 0.25); } + .custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(26, 63, 81, 0.25); } + .custom-range::-moz-focus-outer { + border: 0; } + .custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x; + border: 0; + border-radius: 1rem; + box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1); + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; } + @media (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none; } } + .custom-range::-webkit-slider-thumb:active { + background: #55a3c8 linear-gradient(180deg, #6fb1d1, #55a3c8) repeat-x; } + .custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; + box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1); } + .custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x; + border: 0; + border-radius: 1rem; + box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1); + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; } + @media (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none; } } + .custom-range::-moz-range-thumb:active { + background: #55a3c8 linear-gradient(180deg, #6fb1d1, #55a3c8) repeat-x; } + .custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; + box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1); } + .custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x; + border: 0; + border-radius: 1rem; + box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1); + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; } + @media (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none; } } + .custom-range::-ms-thumb:active { + background: #55a3c8 linear-gradient(180deg, #6fb1d1, #55a3c8) repeat-x; } + .custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; + box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1); } + .custom-range::-ms-fill-lower { + background-color: #dee2e6; + border-radius: 1rem; } + .custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; + border-radius: 1rem; } + .custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; } + .custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; } + .custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd; } + .custom-range:disabled::-moz-range-track { + cursor: default; } + .custom-range:disabled::-ms-thumb { + background-color: #adb5bd; } + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + transition: none; } } +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; } + +.nav-link { + display: block; + padding: 0.5rem 1rem; } + .nav-link:hover, .nav-link:focus { + text-decoration: none; } + .nav-link.disabled { + color: #797676; + pointer-events: none; + cursor: default; } + +.nav-tabs { + border-bottom: 1px solid #dee2e6; } + .nav-tabs .nav-link { + margin-bottom: -1px; + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + .nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #eee #eee #dee2e6; } + .nav-tabs .nav-link.disabled { + color: #797676; + background-color: transparent; + border-color: transparent; } + .nav-tabs .nav-link.active, + .nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; } + .nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.nav-pills .nav-link { + border-radius: 0.25rem; } + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #1a3f51; } + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; } + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; } + +.tab-content > .tab-pane { + display: none; } + +.tab-content > .active { + display: block; } + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 0.5rem 1rem; } + .navbar .container, + .navbar .container-fluid, + .navbar .container-sm, + .navbar .container-md, + .navbar .container-lg, + .navbar .container-xl { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; } + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; } + .navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; } + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; } + .navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; } + .navbar-nav .dropdown-menu { + position: static; + float: none; } + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; } + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; } + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; } + .navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; } + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: 50% / 100% 100% no-repeat; } + +.navbar-nav-scroll { + max-height: 75vh; + overflow-y: auto; } + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid, + .navbar-expand-sm > .container-sm, + .navbar-expand-sm > .container-md, + .navbar-expand-sm > .container-lg, + .navbar-expand-sm > .container-xl { + padding-right: 0; + padding-left: 0; } } + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand-sm .navbar-nav { + flex-direction: row; } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid, + .navbar-expand-sm > .container-sm, + .navbar-expand-sm > .container-md, + .navbar-expand-sm > .container-lg, + .navbar-expand-sm > .container-xl { + flex-wrap: nowrap; } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand-sm .navbar-toggler { + display: none; } } + +@media (max-width: 767.98px) { + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid, + .navbar-expand-md > .container-sm, + .navbar-expand-md > .container-md, + .navbar-expand-md > .container-lg, + .navbar-expand-md > .container-xl { + padding-right: 0; + padding-left: 0; } } + +@media (min-width: 768px) { + .navbar-expand-md { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand-md .navbar-nav { + flex-direction: row; } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid, + .navbar-expand-md > .container-sm, + .navbar-expand-md > .container-md, + .navbar-expand-md > .container-lg, + .navbar-expand-md > .container-xl { + flex-wrap: nowrap; } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand-md .navbar-toggler { + display: none; } } + +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid, + .navbar-expand-lg > .container-sm, + .navbar-expand-lg > .container-md, + .navbar-expand-lg > .container-lg, + .navbar-expand-lg > .container-xl { + padding-right: 0; + padding-left: 0; } } + +@media (min-width: 992px) { + .navbar-expand-lg { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand-lg .navbar-nav { + flex-direction: row; } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid, + .navbar-expand-lg > .container-sm, + .navbar-expand-lg > .container-md, + .navbar-expand-lg > .container-lg, + .navbar-expand-lg > .container-xl { + flex-wrap: nowrap; } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand-lg .navbar-toggler { + display: none; } } + +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid, + .navbar-expand-xl > .container-sm, + .navbar-expand-xl > .container-md, + .navbar-expand-xl > .container-lg, + .navbar-expand-xl > .container-xl { + padding-right: 0; + padding-left: 0; } } + +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand-xl .navbar-nav { + flex-direction: row; } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid, + .navbar-expand-xl > .container-sm, + .navbar-expand-xl > .container-md, + .navbar-expand-xl > .container-lg, + .navbar-expand-xl > .container-xl { + flex-wrap: nowrap; } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand-xl .navbar-toggler { + display: none; } } + +.navbar-expand { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand > .container, + .navbar-expand > .container-fluid, + .navbar-expand > .container-sm, + .navbar-expand > .container-md, + .navbar-expand > .container-lg, + .navbar-expand > .container-xl { + padding-right: 0; + padding-left: 0; } + .navbar-expand .navbar-nav { + flex-direction: row; } + .navbar-expand .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand > .container, + .navbar-expand > .container-fluid, + .navbar-expand > .container-sm, + .navbar-expand > .container-md, + .navbar-expand > .container-lg, + .navbar-expand > .container-xl { + flex-wrap: nowrap; } + .navbar-expand .navbar-nav-scroll { + overflow: visible; } + .navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand .navbar-toggler { + display: none; } + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); } + .navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); } + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); } + .navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); } + .navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); } + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); } + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); } + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); } + .navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); } + .navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); } + +.navbar-dark .navbar-brand { + color: #fff; } + .navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; } + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.75); } + .navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.5); } + .navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); } + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; } + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.75); + border-color: rgba(255, 255, 255, 0.1); } + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.75); } + .navbar-dark .navbar-text a { + color: #fff; } + .navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #fff; } + +.card, .td-content .highlight { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; } + .card > hr, .td-content .highlight > hr { + margin-right: 0; + margin-left: 0; } + .card > .list-group, .td-content .highlight > .list-group { + border-top: inherit; + border-bottom: inherit; } + .card > .list-group:first-child, .td-content .highlight > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); } + .card > .list-group:last-child, .td-content .highlight > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); } + .card > .card-header + .list-group, .td-content .highlight > .card-header + .list-group, + .card > .list-group + .card-footer, + .td-content .highlight > .list-group + .card-footer { + border-top: 0; } + +.card-body { + flex: 1 1 auto; + min-height: 1px; + padding: 1.25rem; } + +.card-title { + margin-bottom: 0.75rem; } + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; } + +.card-text:last-child { + margin-bottom: 0; } + +.card-link:hover { + text-decoration: none; } + +.card-link + .card-link { + margin-left: 1.25rem; } + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); } + .card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; } + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); } + .card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); } + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; } + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; } + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; + border-radius: calc(0.25rem - 1px); } + +.card-img, +.card-img-top, +.card-img-bottom { + flex-shrink: 0; + width: 100%; } + +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); } + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); } + +.card-deck .card, .card-deck .td-content .highlight, .td-content .card-deck .highlight { + margin-bottom: 15px; } + +@media (min-width: 576px) { + .card-deck { + display: flex; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; } + .card-deck .card, .card-deck .td-content .highlight, .td-content .card-deck .highlight { + flex: 1 0 0%; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; } } + +.card-group > .card, .td-content .card-group > .highlight { + margin-bottom: 15px; } + +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; } + .card-group > .card, .td-content .card-group > .highlight { + flex: 1 0 0%; + margin-bottom: 0; } + .card-group > .card + .card, .td-content .card-group > .highlight + .card, .td-content .card-group > .card + .highlight, .td-content .card-group > .highlight + .highlight { + margin-left: 0; + border-left: 0; } + .card-group > .card:not(:last-child), .td-content .card-group > .highlight:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .card-group > .card:not(:last-child) .card-img-top, .td-content .card-group > .highlight:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header, + .td-content .card-group > .highlight:not(:last-child) .card-header { + border-top-right-radius: 0; } + .card-group > .card:not(:last-child) .card-img-bottom, .td-content .card-group > .highlight:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer, + .td-content .card-group > .highlight:not(:last-child) .card-footer { + border-bottom-right-radius: 0; } + .card-group > .card:not(:first-child), .td-content .card-group > .highlight:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .card-group > .card:not(:first-child) .card-img-top, .td-content .card-group > .highlight:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header, + .td-content .card-group > .highlight:not(:first-child) .card-header { + border-top-left-radius: 0; } + .card-group > .card:not(:first-child) .card-img-bottom, .td-content .card-group > .highlight:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer, + .td-content .card-group > .highlight:not(:first-child) .card-footer { + border-bottom-left-radius: 0; } } + +.card-columns .card, .card-columns .td-content .highlight, .td-content .card-columns .highlight { + margin-bottom: 0.75rem; } + +@media (min-width: 576px) { + .card-columns { + column-count: 3; + column-gap: 1.25rem; + orphans: 1; + widows: 1; } + .card-columns .card, .card-columns .td-content .highlight, .td-content .card-columns .highlight { + display: inline-block; + width: 100%; } } + +.accordion { + overflow-anchor: none; } + .accordion > .card, .td-content .accordion > .highlight { + overflow: hidden; } + .accordion > .card:not(:last-of-type), .td-content .accordion > .highlight:not(:last-of-type) { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .accordion > .card:not(:first-of-type), .td-content .accordion > .highlight:not(:first-of-type) { + border-top-left-radius: 0; + border-top-right-radius: 0; } + .accordion > .card > .card-header, .td-content .accordion > .highlight > .card-header { + border-radius: 0; + margin-bottom: -1px; } + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #eee; + border-radius: 0.25rem; } + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; } + .breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: 0.5rem; + color: #797676; + content: "/"; } + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; } + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; } + +.breadcrumb-item.active { + color: #797676; } + +.pagination { + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; } + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #797676; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.1); } + .page-link:hover { + z-index: 2; + color: #1e53a0; + text-decoration: none; + background-color: #eee; + border-color: #dee2e6; } + .page-link:focus { + z-index: 3; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(26, 63, 81, 0.25); } + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } + +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; } + +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #1a3f51; + border-color: #14303e; } + +.page-item.disabled .page-link { + color: #dee2e6; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6; } + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; } + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; } + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; } + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; } + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; } + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; } + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .badge { + transition: none; } } + a.badge:hover, a.badge:focus { + text-decoration: none; } + .badge:empty { + display: none; } + +.btn .badge { + position: relative; + top: -1px; } + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; } + +.badge-primary { + color: #fff; + background-color: #1a3f51; } + a.badge-primary:hover, a.badge-primary:focus { + color: #fff; + background-color: #0e212a; } + a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(26, 63, 81, 0.5); } + +.badge-secondary { + color: #fff; + background-color: #102129; } + a.badge-secondary:hover, a.badge-secondary:focus { + color: #fff; + background-color: #020304; } + a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(16, 33, 41, 0.5); } + +.badge-success { + color: #fff; + background-color: #3772FF; } + a.badge-success:hover, a.badge-success:focus { + color: #fff; + background-color: #044eff; } + a.badge-success:focus, a.badge-success.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(55, 114, 255, 0.5); } + +.badge-info { + color: #222; + background-color: #C0E0DE; } + a.badge-info:hover, a.badge-info:focus { + color: #222; + background-color: #9ecfcc; } + a.badge-info:focus, a.badge-info.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(192, 224, 222, 0.5); } + +.badge-warning { + color: #fff; + background-color: #ED6A5A; } + a.badge-warning:hover, a.badge-warning:focus { + color: #fff; + background-color: #e8402c; } + a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(237, 106, 90, 0.5); } + +.badge-danger { + color: #fff; + background-color: #ED6A5A; } + a.badge-danger:hover, a.badge-danger:focus { + color: #fff; + background-color: #e8402c; } + a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(237, 106, 90, 0.5); } + +.badge-light { + color: #222; + background-color: #D3F3EE; } + a.badge-light:hover, a.badge-light:focus { + color: #222; + background-color: #abe8df; } + a.badge-light:focus, a.badge-light.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(211, 243, 238, 0.5); } + +.badge-dark { + color: #fff; + background-color: #403F4C; } + a.badge-dark:hover, a.badge-dark:focus { + color: #fff; + background-color: #292830; } + a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(64, 63, 76, 0.5); } + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #eee; + border-radius: 0.3rem; } + @media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; } } +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; } + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; } + +.alert-heading { + color: inherit; } + +.alert-link { + font-weight: 700; } + +.alert-dismissible { + padding-right: 4rem; } + .alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 0.75rem 1.25rem; + color: inherit; } + +.alert-primary { + color: #0e212a; + background: #d1d9dc linear-gradient(180deg, #d8dfe1, #d1d9dc) repeat-x; + border-color: #bfc9ce; } + .alert-primary hr { + border-top-color: #b1bdc3; } + .alert-primary .alert-link { + color: #010304; } + +.alert-secondary { + color: #081115; + background: #cfd3d4 linear-gradient(180deg, #d6dada, #cfd3d4) repeat-x; + border-color: #bcc1c3; } + .alert-secondary hr { + border-top-color: #afb5b7; } + .alert-secondary .alert-link { + color: black; } + +.alert-success { + color: #1d3b85; + background: #d7e3ff linear-gradient(180deg, #dde7ff, #d7e3ff) repeat-x; + border-color: #c7d8ff; } + .alert-success hr { + border-top-color: #aec6ff; } + .alert-success .alert-link { + color: #14285b; } + +.alert-info { + color: #647473; + background: #f2f9f8 linear-gradient(180deg, #f4faf9, #f2f9f8) repeat-x; + border-color: #edf6f6; } + .alert-info hr { + border-top-color: #dceeee; } + .alert-info .alert-link { + color: #4c5958; } + +.alert-warning { + color: #7b372f; + background: #fbe1de linear-gradient(180deg, #fce6e3, #fbe1de) repeat-x; + border-color: #fad5d1; } + .alert-warning hr { + border-top-color: #f8c0ba; } + .alert-warning .alert-link { + color: #562721; } + +.alert-danger { + color: #7b372f; + background: #fbe1de linear-gradient(180deg, #fce6e3, #fbe1de) repeat-x; + border-color: #fad5d1; } + .alert-danger hr { + border-top-color: #f8c0ba; } + .alert-danger .alert-link { + color: #562721; } + +.alert-light { + color: #6e7e7c; + background: #f6fdfc linear-gradient(180deg, #f7fdfc, #f6fdfc) repeat-x; + border-color: #f3fcfa; } + .alert-light hr { + border-top-color: #dff7f2; } + .alert-light .alert-link { + color: #566361; } + +.alert-dark { + color: #212128; + background: #d9d9db linear-gradient(180deg, #dfdfe0, #d9d9db) repeat-x; + border-color: #cac9cd; } + .alert-dark hr { + border-top-color: #bdbcc1; } + .alert-dark .alert-link { + color: #0a0a0c; } + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; } + to { + background-position: 0 0; } } + +.progress { + display: flex; + height: 1rem; + overflow: hidden; + line-height: 0; + font-size: 0.75rem; + background-color: #eee; + border-radius: 0.25rem; + box-shadow: inset 0 0.1rem 0.1rem rgba(0, 0, 0, 0.1); } + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #1a3f51; + transition: width 0.6s ease; } + @media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; } } +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; } + +.progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes; } + @media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; } } +.media { + display: flex; + align-items: flex-start; } + +.media-body { + flex: 1; } + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: 0.25rem; } + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; } + .list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; } + .list-group-item-action:active { + color: #222; + background-color: #eee; } + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); } + .list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; } + .list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; } + .list-group-item.disabled, .list-group-item:disabled { + color: #797676; + pointer-events: none; + background-color: #fff; } + .list-group-item.active { + z-index: 2; + color: #fff; + background-color: #1a3f51; + border-color: #1a3f51; } + .list-group-item + .list-group-item { + border-top-width: 0; } + .list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; } + +.list-group-horizontal { + flex-direction: row; } + .list-group-horizontal > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal > .list-group-item.active { + margin-top: 0; } + .list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; } + .list-group-horizontal-sm > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-sm > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } } + +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; } + .list-group-horizontal-md > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-md > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } } + +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; } + .list-group-horizontal-lg > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-lg > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } } + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; } + .list-group-horizontal-xl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-xl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } } + +.list-group-flush { + border-radius: 0; } + .list-group-flush > .list-group-item { + border-width: 0 0 1px; } + .list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; } + +.list-group-item-primary { + color: #0e212a; + background-color: #bfc9ce; } + .list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #0e212a; + background-color: #b1bdc3; } + .list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #0e212a; + border-color: #0e212a; } + +.list-group-item-secondary { + color: #081115; + background-color: #bcc1c3; } + .list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #081115; + background-color: #afb5b7; } + .list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #081115; + border-color: #081115; } + +.list-group-item-success { + color: #1d3b85; + background-color: #c7d8ff; } + .list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #1d3b85; + background-color: #aec6ff; } + .list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #1d3b85; + border-color: #1d3b85; } + +.list-group-item-info { + color: #647473; + background-color: #edf6f6; } + .list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #647473; + background-color: #dceeee; } + .list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #647473; + border-color: #647473; } + +.list-group-item-warning { + color: #7b372f; + background-color: #fad5d1; } + .list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #7b372f; + background-color: #f8c0ba; } + .list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #7b372f; + border-color: #7b372f; } + +.list-group-item-danger { + color: #7b372f; + background-color: #fad5d1; } + .list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #7b372f; + background-color: #f8c0ba; } + .list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #7b372f; + border-color: #7b372f; } + +.list-group-item-light { + color: #6e7e7c; + background-color: #f3fcfa; } + .list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #6e7e7c; + background-color: #dff7f2; } + .list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #6e7e7c; + border-color: #6e7e7c; } + +.list-group-item-dark { + color: #212128; + background-color: #cac9cd; } + .list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #212128; + background-color: #bdbcc1; } + .list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #212128; + border-color: #212128; } + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; } + .close:hover { + color: #000; + text-decoration: none; } + .close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; } + +button.close { + padding: 0; + background-color: transparent; + border: 0; } + +a.close.disabled { + pointer-events: none; } + +.toast { + flex-basis: 350px; + max-width: 350px; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + opacity: 0; + border-radius: 0.25rem; } + .toast:not(:last-child) { + margin-bottom: 0.75rem; } + .toast.showing { + opacity: 1; } + .toast.show { + display: block; + opacity: 1; } + .toast.hide { + display: none; } + +.toast-header { + display: flex; + align-items: center; + padding: 0.25rem 0.75rem; + color: #797676; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); } + +.toast-body { + padding: 0.75rem; } + +.modal-open { + overflow: hidden; } + .modal-open .modal { + overflow-x: hidden; + overflow-y: auto; } + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; } + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; } + .modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); } + @media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; } } + .modal.show .modal-dialog { + transform: none; } + .modal.modal-static .modal-dialog { + transform: scale(1.02); } + +.modal-dialog-scrollable { + display: flex; + max-height: calc(100% - 1rem); } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; } + .modal-dialog-scrollable .modal-header, + .modal-dialog-scrollable .modal-footer { + flex-shrink: 0; } + .modal-dialog-scrollable .modal-body { + overflow-y: auto; } + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - 1rem); } + .modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + height: min-content; + content: ""; } + .modal-dialog-centered.modal-dialog-scrollable { + flex-direction: column; + justify-content: center; + height: 100%; } + .modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; } + .modal-dialog-centered.modal-dialog-scrollable::before { + content: none; } + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + box-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.5); + outline: 0; } + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; } + .modal-backdrop.fade { + opacity: 0; } + .modal-backdrop.show { + opacity: 0.5; } + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); } + .modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; } + +.modal-title { + margin-bottom: 0; + line-height: 1.5; } + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; } + +.modal-footer { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: 0.75rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: calc(0.3rem - 1px); + border-bottom-left-radius: calc(0.3rem - 1px); } + .modal-footer > * { + margin: 0.25rem; } + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; } + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; } + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); } + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); } + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem); + height: min-content; } + .modal-content { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.5); } + .modal-sm { + max-width: 300px; } } + +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 800px; } } + +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; } } + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; } + .tooltip.show { + opacity: 0.9; } + .tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; } + .tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; } + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0; } + .bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0; } + .bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; } + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem; } + .bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; } + .bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; } + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0; } + .bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0; } + .bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; } + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem; } + .bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; } + .bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; } + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; } + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + box-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.2); } + .popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; } + .popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; } + +.bs-popover-top, .bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem; } + .bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { + bottom: calc(-0.5rem - 1px); } + .bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); } + .bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; } + +.bs-popover-right, .bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem; } + .bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { + left: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; } + .bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); } + .bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; } + +.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem; } + .bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { + top: calc(-0.5rem - 1px); } + .bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); } + .bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; } + .bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; } + +.bs-popover-left, .bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem; } + .bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { + right: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; } + .bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); } + .bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; } + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); } + .popover-header:empty { + display: none; } + +.popover-body { + padding: 0.5rem 0.75rem; + color: #222; } + +.carousel { + position: relative; } + +.carousel.pointer-event { + touch-action: pan-y; } + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; } + .carousel-inner::after { + display: block; + clear: both; + content: ""; } + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; } } +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; } + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + transform: translateX(100%); } + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + transform: translateX(-100%); } + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; } + +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; } + +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; } + @media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + transition: none; } } +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; } + @media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; } } + .carousel-control-prev:hover, .carousel-control-prev:focus, + .carousel-control-next:hover, + .carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; } + +.carousel-control-prev { + left: 0; + background-image: linear-gradient(90deg, rgba(0, 0, 0, 0.25), rgba(0, 0, 0, 0.001)); } + +.carousel-control-next { + right: 0; + background-image: linear-gradient(270deg, rgba(0, 0, 0, 0.25), rgba(0, 0, 0, 0.001)); } + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: 50% / 100% 100% no-repeat; } + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e"); } + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e"); } + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: flex; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; } + .carousel-indicators li { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity 0.6s ease; } + @media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; } } + .carousel-indicators .active { + opacity: 1; } + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; } + +@keyframes spinner-border { + to { + transform: rotate(360deg); } } + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: .75s linear infinite spinner-border; } + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; } + +@keyframes spinner-grow { + 0% { + transform: scale(0); } + 50% { + opacity: 1; + transform: none; } } + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + animation: .75s linear infinite spinner-grow; } + +.spinner-grow-sm { + width: 1rem; + height: 1rem; } + +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + animation-duration: 1.5s; } } + +.align-baseline { + vertical-align: baseline !important; } + +.align-top { + vertical-align: top !important; } + +.align-middle { + vertical-align: middle !important; } + +.align-bottom { + vertical-align: bottom !important; } + +.align-text-bottom { + vertical-align: text-bottom !important; } + +.align-text-top { + vertical-align: text-top !important; } + +.bg-primary { + background-color: #1a3f51 !important; } + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #0e212a !important; } + +.bg-secondary { + background-color: #102129 !important; } + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #020304 !important; } + +.bg-success { + background-color: #3772FF !important; } + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #044eff !important; } + +.bg-info { + background-color: #C0E0DE !important; } + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #9ecfcc !important; } + +.bg-warning { + background-color: #ED6A5A !important; } + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #e8402c !important; } + +.bg-danger { + background-color: #ED6A5A !important; } + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #e8402c !important; } + +.bg-light { + background-color: #D3F3EE !important; } + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #abe8df !important; } + +.bg-dark { + background-color: #403F4C !important; } + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #292830 !important; } + +.bg-gradient-primary { + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x !important; } + +.bg-gradient-secondary { + background: #102129 linear-gradient(180deg, #344249, #102129) repeat-x !important; } + +.bg-gradient-success { + background: #3772FF linear-gradient(180deg, #5587ff, #3772FF) repeat-x !important; } + +.bg-gradient-info { + background: #C0E0DE linear-gradient(180deg, #c9e5e3, #C0E0DE) repeat-x !important; } + +.bg-gradient-warning { + background: #ED6A5A linear-gradient(180deg, #f08073, #ED6A5A) repeat-x !important; } + +.bg-gradient-danger { + background: #ED6A5A linear-gradient(180deg, #f08073, #ED6A5A) repeat-x !important; } + +.bg-gradient-light { + background: #D3F3EE linear-gradient(180deg, #daf5f1, #D3F3EE) repeat-x !important; } + +.bg-gradient-dark { + background: #403F4C linear-gradient(180deg, #5d5c67, #403F4C) repeat-x !important; } + +.bg-white { + background-color: #fff !important; } + +.bg-transparent { + background-color: transparent !important; } + +.border { + border: 1px solid #dee2e6 !important; } + +.border-top { + border-top: 1px solid #dee2e6 !important; } + +.border-right { + border-right: 1px solid #dee2e6 !important; } + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; } + +.border-left { + border-left: 1px solid #dee2e6 !important; } + +.border-0 { + border: 0 !important; } + +.border-top-0 { + border-top: 0 !important; } + +.border-right-0 { + border-right: 0 !important; } + +.border-bottom-0 { + border-bottom: 0 !important; } + +.border-left-0 { + border-left: 0 !important; } + +.border-primary { + border-color: #1a3f51 !important; } + +.border-secondary { + border-color: #102129 !important; } + +.border-success { + border-color: #3772FF !important; } + +.border-info { + border-color: #C0E0DE !important; } + +.border-warning { + border-color: #ED6A5A !important; } + +.border-danger { + border-color: #ED6A5A !important; } + +.border-light { + border-color: #D3F3EE !important; } + +.border-dark { + border-color: #403F4C !important; } + +.border-white { + border-color: #fff !important; } + +.rounded-sm { + border-radius: 0.2rem !important; } + +.rounded { + border-radius: 0.25rem !important; } + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; } + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; } + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; } + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; } + +.rounded-lg { + border-radius: 0.3rem !important; } + +.rounded-circle { + border-radius: 50% !important; } + +.rounded-pill { + border-radius: 50rem !important; } + +.rounded-0 { + border-radius: 0 !important; } + +.clearfix::after { + display: block; + clear: both; + content: ""; } + +.d-none { + display: none !important; } + +.d-inline { + display: inline !important; } + +.d-inline-block { + display: inline-block !important; } + +.d-block { + display: block !important; } + +.d-table { + display: table !important; } + +.d-table-row { + display: table-row !important; } + +.d-table-cell { + display: table-cell !important; } + +.d-flex { + display: flex !important; } + +.d-inline-flex { + display: inline-flex !important; } + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; } + .d-sm-inline { + display: inline !important; } + .d-sm-inline-block { + display: inline-block !important; } + .d-sm-block { + display: block !important; } + .d-sm-table { + display: table !important; } + .d-sm-table-row { + display: table-row !important; } + .d-sm-table-cell { + display: table-cell !important; } + .d-sm-flex { + display: flex !important; } + .d-sm-inline-flex { + display: inline-flex !important; } } + +@media (min-width: 768px) { + .d-md-none { + display: none !important; } + .d-md-inline { + display: inline !important; } + .d-md-inline-block { + display: inline-block !important; } + .d-md-block { + display: block !important; } + .d-md-table { + display: table !important; } + .d-md-table-row { + display: table-row !important; } + .d-md-table-cell { + display: table-cell !important; } + .d-md-flex { + display: flex !important; } + .d-md-inline-flex { + display: inline-flex !important; } } + +@media (min-width: 992px) { + .d-lg-none { + display: none !important; } + .d-lg-inline { + display: inline !important; } + .d-lg-inline-block { + display: inline-block !important; } + .d-lg-block { + display: block !important; } + .d-lg-table { + display: table !important; } + .d-lg-table-row { + display: table-row !important; } + .d-lg-table-cell { + display: table-cell !important; } + .d-lg-flex { + display: flex !important; } + .d-lg-inline-flex { + display: inline-flex !important; } } + +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; } + .d-xl-inline { + display: inline !important; } + .d-xl-inline-block { + display: inline-block !important; } + .d-xl-block { + display: block !important; } + .d-xl-table { + display: table !important; } + .d-xl-table-row { + display: table-row !important; } + .d-xl-table-cell { + display: table-cell !important; } + .d-xl-flex { + display: flex !important; } + .d-xl-inline-flex { + display: inline-flex !important; } } + +@media print { + .d-print-none { + display: none !important; } + .d-print-inline { + display: inline !important; } + .d-print-inline-block { + display: inline-block !important; } + .d-print-block { + display: block !important; } + .d-print-table { + display: table !important; } + .d-print-table-row { + display: table-row !important; } + .d-print-table-cell { + display: table-cell !important; } + .d-print-flex { + display: flex !important; } + .d-print-inline-flex { + display: inline-flex !important; } } + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; } + .embed-responsive::before { + display: block; + content: ""; } + .embed-responsive .embed-responsive-item, + .embed-responsive iframe, + .embed-responsive embed, + .embed-responsive object, + .embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; } + +.embed-responsive-21by9::before { + padding-top: 42.85714286%; } + +.embed-responsive-16by9::before { + padding-top: 56.25%; } + +.embed-responsive-4by3::before { + padding-top: 75%; } + +.embed-responsive-1by1::before { + padding-top: 100%; } + +.flex-row { + flex-direction: row !important; } + +.flex-column { + flex-direction: column !important; } + +.flex-row-reverse { + flex-direction: row-reverse !important; } + +.flex-column-reverse { + flex-direction: column-reverse !important; } + +.flex-wrap { + flex-wrap: wrap !important; } + +.flex-nowrap { + flex-wrap: nowrap !important; } + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; } + +.flex-fill { + flex: 1 1 auto !important; } + +.flex-grow-0 { + flex-grow: 0 !important; } + +.flex-grow-1 { + flex-grow: 1 !important; } + +.flex-shrink-0 { + flex-shrink: 0 !important; } + +.flex-shrink-1 { + flex-shrink: 1 !important; } + +.justify-content-start { + justify-content: flex-start !important; } + +.justify-content-end { + justify-content: flex-end !important; } + +.justify-content-center { + justify-content: center !important; } + +.justify-content-between { + justify-content: space-between !important; } + +.justify-content-around { + justify-content: space-around !important; } + +.align-items-start { + align-items: flex-start !important; } + +.align-items-end { + align-items: flex-end !important; } + +.align-items-center { + align-items: center !important; } + +.align-items-baseline { + align-items: baseline !important; } + +.align-items-stretch { + align-items: stretch !important; } + +.align-content-start { + align-content: flex-start !important; } + +.align-content-end { + align-content: flex-end !important; } + +.align-content-center { + align-content: center !important; } + +.align-content-between { + align-content: space-between !important; } + +.align-content-around { + align-content: space-around !important; } + +.align-content-stretch { + align-content: stretch !important; } + +.align-self-auto { + align-self: auto !important; } + +.align-self-start { + align-self: flex-start !important; } + +.align-self-end { + align-self: flex-end !important; } + +.align-self-center { + align-self: center !important; } + +.align-self-baseline { + align-self: baseline !important; } + +.align-self-stretch { + align-self: stretch !important; } + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction: row !important; } + .flex-sm-column { + flex-direction: column !important; } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; } + .flex-sm-wrap { + flex-wrap: wrap !important; } + .flex-sm-nowrap { + flex-wrap: nowrap !important; } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; } + .flex-sm-fill { + flex: 1 1 auto !important; } + .flex-sm-grow-0 { + flex-grow: 0 !important; } + .flex-sm-grow-1 { + flex-grow: 1 !important; } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; } + .justify-content-sm-start { + justify-content: flex-start !important; } + .justify-content-sm-end { + justify-content: flex-end !important; } + .justify-content-sm-center { + justify-content: center !important; } + .justify-content-sm-between { + justify-content: space-between !important; } + .justify-content-sm-around { + justify-content: space-around !important; } + .align-items-sm-start { + align-items: flex-start !important; } + .align-items-sm-end { + align-items: flex-end !important; } + .align-items-sm-center { + align-items: center !important; } + .align-items-sm-baseline { + align-items: baseline !important; } + .align-items-sm-stretch { + align-items: stretch !important; } + .align-content-sm-start { + align-content: flex-start !important; } + .align-content-sm-end { + align-content: flex-end !important; } + .align-content-sm-center { + align-content: center !important; } + .align-content-sm-between { + align-content: space-between !important; } + .align-content-sm-around { + align-content: space-around !important; } + .align-content-sm-stretch { + align-content: stretch !important; } + .align-self-sm-auto { + align-self: auto !important; } + .align-self-sm-start { + align-self: flex-start !important; } + .align-self-sm-end { + align-self: flex-end !important; } + .align-self-sm-center { + align-self: center !important; } + .align-self-sm-baseline { + align-self: baseline !important; } + .align-self-sm-stretch { + align-self: stretch !important; } } + +@media (min-width: 768px) { + .flex-md-row { + flex-direction: row !important; } + .flex-md-column { + flex-direction: column !important; } + .flex-md-row-reverse { + flex-direction: row-reverse !important; } + .flex-md-column-reverse { + flex-direction: column-reverse !important; } + .flex-md-wrap { + flex-wrap: wrap !important; } + .flex-md-nowrap { + flex-wrap: nowrap !important; } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; } + .flex-md-fill { + flex: 1 1 auto !important; } + .flex-md-grow-0 { + flex-grow: 0 !important; } + .flex-md-grow-1 { + flex-grow: 1 !important; } + .flex-md-shrink-0 { + flex-shrink: 0 !important; } + .flex-md-shrink-1 { + flex-shrink: 1 !important; } + .justify-content-md-start { + justify-content: flex-start !important; } + .justify-content-md-end { + justify-content: flex-end !important; } + .justify-content-md-center { + justify-content: center !important; } + .justify-content-md-between { + justify-content: space-between !important; } + .justify-content-md-around { + justify-content: space-around !important; } + .align-items-md-start { + align-items: flex-start !important; } + .align-items-md-end { + align-items: flex-end !important; } + .align-items-md-center { + align-items: center !important; } + .align-items-md-baseline { + align-items: baseline !important; } + .align-items-md-stretch { + align-items: stretch !important; } + .align-content-md-start { + align-content: flex-start !important; } + .align-content-md-end { + align-content: flex-end !important; } + .align-content-md-center { + align-content: center !important; } + .align-content-md-between { + align-content: space-between !important; } + .align-content-md-around { + align-content: space-around !important; } + .align-content-md-stretch { + align-content: stretch !important; } + .align-self-md-auto { + align-self: auto !important; } + .align-self-md-start { + align-self: flex-start !important; } + .align-self-md-end { + align-self: flex-end !important; } + .align-self-md-center { + align-self: center !important; } + .align-self-md-baseline { + align-self: baseline !important; } + .align-self-md-stretch { + align-self: stretch !important; } } + +@media (min-width: 992px) { + .flex-lg-row { + flex-direction: row !important; } + .flex-lg-column { + flex-direction: column !important; } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; } + .flex-lg-wrap { + flex-wrap: wrap !important; } + .flex-lg-nowrap { + flex-wrap: nowrap !important; } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; } + .flex-lg-fill { + flex: 1 1 auto !important; } + .flex-lg-grow-0 { + flex-grow: 0 !important; } + .flex-lg-grow-1 { + flex-grow: 1 !important; } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; } + .justify-content-lg-start { + justify-content: flex-start !important; } + .justify-content-lg-end { + justify-content: flex-end !important; } + .justify-content-lg-center { + justify-content: center !important; } + .justify-content-lg-between { + justify-content: space-between !important; } + .justify-content-lg-around { + justify-content: space-around !important; } + .align-items-lg-start { + align-items: flex-start !important; } + .align-items-lg-end { + align-items: flex-end !important; } + .align-items-lg-center { + align-items: center !important; } + .align-items-lg-baseline { + align-items: baseline !important; } + .align-items-lg-stretch { + align-items: stretch !important; } + .align-content-lg-start { + align-content: flex-start !important; } + .align-content-lg-end { + align-content: flex-end !important; } + .align-content-lg-center { + align-content: center !important; } + .align-content-lg-between { + align-content: space-between !important; } + .align-content-lg-around { + align-content: space-around !important; } + .align-content-lg-stretch { + align-content: stretch !important; } + .align-self-lg-auto { + align-self: auto !important; } + .align-self-lg-start { + align-self: flex-start !important; } + .align-self-lg-end { + align-self: flex-end !important; } + .align-self-lg-center { + align-self: center !important; } + .align-self-lg-baseline { + align-self: baseline !important; } + .align-self-lg-stretch { + align-self: stretch !important; } } + +@media (min-width: 1200px) { + .flex-xl-row { + flex-direction: row !important; } + .flex-xl-column { + flex-direction: column !important; } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; } + .flex-xl-wrap { + flex-wrap: wrap !important; } + .flex-xl-nowrap { + flex-wrap: nowrap !important; } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; } + .flex-xl-fill { + flex: 1 1 auto !important; } + .flex-xl-grow-0 { + flex-grow: 0 !important; } + .flex-xl-grow-1 { + flex-grow: 1 !important; } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; } + .justify-content-xl-start { + justify-content: flex-start !important; } + .justify-content-xl-end { + justify-content: flex-end !important; } + .justify-content-xl-center { + justify-content: center !important; } + .justify-content-xl-between { + justify-content: space-between !important; } + .justify-content-xl-around { + justify-content: space-around !important; } + .align-items-xl-start { + align-items: flex-start !important; } + .align-items-xl-end { + align-items: flex-end !important; } + .align-items-xl-center { + align-items: center !important; } + .align-items-xl-baseline { + align-items: baseline !important; } + .align-items-xl-stretch { + align-items: stretch !important; } + .align-content-xl-start { + align-content: flex-start !important; } + .align-content-xl-end { + align-content: flex-end !important; } + .align-content-xl-center { + align-content: center !important; } + .align-content-xl-between { + align-content: space-between !important; } + .align-content-xl-around { + align-content: space-around !important; } + .align-content-xl-stretch { + align-content: stretch !important; } + .align-self-xl-auto { + align-self: auto !important; } + .align-self-xl-start { + align-self: flex-start !important; } + .align-self-xl-end { + align-self: flex-end !important; } + .align-self-xl-center { + align-self: center !important; } + .align-self-xl-baseline { + align-self: baseline !important; } + .align-self-xl-stretch { + align-self: stretch !important; } } + +.float-left { + float: left !important; } + +.float-right { + float: right !important; } + +.float-none { + float: none !important; } + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; } + .float-sm-right { + float: right !important; } + .float-sm-none { + float: none !important; } } + +@media (min-width: 768px) { + .float-md-left { + float: left !important; } + .float-md-right { + float: right !important; } + .float-md-none { + float: none !important; } } + +@media (min-width: 992px) { + .float-lg-left { + float: left !important; } + .float-lg-right { + float: right !important; } + .float-lg-none { + float: none !important; } } + +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; } + .float-xl-right { + float: right !important; } + .float-xl-none { + float: none !important; } } + +.user-select-all { + user-select: all !important; } + +.user-select-auto { + user-select: auto !important; } + +.user-select-none { + user-select: none !important; } + +.overflow-auto { + overflow: auto !important; } + +.overflow-hidden { + overflow: hidden !important; } + +.position-static { + position: static !important; } + +.position-relative { + position: relative !important; } + +.position-absolute { + position: absolute !important; } + +.position-fixed { + position: fixed !important; } + +.position-sticky { + position: sticky !important; } + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; } + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; } + +@supports (position: sticky) { + .sticky-top { + position: sticky; + top: 0; + z-index: 1020; } } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; } + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; } + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; } + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; } + +.shadow-none { + box-shadow: none !important; } + +.w-25 { + width: 25% !important; } + +.w-50 { + width: 50% !important; } + +.w-75 { + width: 75% !important; } + +.w-100 { + width: 100% !important; } + +.w-auto { + width: auto !important; } + +.h-25 { + height: 25% !important; } + +.h-50 { + height: 50% !important; } + +.h-75 { + height: 75% !important; } + +.h-100 { + height: 100% !important; } + +.h-auto { + height: auto !important; } + +.mw-100 { + max-width: 100% !important; } + +.mh-100 { + max-height: 100% !important; } + +.min-vw-100 { + min-width: 100vw !important; } + +.min-vh-100 { + min-height: 100vh !important; } + +.vw-100 { + width: 100vw !important; } + +.vh-100 { + height: 100vh !important; } + +.m-0 { + margin: 0 !important; } + +.mt-0, +.my-0 { + margin-top: 0 !important; } + +.mr-0, +.mx-0 { + margin-right: 0 !important; } + +.mb-0, +.my-0 { + margin-bottom: 0 !important; } + +.ml-0, +.mx-0 { + margin-left: 0 !important; } + +.m-1 { + margin: 0.25rem !important; } + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; } + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; } + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; } + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; } + +.m-2 { + margin: 0.5rem !important; } + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; } + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; } + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; } + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; } + +.m-3 { + margin: 1rem !important; } + +.mt-3, +.my-3 { + margin-top: 1rem !important; } + +.mr-3, +.mx-3 { + margin-right: 1rem !important; } + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; } + +.ml-3, +.mx-3 { + margin-left: 1rem !important; } + +.m-4 { + margin: 1.5rem !important; } + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; } + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; } + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; } + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; } + +.m-5 { + margin: 3rem !important; } + +.mt-5, +.my-5 { + margin-top: 3rem !important; } + +.mr-5, +.mx-5 { + margin-right: 3rem !important; } + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; } + +.ml-5, +.mx-5 { + margin-left: 3rem !important; } + +.p-0 { + padding: 0 !important; } + +.pt-0, +.py-0 { + padding-top: 0 !important; } + +.pr-0, +.px-0 { + padding-right: 0 !important; } + +.pb-0, +.py-0 { + padding-bottom: 0 !important; } + +.pl-0, +.px-0 { + padding-left: 0 !important; } + +.p-1 { + padding: 0.25rem !important; } + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; } + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; } + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; } + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; } + +.p-2 { + padding: 0.5rem !important; } + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; } + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; } + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; } + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; } + +.p-3 { + padding: 1rem !important; } + +.pt-3, +.py-3 { + padding-top: 1rem !important; } + +.pr-3, +.px-3 { + padding-right: 1rem !important; } + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; } + +.pl-3, +.px-3 { + padding-left: 1rem !important; } + +.p-4 { + padding: 1.5rem !important; } + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; } + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; } + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; } + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; } + +.p-5 { + padding: 3rem !important; } + +.pt-5, +.py-5 { + padding-top: 3rem !important; } + +.pr-5, +.px-5 { + padding-right: 3rem !important; } + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; } + +.pl-5, +.px-5 { + padding-left: 3rem !important; } + +.m-n1 { + margin: -0.25rem !important; } + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; } + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; } + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; } + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; } + +.m-n2 { + margin: -0.5rem !important; } + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; } + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; } + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; } + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; } + +.m-n3 { + margin: -1rem !important; } + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; } + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; } + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; } + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; } + +.m-n4 { + margin: -1.5rem !important; } + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; } + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; } + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; } + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; } + +.m-n5 { + margin: -3rem !important; } + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; } + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; } + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; } + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; } + +.m-auto { + margin: auto !important; } + +.mt-auto, +.my-auto { + margin-top: auto !important; } + +.mr-auto, +.mx-auto { + margin-right: auto !important; } + +.mb-auto, +.my-auto { + margin-bottom: auto !important; } + +.ml-auto, +.mx-auto { + margin-left: auto !important; } + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; } + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; } + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; } + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; } + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; } + .m-sm-1 { + margin: 0.25rem !important; } + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; } + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; } + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; } + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; } + .m-sm-2 { + margin: 0.5rem !important; } + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; } + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; } + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; } + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; } + .m-sm-3 { + margin: 1rem !important; } + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; } + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; } + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; } + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; } + .m-sm-4 { + margin: 1.5rem !important; } + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; } + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; } + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; } + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; } + .m-sm-5 { + margin: 3rem !important; } + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; } + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; } + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; } + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; } + .p-sm-0 { + padding: 0 !important; } + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; } + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; } + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; } + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; } + .p-sm-1 { + padding: 0.25rem !important; } + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; } + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; } + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; } + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; } + .p-sm-2 { + padding: 0.5rem !important; } + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; } + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; } + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; } + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; } + .p-sm-3 { + padding: 1rem !important; } + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; } + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; } + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; } + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; } + .p-sm-4 { + padding: 1.5rem !important; } + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; } + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; } + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; } + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; } + .p-sm-5 { + padding: 3rem !important; } + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; } + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; } + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; } + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; } + .m-sm-n1 { + margin: -0.25rem !important; } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; } + .m-sm-n2 { + margin: -0.5rem !important; } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; } + .m-sm-n3 { + margin: -1rem !important; } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; } + .m-sm-n4 { + margin: -1.5rem !important; } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; } + .m-sm-n5 { + margin: -3rem !important; } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; } + .m-sm-auto { + margin: auto !important; } + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; } + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; } + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; } + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; } } + +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; } + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; } + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; } + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; } + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; } + .m-md-1 { + margin: 0.25rem !important; } + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; } + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; } + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; } + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; } + .m-md-2 { + margin: 0.5rem !important; } + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; } + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; } + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; } + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; } + .m-md-3 { + margin: 1rem !important; } + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; } + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; } + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; } + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; } + .m-md-4 { + margin: 1.5rem !important; } + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; } + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; } + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; } + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; } + .m-md-5 { + margin: 3rem !important; } + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; } + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; } + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; } + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; } + .p-md-0 { + padding: 0 !important; } + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; } + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; } + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; } + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; } + .p-md-1 { + padding: 0.25rem !important; } + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; } + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; } + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; } + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; } + .p-md-2 { + padding: 0.5rem !important; } + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; } + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; } + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; } + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; } + .p-md-3 { + padding: 1rem !important; } + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; } + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; } + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; } + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; } + .p-md-4 { + padding: 1.5rem !important; } + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; } + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; } + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; } + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; } + .p-md-5 { + padding: 3rem !important; } + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; } + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; } + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; } + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; } + .m-md-n1 { + margin: -0.25rem !important; } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; } + .m-md-n2 { + margin: -0.5rem !important; } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; } + .m-md-n3 { + margin: -1rem !important; } + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; } + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; } + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; } + .m-md-n4 { + margin: -1.5rem !important; } + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; } + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; } + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; } + .m-md-n5 { + margin: -3rem !important; } + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; } + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; } + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; } + .m-md-auto { + margin: auto !important; } + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; } + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; } + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; } + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; } } + +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; } + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; } + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; } + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; } + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; } + .m-lg-1 { + margin: 0.25rem !important; } + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; } + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; } + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; } + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; } + .m-lg-2 { + margin: 0.5rem !important; } + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; } + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; } + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; } + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; } + .m-lg-3 { + margin: 1rem !important; } + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; } + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; } + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; } + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; } + .m-lg-4 { + margin: 1.5rem !important; } + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; } + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; } + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; } + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; } + .m-lg-5 { + margin: 3rem !important; } + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; } + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; } + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; } + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; } + .p-lg-0 { + padding: 0 !important; } + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; } + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; } + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; } + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; } + .p-lg-1 { + padding: 0.25rem !important; } + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; } + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; } + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; } + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; } + .p-lg-2 { + padding: 0.5rem !important; } + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; } + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; } + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; } + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; } + .p-lg-3 { + padding: 1rem !important; } + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; } + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; } + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; } + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; } + .p-lg-4 { + padding: 1.5rem !important; } + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; } + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; } + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; } + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; } + .p-lg-5 { + padding: 3rem !important; } + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; } + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; } + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; } + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; } + .m-lg-n1 { + margin: -0.25rem !important; } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; } + .m-lg-n2 { + margin: -0.5rem !important; } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; } + .m-lg-n3 { + margin: -1rem !important; } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; } + .m-lg-n4 { + margin: -1.5rem !important; } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; } + .m-lg-n5 { + margin: -3rem !important; } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; } + .m-lg-auto { + margin: auto !important; } + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; } + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; } + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; } + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; } } + +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; } + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; } + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; } + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; } + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; } + .m-xl-1 { + margin: 0.25rem !important; } + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; } + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; } + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; } + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; } + .m-xl-2 { + margin: 0.5rem !important; } + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; } + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; } + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; } + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; } + .m-xl-3 { + margin: 1rem !important; } + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; } + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; } + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; } + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; } + .m-xl-4 { + margin: 1.5rem !important; } + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; } + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; } + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; } + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; } + .m-xl-5 { + margin: 3rem !important; } + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; } + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; } + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; } + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; } + .p-xl-0 { + padding: 0 !important; } + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; } + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; } + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; } + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; } + .p-xl-1 { + padding: 0.25rem !important; } + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; } + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; } + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; } + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; } + .p-xl-2 { + padding: 0.5rem !important; } + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; } + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; } + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; } + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; } + .p-xl-3 { + padding: 1rem !important; } + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; } + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; } + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; } + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; } + .p-xl-4 { + padding: 1.5rem !important; } + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; } + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; } + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; } + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; } + .p-xl-5 { + padding: 3rem !important; } + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; } + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; } + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; } + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; } + .m-xl-n1 { + margin: -0.25rem !important; } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; } + .m-xl-n2 { + margin: -0.5rem !important; } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; } + .m-xl-n3 { + margin: -1rem !important; } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; } + .m-xl-n4 { + margin: -1.5rem !important; } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; } + .m-xl-n5 { + margin: -3rem !important; } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; } + .m-xl-auto { + margin: auto !important; } + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; } + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; } + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; } + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; } } + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); } + +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; } + +.text-justify { + text-align: justify !important; } + +.text-wrap { + white-space: normal !important; } + +.text-nowrap { + white-space: nowrap !important; } + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + +.text-left { + text-align: left !important; } + +.text-right { + text-align: right !important; } + +.text-center { + text-align: center !important; } + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; } + .text-sm-right { + text-align: right !important; } + .text-sm-center { + text-align: center !important; } } + +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; } + .text-md-right { + text-align: right !important; } + .text-md-center { + text-align: center !important; } } + +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; } + .text-lg-right { + text-align: right !important; } + .text-lg-center { + text-align: center !important; } } + +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; } + .text-xl-right { + text-align: right !important; } + .text-xl-center { + text-align: center !important; } } + +.text-lowercase { + text-transform: lowercase !important; } + +.text-uppercase { + text-transform: uppercase !important; } + +.text-capitalize { + text-transform: capitalize !important; } + +.font-weight-light { + font-weight: 300 !important; } + +.font-weight-lighter { + font-weight: lighter !important; } + +.font-weight-normal { + font-weight: 400 !important; } + +.font-weight-bold { + font-weight: 700 !important; } + +.font-weight-bolder { + font-weight: bolder !important; } + +.font-italic { + font-style: italic !important; } + +.text-white { + color: #fff !important; } + +.text-primary { + color: #1a3f51 !important; } + +a.text-primary:hover, a.text-primary:focus { + color: #071217 !important; } + +.text-secondary { + color: #102129 !important; } + +a.text-secondary:hover, a.text-secondary:focus { + color: black !important; } + +.text-success { + color: #3772FF !important; } + +a.text-success:hover, a.text-success:focus { + color: #0045ea !important; } + +.text-info { + color: #C0E0DE !important; } + +a.text-info:hover, a.text-info:focus { + color: #8dc7c3 !important; } + +.text-warning { + color: #ED6A5A !important; } + +a.text-warning:hover, a.text-warning:focus { + color: #e22f19 !important; } + +.text-danger { + color: #ED6A5A !important; } + +a.text-danger:hover, a.text-danger:focus { + color: #e22f19 !important; } + +.text-light { + color: #D3F3EE !important; } + +a.text-light:hover, a.text-light:focus { + color: #97e3d7 !important; } + +.text-dark { + color: #403F4C !important; } + +a.text-dark:hover, a.text-dark:focus { + color: #1d1c22 !important; } + +.text-body { + color: #222 !important; } + +.text-muted { + color: #797676 !important; } + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; } + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; } + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; } + +.text-decoration-none { + text-decoration: none !important; } + +.text-break { + word-break: break-word !important; + word-wrap: break-word !important; } + +.text-reset { + color: inherit !important; } + +.visible { + visibility: visible !important; } + +.invisible { + visibility: hidden !important; } + +@media print { + *, + *::before, + *::after { + text-shadow: none !important; + box-shadow: none !important; } + a:not(.btn) { + text-decoration: underline; } + abbr[title]::after { + content: " (" attr(title) ")"; } + pre { + white-space: pre-wrap !important; } + pre, + blockquote { + border: 1px solid #adb5bd; + page-break-inside: avoid; } + tr, + img { + page-break-inside: avoid; } + p, + h2, + h3 { + orphans: 3; + widows: 3; } + h2, + h3 { + page-break-after: avoid; } + @page { + size: a3; } + body { + min-width: 992px !important; } + .container { + min-width: 992px !important; } + .navbar { + display: none; } + .badge { + border: 1px solid #000; } + .table, .td-content > table, .td-box .row.section > table { + border-collapse: collapse !important; } + .table td, .td-content > table td, .td-box .row.section > table td, + .table th, + .td-content > table th, + .td-box .row.section > table th { + background-color: #fff !important; } + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6 !important; } + .table-dark { + color: inherit; } + .table-dark th, + .table-dark td, + .table-dark thead th, + .table-dark tbody + tbody { + border-color: #dee2e6; } + .table .thead-dark th, .td-content > table .thead-dark th, .td-box .row.section > table .thead-dark th { + color: inherit; + border-color: #dee2e6; } } + +/*! + * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fad, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; } + +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -.0667em; } + +.fa-xs { + font-size: .75em; } + +.fa-sm { + font-size: .875em; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + animation: fa-spin 1s infinite steps(8); } + +@keyframes fa-spin { + 0% { + transform: rotate(0deg); } + 100% { + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + transform: scale(1, -1); } + +.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical, +:root .fa-flip-both { + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-acquisitions-incorporated:before { + content: "\f6af"; } + +.fa-ad:before { + content: "\f641"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-air-freshener:before { + content: "\f5d0"; } + +.fa-airbnb:before { + content: "\f834"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-allergies:before { + content: "\f461"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angry:before { + content: "\f556"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-ankh:before { + content: "\f644"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-alt:before { + content: "\f5d1"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-archway:before { + content: "\f557"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-artstation:before { + content: "\f77a"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-atlas:before { + content: "\f558"; } + +.fa-atlassian:before { + content: "\f77b"; } + +.fa-atom:before { + content: "\f5d2"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-award:before { + content: "\f559"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-baby:before { + content: "\f77c"; } + +.fa-baby-carriage:before { + content: "\f77d"; } + +.fa-backspace:before { + content: "\f55a"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-bacon:before { + content: "\f7e5"; } + +.fa-bacteria:before { + content: "\e059"; } + +.fa-bacterium:before { + content: "\e05a"; } + +.fa-bahai:before { + content: "\f666"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-balance-scale-left:before { + content: "\f515"; } + +.fa-balance-scale-right:before { + content: "\f516"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-band-aid:before { + content: "\f462"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-baseball-ball:before { + content: "\f433"; } + +.fa-basketball-ball:before { + content: "\f434"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-battle-net:before { + content: "\f835"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bezier-curve:before { + content: "\f55b"; } + +.fa-bible:before { + content: "\f647"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-biking:before { + content: "\f84a"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-biohazard:before { + content: "\f780"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blender:before { + content: "\f517"; } + +.fa-blender-phone:before { + content: "\f6b6"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blog:before { + content: "\f781"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-bone:before { + content: "\f5d7"; } + +.fa-bong:before { + content: "\f55c"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-book-dead:before { + content: "\f6b7"; } + +.fa-book-medical:before { + content: "\f7e6"; } + +.fa-book-open:before { + content: "\f518"; } + +.fa-book-reader:before { + content: "\f5da"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-bootstrap:before { + content: "\f836"; } + +.fa-border-all:before { + content: "\f84c"; } + +.fa-border-none:before { + content: "\f850"; } + +.fa-border-style:before { + content: "\f853"; } + +.fa-bowling-ball:before { + content: "\f436"; } + +.fa-box:before { + content: "\f466"; } + +.fa-box-open:before { + content: "\f49e"; } + +.fa-box-tissue:before { + content: "\e05b"; } + +.fa-boxes:before { + content: "\f468"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-brain:before { + content: "\f5dc"; } + +.fa-bread-slice:before { + content: "\f7ec"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-briefcase-medical:before { + content: "\f469"; } + +.fa-broadcast-tower:before { + content: "\f519"; } + +.fa-broom:before { + content: "\f51a"; } + +.fa-brush:before { + content: "\f55d"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-buffer:before { + content: "\f837"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-burn:before { + content: "\f46a"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-bus-alt:before { + content: "\f55e"; } + +.fa-business-time:before { + content: "\f64a"; } + +.fa-buy-n-large:before { + content: "\f8a6"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-day:before { + content: "\f783"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-calendar-week:before { + content: "\f784"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-campground:before { + content: "\f6bb"; } + +.fa-canadian-maple-leaf:before { + content: "\f785"; } + +.fa-candy-cane:before { + content: "\f786"; } + +.fa-cannabis:before { + content: "\f55f"; } + +.fa-capsules:before { + content: "\f46b"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-car-alt:before { + content: "\f5de"; } + +.fa-car-battery:before { + content: "\f5df"; } + +.fa-car-crash:before { + content: "\f5e1"; } + +.fa-car-side:before { + content: "\f5e4"; } + +.fa-caravan:before { + content: "\f8ff"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-carrot:before { + content: "\f787"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cash-register:before { + content: "\f788"; } + +.fa-cat:before { + content: "\f6be"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-centos:before { + content: "\f789"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chair:before { + content: "\f6c0"; } + +.fa-chalkboard:before { + content: "\f51b"; } + +.fa-chalkboard-teacher:before { + content: "\f51c"; } + +.fa-charging-station:before { + content: "\f5e7"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-double:before { + content: "\f560"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-cheese:before { + content: "\f7ef"; } + +.fa-chess:before { + content: "\f439"; } + +.fa-chess-bishop:before { + content: "\f43a"; } + +.fa-chess-board:before { + content: "\f43c"; } + +.fa-chess-king:before { + content: "\f43f"; } + +.fa-chess-knight:before { + content: "\f441"; } + +.fa-chess-pawn:before { + content: "\f443"; } + +.fa-chess-queen:before { + content: "\f445"; } + +.fa-chess-rook:before { + content: "\f447"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-chromecast:before { + content: "\f838"; } + +.fa-church:before { + content: "\f51d"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-city:before { + content: "\f64f"; } + +.fa-clinic-medical:before { + content: "\f7f2"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clipboard-check:before { + content: "\f46c"; } + +.fa-clipboard-list:before { + content: "\f46d"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-meatball:before { + content: "\f73b"; } + +.fa-cloud-moon:before { + content: "\f6c3"; } + +.fa-cloud-moon-rain:before { + content: "\f73c"; } + +.fa-cloud-rain:before { + content: "\f73d"; } + +.fa-cloud-showers-heavy:before { + content: "\f740"; } + +.fa-cloud-sun:before { + content: "\f6c4"; } + +.fa-cloud-sun-rain:before { + content: "\f743"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudflare:before { + content: "\e07d"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-cocktail:before { + content: "\f561"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-coins:before { + content: "\f51e"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comment-dollar:before { + content: "\f651"; } + +.fa-comment-dots:before { + content: "\f4ad"; } + +.fa-comment-medical:before { + content: "\f7f5"; } + +.fa-comment-slash:before { + content: "\f4b3"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-comments-dollar:before { + content: "\f653"; } + +.fa-compact-disc:before { + content: "\f51f"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-compress-alt:before { + content: "\f422"; } + +.fa-compress-arrows-alt:before { + content: "\f78c"; } + +.fa-concierge-bell:before { + content: "\f562"; } + +.fa-confluence:before { + content: "\f78d"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-cookie:before { + content: "\f563"; } + +.fa-cookie-bite:before { + content: "\f564"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-cotton-bureau:before { + content: "\f89e"; } + +.fa-couch:before { + content: "\f4b8"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crop-alt:before { + content: "\f565"; } + +.fa-cross:before { + content: "\f654"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-crow:before { + content: "\f520"; } + +.fa-crown:before { + content: "\f521"; } + +.fa-crutch:before { + content: "\f7f7"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-d-and-d-beyond:before { + content: "\f6ca"; } + +.fa-dailymotion:before { + content: "\e052"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-deezer:before { + content: "\e077"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-democrat:before { + content: "\f747"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-dharmachakra:before { + content: "\f655"; } + +.fa-dhl:before { + content: "\f790"; } + +.fa-diagnoses:before { + content: "\f470"; } + +.fa-diaspora:before { + content: "\f791"; } + +.fa-dice:before { + content: "\f522"; } + +.fa-dice-d20:before { + content: "\f6cf"; } + +.fa-dice-d6:before { + content: "\f6d1"; } + +.fa-dice-five:before { + content: "\f523"; } + +.fa-dice-four:before { + content: "\f524"; } + +.fa-dice-one:before { + content: "\f525"; } + +.fa-dice-six:before { + content: "\f526"; } + +.fa-dice-three:before { + content: "\f527"; } + +.fa-dice-two:before { + content: "\f528"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-digital-tachograph:before { + content: "\f566"; } + +.fa-directions:before { + content: "\f5eb"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-disease:before { + content: "\f7fa"; } + +.fa-divide:before { + content: "\f529"; } + +.fa-dizzy:before { + content: "\f567"; } + +.fa-dna:before { + content: "\f471"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dog:before { + content: "\f6d3"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dolly:before { + content: "\f472"; } + +.fa-dolly-flatbed:before { + content: "\f474"; } + +.fa-donate:before { + content: "\f4b9"; } + +.fa-door-closed:before { + content: "\f52a"; } + +.fa-door-open:before { + content: "\f52b"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-dove:before { + content: "\f4ba"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-drafting-compass:before { + content: "\f568"; } + +.fa-dragon:before { + content: "\f6d5"; } + +.fa-draw-polygon:before { + content: "\f5ee"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drum:before { + content: "\f569"; } + +.fa-drum-steelpan:before { + content: "\f56a"; } + +.fa-drumstick-bite:before { + content: "\f6d7"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dumbbell:before { + content: "\f44b"; } + +.fa-dumpster:before { + content: "\f793"; } + +.fa-dumpster-fire:before { + content: "\f794"; } + +.fa-dungeon:before { + content: "\f6d9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edge-legacy:before { + content: "\e078"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-egg:before { + content: "\f7fb"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-open-text:before { + content: "\f658"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-equals:before { + content: "\f52c"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-ethernet:before { + content: "\f796"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-evernote:before { + content: "\f839"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-alt:before { + content: "\f424"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fan:before { + content: "\f863"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-faucet:before { + content: "\e005"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-feather:before { + content: "\f52d"; } + +.fa-feather-alt:before { + content: "\f56b"; } + +.fa-fedex:before { + content: "\f797"; } + +.fa-fedora:before { + content: "\f798"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-figma:before { + content: "\f799"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-contract:before { + content: "\f56c"; } + +.fa-file-csv:before { + content: "\f6dd"; } + +.fa-file-download:before { + content: "\f56d"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-export:before { + content: "\f56e"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-import:before { + content: "\f56f"; } + +.fa-file-invoice:before { + content: "\f570"; } + +.fa-file-invoice-dollar:before { + content: "\f571"; } + +.fa-file-medical:before { + content: "\f477"; } + +.fa-file-medical-alt:before { + content: "\f478"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-prescription:before { + content: "\f572"; } + +.fa-file-signature:before { + content: "\f573"; } + +.fa-file-upload:before { + content: "\f574"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-fill:before { + content: "\f575"; } + +.fa-fill-drip:before { + content: "\f576"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fingerprint:before { + content: "\f577"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-alt:before { + content: "\f7e4"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-firefox-browser:before { + content: "\e007"; } + +.fa-first-aid:before { + content: "\f479"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-fish:before { + content: "\f578"; } + +.fa-fist-raised:before { + content: "\f6de"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flag-usa:before { + content: "\f74d"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-flushed:before { + content: "\f579"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-minus:before { + content: "\f65d"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-folder-plus:before { + content: "\f65e"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-font-awesome-logo-full:before { + content: "\f4e6"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-football-ball:before { + content: "\f44e"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frog:before { + content: "\f52e"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-frown-open:before { + content: "\f57a"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-funnel-dollar:before { + content: "\f662"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gas-pump:before { + content: "\f52f"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-ghost:before { + content: "\f6e2"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-gifts:before { + content: "\f79c"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-alt:before { + content: "\f841"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-cheers:before { + content: "\f79f"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glass-martini-alt:before { + content: "\f57b"; } + +.fa-glass-whiskey:before { + content: "\f7a0"; } + +.fa-glasses:before { + content: "\f530"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-globe-africa:before { + content: "\f57c"; } + +.fa-globe-americas:before { + content: "\f57d"; } + +.fa-globe-asia:before { + content: "\f57e"; } + +.fa-globe-europe:before { + content: "\f7a2"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-golf-ball:before { + content: "\f450"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-pay:before { + content: "\e079"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-gopuram:before { + content: "\f664"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-greater-than:before { + content: "\f531"; } + +.fa-greater-than-equal:before { + content: "\f532"; } + +.fa-grimace:before { + content: "\f57f"; } + +.fa-grin:before { + content: "\f580"; } + +.fa-grin-alt:before { + content: "\f581"; } + +.fa-grin-beam:before { + content: "\f582"; } + +.fa-grin-beam-sweat:before { + content: "\f583"; } + +.fa-grin-hearts:before { + content: "\f584"; } + +.fa-grin-squint:before { + content: "\f585"; } + +.fa-grin-squint-tears:before { + content: "\f586"; } + +.fa-grin-stars:before { + content: "\f587"; } + +.fa-grin-tears:before { + content: "\f588"; } + +.fa-grin-tongue:before { + content: "\f589"; } + +.fa-grin-tongue-squint:before { + content: "\f58a"; } + +.fa-grin-tongue-wink:before { + content: "\f58b"; } + +.fa-grin-wink:before { + content: "\f58c"; } + +.fa-grip-horizontal:before { + content: "\f58d"; } + +.fa-grip-lines:before { + content: "\f7a4"; } + +.fa-grip-lines-vertical:before { + content: "\f7a5"; } + +.fa-grip-vertical:before { + content: "\f58e"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-guilded:before { + content: "\e07e"; } + +.fa-guitar:before { + content: "\f7a6"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-hamburger:before { + content: "\f805"; } + +.fa-hammer:before { + content: "\f6e3"; } + +.fa-hamsa:before { + content: "\f665"; } + +.fa-hand-holding:before { + content: "\f4bd"; } + +.fa-hand-holding-heart:before { + content: "\f4be"; } + +.fa-hand-holding-medical:before { + content: "\e05c"; } + +.fa-hand-holding-usd:before { + content: "\f4c0"; } + +.fa-hand-holding-water:before { + content: "\f4c1"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-middle-finger:before { + content: "\f806"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-sparkles:before { + content: "\e05d"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-hands:before { + content: "\f4c2"; } + +.fa-hands-helping:before { + content: "\f4c4"; } + +.fa-hands-wash:before { + content: "\e05e"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-handshake-alt-slash:before { + content: "\e05f"; } + +.fa-handshake-slash:before { + content: "\e060"; } + +.fa-hanukiah:before { + content: "\f6e6"; } + +.fa-hard-hat:before { + content: "\f807"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hat-cowboy:before { + content: "\f8c0"; } + +.fa-hat-cowboy-side:before { + content: "\f8c1"; } + +.fa-hat-wizard:before { + content: "\f6e8"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-head-side-cough:before { + content: "\e061"; } + +.fa-head-side-cough-slash:before { + content: "\e062"; } + +.fa-head-side-mask:before { + content: "\e063"; } + +.fa-head-side-virus:before { + content: "\e064"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-headphones-alt:before { + content: "\f58f"; } + +.fa-headset:before { + content: "\f590"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heart-broken:before { + content: "\f7a9"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-helicopter:before { + content: "\f533"; } + +.fa-highlighter:before { + content: "\f591"; } + +.fa-hiking:before { + content: "\f6ec"; } + +.fa-hippo:before { + content: "\f6ed"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-hive:before { + content: "\e07f"; } + +.fa-hockey-puck:before { + content: "\f453"; } + +.fa-holly-berry:before { + content: "\f7aa"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-horse:before { + content: "\f6f0"; } + +.fa-horse-head:before { + content: "\f7ab"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hospital-alt:before { + content: "\f47d"; } + +.fa-hospital-symbol:before { + content: "\f47e"; } + +.fa-hospital-user:before { + content: "\f80d"; } + +.fa-hot-tub:before { + content: "\f593"; } + +.fa-hotdog:before { + content: "\f80f"; } + +.fa-hotel:before { + content: "\f594"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-house-damage:before { + content: "\f6f1"; } + +.fa-house-user:before { + content: "\e065"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-hryvnia:before { + content: "\f6f2"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-ice-cream:before { + content: "\f810"; } + +.fa-icicles:before { + content: "\f7ad"; } + +.fa-icons:before { + content: "\f86d"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-id-card-alt:before { + content: "\f47f"; } + +.fa-ideal:before { + content: "\e013"; } + +.fa-igloo:before { + content: "\f7ae"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-infinity:before { + content: "\f534"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-innosoft:before { + content: "\e080"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-instagram-square:before { + content: "\e055"; } + +.fa-instalod:before { + content: "\e081"; } + +.fa-intercom:before { + content: "\f7af"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-invision:before { + content: "\f7b0"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itch-io:before { + content: "\f83a"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-jedi:before { + content: "\f669"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-jira:before { + content: "\f7b1"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joint:before { + content: "\f595"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-journal-whills:before { + content: "\f66a"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-kaaba:before { + content: "\f66b"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-khanda:before { + content: "\f66d"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-kiss:before { + content: "\f596"; } + +.fa-kiss-beam:before { + content: "\f597"; } + +.fa-kiss-wink-heart:before { + content: "\f598"; } + +.fa-kiwi-bird:before { + content: "\f535"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-landmark:before { + content: "\f66f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laptop-code:before { + content: "\f5fc"; } + +.fa-laptop-house:before { + content: "\e066"; } + +.fa-laptop-medical:before { + content: "\f812"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-laugh:before { + content: "\f599"; } + +.fa-laugh-beam:before { + content: "\f59a"; } + +.fa-laugh-squint:before { + content: "\f59b"; } + +.fa-laugh-wink:before { + content: "\f59c"; } + +.fa-layer-group:before { + content: "\f5fd"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-less-than:before { + content: "\f536"; } + +.fa-less-than-equal:before { + content: "\f537"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-luggage-cart:before { + content: "\f59d"; } + +.fa-lungs:before { + content: "\f604"; } + +.fa-lungs-virus:before { + content: "\e067"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-mail-bulk:before { + content: "\f674"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-male:before { + content: "\f183"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marked:before { + content: "\f59f"; } + +.fa-map-marked-alt:before { + content: "\f5a0"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-marker:before { + content: "\f5a1"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-mask:before { + content: "\f6fa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-mdb:before { + content: "\f8ca"; } + +.fa-medal:before { + content: "\f5a2"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-meh-blank:before { + content: "\f5a4"; } + +.fa-meh-rolling-eyes:before { + content: "\f5a5"; } + +.fa-memory:before { + content: "\f538"; } + +.fa-mendeley:before { + content: "\f7b3"; } + +.fa-menorah:before { + content: "\f676"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-meteor:before { + content: "\f753"; } + +.fa-microblog:before { + content: "\e01a"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-alt:before { + content: "\f3c9"; } + +.fa-microphone-alt-slash:before { + content: "\f539"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microscope:before { + content: "\f610"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mitten:before { + content: "\f7b5"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mixer:before { + content: "\e056"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill:before { + content: "\f0d6"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-money-bill-wave:before { + content: "\f53a"; } + +.fa-money-bill-wave-alt:before { + content: "\f53b"; } + +.fa-money-check:before { + content: "\f53c"; } + +.fa-money-check-alt:before { + content: "\f53d"; } + +.fa-monument:before { + content: "\f5a6"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-mortar-pestle:before { + content: "\f5a7"; } + +.fa-mosque:before { + content: "\f678"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mountain:before { + content: "\f6fc"; } + +.fa-mouse:before { + content: "\f8cc"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-mug-hot:before { + content: "\f7b6"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-network-wired:before { + content: "\f6ff"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-not-equal:before { + content: "\f53e"; } + +.fa-notes-medical:before { + content: "\f481"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-octopus-deploy:before { + content: "\e082"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-oil-can:before { + content: "\f613"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-om:before { + content: "\f679"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-orcid:before { + content: "\f8d2"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-otter:before { + content: "\f700"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-pager:before { + content: "\f815"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-paint-roller:before { + content: "\f5aa"; } + +.fa-palette:before { + content: "\f53f"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-pallet:before { + content: "\f482"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-parachute-box:before { + content: "\f4cd"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-parking:before { + content: "\f540"; } + +.fa-passport:before { + content: "\f5ab"; } + +.fa-pastafarianism:before { + content: "\f67b"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-peace:before { + content: "\f67c"; } + +.fa-pen:before { + content: "\f304"; } + +.fa-pen-alt:before { + content: "\f305"; } + +.fa-pen-fancy:before { + content: "\f5ac"; } + +.fa-pen-nib:before { + content: "\f5ad"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-pencil-ruler:before { + content: "\f5ae"; } + +.fa-penny-arcade:before { + content: "\f704"; } + +.fa-people-arrows:before { + content: "\e068"; } + +.fa-people-carry:before { + content: "\f4ce"; } + +.fa-pepper-hot:before { + content: "\f816"; } + +.fa-perbyte:before { + content: "\e083"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-percentage:before { + content: "\f541"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-person-booth:before { + content: "\f756"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-alt:before { + content: "\f879"; } + +.fa-phone-slash:before { + content: "\f3dd"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-square-alt:before { + content: "\f87b"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-photo-video:before { + content: "\f87c"; } + +.fa-php:before { + content: "\f457"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-pied-piper-square:before { + content: "\e01e"; } + +.fa-piggy-bank:before { + content: "\f4d3"; } + +.fa-pills:before { + content: "\f484"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-pizza-slice:before { + content: "\f818"; } + +.fa-place-of-worship:before { + content: "\f67f"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-plane-arrival:before { + content: "\f5af"; } + +.fa-plane-departure:before { + content: "\f5b0"; } + +.fa-plane-slash:before { + content: "\e069"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-poll:before { + content: "\f681"; } + +.fa-poll-h:before { + content: "\f682"; } + +.fa-poo:before { + content: "\f2fe"; } + +.fa-poo-storm:before { + content: "\f75a"; } + +.fa-poop:before { + content: "\f619"; } + +.fa-portrait:before { + content: "\f3e0"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-pray:before { + content: "\f683"; } + +.fa-praying-hands:before { + content: "\f684"; } + +.fa-prescription:before { + content: "\f5b1"; } + +.fa-prescription-bottle:before { + content: "\f485"; } + +.fa-prescription-bottle-alt:before { + content: "\f486"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-procedures:before { + content: "\f487"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-project-diagram:before { + content: "\f542"; } + +.fa-pump-medical:before { + content: "\e06a"; } + +.fa-pump-soap:before { + content: "\e06b"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quidditch:before { + content: "\f458"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-quran:before { + content: "\f687"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-radiation:before { + content: "\f7b9"; } + +.fa-radiation-alt:before { + content: "\f7ba"; } + +.fa-rainbow:before { + content: "\f75b"; } + +.fa-random:before { + content: "\f074"; } + +.fa-raspberry-pi:before { + content: "\f7bb"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-reacteurope:before { + content: "\f75d"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-receipt:before { + content: "\f543"; } + +.fa-record-vinyl:before { + content: "\f8d9"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redhat:before { + content: "\f7bc"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-remove-format:before { + content: "\f87d"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-republican:before { + content: "\f75e"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-restroom:before { + content: "\f7bd"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-ribbon:before { + content: "\f4d6"; } + +.fa-ring:before { + content: "\f70b"; } + +.fa-road:before { + content: "\f018"; } + +.fa-robot:before { + content: "\f544"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-route:before { + content: "\f4d7"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-ruler:before { + content: "\f545"; } + +.fa-ruler-combined:before { + content: "\f546"; } + +.fa-ruler-horizontal:before { + content: "\f547"; } + +.fa-ruler-vertical:before { + content: "\f548"; } + +.fa-running:before { + content: "\f70c"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-rust:before { + content: "\e07a"; } + +.fa-sad-cry:before { + content: "\f5b3"; } + +.fa-sad-tear:before { + content: "\f5b4"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-salesforce:before { + content: "\f83b"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-satellite:before { + content: "\f7bf"; } + +.fa-satellite-dish:before { + content: "\f7c0"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-school:before { + content: "\f549"; } + +.fa-screwdriver:before { + content: "\f54a"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-scroll:before { + content: "\f70e"; } + +.fa-sd-card:before { + content: "\f7c2"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-dollar:before { + content: "\f688"; } + +.fa-search-location:before { + content: "\f689"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-seedling:before { + content: "\f4d8"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-shapes:before { + content: "\f61f"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-shield-virus:before { + content: "\e06c"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shipping-fast:before { + content: "\f48b"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shoe-prints:before { + content: "\f54b"; } + +.fa-shopify:before { + content: "\e057"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-shuttle-van:before { + content: "\f5b6"; } + +.fa-sign:before { + content: "\f4d9"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-signature:before { + content: "\f5b7"; } + +.fa-sim-card:before { + content: "\f7c4"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sink:before { + content: "\e06d"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-skating:before { + content: "\f7c5"; } + +.fa-sketch:before { + content: "\f7c6"; } + +.fa-skiing:before { + content: "\f7c9"; } + +.fa-skiing-nordic:before { + content: "\f7ca"; } + +.fa-skull:before { + content: "\f54c"; } + +.fa-skull-crossbones:before { + content: "\f714"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-slash:before { + content: "\f715"; } + +.fa-sleigh:before { + content: "\f7cc"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-smile-beam:before { + content: "\f5b8"; } + +.fa-smile-wink:before { + content: "\f4da"; } + +.fa-smog:before { + content: "\f75f"; } + +.fa-smoking:before { + content: "\f48d"; } + +.fa-smoking-ban:before { + content: "\f54d"; } + +.fa-sms:before { + content: "\f7cd"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowboarding:before { + content: "\f7ce"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-snowman:before { + content: "\f7d0"; } + +.fa-snowplow:before { + content: "\f7d2"; } + +.fa-soap:before { + content: "\e06e"; } + +.fa-socks:before { + content: "\f696"; } + +.fa-solar-panel:before { + content: "\f5ba"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-down-alt:before { + content: "\f881"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-alpha-up-alt:before { + content: "\f882"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-down-alt:before { + content: "\f884"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-amount-up-alt:before { + content: "\f885"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-down-alt:before { + content: "\f886"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-numeric-up-alt:before { + content: "\f887"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-sourcetree:before { + content: "\f7d3"; } + +.fa-spa:before { + content: "\f5bb"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-speaker-deck:before { + content: "\f83c"; } + +.fa-spell-check:before { + content: "\f891"; } + +.fa-spider:before { + content: "\f717"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-splotch:before { + content: "\f5bc"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-spray-can:before { + content: "\f5bd"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-square-full:before { + content: "\f45c"; } + +.fa-square-root-alt:before { + content: "\f698"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-stackpath:before { + content: "\f842"; } + +.fa-stamp:before { + content: "\f5bf"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-and-crescent:before { + content: "\f699"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-star-half-alt:before { + content: "\f5c0"; } + +.fa-star-of-david:before { + content: "\f69a"; } + +.fa-star-of-life:before { + content: "\f621"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-stopwatch-20:before { + content: "\e06f"; } + +.fa-store:before { + content: "\f54e"; } + +.fa-store-alt:before { + content: "\f54f"; } + +.fa-store-alt-slash:before { + content: "\e070"; } + +.fa-store-slash:before { + content: "\e071"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-stream:before { + content: "\f550"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-stroopwafel:before { + content: "\f551"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-suitcase-rolling:before { + content: "\f5c1"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-surprise:before { + content: "\f5c2"; } + +.fa-suse:before { + content: "\f7d6"; } + +.fa-swatchbook:before { + content: "\f5c3"; } + +.fa-swift:before { + content: "\f8e1"; } + +.fa-swimmer:before { + content: "\f5c4"; } + +.fa-swimming-pool:before { + content: "\f5c5"; } + +.fa-symfony:before { + content: "\f83d"; } + +.fa-synagogue:before { + content: "\f69b"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-syringe:before { + content: "\f48e"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-table-tennis:before { + content: "\f45d"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tablets:before { + content: "\f490"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tape:before { + content: "\f4db"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-teeth:before { + content: "\f62e"; } + +.fa-teeth-open:before { + content: "\f62f"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-temperature-high:before { + content: "\f769"; } + +.fa-temperature-low:before { + content: "\f76b"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-tenge:before { + content: "\f7d7"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-theater-masks:before { + content: "\f630"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer:before { + content: "\f491"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-think-peaks:before { + content: "\f731"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-tiktok:before { + content: "\e07b"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-tint-slash:before { + content: "\f5c7"; } + +.fa-tired:before { + content: "\f5c8"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-toilet:before { + content: "\f7d8"; } + +.fa-toilet-paper:before { + content: "\f71e"; } + +.fa-toilet-paper-slash:before { + content: "\e072"; } + +.fa-toolbox:before { + content: "\f552"; } + +.fa-tools:before { + content: "\f7d9"; } + +.fa-tooth:before { + content: "\f5c9"; } + +.fa-torah:before { + content: "\f6a0"; } + +.fa-torii-gate:before { + content: "\f6a1"; } + +.fa-tractor:before { + content: "\f722"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-traffic-light:before { + content: "\f637"; } + +.fa-trailer:before { + content: "\e041"; } + +.fa-train:before { + content: "\f238"; } + +.fa-tram:before { + content: "\f7da"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-trash-restore:before { + content: "\f829"; } + +.fa-trash-restore-alt:before { + content: "\f82a"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-truck-loading:before { + content: "\f4de"; } + +.fa-truck-monster:before { + content: "\f63b"; } + +.fa-truck-moving:before { + content: "\f4df"; } + +.fa-truck-pickup:before { + content: "\f63c"; } + +.fa-tshirt:before { + content: "\f553"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-ubuntu:before { + content: "\f7df"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbraco:before { + content: "\f8e8"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-umbrella-beach:before { + content: "\f5ca"; } + +.fa-uncharted:before { + content: "\e084"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-unity:before { + content: "\e049"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-unsplash:before { + content: "\e07c"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-ups:before { + content: "\f7e0"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-alt:before { + content: "\f406"; } + +.fa-user-alt-slash:before { + content: "\f4fa"; } + +.fa-user-astronaut:before { + content: "\f4fb"; } + +.fa-user-check:before { + content: "\f4fc"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-clock:before { + content: "\f4fd"; } + +.fa-user-cog:before { + content: "\f4fe"; } + +.fa-user-edit:before { + content: "\f4ff"; } + +.fa-user-friends:before { + content: "\f500"; } + +.fa-user-graduate:before { + content: "\f501"; } + +.fa-user-injured:before { + content: "\f728"; } + +.fa-user-lock:before { + content: "\f502"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-minus:before { + content: "\f503"; } + +.fa-user-ninja:before { + content: "\f504"; } + +.fa-user-nurse:before { + content: "\f82f"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-shield:before { + content: "\f505"; } + +.fa-user-slash:before { + content: "\f506"; } + +.fa-user-tag:before { + content: "\f507"; } + +.fa-user-tie:before { + content: "\f508"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-users-cog:before { + content: "\f509"; } + +.fa-users-slash:before { + content: "\e073"; } + +.fa-usps:before { + content: "\f7e1"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-vector-square:before { + content: "\f5cb"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-vest:before { + content: "\e085"; } + +.fa-vest-patches:before { + content: "\e086"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-vial:before { + content: "\f492"; } + +.fa-vials:before { + content: "\f493"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-video-slash:before { + content: "\f4e2"; } + +.fa-vihara:before { + content: "\f6a7"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-virus:before { + content: "\e074"; } + +.fa-virus-slash:before { + content: "\e075"; } + +.fa-viruses:before { + content: "\e076"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-voicemail:before { + content: "\f897"; } + +.fa-volleyball-ball:before { + content: "\f45f"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-mute:before { + content: "\f6a9"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vote-yea:before { + content: "\f772"; } + +.fa-vr-cardboard:before { + content: "\f729"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-walking:before { + content: "\f554"; } + +.fa-wallet:before { + content: "\f555"; } + +.fa-warehouse:before { + content: "\f494"; } + +.fa-watchman-monitoring:before { + content: "\e087"; } + +.fa-water:before { + content: "\f773"; } + +.fa-wave-square:before { + content: "\f83e"; } + +.fa-waze:before { + content: "\f83f"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weight:before { + content: "\f496"; } + +.fa-weight-hanging:before { + content: "\f5cd"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wind:before { + content: "\f72e"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wine-bottle:before { + content: "\f72f"; } + +.fa-wine-glass:before { + content: "\f4e3"; } + +.fa-wine-glass-alt:before { + content: "\f5ce"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-wodu:before { + content: "\e088"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wpressr:before { + content: "\f3e4"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-x-ray:before { + content: "\f497"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yammer:before { + content: "\f840"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yarn:before { + content: "\f7e3"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yin-yang:before { + content: "\f6ad"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } + +/*! + * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 900; + font-display: block; + src: url("../webfonts/fa-solid-900.eot"); + src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } + +.fa, +.fas { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; } + +/*! + * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-brands-400.eot"); + src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } + +.fab { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.td-border-top { + border: none; + border-top: 1px solid #eee; } + +.td-border-none { + border: none; } + +.td-block-padding, .td-default main section { + padding-top: 4rem; + padding-bottom: 4rem; } + @media (min-width: 768px) { + .td-block-padding, .td-default main section { + padding-top: 5rem; + padding-bottom: 5rem; } } +.td-overlay { + position: relative; } + .td-overlay::after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; } + .td-overlay--dark::after { + background-color: rgba(64, 63, 76, 0.3); } + .td-overlay--light::after { + background-color: rgba(211, 243, 238, 0.3); } + .td-overlay__inner { + position: relative; + z-index: 1; } + +@media (min-width: 992px) { + .td-max-width-on-larger-screens, .td-content > pre, .td-content > .highlight, .td-content > .lead, .td-content > h1, .td-content > h2, .td-content > ul, .td-content > ol, .td-content > p, .td-content > blockquote, .td-content > dl dd, .td-content .footnotes, .td-content > .alert { + max-width: 80%; } } + +.-bg-blue { + color: #fff; + background-color: #72A1E5; } + +.-bg-blue p > a { + color: #a0c0ee; } + .-bg-blue p > a:hover { + color: #1e53a0; } + +.-text-blue { + color: #72A1E5; } + +.-bg-indigo { + color: #fff; + background-color: #6610f2; } + +.-bg-indigo p > a { + color: #b8cff2; } + .-bg-indigo p > a:hover { + color: #1e53a0; } + +.-text-indigo { + color: #6610f2; } + +.-bg-purple { + color: #fff; + background-color: #6f42c1; } + +.-bg-purple p > a { + color: #b7cff2; } + .-bg-purple p > a:hover { + color: #1e53a0; } + +.-text-purple { + color: #6f42c1; } + +.-bg-pink { + color: #fff; + background-color: #e83e8c; } + +.-bg-pink p > a { + color: #aec9f0; } + .-bg-pink p > a:hover { + color: #1e53a0; } + +.-text-pink { + color: #e83e8c; } + +.-bg-red { + color: #fff; + background-color: #dc3545; } + +.-bg-red p > a { + color: #b4cdf1; } + .-bg-red p > a:hover { + color: #1e53a0; } + +.-text-red { + color: #dc3545; } + +.-bg-orange { + color: #fff; + background-color: #BA5A31; } + +.-bg-orange p > a { + color: #bed4f3; } + .-bg-orange p > a:hover { + color: #1e53a0; } + +.-text-orange { + color: #BA5A31; } + +.-bg-yellow { + color: #fff; + background-color: #ffc107; } + +.-bg-yellow p > a { + color: #b7cff2; } + .-bg-yellow p > a:hover { + color: #1e53a0; } + +.-text-yellow { + color: #ffc107; } + +.-bg-green { + color: #fff; + background-color: #28a745; } + +.-bg-green p > a { + color: #c6d9f4; } + .-bg-green p > a:hover { + color: #1e53a0; } + +.-text-green { + color: #28a745; } + +.-bg-teal { + color: #fff; + background-color: #20c997; } + +.-bg-teal p > a { + color: #bfd4f3; } + .-bg-teal p > a:hover { + color: #1e53a0; } + +.-text-teal { + color: #20c997; } + +.-bg-cyan { + color: #fff; + background-color: #17a2b8; } + +.-bg-cyan p > a { + color: #c6d9f4; } + .-bg-cyan p > a:hover { + color: #1e53a0; } + +.-text-cyan { + color: #17a2b8; } + +.-bg-white { + color: #222; + background-color: #fff; } + +.-bg-white p > a { + color: #72a1e5; } + .-bg-white p > a:hover { + color: #1e53a0; } + +.-text-white { + color: #fff; } + +.-bg-gray { + color: #fff; + background-color: #797676; } + +.-bg-gray p > a { + color: #bdd3f3; } + .-bg-gray p > a:hover { + color: #1e53a0; } + +.-text-gray { + color: #797676; } + +.-bg-gray-dark { + color: #fff; + background-color: #333; } + +.-bg-gray-dark p > a { + color: #e3ecfa; } + .-bg-gray-dark p > a:hover { + color: #1e53a0; } + +.-text-gray-dark { + color: #333; } + +.-bg-primary { + color: #fff; + background-color: #1a3f51; } + +.-bg-primary p > a { + color: #e1ebfa; } + .-bg-primary p > a:hover { + color: #1e53a0; } + +.-text-primary { + color: #1a3f51; } + +.-bg-secondary { + color: #fff; + background-color: #102129; } + +.-bg-secondary p > a { + color: #eff4fc; } + .-bg-secondary p > a:hover { + color: #1e53a0; } + +.-text-secondary { + color: #102129; } + +.-bg-success { + color: #fff; + background-color: #3772FF; } + +.-bg-success p > a { + color: #a9c6ef; } + .-bg-success p > a:hover { + color: #1e53a0; } + +.-text-success { + color: #3772FF; } + +.-bg-info { + color: #222; + background-color: #C0E0DE; } + +.-bg-info p > a { + color: #638ac1; } + .-bg-info p > a:hover { + color: #1e53a0; } + +.-text-info { + color: #C0E0DE; } + +.-bg-warning { + color: #fff; + background-color: #ED6A5A; } + +.-bg-warning p > a { + color: #a5c3ee; } + .-bg-warning p > a:hover { + color: #1e53a0; } + +.-text-warning { + color: #ED6A5A; } + +.-bg-danger { + color: #fff; + background-color: #ED6A5A; } + +.-bg-danger p > a { + color: #a5c3ee; } + .-bg-danger p > a:hover { + color: #1e53a0; } + +.-text-danger { + color: #ED6A5A; } + +.-bg-light { + color: #222; + background-color: #D3F3EE; } + +.-bg-light p > a { + color: #6993d0; } + .-bg-light p > a:hover { + color: #1e53a0; } + +.-text-light { + color: #D3F3EE; } + +.-bg-dark { + color: #fff; + background-color: #403F4C; } + +.-bg-dark p > a { + color: #d9e5f8; } + .-bg-dark p > a:hover { + color: #1e53a0; } + +.-text-dark { + color: #403F4C; } + +.-bg-100 { + color: #222; + background-color: #f8f9fa; } + +.-bg-100 p > a { + color: #709ee0; } + .-bg-100 p > a:hover { + color: #1e53a0; } + +.-text-100 { + color: #f8f9fa; } + +.-bg-200 { + color: #222; + background-color: #eee; } + +.-bg-200 p > a { + color: #6d99d8; } + .-bg-200 p > a:hover { + color: #1e53a0; } + +.-text-200 { + color: #eee; } + +.-bg-300 { + color: #222; + background-color: #dee2e6; } + +.-bg-300 p > a { + color: #6993cf; } + .-bg-300 p > a:hover { + color: #1e53a0; } + +.-text-300 { + color: #dee2e6; } + +.-bg-400 { + color: #222; + background-color: #ccc; } + +.-bg-400 p > a { + color: #6288be; } + .-bg-400 p > a:hover { + color: #1e53a0; } + +.-text-400 { + color: #ccc; } + +.-bg-500 { + color: #fff; + background-color: #adb5bd; } + +.-bg-500 p > a { + color: #9bbced; } + .-bg-500 p > a:hover { + color: #1e53a0; } + +.-text-500 { + color: #adb5bd; } + +.-bg-600 { + color: #fff; + background-color: #797676; } + +.-bg-600 p > a { + color: #bdd3f3; } + .-bg-600 p > a:hover { + color: #1e53a0; } + +.-text-600 { + color: #797676; } + +.-bg-700 { + color: #fff; + background-color: #495057; } + +.-bg-700 p > a { + color: #d3e2f7; } + .-bg-700 p > a:hover { + color: #1e53a0; } + +.-text-700 { + color: #495057; } + +.-bg-800 { + color: #fff; + background-color: #333; } + +.-bg-800 p > a { + color: #e3ecfa; } + .-bg-800 p > a:hover { + color: #1e53a0; } + +.-text-800 { + color: #333; } + +.-bg-900 { + color: #fff; + background-color: #222; } + +.-bg-900 p > a { + color: #ecf2fc; } + .-bg-900 p > a:hover { + color: #1e53a0; } + +.-text-900 { + color: #222; } + +.-bg-0 { + color: #fff; + background-color: #403F4C; } + +.-bg-0 p > a { + color: #d9e5f8; } + .-bg-0 p > a:hover { + color: #1e53a0; } + +.-text-0 { + color: #403F4C; } + +.-bg-1 { + color: #fff; + background-color: #1a3f51; } + +.-bg-1 p > a { + color: #e1ebfa; } + .-bg-1 p > a:hover { + color: #1e53a0; } + +.-text-1 { + color: #1a3f51; } + +.-bg-2 { + color: #fff; + background-color: #102129; } + +.-bg-2 p > a { + color: #eff4fc; } + .-bg-2 p > a:hover { + color: #1e53a0; } + +.-text-2 { + color: #102129; } + +.-bg-3 { + color: #222; + background-color: #C0E0DE; } + +.-bg-3 p > a { + color: #638ac1; } + .-bg-3 p > a:hover { + color: #1e53a0; } + +.-text-3 { + color: #C0E0DE; } + +.-bg-4 { + color: #222; + background-color: #eff7fa; } + +.-bg-4 p > a { + color: #6f9cdd; } + .-bg-4 p > a:hover { + color: #1e53a0; } + +.-text-4 { + color: #eff7fa; } + +.-bg-5 { + color: #fff; + background-color: #797676; } + +.-bg-5 p > a { + color: #bdd3f3; } + .-bg-5 p > a:hover { + color: #1e53a0; } + +.-text-5 { + color: #797676; } + +.-bg-6 { + color: #fff; + background-color: #3772FF; } + +.-bg-6 p > a { + color: #a9c6ef; } + .-bg-6 p > a:hover { + color: #1e53a0; } + +.-text-6 { + color: #3772FF; } + +.-bg-7 { + color: #fff; + background-color: #ED6A5A; } + +.-bg-7 p > a { + color: #a5c3ee; } + .-bg-7 p > a:hover { + color: #1e53a0; } + +.-text-7 { + color: #ED6A5A; } + +.-bg-8 { + color: #fff; + background-color: #403F4C; } + +.-bg-8 p > a { + color: #d9e5f8; } + .-bg-8 p > a:hover { + color: #1e53a0; } + +.-text-8 { + color: #403F4C; } + +.-bg-9 { + color: #fff; + background-color: #ED6A5A; } + +.-bg-9 p > a { + color: #a5c3ee; } + .-bg-9 p > a:hover { + color: #1e53a0; } + +.-text-9 { + color: #ED6A5A; } + +.-bg-10 { + color: #fff; + background-color: #1a3f51; } + +.-bg-10 p > a { + color: #e1ebfa; } + .-bg-10 p > a:hover { + color: #1e53a0; } + +.-text-10 { + color: #1a3f51; } + +.-bg-11 { + color: #fff; + background-color: #102129; } + +.-bg-11 p > a { + color: #eff4fc; } + .-bg-11 p > a:hover { + color: #1e53a0; } + +.-text-11 { + color: #102129; } + +.-bg-12 { + color: #222; + background-color: #eff7fa; } + +.-bg-12 p > a { + color: #6f9cdd; } + .-bg-12 p > a:hover { + color: #1e53a0; } + +.-text-12 { + color: #eff7fa; } + +.-bg-13 { + color: #222; + background-color: #C0E0DE; } + +.-bg-13 p > a { + color: #638ac1; } + .-bg-13 p > a:hover { + color: #1e53a0; } + +.-text-13 { + color: #C0E0DE; } + +.td-box--height-min { + min-height: 300px; } + +.td-box--height-med { + min-height: 400px; } + +.td-box--height-max { + min-height: 500px; } + +.td-box--height-full { + min-height: 100vh; } + +@media (min-width: 768px) { + .td-box--height-min { + min-height: 450px; } + .td-box--height-med { + min-height: 500px; } + .td-box--height-max { + min-height: 650px; } } + +.td-box .row.section { + padding-left: 5vw; + padding-right: 5vw; + flex-direction: column; } + +.td-box .row { + padding-left: 5vw; + padding-right: 5vw; + flex-direction: row; } + +.td-box.linkbox { + padding: 5vh 5vw; } + +.td-box--0 { + color: #fff; + background-color: #403F4C; } + .td-box--0 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #403F4C transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--0 p > a { + color: #d9e5f8; } + .td-box--0 p > a:hover { + color: #1e53a0; } + +.td-box--10.td-box--gradient { + background: #403F4C linear-gradient(180deg, #5d5c67, #403F4C) repeat-x !important; } + +.td-box--1 { + color: #fff; + background-color: #1a3f51; } + .td-box--1 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #1a3f51 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--1 p > a { + color: #e1ebfa; } + .td-box--1 p > a:hover { + color: #1e53a0; } + +.td-box--11.td-box--gradient { + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x !important; } + +.td-box--2 { + color: #fff; + background-color: #102129; } + .td-box--2 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #102129 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--2 p > a { + color: #eff4fc; } + .td-box--2 p > a:hover { + color: #1e53a0; } + +.td-box--12.td-box--gradient { + background: #102129 linear-gradient(180deg, #344249, #102129) repeat-x !important; } + +.td-box--3 { + color: #222; + background-color: #C0E0DE; } + .td-box--3 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #C0E0DE transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--3 p > a { + color: #638ac1; } + .td-box--3 p > a:hover { + color: #1e53a0; } + +.td-box--13.td-box--gradient { + background: #C0E0DE linear-gradient(180deg, #c9e5e3, #C0E0DE) repeat-x !important; } + +.td-box--4 { + color: #222; + background-color: #eff7fa; } + .td-box--4 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #eff7fa transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--4 p > a { + color: #6f9cdd; } + .td-box--4 p > a:hover { + color: #1e53a0; } + +.td-box--14.td-box--gradient { + background: #eff7fa linear-gradient(180deg, #f2f8fb, #eff7fa) repeat-x !important; } + +.td-box--5 { + color: #fff; + background-color: #797676; } + .td-box--5 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #797676 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--5 p > a { + color: #bdd3f3; } + .td-box--5 p > a:hover { + color: #1e53a0; } + +.td-box--15.td-box--gradient { + background: #797676 linear-gradient(180deg, #8d8b8b, #797676) repeat-x !important; } + +.td-box--6 { + color: #fff; + background-color: #3772FF; } + .td-box--6 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #3772FF transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--6 p > a { + color: #a9c6ef; } + .td-box--6 p > a:hover { + color: #1e53a0; } + +.td-box--16.td-box--gradient { + background: #3772FF linear-gradient(180deg, #5587ff, #3772FF) repeat-x !important; } + +.td-box--7 { + color: #fff; + background-color: #ED6A5A; } + .td-box--7 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #ED6A5A transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--7 p > a { + color: #a5c3ee; } + .td-box--7 p > a:hover { + color: #1e53a0; } + +.td-box--17.td-box--gradient { + background: #ED6A5A linear-gradient(180deg, #f08073, #ED6A5A) repeat-x !important; } + +.td-box--8 { + color: #fff; + background-color: #403F4C; } + .td-box--8 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #403F4C transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--8 p > a { + color: #d9e5f8; } + .td-box--8 p > a:hover { + color: #1e53a0; } + +.td-box--18.td-box--gradient { + background: #403F4C linear-gradient(180deg, #5d5c67, #403F4C) repeat-x !important; } + +.td-box--9 { + color: #fff; + background-color: #ED6A5A; } + .td-box--9 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #ED6A5A transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--9 p > a { + color: #a5c3ee; } + .td-box--9 p > a:hover { + color: #1e53a0; } + +.td-box--19.td-box--gradient { + background: #ED6A5A linear-gradient(180deg, #f08073, #ED6A5A) repeat-x !important; } + +.td-box--10 { + color: #fff; + background-color: #1a3f51; } + .td-box--10 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #1a3f51 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--10 p > a { + color: #e1ebfa; } + .td-box--10 p > a:hover { + color: #1e53a0; } + +.td-box--110.td-box--gradient { + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x !important; } + +.td-box--11 { + color: #fff; + background-color: #102129; } + .td-box--11 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #102129 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--11 p > a { + color: #eff4fc; } + .td-box--11 p > a:hover { + color: #1e53a0; } + +.td-box--111.td-box--gradient { + background: #102129 linear-gradient(180deg, #344249, #102129) repeat-x !important; } + +.td-box--12 { + color: #222; + background-color: #eff7fa; } + .td-box--12 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #eff7fa transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--12 p > a { + color: #6f9cdd; } + .td-box--12 p > a:hover { + color: #1e53a0; } + +.td-box--112.td-box--gradient { + background: #eff7fa linear-gradient(180deg, #f2f8fb, #eff7fa) repeat-x !important; } + +.td-box--13 { + color: #222; + background-color: #C0E0DE; } + .td-box--13 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #C0E0DE transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--13 p > a { + color: #638ac1; } + .td-box--13 p > a:hover { + color: #1e53a0; } + +.td-box--113.td-box--gradient { + background: #C0E0DE linear-gradient(180deg, #c9e5e3, #C0E0DE) repeat-x !important; } + +.td-box--blue { + color: #fff; + background-color: #72A1E5; } + .td-box--blue .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #72A1E5 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--blue p > a { + color: #a0c0ee; } + .td-box--blue p > a:hover { + color: #1e53a0; } + +.td-box--1blue.td-box--gradient { + background: #72A1E5 linear-gradient(180deg, #87afe9, #72A1E5) repeat-x !important; } + +.td-box--indigo { + color: #fff; + background-color: #6610f2; } + .td-box--indigo .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #6610f2 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--indigo p > a { + color: #b8cff2; } + .td-box--indigo p > a:hover { + color: #1e53a0; } + +.td-box--1indigo.td-box--gradient { + background: #6610f2 linear-gradient(180deg, #7d34f4, #6610f2) repeat-x !important; } + +.td-box--purple { + color: #fff; + background-color: #6f42c1; } + .td-box--purple .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #6f42c1 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--purple p > a { + color: #b7cff2; } + .td-box--purple p > a:hover { + color: #1e53a0; } + +.td-box--1purple.td-box--gradient { + background: #6f42c1 linear-gradient(180deg, #855eca, #6f42c1) repeat-x !important; } + +.td-box--pink { + color: #fff; + background-color: #e83e8c; } + .td-box--pink .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #e83e8c transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--pink p > a { + color: #aec9f0; } + .td-box--pink p > a:hover { + color: #1e53a0; } + +.td-box--1pink.td-box--gradient { + background: #e83e8c linear-gradient(180deg, #eb5b9d, #e83e8c) repeat-x !important; } + +.td-box--red { + color: #fff; + background-color: #dc3545; } + .td-box--red .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #dc3545 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--red p > a { + color: #b4cdf1; } + .td-box--red p > a:hover { + color: #1e53a0; } + +.td-box--1red.td-box--gradient { + background: #dc3545 linear-gradient(180deg, #e15361, #dc3545) repeat-x !important; } + +.td-box--orange { + color: #fff; + background-color: #BA5A31; } + .td-box--orange .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #BA5A31 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--orange p > a { + color: #bed4f3; } + .td-box--orange p > a:hover { + color: #1e53a0; } + +.td-box--1orange.td-box--gradient { + background: #BA5A31 linear-gradient(180deg, #c47350, #BA5A31) repeat-x !important; } + +.td-box--yellow { + color: #fff; + background-color: #ffc107; } + .td-box--yellow .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #ffc107 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--yellow p > a { + color: #b7cff2; } + .td-box--yellow p > a:hover { + color: #1e53a0; } + +.td-box--1yellow.td-box--gradient { + background: #ffc107 linear-gradient(180deg, #ffca2c, #ffc107) repeat-x !important; } + +.td-box--green { + color: #fff; + background-color: #28a745; } + .td-box--green .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #28a745 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--green p > a { + color: #c6d9f4; } + .td-box--green p > a:hover { + color: #1e53a0; } + +.td-box--1green.td-box--gradient { + background: #28a745 linear-gradient(180deg, #48b461, #28a745) repeat-x !important; } + +.td-box--teal { + color: #fff; + background-color: #20c997; } + .td-box--teal .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #20c997 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--teal p > a { + color: #bfd4f3; } + .td-box--teal p > a:hover { + color: #1e53a0; } + +.td-box--1teal.td-box--gradient { + background: #20c997 linear-gradient(180deg, #41d1a7, #20c997) repeat-x !important; } + +.td-box--cyan { + color: #fff; + background-color: #17a2b8; } + .td-box--cyan .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #17a2b8 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--cyan p > a { + color: #c6d9f4; } + .td-box--cyan p > a:hover { + color: #1e53a0; } + +.td-box--1cyan.td-box--gradient { + background: #17a2b8 linear-gradient(180deg, #3ab0c3, #17a2b8) repeat-x !important; } + +.td-box--white { + color: #222; + background-color: #fff; } + .td-box--white .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #fff transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--white p > a { + color: #72a1e5; } + .td-box--white p > a:hover { + color: #1e53a0; } + +.td-box--1white.td-box--gradient { + background: #fff linear-gradient(180deg, white, #fff) repeat-x !important; } + +.td-box--gray { + color: #fff; + background-color: #797676; } + .td-box--gray .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #797676 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--gray p > a { + color: #bdd3f3; } + .td-box--gray p > a:hover { + color: #1e53a0; } + +.td-box--1gray.td-box--gradient { + background: #797676 linear-gradient(180deg, #8d8b8b, #797676) repeat-x !important; } + +.td-box--gray-dark { + color: #fff; + background-color: #333; } + .td-box--gray-dark .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #333 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--gray-dark p > a { + color: #e3ecfa; } + .td-box--gray-dark p > a:hover { + color: #1e53a0; } + +.td-box--1gray-dark.td-box--gradient { + background: #333 linear-gradient(180deg, #525252, #333) repeat-x !important; } + +.td-box--primary { + color: #fff; + background-color: #1a3f51; } + .td-box--primary .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #1a3f51 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--primary p > a { + color: #e1ebfa; } + .td-box--primary p > a:hover { + color: #1e53a0; } + +.td-box--1primary.td-box--gradient { + background: #1a3f51 linear-gradient(180deg, #3c5c6b, #1a3f51) repeat-x !important; } + +.td-box--secondary { + color: #fff; + background-color: #102129; } + .td-box--secondary .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #102129 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--secondary p > a { + color: #eff4fc; } + .td-box--secondary p > a:hover { + color: #1e53a0; } + +.td-box--1secondary.td-box--gradient { + background: #102129 linear-gradient(180deg, #344249, #102129) repeat-x !important; } + +.td-box--success { + color: #fff; + background-color: #3772FF; } + .td-box--success .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #3772FF transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--success p > a { + color: #a9c6ef; } + .td-box--success p > a:hover { + color: #1e53a0; } + +.td-box--1success.td-box--gradient { + background: #3772FF linear-gradient(180deg, #5587ff, #3772FF) repeat-x !important; } + +.td-box--info { + color: #222; + background-color: #C0E0DE; } + .td-box--info .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #C0E0DE transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--info p > a { + color: #638ac1; } + .td-box--info p > a:hover { + color: #1e53a0; } + +.td-box--1info.td-box--gradient { + background: #C0E0DE linear-gradient(180deg, #c9e5e3, #C0E0DE) repeat-x !important; } + +.td-box--warning { + color: #fff; + background-color: #ED6A5A; } + .td-box--warning .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #ED6A5A transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--warning p > a { + color: #a5c3ee; } + .td-box--warning p > a:hover { + color: #1e53a0; } + +.td-box--1warning.td-box--gradient { + background: #ED6A5A linear-gradient(180deg, #f08073, #ED6A5A) repeat-x !important; } + +.td-box--danger { + color: #fff; + background-color: #ED6A5A; } + .td-box--danger .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #ED6A5A transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--danger p > a { + color: #a5c3ee; } + .td-box--danger p > a:hover { + color: #1e53a0; } + +.td-box--1danger.td-box--gradient { + background: #ED6A5A linear-gradient(180deg, #f08073, #ED6A5A) repeat-x !important; } + +.td-box--light { + color: #222; + background-color: #D3F3EE; } + .td-box--light .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #D3F3EE transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--light p > a { + color: #6993d0; } + .td-box--light p > a:hover { + color: #1e53a0; } + +.td-box--1light.td-box--gradient { + background: #D3F3EE linear-gradient(180deg, #daf5f1, #D3F3EE) repeat-x !important; } + +.td-box--dark { + color: #fff; + background-color: #403F4C; } + .td-box--dark .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #403F4C transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--dark p > a { + color: #d9e5f8; } + .td-box--dark p > a:hover { + color: #1e53a0; } + +.td-box--1dark.td-box--gradient { + background: #403F4C linear-gradient(180deg, #5d5c67, #403F4C) repeat-x !important; } + +.td-box--100 { + color: #222; + background-color: #f8f9fa; } + .td-box--100 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #f8f9fa transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--100 p > a { + color: #709ee0; } + .td-box--100 p > a:hover { + color: #1e53a0; } + +.td-box--1100.td-box--gradient { + background: #f8f9fa linear-gradient(180deg, #f9fafb, #f8f9fa) repeat-x !important; } + +.td-box--200 { + color: #222; + background-color: #eee; } + .td-box--200 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #eee transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--200 p > a { + color: #6d99d8; } + .td-box--200 p > a:hover { + color: #1e53a0; } + +.td-box--1200.td-box--gradient { + background: #eee linear-gradient(180deg, #f1f1f1, #eee) repeat-x !important; } + +.td-box--300 { + color: #222; + background-color: #dee2e6; } + .td-box--300 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #dee2e6 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--300 p > a { + color: #6993cf; } + .td-box--300 p > a:hover { + color: #1e53a0; } + +.td-box--1300.td-box--gradient { + background: #dee2e6 linear-gradient(180deg, #e3e6ea, #dee2e6) repeat-x !important; } + +.td-box--400 { + color: #222; + background-color: #ccc; } + .td-box--400 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #ccc transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--400 p > a { + color: #6288be; } + .td-box--400 p > a:hover { + color: #1e53a0; } + +.td-box--1400.td-box--gradient { + background: #ccc linear-gradient(180deg, #d4d4d4, #ccc) repeat-x !important; } + +.td-box--500 { + color: #fff; + background-color: #adb5bd; } + .td-box--500 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #adb5bd transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--500 p > a { + color: #9bbced; } + .td-box--500 p > a:hover { + color: #1e53a0; } + +.td-box--1500.td-box--gradient { + background: #adb5bd linear-gradient(180deg, #b9c0c7, #adb5bd) repeat-x !important; } + +.td-box--600 { + color: #fff; + background-color: #797676; } + .td-box--600 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #797676 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--600 p > a { + color: #bdd3f3; } + .td-box--600 p > a:hover { + color: #1e53a0; } + +.td-box--1600.td-box--gradient { + background: #797676 linear-gradient(180deg, #8d8b8b, #797676) repeat-x !important; } + +.td-box--700 { + color: #fff; + background-color: #495057; } + .td-box--700 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #495057 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--700 p > a { + color: #d3e2f7; } + .td-box--700 p > a:hover { + color: #1e53a0; } + +.td-box--1700.td-box--gradient { + background: #495057 linear-gradient(180deg, #646a70, #495057) repeat-x !important; } + +.td-box--800 { + color: #fff; + background-color: #333; } + .td-box--800 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #333 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--800 p > a { + color: #e3ecfa; } + .td-box--800 p > a:hover { + color: #1e53a0; } + +.td-box--1800.td-box--gradient { + background: #333 linear-gradient(180deg, #525252, #333) repeat-x !important; } + +.td-box--900 { + color: #fff; + background-color: #222; } + .td-box--900 .td-arrow-down::before { + left: 50%; + margin-left: -30px; + bottom: -25px; + border-style: solid; + border-width: 25px 30px 0 30px; + border-color: #222 transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; } + +.td-box--900 p > a { + color: #ecf2fc; } + .td-box--900 p > a:hover { + color: #1e53a0; } + +.td-box--1900.td-box--gradient { + background: #222 linear-gradient(180deg, #434343, #222) repeat-x !important; } + +.td-blog .td-rss-button { + position: absolute; + top: 5.5rem; + right: 1rem; + z-index: 22; } + +.td-content .highlight { + margin: 2rem 0; + padding: 0; } + .td-content .highlight pre { + margin: 0; + padding: 1rem; } + +.td-content p code, .td-content li > code, .td-content table code { + color: inherit; + padding: 0.2em 0.4em; + margin: 0; + font-size: 85%; + word-break: normal; + background-color: rgba(0, 0, 0, 0.05); + border-radius: 0.25rem; } + .td-content p code br, .td-content li > code br, .td-content table code br { + display: none; } + +.td-content pre { + word-wrap: normal; + background-color: #f8f9fa; + padding: 1rem; } + .td-content pre > code { + background-color: inherit !important; + padding: 0; + margin: 0; + font-size: 100%; + word-break: normal; + white-space: pre; + border: 0; } + +.td-content pre.mermaid { + background-color: inherit; + font-size: 0; } + +.td-navbar-cover { + background: #1a3f51; } + @media (min-width: 768px) { + .td-navbar-cover { + background: transparent !important; } + .td-navbar-cover .nav-link { + text-shadow: 1px 1px 2px #403F4C; } } + .td-navbar-cover.navbar-bg-onscroll .nav-link { + text-shadow: none; } + +.navbar-bg-onscroll { + background: #1a3f51 !important; + opacity: inherit; } + +.td-navbar { + background: #1a3f51; + min-height: 4rem; + margin: 0; + z-index: 32; } + @media (min-width: 768px) { + .td-navbar { + position: fixed; + top: 0; + width: 100%; } } + .td-navbar .navbar-brand { + text-transform: none; + text-align: middle; } + .td-navbar .navbar-brand .nav-link { + display: inline-block; + margin-right: -30px; } + .td-navbar .navbar-brand svg { + display: inline-block; + margin: 0 10px; + height: 30px; } + .td-navbar .nav-link { + text-transform: none; + font-weight: 700; } + .td-navbar .td-search-input { + border: none; + color: rgba(255, 255, 255, 0.75); } + .td-navbar .td-search-input::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.75); } + .td-navbar .td-search-input:-moz-placeholder { + color: rgba(255, 255, 255, 0.75); } + .td-navbar .td-search-input::-moz-placeholder { + color: rgba(255, 255, 255, 0.75); } + .td-navbar .td-search-input:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.75); } + .td-navbar .dropdown { + min-width: 100px; } + @media (max-width: 991.98px) { + .td-navbar { + padding-right: .5rem; + padding-left: .75rem; } + .td-navbar .td-navbar-nav-scroll { + max-width: 100%; + height: 2.5rem; + margin-top: .25rem; + overflow: hidden; + font-size: .875rem; } + .td-navbar .td-navbar-nav-scroll .nav-link { + padding-right: .25rem; + padding-left: 0; } + .td-navbar .td-navbar-nav-scroll .navbar-nav { + padding-bottom: 2rem; + overflow-x: auto; + white-space: nowrap; + -webkit-overflow-scrolling: touch; } } +#main_navbar li i { + padding-right: 0.5em; } + #main_navbar li i:before { + display: inline-block; + text-align: center; + min-width: 1em; } + +#main_navbar .alert { + background-color: inherit; + padding: 0; + color: #102129; + border: 0; + font-weight: inherit; } + #main_navbar .alert:before { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f0d9"; + padding-left: 0.5em; + padding-right: 0.5em; } + +nav.foldable-nav#td-section-nav { + position: relative; } + +nav.foldable-nav#td-section-nav label { + margin-bottom: 0; + width: 100%; } + +nav.foldable-nav .td-sidebar-nav__section, nav.foldable-nav .with-child ul { + list-style: none; + padding: 0; + margin: 0; } + +nav.foldable-nav .ul-1 > li { + padding-left: 1.5em; } + +nav.foldable-nav ul.foldable { + max-height: 0; + overflow: hidden; + transition: max-height 0.5s cubic-bezier(0, 1, 0, 1); } + +nav.foldable-nav input:checked ~ ul.foldable { + max-height: 100000vmax; + transition: max-height 1s ease-in-out; } + +nav.foldable-nav input[type=checkbox] { + display: none; } + +nav.foldable-nav .with-child, nav.foldable-nav .without-child { + position: relative; + padding-left: 1.5em; } + +nav.foldable-nav .ul-1 .with-child > label:before { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f0da"; + position: absolute; + left: 0.1em; + padding-left: 0.4em; + padding-right: 0.4em; + font-size: 1em; + color: #222; + transition: all 0.5s; } + nav.foldable-nav .ul-1 .with-child > label:before:hover { + transform: rotate(90deg); } + +nav.foldable-nav .ul-1 .with-child > input:checked ~ label:before { + color: #1a3f51; + transform: rotate(90deg); + transition: transform 0.5s; } + +nav.foldable-nav .with-child ul { + margin-top: 0.1em; } + +@media (hover: hover) and (pointer: fine) { + nav.foldable-nav .ul-1 .with-child > label:hover:before { + color: #1a3f51; + transform: rotate(30deg); + transition: transform 0.5s; } + nav.foldable-nav .ul-1 .with-child > input:checked ~ label:hover:before { + color: #1a3f51; + transform: rotate(60deg) !important; + transition: transform 0.5s; } } + +.td-sidebar-nav { + padding-right: 0.5rem; + margin-right: -15px; + margin-left: -15px; } + @media (min-width: 768px) { + @supports (position: sticky) { + .td-sidebar-nav { + max-height: calc(100vh - 10rem); + overflow-y: auto; } } } + @media (min-width: 768px) { + .td-sidebar-nav { + display: block !important; } } + .td-sidebar-nav__section { + padding-left: 0; } + .td-sidebar-nav__section li { + list-style: none; } + .td-sidebar-nav__section ul { + padding: 0; + margin: 0; } + @media (min-width: 768px) { + .td-sidebar-nav__section .ul-1 ul { + padding-left: 1.5em; } } + .td-sidebar-nav__section-title { + display: block; + font-weight: 500; } + .td-sidebar-nav__section-title .active { + font-weight: 700; } + .td-sidebar-nav__section-title a { + color: #222; } + .td-sidebar-nav .td-sidebar-link { + display: block; + padding-bottom: 0.375rem; } + .td-sidebar-nav .td-sidebar-link__page { + color: #495057; + font-weight: 300; } + .td-sidebar-nav a:hover { + color: #72A1E5; + text-decoration: none; } + .td-sidebar-nav a.active { + font-weight: 700; } + .td-sidebar-nav .dropdown a { + color: #495057; } + .td-sidebar-nav .dropdown .nav-link { + padding: 0 0 1rem; } + .td-sidebar-nav > .td-sidebar-nav__section { + padding-top: .5rem; + padding-left: 1.5rem; } + .td-sidebar-nav li i { + padding-right: 0.5em; } + .td-sidebar-nav li i:before { + display: inline-block; + text-align: center; + min-width: 1em; } + .td-sidebar-nav .td-sidebar-link.tree-root { + font-weight: 700; + color: #1a3f51; + border-bottom: 1px #1a3f51 solid; + margin-bottom: 1rem; } + +.td-sidebar { + padding-bottom: 1rem; } + @media (min-width: 768px) { + .td-sidebar { + padding-top: 4rem; + background-color: rgba(26, 63, 81, 0.03); + padding-right: 1rem; + border-right: 1px solid #dee2e6; } } + .td-sidebar__toggle { + line-height: 1; + color: #222; + margin: 1rem; } + .td-sidebar__search { + padding: 1rem 15px; + margin-right: -15px; + margin-left: -15px; } + .td-sidebar__inner { + order: 0; } + @media (min-width: 768px) { + @supports (position: sticky) { + .td-sidebar__inner { + position: sticky; + top: 4rem; + z-index: 10; + height: calc(100vh - 6rem); } } } + @media (min-width: 1200px) { + .td-sidebar__inner { + flex: 0 1 320px; } } + .td-sidebar__inner .td-search-box { + width: 100%; } + .td-sidebar #content-desktop { + display: block; } + .td-sidebar #content-mobile { + display: none; } + @media (max-width: 991.98px) { + .td-sidebar #content-desktop { + display: none; } + .td-sidebar #content-mobile { + display: block; } } +.td-sidebar-toc { + border-left: 1px solid #dee2e6; + order: 2; + padding-top: 0.75rem; + padding-bottom: 1.5rem; + vertical-align: top; } + @supports (position: sticky) { + .td-sidebar-toc { + position: sticky; + top: 4rem; + height: calc(100vh - 4rem); + overflow-y: auto; } } + +.td-page-meta a { + display: block; + font-weight: 500; } + +.td-toc a { + display: block; + font-weight: 300; + padding-bottom: .25rem; } + +.td-toc li { + list-style: none; + display: block; } + +.td-toc li li { + margin-left: 0.5rem; } + +.td-toc #TableOfContents a { + color: #797676; } + .td-toc #TableOfContents a:hover { + color: #72A1E5; + text-decoration: none; } + +.td-toc ul { + padding-left: 0; } + +.btn { + border-radius: 1rem; } + .btn-lg, .btn-group-lg > .btn { + border-radius: 2rem; } + .btn-sm, .btn-group-sm > .btn { + border-radius: 1rem; } + +@media print { + .td-breadcrumbs { + display: none !important; } } + +.td-breadcrumbs .breadcrumb { + background: inherit; + padding-left: 0; + padding-top: 0; } + +.alert { + font-weight: 500; + background: #fff; + color: inherit; + border-radius: 0; } + .alert-primary { + border-style: solid; + border-color: #1a3f51; + border-width: 0 0 0 4px; } + .alert-primary .alert-heading { + color: #1a3f51; } + .alert-secondary { + border-style: solid; + border-color: #102129; + border-width: 0 0 0 4px; } + .alert-secondary .alert-heading { + color: #102129; } + .alert-success { + border-style: solid; + border-color: #3772FF; + border-width: 0 0 0 4px; } + .alert-success .alert-heading { + color: #3772FF; } + .alert-info { + border-style: solid; + border-color: #C0E0DE; + border-width: 0 0 0 4px; } + .alert-info .alert-heading { + color: #C0E0DE; } + .alert-warning { + border-style: solid; + border-color: #ED6A5A; + border-width: 0 0 0 4px; } + .alert-warning .alert-heading { + color: #ED6A5A; } + .alert-danger { + border-style: solid; + border-color: #ED6A5A; + border-width: 0 0 0 4px; } + .alert-danger .alert-heading { + color: #ED6A5A; } + .alert-light { + border-style: solid; + border-color: #D3F3EE; + border-width: 0 0 0 4px; } + .alert-light .alert-heading { + color: #D3F3EE; } + .alert-dark { + border-style: solid; + border-color: #403F4C; + border-width: 0 0 0 4px; } + .alert-dark .alert-heading { + color: #403F4C; } + +.td-content { + order: 1; } + .td-content p, .td-content li, .td-content td { + font-weight: 400; } + .td-content > h1 { + font-weight: 700; + margin-bottom: 1rem; } + .td-content > h2 { + margin-bottom: 1rem; } + .td-content > h2:not(:first-child) { + margin-top: 3rem; } + .td-content > h2 + h3 { + margin-top: 1rem; } + .td-content > h3, .td-content > h4, .td-content > h5, .td-content > h6 { + margin-bottom: 1rem; + margin-top: 2rem; } + .td-content > blockquote { + padding: 0 0 0 1rem; + margin-bottom: 1rem; + color: #797676; + border-left: 6px solid #102129; } + .td-content > ul li, .td-content > ol li { + margin-bottom: .25rem; } + .td-content strong { + font-weight: 700; } + .td-content .alert:not(:first-child) { + margin-top: 2rem; + margin-bottom: 2rem; } + .td-content .lead { + margin-bottom: 1.5rem; } + +.td-title { + margin-top: 1rem; + margin-bottom: .5rem; } + @media (min-width: 576px) { + .td-title { + font-size: 3rem; } } +.td-search-input { + background: transparent; + max-width: 90%; + border-radius: 1rem; + font-family: "Font Awesome 5 Free", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; } + .td-search-input.form-control:focus { + border-color: #b6d7e7; + box-shadow: 0 0 0 2px #4298c2; + color: inherit; } + +.popover.offline-search-result { + max-width: 90%; } + .popover.offline-search-result .card, .popover.offline-search-result .td-content .highlight, .td-content .popover.offline-search-result .highlight { + margin-bottom: 0.5rem; } + .popover.offline-search-result .card .card-header, .popover.offline-search-result .td-content .highlight .card-header, .td-content .popover.offline-search-result .highlight .card-header { + font-weight: bold; } + +.td-outer { + display: flex; + flex-direction: column; + height: 100vh; } + +@media (min-width: 768px) { + .td-default main > section:first-of-type { + padding-top: 8rem; } } + +.td-main { + flex-grow: 1; } + .td-main main { + padding-bottom: 2rem; } + @media (min-width: 768px) { + .td-main main { + padding-top: 5.5rem; } } +.td-cover-block--height-min { + min-height: 300px; } + +.td-cover-block--height-med { + min-height: 400px; } + +.td-cover-block--height-max { + min-height: 500px; } + +.td-cover-block--height-full { + min-height: 100vh; } + +@media (min-width: 768px) { + .td-cover-block--height-min { + min-height: 450px; } + .td-cover-block--height-med { + min-height: 500px; } + .td-cover-block--height-max { + min-height: 650px; } } + +.td-cover-logo { + margin-right: 0.5em; } + +.td-cover-block { + position: relative; + padding-top: 5rem; + padding-bottom: 5rem; + background-repeat: no-repeat; + background-position: 50% 0; + background-size: cover; } + .td-cover-block > .byline { + position: absolute; + bottom: 2px; + right: 4px; } + +.td-bg-arrow-wrapper { + position: relative; } + +.section-index .entry { + padding: .75rem; } + +.section-index h5 { + margin-bottom: 0; } + .section-index h5 a { + font-weight: 700; } + +.section-index p { + margin-top: 0; } + +.pageinfo { + font-weight: 500; + background: #f8f9fa; + color: inherit; + border-radius: 0; + margin: 2rem; + padding: 1.5rem; + padding-bottom: 0.5rem; } + .pageinfo-primary { + border-style: solid; + border-color: #1a3f51; } + .pageinfo-secondary { + border-style: solid; + border-color: #102129; } + .pageinfo-success { + border-style: solid; + border-color: #3772FF; } + .pageinfo-info { + border-style: solid; + border-color: #C0E0DE; } + .pageinfo-warning { + border-style: solid; + border-color: #ED6A5A; } + .pageinfo-danger { + border-style: solid; + border-color: #ED6A5A; } + .pageinfo-light { + border-style: solid; + border-color: #D3F3EE; } + .pageinfo-dark { + border-style: solid; + border-color: #403F4C; } + +.taxonomy-terms-article { + width: 100%; + clear: both; + font-size: 0.8rem; } + .taxonomy-terms-article .taxonomy-title { + display: inline; + font-size: 1.25em; + height: 1em; + line-height: 1em; + margin-right: 0.5em; + padding: 0; } + +.taxonomy-terms-cloud { + width: 100%; + clear: both; + font-size: 0.8rem; } + .taxonomy-terms-cloud .taxonomy-title { + display: inline-block; + width: 100%; + font-size: 1rem; + font-weight: 700; + color: #1a3f51; + border-bottom: 1px #1a3f51 solid; + margin-bottom: 1em; + padding-bottom: 0.375rem; + margin-top: 1em; } + +.taxonomy-terms-page { + max-width: 800px; + margin: auto; } + .taxonomy-terms-page h1 { + margin-bottom: 1em; } + .taxonomy-terms-page .taxonomy-terms-cloud { + font-size: 1em; } + .taxonomy-terms-page .taxonomy-terms-cloud li { + display: block; } + .taxonomy-terms-page .taxo-text-tags li + li::before { + content: none; } + .taxonomy-terms-page .taxo-fruits .taxonomy-count, + .taxonomy-terms-page .taxo-fruits .taxonomy-label { + display: inherit; + font-size: 1rem; + margin: 0; + padding: 0; + padding-right: 0.5em; } + .taxonomy-terms-page .taxo-fruits .taxonomy-count::before { + content: "("; } + .taxonomy-terms-page .taxo-fruits .taxonomy-count::after { + content: ")"; } + +.taxonomy-terms { + list-style: none; + margin: 0; + overflow: hidden; + padding: 0; + display: inline; } + .taxonomy-terms li { + display: inline; + overflow-wrap: break-word; + word-wrap: break-word; + -ms-word-break: break-all; + word-break: break-all; + word-break: break-word; + -ms-hyphens: auto; + -moz-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; } + +.taxonomy-count { + font-size: 0.8em; + line-height: 1.25em; + display: inline-block; + padding-left: 0.6em; + padding-right: 0.6em; + margin-left: 0.6em; + text-align: center; + border-radius: 1em; + background-color: #fff; } + +.taxonomy-term { + background: #eee; + border-width: 0; + border-radius: 0 3px 3px 0; + color: #797676; + display: inline-block; + font-size: 1em; + line-height: 1.5em; + min-height: 1.5em; + max-width: 100%; + padding: 0 0.5em 0 1em; + position: relative; + margin: 0 0.5em 0.2em 0; + text-decoration: none; + -webkit-transition: color 0.2s; + -webkit-clip-path: polygon(100% 0, 100% 100%, 0.8em 100%, 0 50%, 0.8em 0); + clip-path: polygon(100% 0, 100% 100%, 0.8em 100%, 0 50%, 0.8em 0); } + .taxonomy-term:hover { + background-color: #1a3f51; + color: #fff; } + .taxonomy-term:hover .taxonomy-count { + color: #403F4C !important; } + .taxonomy-term:hover::before { + background: #1a3f51; } + +.taxo-text-tags .taxonomy-term { + background: none; + border-width: 0; + border-radius: 0; + color: #797676; + font-size: 1em; + line-height: 1.5em; + min-height: 1.5em; + max-width: 100%; + padding: 0; + position: relative; + margin: 0; + text-decoration: none; + -webkit-clip-path: none; + clip-path: none; } + .taxo-text-tags .taxonomy-term:hover { + background: none; + color: #3176d9; } + .taxo-text-tags .taxonomy-term:hover .taxonomy-count { + color: #403F4C !important; } + .taxo-text-tags .taxonomy-term:hover::before { + background: none; } + +.taxo-text-tags li + li::before { + content: "|"; + color: #797676; + margin-right: 0.2em; } + +.taxo-text-tags .taxonomy-count { + font-size: 1em; + line-height: 1.25em; + display: inline-block; + padding: 0; + margin: 0; + text-align: center; + border-radius: 0; + background: none; + vertical-align: super; + font-size: 0.75em; } + +.taxo-text-tags .taxonomy-term:hover .taxonomy-count { + color: #3176d9 !important; } + +.taxo-fruits .taxonomy-term[data-taxonomy-term]::before { + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + padding-right: 0.5em; + font-size: 2em; + min-width: 1.5em; + display: inline-block; } + +.taxo-fruits .taxonomy-term[data-taxonomy-term="apple"]::before { + content: "\f5d1"; + color: red; } + +.taxo-fruits .taxonomy-term[data-taxonomy-term="carrot"]::before { + content: "\f787"; + color: orange; } + +.taxo-fruits .taxonomy-term[data-taxonomy-term="lemon"]::before { + content: "\f094"; + color: limegreen; } + +.taxo-fruits .taxonomy-term[data-taxonomy-term="pepper"]::before { + content: "\f816"; + color: darkred; } + +.taxo-fruits .taxonomy-term { + background: none; + border-width: 0; + border-radius: 0; + color: #797676; + font-size: 1em; + line-height: 2.5em; + max-width: 100%; + padding: 0; + position: relative; + margin: 0; + text-decoration: none; + -webkit-clip-path: none; + clip-path: none; } + .taxo-fruits .taxonomy-term:hover { + background: none; + color: #3176d9; } + .taxo-fruits .taxonomy-term:hover .taxonomy-count { + color: #403F4C !important; } + .taxo-fruits .taxonomy-term:hover::before { + background: none; + text-shadow: 0 0 3px #222; } + +.taxo-fruits .taxonomy-count, +.taxo-fruits .taxonomy-label { + display: none; } + +.taxo-fruits.taxonomy-terms-article { + margin-bottom: 1rem; } + .taxo-fruits.taxonomy-terms-article .taxonomy-title { + display: none; } + +.taxonomy-taxonomy-page { + max-width: 800px; + margin: auto; } + .taxonomy-taxonomy-page h1 { + margin-bottom: 1em; } + +.article-meta { + margin-bottom: 1.5rem; } + +.article-teaser.article-type-docs h3 a:before { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + content: "\f02d"; + padding-right: 0.5em; } + +.article-teaser.article-type-blog h3 a:before { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + content: "\f781"; + padding-right: 0.5em; } + +.all-taxonomy-terms { + font-weight: 500; + line-height: 1.2; + font-size: 1.5rem; } + .all-taxonomy-terms:before { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + content: "\f122"; + padding-right: 0.5em; } + +div.drawio { + display: inline-block; + position: relative; } + div.drawio button { + position: absolute; + font-size: 0.8em; + bottom: 5px; + right: 5px; + background-color: rgba(16, 33, 41, 0.8); + color: #eff7fa; + padding: 0.4em 0.5em; + display: none; } + div.drawio:hover button { + display: inline; } + +div.drawioframe { + position: fixed; + height: 100%; + width: 100%; + top: 0; + left: 0px; + z-index: 1000; + background: #000b; + border: 0; } + div.drawioframe iframe { + position: absolute; + height: 90%; + width: 90%; + top: 5%; + left: 5%; + z-index: 1010; } + +footer { + min-height: 150px; } + @media (max-width: 991.98px) { + footer { + min-height: 200px; } } +@media (min-width: 768px) { + .td-offset-anchor:target { + display: block; + position: relative; + top: -4rem; + visibility: hidden; } + h2[id]:before, + h3[id]:before, + h4[id]:before, + h5[id]:before { + display: block; + content: " "; + margin-top: -5rem; + height: 5rem; + visibility: hidden; } } + +body:lang(fa), +body:lang(ar), +body:lang(az), +body:lang(dv), +body:lang(he), +body:lang(ku), +body:lang(ur) { + direction: rtl; + text-align: right; } + body:lang(fa) .m-0, + body:lang(ar) .m-0, + body:lang(az) .m-0, + body:lang(dv) .m-0, + body:lang(he) .m-0, + body:lang(ku) .m-0, + body:lang(ur) .m-0 { + margin: 0 !important; } + body:lang(fa) .mt-0, + body:lang(fa) .my-0, + body:lang(ar) .mt-0, + body:lang(ar) .my-0, + body:lang(az) .mt-0, + body:lang(az) .my-0, + body:lang(dv) .mt-0, + body:lang(dv) .my-0, + body:lang(he) .mt-0, + body:lang(he) .my-0, + body:lang(ku) .mt-0, + body:lang(ku) .my-0, + body:lang(ur) .mt-0, + body:lang(ur) .my-0 { + margin-top: 0 !important; } + body:lang(fa) .mr-0, + body:lang(fa) .mx-0, + body:lang(ar) .mr-0, + body:lang(ar) .mx-0, + body:lang(az) .mr-0, + body:lang(az) .mx-0, + body:lang(dv) .mr-0, + body:lang(dv) .mx-0, + body:lang(he) .mr-0, + body:lang(he) .mx-0, + body:lang(ku) .mr-0, + body:lang(ku) .mx-0, + body:lang(ur) .mr-0, + body:lang(ur) .mx-0 { + margin-inline-end: 0 !important; } + body:lang(fa) .mb-0, + body:lang(fa) .my-0, + body:lang(ar) .mb-0, + body:lang(ar) .my-0, + body:lang(az) .mb-0, + body:lang(az) .my-0, + body:lang(dv) .mb-0, + body:lang(dv) .my-0, + body:lang(he) .mb-0, + body:lang(he) .my-0, + body:lang(ku) .mb-0, + body:lang(ku) .my-0, + body:lang(ur) .mb-0, + body:lang(ur) .my-0 { + margin-bottom: 0 !important; } + body:lang(fa) .ml-0, + body:lang(fa) .mx-0, + body:lang(ar) .ml-0, + body:lang(ar) .mx-0, + body:lang(az) .ml-0, + body:lang(az) .mx-0, + body:lang(dv) .ml-0, + body:lang(dv) .mx-0, + body:lang(he) .ml-0, + body:lang(he) .mx-0, + body:lang(ku) .ml-0, + body:lang(ku) .mx-0, + body:lang(ur) .ml-0, + body:lang(ur) .mx-0 { + margin-inline-start: 0 !important; } + body:lang(fa) .m-1, + body:lang(ar) .m-1, + body:lang(az) .m-1, + body:lang(dv) .m-1, + body:lang(he) .m-1, + body:lang(ku) .m-1, + body:lang(ur) .m-1 { + margin: 0.25rem !important; } + body:lang(fa) .mt-1, + body:lang(fa) .my-1, + body:lang(ar) .mt-1, + body:lang(ar) .my-1, + body:lang(az) .mt-1, + body:lang(az) .my-1, + body:lang(dv) .mt-1, + body:lang(dv) .my-1, + body:lang(he) .mt-1, + body:lang(he) .my-1, + body:lang(ku) .mt-1, + body:lang(ku) .my-1, + body:lang(ur) .mt-1, + body:lang(ur) .my-1 { + margin-top: 0.25rem !important; } + body:lang(fa) .mr-1, + body:lang(fa) .mx-1, + body:lang(ar) .mr-1, + body:lang(ar) .mx-1, + body:lang(az) .mr-1, + body:lang(az) .mx-1, + body:lang(dv) .mr-1, + body:lang(dv) .mx-1, + body:lang(he) .mr-1, + body:lang(he) .mx-1, + body:lang(ku) .mr-1, + body:lang(ku) .mx-1, + body:lang(ur) .mr-1, + body:lang(ur) .mx-1 { + margin-inline-end: 0.25rem !important; } + body:lang(fa) .mb-1, + body:lang(fa) .my-1, + body:lang(ar) .mb-1, + body:lang(ar) .my-1, + body:lang(az) .mb-1, + body:lang(az) .my-1, + body:lang(dv) .mb-1, + body:lang(dv) .my-1, + body:lang(he) .mb-1, + body:lang(he) .my-1, + body:lang(ku) .mb-1, + body:lang(ku) .my-1, + body:lang(ur) .mb-1, + body:lang(ur) .my-1 { + margin-bottom: 0.25rem !important; } + body:lang(fa) .ml-1, + body:lang(fa) .mx-1, + body:lang(ar) .ml-1, + body:lang(ar) .mx-1, + body:lang(az) .ml-1, + body:lang(az) .mx-1, + body:lang(dv) .ml-1, + body:lang(dv) .mx-1, + body:lang(he) .ml-1, + body:lang(he) .mx-1, + body:lang(ku) .ml-1, + body:lang(ku) .mx-1, + body:lang(ur) .ml-1, + body:lang(ur) .mx-1 { + margin-inline-start: 0.25rem !important; } + body:lang(fa) .m-2, + body:lang(ar) .m-2, + body:lang(az) .m-2, + body:lang(dv) .m-2, + body:lang(he) .m-2, + body:lang(ku) .m-2, + body:lang(ur) .m-2 { + margin: 0.5rem !important; } + body:lang(fa) .mt-2, + body:lang(fa) .my-2, + body:lang(ar) .mt-2, + body:lang(ar) .my-2, + body:lang(az) .mt-2, + body:lang(az) .my-2, + body:lang(dv) .mt-2, + body:lang(dv) .my-2, + body:lang(he) .mt-2, + body:lang(he) .my-2, + body:lang(ku) .mt-2, + body:lang(ku) .my-2, + body:lang(ur) .mt-2, + body:lang(ur) .my-2 { + margin-top: 0.5rem !important; } + body:lang(fa) .mr-2, + body:lang(fa) .mx-2, + body:lang(ar) .mr-2, + body:lang(ar) .mx-2, + body:lang(az) .mr-2, + body:lang(az) .mx-2, + body:lang(dv) .mr-2, + body:lang(dv) .mx-2, + body:lang(he) .mr-2, + body:lang(he) .mx-2, + body:lang(ku) .mr-2, + body:lang(ku) .mx-2, + body:lang(ur) .mr-2, + body:lang(ur) .mx-2 { + margin-inline-end: 0.5rem !important; } + body:lang(fa) .mb-2, + body:lang(fa) .my-2, + body:lang(ar) .mb-2, + body:lang(ar) .my-2, + body:lang(az) .mb-2, + body:lang(az) .my-2, + body:lang(dv) .mb-2, + body:lang(dv) .my-2, + body:lang(he) .mb-2, + body:lang(he) .my-2, + body:lang(ku) .mb-2, + body:lang(ku) .my-2, + body:lang(ur) .mb-2, + body:lang(ur) .my-2 { + margin-bottom: 0.5rem !important; } + body:lang(fa) .ml-2, + body:lang(fa) .mx-2, + body:lang(ar) .ml-2, + body:lang(ar) .mx-2, + body:lang(az) .ml-2, + body:lang(az) .mx-2, + body:lang(dv) .ml-2, + body:lang(dv) .mx-2, + body:lang(he) .ml-2, + body:lang(he) .mx-2, + body:lang(ku) .ml-2, + body:lang(ku) .mx-2, + body:lang(ur) .ml-2, + body:lang(ur) .mx-2 { + margin-inline-start: 0.5rem !important; } + body:lang(fa) .m-3, + body:lang(ar) .m-3, + body:lang(az) .m-3, + body:lang(dv) .m-3, + body:lang(he) .m-3, + body:lang(ku) .m-3, + body:lang(ur) .m-3 { + margin: 1rem !important; } + body:lang(fa) .mt-3, + body:lang(fa) .my-3, + body:lang(ar) .mt-3, + body:lang(ar) .my-3, + body:lang(az) .mt-3, + body:lang(az) .my-3, + body:lang(dv) .mt-3, + body:lang(dv) .my-3, + body:lang(he) .mt-3, + body:lang(he) .my-3, + body:lang(ku) .mt-3, + body:lang(ku) .my-3, + body:lang(ur) .mt-3, + body:lang(ur) .my-3 { + margin-top: 1rem !important; } + body:lang(fa) .mr-3, + body:lang(fa) .mx-3, + body:lang(ar) .mr-3, + body:lang(ar) .mx-3, + body:lang(az) .mr-3, + body:lang(az) .mx-3, + body:lang(dv) .mr-3, + body:lang(dv) .mx-3, + body:lang(he) .mr-3, + body:lang(he) .mx-3, + body:lang(ku) .mr-3, + body:lang(ku) .mx-3, + body:lang(ur) .mr-3, + body:lang(ur) .mx-3 { + margin-inline-end: 1rem !important; } + body:lang(fa) .mb-3, + body:lang(fa) .my-3, + body:lang(ar) .mb-3, + body:lang(ar) .my-3, + body:lang(az) .mb-3, + body:lang(az) .my-3, + body:lang(dv) .mb-3, + body:lang(dv) .my-3, + body:lang(he) .mb-3, + body:lang(he) .my-3, + body:lang(ku) .mb-3, + body:lang(ku) .my-3, + body:lang(ur) .mb-3, + body:lang(ur) .my-3 { + margin-bottom: 1rem !important; } + body:lang(fa) .ml-3, + body:lang(fa) .mx-3, + body:lang(ar) .ml-3, + body:lang(ar) .mx-3, + body:lang(az) .ml-3, + body:lang(az) .mx-3, + body:lang(dv) .ml-3, + body:lang(dv) .mx-3, + body:lang(he) .ml-3, + body:lang(he) .mx-3, + body:lang(ku) .ml-3, + body:lang(ku) .mx-3, + body:lang(ur) .ml-3, + body:lang(ur) .mx-3 { + margin-inline-start: 1rem !important; } + body:lang(fa) .m-4, + body:lang(ar) .m-4, + body:lang(az) .m-4, + body:lang(dv) .m-4, + body:lang(he) .m-4, + body:lang(ku) .m-4, + body:lang(ur) .m-4 { + margin: 1.5rem !important; } + body:lang(fa) .mt-4, + body:lang(fa) .my-4, + body:lang(ar) .mt-4, + body:lang(ar) .my-4, + body:lang(az) .mt-4, + body:lang(az) .my-4, + body:lang(dv) .mt-4, + body:lang(dv) .my-4, + body:lang(he) .mt-4, + body:lang(he) .my-4, + body:lang(ku) .mt-4, + body:lang(ku) .my-4, + body:lang(ur) .mt-4, + body:lang(ur) .my-4 { + margin-top: 1.5rem !important; } + body:lang(fa) .mr-4, + body:lang(fa) .mx-4, + body:lang(ar) .mr-4, + body:lang(ar) .mx-4, + body:lang(az) .mr-4, + body:lang(az) .mx-4, + body:lang(dv) .mr-4, + body:lang(dv) .mx-4, + body:lang(he) .mr-4, + body:lang(he) .mx-4, + body:lang(ku) .mr-4, + body:lang(ku) .mx-4, + body:lang(ur) .mr-4, + body:lang(ur) .mx-4 { + margin-inline-end: 1.5rem !important; } + body:lang(fa) .mb-4, + body:lang(fa) .my-4, + body:lang(ar) .mb-4, + body:lang(ar) .my-4, + body:lang(az) .mb-4, + body:lang(az) .my-4, + body:lang(dv) .mb-4, + body:lang(dv) .my-4, + body:lang(he) .mb-4, + body:lang(he) .my-4, + body:lang(ku) .mb-4, + body:lang(ku) .my-4, + body:lang(ur) .mb-4, + body:lang(ur) .my-4 { + margin-bottom: 1.5rem !important; } + body:lang(fa) .ml-4, + body:lang(fa) .mx-4, + body:lang(ar) .ml-4, + body:lang(ar) .mx-4, + body:lang(az) .ml-4, + body:lang(az) .mx-4, + body:lang(dv) .ml-4, + body:lang(dv) .mx-4, + body:lang(he) .ml-4, + body:lang(he) .mx-4, + body:lang(ku) .ml-4, + body:lang(ku) .mx-4, + body:lang(ur) .ml-4, + body:lang(ur) .mx-4 { + margin-inline-start: 1.5rem !important; } + body:lang(fa) .m-5, + body:lang(ar) .m-5, + body:lang(az) .m-5, + body:lang(dv) .m-5, + body:lang(he) .m-5, + body:lang(ku) .m-5, + body:lang(ur) .m-5 { + margin: 3rem !important; } + body:lang(fa) .mt-5, + body:lang(fa) .my-5, + body:lang(ar) .mt-5, + body:lang(ar) .my-5, + body:lang(az) .mt-5, + body:lang(az) .my-5, + body:lang(dv) .mt-5, + body:lang(dv) .my-5, + body:lang(he) .mt-5, + body:lang(he) .my-5, + body:lang(ku) .mt-5, + body:lang(ku) .my-5, + body:lang(ur) .mt-5, + body:lang(ur) .my-5 { + margin-top: 3rem !important; } + body:lang(fa) .mr-5, + body:lang(fa) .mx-5, + body:lang(ar) .mr-5, + body:lang(ar) .mx-5, + body:lang(az) .mr-5, + body:lang(az) .mx-5, + body:lang(dv) .mr-5, + body:lang(dv) .mx-5, + body:lang(he) .mr-5, + body:lang(he) .mx-5, + body:lang(ku) .mr-5, + body:lang(ku) .mx-5, + body:lang(ur) .mr-5, + body:lang(ur) .mx-5 { + margin-inline-end: 3rem !important; } + body:lang(fa) .mb-5, + body:lang(fa) .my-5, + body:lang(ar) .mb-5, + body:lang(ar) .my-5, + body:lang(az) .mb-5, + body:lang(az) .my-5, + body:lang(dv) .mb-5, + body:lang(dv) .my-5, + body:lang(he) .mb-5, + body:lang(he) .my-5, + body:lang(ku) .mb-5, + body:lang(ku) .my-5, + body:lang(ur) .mb-5, + body:lang(ur) .my-5 { + margin-bottom: 3rem !important; } + body:lang(fa) .ml-5, + body:lang(fa) .mx-5, + body:lang(ar) .ml-5, + body:lang(ar) .mx-5, + body:lang(az) .ml-5, + body:lang(az) .mx-5, + body:lang(dv) .ml-5, + body:lang(dv) .mx-5, + body:lang(he) .ml-5, + body:lang(he) .mx-5, + body:lang(ku) .ml-5, + body:lang(ku) .mx-5, + body:lang(ur) .ml-5, + body:lang(ur) .mx-5 { + margin-inline-start: 3rem !important; } + body:lang(fa) .p-0, + body:lang(ar) .p-0, + body:lang(az) .p-0, + body:lang(dv) .p-0, + body:lang(he) .p-0, + body:lang(ku) .p-0, + body:lang(ur) .p-0 { + padding: 0 !important; } + body:lang(fa) .pt-0, + body:lang(fa) .py-0, + body:lang(ar) .pt-0, + body:lang(ar) .py-0, + body:lang(az) .pt-0, + body:lang(az) .py-0, + body:lang(dv) .pt-0, + body:lang(dv) .py-0, + body:lang(he) .pt-0, + body:lang(he) .py-0, + body:lang(ku) .pt-0, + body:lang(ku) .py-0, + body:lang(ur) .pt-0, + body:lang(ur) .py-0 { + padding-top: 0 !important; } + body:lang(fa) .pr-0, + body:lang(fa) .px-0, + body:lang(ar) .pr-0, + body:lang(ar) .px-0, + body:lang(az) .pr-0, + body:lang(az) .px-0, + body:lang(dv) .pr-0, + body:lang(dv) .px-0, + body:lang(he) .pr-0, + body:lang(he) .px-0, + body:lang(ku) .pr-0, + body:lang(ku) .px-0, + body:lang(ur) .pr-0, + body:lang(ur) .px-0 { + padding-inline-end: 0 !important; } + body:lang(fa) .pb-0, + body:lang(fa) .py-0, + body:lang(ar) .pb-0, + body:lang(ar) .py-0, + body:lang(az) .pb-0, + body:lang(az) .py-0, + body:lang(dv) .pb-0, + body:lang(dv) .py-0, + body:lang(he) .pb-0, + body:lang(he) .py-0, + body:lang(ku) .pb-0, + body:lang(ku) .py-0, + body:lang(ur) .pb-0, + body:lang(ur) .py-0 { + padding-bottom: 0 !important; } + body:lang(fa) .pl-0, + body:lang(fa) .px-0, + body:lang(ar) .pl-0, + body:lang(ar) .px-0, + body:lang(az) .pl-0, + body:lang(az) .px-0, + body:lang(dv) .pl-0, + body:lang(dv) .px-0, + body:lang(he) .pl-0, + body:lang(he) .px-0, + body:lang(ku) .pl-0, + body:lang(ku) .px-0, + body:lang(ur) .pl-0, + body:lang(ur) .px-0 { + padding-inline-start: 0 !important; } + body:lang(fa) .p-1, + body:lang(ar) .p-1, + body:lang(az) .p-1, + body:lang(dv) .p-1, + body:lang(he) .p-1, + body:lang(ku) .p-1, + body:lang(ur) .p-1 { + padding: 0.25rem !important; } + body:lang(fa) .pt-1, + body:lang(fa) .py-1, + body:lang(ar) .pt-1, + body:lang(ar) .py-1, + body:lang(az) .pt-1, + body:lang(az) .py-1, + body:lang(dv) .pt-1, + body:lang(dv) .py-1, + body:lang(he) .pt-1, + body:lang(he) .py-1, + body:lang(ku) .pt-1, + body:lang(ku) .py-1, + body:lang(ur) .pt-1, + body:lang(ur) .py-1 { + padding-top: 0.25rem !important; } + body:lang(fa) .pr-1, + body:lang(fa) .px-1, + body:lang(ar) .pr-1, + body:lang(ar) .px-1, + body:lang(az) .pr-1, + body:lang(az) .px-1, + body:lang(dv) .pr-1, + body:lang(dv) .px-1, + body:lang(he) .pr-1, + body:lang(he) .px-1, + body:lang(ku) .pr-1, + body:lang(ku) .px-1, + body:lang(ur) .pr-1, + body:lang(ur) .px-1 { + padding-inline-end: 0.25rem !important; } + body:lang(fa) .pb-1, + body:lang(fa) .py-1, + body:lang(ar) .pb-1, + body:lang(ar) .py-1, + body:lang(az) .pb-1, + body:lang(az) .py-1, + body:lang(dv) .pb-1, + body:lang(dv) .py-1, + body:lang(he) .pb-1, + body:lang(he) .py-1, + body:lang(ku) .pb-1, + body:lang(ku) .py-1, + body:lang(ur) .pb-1, + body:lang(ur) .py-1 { + padding-bottom: 0.25rem !important; } + body:lang(fa) .pl-1, + body:lang(fa) .px-1, + body:lang(ar) .pl-1, + body:lang(ar) .px-1, + body:lang(az) .pl-1, + body:lang(az) .px-1, + body:lang(dv) .pl-1, + body:lang(dv) .px-1, + body:lang(he) .pl-1, + body:lang(he) .px-1, + body:lang(ku) .pl-1, + body:lang(ku) .px-1, + body:lang(ur) .pl-1, + body:lang(ur) .px-1 { + padding-inline-start: 0.25rem !important; } + body:lang(fa) .p-2, + body:lang(ar) .p-2, + body:lang(az) .p-2, + body:lang(dv) .p-2, + body:lang(he) .p-2, + body:lang(ku) .p-2, + body:lang(ur) .p-2 { + padding: 0.5rem !important; } + body:lang(fa) .pt-2, + body:lang(fa) .py-2, + body:lang(ar) .pt-2, + body:lang(ar) .py-2, + body:lang(az) .pt-2, + body:lang(az) .py-2, + body:lang(dv) .pt-2, + body:lang(dv) .py-2, + body:lang(he) .pt-2, + body:lang(he) .py-2, + body:lang(ku) .pt-2, + body:lang(ku) .py-2, + body:lang(ur) .pt-2, + body:lang(ur) .py-2 { + padding-top: 0.5rem !important; } + body:lang(fa) .pr-2, + body:lang(fa) .px-2, + body:lang(ar) .pr-2, + body:lang(ar) .px-2, + body:lang(az) .pr-2, + body:lang(az) .px-2, + body:lang(dv) .pr-2, + body:lang(dv) .px-2, + body:lang(he) .pr-2, + body:lang(he) .px-2, + body:lang(ku) .pr-2, + body:lang(ku) .px-2, + body:lang(ur) .pr-2, + body:lang(ur) .px-2 { + padding-inline-end: 0.5rem !important; } + body:lang(fa) .pb-2, + body:lang(fa) .py-2, + body:lang(ar) .pb-2, + body:lang(ar) .py-2, + body:lang(az) .pb-2, + body:lang(az) .py-2, + body:lang(dv) .pb-2, + body:lang(dv) .py-2, + body:lang(he) .pb-2, + body:lang(he) .py-2, + body:lang(ku) .pb-2, + body:lang(ku) .py-2, + body:lang(ur) .pb-2, + body:lang(ur) .py-2 { + padding-bottom: 0.5rem !important; } + body:lang(fa) .pl-2, + body:lang(fa) .px-2, + body:lang(ar) .pl-2, + body:lang(ar) .px-2, + body:lang(az) .pl-2, + body:lang(az) .px-2, + body:lang(dv) .pl-2, + body:lang(dv) .px-2, + body:lang(he) .pl-2, + body:lang(he) .px-2, + body:lang(ku) .pl-2, + body:lang(ku) .px-2, + body:lang(ur) .pl-2, + body:lang(ur) .px-2 { + padding-inline-start: 0.5rem !important; } + body:lang(fa) .p-3, + body:lang(ar) .p-3, + body:lang(az) .p-3, + body:lang(dv) .p-3, + body:lang(he) .p-3, + body:lang(ku) .p-3, + body:lang(ur) .p-3 { + padding: 1rem !important; } + body:lang(fa) .pt-3, + body:lang(fa) .py-3, + body:lang(ar) .pt-3, + body:lang(ar) .py-3, + body:lang(az) .pt-3, + body:lang(az) .py-3, + body:lang(dv) .pt-3, + body:lang(dv) .py-3, + body:lang(he) .pt-3, + body:lang(he) .py-3, + body:lang(ku) .pt-3, + body:lang(ku) .py-3, + body:lang(ur) .pt-3, + body:lang(ur) .py-3 { + padding-top: 1rem !important; } + body:lang(fa) .pr-3, + body:lang(fa) .px-3, + body:lang(ar) .pr-3, + body:lang(ar) .px-3, + body:lang(az) .pr-3, + body:lang(az) .px-3, + body:lang(dv) .pr-3, + body:lang(dv) .px-3, + body:lang(he) .pr-3, + body:lang(he) .px-3, + body:lang(ku) .pr-3, + body:lang(ku) .px-3, + body:lang(ur) .pr-3, + body:lang(ur) .px-3 { + padding-inline-end: 1rem !important; } + body:lang(fa) .pb-3, + body:lang(fa) .py-3, + body:lang(ar) .pb-3, + body:lang(ar) .py-3, + body:lang(az) .pb-3, + body:lang(az) .py-3, + body:lang(dv) .pb-3, + body:lang(dv) .py-3, + body:lang(he) .pb-3, + body:lang(he) .py-3, + body:lang(ku) .pb-3, + body:lang(ku) .py-3, + body:lang(ur) .pb-3, + body:lang(ur) .py-3 { + padding-bottom: 1rem !important; } + body:lang(fa) .pl-3, + body:lang(fa) .px-3, + body:lang(ar) .pl-3, + body:lang(ar) .px-3, + body:lang(az) .pl-3, + body:lang(az) .px-3, + body:lang(dv) .pl-3, + body:lang(dv) .px-3, + body:lang(he) .pl-3, + body:lang(he) .px-3, + body:lang(ku) .pl-3, + body:lang(ku) .px-3, + body:lang(ur) .pl-3, + body:lang(ur) .px-3 { + padding-inline-start: 1rem !important; } + body:lang(fa) .p-4, + body:lang(ar) .p-4, + body:lang(az) .p-4, + body:lang(dv) .p-4, + body:lang(he) .p-4, + body:lang(ku) .p-4, + body:lang(ur) .p-4 { + padding: 1.5rem !important; } + body:lang(fa) .pt-4, + body:lang(fa) .py-4, + body:lang(ar) .pt-4, + body:lang(ar) .py-4, + body:lang(az) .pt-4, + body:lang(az) .py-4, + body:lang(dv) .pt-4, + body:lang(dv) .py-4, + body:lang(he) .pt-4, + body:lang(he) .py-4, + body:lang(ku) .pt-4, + body:lang(ku) .py-4, + body:lang(ur) .pt-4, + body:lang(ur) .py-4 { + padding-top: 1.5rem !important; } + body:lang(fa) .pr-4, + body:lang(fa) .px-4, + body:lang(ar) .pr-4, + body:lang(ar) .px-4, + body:lang(az) .pr-4, + body:lang(az) .px-4, + body:lang(dv) .pr-4, + body:lang(dv) .px-4, + body:lang(he) .pr-4, + body:lang(he) .px-4, + body:lang(ku) .pr-4, + body:lang(ku) .px-4, + body:lang(ur) .pr-4, + body:lang(ur) .px-4 { + padding-inline-end: 1.5rem !important; } + body:lang(fa) .pb-4, + body:lang(fa) .py-4, + body:lang(ar) .pb-4, + body:lang(ar) .py-4, + body:lang(az) .pb-4, + body:lang(az) .py-4, + body:lang(dv) .pb-4, + body:lang(dv) .py-4, + body:lang(he) .pb-4, + body:lang(he) .py-4, + body:lang(ku) .pb-4, + body:lang(ku) .py-4, + body:lang(ur) .pb-4, + body:lang(ur) .py-4 { + padding-bottom: 1.5rem !important; } + body:lang(fa) .pl-4, + body:lang(fa) .px-4, + body:lang(ar) .pl-4, + body:lang(ar) .px-4, + body:lang(az) .pl-4, + body:lang(az) .px-4, + body:lang(dv) .pl-4, + body:lang(dv) .px-4, + body:lang(he) .pl-4, + body:lang(he) .px-4, + body:lang(ku) .pl-4, + body:lang(ku) .px-4, + body:lang(ur) .pl-4, + body:lang(ur) .px-4 { + padding-inline-start: 1.5rem !important; } + body:lang(fa) .p-5, + body:lang(ar) .p-5, + body:lang(az) .p-5, + body:lang(dv) .p-5, + body:lang(he) .p-5, + body:lang(ku) .p-5, + body:lang(ur) .p-5 { + padding: 3rem !important; } + body:lang(fa) .pt-5, + body:lang(fa) .py-5, + body:lang(ar) .pt-5, + body:lang(ar) .py-5, + body:lang(az) .pt-5, + body:lang(az) .py-5, + body:lang(dv) .pt-5, + body:lang(dv) .py-5, + body:lang(he) .pt-5, + body:lang(he) .py-5, + body:lang(ku) .pt-5, + body:lang(ku) .py-5, + body:lang(ur) .pt-5, + body:lang(ur) .py-5 { + padding-top: 3rem !important; } + body:lang(fa) .pr-5, + body:lang(fa) .px-5, + body:lang(ar) .pr-5, + body:lang(ar) .px-5, + body:lang(az) .pr-5, + body:lang(az) .px-5, + body:lang(dv) .pr-5, + body:lang(dv) .px-5, + body:lang(he) .pr-5, + body:lang(he) .px-5, + body:lang(ku) .pr-5, + body:lang(ku) .px-5, + body:lang(ur) .pr-5, + body:lang(ur) .px-5 { + padding-inline-end: 3rem !important; } + body:lang(fa) .pb-5, + body:lang(fa) .py-5, + body:lang(ar) .pb-5, + body:lang(ar) .py-5, + body:lang(az) .pb-5, + body:lang(az) .py-5, + body:lang(dv) .pb-5, + body:lang(dv) .py-5, + body:lang(he) .pb-5, + body:lang(he) .py-5, + body:lang(ku) .pb-5, + body:lang(ku) .py-5, + body:lang(ur) .pb-5, + body:lang(ur) .py-5 { + padding-bottom: 3rem !important; } + body:lang(fa) .pl-5, + body:lang(fa) .px-5, + body:lang(ar) .pl-5, + body:lang(ar) .px-5, + body:lang(az) .pl-5, + body:lang(az) .px-5, + body:lang(dv) .pl-5, + body:lang(dv) .px-5, + body:lang(he) .pl-5, + body:lang(he) .px-5, + body:lang(ku) .pl-5, + body:lang(ku) .px-5, + body:lang(ur) .pl-5, + body:lang(ur) .px-5 { + padding-inline-start: 3rem !important; } + body:lang(fa) .m-n1, + body:lang(ar) .m-n1, + body:lang(az) .m-n1, + body:lang(dv) .m-n1, + body:lang(he) .m-n1, + body:lang(ku) .m-n1, + body:lang(ur) .m-n1 { + margin: -0.25rem !important; } + body:lang(fa) .mt-n1, + body:lang(fa) .my-n1, + body:lang(ar) .mt-n1, + body:lang(ar) .my-n1, + body:lang(az) .mt-n1, + body:lang(az) .my-n1, + body:lang(dv) .mt-n1, + body:lang(dv) .my-n1, + body:lang(he) .mt-n1, + body:lang(he) .my-n1, + body:lang(ku) .mt-n1, + body:lang(ku) .my-n1, + body:lang(ur) .mt-n1, + body:lang(ur) .my-n1 { + margin-top: -0.25rem !important; } + body:lang(fa) .mr-n1, + body:lang(fa) .mx-n1, + body:lang(ar) .mr-n1, + body:lang(ar) .mx-n1, + body:lang(az) .mr-n1, + body:lang(az) .mx-n1, + body:lang(dv) .mr-n1, + body:lang(dv) .mx-n1, + body:lang(he) .mr-n1, + body:lang(he) .mx-n1, + body:lang(ku) .mr-n1, + body:lang(ku) .mx-n1, + body:lang(ur) .mr-n1, + body:lang(ur) .mx-n1 { + margin-right: -0.25rem !important; } + body:lang(fa) .mb-n1, + body:lang(fa) .my-n1, + body:lang(ar) .mb-n1, + body:lang(ar) .my-n1, + body:lang(az) .mb-n1, + body:lang(az) .my-n1, + body:lang(dv) .mb-n1, + body:lang(dv) .my-n1, + body:lang(he) .mb-n1, + body:lang(he) .my-n1, + body:lang(ku) .mb-n1, + body:lang(ku) .my-n1, + body:lang(ur) .mb-n1, + body:lang(ur) .my-n1 { + margin-bottom: -0.25rem !important; } + body:lang(fa) .ml-n1, + body:lang(fa) .mx-n1, + body:lang(ar) .ml-n1, + body:lang(ar) .mx-n1, + body:lang(az) .ml-n1, + body:lang(az) .mx-n1, + body:lang(dv) .ml-n1, + body:lang(dv) .mx-n1, + body:lang(he) .ml-n1, + body:lang(he) .mx-n1, + body:lang(ku) .ml-n1, + body:lang(ku) .mx-n1, + body:lang(ur) .ml-n1, + body:lang(ur) .mx-n1 { + margin-left: -0.25rem !important; } + body:lang(fa) .m-n2, + body:lang(ar) .m-n2, + body:lang(az) .m-n2, + body:lang(dv) .m-n2, + body:lang(he) .m-n2, + body:lang(ku) .m-n2, + body:lang(ur) .m-n2 { + margin: -0.5rem !important; } + body:lang(fa) .mt-n2, + body:lang(fa) .my-n2, + body:lang(ar) .mt-n2, + body:lang(ar) .my-n2, + body:lang(az) .mt-n2, + body:lang(az) .my-n2, + body:lang(dv) .mt-n2, + body:lang(dv) .my-n2, + body:lang(he) .mt-n2, + body:lang(he) .my-n2, + body:lang(ku) .mt-n2, + body:lang(ku) .my-n2, + body:lang(ur) .mt-n2, + body:lang(ur) .my-n2 { + margin-top: -0.5rem !important; } + body:lang(fa) .mr-n2, + body:lang(fa) .mx-n2, + body:lang(ar) .mr-n2, + body:lang(ar) .mx-n2, + body:lang(az) .mr-n2, + body:lang(az) .mx-n2, + body:lang(dv) .mr-n2, + body:lang(dv) .mx-n2, + body:lang(he) .mr-n2, + body:lang(he) .mx-n2, + body:lang(ku) .mr-n2, + body:lang(ku) .mx-n2, + body:lang(ur) .mr-n2, + body:lang(ur) .mx-n2 { + margin-right: -0.5rem !important; } + body:lang(fa) .mb-n2, + body:lang(fa) .my-n2, + body:lang(ar) .mb-n2, + body:lang(ar) .my-n2, + body:lang(az) .mb-n2, + body:lang(az) .my-n2, + body:lang(dv) .mb-n2, + body:lang(dv) .my-n2, + body:lang(he) .mb-n2, + body:lang(he) .my-n2, + body:lang(ku) .mb-n2, + body:lang(ku) .my-n2, + body:lang(ur) .mb-n2, + body:lang(ur) .my-n2 { + margin-bottom: -0.5rem !important; } + body:lang(fa) .ml-n2, + body:lang(fa) .mx-n2, + body:lang(ar) .ml-n2, + body:lang(ar) .mx-n2, + body:lang(az) .ml-n2, + body:lang(az) .mx-n2, + body:lang(dv) .ml-n2, + body:lang(dv) .mx-n2, + body:lang(he) .ml-n2, + body:lang(he) .mx-n2, + body:lang(ku) .ml-n2, + body:lang(ku) .mx-n2, + body:lang(ur) .ml-n2, + body:lang(ur) .mx-n2 { + margin-left: -0.5rem !important; } + body:lang(fa) .m-n3, + body:lang(ar) .m-n3, + body:lang(az) .m-n3, + body:lang(dv) .m-n3, + body:lang(he) .m-n3, + body:lang(ku) .m-n3, + body:lang(ur) .m-n3 { + margin: -1rem !important; } + body:lang(fa) .mt-n3, + body:lang(fa) .my-n3, + body:lang(ar) .mt-n3, + body:lang(ar) .my-n3, + body:lang(az) .mt-n3, + body:lang(az) .my-n3, + body:lang(dv) .mt-n3, + body:lang(dv) .my-n3, + body:lang(he) .mt-n3, + body:lang(he) .my-n3, + body:lang(ku) .mt-n3, + body:lang(ku) .my-n3, + body:lang(ur) .mt-n3, + body:lang(ur) .my-n3 { + margin-top: -1rem !important; } + body:lang(fa) .mr-n3, + body:lang(fa) .mx-n3, + body:lang(ar) .mr-n3, + body:lang(ar) .mx-n3, + body:lang(az) .mr-n3, + body:lang(az) .mx-n3, + body:lang(dv) .mr-n3, + body:lang(dv) .mx-n3, + body:lang(he) .mr-n3, + body:lang(he) .mx-n3, + body:lang(ku) .mr-n3, + body:lang(ku) .mx-n3, + body:lang(ur) .mr-n3, + body:lang(ur) .mx-n3 { + margin-right: -1rem !important; } + body:lang(fa) .mb-n3, + body:lang(fa) .my-n3, + body:lang(ar) .mb-n3, + body:lang(ar) .my-n3, + body:lang(az) .mb-n3, + body:lang(az) .my-n3, + body:lang(dv) .mb-n3, + body:lang(dv) .my-n3, + body:lang(he) .mb-n3, + body:lang(he) .my-n3, + body:lang(ku) .mb-n3, + body:lang(ku) .my-n3, + body:lang(ur) .mb-n3, + body:lang(ur) .my-n3 { + margin-bottom: -1rem !important; } + body:lang(fa) .ml-n3, + body:lang(fa) .mx-n3, + body:lang(ar) .ml-n3, + body:lang(ar) .mx-n3, + body:lang(az) .ml-n3, + body:lang(az) .mx-n3, + body:lang(dv) .ml-n3, + body:lang(dv) .mx-n3, + body:lang(he) .ml-n3, + body:lang(he) .mx-n3, + body:lang(ku) .ml-n3, + body:lang(ku) .mx-n3, + body:lang(ur) .ml-n3, + body:lang(ur) .mx-n3 { + margin-left: -1rem !important; } + body:lang(fa) .m-n4, + body:lang(ar) .m-n4, + body:lang(az) .m-n4, + body:lang(dv) .m-n4, + body:lang(he) .m-n4, + body:lang(ku) .m-n4, + body:lang(ur) .m-n4 { + margin: -1.5rem !important; } + body:lang(fa) .mt-n4, + body:lang(fa) .my-n4, + body:lang(ar) .mt-n4, + body:lang(ar) .my-n4, + body:lang(az) .mt-n4, + body:lang(az) .my-n4, + body:lang(dv) .mt-n4, + body:lang(dv) .my-n4, + body:lang(he) .mt-n4, + body:lang(he) .my-n4, + body:lang(ku) .mt-n4, + body:lang(ku) .my-n4, + body:lang(ur) .mt-n4, + body:lang(ur) .my-n4 { + margin-top: -1.5rem !important; } + body:lang(fa) .mr-n4, + body:lang(fa) .mx-n4, + body:lang(ar) .mr-n4, + body:lang(ar) .mx-n4, + body:lang(az) .mr-n4, + body:lang(az) .mx-n4, + body:lang(dv) .mr-n4, + body:lang(dv) .mx-n4, + body:lang(he) .mr-n4, + body:lang(he) .mx-n4, + body:lang(ku) .mr-n4, + body:lang(ku) .mx-n4, + body:lang(ur) .mr-n4, + body:lang(ur) .mx-n4 { + margin-right: -1.5rem !important; } + body:lang(fa) .mb-n4, + body:lang(fa) .my-n4, + body:lang(ar) .mb-n4, + body:lang(ar) .my-n4, + body:lang(az) .mb-n4, + body:lang(az) .my-n4, + body:lang(dv) .mb-n4, + body:lang(dv) .my-n4, + body:lang(he) .mb-n4, + body:lang(he) .my-n4, + body:lang(ku) .mb-n4, + body:lang(ku) .my-n4, + body:lang(ur) .mb-n4, + body:lang(ur) .my-n4 { + margin-bottom: -1.5rem !important; } + body:lang(fa) .ml-n4, + body:lang(fa) .mx-n4, + body:lang(ar) .ml-n4, + body:lang(ar) .mx-n4, + body:lang(az) .ml-n4, + body:lang(az) .mx-n4, + body:lang(dv) .ml-n4, + body:lang(dv) .mx-n4, + body:lang(he) .ml-n4, + body:lang(he) .mx-n4, + body:lang(ku) .ml-n4, + body:lang(ku) .mx-n4, + body:lang(ur) .ml-n4, + body:lang(ur) .mx-n4 { + margin-left: -1.5rem !important; } + body:lang(fa) .m-n5, + body:lang(ar) .m-n5, + body:lang(az) .m-n5, + body:lang(dv) .m-n5, + body:lang(he) .m-n5, + body:lang(ku) .m-n5, + body:lang(ur) .m-n5 { + margin: -3rem !important; } + body:lang(fa) .mt-n5, + body:lang(fa) .my-n5, + body:lang(ar) .mt-n5, + body:lang(ar) .my-n5, + body:lang(az) .mt-n5, + body:lang(az) .my-n5, + body:lang(dv) .mt-n5, + body:lang(dv) .my-n5, + body:lang(he) .mt-n5, + body:lang(he) .my-n5, + body:lang(ku) .mt-n5, + body:lang(ku) .my-n5, + body:lang(ur) .mt-n5, + body:lang(ur) .my-n5 { + margin-top: -3rem !important; } + body:lang(fa) .mr-n5, + body:lang(fa) .mx-n5, + body:lang(ar) .mr-n5, + body:lang(ar) .mx-n5, + body:lang(az) .mr-n5, + body:lang(az) .mx-n5, + body:lang(dv) .mr-n5, + body:lang(dv) .mx-n5, + body:lang(he) .mr-n5, + body:lang(he) .mx-n5, + body:lang(ku) .mr-n5, + body:lang(ku) .mx-n5, + body:lang(ur) .mr-n5, + body:lang(ur) .mx-n5 { + margin-right: -3rem !important; } + body:lang(fa) .mb-n5, + body:lang(fa) .my-n5, + body:lang(ar) .mb-n5, + body:lang(ar) .my-n5, + body:lang(az) .mb-n5, + body:lang(az) .my-n5, + body:lang(dv) .mb-n5, + body:lang(dv) .my-n5, + body:lang(he) .mb-n5, + body:lang(he) .my-n5, + body:lang(ku) .mb-n5, + body:lang(ku) .my-n5, + body:lang(ur) .mb-n5, + body:lang(ur) .my-n5 { + margin-bottom: -3rem !important; } + body:lang(fa) .ml-n5, + body:lang(fa) .mx-n5, + body:lang(ar) .ml-n5, + body:lang(ar) .mx-n5, + body:lang(az) .ml-n5, + body:lang(az) .mx-n5, + body:lang(dv) .ml-n5, + body:lang(dv) .mx-n5, + body:lang(he) .ml-n5, + body:lang(he) .mx-n5, + body:lang(ku) .ml-n5, + body:lang(ku) .mx-n5, + body:lang(ur) .ml-n5, + body:lang(ur) .mx-n5 { + margin-left: -3rem !important; } + body:lang(fa) .m-auto, + body:lang(ar) .m-auto, + body:lang(az) .m-auto, + body:lang(dv) .m-auto, + body:lang(he) .m-auto, + body:lang(ku) .m-auto, + body:lang(ur) .m-auto { + margin: auto !important; } + body:lang(fa) .mt-auto, + body:lang(fa) .my-auto, + body:lang(ar) .mt-auto, + body:lang(ar) .my-auto, + body:lang(az) .mt-auto, + body:lang(az) .my-auto, + body:lang(dv) .mt-auto, + body:lang(dv) .my-auto, + body:lang(he) .mt-auto, + body:lang(he) .my-auto, + body:lang(ku) .mt-auto, + body:lang(ku) .my-auto, + body:lang(ur) .mt-auto, + body:lang(ur) .my-auto { + margin-top: auto !important; } + body:lang(fa) .mr-auto, + body:lang(fa) .mx-auto, + body:lang(ar) .mr-auto, + body:lang(ar) .mx-auto, + body:lang(az) .mr-auto, + body:lang(az) .mx-auto, + body:lang(dv) .mr-auto, + body:lang(dv) .mx-auto, + body:lang(he) .mr-auto, + body:lang(he) .mx-auto, + body:lang(ku) .mr-auto, + body:lang(ku) .mx-auto, + body:lang(ur) .mr-auto, + body:lang(ur) .mx-auto { + margin-right: auto !important; } + body:lang(fa) .mb-auto, + body:lang(fa) .my-auto, + body:lang(ar) .mb-auto, + body:lang(ar) .my-auto, + body:lang(az) .mb-auto, + body:lang(az) .my-auto, + body:lang(dv) .mb-auto, + body:lang(dv) .my-auto, + body:lang(he) .mb-auto, + body:lang(he) .my-auto, + body:lang(ku) .mb-auto, + body:lang(ku) .my-auto, + body:lang(ur) .mb-auto, + body:lang(ur) .my-auto { + margin-bottom: auto !important; } + body:lang(fa) .ml-auto, + body:lang(fa) .mx-auto, + body:lang(ar) .ml-auto, + body:lang(ar) .mx-auto, + body:lang(az) .ml-auto, + body:lang(az) .mx-auto, + body:lang(dv) .ml-auto, + body:lang(dv) .mx-auto, + body:lang(he) .ml-auto, + body:lang(he) .mx-auto, + body:lang(ku) .ml-auto, + body:lang(ku) .mx-auto, + body:lang(ur) .ml-auto, + body:lang(ur) .mx-auto { + margin-left: auto !important; } + @media (min-width: 576px) { + body:lang(fa) .m-sm-0, + body:lang(ar) .m-sm-0, + body:lang(az) .m-sm-0, + body:lang(dv) .m-sm-0, + body:lang(he) .m-sm-0, + body:lang(ku) .m-sm-0, + body:lang(ur) .m-sm-0 { + margin: 0 !important; } + body:lang(fa) .mt-sm-0, + body:lang(fa) .my-sm-0, + body:lang(ar) .mt-sm-0, + body:lang(ar) .my-sm-0, + body:lang(az) .mt-sm-0, + body:lang(az) .my-sm-0, + body:lang(dv) .mt-sm-0, + body:lang(dv) .my-sm-0, + body:lang(he) .mt-sm-0, + body:lang(he) .my-sm-0, + body:lang(ku) .mt-sm-0, + body:lang(ku) .my-sm-0, + body:lang(ur) .mt-sm-0, + body:lang(ur) .my-sm-0 { + margin-top: 0 !important; } + body:lang(fa) .mr-sm-0, + body:lang(fa) .mx-sm-0, + body:lang(ar) .mr-sm-0, + body:lang(ar) .mx-sm-0, + body:lang(az) .mr-sm-0, + body:lang(az) .mx-sm-0, + body:lang(dv) .mr-sm-0, + body:lang(dv) .mx-sm-0, + body:lang(he) .mr-sm-0, + body:lang(he) .mx-sm-0, + body:lang(ku) .mr-sm-0, + body:lang(ku) .mx-sm-0, + body:lang(ur) .mr-sm-0, + body:lang(ur) .mx-sm-0 { + margin-inline-end: 0 !important; } + body:lang(fa) .mb-sm-0, + body:lang(fa) .my-sm-0, + body:lang(ar) .mb-sm-0, + body:lang(ar) .my-sm-0, + body:lang(az) .mb-sm-0, + body:lang(az) .my-sm-0, + body:lang(dv) .mb-sm-0, + body:lang(dv) .my-sm-0, + body:lang(he) .mb-sm-0, + body:lang(he) .my-sm-0, + body:lang(ku) .mb-sm-0, + body:lang(ku) .my-sm-0, + body:lang(ur) .mb-sm-0, + body:lang(ur) .my-sm-0 { + margin-bottom: 0 !important; } + body:lang(fa) .ml-sm-0, + body:lang(fa) .mx-sm-0, + body:lang(ar) .ml-sm-0, + body:lang(ar) .mx-sm-0, + body:lang(az) .ml-sm-0, + body:lang(az) .mx-sm-0, + body:lang(dv) .ml-sm-0, + body:lang(dv) .mx-sm-0, + body:lang(he) .ml-sm-0, + body:lang(he) .mx-sm-0, + body:lang(ku) .ml-sm-0, + body:lang(ku) .mx-sm-0, + body:lang(ur) .ml-sm-0, + body:lang(ur) .mx-sm-0 { + margin-inline-start: 0 !important; } + body:lang(fa) .m-sm-1, + body:lang(ar) .m-sm-1, + body:lang(az) .m-sm-1, + body:lang(dv) .m-sm-1, + body:lang(he) .m-sm-1, + body:lang(ku) .m-sm-1, + body:lang(ur) .m-sm-1 { + margin: 0.25rem !important; } + body:lang(fa) .mt-sm-1, + body:lang(fa) .my-sm-1, + body:lang(ar) .mt-sm-1, + body:lang(ar) .my-sm-1, + body:lang(az) .mt-sm-1, + body:lang(az) .my-sm-1, + body:lang(dv) .mt-sm-1, + body:lang(dv) .my-sm-1, + body:lang(he) .mt-sm-1, + body:lang(he) .my-sm-1, + body:lang(ku) .mt-sm-1, + body:lang(ku) .my-sm-1, + body:lang(ur) .mt-sm-1, + body:lang(ur) .my-sm-1 { + margin-top: 0.25rem !important; } + body:lang(fa) .mr-sm-1, + body:lang(fa) .mx-sm-1, + body:lang(ar) .mr-sm-1, + body:lang(ar) .mx-sm-1, + body:lang(az) .mr-sm-1, + body:lang(az) .mx-sm-1, + body:lang(dv) .mr-sm-1, + body:lang(dv) .mx-sm-1, + body:lang(he) .mr-sm-1, + body:lang(he) .mx-sm-1, + body:lang(ku) .mr-sm-1, + body:lang(ku) .mx-sm-1, + body:lang(ur) .mr-sm-1, + body:lang(ur) .mx-sm-1 { + margin-inline-end: 0.25rem !important; } + body:lang(fa) .mb-sm-1, + body:lang(fa) .my-sm-1, + body:lang(ar) .mb-sm-1, + body:lang(ar) .my-sm-1, + body:lang(az) .mb-sm-1, + body:lang(az) .my-sm-1, + body:lang(dv) .mb-sm-1, + body:lang(dv) .my-sm-1, + body:lang(he) .mb-sm-1, + body:lang(he) .my-sm-1, + body:lang(ku) .mb-sm-1, + body:lang(ku) .my-sm-1, + body:lang(ur) .mb-sm-1, + body:lang(ur) .my-sm-1 { + margin-bottom: 0.25rem !important; } + body:lang(fa) .ml-sm-1, + body:lang(fa) .mx-sm-1, + body:lang(ar) .ml-sm-1, + body:lang(ar) .mx-sm-1, + body:lang(az) .ml-sm-1, + body:lang(az) .mx-sm-1, + body:lang(dv) .ml-sm-1, + body:lang(dv) .mx-sm-1, + body:lang(he) .ml-sm-1, + body:lang(he) .mx-sm-1, + body:lang(ku) .ml-sm-1, + body:lang(ku) .mx-sm-1, + body:lang(ur) .ml-sm-1, + body:lang(ur) .mx-sm-1 { + margin-inline-start: 0.25rem !important; } + body:lang(fa) .m-sm-2, + body:lang(ar) .m-sm-2, + body:lang(az) .m-sm-2, + body:lang(dv) .m-sm-2, + body:lang(he) .m-sm-2, + body:lang(ku) .m-sm-2, + body:lang(ur) .m-sm-2 { + margin: 0.5rem !important; } + body:lang(fa) .mt-sm-2, + body:lang(fa) .my-sm-2, + body:lang(ar) .mt-sm-2, + body:lang(ar) .my-sm-2, + body:lang(az) .mt-sm-2, + body:lang(az) .my-sm-2, + body:lang(dv) .mt-sm-2, + body:lang(dv) .my-sm-2, + body:lang(he) .mt-sm-2, + body:lang(he) .my-sm-2, + body:lang(ku) .mt-sm-2, + body:lang(ku) .my-sm-2, + body:lang(ur) .mt-sm-2, + body:lang(ur) .my-sm-2 { + margin-top: 0.5rem !important; } + body:lang(fa) .mr-sm-2, + body:lang(fa) .mx-sm-2, + body:lang(ar) .mr-sm-2, + body:lang(ar) .mx-sm-2, + body:lang(az) .mr-sm-2, + body:lang(az) .mx-sm-2, + body:lang(dv) .mr-sm-2, + body:lang(dv) .mx-sm-2, + body:lang(he) .mr-sm-2, + body:lang(he) .mx-sm-2, + body:lang(ku) .mr-sm-2, + body:lang(ku) .mx-sm-2, + body:lang(ur) .mr-sm-2, + body:lang(ur) .mx-sm-2 { + margin-inline-end: 0.5rem !important; } + body:lang(fa) .mb-sm-2, + body:lang(fa) .my-sm-2, + body:lang(ar) .mb-sm-2, + body:lang(ar) .my-sm-2, + body:lang(az) .mb-sm-2, + body:lang(az) .my-sm-2, + body:lang(dv) .mb-sm-2, + body:lang(dv) .my-sm-2, + body:lang(he) .mb-sm-2, + body:lang(he) .my-sm-2, + body:lang(ku) .mb-sm-2, + body:lang(ku) .my-sm-2, + body:lang(ur) .mb-sm-2, + body:lang(ur) .my-sm-2 { + margin-bottom: 0.5rem !important; } + body:lang(fa) .ml-sm-2, + body:lang(fa) .mx-sm-2, + body:lang(ar) .ml-sm-2, + body:lang(ar) .mx-sm-2, + body:lang(az) .ml-sm-2, + body:lang(az) .mx-sm-2, + body:lang(dv) .ml-sm-2, + body:lang(dv) .mx-sm-2, + body:lang(he) .ml-sm-2, + body:lang(he) .mx-sm-2, + body:lang(ku) .ml-sm-2, + body:lang(ku) .mx-sm-2, + body:lang(ur) .ml-sm-2, + body:lang(ur) .mx-sm-2 { + margin-inline-start: 0.5rem !important; } + body:lang(fa) .m-sm-3, + body:lang(ar) .m-sm-3, + body:lang(az) .m-sm-3, + body:lang(dv) .m-sm-3, + body:lang(he) .m-sm-3, + body:lang(ku) .m-sm-3, + body:lang(ur) .m-sm-3 { + margin: 1rem !important; } + body:lang(fa) .mt-sm-3, + body:lang(fa) .my-sm-3, + body:lang(ar) .mt-sm-3, + body:lang(ar) .my-sm-3, + body:lang(az) .mt-sm-3, + body:lang(az) .my-sm-3, + body:lang(dv) .mt-sm-3, + body:lang(dv) .my-sm-3, + body:lang(he) .mt-sm-3, + body:lang(he) .my-sm-3, + body:lang(ku) .mt-sm-3, + body:lang(ku) .my-sm-3, + body:lang(ur) .mt-sm-3, + body:lang(ur) .my-sm-3 { + margin-top: 1rem !important; } + body:lang(fa) .mr-sm-3, + body:lang(fa) .mx-sm-3, + body:lang(ar) .mr-sm-3, + body:lang(ar) .mx-sm-3, + body:lang(az) .mr-sm-3, + body:lang(az) .mx-sm-3, + body:lang(dv) .mr-sm-3, + body:lang(dv) .mx-sm-3, + body:lang(he) .mr-sm-3, + body:lang(he) .mx-sm-3, + body:lang(ku) .mr-sm-3, + body:lang(ku) .mx-sm-3, + body:lang(ur) .mr-sm-3, + body:lang(ur) .mx-sm-3 { + margin-inline-end: 1rem !important; } + body:lang(fa) .mb-sm-3, + body:lang(fa) .my-sm-3, + body:lang(ar) .mb-sm-3, + body:lang(ar) .my-sm-3, + body:lang(az) .mb-sm-3, + body:lang(az) .my-sm-3, + body:lang(dv) .mb-sm-3, + body:lang(dv) .my-sm-3, + body:lang(he) .mb-sm-3, + body:lang(he) .my-sm-3, + body:lang(ku) .mb-sm-3, + body:lang(ku) .my-sm-3, + body:lang(ur) .mb-sm-3, + body:lang(ur) .my-sm-3 { + margin-bottom: 1rem !important; } + body:lang(fa) .ml-sm-3, + body:lang(fa) .mx-sm-3, + body:lang(ar) .ml-sm-3, + body:lang(ar) .mx-sm-3, + body:lang(az) .ml-sm-3, + body:lang(az) .mx-sm-3, + body:lang(dv) .ml-sm-3, + body:lang(dv) .mx-sm-3, + body:lang(he) .ml-sm-3, + body:lang(he) .mx-sm-3, + body:lang(ku) .ml-sm-3, + body:lang(ku) .mx-sm-3, + body:lang(ur) .ml-sm-3, + body:lang(ur) .mx-sm-3 { + margin-inline-start: 1rem !important; } + body:lang(fa) .m-sm-4, + body:lang(ar) .m-sm-4, + body:lang(az) .m-sm-4, + body:lang(dv) .m-sm-4, + body:lang(he) .m-sm-4, + body:lang(ku) .m-sm-4, + body:lang(ur) .m-sm-4 { + margin: 1.5rem !important; } + body:lang(fa) .mt-sm-4, + body:lang(fa) .my-sm-4, + body:lang(ar) .mt-sm-4, + body:lang(ar) .my-sm-4, + body:lang(az) .mt-sm-4, + body:lang(az) .my-sm-4, + body:lang(dv) .mt-sm-4, + body:lang(dv) .my-sm-4, + body:lang(he) .mt-sm-4, + body:lang(he) .my-sm-4, + body:lang(ku) .mt-sm-4, + body:lang(ku) .my-sm-4, + body:lang(ur) .mt-sm-4, + body:lang(ur) .my-sm-4 { + margin-top: 1.5rem !important; } + body:lang(fa) .mr-sm-4, + body:lang(fa) .mx-sm-4, + body:lang(ar) .mr-sm-4, + body:lang(ar) .mx-sm-4, + body:lang(az) .mr-sm-4, + body:lang(az) .mx-sm-4, + body:lang(dv) .mr-sm-4, + body:lang(dv) .mx-sm-4, + body:lang(he) .mr-sm-4, + body:lang(he) .mx-sm-4, + body:lang(ku) .mr-sm-4, + body:lang(ku) .mx-sm-4, + body:lang(ur) .mr-sm-4, + body:lang(ur) .mx-sm-4 { + margin-inline-end: 1.5rem !important; } + body:lang(fa) .mb-sm-4, + body:lang(fa) .my-sm-4, + body:lang(ar) .mb-sm-4, + body:lang(ar) .my-sm-4, + body:lang(az) .mb-sm-4, + body:lang(az) .my-sm-4, + body:lang(dv) .mb-sm-4, + body:lang(dv) .my-sm-4, + body:lang(he) .mb-sm-4, + body:lang(he) .my-sm-4, + body:lang(ku) .mb-sm-4, + body:lang(ku) .my-sm-4, + body:lang(ur) .mb-sm-4, + body:lang(ur) .my-sm-4 { + margin-bottom: 1.5rem !important; } + body:lang(fa) .ml-sm-4, + body:lang(fa) .mx-sm-4, + body:lang(ar) .ml-sm-4, + body:lang(ar) .mx-sm-4, + body:lang(az) .ml-sm-4, + body:lang(az) .mx-sm-4, + body:lang(dv) .ml-sm-4, + body:lang(dv) .mx-sm-4, + body:lang(he) .ml-sm-4, + body:lang(he) .mx-sm-4, + body:lang(ku) .ml-sm-4, + body:lang(ku) .mx-sm-4, + body:lang(ur) .ml-sm-4, + body:lang(ur) .mx-sm-4 { + margin-inline-start: 1.5rem !important; } + body:lang(fa) .m-sm-5, + body:lang(ar) .m-sm-5, + body:lang(az) .m-sm-5, + body:lang(dv) .m-sm-5, + body:lang(he) .m-sm-5, + body:lang(ku) .m-sm-5, + body:lang(ur) .m-sm-5 { + margin: 3rem !important; } + body:lang(fa) .mt-sm-5, + body:lang(fa) .my-sm-5, + body:lang(ar) .mt-sm-5, + body:lang(ar) .my-sm-5, + body:lang(az) .mt-sm-5, + body:lang(az) .my-sm-5, + body:lang(dv) .mt-sm-5, + body:lang(dv) .my-sm-5, + body:lang(he) .mt-sm-5, + body:lang(he) .my-sm-5, + body:lang(ku) .mt-sm-5, + body:lang(ku) .my-sm-5, + body:lang(ur) .mt-sm-5, + body:lang(ur) .my-sm-5 { + margin-top: 3rem !important; } + body:lang(fa) .mr-sm-5, + body:lang(fa) .mx-sm-5, + body:lang(ar) .mr-sm-5, + body:lang(ar) .mx-sm-5, + body:lang(az) .mr-sm-5, + body:lang(az) .mx-sm-5, + body:lang(dv) .mr-sm-5, + body:lang(dv) .mx-sm-5, + body:lang(he) .mr-sm-5, + body:lang(he) .mx-sm-5, + body:lang(ku) .mr-sm-5, + body:lang(ku) .mx-sm-5, + body:lang(ur) .mr-sm-5, + body:lang(ur) .mx-sm-5 { + margin-inline-end: 3rem !important; } + body:lang(fa) .mb-sm-5, + body:lang(fa) .my-sm-5, + body:lang(ar) .mb-sm-5, + body:lang(ar) .my-sm-5, + body:lang(az) .mb-sm-5, + body:lang(az) .my-sm-5, + body:lang(dv) .mb-sm-5, + body:lang(dv) .my-sm-5, + body:lang(he) .mb-sm-5, + body:lang(he) .my-sm-5, + body:lang(ku) .mb-sm-5, + body:lang(ku) .my-sm-5, + body:lang(ur) .mb-sm-5, + body:lang(ur) .my-sm-5 { + margin-bottom: 3rem !important; } + body:lang(fa) .ml-sm-5, + body:lang(fa) .mx-sm-5, + body:lang(ar) .ml-sm-5, + body:lang(ar) .mx-sm-5, + body:lang(az) .ml-sm-5, + body:lang(az) .mx-sm-5, + body:lang(dv) .ml-sm-5, + body:lang(dv) .mx-sm-5, + body:lang(he) .ml-sm-5, + body:lang(he) .mx-sm-5, + body:lang(ku) .ml-sm-5, + body:lang(ku) .mx-sm-5, + body:lang(ur) .ml-sm-5, + body:lang(ur) .mx-sm-5 { + margin-inline-start: 3rem !important; } + body:lang(fa) .p-sm-0, + body:lang(ar) .p-sm-0, + body:lang(az) .p-sm-0, + body:lang(dv) .p-sm-0, + body:lang(he) .p-sm-0, + body:lang(ku) .p-sm-0, + body:lang(ur) .p-sm-0 { + padding: 0 !important; } + body:lang(fa) .pt-sm-0, + body:lang(fa) .py-sm-0, + body:lang(ar) .pt-sm-0, + body:lang(ar) .py-sm-0, + body:lang(az) .pt-sm-0, + body:lang(az) .py-sm-0, + body:lang(dv) .pt-sm-0, + body:lang(dv) .py-sm-0, + body:lang(he) .pt-sm-0, + body:lang(he) .py-sm-0, + body:lang(ku) .pt-sm-0, + body:lang(ku) .py-sm-0, + body:lang(ur) .pt-sm-0, + body:lang(ur) .py-sm-0 { + padding-top: 0 !important; } + body:lang(fa) .pr-sm-0, + body:lang(fa) .px-sm-0, + body:lang(ar) .pr-sm-0, + body:lang(ar) .px-sm-0, + body:lang(az) .pr-sm-0, + body:lang(az) .px-sm-0, + body:lang(dv) .pr-sm-0, + body:lang(dv) .px-sm-0, + body:lang(he) .pr-sm-0, + body:lang(he) .px-sm-0, + body:lang(ku) .pr-sm-0, + body:lang(ku) .px-sm-0, + body:lang(ur) .pr-sm-0, + body:lang(ur) .px-sm-0 { + padding-inline-end: 0 !important; } + body:lang(fa) .pb-sm-0, + body:lang(fa) .py-sm-0, + body:lang(ar) .pb-sm-0, + body:lang(ar) .py-sm-0, + body:lang(az) .pb-sm-0, + body:lang(az) .py-sm-0, + body:lang(dv) .pb-sm-0, + body:lang(dv) .py-sm-0, + body:lang(he) .pb-sm-0, + body:lang(he) .py-sm-0, + body:lang(ku) .pb-sm-0, + body:lang(ku) .py-sm-0, + body:lang(ur) .pb-sm-0, + body:lang(ur) .py-sm-0 { + padding-bottom: 0 !important; } + body:lang(fa) .pl-sm-0, + body:lang(fa) .px-sm-0, + body:lang(ar) .pl-sm-0, + body:lang(ar) .px-sm-0, + body:lang(az) .pl-sm-0, + body:lang(az) .px-sm-0, + body:lang(dv) .pl-sm-0, + body:lang(dv) .px-sm-0, + body:lang(he) .pl-sm-0, + body:lang(he) .px-sm-0, + body:lang(ku) .pl-sm-0, + body:lang(ku) .px-sm-0, + body:lang(ur) .pl-sm-0, + body:lang(ur) .px-sm-0 { + padding-inline-start: 0 !important; } + body:lang(fa) .p-sm-1, + body:lang(ar) .p-sm-1, + body:lang(az) .p-sm-1, + body:lang(dv) .p-sm-1, + body:lang(he) .p-sm-1, + body:lang(ku) .p-sm-1, + body:lang(ur) .p-sm-1 { + padding: 0.25rem !important; } + body:lang(fa) .pt-sm-1, + body:lang(fa) .py-sm-1, + body:lang(ar) .pt-sm-1, + body:lang(ar) .py-sm-1, + body:lang(az) .pt-sm-1, + body:lang(az) .py-sm-1, + body:lang(dv) .pt-sm-1, + body:lang(dv) .py-sm-1, + body:lang(he) .pt-sm-1, + body:lang(he) .py-sm-1, + body:lang(ku) .pt-sm-1, + body:lang(ku) .py-sm-1, + body:lang(ur) .pt-sm-1, + body:lang(ur) .py-sm-1 { + padding-top: 0.25rem !important; } + body:lang(fa) .pr-sm-1, + body:lang(fa) .px-sm-1, + body:lang(ar) .pr-sm-1, + body:lang(ar) .px-sm-1, + body:lang(az) .pr-sm-1, + body:lang(az) .px-sm-1, + body:lang(dv) .pr-sm-1, + body:lang(dv) .px-sm-1, + body:lang(he) .pr-sm-1, + body:lang(he) .px-sm-1, + body:lang(ku) .pr-sm-1, + body:lang(ku) .px-sm-1, + body:lang(ur) .pr-sm-1, + body:lang(ur) .px-sm-1 { + padding-inline-end: 0.25rem !important; } + body:lang(fa) .pb-sm-1, + body:lang(fa) .py-sm-1, + body:lang(ar) .pb-sm-1, + body:lang(ar) .py-sm-1, + body:lang(az) .pb-sm-1, + body:lang(az) .py-sm-1, + body:lang(dv) .pb-sm-1, + body:lang(dv) .py-sm-1, + body:lang(he) .pb-sm-1, + body:lang(he) .py-sm-1, + body:lang(ku) .pb-sm-1, + body:lang(ku) .py-sm-1, + body:lang(ur) .pb-sm-1, + body:lang(ur) .py-sm-1 { + padding-bottom: 0.25rem !important; } + body:lang(fa) .pl-sm-1, + body:lang(fa) .px-sm-1, + body:lang(ar) .pl-sm-1, + body:lang(ar) .px-sm-1, + body:lang(az) .pl-sm-1, + body:lang(az) .px-sm-1, + body:lang(dv) .pl-sm-1, + body:lang(dv) .px-sm-1, + body:lang(he) .pl-sm-1, + body:lang(he) .px-sm-1, + body:lang(ku) .pl-sm-1, + body:lang(ku) .px-sm-1, + body:lang(ur) .pl-sm-1, + body:lang(ur) .px-sm-1 { + padding-inline-start: 0.25rem !important; } + body:lang(fa) .p-sm-2, + body:lang(ar) .p-sm-2, + body:lang(az) .p-sm-2, + body:lang(dv) .p-sm-2, + body:lang(he) .p-sm-2, + body:lang(ku) .p-sm-2, + body:lang(ur) .p-sm-2 { + padding: 0.5rem !important; } + body:lang(fa) .pt-sm-2, + body:lang(fa) .py-sm-2, + body:lang(ar) .pt-sm-2, + body:lang(ar) .py-sm-2, + body:lang(az) .pt-sm-2, + body:lang(az) .py-sm-2, + body:lang(dv) .pt-sm-2, + body:lang(dv) .py-sm-2, + body:lang(he) .pt-sm-2, + body:lang(he) .py-sm-2, + body:lang(ku) .pt-sm-2, + body:lang(ku) .py-sm-2, + body:lang(ur) .pt-sm-2, + body:lang(ur) .py-sm-2 { + padding-top: 0.5rem !important; } + body:lang(fa) .pr-sm-2, + body:lang(fa) .px-sm-2, + body:lang(ar) .pr-sm-2, + body:lang(ar) .px-sm-2, + body:lang(az) .pr-sm-2, + body:lang(az) .px-sm-2, + body:lang(dv) .pr-sm-2, + body:lang(dv) .px-sm-2, + body:lang(he) .pr-sm-2, + body:lang(he) .px-sm-2, + body:lang(ku) .pr-sm-2, + body:lang(ku) .px-sm-2, + body:lang(ur) .pr-sm-2, + body:lang(ur) .px-sm-2 { + padding-inline-end: 0.5rem !important; } + body:lang(fa) .pb-sm-2, + body:lang(fa) .py-sm-2, + body:lang(ar) .pb-sm-2, + body:lang(ar) .py-sm-2, + body:lang(az) .pb-sm-2, + body:lang(az) .py-sm-2, + body:lang(dv) .pb-sm-2, + body:lang(dv) .py-sm-2, + body:lang(he) .pb-sm-2, + body:lang(he) .py-sm-2, + body:lang(ku) .pb-sm-2, + body:lang(ku) .py-sm-2, + body:lang(ur) .pb-sm-2, + body:lang(ur) .py-sm-2 { + padding-bottom: 0.5rem !important; } + body:lang(fa) .pl-sm-2, + body:lang(fa) .px-sm-2, + body:lang(ar) .pl-sm-2, + body:lang(ar) .px-sm-2, + body:lang(az) .pl-sm-2, + body:lang(az) .px-sm-2, + body:lang(dv) .pl-sm-2, + body:lang(dv) .px-sm-2, + body:lang(he) .pl-sm-2, + body:lang(he) .px-sm-2, + body:lang(ku) .pl-sm-2, + body:lang(ku) .px-sm-2, + body:lang(ur) .pl-sm-2, + body:lang(ur) .px-sm-2 { + padding-inline-start: 0.5rem !important; } + body:lang(fa) .p-sm-3, + body:lang(ar) .p-sm-3, + body:lang(az) .p-sm-3, + body:lang(dv) .p-sm-3, + body:lang(he) .p-sm-3, + body:lang(ku) .p-sm-3, + body:lang(ur) .p-sm-3 { + padding: 1rem !important; } + body:lang(fa) .pt-sm-3, + body:lang(fa) .py-sm-3, + body:lang(ar) .pt-sm-3, + body:lang(ar) .py-sm-3, + body:lang(az) .pt-sm-3, + body:lang(az) .py-sm-3, + body:lang(dv) .pt-sm-3, + body:lang(dv) .py-sm-3, + body:lang(he) .pt-sm-3, + body:lang(he) .py-sm-3, + body:lang(ku) .pt-sm-3, + body:lang(ku) .py-sm-3, + body:lang(ur) .pt-sm-3, + body:lang(ur) .py-sm-3 { + padding-top: 1rem !important; } + body:lang(fa) .pr-sm-3, + body:lang(fa) .px-sm-3, + body:lang(ar) .pr-sm-3, + body:lang(ar) .px-sm-3, + body:lang(az) .pr-sm-3, + body:lang(az) .px-sm-3, + body:lang(dv) .pr-sm-3, + body:lang(dv) .px-sm-3, + body:lang(he) .pr-sm-3, + body:lang(he) .px-sm-3, + body:lang(ku) .pr-sm-3, + body:lang(ku) .px-sm-3, + body:lang(ur) .pr-sm-3, + body:lang(ur) .px-sm-3 { + padding-inline-end: 1rem !important; } + body:lang(fa) .pb-sm-3, + body:lang(fa) .py-sm-3, + body:lang(ar) .pb-sm-3, + body:lang(ar) .py-sm-3, + body:lang(az) .pb-sm-3, + body:lang(az) .py-sm-3, + body:lang(dv) .pb-sm-3, + body:lang(dv) .py-sm-3, + body:lang(he) .pb-sm-3, + body:lang(he) .py-sm-3, + body:lang(ku) .pb-sm-3, + body:lang(ku) .py-sm-3, + body:lang(ur) .pb-sm-3, + body:lang(ur) .py-sm-3 { + padding-bottom: 1rem !important; } + body:lang(fa) .pl-sm-3, + body:lang(fa) .px-sm-3, + body:lang(ar) .pl-sm-3, + body:lang(ar) .px-sm-3, + body:lang(az) .pl-sm-3, + body:lang(az) .px-sm-3, + body:lang(dv) .pl-sm-3, + body:lang(dv) .px-sm-3, + body:lang(he) .pl-sm-3, + body:lang(he) .px-sm-3, + body:lang(ku) .pl-sm-3, + body:lang(ku) .px-sm-3, + body:lang(ur) .pl-sm-3, + body:lang(ur) .px-sm-3 { + padding-inline-start: 1rem !important; } + body:lang(fa) .p-sm-4, + body:lang(ar) .p-sm-4, + body:lang(az) .p-sm-4, + body:lang(dv) .p-sm-4, + body:lang(he) .p-sm-4, + body:lang(ku) .p-sm-4, + body:lang(ur) .p-sm-4 { + padding: 1.5rem !important; } + body:lang(fa) .pt-sm-4, + body:lang(fa) .py-sm-4, + body:lang(ar) .pt-sm-4, + body:lang(ar) .py-sm-4, + body:lang(az) .pt-sm-4, + body:lang(az) .py-sm-4, + body:lang(dv) .pt-sm-4, + body:lang(dv) .py-sm-4, + body:lang(he) .pt-sm-4, + body:lang(he) .py-sm-4, + body:lang(ku) .pt-sm-4, + body:lang(ku) .py-sm-4, + body:lang(ur) .pt-sm-4, + body:lang(ur) .py-sm-4 { + padding-top: 1.5rem !important; } + body:lang(fa) .pr-sm-4, + body:lang(fa) .px-sm-4, + body:lang(ar) .pr-sm-4, + body:lang(ar) .px-sm-4, + body:lang(az) .pr-sm-4, + body:lang(az) .px-sm-4, + body:lang(dv) .pr-sm-4, + body:lang(dv) .px-sm-4, + body:lang(he) .pr-sm-4, + body:lang(he) .px-sm-4, + body:lang(ku) .pr-sm-4, + body:lang(ku) .px-sm-4, + body:lang(ur) .pr-sm-4, + body:lang(ur) .px-sm-4 { + padding-inline-end: 1.5rem !important; } + body:lang(fa) .pb-sm-4, + body:lang(fa) .py-sm-4, + body:lang(ar) .pb-sm-4, + body:lang(ar) .py-sm-4, + body:lang(az) .pb-sm-4, + body:lang(az) .py-sm-4, + body:lang(dv) .pb-sm-4, + body:lang(dv) .py-sm-4, + body:lang(he) .pb-sm-4, + body:lang(he) .py-sm-4, + body:lang(ku) .pb-sm-4, + body:lang(ku) .py-sm-4, + body:lang(ur) .pb-sm-4, + body:lang(ur) .py-sm-4 { + padding-bottom: 1.5rem !important; } + body:lang(fa) .pl-sm-4, + body:lang(fa) .px-sm-4, + body:lang(ar) .pl-sm-4, + body:lang(ar) .px-sm-4, + body:lang(az) .pl-sm-4, + body:lang(az) .px-sm-4, + body:lang(dv) .pl-sm-4, + body:lang(dv) .px-sm-4, + body:lang(he) .pl-sm-4, + body:lang(he) .px-sm-4, + body:lang(ku) .pl-sm-4, + body:lang(ku) .px-sm-4, + body:lang(ur) .pl-sm-4, + body:lang(ur) .px-sm-4 { + padding-inline-start: 1.5rem !important; } + body:lang(fa) .p-sm-5, + body:lang(ar) .p-sm-5, + body:lang(az) .p-sm-5, + body:lang(dv) .p-sm-5, + body:lang(he) .p-sm-5, + body:lang(ku) .p-sm-5, + body:lang(ur) .p-sm-5 { + padding: 3rem !important; } + body:lang(fa) .pt-sm-5, + body:lang(fa) .py-sm-5, + body:lang(ar) .pt-sm-5, + body:lang(ar) .py-sm-5, + body:lang(az) .pt-sm-5, + body:lang(az) .py-sm-5, + body:lang(dv) .pt-sm-5, + body:lang(dv) .py-sm-5, + body:lang(he) .pt-sm-5, + body:lang(he) .py-sm-5, + body:lang(ku) .pt-sm-5, + body:lang(ku) .py-sm-5, + body:lang(ur) .pt-sm-5, + body:lang(ur) .py-sm-5 { + padding-top: 3rem !important; } + body:lang(fa) .pr-sm-5, + body:lang(fa) .px-sm-5, + body:lang(ar) .pr-sm-5, + body:lang(ar) .px-sm-5, + body:lang(az) .pr-sm-5, + body:lang(az) .px-sm-5, + body:lang(dv) .pr-sm-5, + body:lang(dv) .px-sm-5, + body:lang(he) .pr-sm-5, + body:lang(he) .px-sm-5, + body:lang(ku) .pr-sm-5, + body:lang(ku) .px-sm-5, + body:lang(ur) .pr-sm-5, + body:lang(ur) .px-sm-5 { + padding-inline-end: 3rem !important; } + body:lang(fa) .pb-sm-5, + body:lang(fa) .py-sm-5, + body:lang(ar) .pb-sm-5, + body:lang(ar) .py-sm-5, + body:lang(az) .pb-sm-5, + body:lang(az) .py-sm-5, + body:lang(dv) .pb-sm-5, + body:lang(dv) .py-sm-5, + body:lang(he) .pb-sm-5, + body:lang(he) .py-sm-5, + body:lang(ku) .pb-sm-5, + body:lang(ku) .py-sm-5, + body:lang(ur) .pb-sm-5, + body:lang(ur) .py-sm-5 { + padding-bottom: 3rem !important; } + body:lang(fa) .pl-sm-5, + body:lang(fa) .px-sm-5, + body:lang(ar) .pl-sm-5, + body:lang(ar) .px-sm-5, + body:lang(az) .pl-sm-5, + body:lang(az) .px-sm-5, + body:lang(dv) .pl-sm-5, + body:lang(dv) .px-sm-5, + body:lang(he) .pl-sm-5, + body:lang(he) .px-sm-5, + body:lang(ku) .pl-sm-5, + body:lang(ku) .px-sm-5, + body:lang(ur) .pl-sm-5, + body:lang(ur) .px-sm-5 { + padding-inline-start: 3rem !important; } + body:lang(fa) .m-sm-n1, + body:lang(ar) .m-sm-n1, + body:lang(az) .m-sm-n1, + body:lang(dv) .m-sm-n1, + body:lang(he) .m-sm-n1, + body:lang(ku) .m-sm-n1, + body:lang(ur) .m-sm-n1 { + margin: -0.25rem !important; } + body:lang(fa) .mt-sm-n1, + body:lang(fa) .my-sm-n1, + body:lang(ar) .mt-sm-n1, + body:lang(ar) .my-sm-n1, + body:lang(az) .mt-sm-n1, + body:lang(az) .my-sm-n1, + body:lang(dv) .mt-sm-n1, + body:lang(dv) .my-sm-n1, + body:lang(he) .mt-sm-n1, + body:lang(he) .my-sm-n1, + body:lang(ku) .mt-sm-n1, + body:lang(ku) .my-sm-n1, + body:lang(ur) .mt-sm-n1, + body:lang(ur) .my-sm-n1 { + margin-top: -0.25rem !important; } + body:lang(fa) .mr-sm-n1, + body:lang(fa) .mx-sm-n1, + body:lang(ar) .mr-sm-n1, + body:lang(ar) .mx-sm-n1, + body:lang(az) .mr-sm-n1, + body:lang(az) .mx-sm-n1, + body:lang(dv) .mr-sm-n1, + body:lang(dv) .mx-sm-n1, + body:lang(he) .mr-sm-n1, + body:lang(he) .mx-sm-n1, + body:lang(ku) .mr-sm-n1, + body:lang(ku) .mx-sm-n1, + body:lang(ur) .mr-sm-n1, + body:lang(ur) .mx-sm-n1 { + margin-right: -0.25rem !important; } + body:lang(fa) .mb-sm-n1, + body:lang(fa) .my-sm-n1, + body:lang(ar) .mb-sm-n1, + body:lang(ar) .my-sm-n1, + body:lang(az) .mb-sm-n1, + body:lang(az) .my-sm-n1, + body:lang(dv) .mb-sm-n1, + body:lang(dv) .my-sm-n1, + body:lang(he) .mb-sm-n1, + body:lang(he) .my-sm-n1, + body:lang(ku) .mb-sm-n1, + body:lang(ku) .my-sm-n1, + body:lang(ur) .mb-sm-n1, + body:lang(ur) .my-sm-n1 { + margin-bottom: -0.25rem !important; } + body:lang(fa) .ml-sm-n1, + body:lang(fa) .mx-sm-n1, + body:lang(ar) .ml-sm-n1, + body:lang(ar) .mx-sm-n1, + body:lang(az) .ml-sm-n1, + body:lang(az) .mx-sm-n1, + body:lang(dv) .ml-sm-n1, + body:lang(dv) .mx-sm-n1, + body:lang(he) .ml-sm-n1, + body:lang(he) .mx-sm-n1, + body:lang(ku) .ml-sm-n1, + body:lang(ku) .mx-sm-n1, + body:lang(ur) .ml-sm-n1, + body:lang(ur) .mx-sm-n1 { + margin-left: -0.25rem !important; } + body:lang(fa) .m-sm-n2, + body:lang(ar) .m-sm-n2, + body:lang(az) .m-sm-n2, + body:lang(dv) .m-sm-n2, + body:lang(he) .m-sm-n2, + body:lang(ku) .m-sm-n2, + body:lang(ur) .m-sm-n2 { + margin: -0.5rem !important; } + body:lang(fa) .mt-sm-n2, + body:lang(fa) .my-sm-n2, + body:lang(ar) .mt-sm-n2, + body:lang(ar) .my-sm-n2, + body:lang(az) .mt-sm-n2, + body:lang(az) .my-sm-n2, + body:lang(dv) .mt-sm-n2, + body:lang(dv) .my-sm-n2, + body:lang(he) .mt-sm-n2, + body:lang(he) .my-sm-n2, + body:lang(ku) .mt-sm-n2, + body:lang(ku) .my-sm-n2, + body:lang(ur) .mt-sm-n2, + body:lang(ur) .my-sm-n2 { + margin-top: -0.5rem !important; } + body:lang(fa) .mr-sm-n2, + body:lang(fa) .mx-sm-n2, + body:lang(ar) .mr-sm-n2, + body:lang(ar) .mx-sm-n2, + body:lang(az) .mr-sm-n2, + body:lang(az) .mx-sm-n2, + body:lang(dv) .mr-sm-n2, + body:lang(dv) .mx-sm-n2, + body:lang(he) .mr-sm-n2, + body:lang(he) .mx-sm-n2, + body:lang(ku) .mr-sm-n2, + body:lang(ku) .mx-sm-n2, + body:lang(ur) .mr-sm-n2, + body:lang(ur) .mx-sm-n2 { + margin-right: -0.5rem !important; } + body:lang(fa) .mb-sm-n2, + body:lang(fa) .my-sm-n2, + body:lang(ar) .mb-sm-n2, + body:lang(ar) .my-sm-n2, + body:lang(az) .mb-sm-n2, + body:lang(az) .my-sm-n2, + body:lang(dv) .mb-sm-n2, + body:lang(dv) .my-sm-n2, + body:lang(he) .mb-sm-n2, + body:lang(he) .my-sm-n2, + body:lang(ku) .mb-sm-n2, + body:lang(ku) .my-sm-n2, + body:lang(ur) .mb-sm-n2, + body:lang(ur) .my-sm-n2 { + margin-bottom: -0.5rem !important; } + body:lang(fa) .ml-sm-n2, + body:lang(fa) .mx-sm-n2, + body:lang(ar) .ml-sm-n2, + body:lang(ar) .mx-sm-n2, + body:lang(az) .ml-sm-n2, + body:lang(az) .mx-sm-n2, + body:lang(dv) .ml-sm-n2, + body:lang(dv) .mx-sm-n2, + body:lang(he) .ml-sm-n2, + body:lang(he) .mx-sm-n2, + body:lang(ku) .ml-sm-n2, + body:lang(ku) .mx-sm-n2, + body:lang(ur) .ml-sm-n2, + body:lang(ur) .mx-sm-n2 { + margin-left: -0.5rem !important; } + body:lang(fa) .m-sm-n3, + body:lang(ar) .m-sm-n3, + body:lang(az) .m-sm-n3, + body:lang(dv) .m-sm-n3, + body:lang(he) .m-sm-n3, + body:lang(ku) .m-sm-n3, + body:lang(ur) .m-sm-n3 { + margin: -1rem !important; } + body:lang(fa) .mt-sm-n3, + body:lang(fa) .my-sm-n3, + body:lang(ar) .mt-sm-n3, + body:lang(ar) .my-sm-n3, + body:lang(az) .mt-sm-n3, + body:lang(az) .my-sm-n3, + body:lang(dv) .mt-sm-n3, + body:lang(dv) .my-sm-n3, + body:lang(he) .mt-sm-n3, + body:lang(he) .my-sm-n3, + body:lang(ku) .mt-sm-n3, + body:lang(ku) .my-sm-n3, + body:lang(ur) .mt-sm-n3, + body:lang(ur) .my-sm-n3 { + margin-top: -1rem !important; } + body:lang(fa) .mr-sm-n3, + body:lang(fa) .mx-sm-n3, + body:lang(ar) .mr-sm-n3, + body:lang(ar) .mx-sm-n3, + body:lang(az) .mr-sm-n3, + body:lang(az) .mx-sm-n3, + body:lang(dv) .mr-sm-n3, + body:lang(dv) .mx-sm-n3, + body:lang(he) .mr-sm-n3, + body:lang(he) .mx-sm-n3, + body:lang(ku) .mr-sm-n3, + body:lang(ku) .mx-sm-n3, + body:lang(ur) .mr-sm-n3, + body:lang(ur) .mx-sm-n3 { + margin-right: -1rem !important; } + body:lang(fa) .mb-sm-n3, + body:lang(fa) .my-sm-n3, + body:lang(ar) .mb-sm-n3, + body:lang(ar) .my-sm-n3, + body:lang(az) .mb-sm-n3, + body:lang(az) .my-sm-n3, + body:lang(dv) .mb-sm-n3, + body:lang(dv) .my-sm-n3, + body:lang(he) .mb-sm-n3, + body:lang(he) .my-sm-n3, + body:lang(ku) .mb-sm-n3, + body:lang(ku) .my-sm-n3, + body:lang(ur) .mb-sm-n3, + body:lang(ur) .my-sm-n3 { + margin-bottom: -1rem !important; } + body:lang(fa) .ml-sm-n3, + body:lang(fa) .mx-sm-n3, + body:lang(ar) .ml-sm-n3, + body:lang(ar) .mx-sm-n3, + body:lang(az) .ml-sm-n3, + body:lang(az) .mx-sm-n3, + body:lang(dv) .ml-sm-n3, + body:lang(dv) .mx-sm-n3, + body:lang(he) .ml-sm-n3, + body:lang(he) .mx-sm-n3, + body:lang(ku) .ml-sm-n3, + body:lang(ku) .mx-sm-n3, + body:lang(ur) .ml-sm-n3, + body:lang(ur) .mx-sm-n3 { + margin-left: -1rem !important; } + body:lang(fa) .m-sm-n4, + body:lang(ar) .m-sm-n4, + body:lang(az) .m-sm-n4, + body:lang(dv) .m-sm-n4, + body:lang(he) .m-sm-n4, + body:lang(ku) .m-sm-n4, + body:lang(ur) .m-sm-n4 { + margin: -1.5rem !important; } + body:lang(fa) .mt-sm-n4, + body:lang(fa) .my-sm-n4, + body:lang(ar) .mt-sm-n4, + body:lang(ar) .my-sm-n4, + body:lang(az) .mt-sm-n4, + body:lang(az) .my-sm-n4, + body:lang(dv) .mt-sm-n4, + body:lang(dv) .my-sm-n4, + body:lang(he) .mt-sm-n4, + body:lang(he) .my-sm-n4, + body:lang(ku) .mt-sm-n4, + body:lang(ku) .my-sm-n4, + body:lang(ur) .mt-sm-n4, + body:lang(ur) .my-sm-n4 { + margin-top: -1.5rem !important; } + body:lang(fa) .mr-sm-n4, + body:lang(fa) .mx-sm-n4, + body:lang(ar) .mr-sm-n4, + body:lang(ar) .mx-sm-n4, + body:lang(az) .mr-sm-n4, + body:lang(az) .mx-sm-n4, + body:lang(dv) .mr-sm-n4, + body:lang(dv) .mx-sm-n4, + body:lang(he) .mr-sm-n4, + body:lang(he) .mx-sm-n4, + body:lang(ku) .mr-sm-n4, + body:lang(ku) .mx-sm-n4, + body:lang(ur) .mr-sm-n4, + body:lang(ur) .mx-sm-n4 { + margin-right: -1.5rem !important; } + body:lang(fa) .mb-sm-n4, + body:lang(fa) .my-sm-n4, + body:lang(ar) .mb-sm-n4, + body:lang(ar) .my-sm-n4, + body:lang(az) .mb-sm-n4, + body:lang(az) .my-sm-n4, + body:lang(dv) .mb-sm-n4, + body:lang(dv) .my-sm-n4, + body:lang(he) .mb-sm-n4, + body:lang(he) .my-sm-n4, + body:lang(ku) .mb-sm-n4, + body:lang(ku) .my-sm-n4, + body:lang(ur) .mb-sm-n4, + body:lang(ur) .my-sm-n4 { + margin-bottom: -1.5rem !important; } + body:lang(fa) .ml-sm-n4, + body:lang(fa) .mx-sm-n4, + body:lang(ar) .ml-sm-n4, + body:lang(ar) .mx-sm-n4, + body:lang(az) .ml-sm-n4, + body:lang(az) .mx-sm-n4, + body:lang(dv) .ml-sm-n4, + body:lang(dv) .mx-sm-n4, + body:lang(he) .ml-sm-n4, + body:lang(he) .mx-sm-n4, + body:lang(ku) .ml-sm-n4, + body:lang(ku) .mx-sm-n4, + body:lang(ur) .ml-sm-n4, + body:lang(ur) .mx-sm-n4 { + margin-left: -1.5rem !important; } + body:lang(fa) .m-sm-n5, + body:lang(ar) .m-sm-n5, + body:lang(az) .m-sm-n5, + body:lang(dv) .m-sm-n5, + body:lang(he) .m-sm-n5, + body:lang(ku) .m-sm-n5, + body:lang(ur) .m-sm-n5 { + margin: -3rem !important; } + body:lang(fa) .mt-sm-n5, + body:lang(fa) .my-sm-n5, + body:lang(ar) .mt-sm-n5, + body:lang(ar) .my-sm-n5, + body:lang(az) .mt-sm-n5, + body:lang(az) .my-sm-n5, + body:lang(dv) .mt-sm-n5, + body:lang(dv) .my-sm-n5, + body:lang(he) .mt-sm-n5, + body:lang(he) .my-sm-n5, + body:lang(ku) .mt-sm-n5, + body:lang(ku) .my-sm-n5, + body:lang(ur) .mt-sm-n5, + body:lang(ur) .my-sm-n5 { + margin-top: -3rem !important; } + body:lang(fa) .mr-sm-n5, + body:lang(fa) .mx-sm-n5, + body:lang(ar) .mr-sm-n5, + body:lang(ar) .mx-sm-n5, + body:lang(az) .mr-sm-n5, + body:lang(az) .mx-sm-n5, + body:lang(dv) .mr-sm-n5, + body:lang(dv) .mx-sm-n5, + body:lang(he) .mr-sm-n5, + body:lang(he) .mx-sm-n5, + body:lang(ku) .mr-sm-n5, + body:lang(ku) .mx-sm-n5, + body:lang(ur) .mr-sm-n5, + body:lang(ur) .mx-sm-n5 { + margin-right: -3rem !important; } + body:lang(fa) .mb-sm-n5, + body:lang(fa) .my-sm-n5, + body:lang(ar) .mb-sm-n5, + body:lang(ar) .my-sm-n5, + body:lang(az) .mb-sm-n5, + body:lang(az) .my-sm-n5, + body:lang(dv) .mb-sm-n5, + body:lang(dv) .my-sm-n5, + body:lang(he) .mb-sm-n5, + body:lang(he) .my-sm-n5, + body:lang(ku) .mb-sm-n5, + body:lang(ku) .my-sm-n5, + body:lang(ur) .mb-sm-n5, + body:lang(ur) .my-sm-n5 { + margin-bottom: -3rem !important; } + body:lang(fa) .ml-sm-n5, + body:lang(fa) .mx-sm-n5, + body:lang(ar) .ml-sm-n5, + body:lang(ar) .mx-sm-n5, + body:lang(az) .ml-sm-n5, + body:lang(az) .mx-sm-n5, + body:lang(dv) .ml-sm-n5, + body:lang(dv) .mx-sm-n5, + body:lang(he) .ml-sm-n5, + body:lang(he) .mx-sm-n5, + body:lang(ku) .ml-sm-n5, + body:lang(ku) .mx-sm-n5, + body:lang(ur) .ml-sm-n5, + body:lang(ur) .mx-sm-n5 { + margin-left: -3rem !important; } + body:lang(fa) .m-sm-auto, + body:lang(ar) .m-sm-auto, + body:lang(az) .m-sm-auto, + body:lang(dv) .m-sm-auto, + body:lang(he) .m-sm-auto, + body:lang(ku) .m-sm-auto, + body:lang(ur) .m-sm-auto { + margin: auto !important; } + body:lang(fa) .mt-sm-auto, + body:lang(fa) .my-sm-auto, + body:lang(ar) .mt-sm-auto, + body:lang(ar) .my-sm-auto, + body:lang(az) .mt-sm-auto, + body:lang(az) .my-sm-auto, + body:lang(dv) .mt-sm-auto, + body:lang(dv) .my-sm-auto, + body:lang(he) .mt-sm-auto, + body:lang(he) .my-sm-auto, + body:lang(ku) .mt-sm-auto, + body:lang(ku) .my-sm-auto, + body:lang(ur) .mt-sm-auto, + body:lang(ur) .my-sm-auto { + margin-top: auto !important; } + body:lang(fa) .mr-sm-auto, + body:lang(fa) .mx-sm-auto, + body:lang(ar) .mr-sm-auto, + body:lang(ar) .mx-sm-auto, + body:lang(az) .mr-sm-auto, + body:lang(az) .mx-sm-auto, + body:lang(dv) .mr-sm-auto, + body:lang(dv) .mx-sm-auto, + body:lang(he) .mr-sm-auto, + body:lang(he) .mx-sm-auto, + body:lang(ku) .mr-sm-auto, + body:lang(ku) .mx-sm-auto, + body:lang(ur) .mr-sm-auto, + body:lang(ur) .mx-sm-auto { + margin-right: auto !important; } + body:lang(fa) .mb-sm-auto, + body:lang(fa) .my-sm-auto, + body:lang(ar) .mb-sm-auto, + body:lang(ar) .my-sm-auto, + body:lang(az) .mb-sm-auto, + body:lang(az) .my-sm-auto, + body:lang(dv) .mb-sm-auto, + body:lang(dv) .my-sm-auto, + body:lang(he) .mb-sm-auto, + body:lang(he) .my-sm-auto, + body:lang(ku) .mb-sm-auto, + body:lang(ku) .my-sm-auto, + body:lang(ur) .mb-sm-auto, + body:lang(ur) .my-sm-auto { + margin-bottom: auto !important; } + body:lang(fa) .ml-sm-auto, + body:lang(fa) .mx-sm-auto, + body:lang(ar) .ml-sm-auto, + body:lang(ar) .mx-sm-auto, + body:lang(az) .ml-sm-auto, + body:lang(az) .mx-sm-auto, + body:lang(dv) .ml-sm-auto, + body:lang(dv) .mx-sm-auto, + body:lang(he) .ml-sm-auto, + body:lang(he) .mx-sm-auto, + body:lang(ku) .ml-sm-auto, + body:lang(ku) .mx-sm-auto, + body:lang(ur) .ml-sm-auto, + body:lang(ur) .mx-sm-auto { + margin-left: auto !important; } } + @media (min-width: 768px) { + body:lang(fa) .m-md-0, + body:lang(ar) .m-md-0, + body:lang(az) .m-md-0, + body:lang(dv) .m-md-0, + body:lang(he) .m-md-0, + body:lang(ku) .m-md-0, + body:lang(ur) .m-md-0 { + margin: 0 !important; } + body:lang(fa) .mt-md-0, + body:lang(fa) .my-md-0, + body:lang(ar) .mt-md-0, + body:lang(ar) .my-md-0, + body:lang(az) .mt-md-0, + body:lang(az) .my-md-0, + body:lang(dv) .mt-md-0, + body:lang(dv) .my-md-0, + body:lang(he) .mt-md-0, + body:lang(he) .my-md-0, + body:lang(ku) .mt-md-0, + body:lang(ku) .my-md-0, + body:lang(ur) .mt-md-0, + body:lang(ur) .my-md-0 { + margin-top: 0 !important; } + body:lang(fa) .mr-md-0, + body:lang(fa) .mx-md-0, + body:lang(ar) .mr-md-0, + body:lang(ar) .mx-md-0, + body:lang(az) .mr-md-0, + body:lang(az) .mx-md-0, + body:lang(dv) .mr-md-0, + body:lang(dv) .mx-md-0, + body:lang(he) .mr-md-0, + body:lang(he) .mx-md-0, + body:lang(ku) .mr-md-0, + body:lang(ku) .mx-md-0, + body:lang(ur) .mr-md-0, + body:lang(ur) .mx-md-0 { + margin-inline-end: 0 !important; } + body:lang(fa) .mb-md-0, + body:lang(fa) .my-md-0, + body:lang(ar) .mb-md-0, + body:lang(ar) .my-md-0, + body:lang(az) .mb-md-0, + body:lang(az) .my-md-0, + body:lang(dv) .mb-md-0, + body:lang(dv) .my-md-0, + body:lang(he) .mb-md-0, + body:lang(he) .my-md-0, + body:lang(ku) .mb-md-0, + body:lang(ku) .my-md-0, + body:lang(ur) .mb-md-0, + body:lang(ur) .my-md-0 { + margin-bottom: 0 !important; } + body:lang(fa) .ml-md-0, + body:lang(fa) .mx-md-0, + body:lang(ar) .ml-md-0, + body:lang(ar) .mx-md-0, + body:lang(az) .ml-md-0, + body:lang(az) .mx-md-0, + body:lang(dv) .ml-md-0, + body:lang(dv) .mx-md-0, + body:lang(he) .ml-md-0, + body:lang(he) .mx-md-0, + body:lang(ku) .ml-md-0, + body:lang(ku) .mx-md-0, + body:lang(ur) .ml-md-0, + body:lang(ur) .mx-md-0 { + margin-inline-start: 0 !important; } + body:lang(fa) .m-md-1, + body:lang(ar) .m-md-1, + body:lang(az) .m-md-1, + body:lang(dv) .m-md-1, + body:lang(he) .m-md-1, + body:lang(ku) .m-md-1, + body:lang(ur) .m-md-1 { + margin: 0.25rem !important; } + body:lang(fa) .mt-md-1, + body:lang(fa) .my-md-1, + body:lang(ar) .mt-md-1, + body:lang(ar) .my-md-1, + body:lang(az) .mt-md-1, + body:lang(az) .my-md-1, + body:lang(dv) .mt-md-1, + body:lang(dv) .my-md-1, + body:lang(he) .mt-md-1, + body:lang(he) .my-md-1, + body:lang(ku) .mt-md-1, + body:lang(ku) .my-md-1, + body:lang(ur) .mt-md-1, + body:lang(ur) .my-md-1 { + margin-top: 0.25rem !important; } + body:lang(fa) .mr-md-1, + body:lang(fa) .mx-md-1, + body:lang(ar) .mr-md-1, + body:lang(ar) .mx-md-1, + body:lang(az) .mr-md-1, + body:lang(az) .mx-md-1, + body:lang(dv) .mr-md-1, + body:lang(dv) .mx-md-1, + body:lang(he) .mr-md-1, + body:lang(he) .mx-md-1, + body:lang(ku) .mr-md-1, + body:lang(ku) .mx-md-1, + body:lang(ur) .mr-md-1, + body:lang(ur) .mx-md-1 { + margin-inline-end: 0.25rem !important; } + body:lang(fa) .mb-md-1, + body:lang(fa) .my-md-1, + body:lang(ar) .mb-md-1, + body:lang(ar) .my-md-1, + body:lang(az) .mb-md-1, + body:lang(az) .my-md-1, + body:lang(dv) .mb-md-1, + body:lang(dv) .my-md-1, + body:lang(he) .mb-md-1, + body:lang(he) .my-md-1, + body:lang(ku) .mb-md-1, + body:lang(ku) .my-md-1, + body:lang(ur) .mb-md-1, + body:lang(ur) .my-md-1 { + margin-bottom: 0.25rem !important; } + body:lang(fa) .ml-md-1, + body:lang(fa) .mx-md-1, + body:lang(ar) .ml-md-1, + body:lang(ar) .mx-md-1, + body:lang(az) .ml-md-1, + body:lang(az) .mx-md-1, + body:lang(dv) .ml-md-1, + body:lang(dv) .mx-md-1, + body:lang(he) .ml-md-1, + body:lang(he) .mx-md-1, + body:lang(ku) .ml-md-1, + body:lang(ku) .mx-md-1, + body:lang(ur) .ml-md-1, + body:lang(ur) .mx-md-1 { + margin-inline-start: 0.25rem !important; } + body:lang(fa) .m-md-2, + body:lang(ar) .m-md-2, + body:lang(az) .m-md-2, + body:lang(dv) .m-md-2, + body:lang(he) .m-md-2, + body:lang(ku) .m-md-2, + body:lang(ur) .m-md-2 { + margin: 0.5rem !important; } + body:lang(fa) .mt-md-2, + body:lang(fa) .my-md-2, + body:lang(ar) .mt-md-2, + body:lang(ar) .my-md-2, + body:lang(az) .mt-md-2, + body:lang(az) .my-md-2, + body:lang(dv) .mt-md-2, + body:lang(dv) .my-md-2, + body:lang(he) .mt-md-2, + body:lang(he) .my-md-2, + body:lang(ku) .mt-md-2, + body:lang(ku) .my-md-2, + body:lang(ur) .mt-md-2, + body:lang(ur) .my-md-2 { + margin-top: 0.5rem !important; } + body:lang(fa) .mr-md-2, + body:lang(fa) .mx-md-2, + body:lang(ar) .mr-md-2, + body:lang(ar) .mx-md-2, + body:lang(az) .mr-md-2, + body:lang(az) .mx-md-2, + body:lang(dv) .mr-md-2, + body:lang(dv) .mx-md-2, + body:lang(he) .mr-md-2, + body:lang(he) .mx-md-2, + body:lang(ku) .mr-md-2, + body:lang(ku) .mx-md-2, + body:lang(ur) .mr-md-2, + body:lang(ur) .mx-md-2 { + margin-inline-end: 0.5rem !important; } + body:lang(fa) .mb-md-2, + body:lang(fa) .my-md-2, + body:lang(ar) .mb-md-2, + body:lang(ar) .my-md-2, + body:lang(az) .mb-md-2, + body:lang(az) .my-md-2, + body:lang(dv) .mb-md-2, + body:lang(dv) .my-md-2, + body:lang(he) .mb-md-2, + body:lang(he) .my-md-2, + body:lang(ku) .mb-md-2, + body:lang(ku) .my-md-2, + body:lang(ur) .mb-md-2, + body:lang(ur) .my-md-2 { + margin-bottom: 0.5rem !important; } + body:lang(fa) .ml-md-2, + body:lang(fa) .mx-md-2, + body:lang(ar) .ml-md-2, + body:lang(ar) .mx-md-2, + body:lang(az) .ml-md-2, + body:lang(az) .mx-md-2, + body:lang(dv) .ml-md-2, + body:lang(dv) .mx-md-2, + body:lang(he) .ml-md-2, + body:lang(he) .mx-md-2, + body:lang(ku) .ml-md-2, + body:lang(ku) .mx-md-2, + body:lang(ur) .ml-md-2, + body:lang(ur) .mx-md-2 { + margin-inline-start: 0.5rem !important; } + body:lang(fa) .m-md-3, + body:lang(ar) .m-md-3, + body:lang(az) .m-md-3, + body:lang(dv) .m-md-3, + body:lang(he) .m-md-3, + body:lang(ku) .m-md-3, + body:lang(ur) .m-md-3 { + margin: 1rem !important; } + body:lang(fa) .mt-md-3, + body:lang(fa) .my-md-3, + body:lang(ar) .mt-md-3, + body:lang(ar) .my-md-3, + body:lang(az) .mt-md-3, + body:lang(az) .my-md-3, + body:lang(dv) .mt-md-3, + body:lang(dv) .my-md-3, + body:lang(he) .mt-md-3, + body:lang(he) .my-md-3, + body:lang(ku) .mt-md-3, + body:lang(ku) .my-md-3, + body:lang(ur) .mt-md-3, + body:lang(ur) .my-md-3 { + margin-top: 1rem !important; } + body:lang(fa) .mr-md-3, + body:lang(fa) .mx-md-3, + body:lang(ar) .mr-md-3, + body:lang(ar) .mx-md-3, + body:lang(az) .mr-md-3, + body:lang(az) .mx-md-3, + body:lang(dv) .mr-md-3, + body:lang(dv) .mx-md-3, + body:lang(he) .mr-md-3, + body:lang(he) .mx-md-3, + body:lang(ku) .mr-md-3, + body:lang(ku) .mx-md-3, + body:lang(ur) .mr-md-3, + body:lang(ur) .mx-md-3 { + margin-inline-end: 1rem !important; } + body:lang(fa) .mb-md-3, + body:lang(fa) .my-md-3, + body:lang(ar) .mb-md-3, + body:lang(ar) .my-md-3, + body:lang(az) .mb-md-3, + body:lang(az) .my-md-3, + body:lang(dv) .mb-md-3, + body:lang(dv) .my-md-3, + body:lang(he) .mb-md-3, + body:lang(he) .my-md-3, + body:lang(ku) .mb-md-3, + body:lang(ku) .my-md-3, + body:lang(ur) .mb-md-3, + body:lang(ur) .my-md-3 { + margin-bottom: 1rem !important; } + body:lang(fa) .ml-md-3, + body:lang(fa) .mx-md-3, + body:lang(ar) .ml-md-3, + body:lang(ar) .mx-md-3, + body:lang(az) .ml-md-3, + body:lang(az) .mx-md-3, + body:lang(dv) .ml-md-3, + body:lang(dv) .mx-md-3, + body:lang(he) .ml-md-3, + body:lang(he) .mx-md-3, + body:lang(ku) .ml-md-3, + body:lang(ku) .mx-md-3, + body:lang(ur) .ml-md-3, + body:lang(ur) .mx-md-3 { + margin-inline-start: 1rem !important; } + body:lang(fa) .m-md-4, + body:lang(ar) .m-md-4, + body:lang(az) .m-md-4, + body:lang(dv) .m-md-4, + body:lang(he) .m-md-4, + body:lang(ku) .m-md-4, + body:lang(ur) .m-md-4 { + margin: 1.5rem !important; } + body:lang(fa) .mt-md-4, + body:lang(fa) .my-md-4, + body:lang(ar) .mt-md-4, + body:lang(ar) .my-md-4, + body:lang(az) .mt-md-4, + body:lang(az) .my-md-4, + body:lang(dv) .mt-md-4, + body:lang(dv) .my-md-4, + body:lang(he) .mt-md-4, + body:lang(he) .my-md-4, + body:lang(ku) .mt-md-4, + body:lang(ku) .my-md-4, + body:lang(ur) .mt-md-4, + body:lang(ur) .my-md-4 { + margin-top: 1.5rem !important; } + body:lang(fa) .mr-md-4, + body:lang(fa) .mx-md-4, + body:lang(ar) .mr-md-4, + body:lang(ar) .mx-md-4, + body:lang(az) .mr-md-4, + body:lang(az) .mx-md-4, + body:lang(dv) .mr-md-4, + body:lang(dv) .mx-md-4, + body:lang(he) .mr-md-4, + body:lang(he) .mx-md-4, + body:lang(ku) .mr-md-4, + body:lang(ku) .mx-md-4, + body:lang(ur) .mr-md-4, + body:lang(ur) .mx-md-4 { + margin-inline-end: 1.5rem !important; } + body:lang(fa) .mb-md-4, + body:lang(fa) .my-md-4, + body:lang(ar) .mb-md-4, + body:lang(ar) .my-md-4, + body:lang(az) .mb-md-4, + body:lang(az) .my-md-4, + body:lang(dv) .mb-md-4, + body:lang(dv) .my-md-4, + body:lang(he) .mb-md-4, + body:lang(he) .my-md-4, + body:lang(ku) .mb-md-4, + body:lang(ku) .my-md-4, + body:lang(ur) .mb-md-4, + body:lang(ur) .my-md-4 { + margin-bottom: 1.5rem !important; } + body:lang(fa) .ml-md-4, + body:lang(fa) .mx-md-4, + body:lang(ar) .ml-md-4, + body:lang(ar) .mx-md-4, + body:lang(az) .ml-md-4, + body:lang(az) .mx-md-4, + body:lang(dv) .ml-md-4, + body:lang(dv) .mx-md-4, + body:lang(he) .ml-md-4, + body:lang(he) .mx-md-4, + body:lang(ku) .ml-md-4, + body:lang(ku) .mx-md-4, + body:lang(ur) .ml-md-4, + body:lang(ur) .mx-md-4 { + margin-inline-start: 1.5rem !important; } + body:lang(fa) .m-md-5, + body:lang(ar) .m-md-5, + body:lang(az) .m-md-5, + body:lang(dv) .m-md-5, + body:lang(he) .m-md-5, + body:lang(ku) .m-md-5, + body:lang(ur) .m-md-5 { + margin: 3rem !important; } + body:lang(fa) .mt-md-5, + body:lang(fa) .my-md-5, + body:lang(ar) .mt-md-5, + body:lang(ar) .my-md-5, + body:lang(az) .mt-md-5, + body:lang(az) .my-md-5, + body:lang(dv) .mt-md-5, + body:lang(dv) .my-md-5, + body:lang(he) .mt-md-5, + body:lang(he) .my-md-5, + body:lang(ku) .mt-md-5, + body:lang(ku) .my-md-5, + body:lang(ur) .mt-md-5, + body:lang(ur) .my-md-5 { + margin-top: 3rem !important; } + body:lang(fa) .mr-md-5, + body:lang(fa) .mx-md-5, + body:lang(ar) .mr-md-5, + body:lang(ar) .mx-md-5, + body:lang(az) .mr-md-5, + body:lang(az) .mx-md-5, + body:lang(dv) .mr-md-5, + body:lang(dv) .mx-md-5, + body:lang(he) .mr-md-5, + body:lang(he) .mx-md-5, + body:lang(ku) .mr-md-5, + body:lang(ku) .mx-md-5, + body:lang(ur) .mr-md-5, + body:lang(ur) .mx-md-5 { + margin-inline-end: 3rem !important; } + body:lang(fa) .mb-md-5, + body:lang(fa) .my-md-5, + body:lang(ar) .mb-md-5, + body:lang(ar) .my-md-5, + body:lang(az) .mb-md-5, + body:lang(az) .my-md-5, + body:lang(dv) .mb-md-5, + body:lang(dv) .my-md-5, + body:lang(he) .mb-md-5, + body:lang(he) .my-md-5, + body:lang(ku) .mb-md-5, + body:lang(ku) .my-md-5, + body:lang(ur) .mb-md-5, + body:lang(ur) .my-md-5 { + margin-bottom: 3rem !important; } + body:lang(fa) .ml-md-5, + body:lang(fa) .mx-md-5, + body:lang(ar) .ml-md-5, + body:lang(ar) .mx-md-5, + body:lang(az) .ml-md-5, + body:lang(az) .mx-md-5, + body:lang(dv) .ml-md-5, + body:lang(dv) .mx-md-5, + body:lang(he) .ml-md-5, + body:lang(he) .mx-md-5, + body:lang(ku) .ml-md-5, + body:lang(ku) .mx-md-5, + body:lang(ur) .ml-md-5, + body:lang(ur) .mx-md-5 { + margin-inline-start: 3rem !important; } + body:lang(fa) .p-md-0, + body:lang(ar) .p-md-0, + body:lang(az) .p-md-0, + body:lang(dv) .p-md-0, + body:lang(he) .p-md-0, + body:lang(ku) .p-md-0, + body:lang(ur) .p-md-0 { + padding: 0 !important; } + body:lang(fa) .pt-md-0, + body:lang(fa) .py-md-0, + body:lang(ar) .pt-md-0, + body:lang(ar) .py-md-0, + body:lang(az) .pt-md-0, + body:lang(az) .py-md-0, + body:lang(dv) .pt-md-0, + body:lang(dv) .py-md-0, + body:lang(he) .pt-md-0, + body:lang(he) .py-md-0, + body:lang(ku) .pt-md-0, + body:lang(ku) .py-md-0, + body:lang(ur) .pt-md-0, + body:lang(ur) .py-md-0 { + padding-top: 0 !important; } + body:lang(fa) .pr-md-0, + body:lang(fa) .px-md-0, + body:lang(ar) .pr-md-0, + body:lang(ar) .px-md-0, + body:lang(az) .pr-md-0, + body:lang(az) .px-md-0, + body:lang(dv) .pr-md-0, + body:lang(dv) .px-md-0, + body:lang(he) .pr-md-0, + body:lang(he) .px-md-0, + body:lang(ku) .pr-md-0, + body:lang(ku) .px-md-0, + body:lang(ur) .pr-md-0, + body:lang(ur) .px-md-0 { + padding-inline-end: 0 !important; } + body:lang(fa) .pb-md-0, + body:lang(fa) .py-md-0, + body:lang(ar) .pb-md-0, + body:lang(ar) .py-md-0, + body:lang(az) .pb-md-0, + body:lang(az) .py-md-0, + body:lang(dv) .pb-md-0, + body:lang(dv) .py-md-0, + body:lang(he) .pb-md-0, + body:lang(he) .py-md-0, + body:lang(ku) .pb-md-0, + body:lang(ku) .py-md-0, + body:lang(ur) .pb-md-0, + body:lang(ur) .py-md-0 { + padding-bottom: 0 !important; } + body:lang(fa) .pl-md-0, + body:lang(fa) .px-md-0, + body:lang(ar) .pl-md-0, + body:lang(ar) .px-md-0, + body:lang(az) .pl-md-0, + body:lang(az) .px-md-0, + body:lang(dv) .pl-md-0, + body:lang(dv) .px-md-0, + body:lang(he) .pl-md-0, + body:lang(he) .px-md-0, + body:lang(ku) .pl-md-0, + body:lang(ku) .px-md-0, + body:lang(ur) .pl-md-0, + body:lang(ur) .px-md-0 { + padding-inline-start: 0 !important; } + body:lang(fa) .p-md-1, + body:lang(ar) .p-md-1, + body:lang(az) .p-md-1, + body:lang(dv) .p-md-1, + body:lang(he) .p-md-1, + body:lang(ku) .p-md-1, + body:lang(ur) .p-md-1 { + padding: 0.25rem !important; } + body:lang(fa) .pt-md-1, + body:lang(fa) .py-md-1, + body:lang(ar) .pt-md-1, + body:lang(ar) .py-md-1, + body:lang(az) .pt-md-1, + body:lang(az) .py-md-1, + body:lang(dv) .pt-md-1, + body:lang(dv) .py-md-1, + body:lang(he) .pt-md-1, + body:lang(he) .py-md-1, + body:lang(ku) .pt-md-1, + body:lang(ku) .py-md-1, + body:lang(ur) .pt-md-1, + body:lang(ur) .py-md-1 { + padding-top: 0.25rem !important; } + body:lang(fa) .pr-md-1, + body:lang(fa) .px-md-1, + body:lang(ar) .pr-md-1, + body:lang(ar) .px-md-1, + body:lang(az) .pr-md-1, + body:lang(az) .px-md-1, + body:lang(dv) .pr-md-1, + body:lang(dv) .px-md-1, + body:lang(he) .pr-md-1, + body:lang(he) .px-md-1, + body:lang(ku) .pr-md-1, + body:lang(ku) .px-md-1, + body:lang(ur) .pr-md-1, + body:lang(ur) .px-md-1 { + padding-inline-end: 0.25rem !important; } + body:lang(fa) .pb-md-1, + body:lang(fa) .py-md-1, + body:lang(ar) .pb-md-1, + body:lang(ar) .py-md-1, + body:lang(az) .pb-md-1, + body:lang(az) .py-md-1, + body:lang(dv) .pb-md-1, + body:lang(dv) .py-md-1, + body:lang(he) .pb-md-1, + body:lang(he) .py-md-1, + body:lang(ku) .pb-md-1, + body:lang(ku) .py-md-1, + body:lang(ur) .pb-md-1, + body:lang(ur) .py-md-1 { + padding-bottom: 0.25rem !important; } + body:lang(fa) .pl-md-1, + body:lang(fa) .px-md-1, + body:lang(ar) .pl-md-1, + body:lang(ar) .px-md-1, + body:lang(az) .pl-md-1, + body:lang(az) .px-md-1, + body:lang(dv) .pl-md-1, + body:lang(dv) .px-md-1, + body:lang(he) .pl-md-1, + body:lang(he) .px-md-1, + body:lang(ku) .pl-md-1, + body:lang(ku) .px-md-1, + body:lang(ur) .pl-md-1, + body:lang(ur) .px-md-1 { + padding-inline-start: 0.25rem !important; } + body:lang(fa) .p-md-2, + body:lang(ar) .p-md-2, + body:lang(az) .p-md-2, + body:lang(dv) .p-md-2, + body:lang(he) .p-md-2, + body:lang(ku) .p-md-2, + body:lang(ur) .p-md-2 { + padding: 0.5rem !important; } + body:lang(fa) .pt-md-2, + body:lang(fa) .py-md-2, + body:lang(ar) .pt-md-2, + body:lang(ar) .py-md-2, + body:lang(az) .pt-md-2, + body:lang(az) .py-md-2, + body:lang(dv) .pt-md-2, + body:lang(dv) .py-md-2, + body:lang(he) .pt-md-2, + body:lang(he) .py-md-2, + body:lang(ku) .pt-md-2, + body:lang(ku) .py-md-2, + body:lang(ur) .pt-md-2, + body:lang(ur) .py-md-2 { + padding-top: 0.5rem !important; } + body:lang(fa) .pr-md-2, + body:lang(fa) .px-md-2, + body:lang(ar) .pr-md-2, + body:lang(ar) .px-md-2, + body:lang(az) .pr-md-2, + body:lang(az) .px-md-2, + body:lang(dv) .pr-md-2, + body:lang(dv) .px-md-2, + body:lang(he) .pr-md-2, + body:lang(he) .px-md-2, + body:lang(ku) .pr-md-2, + body:lang(ku) .px-md-2, + body:lang(ur) .pr-md-2, + body:lang(ur) .px-md-2 { + padding-inline-end: 0.5rem !important; } + body:lang(fa) .pb-md-2, + body:lang(fa) .py-md-2, + body:lang(ar) .pb-md-2, + body:lang(ar) .py-md-2, + body:lang(az) .pb-md-2, + body:lang(az) .py-md-2, + body:lang(dv) .pb-md-2, + body:lang(dv) .py-md-2, + body:lang(he) .pb-md-2, + body:lang(he) .py-md-2, + body:lang(ku) .pb-md-2, + body:lang(ku) .py-md-2, + body:lang(ur) .pb-md-2, + body:lang(ur) .py-md-2 { + padding-bottom: 0.5rem !important; } + body:lang(fa) .pl-md-2, + body:lang(fa) .px-md-2, + body:lang(ar) .pl-md-2, + body:lang(ar) .px-md-2, + body:lang(az) .pl-md-2, + body:lang(az) .px-md-2, + body:lang(dv) .pl-md-2, + body:lang(dv) .px-md-2, + body:lang(he) .pl-md-2, + body:lang(he) .px-md-2, + body:lang(ku) .pl-md-2, + body:lang(ku) .px-md-2, + body:lang(ur) .pl-md-2, + body:lang(ur) .px-md-2 { + padding-inline-start: 0.5rem !important; } + body:lang(fa) .p-md-3, + body:lang(ar) .p-md-3, + body:lang(az) .p-md-3, + body:lang(dv) .p-md-3, + body:lang(he) .p-md-3, + body:lang(ku) .p-md-3, + body:lang(ur) .p-md-3 { + padding: 1rem !important; } + body:lang(fa) .pt-md-3, + body:lang(fa) .py-md-3, + body:lang(ar) .pt-md-3, + body:lang(ar) .py-md-3, + body:lang(az) .pt-md-3, + body:lang(az) .py-md-3, + body:lang(dv) .pt-md-3, + body:lang(dv) .py-md-3, + body:lang(he) .pt-md-3, + body:lang(he) .py-md-3, + body:lang(ku) .pt-md-3, + body:lang(ku) .py-md-3, + body:lang(ur) .pt-md-3, + body:lang(ur) .py-md-3 { + padding-top: 1rem !important; } + body:lang(fa) .pr-md-3, + body:lang(fa) .px-md-3, + body:lang(ar) .pr-md-3, + body:lang(ar) .px-md-3, + body:lang(az) .pr-md-3, + body:lang(az) .px-md-3, + body:lang(dv) .pr-md-3, + body:lang(dv) .px-md-3, + body:lang(he) .pr-md-3, + body:lang(he) .px-md-3, + body:lang(ku) .pr-md-3, + body:lang(ku) .px-md-3, + body:lang(ur) .pr-md-3, + body:lang(ur) .px-md-3 { + padding-inline-end: 1rem !important; } + body:lang(fa) .pb-md-3, + body:lang(fa) .py-md-3, + body:lang(ar) .pb-md-3, + body:lang(ar) .py-md-3, + body:lang(az) .pb-md-3, + body:lang(az) .py-md-3, + body:lang(dv) .pb-md-3, + body:lang(dv) .py-md-3, + body:lang(he) .pb-md-3, + body:lang(he) .py-md-3, + body:lang(ku) .pb-md-3, + body:lang(ku) .py-md-3, + body:lang(ur) .pb-md-3, + body:lang(ur) .py-md-3 { + padding-bottom: 1rem !important; } + body:lang(fa) .pl-md-3, + body:lang(fa) .px-md-3, + body:lang(ar) .pl-md-3, + body:lang(ar) .px-md-3, + body:lang(az) .pl-md-3, + body:lang(az) .px-md-3, + body:lang(dv) .pl-md-3, + body:lang(dv) .px-md-3, + body:lang(he) .pl-md-3, + body:lang(he) .px-md-3, + body:lang(ku) .pl-md-3, + body:lang(ku) .px-md-3, + body:lang(ur) .pl-md-3, + body:lang(ur) .px-md-3 { + padding-inline-start: 1rem !important; } + body:lang(fa) .p-md-4, + body:lang(ar) .p-md-4, + body:lang(az) .p-md-4, + body:lang(dv) .p-md-4, + body:lang(he) .p-md-4, + body:lang(ku) .p-md-4, + body:lang(ur) .p-md-4 { + padding: 1.5rem !important; } + body:lang(fa) .pt-md-4, + body:lang(fa) .py-md-4, + body:lang(ar) .pt-md-4, + body:lang(ar) .py-md-4, + body:lang(az) .pt-md-4, + body:lang(az) .py-md-4, + body:lang(dv) .pt-md-4, + body:lang(dv) .py-md-4, + body:lang(he) .pt-md-4, + body:lang(he) .py-md-4, + body:lang(ku) .pt-md-4, + body:lang(ku) .py-md-4, + body:lang(ur) .pt-md-4, + body:lang(ur) .py-md-4 { + padding-top: 1.5rem !important; } + body:lang(fa) .pr-md-4, + body:lang(fa) .px-md-4, + body:lang(ar) .pr-md-4, + body:lang(ar) .px-md-4, + body:lang(az) .pr-md-4, + body:lang(az) .px-md-4, + body:lang(dv) .pr-md-4, + body:lang(dv) .px-md-4, + body:lang(he) .pr-md-4, + body:lang(he) .px-md-4, + body:lang(ku) .pr-md-4, + body:lang(ku) .px-md-4, + body:lang(ur) .pr-md-4, + body:lang(ur) .px-md-4 { + padding-inline-end: 1.5rem !important; } + body:lang(fa) .pb-md-4, + body:lang(fa) .py-md-4, + body:lang(ar) .pb-md-4, + body:lang(ar) .py-md-4, + body:lang(az) .pb-md-4, + body:lang(az) .py-md-4, + body:lang(dv) .pb-md-4, + body:lang(dv) .py-md-4, + body:lang(he) .pb-md-4, + body:lang(he) .py-md-4, + body:lang(ku) .pb-md-4, + body:lang(ku) .py-md-4, + body:lang(ur) .pb-md-4, + body:lang(ur) .py-md-4 { + padding-bottom: 1.5rem !important; } + body:lang(fa) .pl-md-4, + body:lang(fa) .px-md-4, + body:lang(ar) .pl-md-4, + body:lang(ar) .px-md-4, + body:lang(az) .pl-md-4, + body:lang(az) .px-md-4, + body:lang(dv) .pl-md-4, + body:lang(dv) .px-md-4, + body:lang(he) .pl-md-4, + body:lang(he) .px-md-4, + body:lang(ku) .pl-md-4, + body:lang(ku) .px-md-4, + body:lang(ur) .pl-md-4, + body:lang(ur) .px-md-4 { + padding-inline-start: 1.5rem !important; } + body:lang(fa) .p-md-5, + body:lang(ar) .p-md-5, + body:lang(az) .p-md-5, + body:lang(dv) .p-md-5, + body:lang(he) .p-md-5, + body:lang(ku) .p-md-5, + body:lang(ur) .p-md-5 { + padding: 3rem !important; } + body:lang(fa) .pt-md-5, + body:lang(fa) .py-md-5, + body:lang(ar) .pt-md-5, + body:lang(ar) .py-md-5, + body:lang(az) .pt-md-5, + body:lang(az) .py-md-5, + body:lang(dv) .pt-md-5, + body:lang(dv) .py-md-5, + body:lang(he) .pt-md-5, + body:lang(he) .py-md-5, + body:lang(ku) .pt-md-5, + body:lang(ku) .py-md-5, + body:lang(ur) .pt-md-5, + body:lang(ur) .py-md-5 { + padding-top: 3rem !important; } + body:lang(fa) .pr-md-5, + body:lang(fa) .px-md-5, + body:lang(ar) .pr-md-5, + body:lang(ar) .px-md-5, + body:lang(az) .pr-md-5, + body:lang(az) .px-md-5, + body:lang(dv) .pr-md-5, + body:lang(dv) .px-md-5, + body:lang(he) .pr-md-5, + body:lang(he) .px-md-5, + body:lang(ku) .pr-md-5, + body:lang(ku) .px-md-5, + body:lang(ur) .pr-md-5, + body:lang(ur) .px-md-5 { + padding-inline-end: 3rem !important; } + body:lang(fa) .pb-md-5, + body:lang(fa) .py-md-5, + body:lang(ar) .pb-md-5, + body:lang(ar) .py-md-5, + body:lang(az) .pb-md-5, + body:lang(az) .py-md-5, + body:lang(dv) .pb-md-5, + body:lang(dv) .py-md-5, + body:lang(he) .pb-md-5, + body:lang(he) .py-md-5, + body:lang(ku) .pb-md-5, + body:lang(ku) .py-md-5, + body:lang(ur) .pb-md-5, + body:lang(ur) .py-md-5 { + padding-bottom: 3rem !important; } + body:lang(fa) .pl-md-5, + body:lang(fa) .px-md-5, + body:lang(ar) .pl-md-5, + body:lang(ar) .px-md-5, + body:lang(az) .pl-md-5, + body:lang(az) .px-md-5, + body:lang(dv) .pl-md-5, + body:lang(dv) .px-md-5, + body:lang(he) .pl-md-5, + body:lang(he) .px-md-5, + body:lang(ku) .pl-md-5, + body:lang(ku) .px-md-5, + body:lang(ur) .pl-md-5, + body:lang(ur) .px-md-5 { + padding-inline-start: 3rem !important; } + body:lang(fa) .m-md-n1, + body:lang(ar) .m-md-n1, + body:lang(az) .m-md-n1, + body:lang(dv) .m-md-n1, + body:lang(he) .m-md-n1, + body:lang(ku) .m-md-n1, + body:lang(ur) .m-md-n1 { + margin: -0.25rem !important; } + body:lang(fa) .mt-md-n1, + body:lang(fa) .my-md-n1, + body:lang(ar) .mt-md-n1, + body:lang(ar) .my-md-n1, + body:lang(az) .mt-md-n1, + body:lang(az) .my-md-n1, + body:lang(dv) .mt-md-n1, + body:lang(dv) .my-md-n1, + body:lang(he) .mt-md-n1, + body:lang(he) .my-md-n1, + body:lang(ku) .mt-md-n1, + body:lang(ku) .my-md-n1, + body:lang(ur) .mt-md-n1, + body:lang(ur) .my-md-n1 { + margin-top: -0.25rem !important; } + body:lang(fa) .mr-md-n1, + body:lang(fa) .mx-md-n1, + body:lang(ar) .mr-md-n1, + body:lang(ar) .mx-md-n1, + body:lang(az) .mr-md-n1, + body:lang(az) .mx-md-n1, + body:lang(dv) .mr-md-n1, + body:lang(dv) .mx-md-n1, + body:lang(he) .mr-md-n1, + body:lang(he) .mx-md-n1, + body:lang(ku) .mr-md-n1, + body:lang(ku) .mx-md-n1, + body:lang(ur) .mr-md-n1, + body:lang(ur) .mx-md-n1 { + margin-right: -0.25rem !important; } + body:lang(fa) .mb-md-n1, + body:lang(fa) .my-md-n1, + body:lang(ar) .mb-md-n1, + body:lang(ar) .my-md-n1, + body:lang(az) .mb-md-n1, + body:lang(az) .my-md-n1, + body:lang(dv) .mb-md-n1, + body:lang(dv) .my-md-n1, + body:lang(he) .mb-md-n1, + body:lang(he) .my-md-n1, + body:lang(ku) .mb-md-n1, + body:lang(ku) .my-md-n1, + body:lang(ur) .mb-md-n1, + body:lang(ur) .my-md-n1 { + margin-bottom: -0.25rem !important; } + body:lang(fa) .ml-md-n1, + body:lang(fa) .mx-md-n1, + body:lang(ar) .ml-md-n1, + body:lang(ar) .mx-md-n1, + body:lang(az) .ml-md-n1, + body:lang(az) .mx-md-n1, + body:lang(dv) .ml-md-n1, + body:lang(dv) .mx-md-n1, + body:lang(he) .ml-md-n1, + body:lang(he) .mx-md-n1, + body:lang(ku) .ml-md-n1, + body:lang(ku) .mx-md-n1, + body:lang(ur) .ml-md-n1, + body:lang(ur) .mx-md-n1 { + margin-left: -0.25rem !important; } + body:lang(fa) .m-md-n2, + body:lang(ar) .m-md-n2, + body:lang(az) .m-md-n2, + body:lang(dv) .m-md-n2, + body:lang(he) .m-md-n2, + body:lang(ku) .m-md-n2, + body:lang(ur) .m-md-n2 { + margin: -0.5rem !important; } + body:lang(fa) .mt-md-n2, + body:lang(fa) .my-md-n2, + body:lang(ar) .mt-md-n2, + body:lang(ar) .my-md-n2, + body:lang(az) .mt-md-n2, + body:lang(az) .my-md-n2, + body:lang(dv) .mt-md-n2, + body:lang(dv) .my-md-n2, + body:lang(he) .mt-md-n2, + body:lang(he) .my-md-n2, + body:lang(ku) .mt-md-n2, + body:lang(ku) .my-md-n2, + body:lang(ur) .mt-md-n2, + body:lang(ur) .my-md-n2 { + margin-top: -0.5rem !important; } + body:lang(fa) .mr-md-n2, + body:lang(fa) .mx-md-n2, + body:lang(ar) .mr-md-n2, + body:lang(ar) .mx-md-n2, + body:lang(az) .mr-md-n2, + body:lang(az) .mx-md-n2, + body:lang(dv) .mr-md-n2, + body:lang(dv) .mx-md-n2, + body:lang(he) .mr-md-n2, + body:lang(he) .mx-md-n2, + body:lang(ku) .mr-md-n2, + body:lang(ku) .mx-md-n2, + body:lang(ur) .mr-md-n2, + body:lang(ur) .mx-md-n2 { + margin-right: -0.5rem !important; } + body:lang(fa) .mb-md-n2, + body:lang(fa) .my-md-n2, + body:lang(ar) .mb-md-n2, + body:lang(ar) .my-md-n2, + body:lang(az) .mb-md-n2, + body:lang(az) .my-md-n2, + body:lang(dv) .mb-md-n2, + body:lang(dv) .my-md-n2, + body:lang(he) .mb-md-n2, + body:lang(he) .my-md-n2, + body:lang(ku) .mb-md-n2, + body:lang(ku) .my-md-n2, + body:lang(ur) .mb-md-n2, + body:lang(ur) .my-md-n2 { + margin-bottom: -0.5rem !important; } + body:lang(fa) .ml-md-n2, + body:lang(fa) .mx-md-n2, + body:lang(ar) .ml-md-n2, + body:lang(ar) .mx-md-n2, + body:lang(az) .ml-md-n2, + body:lang(az) .mx-md-n2, + body:lang(dv) .ml-md-n2, + body:lang(dv) .mx-md-n2, + body:lang(he) .ml-md-n2, + body:lang(he) .mx-md-n2, + body:lang(ku) .ml-md-n2, + body:lang(ku) .mx-md-n2, + body:lang(ur) .ml-md-n2, + body:lang(ur) .mx-md-n2 { + margin-left: -0.5rem !important; } + body:lang(fa) .m-md-n3, + body:lang(ar) .m-md-n3, + body:lang(az) .m-md-n3, + body:lang(dv) .m-md-n3, + body:lang(he) .m-md-n3, + body:lang(ku) .m-md-n3, + body:lang(ur) .m-md-n3 { + margin: -1rem !important; } + body:lang(fa) .mt-md-n3, + body:lang(fa) .my-md-n3, + body:lang(ar) .mt-md-n3, + body:lang(ar) .my-md-n3, + body:lang(az) .mt-md-n3, + body:lang(az) .my-md-n3, + body:lang(dv) .mt-md-n3, + body:lang(dv) .my-md-n3, + body:lang(he) .mt-md-n3, + body:lang(he) .my-md-n3, + body:lang(ku) .mt-md-n3, + body:lang(ku) .my-md-n3, + body:lang(ur) .mt-md-n3, + body:lang(ur) .my-md-n3 { + margin-top: -1rem !important; } + body:lang(fa) .mr-md-n3, + body:lang(fa) .mx-md-n3, + body:lang(ar) .mr-md-n3, + body:lang(ar) .mx-md-n3, + body:lang(az) .mr-md-n3, + body:lang(az) .mx-md-n3, + body:lang(dv) .mr-md-n3, + body:lang(dv) .mx-md-n3, + body:lang(he) .mr-md-n3, + body:lang(he) .mx-md-n3, + body:lang(ku) .mr-md-n3, + body:lang(ku) .mx-md-n3, + body:lang(ur) .mr-md-n3, + body:lang(ur) .mx-md-n3 { + margin-right: -1rem !important; } + body:lang(fa) .mb-md-n3, + body:lang(fa) .my-md-n3, + body:lang(ar) .mb-md-n3, + body:lang(ar) .my-md-n3, + body:lang(az) .mb-md-n3, + body:lang(az) .my-md-n3, + body:lang(dv) .mb-md-n3, + body:lang(dv) .my-md-n3, + body:lang(he) .mb-md-n3, + body:lang(he) .my-md-n3, + body:lang(ku) .mb-md-n3, + body:lang(ku) .my-md-n3, + body:lang(ur) .mb-md-n3, + body:lang(ur) .my-md-n3 { + margin-bottom: -1rem !important; } + body:lang(fa) .ml-md-n3, + body:lang(fa) .mx-md-n3, + body:lang(ar) .ml-md-n3, + body:lang(ar) .mx-md-n3, + body:lang(az) .ml-md-n3, + body:lang(az) .mx-md-n3, + body:lang(dv) .ml-md-n3, + body:lang(dv) .mx-md-n3, + body:lang(he) .ml-md-n3, + body:lang(he) .mx-md-n3, + body:lang(ku) .ml-md-n3, + body:lang(ku) .mx-md-n3, + body:lang(ur) .ml-md-n3, + body:lang(ur) .mx-md-n3 { + margin-left: -1rem !important; } + body:lang(fa) .m-md-n4, + body:lang(ar) .m-md-n4, + body:lang(az) .m-md-n4, + body:lang(dv) .m-md-n4, + body:lang(he) .m-md-n4, + body:lang(ku) .m-md-n4, + body:lang(ur) .m-md-n4 { + margin: -1.5rem !important; } + body:lang(fa) .mt-md-n4, + body:lang(fa) .my-md-n4, + body:lang(ar) .mt-md-n4, + body:lang(ar) .my-md-n4, + body:lang(az) .mt-md-n4, + body:lang(az) .my-md-n4, + body:lang(dv) .mt-md-n4, + body:lang(dv) .my-md-n4, + body:lang(he) .mt-md-n4, + body:lang(he) .my-md-n4, + body:lang(ku) .mt-md-n4, + body:lang(ku) .my-md-n4, + body:lang(ur) .mt-md-n4, + body:lang(ur) .my-md-n4 { + margin-top: -1.5rem !important; } + body:lang(fa) .mr-md-n4, + body:lang(fa) .mx-md-n4, + body:lang(ar) .mr-md-n4, + body:lang(ar) .mx-md-n4, + body:lang(az) .mr-md-n4, + body:lang(az) .mx-md-n4, + body:lang(dv) .mr-md-n4, + body:lang(dv) .mx-md-n4, + body:lang(he) .mr-md-n4, + body:lang(he) .mx-md-n4, + body:lang(ku) .mr-md-n4, + body:lang(ku) .mx-md-n4, + body:lang(ur) .mr-md-n4, + body:lang(ur) .mx-md-n4 { + margin-right: -1.5rem !important; } + body:lang(fa) .mb-md-n4, + body:lang(fa) .my-md-n4, + body:lang(ar) .mb-md-n4, + body:lang(ar) .my-md-n4, + body:lang(az) .mb-md-n4, + body:lang(az) .my-md-n4, + body:lang(dv) .mb-md-n4, + body:lang(dv) .my-md-n4, + body:lang(he) .mb-md-n4, + body:lang(he) .my-md-n4, + body:lang(ku) .mb-md-n4, + body:lang(ku) .my-md-n4, + body:lang(ur) .mb-md-n4, + body:lang(ur) .my-md-n4 { + margin-bottom: -1.5rem !important; } + body:lang(fa) .ml-md-n4, + body:lang(fa) .mx-md-n4, + body:lang(ar) .ml-md-n4, + body:lang(ar) .mx-md-n4, + body:lang(az) .ml-md-n4, + body:lang(az) .mx-md-n4, + body:lang(dv) .ml-md-n4, + body:lang(dv) .mx-md-n4, + body:lang(he) .ml-md-n4, + body:lang(he) .mx-md-n4, + body:lang(ku) .ml-md-n4, + body:lang(ku) .mx-md-n4, + body:lang(ur) .ml-md-n4, + body:lang(ur) .mx-md-n4 { + margin-left: -1.5rem !important; } + body:lang(fa) .m-md-n5, + body:lang(ar) .m-md-n5, + body:lang(az) .m-md-n5, + body:lang(dv) .m-md-n5, + body:lang(he) .m-md-n5, + body:lang(ku) .m-md-n5, + body:lang(ur) .m-md-n5 { + margin: -3rem !important; } + body:lang(fa) .mt-md-n5, + body:lang(fa) .my-md-n5, + body:lang(ar) .mt-md-n5, + body:lang(ar) .my-md-n5, + body:lang(az) .mt-md-n5, + body:lang(az) .my-md-n5, + body:lang(dv) .mt-md-n5, + body:lang(dv) .my-md-n5, + body:lang(he) .mt-md-n5, + body:lang(he) .my-md-n5, + body:lang(ku) .mt-md-n5, + body:lang(ku) .my-md-n5, + body:lang(ur) .mt-md-n5, + body:lang(ur) .my-md-n5 { + margin-top: -3rem !important; } + body:lang(fa) .mr-md-n5, + body:lang(fa) .mx-md-n5, + body:lang(ar) .mr-md-n5, + body:lang(ar) .mx-md-n5, + body:lang(az) .mr-md-n5, + body:lang(az) .mx-md-n5, + body:lang(dv) .mr-md-n5, + body:lang(dv) .mx-md-n5, + body:lang(he) .mr-md-n5, + body:lang(he) .mx-md-n5, + body:lang(ku) .mr-md-n5, + body:lang(ku) .mx-md-n5, + body:lang(ur) .mr-md-n5, + body:lang(ur) .mx-md-n5 { + margin-right: -3rem !important; } + body:lang(fa) .mb-md-n5, + body:lang(fa) .my-md-n5, + body:lang(ar) .mb-md-n5, + body:lang(ar) .my-md-n5, + body:lang(az) .mb-md-n5, + body:lang(az) .my-md-n5, + body:lang(dv) .mb-md-n5, + body:lang(dv) .my-md-n5, + body:lang(he) .mb-md-n5, + body:lang(he) .my-md-n5, + body:lang(ku) .mb-md-n5, + body:lang(ku) .my-md-n5, + body:lang(ur) .mb-md-n5, + body:lang(ur) .my-md-n5 { + margin-bottom: -3rem !important; } + body:lang(fa) .ml-md-n5, + body:lang(fa) .mx-md-n5, + body:lang(ar) .ml-md-n5, + body:lang(ar) .mx-md-n5, + body:lang(az) .ml-md-n5, + body:lang(az) .mx-md-n5, + body:lang(dv) .ml-md-n5, + body:lang(dv) .mx-md-n5, + body:lang(he) .ml-md-n5, + body:lang(he) .mx-md-n5, + body:lang(ku) .ml-md-n5, + body:lang(ku) .mx-md-n5, + body:lang(ur) .ml-md-n5, + body:lang(ur) .mx-md-n5 { + margin-left: -3rem !important; } + body:lang(fa) .m-md-auto, + body:lang(ar) .m-md-auto, + body:lang(az) .m-md-auto, + body:lang(dv) .m-md-auto, + body:lang(he) .m-md-auto, + body:lang(ku) .m-md-auto, + body:lang(ur) .m-md-auto { + margin: auto !important; } + body:lang(fa) .mt-md-auto, + body:lang(fa) .my-md-auto, + body:lang(ar) .mt-md-auto, + body:lang(ar) .my-md-auto, + body:lang(az) .mt-md-auto, + body:lang(az) .my-md-auto, + body:lang(dv) .mt-md-auto, + body:lang(dv) .my-md-auto, + body:lang(he) .mt-md-auto, + body:lang(he) .my-md-auto, + body:lang(ku) .mt-md-auto, + body:lang(ku) .my-md-auto, + body:lang(ur) .mt-md-auto, + body:lang(ur) .my-md-auto { + margin-top: auto !important; } + body:lang(fa) .mr-md-auto, + body:lang(fa) .mx-md-auto, + body:lang(ar) .mr-md-auto, + body:lang(ar) .mx-md-auto, + body:lang(az) .mr-md-auto, + body:lang(az) .mx-md-auto, + body:lang(dv) .mr-md-auto, + body:lang(dv) .mx-md-auto, + body:lang(he) .mr-md-auto, + body:lang(he) .mx-md-auto, + body:lang(ku) .mr-md-auto, + body:lang(ku) .mx-md-auto, + body:lang(ur) .mr-md-auto, + body:lang(ur) .mx-md-auto { + margin-right: auto !important; } + body:lang(fa) .mb-md-auto, + body:lang(fa) .my-md-auto, + body:lang(ar) .mb-md-auto, + body:lang(ar) .my-md-auto, + body:lang(az) .mb-md-auto, + body:lang(az) .my-md-auto, + body:lang(dv) .mb-md-auto, + body:lang(dv) .my-md-auto, + body:lang(he) .mb-md-auto, + body:lang(he) .my-md-auto, + body:lang(ku) .mb-md-auto, + body:lang(ku) .my-md-auto, + body:lang(ur) .mb-md-auto, + body:lang(ur) .my-md-auto { + margin-bottom: auto !important; } + body:lang(fa) .ml-md-auto, + body:lang(fa) .mx-md-auto, + body:lang(ar) .ml-md-auto, + body:lang(ar) .mx-md-auto, + body:lang(az) .ml-md-auto, + body:lang(az) .mx-md-auto, + body:lang(dv) .ml-md-auto, + body:lang(dv) .mx-md-auto, + body:lang(he) .ml-md-auto, + body:lang(he) .mx-md-auto, + body:lang(ku) .ml-md-auto, + body:lang(ku) .mx-md-auto, + body:lang(ur) .ml-md-auto, + body:lang(ur) .mx-md-auto { + margin-left: auto !important; } } + @media (min-width: 992px) { + body:lang(fa) .m-lg-0, + body:lang(ar) .m-lg-0, + body:lang(az) .m-lg-0, + body:lang(dv) .m-lg-0, + body:lang(he) .m-lg-0, + body:lang(ku) .m-lg-0, + body:lang(ur) .m-lg-0 { + margin: 0 !important; } + body:lang(fa) .mt-lg-0, + body:lang(fa) .my-lg-0, + body:lang(ar) .mt-lg-0, + body:lang(ar) .my-lg-0, + body:lang(az) .mt-lg-0, + body:lang(az) .my-lg-0, + body:lang(dv) .mt-lg-0, + body:lang(dv) .my-lg-0, + body:lang(he) .mt-lg-0, + body:lang(he) .my-lg-0, + body:lang(ku) .mt-lg-0, + body:lang(ku) .my-lg-0, + body:lang(ur) .mt-lg-0, + body:lang(ur) .my-lg-0 { + margin-top: 0 !important; } + body:lang(fa) .mr-lg-0, + body:lang(fa) .mx-lg-0, + body:lang(ar) .mr-lg-0, + body:lang(ar) .mx-lg-0, + body:lang(az) .mr-lg-0, + body:lang(az) .mx-lg-0, + body:lang(dv) .mr-lg-0, + body:lang(dv) .mx-lg-0, + body:lang(he) .mr-lg-0, + body:lang(he) .mx-lg-0, + body:lang(ku) .mr-lg-0, + body:lang(ku) .mx-lg-0, + body:lang(ur) .mr-lg-0, + body:lang(ur) .mx-lg-0 { + margin-inline-end: 0 !important; } + body:lang(fa) .mb-lg-0, + body:lang(fa) .my-lg-0, + body:lang(ar) .mb-lg-0, + body:lang(ar) .my-lg-0, + body:lang(az) .mb-lg-0, + body:lang(az) .my-lg-0, + body:lang(dv) .mb-lg-0, + body:lang(dv) .my-lg-0, + body:lang(he) .mb-lg-0, + body:lang(he) .my-lg-0, + body:lang(ku) .mb-lg-0, + body:lang(ku) .my-lg-0, + body:lang(ur) .mb-lg-0, + body:lang(ur) .my-lg-0 { + margin-bottom: 0 !important; } + body:lang(fa) .ml-lg-0, + body:lang(fa) .mx-lg-0, + body:lang(ar) .ml-lg-0, + body:lang(ar) .mx-lg-0, + body:lang(az) .ml-lg-0, + body:lang(az) .mx-lg-0, + body:lang(dv) .ml-lg-0, + body:lang(dv) .mx-lg-0, + body:lang(he) .ml-lg-0, + body:lang(he) .mx-lg-0, + body:lang(ku) .ml-lg-0, + body:lang(ku) .mx-lg-0, + body:lang(ur) .ml-lg-0, + body:lang(ur) .mx-lg-0 { + margin-inline-start: 0 !important; } + body:lang(fa) .m-lg-1, + body:lang(ar) .m-lg-1, + body:lang(az) .m-lg-1, + body:lang(dv) .m-lg-1, + body:lang(he) .m-lg-1, + body:lang(ku) .m-lg-1, + body:lang(ur) .m-lg-1 { + margin: 0.25rem !important; } + body:lang(fa) .mt-lg-1, + body:lang(fa) .my-lg-1, + body:lang(ar) .mt-lg-1, + body:lang(ar) .my-lg-1, + body:lang(az) .mt-lg-1, + body:lang(az) .my-lg-1, + body:lang(dv) .mt-lg-1, + body:lang(dv) .my-lg-1, + body:lang(he) .mt-lg-1, + body:lang(he) .my-lg-1, + body:lang(ku) .mt-lg-1, + body:lang(ku) .my-lg-1, + body:lang(ur) .mt-lg-1, + body:lang(ur) .my-lg-1 { + margin-top: 0.25rem !important; } + body:lang(fa) .mr-lg-1, + body:lang(fa) .mx-lg-1, + body:lang(ar) .mr-lg-1, + body:lang(ar) .mx-lg-1, + body:lang(az) .mr-lg-1, + body:lang(az) .mx-lg-1, + body:lang(dv) .mr-lg-1, + body:lang(dv) .mx-lg-1, + body:lang(he) .mr-lg-1, + body:lang(he) .mx-lg-1, + body:lang(ku) .mr-lg-1, + body:lang(ku) .mx-lg-1, + body:lang(ur) .mr-lg-1, + body:lang(ur) .mx-lg-1 { + margin-inline-end: 0.25rem !important; } + body:lang(fa) .mb-lg-1, + body:lang(fa) .my-lg-1, + body:lang(ar) .mb-lg-1, + body:lang(ar) .my-lg-1, + body:lang(az) .mb-lg-1, + body:lang(az) .my-lg-1, + body:lang(dv) .mb-lg-1, + body:lang(dv) .my-lg-1, + body:lang(he) .mb-lg-1, + body:lang(he) .my-lg-1, + body:lang(ku) .mb-lg-1, + body:lang(ku) .my-lg-1, + body:lang(ur) .mb-lg-1, + body:lang(ur) .my-lg-1 { + margin-bottom: 0.25rem !important; } + body:lang(fa) .ml-lg-1, + body:lang(fa) .mx-lg-1, + body:lang(ar) .ml-lg-1, + body:lang(ar) .mx-lg-1, + body:lang(az) .ml-lg-1, + body:lang(az) .mx-lg-1, + body:lang(dv) .ml-lg-1, + body:lang(dv) .mx-lg-1, + body:lang(he) .ml-lg-1, + body:lang(he) .mx-lg-1, + body:lang(ku) .ml-lg-1, + body:lang(ku) .mx-lg-1, + body:lang(ur) .ml-lg-1, + body:lang(ur) .mx-lg-1 { + margin-inline-start: 0.25rem !important; } + body:lang(fa) .m-lg-2, + body:lang(ar) .m-lg-2, + body:lang(az) .m-lg-2, + body:lang(dv) .m-lg-2, + body:lang(he) .m-lg-2, + body:lang(ku) .m-lg-2, + body:lang(ur) .m-lg-2 { + margin: 0.5rem !important; } + body:lang(fa) .mt-lg-2, + body:lang(fa) .my-lg-2, + body:lang(ar) .mt-lg-2, + body:lang(ar) .my-lg-2, + body:lang(az) .mt-lg-2, + body:lang(az) .my-lg-2, + body:lang(dv) .mt-lg-2, + body:lang(dv) .my-lg-2, + body:lang(he) .mt-lg-2, + body:lang(he) .my-lg-2, + body:lang(ku) .mt-lg-2, + body:lang(ku) .my-lg-2, + body:lang(ur) .mt-lg-2, + body:lang(ur) .my-lg-2 { + margin-top: 0.5rem !important; } + body:lang(fa) .mr-lg-2, + body:lang(fa) .mx-lg-2, + body:lang(ar) .mr-lg-2, + body:lang(ar) .mx-lg-2, + body:lang(az) .mr-lg-2, + body:lang(az) .mx-lg-2, + body:lang(dv) .mr-lg-2, + body:lang(dv) .mx-lg-2, + body:lang(he) .mr-lg-2, + body:lang(he) .mx-lg-2, + body:lang(ku) .mr-lg-2, + body:lang(ku) .mx-lg-2, + body:lang(ur) .mr-lg-2, + body:lang(ur) .mx-lg-2 { + margin-inline-end: 0.5rem !important; } + body:lang(fa) .mb-lg-2, + body:lang(fa) .my-lg-2, + body:lang(ar) .mb-lg-2, + body:lang(ar) .my-lg-2, + body:lang(az) .mb-lg-2, + body:lang(az) .my-lg-2, + body:lang(dv) .mb-lg-2, + body:lang(dv) .my-lg-2, + body:lang(he) .mb-lg-2, + body:lang(he) .my-lg-2, + body:lang(ku) .mb-lg-2, + body:lang(ku) .my-lg-2, + body:lang(ur) .mb-lg-2, + body:lang(ur) .my-lg-2 { + margin-bottom: 0.5rem !important; } + body:lang(fa) .ml-lg-2, + body:lang(fa) .mx-lg-2, + body:lang(ar) .ml-lg-2, + body:lang(ar) .mx-lg-2, + body:lang(az) .ml-lg-2, + body:lang(az) .mx-lg-2, + body:lang(dv) .ml-lg-2, + body:lang(dv) .mx-lg-2, + body:lang(he) .ml-lg-2, + body:lang(he) .mx-lg-2, + body:lang(ku) .ml-lg-2, + body:lang(ku) .mx-lg-2, + body:lang(ur) .ml-lg-2, + body:lang(ur) .mx-lg-2 { + margin-inline-start: 0.5rem !important; } + body:lang(fa) .m-lg-3, + body:lang(ar) .m-lg-3, + body:lang(az) .m-lg-3, + body:lang(dv) .m-lg-3, + body:lang(he) .m-lg-3, + body:lang(ku) .m-lg-3, + body:lang(ur) .m-lg-3 { + margin: 1rem !important; } + body:lang(fa) .mt-lg-3, + body:lang(fa) .my-lg-3, + body:lang(ar) .mt-lg-3, + body:lang(ar) .my-lg-3, + body:lang(az) .mt-lg-3, + body:lang(az) .my-lg-3, + body:lang(dv) .mt-lg-3, + body:lang(dv) .my-lg-3, + body:lang(he) .mt-lg-3, + body:lang(he) .my-lg-3, + body:lang(ku) .mt-lg-3, + body:lang(ku) .my-lg-3, + body:lang(ur) .mt-lg-3, + body:lang(ur) .my-lg-3 { + margin-top: 1rem !important; } + body:lang(fa) .mr-lg-3, + body:lang(fa) .mx-lg-3, + body:lang(ar) .mr-lg-3, + body:lang(ar) .mx-lg-3, + body:lang(az) .mr-lg-3, + body:lang(az) .mx-lg-3, + body:lang(dv) .mr-lg-3, + body:lang(dv) .mx-lg-3, + body:lang(he) .mr-lg-3, + body:lang(he) .mx-lg-3, + body:lang(ku) .mr-lg-3, + body:lang(ku) .mx-lg-3, + body:lang(ur) .mr-lg-3, + body:lang(ur) .mx-lg-3 { + margin-inline-end: 1rem !important; } + body:lang(fa) .mb-lg-3, + body:lang(fa) .my-lg-3, + body:lang(ar) .mb-lg-3, + body:lang(ar) .my-lg-3, + body:lang(az) .mb-lg-3, + body:lang(az) .my-lg-3, + body:lang(dv) .mb-lg-3, + body:lang(dv) .my-lg-3, + body:lang(he) .mb-lg-3, + body:lang(he) .my-lg-3, + body:lang(ku) .mb-lg-3, + body:lang(ku) .my-lg-3, + body:lang(ur) .mb-lg-3, + body:lang(ur) .my-lg-3 { + margin-bottom: 1rem !important; } + body:lang(fa) .ml-lg-3, + body:lang(fa) .mx-lg-3, + body:lang(ar) .ml-lg-3, + body:lang(ar) .mx-lg-3, + body:lang(az) .ml-lg-3, + body:lang(az) .mx-lg-3, + body:lang(dv) .ml-lg-3, + body:lang(dv) .mx-lg-3, + body:lang(he) .ml-lg-3, + body:lang(he) .mx-lg-3, + body:lang(ku) .ml-lg-3, + body:lang(ku) .mx-lg-3, + body:lang(ur) .ml-lg-3, + body:lang(ur) .mx-lg-3 { + margin-inline-start: 1rem !important; } + body:lang(fa) .m-lg-4, + body:lang(ar) .m-lg-4, + body:lang(az) .m-lg-4, + body:lang(dv) .m-lg-4, + body:lang(he) .m-lg-4, + body:lang(ku) .m-lg-4, + body:lang(ur) .m-lg-4 { + margin: 1.5rem !important; } + body:lang(fa) .mt-lg-4, + body:lang(fa) .my-lg-4, + body:lang(ar) .mt-lg-4, + body:lang(ar) .my-lg-4, + body:lang(az) .mt-lg-4, + body:lang(az) .my-lg-4, + body:lang(dv) .mt-lg-4, + body:lang(dv) .my-lg-4, + body:lang(he) .mt-lg-4, + body:lang(he) .my-lg-4, + body:lang(ku) .mt-lg-4, + body:lang(ku) .my-lg-4, + body:lang(ur) .mt-lg-4, + body:lang(ur) .my-lg-4 { + margin-top: 1.5rem !important; } + body:lang(fa) .mr-lg-4, + body:lang(fa) .mx-lg-4, + body:lang(ar) .mr-lg-4, + body:lang(ar) .mx-lg-4, + body:lang(az) .mr-lg-4, + body:lang(az) .mx-lg-4, + body:lang(dv) .mr-lg-4, + body:lang(dv) .mx-lg-4, + body:lang(he) .mr-lg-4, + body:lang(he) .mx-lg-4, + body:lang(ku) .mr-lg-4, + body:lang(ku) .mx-lg-4, + body:lang(ur) .mr-lg-4, + body:lang(ur) .mx-lg-4 { + margin-inline-end: 1.5rem !important; } + body:lang(fa) .mb-lg-4, + body:lang(fa) .my-lg-4, + body:lang(ar) .mb-lg-4, + body:lang(ar) .my-lg-4, + body:lang(az) .mb-lg-4, + body:lang(az) .my-lg-4, + body:lang(dv) .mb-lg-4, + body:lang(dv) .my-lg-4, + body:lang(he) .mb-lg-4, + body:lang(he) .my-lg-4, + body:lang(ku) .mb-lg-4, + body:lang(ku) .my-lg-4, + body:lang(ur) .mb-lg-4, + body:lang(ur) .my-lg-4 { + margin-bottom: 1.5rem !important; } + body:lang(fa) .ml-lg-4, + body:lang(fa) .mx-lg-4, + body:lang(ar) .ml-lg-4, + body:lang(ar) .mx-lg-4, + body:lang(az) .ml-lg-4, + body:lang(az) .mx-lg-4, + body:lang(dv) .ml-lg-4, + body:lang(dv) .mx-lg-4, + body:lang(he) .ml-lg-4, + body:lang(he) .mx-lg-4, + body:lang(ku) .ml-lg-4, + body:lang(ku) .mx-lg-4, + body:lang(ur) .ml-lg-4, + body:lang(ur) .mx-lg-4 { + margin-inline-start: 1.5rem !important; } + body:lang(fa) .m-lg-5, + body:lang(ar) .m-lg-5, + body:lang(az) .m-lg-5, + body:lang(dv) .m-lg-5, + body:lang(he) .m-lg-5, + body:lang(ku) .m-lg-5, + body:lang(ur) .m-lg-5 { + margin: 3rem !important; } + body:lang(fa) .mt-lg-5, + body:lang(fa) .my-lg-5, + body:lang(ar) .mt-lg-5, + body:lang(ar) .my-lg-5, + body:lang(az) .mt-lg-5, + body:lang(az) .my-lg-5, + body:lang(dv) .mt-lg-5, + body:lang(dv) .my-lg-5, + body:lang(he) .mt-lg-5, + body:lang(he) .my-lg-5, + body:lang(ku) .mt-lg-5, + body:lang(ku) .my-lg-5, + body:lang(ur) .mt-lg-5, + body:lang(ur) .my-lg-5 { + margin-top: 3rem !important; } + body:lang(fa) .mr-lg-5, + body:lang(fa) .mx-lg-5, + body:lang(ar) .mr-lg-5, + body:lang(ar) .mx-lg-5, + body:lang(az) .mr-lg-5, + body:lang(az) .mx-lg-5, + body:lang(dv) .mr-lg-5, + body:lang(dv) .mx-lg-5, + body:lang(he) .mr-lg-5, + body:lang(he) .mx-lg-5, + body:lang(ku) .mr-lg-5, + body:lang(ku) .mx-lg-5, + body:lang(ur) .mr-lg-5, + body:lang(ur) .mx-lg-5 { + margin-inline-end: 3rem !important; } + body:lang(fa) .mb-lg-5, + body:lang(fa) .my-lg-5, + body:lang(ar) .mb-lg-5, + body:lang(ar) .my-lg-5, + body:lang(az) .mb-lg-5, + body:lang(az) .my-lg-5, + body:lang(dv) .mb-lg-5, + body:lang(dv) .my-lg-5, + body:lang(he) .mb-lg-5, + body:lang(he) .my-lg-5, + body:lang(ku) .mb-lg-5, + body:lang(ku) .my-lg-5, + body:lang(ur) .mb-lg-5, + body:lang(ur) .my-lg-5 { + margin-bottom: 3rem !important; } + body:lang(fa) .ml-lg-5, + body:lang(fa) .mx-lg-5, + body:lang(ar) .ml-lg-5, + body:lang(ar) .mx-lg-5, + body:lang(az) .ml-lg-5, + body:lang(az) .mx-lg-5, + body:lang(dv) .ml-lg-5, + body:lang(dv) .mx-lg-5, + body:lang(he) .ml-lg-5, + body:lang(he) .mx-lg-5, + body:lang(ku) .ml-lg-5, + body:lang(ku) .mx-lg-5, + body:lang(ur) .ml-lg-5, + body:lang(ur) .mx-lg-5 { + margin-inline-start: 3rem !important; } + body:lang(fa) .p-lg-0, + body:lang(ar) .p-lg-0, + body:lang(az) .p-lg-0, + body:lang(dv) .p-lg-0, + body:lang(he) .p-lg-0, + body:lang(ku) .p-lg-0, + body:lang(ur) .p-lg-0 { + padding: 0 !important; } + body:lang(fa) .pt-lg-0, + body:lang(fa) .py-lg-0, + body:lang(ar) .pt-lg-0, + body:lang(ar) .py-lg-0, + body:lang(az) .pt-lg-0, + body:lang(az) .py-lg-0, + body:lang(dv) .pt-lg-0, + body:lang(dv) .py-lg-0, + body:lang(he) .pt-lg-0, + body:lang(he) .py-lg-0, + body:lang(ku) .pt-lg-0, + body:lang(ku) .py-lg-0, + body:lang(ur) .pt-lg-0, + body:lang(ur) .py-lg-0 { + padding-top: 0 !important; } + body:lang(fa) .pr-lg-0, + body:lang(fa) .px-lg-0, + body:lang(ar) .pr-lg-0, + body:lang(ar) .px-lg-0, + body:lang(az) .pr-lg-0, + body:lang(az) .px-lg-0, + body:lang(dv) .pr-lg-0, + body:lang(dv) .px-lg-0, + body:lang(he) .pr-lg-0, + body:lang(he) .px-lg-0, + body:lang(ku) .pr-lg-0, + body:lang(ku) .px-lg-0, + body:lang(ur) .pr-lg-0, + body:lang(ur) .px-lg-0 { + padding-inline-end: 0 !important; } + body:lang(fa) .pb-lg-0, + body:lang(fa) .py-lg-0, + body:lang(ar) .pb-lg-0, + body:lang(ar) .py-lg-0, + body:lang(az) .pb-lg-0, + body:lang(az) .py-lg-0, + body:lang(dv) .pb-lg-0, + body:lang(dv) .py-lg-0, + body:lang(he) .pb-lg-0, + body:lang(he) .py-lg-0, + body:lang(ku) .pb-lg-0, + body:lang(ku) .py-lg-0, + body:lang(ur) .pb-lg-0, + body:lang(ur) .py-lg-0 { + padding-bottom: 0 !important; } + body:lang(fa) .pl-lg-0, + body:lang(fa) .px-lg-0, + body:lang(ar) .pl-lg-0, + body:lang(ar) .px-lg-0, + body:lang(az) .pl-lg-0, + body:lang(az) .px-lg-0, + body:lang(dv) .pl-lg-0, + body:lang(dv) .px-lg-0, + body:lang(he) .pl-lg-0, + body:lang(he) .px-lg-0, + body:lang(ku) .pl-lg-0, + body:lang(ku) .px-lg-0, + body:lang(ur) .pl-lg-0, + body:lang(ur) .px-lg-0 { + padding-inline-start: 0 !important; } + body:lang(fa) .p-lg-1, + body:lang(ar) .p-lg-1, + body:lang(az) .p-lg-1, + body:lang(dv) .p-lg-1, + body:lang(he) .p-lg-1, + body:lang(ku) .p-lg-1, + body:lang(ur) .p-lg-1 { + padding: 0.25rem !important; } + body:lang(fa) .pt-lg-1, + body:lang(fa) .py-lg-1, + body:lang(ar) .pt-lg-1, + body:lang(ar) .py-lg-1, + body:lang(az) .pt-lg-1, + body:lang(az) .py-lg-1, + body:lang(dv) .pt-lg-1, + body:lang(dv) .py-lg-1, + body:lang(he) .pt-lg-1, + body:lang(he) .py-lg-1, + body:lang(ku) .pt-lg-1, + body:lang(ku) .py-lg-1, + body:lang(ur) .pt-lg-1, + body:lang(ur) .py-lg-1 { + padding-top: 0.25rem !important; } + body:lang(fa) .pr-lg-1, + body:lang(fa) .px-lg-1, + body:lang(ar) .pr-lg-1, + body:lang(ar) .px-lg-1, + body:lang(az) .pr-lg-1, + body:lang(az) .px-lg-1, + body:lang(dv) .pr-lg-1, + body:lang(dv) .px-lg-1, + body:lang(he) .pr-lg-1, + body:lang(he) .px-lg-1, + body:lang(ku) .pr-lg-1, + body:lang(ku) .px-lg-1, + body:lang(ur) .pr-lg-1, + body:lang(ur) .px-lg-1 { + padding-inline-end: 0.25rem !important; } + body:lang(fa) .pb-lg-1, + body:lang(fa) .py-lg-1, + body:lang(ar) .pb-lg-1, + body:lang(ar) .py-lg-1, + body:lang(az) .pb-lg-1, + body:lang(az) .py-lg-1, + body:lang(dv) .pb-lg-1, + body:lang(dv) .py-lg-1, + body:lang(he) .pb-lg-1, + body:lang(he) .py-lg-1, + body:lang(ku) .pb-lg-1, + body:lang(ku) .py-lg-1, + body:lang(ur) .pb-lg-1, + body:lang(ur) .py-lg-1 { + padding-bottom: 0.25rem !important; } + body:lang(fa) .pl-lg-1, + body:lang(fa) .px-lg-1, + body:lang(ar) .pl-lg-1, + body:lang(ar) .px-lg-1, + body:lang(az) .pl-lg-1, + body:lang(az) .px-lg-1, + body:lang(dv) .pl-lg-1, + body:lang(dv) .px-lg-1, + body:lang(he) .pl-lg-1, + body:lang(he) .px-lg-1, + body:lang(ku) .pl-lg-1, + body:lang(ku) .px-lg-1, + body:lang(ur) .pl-lg-1, + body:lang(ur) .px-lg-1 { + padding-inline-start: 0.25rem !important; } + body:lang(fa) .p-lg-2, + body:lang(ar) .p-lg-2, + body:lang(az) .p-lg-2, + body:lang(dv) .p-lg-2, + body:lang(he) .p-lg-2, + body:lang(ku) .p-lg-2, + body:lang(ur) .p-lg-2 { + padding: 0.5rem !important; } + body:lang(fa) .pt-lg-2, + body:lang(fa) .py-lg-2, + body:lang(ar) .pt-lg-2, + body:lang(ar) .py-lg-2, + body:lang(az) .pt-lg-2, + body:lang(az) .py-lg-2, + body:lang(dv) .pt-lg-2, + body:lang(dv) .py-lg-2, + body:lang(he) .pt-lg-2, + body:lang(he) .py-lg-2, + body:lang(ku) .pt-lg-2, + body:lang(ku) .py-lg-2, + body:lang(ur) .pt-lg-2, + body:lang(ur) .py-lg-2 { + padding-top: 0.5rem !important; } + body:lang(fa) .pr-lg-2, + body:lang(fa) .px-lg-2, + body:lang(ar) .pr-lg-2, + body:lang(ar) .px-lg-2, + body:lang(az) .pr-lg-2, + body:lang(az) .px-lg-2, + body:lang(dv) .pr-lg-2, + body:lang(dv) .px-lg-2, + body:lang(he) .pr-lg-2, + body:lang(he) .px-lg-2, + body:lang(ku) .pr-lg-2, + body:lang(ku) .px-lg-2, + body:lang(ur) .pr-lg-2, + body:lang(ur) .px-lg-2 { + padding-inline-end: 0.5rem !important; } + body:lang(fa) .pb-lg-2, + body:lang(fa) .py-lg-2, + body:lang(ar) .pb-lg-2, + body:lang(ar) .py-lg-2, + body:lang(az) .pb-lg-2, + body:lang(az) .py-lg-2, + body:lang(dv) .pb-lg-2, + body:lang(dv) .py-lg-2, + body:lang(he) .pb-lg-2, + body:lang(he) .py-lg-2, + body:lang(ku) .pb-lg-2, + body:lang(ku) .py-lg-2, + body:lang(ur) .pb-lg-2, + body:lang(ur) .py-lg-2 { + padding-bottom: 0.5rem !important; } + body:lang(fa) .pl-lg-2, + body:lang(fa) .px-lg-2, + body:lang(ar) .pl-lg-2, + body:lang(ar) .px-lg-2, + body:lang(az) .pl-lg-2, + body:lang(az) .px-lg-2, + body:lang(dv) .pl-lg-2, + body:lang(dv) .px-lg-2, + body:lang(he) .pl-lg-2, + body:lang(he) .px-lg-2, + body:lang(ku) .pl-lg-2, + body:lang(ku) .px-lg-2, + body:lang(ur) .pl-lg-2, + body:lang(ur) .px-lg-2 { + padding-inline-start: 0.5rem !important; } + body:lang(fa) .p-lg-3, + body:lang(ar) .p-lg-3, + body:lang(az) .p-lg-3, + body:lang(dv) .p-lg-3, + body:lang(he) .p-lg-3, + body:lang(ku) .p-lg-3, + body:lang(ur) .p-lg-3 { + padding: 1rem !important; } + body:lang(fa) .pt-lg-3, + body:lang(fa) .py-lg-3, + body:lang(ar) .pt-lg-3, + body:lang(ar) .py-lg-3, + body:lang(az) .pt-lg-3, + body:lang(az) .py-lg-3, + body:lang(dv) .pt-lg-3, + body:lang(dv) .py-lg-3, + body:lang(he) .pt-lg-3, + body:lang(he) .py-lg-3, + body:lang(ku) .pt-lg-3, + body:lang(ku) .py-lg-3, + body:lang(ur) .pt-lg-3, + body:lang(ur) .py-lg-3 { + padding-top: 1rem !important; } + body:lang(fa) .pr-lg-3, + body:lang(fa) .px-lg-3, + body:lang(ar) .pr-lg-3, + body:lang(ar) .px-lg-3, + body:lang(az) .pr-lg-3, + body:lang(az) .px-lg-3, + body:lang(dv) .pr-lg-3, + body:lang(dv) .px-lg-3, + body:lang(he) .pr-lg-3, + body:lang(he) .px-lg-3, + body:lang(ku) .pr-lg-3, + body:lang(ku) .px-lg-3, + body:lang(ur) .pr-lg-3, + body:lang(ur) .px-lg-3 { + padding-inline-end: 1rem !important; } + body:lang(fa) .pb-lg-3, + body:lang(fa) .py-lg-3, + body:lang(ar) .pb-lg-3, + body:lang(ar) .py-lg-3, + body:lang(az) .pb-lg-3, + body:lang(az) .py-lg-3, + body:lang(dv) .pb-lg-3, + body:lang(dv) .py-lg-3, + body:lang(he) .pb-lg-3, + body:lang(he) .py-lg-3, + body:lang(ku) .pb-lg-3, + body:lang(ku) .py-lg-3, + body:lang(ur) .pb-lg-3, + body:lang(ur) .py-lg-3 { + padding-bottom: 1rem !important; } + body:lang(fa) .pl-lg-3, + body:lang(fa) .px-lg-3, + body:lang(ar) .pl-lg-3, + body:lang(ar) .px-lg-3, + body:lang(az) .pl-lg-3, + body:lang(az) .px-lg-3, + body:lang(dv) .pl-lg-3, + body:lang(dv) .px-lg-3, + body:lang(he) .pl-lg-3, + body:lang(he) .px-lg-3, + body:lang(ku) .pl-lg-3, + body:lang(ku) .px-lg-3, + body:lang(ur) .pl-lg-3, + body:lang(ur) .px-lg-3 { + padding-inline-start: 1rem !important; } + body:lang(fa) .p-lg-4, + body:lang(ar) .p-lg-4, + body:lang(az) .p-lg-4, + body:lang(dv) .p-lg-4, + body:lang(he) .p-lg-4, + body:lang(ku) .p-lg-4, + body:lang(ur) .p-lg-4 { + padding: 1.5rem !important; } + body:lang(fa) .pt-lg-4, + body:lang(fa) .py-lg-4, + body:lang(ar) .pt-lg-4, + body:lang(ar) .py-lg-4, + body:lang(az) .pt-lg-4, + body:lang(az) .py-lg-4, + body:lang(dv) .pt-lg-4, + body:lang(dv) .py-lg-4, + body:lang(he) .pt-lg-4, + body:lang(he) .py-lg-4, + body:lang(ku) .pt-lg-4, + body:lang(ku) .py-lg-4, + body:lang(ur) .pt-lg-4, + body:lang(ur) .py-lg-4 { + padding-top: 1.5rem !important; } + body:lang(fa) .pr-lg-4, + body:lang(fa) .px-lg-4, + body:lang(ar) .pr-lg-4, + body:lang(ar) .px-lg-4, + body:lang(az) .pr-lg-4, + body:lang(az) .px-lg-4, + body:lang(dv) .pr-lg-4, + body:lang(dv) .px-lg-4, + body:lang(he) .pr-lg-4, + body:lang(he) .px-lg-4, + body:lang(ku) .pr-lg-4, + body:lang(ku) .px-lg-4, + body:lang(ur) .pr-lg-4, + body:lang(ur) .px-lg-4 { + padding-inline-end: 1.5rem !important; } + body:lang(fa) .pb-lg-4, + body:lang(fa) .py-lg-4, + body:lang(ar) .pb-lg-4, + body:lang(ar) .py-lg-4, + body:lang(az) .pb-lg-4, + body:lang(az) .py-lg-4, + body:lang(dv) .pb-lg-4, + body:lang(dv) .py-lg-4, + body:lang(he) .pb-lg-4, + body:lang(he) .py-lg-4, + body:lang(ku) .pb-lg-4, + body:lang(ku) .py-lg-4, + body:lang(ur) .pb-lg-4, + body:lang(ur) .py-lg-4 { + padding-bottom: 1.5rem !important; } + body:lang(fa) .pl-lg-4, + body:lang(fa) .px-lg-4, + body:lang(ar) .pl-lg-4, + body:lang(ar) .px-lg-4, + body:lang(az) .pl-lg-4, + body:lang(az) .px-lg-4, + body:lang(dv) .pl-lg-4, + body:lang(dv) .px-lg-4, + body:lang(he) .pl-lg-4, + body:lang(he) .px-lg-4, + body:lang(ku) .pl-lg-4, + body:lang(ku) .px-lg-4, + body:lang(ur) .pl-lg-4, + body:lang(ur) .px-lg-4 { + padding-inline-start: 1.5rem !important; } + body:lang(fa) .p-lg-5, + body:lang(ar) .p-lg-5, + body:lang(az) .p-lg-5, + body:lang(dv) .p-lg-5, + body:lang(he) .p-lg-5, + body:lang(ku) .p-lg-5, + body:lang(ur) .p-lg-5 { + padding: 3rem !important; } + body:lang(fa) .pt-lg-5, + body:lang(fa) .py-lg-5, + body:lang(ar) .pt-lg-5, + body:lang(ar) .py-lg-5, + body:lang(az) .pt-lg-5, + body:lang(az) .py-lg-5, + body:lang(dv) .pt-lg-5, + body:lang(dv) .py-lg-5, + body:lang(he) .pt-lg-5, + body:lang(he) .py-lg-5, + body:lang(ku) .pt-lg-5, + body:lang(ku) .py-lg-5, + body:lang(ur) .pt-lg-5, + body:lang(ur) .py-lg-5 { + padding-top: 3rem !important; } + body:lang(fa) .pr-lg-5, + body:lang(fa) .px-lg-5, + body:lang(ar) .pr-lg-5, + body:lang(ar) .px-lg-5, + body:lang(az) .pr-lg-5, + body:lang(az) .px-lg-5, + body:lang(dv) .pr-lg-5, + body:lang(dv) .px-lg-5, + body:lang(he) .pr-lg-5, + body:lang(he) .px-lg-5, + body:lang(ku) .pr-lg-5, + body:lang(ku) .px-lg-5, + body:lang(ur) .pr-lg-5, + body:lang(ur) .px-lg-5 { + padding-inline-end: 3rem !important; } + body:lang(fa) .pb-lg-5, + body:lang(fa) .py-lg-5, + body:lang(ar) .pb-lg-5, + body:lang(ar) .py-lg-5, + body:lang(az) .pb-lg-5, + body:lang(az) .py-lg-5, + body:lang(dv) .pb-lg-5, + body:lang(dv) .py-lg-5, + body:lang(he) .pb-lg-5, + body:lang(he) .py-lg-5, + body:lang(ku) .pb-lg-5, + body:lang(ku) .py-lg-5, + body:lang(ur) .pb-lg-5, + body:lang(ur) .py-lg-5 { + padding-bottom: 3rem !important; } + body:lang(fa) .pl-lg-5, + body:lang(fa) .px-lg-5, + body:lang(ar) .pl-lg-5, + body:lang(ar) .px-lg-5, + body:lang(az) .pl-lg-5, + body:lang(az) .px-lg-5, + body:lang(dv) .pl-lg-5, + body:lang(dv) .px-lg-5, + body:lang(he) .pl-lg-5, + body:lang(he) .px-lg-5, + body:lang(ku) .pl-lg-5, + body:lang(ku) .px-lg-5, + body:lang(ur) .pl-lg-5, + body:lang(ur) .px-lg-5 { + padding-inline-start: 3rem !important; } + body:lang(fa) .m-lg-n1, + body:lang(ar) .m-lg-n1, + body:lang(az) .m-lg-n1, + body:lang(dv) .m-lg-n1, + body:lang(he) .m-lg-n1, + body:lang(ku) .m-lg-n1, + body:lang(ur) .m-lg-n1 { + margin: -0.25rem !important; } + body:lang(fa) .mt-lg-n1, + body:lang(fa) .my-lg-n1, + body:lang(ar) .mt-lg-n1, + body:lang(ar) .my-lg-n1, + body:lang(az) .mt-lg-n1, + body:lang(az) .my-lg-n1, + body:lang(dv) .mt-lg-n1, + body:lang(dv) .my-lg-n1, + body:lang(he) .mt-lg-n1, + body:lang(he) .my-lg-n1, + body:lang(ku) .mt-lg-n1, + body:lang(ku) .my-lg-n1, + body:lang(ur) .mt-lg-n1, + body:lang(ur) .my-lg-n1 { + margin-top: -0.25rem !important; } + body:lang(fa) .mr-lg-n1, + body:lang(fa) .mx-lg-n1, + body:lang(ar) .mr-lg-n1, + body:lang(ar) .mx-lg-n1, + body:lang(az) .mr-lg-n1, + body:lang(az) .mx-lg-n1, + body:lang(dv) .mr-lg-n1, + body:lang(dv) .mx-lg-n1, + body:lang(he) .mr-lg-n1, + body:lang(he) .mx-lg-n1, + body:lang(ku) .mr-lg-n1, + body:lang(ku) .mx-lg-n1, + body:lang(ur) .mr-lg-n1, + body:lang(ur) .mx-lg-n1 { + margin-right: -0.25rem !important; } + body:lang(fa) .mb-lg-n1, + body:lang(fa) .my-lg-n1, + body:lang(ar) .mb-lg-n1, + body:lang(ar) .my-lg-n1, + body:lang(az) .mb-lg-n1, + body:lang(az) .my-lg-n1, + body:lang(dv) .mb-lg-n1, + body:lang(dv) .my-lg-n1, + body:lang(he) .mb-lg-n1, + body:lang(he) .my-lg-n1, + body:lang(ku) .mb-lg-n1, + body:lang(ku) .my-lg-n1, + body:lang(ur) .mb-lg-n1, + body:lang(ur) .my-lg-n1 { + margin-bottom: -0.25rem !important; } + body:lang(fa) .ml-lg-n1, + body:lang(fa) .mx-lg-n1, + body:lang(ar) .ml-lg-n1, + body:lang(ar) .mx-lg-n1, + body:lang(az) .ml-lg-n1, + body:lang(az) .mx-lg-n1, + body:lang(dv) .ml-lg-n1, + body:lang(dv) .mx-lg-n1, + body:lang(he) .ml-lg-n1, + body:lang(he) .mx-lg-n1, + body:lang(ku) .ml-lg-n1, + body:lang(ku) .mx-lg-n1, + body:lang(ur) .ml-lg-n1, + body:lang(ur) .mx-lg-n1 { + margin-left: -0.25rem !important; } + body:lang(fa) .m-lg-n2, + body:lang(ar) .m-lg-n2, + body:lang(az) .m-lg-n2, + body:lang(dv) .m-lg-n2, + body:lang(he) .m-lg-n2, + body:lang(ku) .m-lg-n2, + body:lang(ur) .m-lg-n2 { + margin: -0.5rem !important; } + body:lang(fa) .mt-lg-n2, + body:lang(fa) .my-lg-n2, + body:lang(ar) .mt-lg-n2, + body:lang(ar) .my-lg-n2, + body:lang(az) .mt-lg-n2, + body:lang(az) .my-lg-n2, + body:lang(dv) .mt-lg-n2, + body:lang(dv) .my-lg-n2, + body:lang(he) .mt-lg-n2, + body:lang(he) .my-lg-n2, + body:lang(ku) .mt-lg-n2, + body:lang(ku) .my-lg-n2, + body:lang(ur) .mt-lg-n2, + body:lang(ur) .my-lg-n2 { + margin-top: -0.5rem !important; } + body:lang(fa) .mr-lg-n2, + body:lang(fa) .mx-lg-n2, + body:lang(ar) .mr-lg-n2, + body:lang(ar) .mx-lg-n2, + body:lang(az) .mr-lg-n2, + body:lang(az) .mx-lg-n2, + body:lang(dv) .mr-lg-n2, + body:lang(dv) .mx-lg-n2, + body:lang(he) .mr-lg-n2, + body:lang(he) .mx-lg-n2, + body:lang(ku) .mr-lg-n2, + body:lang(ku) .mx-lg-n2, + body:lang(ur) .mr-lg-n2, + body:lang(ur) .mx-lg-n2 { + margin-right: -0.5rem !important; } + body:lang(fa) .mb-lg-n2, + body:lang(fa) .my-lg-n2, + body:lang(ar) .mb-lg-n2, + body:lang(ar) .my-lg-n2, + body:lang(az) .mb-lg-n2, + body:lang(az) .my-lg-n2, + body:lang(dv) .mb-lg-n2, + body:lang(dv) .my-lg-n2, + body:lang(he) .mb-lg-n2, + body:lang(he) .my-lg-n2, + body:lang(ku) .mb-lg-n2, + body:lang(ku) .my-lg-n2, + body:lang(ur) .mb-lg-n2, + body:lang(ur) .my-lg-n2 { + margin-bottom: -0.5rem !important; } + body:lang(fa) .ml-lg-n2, + body:lang(fa) .mx-lg-n2, + body:lang(ar) .ml-lg-n2, + body:lang(ar) .mx-lg-n2, + body:lang(az) .ml-lg-n2, + body:lang(az) .mx-lg-n2, + body:lang(dv) .ml-lg-n2, + body:lang(dv) .mx-lg-n2, + body:lang(he) .ml-lg-n2, + body:lang(he) .mx-lg-n2, + body:lang(ku) .ml-lg-n2, + body:lang(ku) .mx-lg-n2, + body:lang(ur) .ml-lg-n2, + body:lang(ur) .mx-lg-n2 { + margin-left: -0.5rem !important; } + body:lang(fa) .m-lg-n3, + body:lang(ar) .m-lg-n3, + body:lang(az) .m-lg-n3, + body:lang(dv) .m-lg-n3, + body:lang(he) .m-lg-n3, + body:lang(ku) .m-lg-n3, + body:lang(ur) .m-lg-n3 { + margin: -1rem !important; } + body:lang(fa) .mt-lg-n3, + body:lang(fa) .my-lg-n3, + body:lang(ar) .mt-lg-n3, + body:lang(ar) .my-lg-n3, + body:lang(az) .mt-lg-n3, + body:lang(az) .my-lg-n3, + body:lang(dv) .mt-lg-n3, + body:lang(dv) .my-lg-n3, + body:lang(he) .mt-lg-n3, + body:lang(he) .my-lg-n3, + body:lang(ku) .mt-lg-n3, + body:lang(ku) .my-lg-n3, + body:lang(ur) .mt-lg-n3, + body:lang(ur) .my-lg-n3 { + margin-top: -1rem !important; } + body:lang(fa) .mr-lg-n3, + body:lang(fa) .mx-lg-n3, + body:lang(ar) .mr-lg-n3, + body:lang(ar) .mx-lg-n3, + body:lang(az) .mr-lg-n3, + body:lang(az) .mx-lg-n3, + body:lang(dv) .mr-lg-n3, + body:lang(dv) .mx-lg-n3, + body:lang(he) .mr-lg-n3, + body:lang(he) .mx-lg-n3, + body:lang(ku) .mr-lg-n3, + body:lang(ku) .mx-lg-n3, + body:lang(ur) .mr-lg-n3, + body:lang(ur) .mx-lg-n3 { + margin-right: -1rem !important; } + body:lang(fa) .mb-lg-n3, + body:lang(fa) .my-lg-n3, + body:lang(ar) .mb-lg-n3, + body:lang(ar) .my-lg-n3, + body:lang(az) .mb-lg-n3, + body:lang(az) .my-lg-n3, + body:lang(dv) .mb-lg-n3, + body:lang(dv) .my-lg-n3, + body:lang(he) .mb-lg-n3, + body:lang(he) .my-lg-n3, + body:lang(ku) .mb-lg-n3, + body:lang(ku) .my-lg-n3, + body:lang(ur) .mb-lg-n3, + body:lang(ur) .my-lg-n3 { + margin-bottom: -1rem !important; } + body:lang(fa) .ml-lg-n3, + body:lang(fa) .mx-lg-n3, + body:lang(ar) .ml-lg-n3, + body:lang(ar) .mx-lg-n3, + body:lang(az) .ml-lg-n3, + body:lang(az) .mx-lg-n3, + body:lang(dv) .ml-lg-n3, + body:lang(dv) .mx-lg-n3, + body:lang(he) .ml-lg-n3, + body:lang(he) .mx-lg-n3, + body:lang(ku) .ml-lg-n3, + body:lang(ku) .mx-lg-n3, + body:lang(ur) .ml-lg-n3, + body:lang(ur) .mx-lg-n3 { + margin-left: -1rem !important; } + body:lang(fa) .m-lg-n4, + body:lang(ar) .m-lg-n4, + body:lang(az) .m-lg-n4, + body:lang(dv) .m-lg-n4, + body:lang(he) .m-lg-n4, + body:lang(ku) .m-lg-n4, + body:lang(ur) .m-lg-n4 { + margin: -1.5rem !important; } + body:lang(fa) .mt-lg-n4, + body:lang(fa) .my-lg-n4, + body:lang(ar) .mt-lg-n4, + body:lang(ar) .my-lg-n4, + body:lang(az) .mt-lg-n4, + body:lang(az) .my-lg-n4, + body:lang(dv) .mt-lg-n4, + body:lang(dv) .my-lg-n4, + body:lang(he) .mt-lg-n4, + body:lang(he) .my-lg-n4, + body:lang(ku) .mt-lg-n4, + body:lang(ku) .my-lg-n4, + body:lang(ur) .mt-lg-n4, + body:lang(ur) .my-lg-n4 { + margin-top: -1.5rem !important; } + body:lang(fa) .mr-lg-n4, + body:lang(fa) .mx-lg-n4, + body:lang(ar) .mr-lg-n4, + body:lang(ar) .mx-lg-n4, + body:lang(az) .mr-lg-n4, + body:lang(az) .mx-lg-n4, + body:lang(dv) .mr-lg-n4, + body:lang(dv) .mx-lg-n4, + body:lang(he) .mr-lg-n4, + body:lang(he) .mx-lg-n4, + body:lang(ku) .mr-lg-n4, + body:lang(ku) .mx-lg-n4, + body:lang(ur) .mr-lg-n4, + body:lang(ur) .mx-lg-n4 { + margin-right: -1.5rem !important; } + body:lang(fa) .mb-lg-n4, + body:lang(fa) .my-lg-n4, + body:lang(ar) .mb-lg-n4, + body:lang(ar) .my-lg-n4, + body:lang(az) .mb-lg-n4, + body:lang(az) .my-lg-n4, + body:lang(dv) .mb-lg-n4, + body:lang(dv) .my-lg-n4, + body:lang(he) .mb-lg-n4, + body:lang(he) .my-lg-n4, + body:lang(ku) .mb-lg-n4, + body:lang(ku) .my-lg-n4, + body:lang(ur) .mb-lg-n4, + body:lang(ur) .my-lg-n4 { + margin-bottom: -1.5rem !important; } + body:lang(fa) .ml-lg-n4, + body:lang(fa) .mx-lg-n4, + body:lang(ar) .ml-lg-n4, + body:lang(ar) .mx-lg-n4, + body:lang(az) .ml-lg-n4, + body:lang(az) .mx-lg-n4, + body:lang(dv) .ml-lg-n4, + body:lang(dv) .mx-lg-n4, + body:lang(he) .ml-lg-n4, + body:lang(he) .mx-lg-n4, + body:lang(ku) .ml-lg-n4, + body:lang(ku) .mx-lg-n4, + body:lang(ur) .ml-lg-n4, + body:lang(ur) .mx-lg-n4 { + margin-left: -1.5rem !important; } + body:lang(fa) .m-lg-n5, + body:lang(ar) .m-lg-n5, + body:lang(az) .m-lg-n5, + body:lang(dv) .m-lg-n5, + body:lang(he) .m-lg-n5, + body:lang(ku) .m-lg-n5, + body:lang(ur) .m-lg-n5 { + margin: -3rem !important; } + body:lang(fa) .mt-lg-n5, + body:lang(fa) .my-lg-n5, + body:lang(ar) .mt-lg-n5, + body:lang(ar) .my-lg-n5, + body:lang(az) .mt-lg-n5, + body:lang(az) .my-lg-n5, + body:lang(dv) .mt-lg-n5, + body:lang(dv) .my-lg-n5, + body:lang(he) .mt-lg-n5, + body:lang(he) .my-lg-n5, + body:lang(ku) .mt-lg-n5, + body:lang(ku) .my-lg-n5, + body:lang(ur) .mt-lg-n5, + body:lang(ur) .my-lg-n5 { + margin-top: -3rem !important; } + body:lang(fa) .mr-lg-n5, + body:lang(fa) .mx-lg-n5, + body:lang(ar) .mr-lg-n5, + body:lang(ar) .mx-lg-n5, + body:lang(az) .mr-lg-n5, + body:lang(az) .mx-lg-n5, + body:lang(dv) .mr-lg-n5, + body:lang(dv) .mx-lg-n5, + body:lang(he) .mr-lg-n5, + body:lang(he) .mx-lg-n5, + body:lang(ku) .mr-lg-n5, + body:lang(ku) .mx-lg-n5, + body:lang(ur) .mr-lg-n5, + body:lang(ur) .mx-lg-n5 { + margin-right: -3rem !important; } + body:lang(fa) .mb-lg-n5, + body:lang(fa) .my-lg-n5, + body:lang(ar) .mb-lg-n5, + body:lang(ar) .my-lg-n5, + body:lang(az) .mb-lg-n5, + body:lang(az) .my-lg-n5, + body:lang(dv) .mb-lg-n5, + body:lang(dv) .my-lg-n5, + body:lang(he) .mb-lg-n5, + body:lang(he) .my-lg-n5, + body:lang(ku) .mb-lg-n5, + body:lang(ku) .my-lg-n5, + body:lang(ur) .mb-lg-n5, + body:lang(ur) .my-lg-n5 { + margin-bottom: -3rem !important; } + body:lang(fa) .ml-lg-n5, + body:lang(fa) .mx-lg-n5, + body:lang(ar) .ml-lg-n5, + body:lang(ar) .mx-lg-n5, + body:lang(az) .ml-lg-n5, + body:lang(az) .mx-lg-n5, + body:lang(dv) .ml-lg-n5, + body:lang(dv) .mx-lg-n5, + body:lang(he) .ml-lg-n5, + body:lang(he) .mx-lg-n5, + body:lang(ku) .ml-lg-n5, + body:lang(ku) .mx-lg-n5, + body:lang(ur) .ml-lg-n5, + body:lang(ur) .mx-lg-n5 { + margin-left: -3rem !important; } + body:lang(fa) .m-lg-auto, + body:lang(ar) .m-lg-auto, + body:lang(az) .m-lg-auto, + body:lang(dv) .m-lg-auto, + body:lang(he) .m-lg-auto, + body:lang(ku) .m-lg-auto, + body:lang(ur) .m-lg-auto { + margin: auto !important; } + body:lang(fa) .mt-lg-auto, + body:lang(fa) .my-lg-auto, + body:lang(ar) .mt-lg-auto, + body:lang(ar) .my-lg-auto, + body:lang(az) .mt-lg-auto, + body:lang(az) .my-lg-auto, + body:lang(dv) .mt-lg-auto, + body:lang(dv) .my-lg-auto, + body:lang(he) .mt-lg-auto, + body:lang(he) .my-lg-auto, + body:lang(ku) .mt-lg-auto, + body:lang(ku) .my-lg-auto, + body:lang(ur) .mt-lg-auto, + body:lang(ur) .my-lg-auto { + margin-top: auto !important; } + body:lang(fa) .mr-lg-auto, + body:lang(fa) .mx-lg-auto, + body:lang(ar) .mr-lg-auto, + body:lang(ar) .mx-lg-auto, + body:lang(az) .mr-lg-auto, + body:lang(az) .mx-lg-auto, + body:lang(dv) .mr-lg-auto, + body:lang(dv) .mx-lg-auto, + body:lang(he) .mr-lg-auto, + body:lang(he) .mx-lg-auto, + body:lang(ku) .mr-lg-auto, + body:lang(ku) .mx-lg-auto, + body:lang(ur) .mr-lg-auto, + body:lang(ur) .mx-lg-auto { + margin-right: auto !important; } + body:lang(fa) .mb-lg-auto, + body:lang(fa) .my-lg-auto, + body:lang(ar) .mb-lg-auto, + body:lang(ar) .my-lg-auto, + body:lang(az) .mb-lg-auto, + body:lang(az) .my-lg-auto, + body:lang(dv) .mb-lg-auto, + body:lang(dv) .my-lg-auto, + body:lang(he) .mb-lg-auto, + body:lang(he) .my-lg-auto, + body:lang(ku) .mb-lg-auto, + body:lang(ku) .my-lg-auto, + body:lang(ur) .mb-lg-auto, + body:lang(ur) .my-lg-auto { + margin-bottom: auto !important; } + body:lang(fa) .ml-lg-auto, + body:lang(fa) .mx-lg-auto, + body:lang(ar) .ml-lg-auto, + body:lang(ar) .mx-lg-auto, + body:lang(az) .ml-lg-auto, + body:lang(az) .mx-lg-auto, + body:lang(dv) .ml-lg-auto, + body:lang(dv) .mx-lg-auto, + body:lang(he) .ml-lg-auto, + body:lang(he) .mx-lg-auto, + body:lang(ku) .ml-lg-auto, + body:lang(ku) .mx-lg-auto, + body:lang(ur) .ml-lg-auto, + body:lang(ur) .mx-lg-auto { + margin-left: auto !important; } } + @media (min-width: 1200px) { + body:lang(fa) .m-xl-0, + body:lang(ar) .m-xl-0, + body:lang(az) .m-xl-0, + body:lang(dv) .m-xl-0, + body:lang(he) .m-xl-0, + body:lang(ku) .m-xl-0, + body:lang(ur) .m-xl-0 { + margin: 0 !important; } + body:lang(fa) .mt-xl-0, + body:lang(fa) .my-xl-0, + body:lang(ar) .mt-xl-0, + body:lang(ar) .my-xl-0, + body:lang(az) .mt-xl-0, + body:lang(az) .my-xl-0, + body:lang(dv) .mt-xl-0, + body:lang(dv) .my-xl-0, + body:lang(he) .mt-xl-0, + body:lang(he) .my-xl-0, + body:lang(ku) .mt-xl-0, + body:lang(ku) .my-xl-0, + body:lang(ur) .mt-xl-0, + body:lang(ur) .my-xl-0 { + margin-top: 0 !important; } + body:lang(fa) .mr-xl-0, + body:lang(fa) .mx-xl-0, + body:lang(ar) .mr-xl-0, + body:lang(ar) .mx-xl-0, + body:lang(az) .mr-xl-0, + body:lang(az) .mx-xl-0, + body:lang(dv) .mr-xl-0, + body:lang(dv) .mx-xl-0, + body:lang(he) .mr-xl-0, + body:lang(he) .mx-xl-0, + body:lang(ku) .mr-xl-0, + body:lang(ku) .mx-xl-0, + body:lang(ur) .mr-xl-0, + body:lang(ur) .mx-xl-0 { + margin-inline-end: 0 !important; } + body:lang(fa) .mb-xl-0, + body:lang(fa) .my-xl-0, + body:lang(ar) .mb-xl-0, + body:lang(ar) .my-xl-0, + body:lang(az) .mb-xl-0, + body:lang(az) .my-xl-0, + body:lang(dv) .mb-xl-0, + body:lang(dv) .my-xl-0, + body:lang(he) .mb-xl-0, + body:lang(he) .my-xl-0, + body:lang(ku) .mb-xl-0, + body:lang(ku) .my-xl-0, + body:lang(ur) .mb-xl-0, + body:lang(ur) .my-xl-0 { + margin-bottom: 0 !important; } + body:lang(fa) .ml-xl-0, + body:lang(fa) .mx-xl-0, + body:lang(ar) .ml-xl-0, + body:lang(ar) .mx-xl-0, + body:lang(az) .ml-xl-0, + body:lang(az) .mx-xl-0, + body:lang(dv) .ml-xl-0, + body:lang(dv) .mx-xl-0, + body:lang(he) .ml-xl-0, + body:lang(he) .mx-xl-0, + body:lang(ku) .ml-xl-0, + body:lang(ku) .mx-xl-0, + body:lang(ur) .ml-xl-0, + body:lang(ur) .mx-xl-0 { + margin-inline-start: 0 !important; } + body:lang(fa) .m-xl-1, + body:lang(ar) .m-xl-1, + body:lang(az) .m-xl-1, + body:lang(dv) .m-xl-1, + body:lang(he) .m-xl-1, + body:lang(ku) .m-xl-1, + body:lang(ur) .m-xl-1 { + margin: 0.25rem !important; } + body:lang(fa) .mt-xl-1, + body:lang(fa) .my-xl-1, + body:lang(ar) .mt-xl-1, + body:lang(ar) .my-xl-1, + body:lang(az) .mt-xl-1, + body:lang(az) .my-xl-1, + body:lang(dv) .mt-xl-1, + body:lang(dv) .my-xl-1, + body:lang(he) .mt-xl-1, + body:lang(he) .my-xl-1, + body:lang(ku) .mt-xl-1, + body:lang(ku) .my-xl-1, + body:lang(ur) .mt-xl-1, + body:lang(ur) .my-xl-1 { + margin-top: 0.25rem !important; } + body:lang(fa) .mr-xl-1, + body:lang(fa) .mx-xl-1, + body:lang(ar) .mr-xl-1, + body:lang(ar) .mx-xl-1, + body:lang(az) .mr-xl-1, + body:lang(az) .mx-xl-1, + body:lang(dv) .mr-xl-1, + body:lang(dv) .mx-xl-1, + body:lang(he) .mr-xl-1, + body:lang(he) .mx-xl-1, + body:lang(ku) .mr-xl-1, + body:lang(ku) .mx-xl-1, + body:lang(ur) .mr-xl-1, + body:lang(ur) .mx-xl-1 { + margin-inline-end: 0.25rem !important; } + body:lang(fa) .mb-xl-1, + body:lang(fa) .my-xl-1, + body:lang(ar) .mb-xl-1, + body:lang(ar) .my-xl-1, + body:lang(az) .mb-xl-1, + body:lang(az) .my-xl-1, + body:lang(dv) .mb-xl-1, + body:lang(dv) .my-xl-1, + body:lang(he) .mb-xl-1, + body:lang(he) .my-xl-1, + body:lang(ku) .mb-xl-1, + body:lang(ku) .my-xl-1, + body:lang(ur) .mb-xl-1, + body:lang(ur) .my-xl-1 { + margin-bottom: 0.25rem !important; } + body:lang(fa) .ml-xl-1, + body:lang(fa) .mx-xl-1, + body:lang(ar) .ml-xl-1, + body:lang(ar) .mx-xl-1, + body:lang(az) .ml-xl-1, + body:lang(az) .mx-xl-1, + body:lang(dv) .ml-xl-1, + body:lang(dv) .mx-xl-1, + body:lang(he) .ml-xl-1, + body:lang(he) .mx-xl-1, + body:lang(ku) .ml-xl-1, + body:lang(ku) .mx-xl-1, + body:lang(ur) .ml-xl-1, + body:lang(ur) .mx-xl-1 { + margin-inline-start: 0.25rem !important; } + body:lang(fa) .m-xl-2, + body:lang(ar) .m-xl-2, + body:lang(az) .m-xl-2, + body:lang(dv) .m-xl-2, + body:lang(he) .m-xl-2, + body:lang(ku) .m-xl-2, + body:lang(ur) .m-xl-2 { + margin: 0.5rem !important; } + body:lang(fa) .mt-xl-2, + body:lang(fa) .my-xl-2, + body:lang(ar) .mt-xl-2, + body:lang(ar) .my-xl-2, + body:lang(az) .mt-xl-2, + body:lang(az) .my-xl-2, + body:lang(dv) .mt-xl-2, + body:lang(dv) .my-xl-2, + body:lang(he) .mt-xl-2, + body:lang(he) .my-xl-2, + body:lang(ku) .mt-xl-2, + body:lang(ku) .my-xl-2, + body:lang(ur) .mt-xl-2, + body:lang(ur) .my-xl-2 { + margin-top: 0.5rem !important; } + body:lang(fa) .mr-xl-2, + body:lang(fa) .mx-xl-2, + body:lang(ar) .mr-xl-2, + body:lang(ar) .mx-xl-2, + body:lang(az) .mr-xl-2, + body:lang(az) .mx-xl-2, + body:lang(dv) .mr-xl-2, + body:lang(dv) .mx-xl-2, + body:lang(he) .mr-xl-2, + body:lang(he) .mx-xl-2, + body:lang(ku) .mr-xl-2, + body:lang(ku) .mx-xl-2, + body:lang(ur) .mr-xl-2, + body:lang(ur) .mx-xl-2 { + margin-inline-end: 0.5rem !important; } + body:lang(fa) .mb-xl-2, + body:lang(fa) .my-xl-2, + body:lang(ar) .mb-xl-2, + body:lang(ar) .my-xl-2, + body:lang(az) .mb-xl-2, + body:lang(az) .my-xl-2, + body:lang(dv) .mb-xl-2, + body:lang(dv) .my-xl-2, + body:lang(he) .mb-xl-2, + body:lang(he) .my-xl-2, + body:lang(ku) .mb-xl-2, + body:lang(ku) .my-xl-2, + body:lang(ur) .mb-xl-2, + body:lang(ur) .my-xl-2 { + margin-bottom: 0.5rem !important; } + body:lang(fa) .ml-xl-2, + body:lang(fa) .mx-xl-2, + body:lang(ar) .ml-xl-2, + body:lang(ar) .mx-xl-2, + body:lang(az) .ml-xl-2, + body:lang(az) .mx-xl-2, + body:lang(dv) .ml-xl-2, + body:lang(dv) .mx-xl-2, + body:lang(he) .ml-xl-2, + body:lang(he) .mx-xl-2, + body:lang(ku) .ml-xl-2, + body:lang(ku) .mx-xl-2, + body:lang(ur) .ml-xl-2, + body:lang(ur) .mx-xl-2 { + margin-inline-start: 0.5rem !important; } + body:lang(fa) .m-xl-3, + body:lang(ar) .m-xl-3, + body:lang(az) .m-xl-3, + body:lang(dv) .m-xl-3, + body:lang(he) .m-xl-3, + body:lang(ku) .m-xl-3, + body:lang(ur) .m-xl-3 { + margin: 1rem !important; } + body:lang(fa) .mt-xl-3, + body:lang(fa) .my-xl-3, + body:lang(ar) .mt-xl-3, + body:lang(ar) .my-xl-3, + body:lang(az) .mt-xl-3, + body:lang(az) .my-xl-3, + body:lang(dv) .mt-xl-3, + body:lang(dv) .my-xl-3, + body:lang(he) .mt-xl-3, + body:lang(he) .my-xl-3, + body:lang(ku) .mt-xl-3, + body:lang(ku) .my-xl-3, + body:lang(ur) .mt-xl-3, + body:lang(ur) .my-xl-3 { + margin-top: 1rem !important; } + body:lang(fa) .mr-xl-3, + body:lang(fa) .mx-xl-3, + body:lang(ar) .mr-xl-3, + body:lang(ar) .mx-xl-3, + body:lang(az) .mr-xl-3, + body:lang(az) .mx-xl-3, + body:lang(dv) .mr-xl-3, + body:lang(dv) .mx-xl-3, + body:lang(he) .mr-xl-3, + body:lang(he) .mx-xl-3, + body:lang(ku) .mr-xl-3, + body:lang(ku) .mx-xl-3, + body:lang(ur) .mr-xl-3, + body:lang(ur) .mx-xl-3 { + margin-inline-end: 1rem !important; } + body:lang(fa) .mb-xl-3, + body:lang(fa) .my-xl-3, + body:lang(ar) .mb-xl-3, + body:lang(ar) .my-xl-3, + body:lang(az) .mb-xl-3, + body:lang(az) .my-xl-3, + body:lang(dv) .mb-xl-3, + body:lang(dv) .my-xl-3, + body:lang(he) .mb-xl-3, + body:lang(he) .my-xl-3, + body:lang(ku) .mb-xl-3, + body:lang(ku) .my-xl-3, + body:lang(ur) .mb-xl-3, + body:lang(ur) .my-xl-3 { + margin-bottom: 1rem !important; } + body:lang(fa) .ml-xl-3, + body:lang(fa) .mx-xl-3, + body:lang(ar) .ml-xl-3, + body:lang(ar) .mx-xl-3, + body:lang(az) .ml-xl-3, + body:lang(az) .mx-xl-3, + body:lang(dv) .ml-xl-3, + body:lang(dv) .mx-xl-3, + body:lang(he) .ml-xl-3, + body:lang(he) .mx-xl-3, + body:lang(ku) .ml-xl-3, + body:lang(ku) .mx-xl-3, + body:lang(ur) .ml-xl-3, + body:lang(ur) .mx-xl-3 { + margin-inline-start: 1rem !important; } + body:lang(fa) .m-xl-4, + body:lang(ar) .m-xl-4, + body:lang(az) .m-xl-4, + body:lang(dv) .m-xl-4, + body:lang(he) .m-xl-4, + body:lang(ku) .m-xl-4, + body:lang(ur) .m-xl-4 { + margin: 1.5rem !important; } + body:lang(fa) .mt-xl-4, + body:lang(fa) .my-xl-4, + body:lang(ar) .mt-xl-4, + body:lang(ar) .my-xl-4, + body:lang(az) .mt-xl-4, + body:lang(az) .my-xl-4, + body:lang(dv) .mt-xl-4, + body:lang(dv) .my-xl-4, + body:lang(he) .mt-xl-4, + body:lang(he) .my-xl-4, + body:lang(ku) .mt-xl-4, + body:lang(ku) .my-xl-4, + body:lang(ur) .mt-xl-4, + body:lang(ur) .my-xl-4 { + margin-top: 1.5rem !important; } + body:lang(fa) .mr-xl-4, + body:lang(fa) .mx-xl-4, + body:lang(ar) .mr-xl-4, + body:lang(ar) .mx-xl-4, + body:lang(az) .mr-xl-4, + body:lang(az) .mx-xl-4, + body:lang(dv) .mr-xl-4, + body:lang(dv) .mx-xl-4, + body:lang(he) .mr-xl-4, + body:lang(he) .mx-xl-4, + body:lang(ku) .mr-xl-4, + body:lang(ku) .mx-xl-4, + body:lang(ur) .mr-xl-4, + body:lang(ur) .mx-xl-4 { + margin-inline-end: 1.5rem !important; } + body:lang(fa) .mb-xl-4, + body:lang(fa) .my-xl-4, + body:lang(ar) .mb-xl-4, + body:lang(ar) .my-xl-4, + body:lang(az) .mb-xl-4, + body:lang(az) .my-xl-4, + body:lang(dv) .mb-xl-4, + body:lang(dv) .my-xl-4, + body:lang(he) .mb-xl-4, + body:lang(he) .my-xl-4, + body:lang(ku) .mb-xl-4, + body:lang(ku) .my-xl-4, + body:lang(ur) .mb-xl-4, + body:lang(ur) .my-xl-4 { + margin-bottom: 1.5rem !important; } + body:lang(fa) .ml-xl-4, + body:lang(fa) .mx-xl-4, + body:lang(ar) .ml-xl-4, + body:lang(ar) .mx-xl-4, + body:lang(az) .ml-xl-4, + body:lang(az) .mx-xl-4, + body:lang(dv) .ml-xl-4, + body:lang(dv) .mx-xl-4, + body:lang(he) .ml-xl-4, + body:lang(he) .mx-xl-4, + body:lang(ku) .ml-xl-4, + body:lang(ku) .mx-xl-4, + body:lang(ur) .ml-xl-4, + body:lang(ur) .mx-xl-4 { + margin-inline-start: 1.5rem !important; } + body:lang(fa) .m-xl-5, + body:lang(ar) .m-xl-5, + body:lang(az) .m-xl-5, + body:lang(dv) .m-xl-5, + body:lang(he) .m-xl-5, + body:lang(ku) .m-xl-5, + body:lang(ur) .m-xl-5 { + margin: 3rem !important; } + body:lang(fa) .mt-xl-5, + body:lang(fa) .my-xl-5, + body:lang(ar) .mt-xl-5, + body:lang(ar) .my-xl-5, + body:lang(az) .mt-xl-5, + body:lang(az) .my-xl-5, + body:lang(dv) .mt-xl-5, + body:lang(dv) .my-xl-5, + body:lang(he) .mt-xl-5, + body:lang(he) .my-xl-5, + body:lang(ku) .mt-xl-5, + body:lang(ku) .my-xl-5, + body:lang(ur) .mt-xl-5, + body:lang(ur) .my-xl-5 { + margin-top: 3rem !important; } + body:lang(fa) .mr-xl-5, + body:lang(fa) .mx-xl-5, + body:lang(ar) .mr-xl-5, + body:lang(ar) .mx-xl-5, + body:lang(az) .mr-xl-5, + body:lang(az) .mx-xl-5, + body:lang(dv) .mr-xl-5, + body:lang(dv) .mx-xl-5, + body:lang(he) .mr-xl-5, + body:lang(he) .mx-xl-5, + body:lang(ku) .mr-xl-5, + body:lang(ku) .mx-xl-5, + body:lang(ur) .mr-xl-5, + body:lang(ur) .mx-xl-5 { + margin-inline-end: 3rem !important; } + body:lang(fa) .mb-xl-5, + body:lang(fa) .my-xl-5, + body:lang(ar) .mb-xl-5, + body:lang(ar) .my-xl-5, + body:lang(az) .mb-xl-5, + body:lang(az) .my-xl-5, + body:lang(dv) .mb-xl-5, + body:lang(dv) .my-xl-5, + body:lang(he) .mb-xl-5, + body:lang(he) .my-xl-5, + body:lang(ku) .mb-xl-5, + body:lang(ku) .my-xl-5, + body:lang(ur) .mb-xl-5, + body:lang(ur) .my-xl-5 { + margin-bottom: 3rem !important; } + body:lang(fa) .ml-xl-5, + body:lang(fa) .mx-xl-5, + body:lang(ar) .ml-xl-5, + body:lang(ar) .mx-xl-5, + body:lang(az) .ml-xl-5, + body:lang(az) .mx-xl-5, + body:lang(dv) .ml-xl-5, + body:lang(dv) .mx-xl-5, + body:lang(he) .ml-xl-5, + body:lang(he) .mx-xl-5, + body:lang(ku) .ml-xl-5, + body:lang(ku) .mx-xl-5, + body:lang(ur) .ml-xl-5, + body:lang(ur) .mx-xl-5 { + margin-inline-start: 3rem !important; } + body:lang(fa) .p-xl-0, + body:lang(ar) .p-xl-0, + body:lang(az) .p-xl-0, + body:lang(dv) .p-xl-0, + body:lang(he) .p-xl-0, + body:lang(ku) .p-xl-0, + body:lang(ur) .p-xl-0 { + padding: 0 !important; } + body:lang(fa) .pt-xl-0, + body:lang(fa) .py-xl-0, + body:lang(ar) .pt-xl-0, + body:lang(ar) .py-xl-0, + body:lang(az) .pt-xl-0, + body:lang(az) .py-xl-0, + body:lang(dv) .pt-xl-0, + body:lang(dv) .py-xl-0, + body:lang(he) .pt-xl-0, + body:lang(he) .py-xl-0, + body:lang(ku) .pt-xl-0, + body:lang(ku) .py-xl-0, + body:lang(ur) .pt-xl-0, + body:lang(ur) .py-xl-0 { + padding-top: 0 !important; } + body:lang(fa) .pr-xl-0, + body:lang(fa) .px-xl-0, + body:lang(ar) .pr-xl-0, + body:lang(ar) .px-xl-0, + body:lang(az) .pr-xl-0, + body:lang(az) .px-xl-0, + body:lang(dv) .pr-xl-0, + body:lang(dv) .px-xl-0, + body:lang(he) .pr-xl-0, + body:lang(he) .px-xl-0, + body:lang(ku) .pr-xl-0, + body:lang(ku) .px-xl-0, + body:lang(ur) .pr-xl-0, + body:lang(ur) .px-xl-0 { + padding-inline-end: 0 !important; } + body:lang(fa) .pb-xl-0, + body:lang(fa) .py-xl-0, + body:lang(ar) .pb-xl-0, + body:lang(ar) .py-xl-0, + body:lang(az) .pb-xl-0, + body:lang(az) .py-xl-0, + body:lang(dv) .pb-xl-0, + body:lang(dv) .py-xl-0, + body:lang(he) .pb-xl-0, + body:lang(he) .py-xl-0, + body:lang(ku) .pb-xl-0, + body:lang(ku) .py-xl-0, + body:lang(ur) .pb-xl-0, + body:lang(ur) .py-xl-0 { + padding-bottom: 0 !important; } + body:lang(fa) .pl-xl-0, + body:lang(fa) .px-xl-0, + body:lang(ar) .pl-xl-0, + body:lang(ar) .px-xl-0, + body:lang(az) .pl-xl-0, + body:lang(az) .px-xl-0, + body:lang(dv) .pl-xl-0, + body:lang(dv) .px-xl-0, + body:lang(he) .pl-xl-0, + body:lang(he) .px-xl-0, + body:lang(ku) .pl-xl-0, + body:lang(ku) .px-xl-0, + body:lang(ur) .pl-xl-0, + body:lang(ur) .px-xl-0 { + padding-inline-start: 0 !important; } + body:lang(fa) .p-xl-1, + body:lang(ar) .p-xl-1, + body:lang(az) .p-xl-1, + body:lang(dv) .p-xl-1, + body:lang(he) .p-xl-1, + body:lang(ku) .p-xl-1, + body:lang(ur) .p-xl-1 { + padding: 0.25rem !important; } + body:lang(fa) .pt-xl-1, + body:lang(fa) .py-xl-1, + body:lang(ar) .pt-xl-1, + body:lang(ar) .py-xl-1, + body:lang(az) .pt-xl-1, + body:lang(az) .py-xl-1, + body:lang(dv) .pt-xl-1, + body:lang(dv) .py-xl-1, + body:lang(he) .pt-xl-1, + body:lang(he) .py-xl-1, + body:lang(ku) .pt-xl-1, + body:lang(ku) .py-xl-1, + body:lang(ur) .pt-xl-1, + body:lang(ur) .py-xl-1 { + padding-top: 0.25rem !important; } + body:lang(fa) .pr-xl-1, + body:lang(fa) .px-xl-1, + body:lang(ar) .pr-xl-1, + body:lang(ar) .px-xl-1, + body:lang(az) .pr-xl-1, + body:lang(az) .px-xl-1, + body:lang(dv) .pr-xl-1, + body:lang(dv) .px-xl-1, + body:lang(he) .pr-xl-1, + body:lang(he) .px-xl-1, + body:lang(ku) .pr-xl-1, + body:lang(ku) .px-xl-1, + body:lang(ur) .pr-xl-1, + body:lang(ur) .px-xl-1 { + padding-inline-end: 0.25rem !important; } + body:lang(fa) .pb-xl-1, + body:lang(fa) .py-xl-1, + body:lang(ar) .pb-xl-1, + body:lang(ar) .py-xl-1, + body:lang(az) .pb-xl-1, + body:lang(az) .py-xl-1, + body:lang(dv) .pb-xl-1, + body:lang(dv) .py-xl-1, + body:lang(he) .pb-xl-1, + body:lang(he) .py-xl-1, + body:lang(ku) .pb-xl-1, + body:lang(ku) .py-xl-1, + body:lang(ur) .pb-xl-1, + body:lang(ur) .py-xl-1 { + padding-bottom: 0.25rem !important; } + body:lang(fa) .pl-xl-1, + body:lang(fa) .px-xl-1, + body:lang(ar) .pl-xl-1, + body:lang(ar) .px-xl-1, + body:lang(az) .pl-xl-1, + body:lang(az) .px-xl-1, + body:lang(dv) .pl-xl-1, + body:lang(dv) .px-xl-1, + body:lang(he) .pl-xl-1, + body:lang(he) .px-xl-1, + body:lang(ku) .pl-xl-1, + body:lang(ku) .px-xl-1, + body:lang(ur) .pl-xl-1, + body:lang(ur) .px-xl-1 { + padding-inline-start: 0.25rem !important; } + body:lang(fa) .p-xl-2, + body:lang(ar) .p-xl-2, + body:lang(az) .p-xl-2, + body:lang(dv) .p-xl-2, + body:lang(he) .p-xl-2, + body:lang(ku) .p-xl-2, + body:lang(ur) .p-xl-2 { + padding: 0.5rem !important; } + body:lang(fa) .pt-xl-2, + body:lang(fa) .py-xl-2, + body:lang(ar) .pt-xl-2, + body:lang(ar) .py-xl-2, + body:lang(az) .pt-xl-2, + body:lang(az) .py-xl-2, + body:lang(dv) .pt-xl-2, + body:lang(dv) .py-xl-2, + body:lang(he) .pt-xl-2, + body:lang(he) .py-xl-2, + body:lang(ku) .pt-xl-2, + body:lang(ku) .py-xl-2, + body:lang(ur) .pt-xl-2, + body:lang(ur) .py-xl-2 { + padding-top: 0.5rem !important; } + body:lang(fa) .pr-xl-2, + body:lang(fa) .px-xl-2, + body:lang(ar) .pr-xl-2, + body:lang(ar) .px-xl-2, + body:lang(az) .pr-xl-2, + body:lang(az) .px-xl-2, + body:lang(dv) .pr-xl-2, + body:lang(dv) .px-xl-2, + body:lang(he) .pr-xl-2, + body:lang(he) .px-xl-2, + body:lang(ku) .pr-xl-2, + body:lang(ku) .px-xl-2, + body:lang(ur) .pr-xl-2, + body:lang(ur) .px-xl-2 { + padding-inline-end: 0.5rem !important; } + body:lang(fa) .pb-xl-2, + body:lang(fa) .py-xl-2, + body:lang(ar) .pb-xl-2, + body:lang(ar) .py-xl-2, + body:lang(az) .pb-xl-2, + body:lang(az) .py-xl-2, + body:lang(dv) .pb-xl-2, + body:lang(dv) .py-xl-2, + body:lang(he) .pb-xl-2, + body:lang(he) .py-xl-2, + body:lang(ku) .pb-xl-2, + body:lang(ku) .py-xl-2, + body:lang(ur) .pb-xl-2, + body:lang(ur) .py-xl-2 { + padding-bottom: 0.5rem !important; } + body:lang(fa) .pl-xl-2, + body:lang(fa) .px-xl-2, + body:lang(ar) .pl-xl-2, + body:lang(ar) .px-xl-2, + body:lang(az) .pl-xl-2, + body:lang(az) .px-xl-2, + body:lang(dv) .pl-xl-2, + body:lang(dv) .px-xl-2, + body:lang(he) .pl-xl-2, + body:lang(he) .px-xl-2, + body:lang(ku) .pl-xl-2, + body:lang(ku) .px-xl-2, + body:lang(ur) .pl-xl-2, + body:lang(ur) .px-xl-2 { + padding-inline-start: 0.5rem !important; } + body:lang(fa) .p-xl-3, + body:lang(ar) .p-xl-3, + body:lang(az) .p-xl-3, + body:lang(dv) .p-xl-3, + body:lang(he) .p-xl-3, + body:lang(ku) .p-xl-3, + body:lang(ur) .p-xl-3 { + padding: 1rem !important; } + body:lang(fa) .pt-xl-3, + body:lang(fa) .py-xl-3, + body:lang(ar) .pt-xl-3, + body:lang(ar) .py-xl-3, + body:lang(az) .pt-xl-3, + body:lang(az) .py-xl-3, + body:lang(dv) .pt-xl-3, + body:lang(dv) .py-xl-3, + body:lang(he) .pt-xl-3, + body:lang(he) .py-xl-3, + body:lang(ku) .pt-xl-3, + body:lang(ku) .py-xl-3, + body:lang(ur) .pt-xl-3, + body:lang(ur) .py-xl-3 { + padding-top: 1rem !important; } + body:lang(fa) .pr-xl-3, + body:lang(fa) .px-xl-3, + body:lang(ar) .pr-xl-3, + body:lang(ar) .px-xl-3, + body:lang(az) .pr-xl-3, + body:lang(az) .px-xl-3, + body:lang(dv) .pr-xl-3, + body:lang(dv) .px-xl-3, + body:lang(he) .pr-xl-3, + body:lang(he) .px-xl-3, + body:lang(ku) .pr-xl-3, + body:lang(ku) .px-xl-3, + body:lang(ur) .pr-xl-3, + body:lang(ur) .px-xl-3 { + padding-inline-end: 1rem !important; } + body:lang(fa) .pb-xl-3, + body:lang(fa) .py-xl-3, + body:lang(ar) .pb-xl-3, + body:lang(ar) .py-xl-3, + body:lang(az) .pb-xl-3, + body:lang(az) .py-xl-3, + body:lang(dv) .pb-xl-3, + body:lang(dv) .py-xl-3, + body:lang(he) .pb-xl-3, + body:lang(he) .py-xl-3, + body:lang(ku) .pb-xl-3, + body:lang(ku) .py-xl-3, + body:lang(ur) .pb-xl-3, + body:lang(ur) .py-xl-3 { + padding-bottom: 1rem !important; } + body:lang(fa) .pl-xl-3, + body:lang(fa) .px-xl-3, + body:lang(ar) .pl-xl-3, + body:lang(ar) .px-xl-3, + body:lang(az) .pl-xl-3, + body:lang(az) .px-xl-3, + body:lang(dv) .pl-xl-3, + body:lang(dv) .px-xl-3, + body:lang(he) .pl-xl-3, + body:lang(he) .px-xl-3, + body:lang(ku) .pl-xl-3, + body:lang(ku) .px-xl-3, + body:lang(ur) .pl-xl-3, + body:lang(ur) .px-xl-3 { + padding-inline-start: 1rem !important; } + body:lang(fa) .p-xl-4, + body:lang(ar) .p-xl-4, + body:lang(az) .p-xl-4, + body:lang(dv) .p-xl-4, + body:lang(he) .p-xl-4, + body:lang(ku) .p-xl-4, + body:lang(ur) .p-xl-4 { + padding: 1.5rem !important; } + body:lang(fa) .pt-xl-4, + body:lang(fa) .py-xl-4, + body:lang(ar) .pt-xl-4, + body:lang(ar) .py-xl-4, + body:lang(az) .pt-xl-4, + body:lang(az) .py-xl-4, + body:lang(dv) .pt-xl-4, + body:lang(dv) .py-xl-4, + body:lang(he) .pt-xl-4, + body:lang(he) .py-xl-4, + body:lang(ku) .pt-xl-4, + body:lang(ku) .py-xl-4, + body:lang(ur) .pt-xl-4, + body:lang(ur) .py-xl-4 { + padding-top: 1.5rem !important; } + body:lang(fa) .pr-xl-4, + body:lang(fa) .px-xl-4, + body:lang(ar) .pr-xl-4, + body:lang(ar) .px-xl-4, + body:lang(az) .pr-xl-4, + body:lang(az) .px-xl-4, + body:lang(dv) .pr-xl-4, + body:lang(dv) .px-xl-4, + body:lang(he) .pr-xl-4, + body:lang(he) .px-xl-4, + body:lang(ku) .pr-xl-4, + body:lang(ku) .px-xl-4, + body:lang(ur) .pr-xl-4, + body:lang(ur) .px-xl-4 { + padding-inline-end: 1.5rem !important; } + body:lang(fa) .pb-xl-4, + body:lang(fa) .py-xl-4, + body:lang(ar) .pb-xl-4, + body:lang(ar) .py-xl-4, + body:lang(az) .pb-xl-4, + body:lang(az) .py-xl-4, + body:lang(dv) .pb-xl-4, + body:lang(dv) .py-xl-4, + body:lang(he) .pb-xl-4, + body:lang(he) .py-xl-4, + body:lang(ku) .pb-xl-4, + body:lang(ku) .py-xl-4, + body:lang(ur) .pb-xl-4, + body:lang(ur) .py-xl-4 { + padding-bottom: 1.5rem !important; } + body:lang(fa) .pl-xl-4, + body:lang(fa) .px-xl-4, + body:lang(ar) .pl-xl-4, + body:lang(ar) .px-xl-4, + body:lang(az) .pl-xl-4, + body:lang(az) .px-xl-4, + body:lang(dv) .pl-xl-4, + body:lang(dv) .px-xl-4, + body:lang(he) .pl-xl-4, + body:lang(he) .px-xl-4, + body:lang(ku) .pl-xl-4, + body:lang(ku) .px-xl-4, + body:lang(ur) .pl-xl-4, + body:lang(ur) .px-xl-4 { + padding-inline-start: 1.5rem !important; } + body:lang(fa) .p-xl-5, + body:lang(ar) .p-xl-5, + body:lang(az) .p-xl-5, + body:lang(dv) .p-xl-5, + body:lang(he) .p-xl-5, + body:lang(ku) .p-xl-5, + body:lang(ur) .p-xl-5 { + padding: 3rem !important; } + body:lang(fa) .pt-xl-5, + body:lang(fa) .py-xl-5, + body:lang(ar) .pt-xl-5, + body:lang(ar) .py-xl-5, + body:lang(az) .pt-xl-5, + body:lang(az) .py-xl-5, + body:lang(dv) .pt-xl-5, + body:lang(dv) .py-xl-5, + body:lang(he) .pt-xl-5, + body:lang(he) .py-xl-5, + body:lang(ku) .pt-xl-5, + body:lang(ku) .py-xl-5, + body:lang(ur) .pt-xl-5, + body:lang(ur) .py-xl-5 { + padding-top: 3rem !important; } + body:lang(fa) .pr-xl-5, + body:lang(fa) .px-xl-5, + body:lang(ar) .pr-xl-5, + body:lang(ar) .px-xl-5, + body:lang(az) .pr-xl-5, + body:lang(az) .px-xl-5, + body:lang(dv) .pr-xl-5, + body:lang(dv) .px-xl-5, + body:lang(he) .pr-xl-5, + body:lang(he) .px-xl-5, + body:lang(ku) .pr-xl-5, + body:lang(ku) .px-xl-5, + body:lang(ur) .pr-xl-5, + body:lang(ur) .px-xl-5 { + padding-inline-end: 3rem !important; } + body:lang(fa) .pb-xl-5, + body:lang(fa) .py-xl-5, + body:lang(ar) .pb-xl-5, + body:lang(ar) .py-xl-5, + body:lang(az) .pb-xl-5, + body:lang(az) .py-xl-5, + body:lang(dv) .pb-xl-5, + body:lang(dv) .py-xl-5, + body:lang(he) .pb-xl-5, + body:lang(he) .py-xl-5, + body:lang(ku) .pb-xl-5, + body:lang(ku) .py-xl-5, + body:lang(ur) .pb-xl-5, + body:lang(ur) .py-xl-5 { + padding-bottom: 3rem !important; } + body:lang(fa) .pl-xl-5, + body:lang(fa) .px-xl-5, + body:lang(ar) .pl-xl-5, + body:lang(ar) .px-xl-5, + body:lang(az) .pl-xl-5, + body:lang(az) .px-xl-5, + body:lang(dv) .pl-xl-5, + body:lang(dv) .px-xl-5, + body:lang(he) .pl-xl-5, + body:lang(he) .px-xl-5, + body:lang(ku) .pl-xl-5, + body:lang(ku) .px-xl-5, + body:lang(ur) .pl-xl-5, + body:lang(ur) .px-xl-5 { + padding-inline-start: 3rem !important; } + body:lang(fa) .m-xl-n1, + body:lang(ar) .m-xl-n1, + body:lang(az) .m-xl-n1, + body:lang(dv) .m-xl-n1, + body:lang(he) .m-xl-n1, + body:lang(ku) .m-xl-n1, + body:lang(ur) .m-xl-n1 { + margin: -0.25rem !important; } + body:lang(fa) .mt-xl-n1, + body:lang(fa) .my-xl-n1, + body:lang(ar) .mt-xl-n1, + body:lang(ar) .my-xl-n1, + body:lang(az) .mt-xl-n1, + body:lang(az) .my-xl-n1, + body:lang(dv) .mt-xl-n1, + body:lang(dv) .my-xl-n1, + body:lang(he) .mt-xl-n1, + body:lang(he) .my-xl-n1, + body:lang(ku) .mt-xl-n1, + body:lang(ku) .my-xl-n1, + body:lang(ur) .mt-xl-n1, + body:lang(ur) .my-xl-n1 { + margin-top: -0.25rem !important; } + body:lang(fa) .mr-xl-n1, + body:lang(fa) .mx-xl-n1, + body:lang(ar) .mr-xl-n1, + body:lang(ar) .mx-xl-n1, + body:lang(az) .mr-xl-n1, + body:lang(az) .mx-xl-n1, + body:lang(dv) .mr-xl-n1, + body:lang(dv) .mx-xl-n1, + body:lang(he) .mr-xl-n1, + body:lang(he) .mx-xl-n1, + body:lang(ku) .mr-xl-n1, + body:lang(ku) .mx-xl-n1, + body:lang(ur) .mr-xl-n1, + body:lang(ur) .mx-xl-n1 { + margin-right: -0.25rem !important; } + body:lang(fa) .mb-xl-n1, + body:lang(fa) .my-xl-n1, + body:lang(ar) .mb-xl-n1, + body:lang(ar) .my-xl-n1, + body:lang(az) .mb-xl-n1, + body:lang(az) .my-xl-n1, + body:lang(dv) .mb-xl-n1, + body:lang(dv) .my-xl-n1, + body:lang(he) .mb-xl-n1, + body:lang(he) .my-xl-n1, + body:lang(ku) .mb-xl-n1, + body:lang(ku) .my-xl-n1, + body:lang(ur) .mb-xl-n1, + body:lang(ur) .my-xl-n1 { + margin-bottom: -0.25rem !important; } + body:lang(fa) .ml-xl-n1, + body:lang(fa) .mx-xl-n1, + body:lang(ar) .ml-xl-n1, + body:lang(ar) .mx-xl-n1, + body:lang(az) .ml-xl-n1, + body:lang(az) .mx-xl-n1, + body:lang(dv) .ml-xl-n1, + body:lang(dv) .mx-xl-n1, + body:lang(he) .ml-xl-n1, + body:lang(he) .mx-xl-n1, + body:lang(ku) .ml-xl-n1, + body:lang(ku) .mx-xl-n1, + body:lang(ur) .ml-xl-n1, + body:lang(ur) .mx-xl-n1 { + margin-left: -0.25rem !important; } + body:lang(fa) .m-xl-n2, + body:lang(ar) .m-xl-n2, + body:lang(az) .m-xl-n2, + body:lang(dv) .m-xl-n2, + body:lang(he) .m-xl-n2, + body:lang(ku) .m-xl-n2, + body:lang(ur) .m-xl-n2 { + margin: -0.5rem !important; } + body:lang(fa) .mt-xl-n2, + body:lang(fa) .my-xl-n2, + body:lang(ar) .mt-xl-n2, + body:lang(ar) .my-xl-n2, + body:lang(az) .mt-xl-n2, + body:lang(az) .my-xl-n2, + body:lang(dv) .mt-xl-n2, + body:lang(dv) .my-xl-n2, + body:lang(he) .mt-xl-n2, + body:lang(he) .my-xl-n2, + body:lang(ku) .mt-xl-n2, + body:lang(ku) .my-xl-n2, + body:lang(ur) .mt-xl-n2, + body:lang(ur) .my-xl-n2 { + margin-top: -0.5rem !important; } + body:lang(fa) .mr-xl-n2, + body:lang(fa) .mx-xl-n2, + body:lang(ar) .mr-xl-n2, + body:lang(ar) .mx-xl-n2, + body:lang(az) .mr-xl-n2, + body:lang(az) .mx-xl-n2, + body:lang(dv) .mr-xl-n2, + body:lang(dv) .mx-xl-n2, + body:lang(he) .mr-xl-n2, + body:lang(he) .mx-xl-n2, + body:lang(ku) .mr-xl-n2, + body:lang(ku) .mx-xl-n2, + body:lang(ur) .mr-xl-n2, + body:lang(ur) .mx-xl-n2 { + margin-right: -0.5rem !important; } + body:lang(fa) .mb-xl-n2, + body:lang(fa) .my-xl-n2, + body:lang(ar) .mb-xl-n2, + body:lang(ar) .my-xl-n2, + body:lang(az) .mb-xl-n2, + body:lang(az) .my-xl-n2, + body:lang(dv) .mb-xl-n2, + body:lang(dv) .my-xl-n2, + body:lang(he) .mb-xl-n2, + body:lang(he) .my-xl-n2, + body:lang(ku) .mb-xl-n2, + body:lang(ku) .my-xl-n2, + body:lang(ur) .mb-xl-n2, + body:lang(ur) .my-xl-n2 { + margin-bottom: -0.5rem !important; } + body:lang(fa) .ml-xl-n2, + body:lang(fa) .mx-xl-n2, + body:lang(ar) .ml-xl-n2, + body:lang(ar) .mx-xl-n2, + body:lang(az) .ml-xl-n2, + body:lang(az) .mx-xl-n2, + body:lang(dv) .ml-xl-n2, + body:lang(dv) .mx-xl-n2, + body:lang(he) .ml-xl-n2, + body:lang(he) .mx-xl-n2, + body:lang(ku) .ml-xl-n2, + body:lang(ku) .mx-xl-n2, + body:lang(ur) .ml-xl-n2, + body:lang(ur) .mx-xl-n2 { + margin-left: -0.5rem !important; } + body:lang(fa) .m-xl-n3, + body:lang(ar) .m-xl-n3, + body:lang(az) .m-xl-n3, + body:lang(dv) .m-xl-n3, + body:lang(he) .m-xl-n3, + body:lang(ku) .m-xl-n3, + body:lang(ur) .m-xl-n3 { + margin: -1rem !important; } + body:lang(fa) .mt-xl-n3, + body:lang(fa) .my-xl-n3, + body:lang(ar) .mt-xl-n3, + body:lang(ar) .my-xl-n3, + body:lang(az) .mt-xl-n3, + body:lang(az) .my-xl-n3, + body:lang(dv) .mt-xl-n3, + body:lang(dv) .my-xl-n3, + body:lang(he) .mt-xl-n3, + body:lang(he) .my-xl-n3, + body:lang(ku) .mt-xl-n3, + body:lang(ku) .my-xl-n3, + body:lang(ur) .mt-xl-n3, + body:lang(ur) .my-xl-n3 { + margin-top: -1rem !important; } + body:lang(fa) .mr-xl-n3, + body:lang(fa) .mx-xl-n3, + body:lang(ar) .mr-xl-n3, + body:lang(ar) .mx-xl-n3, + body:lang(az) .mr-xl-n3, + body:lang(az) .mx-xl-n3, + body:lang(dv) .mr-xl-n3, + body:lang(dv) .mx-xl-n3, + body:lang(he) .mr-xl-n3, + body:lang(he) .mx-xl-n3, + body:lang(ku) .mr-xl-n3, + body:lang(ku) .mx-xl-n3, + body:lang(ur) .mr-xl-n3, + body:lang(ur) .mx-xl-n3 { + margin-right: -1rem !important; } + body:lang(fa) .mb-xl-n3, + body:lang(fa) .my-xl-n3, + body:lang(ar) .mb-xl-n3, + body:lang(ar) .my-xl-n3, + body:lang(az) .mb-xl-n3, + body:lang(az) .my-xl-n3, + body:lang(dv) .mb-xl-n3, + body:lang(dv) .my-xl-n3, + body:lang(he) .mb-xl-n3, + body:lang(he) .my-xl-n3, + body:lang(ku) .mb-xl-n3, + body:lang(ku) .my-xl-n3, + body:lang(ur) .mb-xl-n3, + body:lang(ur) .my-xl-n3 { + margin-bottom: -1rem !important; } + body:lang(fa) .ml-xl-n3, + body:lang(fa) .mx-xl-n3, + body:lang(ar) .ml-xl-n3, + body:lang(ar) .mx-xl-n3, + body:lang(az) .ml-xl-n3, + body:lang(az) .mx-xl-n3, + body:lang(dv) .ml-xl-n3, + body:lang(dv) .mx-xl-n3, + body:lang(he) .ml-xl-n3, + body:lang(he) .mx-xl-n3, + body:lang(ku) .ml-xl-n3, + body:lang(ku) .mx-xl-n3, + body:lang(ur) .ml-xl-n3, + body:lang(ur) .mx-xl-n3 { + margin-left: -1rem !important; } + body:lang(fa) .m-xl-n4, + body:lang(ar) .m-xl-n4, + body:lang(az) .m-xl-n4, + body:lang(dv) .m-xl-n4, + body:lang(he) .m-xl-n4, + body:lang(ku) .m-xl-n4, + body:lang(ur) .m-xl-n4 { + margin: -1.5rem !important; } + body:lang(fa) .mt-xl-n4, + body:lang(fa) .my-xl-n4, + body:lang(ar) .mt-xl-n4, + body:lang(ar) .my-xl-n4, + body:lang(az) .mt-xl-n4, + body:lang(az) .my-xl-n4, + body:lang(dv) .mt-xl-n4, + body:lang(dv) .my-xl-n4, + body:lang(he) .mt-xl-n4, + body:lang(he) .my-xl-n4, + body:lang(ku) .mt-xl-n4, + body:lang(ku) .my-xl-n4, + body:lang(ur) .mt-xl-n4, + body:lang(ur) .my-xl-n4 { + margin-top: -1.5rem !important; } + body:lang(fa) .mr-xl-n4, + body:lang(fa) .mx-xl-n4, + body:lang(ar) .mr-xl-n4, + body:lang(ar) .mx-xl-n4, + body:lang(az) .mr-xl-n4, + body:lang(az) .mx-xl-n4, + body:lang(dv) .mr-xl-n4, + body:lang(dv) .mx-xl-n4, + body:lang(he) .mr-xl-n4, + body:lang(he) .mx-xl-n4, + body:lang(ku) .mr-xl-n4, + body:lang(ku) .mx-xl-n4, + body:lang(ur) .mr-xl-n4, + body:lang(ur) .mx-xl-n4 { + margin-right: -1.5rem !important; } + body:lang(fa) .mb-xl-n4, + body:lang(fa) .my-xl-n4, + body:lang(ar) .mb-xl-n4, + body:lang(ar) .my-xl-n4, + body:lang(az) .mb-xl-n4, + body:lang(az) .my-xl-n4, + body:lang(dv) .mb-xl-n4, + body:lang(dv) .my-xl-n4, + body:lang(he) .mb-xl-n4, + body:lang(he) .my-xl-n4, + body:lang(ku) .mb-xl-n4, + body:lang(ku) .my-xl-n4, + body:lang(ur) .mb-xl-n4, + body:lang(ur) .my-xl-n4 { + margin-bottom: -1.5rem !important; } + body:lang(fa) .ml-xl-n4, + body:lang(fa) .mx-xl-n4, + body:lang(ar) .ml-xl-n4, + body:lang(ar) .mx-xl-n4, + body:lang(az) .ml-xl-n4, + body:lang(az) .mx-xl-n4, + body:lang(dv) .ml-xl-n4, + body:lang(dv) .mx-xl-n4, + body:lang(he) .ml-xl-n4, + body:lang(he) .mx-xl-n4, + body:lang(ku) .ml-xl-n4, + body:lang(ku) .mx-xl-n4, + body:lang(ur) .ml-xl-n4, + body:lang(ur) .mx-xl-n4 { + margin-left: -1.5rem !important; } + body:lang(fa) .m-xl-n5, + body:lang(ar) .m-xl-n5, + body:lang(az) .m-xl-n5, + body:lang(dv) .m-xl-n5, + body:lang(he) .m-xl-n5, + body:lang(ku) .m-xl-n5, + body:lang(ur) .m-xl-n5 { + margin: -3rem !important; } + body:lang(fa) .mt-xl-n5, + body:lang(fa) .my-xl-n5, + body:lang(ar) .mt-xl-n5, + body:lang(ar) .my-xl-n5, + body:lang(az) .mt-xl-n5, + body:lang(az) .my-xl-n5, + body:lang(dv) .mt-xl-n5, + body:lang(dv) .my-xl-n5, + body:lang(he) .mt-xl-n5, + body:lang(he) .my-xl-n5, + body:lang(ku) .mt-xl-n5, + body:lang(ku) .my-xl-n5, + body:lang(ur) .mt-xl-n5, + body:lang(ur) .my-xl-n5 { + margin-top: -3rem !important; } + body:lang(fa) .mr-xl-n5, + body:lang(fa) .mx-xl-n5, + body:lang(ar) .mr-xl-n5, + body:lang(ar) .mx-xl-n5, + body:lang(az) .mr-xl-n5, + body:lang(az) .mx-xl-n5, + body:lang(dv) .mr-xl-n5, + body:lang(dv) .mx-xl-n5, + body:lang(he) .mr-xl-n5, + body:lang(he) .mx-xl-n5, + body:lang(ku) .mr-xl-n5, + body:lang(ku) .mx-xl-n5, + body:lang(ur) .mr-xl-n5, + body:lang(ur) .mx-xl-n5 { + margin-right: -3rem !important; } + body:lang(fa) .mb-xl-n5, + body:lang(fa) .my-xl-n5, + body:lang(ar) .mb-xl-n5, + body:lang(ar) .my-xl-n5, + body:lang(az) .mb-xl-n5, + body:lang(az) .my-xl-n5, + body:lang(dv) .mb-xl-n5, + body:lang(dv) .my-xl-n5, + body:lang(he) .mb-xl-n5, + body:lang(he) .my-xl-n5, + body:lang(ku) .mb-xl-n5, + body:lang(ku) .my-xl-n5, + body:lang(ur) .mb-xl-n5, + body:lang(ur) .my-xl-n5 { + margin-bottom: -3rem !important; } + body:lang(fa) .ml-xl-n5, + body:lang(fa) .mx-xl-n5, + body:lang(ar) .ml-xl-n5, + body:lang(ar) .mx-xl-n5, + body:lang(az) .ml-xl-n5, + body:lang(az) .mx-xl-n5, + body:lang(dv) .ml-xl-n5, + body:lang(dv) .mx-xl-n5, + body:lang(he) .ml-xl-n5, + body:lang(he) .mx-xl-n5, + body:lang(ku) .ml-xl-n5, + body:lang(ku) .mx-xl-n5, + body:lang(ur) .ml-xl-n5, + body:lang(ur) .mx-xl-n5 { + margin-left: -3rem !important; } + body:lang(fa) .m-xl-auto, + body:lang(ar) .m-xl-auto, + body:lang(az) .m-xl-auto, + body:lang(dv) .m-xl-auto, + body:lang(he) .m-xl-auto, + body:lang(ku) .m-xl-auto, + body:lang(ur) .m-xl-auto { + margin: auto !important; } + body:lang(fa) .mt-xl-auto, + body:lang(fa) .my-xl-auto, + body:lang(ar) .mt-xl-auto, + body:lang(ar) .my-xl-auto, + body:lang(az) .mt-xl-auto, + body:lang(az) .my-xl-auto, + body:lang(dv) .mt-xl-auto, + body:lang(dv) .my-xl-auto, + body:lang(he) .mt-xl-auto, + body:lang(he) .my-xl-auto, + body:lang(ku) .mt-xl-auto, + body:lang(ku) .my-xl-auto, + body:lang(ur) .mt-xl-auto, + body:lang(ur) .my-xl-auto { + margin-top: auto !important; } + body:lang(fa) .mr-xl-auto, + body:lang(fa) .mx-xl-auto, + body:lang(ar) .mr-xl-auto, + body:lang(ar) .mx-xl-auto, + body:lang(az) .mr-xl-auto, + body:lang(az) .mx-xl-auto, + body:lang(dv) .mr-xl-auto, + body:lang(dv) .mx-xl-auto, + body:lang(he) .mr-xl-auto, + body:lang(he) .mx-xl-auto, + body:lang(ku) .mr-xl-auto, + body:lang(ku) .mx-xl-auto, + body:lang(ur) .mr-xl-auto, + body:lang(ur) .mx-xl-auto { + margin-right: auto !important; } + body:lang(fa) .mb-xl-auto, + body:lang(fa) .my-xl-auto, + body:lang(ar) .mb-xl-auto, + body:lang(ar) .my-xl-auto, + body:lang(az) .mb-xl-auto, + body:lang(az) .my-xl-auto, + body:lang(dv) .mb-xl-auto, + body:lang(dv) .my-xl-auto, + body:lang(he) .mb-xl-auto, + body:lang(he) .my-xl-auto, + body:lang(ku) .mb-xl-auto, + body:lang(ku) .my-xl-auto, + body:lang(ur) .mb-xl-auto, + body:lang(ur) .my-xl-auto { + margin-bottom: auto !important; } + body:lang(fa) .ml-xl-auto, + body:lang(fa) .mx-xl-auto, + body:lang(ar) .ml-xl-auto, + body:lang(ar) .mx-xl-auto, + body:lang(az) .ml-xl-auto, + body:lang(az) .mx-xl-auto, + body:lang(dv) .ml-xl-auto, + body:lang(dv) .mx-xl-auto, + body:lang(he) .ml-xl-auto, + body:lang(he) .mx-xl-auto, + body:lang(ku) .ml-xl-auto, + body:lang(ku) .mx-xl-auto, + body:lang(ur) .ml-xl-auto, + body:lang(ur) .mx-xl-auto { + margin-left: auto !important; } } + body:lang(fa) .dropdown-menu, + body:lang(ar) .dropdown-menu, + body:lang(az) .dropdown-menu, + body:lang(dv) .dropdown-menu, + body:lang(he) .dropdown-menu, + body:lang(ku) .dropdown-menu, + body:lang(ur) .dropdown-menu { + text-align: right; } + body:lang(fa) .text-right, + body:lang(ar) .text-right, + body:lang(az) .text-right, + body:lang(dv) .text-right, + body:lang(he) .text-right, + body:lang(ku) .text-right, + body:lang(ur) .text-right { + text-align: left !important; } + body:lang(fa) pre, + body:lang(ar) pre, + body:lang(az) pre, + body:lang(dv) pre, + body:lang(he) pre, + body:lang(ku) pre, + body:lang(ur) pre { + text-align: left; + direction: ltr; } + body:lang(fa) .td-rss-button, + body:lang(ar) .td-rss-button, + body:lang(az) .td-rss-button, + body:lang(dv) .td-rss-button, + body:lang(he) .td-rss-button, + body:lang(ku) .td-rss-button, + body:lang(ur) .td-rss-button { + left: 1rem !important; + right: auto !important; } + +body:lang(fa) { + font-family: 'Vazir', "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; } + +body:lang(he) { + font-family: 'Rubik', "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; } + +body:lang(ar) { + font-family: 'Tajawal', "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; } + +body { + font-family: "Roboto", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #555555; } + +a { + font-weight: 600; + color: #1a3f51; + text-shadow: none; } + +footer { + min-height: auto; + background: #1a3f51; + color: #999999; } + footer img { + margin-left: 15px; + margin-right: 15px; } + footer ul { + padding-left: 0; + list-style: none; } + footer ul a { + color: #999999; } + footer ul a:hover { + color: #5d8ea9; + text-decoration: none; } + footer h4 { + color: #eeeeee; + font-size: 14px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; } + footer li { + text-align: -webkit-match-parent; } + +.display-cover { + font-size: 1.5rem; + text-shadow: 1px 1px 1px black; + background-color: rgba(0, 0, 0, 0.3); + border-radius: 5px; + padding: 20px; } + +.display-2 { + font-size: 2.5rem; + font-weight: 700; + line-height: 1.2; + text-shadow: 1px 1px 1px black; } + +.td-page-meta--edit { + display: none !important; } + +.td-page-meta--child { + display: none !important; } + +.td-page-meta--print { + display: none !important; } + +.td-page-meta--project-issue { + display: none !important; } + +/* +Docsy's 'cover/block' option for setting background images does +not currently support svg's. This sets the background on hero +sections site wide to the original site's background svg. +*/ +.td-cover-block { + background-image: url("/img/featured-background.jpg"); } + +.l-container--padded { + padding-top: 2rem; + padding-bottom: 2rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; } + +.td-box--secondary { + color: #fff; + background-color: #162c37; } + +.vision-description { + font-size: 18px; } + +.vision-title { + font-weight: 700; } + +/*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/scss/main.css.map b/scss/main.css.map new file mode 100644 index 0000000..0fe9abc --- /dev/null +++ b/scss/main.css.map @@ -0,0 +1,277 @@ +{ + "version": 3, + "file": "main.css", + "sourceRoot": "/home/jenkins/agent/workspace/sw360.website.staging/hugo", + "sources": [ + "/tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/main.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/support/_functions.scss", + "assets/scss/_variables_project.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_variables.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/support/_mixins.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/bootstrap.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_functions.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_variables.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_mixins.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy/dependencies@v0.2.0/assets/bootstrap/scss/_vendor/_rfs.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_deprecate.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_breakpoints.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_hover.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_image.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_badge.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_resize.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_screen-reader.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_size.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_reset-text.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_text-emphasis.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_text-hide.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_text-truncate.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_visibility.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_alert.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_buttons.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_caret.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_pagination.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_lists.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_list-group.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_nav-divider.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_forms.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_table-row.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_background-variant.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_border-radius.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_box-shadow.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_gradients.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_transition.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_clearfix.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_grid-framework.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_grid.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/mixins/_float.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_root.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_reboot.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_type.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_images.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_code.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_grid.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_tables.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_forms.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_buttons.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_transitions.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_dropdown.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_button-group.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_input-group.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_custom-forms.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_nav.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_navbar.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_card.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_breadcrumb.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_pagination.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_badge.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_jumbotron.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_alert.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_progress.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_media.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_list-group.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_close.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_toasts.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_modal.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_tooltip.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_popover.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_carousel.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_spinners.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_utilities.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_align.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_background.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_borders.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_clearfix.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_display.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_embed.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_flex.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_float.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_interactions.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_overflow.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_position.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_screenreaders.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_shadows.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_sizing.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_spacing.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_stretched-link.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_text.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/utilities/_visibility.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v4.6.1+incompatible/scss/_print.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/fontawesome.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_variables.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_mixins.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_core.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_larger.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_fixed-width.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_list.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_bordered-pulled.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_animated.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_rotated-flipped.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_stacked.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_icons.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_screen-reader.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/solid.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_variables.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/brands.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/!fort!awesome/!font-!awesome@v0.0.0-20210804190922-7d3d774145ac/scss/_variables.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/support/_utilities.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_colors.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_boxes.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_blog.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_code.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_nav.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_sidebar-tree.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_sidebar-toc.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_buttons.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_breadcrumb.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_alerts.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_content.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_search.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_main-container.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/blocks/_blocks.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/blocks/_cover.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/section-index.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_pageinfo.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_taxonomy.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/_drawio.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/rtl/_main.scss", + "../../../../../../tmp/modules/filecache/modules/pkg/mod/github.com/google/docsy@v0.2.0/assets/scss/rtl/_spacing.scss", + "assets/scss/_styles_project.scss" + ], + "sourcesContent": [ + "@import \"support/functions\";\n@import \"variables_project\";\n@import \"variables\";\n@import \"support/mixins\";\n\n@import \"../vendor/bootstrap/scss/bootstrap\";\n\n@import \"../vendor/Font-Awesome/scss/fontawesome.scss\";\n@import \"../vendor/Font-Awesome/scss/solid.scss\";\n@import \"../vendor/Font-Awesome/scss/brands.scss\";\n\n@import \"support/utilities\";\n@import \"colors\";\n@import \"boxes\";\n@import \"blog\";\n@import \"code\";\n@import \"nav\";\n@import \"sidebar-tree\";\n@import \"sidebar-toc\";\n@import \"buttons\";\n@import \"breadcrumb\";\n@import \"alerts\";\n@import \"content\";\n@import \"search\";\n@import \"main-container\";\n@import \"blocks/blocks\";\n@import \"section-index\";\n@import \"pageinfo\";\n@import \"taxonomy\";\n@import \"drawio\";\n\n@if $td-enable-google-fonts {\n @import url($web-font-path);\n}\n\nfooter {\n min-height: 150px;\n\n @include media-breakpoint-down(md) {\n min-height: 200px;\n }\n}\n\n// Adjust anchors vs the fixed menu.\n@include media-breakpoint-up(md) {\n .td-offset-anchor:target {\n display: block;\n position: relative;\n top: -4rem;\n visibility: hidden;\n }\n\n h2[id]:before,\n h3[id]:before,\n h4[id]:before,\n h5[id]:before {\n display: block;\n content: \" \";\n margin-top: -5rem;\n height: 5rem;\n visibility: hidden;\n }\n}\n\n\n\n@import \"rtl/main\";\n@import \"styles_project\";\n", + "// Common functions.\n\n@function prepend($list, $value) {\n @return join($value, $list);\n}\n\n\n\n// See https://www.sitepoint.com/using-sass-build-color-palettes/\n@function color-diff($a, $b) {\n $sat: saturation($a) - saturation($b);\n $lig: lightness($a) - lightness($b);\n $fn-sat: if($sat > 0, 'desaturate', 'saturate');\n $fn-lig: if($lig > 0, 'darken', 'lighten');\n\n @return (\n adjust-hue: -(hue($a) - hue($b)),\n #{$fn-sat}: abs($sat),\n #{$fn-lig}: abs($lig)\n );\n}", + "$td-enable-google-fonts: false;\n\n$primary: #1a3f51!default;\n$secondary: #102129 !default;\n$text_primary: #555555 !default;\n$btn-primary: #fe7740;\n$btn-secondary: #fe7740;\n", + "/*\n\nBootstrap variables overrides for theme.\nSee https://github.com/twbs/bootstrap/pull/23260\n*/\n\n@fa-font-path : \"../webfonts\";\n\n// Bootstrap flags. For more, see https://getbootstrap.com/docs/4.0/getting-started/theming/\n$enable-gradients: true !default;\n$enable-rounded: true !default;\n$enable-shadows: true !default;\n\n// Theme flags.\n\n$td-enable-google-fonts: true !default;\n\n// Theme colors\n\n$primary: #30638E !default;\n$primary-light: lighten($primary, 75%) !default;\n$secondary: #FFA630 !default;\n$success: #3772FF !default;\n$info: #C0E0DE !default;\n$warning: #ED6A5A !default;\n$danger: #ED6A5A !default;\n$white: #fff !default;\n$light: #D3F3EE !default;\n\n$dark: #403F4C !default;\n$blue: #72A1E5 !default;\n$orange: #BA5A31 !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #eee !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ccc !default;\n$gray-500: #adb5bd !default;\n$gray-600: #797676 !default;\n$gray-700: #495057 !default;\n$gray-800: #333 !default;\n$gray-900: #222 !default;\n$black: #000 !default;\n\n$code-color: darken($secondary, 20%) !default;\n\n// UI element colors\n\n$border-color: $gray-300 !default;\n$td-sidebar-tree-root-color: $primary !default;\n$td-sidebar-bg-color: rgba($primary, 0.03) !default;\n$td-sidebar-border-color: $border-color !default;\n\n// Background colors for the sections on home page etc. It is a paint by number system, starting at 0, where the number is taken from the shortcode's ordinal\n// if not provided by the user.\n// These colors are all part of the theme palette, but the mix is fairly random to create variation. This can be overridden by the project if needed.\n$td-box-colors: $dark, $primary, $secondary, $info, $primary-light, $gray-600, $success, $warning, $dark, $danger, $primary, $secondary, $primary-light, $info !default;\n\n$link-color: darken($blue, 15%) !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: none !default;\n\n// Fonts\n\n$google_font_name: \"Open Sans\" !default;\n$google_font_family: \"Open+Sans:300,300i,400,400i,700,700i\" !default;\n$web-font-path: \"https://fonts.googleapis.com/css?family=#{$google_font_family}&display=swap\";\n\n$td-fonts-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n\n@if $td-enable-google-fonts {\n $td-fonts-serif: prepend($td-fonts-serif, \"#{$google_font_name}\");\n}\n\n$font-family-sans-serif: $td-fonts-serif !default;\n\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n$font-size-base: 1rem !default;\n\n// Font weights\n\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-bold: 700 !default;\n\n$font-weight-body-text: $font-weight-normal !default;\n$headings-font-weight: $font-weight-medium !default;\n\n// Heading sizes\n\n$h1-font-size: $font-size-base * 2.25 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.5 !default;\n$h4-font-size: $font-size-base * 1.35 !default;\n$h5-font-size: $font-size-base * 1.15 !default;\n$h6-font-size: $font-size-base !default;\n\n// Display styles\n\n$display1-weight: $font-weight-bold !default;\n$display2-weight: $font-weight-bold !default;\n$display3-weight: $font-weight-bold !default;\n$display4-weight: $font-weight-bold !default;\n$display1-size: 3rem !default;\n$display2-size: 2.5rem !default;\n$display3-size: 2rem !default;\n$display4-size: 1.75rem !default;\n\n// Space\n\n$spacer: 1rem;\n$td-block-space-top-base: 4 * $spacer !default;\n$td-block-space-bottom-base: 4 * $spacer !default;\n\n// Pagination\n\n$pagination-color: $gray-600 !default;\n$pagination-border-color: rgba($black, 0.1) !default;\n$pagination-active-border-color: darken($primary, 5%) !default;\n$pagination-disabled-color: $gray-300 !default;\n\n// Navbar\n\n$navbar-dark-color: rgba($white, 0.75) !default;\n$navbar-dark-hover-color: rgba($white, 0.5) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, 0.25) !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\".\n$yiq-contrasted-threshold: 200 !default;\n", + "// Some simple mixins.\n\n@mixin bg-gradient-variant($parent, $color,$ignore-warning: false) {\n #{$parent} {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\n }\n}\n\n@mixin link-variant($parent, $color, $hover-color, $underline: false) {\n #{$parent} {\n color: $color;\n\n &:hover {\n color: $hover-color;\n }\n\n @if $underline {\n text-decoration: underline;\n }\n }\n}\n\n@mixin optional-at-root($sel) {\n @at-root #{if(not &, $sel, selector-append(&, $sel))} {\n @content;\n }\n}\n\n// placeholder allows styling of the placeholder used in search input etc.\n@mixin placeholder {\n @include optional-at-root(\"::-webkit-input-placeholder\") {\n @content;\n }\n\n\n @include optional-at-root(\":-moz-placeholder\") {\n @content;\n }\n\n\n @include optional-at-root(\"::-moz-placeholder\") {\n @content;\n }\n\n\n @include optional-at-root(\":-ms-input-placeholder\") {\n @content;\n }\n}\n", + "/*!\n * Bootstrap v4.6.1 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n", + "// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" or unit($prev-num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n @if length($map) > 0 {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// See https://codepen.io/kevinweber/pen/dXWoRw\n//\n// Requires the use of quotes around data URIs.\n\n@function escape-svg($string) {\n @if str-index($string, \"data:image/svg+xml\") {\n @each $char, $encoded in $escaped-characters {\n // Do not escape the url brackets\n @if str-index($string, \"url(\") == 1 {\n $string: url(\"#{str-replace(str-slice($string, 6, -3), $char, $encoded)}\");\n } @else {\n $string: str-replace($string, $char, $encoded);\n }\n }\n }\n\n @return $string;\n}\n\n// Color contrast\n@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {\n $r: red($color);\n $g: green($color);\n $b: blue($color);\n\n $yiq: (($r * 299) + ($g * 587) + ($b * 114)) * .001;\n\n @if ($yiq >= $yiq-contrasted-threshold) {\n @return $dark;\n } @else {\n @return $light;\n }\n}\n\n// Retrieve color Sass maps\n@function color($key: \"blue\") {\n @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n @return map-get($theme-colors, $key);\n}\n\n@function gray($key: \"100\") {\n @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n $color: theme-color($color-name);\n $color-base: if($level > 0, $black, $white);\n $level: abs($level);\n\n @return mix($color-base, $color, $level * $theme-color-interval);\n}\n\n// Return valid calc\n@function add($value1, $value2, $return-calc: true) {\n @if $value1 == null {\n @return $value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 + $value2;\n }\n\n @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(\" + \") + $value2);\n}\n\n@function subtract($value1, $value2, $return-calc: true) {\n @if $value1 == null and $value2 == null {\n @return null;\n }\n\n @if $value1 == null {\n @return -$value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 - $value2;\n }\n\n @if type-of($value2) != number {\n $value2: unquote(\"(\") + $value2 + unquote(\")\");\n }\n\n @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(\" - \") + $value2);\n}\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n", + "// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n$grid-row-columns: 6 !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n$table-th-font-weight: null !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height-sm * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height-lg * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n$custom-control-cursor: null !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-label-color: null !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: null !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: null !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: url(\"data:image/svg+xml,\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: url(\"data:image/svg+xml,\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: null !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: url(\"data:image/svg+xml,\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size * .5 !default;\n$custom-switch-indicator-size: subtract($custom-control-indicator-size, $custom-control-indicator-border-width * 4) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: url(\"data:image/svg+xml,\") !default;\n$custom-select-background: escape-svg($custom-select-indicator) right $custom-select-padding-x center / $custom-select-bg-size no-repeat !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: add(1em * .75, (2 * $custom-select-padding-y * .75) + $custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n\n$form-validation-states: () !default;\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer * .5 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-nav-scroll-max-height: 75vh !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding: $dropdown-padding-y $dropdown-item-padding-x !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width * .5 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n// Margin between elements in footer, must be lower than or equal to 2 * $modal-inner-padding\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-font-size: null !default;\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n$user-selects: all, auto, none !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n", + "// Toggles\n//\n// Used in conjunction with global variables to enable certain theme features.\n\n// Vendor\n@import \"vendor/rfs\";\n\n// Deprecate\n@import \"mixins/deprecate\";\n\n// Utilities\n@import \"mixins/breakpoints\";\n@import \"mixins/hover\";\n@import \"mixins/image\";\n@import \"mixins/badge\";\n@import \"mixins/resize\";\n@import \"mixins/screen-reader\";\n@import \"mixins/size\";\n@import \"mixins/reset-text\";\n@import \"mixins/text-emphasis\";\n@import \"mixins/text-hide\";\n@import \"mixins/text-truncate\";\n@import \"mixins/visibility\";\n\n// Components\n@import \"mixins/alert\";\n@import \"mixins/buttons\";\n@import \"mixins/caret\";\n@import \"mixins/pagination\";\n@import \"mixins/lists\";\n@import \"mixins/list-group\";\n@import \"mixins/nav-divider\";\n@import \"mixins/forms\";\n@import \"mixins/table-row\";\n\n// Skins\n@import \"mixins/background-variant\";\n@import \"mixins/border-radius\";\n@import \"mixins/box-shadow\";\n@import \"mixins/gradients\";\n@import \"mixins/transition\";\n\n// Layout\n@import \"mixins/clearfix\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n@import \"mixins/float\";\n", + "// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive font sizes\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/v8.x/LICENSE)\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n@if $rfs-font-size-unit != rem and $rfs-font-size-unit != px {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize font size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: divide($rfs-base-font-size, $rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: divide($rfs-base-font-size, divide($rfs-base-font-size * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-disable-class {\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity, which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-enable-class {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query($mq-value) {\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @content;\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @content;\n }\n }\n}\n\n// Responsive font size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Remove unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: divide($fs, $fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: divide($fs, divide($fs * 0 + 1, $rfs-rem-value));\n }\n\n // Set default font size\n $rfs-static: if($rfs-font-size-unit == rem, #{divide($fs, $rfs-rem-value)}rem, #{$fs}px);\n\n // Only add the media query if the font size is bigger than the minimum font size\n @if $fs <= $rfs-base-font-size or not $enable-responsive-font-sizes {\n font-size: #{$rfs-static}#{$rfs-suffix};\n }\n @else {\n // Calculate the minimum font size for $fs\n $fs-min: $rfs-base-font-size + divide($fs - $rfs-base-font-size, $rfs-factor);\n\n // Calculate difference between $fs and the minimum font size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n $min-width: if($rfs-font-size-unit == rem, #{divide($fs-min, $rfs-rem-value)}rem, #{$fs-min}px);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($fs-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Set the calculated font-size\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n\n // Breakpoint formatting\n $mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n\n @include _rfs-disable-class {\n font-size: #{$rfs-static}#{$rfs-suffix};\n }\n\n @include _rfs-media-query($mq-value) {\n @include _rfs-enable-class {\n font-size: $rfs-fluid;\n }\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixins use RFS to rescale the font size\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n", + "// Deprecate mixin\n//\n// This mixin can be used to deprecate mixins or functions.\n// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to\n// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)\n@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {\n @if ($enable-deprecation-messages != false and $ignore-warning != true) {\n @warn \"#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.\";\n }\n}\n", + "// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n", + "// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover() {\n &:hover { @content; }\n}\n\n@mixin hover-focus() {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus() {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active() {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n", + "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid() {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n", + "@mixin badge-variant($bg) {\n color: color-yiq($bg);\n background-color: $bg;\n\n @at-root a#{&} {\n @include hover-focus() {\n color: color-yiq($bg);\n background-color: darken($bg, 10%);\n }\n\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5);\n }\n }\n}\n", + "// Resize anything\n\n@mixin resizable($direction) {\n overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n resize: $direction; // Options: horizontal, vertical, both\n}\n", + "// Only display content to screen readers\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only() {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable() {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n }\n}\n", + "// Sizing shortcuts\n\n@mixin size($width, $height: $width) {\n width: $width;\n height: $height;\n @include deprecate(\"`size()`\", \"v4.3.0\", \"v5\");\n}\n", + "@mixin reset-text() {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n", + "// stylelint-disable declaration-no-important\n\n// Typography\n\n@mixin text-emphasis-variant($parent, $color, $ignore-warning: false) {\n #{$parent} {\n color: $color !important;\n }\n @if $emphasized-link-hover-darken-percentage != 0 {\n a#{$parent} {\n @include hover-focus() {\n color: darken($color, $emphasized-link-hover-darken-percentage) !important;\n }\n }\n }\n @include deprecate(\"`text-emphasis-variant()`\", \"v4.4.0\", \"v5\", $ignore-warning);\n}\n", + "// CSS image replacement\n@mixin text-hide($ignore-warning: false) {\n // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n\n @include deprecate(\"`text-hide()`\", \"v4.1.0\", \"v5\", $ignore-warning);\n}\n", + "// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n", + "// stylelint-disable declaration-no-important\n\n// Visibility\n\n@mixin invisible($visibility) {\n visibility: $visibility !important;\n @include deprecate(\"`invisible()`\", \"v4.3.0\", \"v5\");\n}\n", + "@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n\n .alert-link {\n color: darken($color, 10%);\n }\n}\n", + "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {\n color: color-yiq($background);\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n @include hover() {\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n &:focus,\n &.focus {\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n @if $enable-shadows {\n @include box-shadow($btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n color: color-yiq($background);\n background-color: $background;\n border-color: $border;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n @if $enable-gradients {\n background-image: none; // Remove the gradient for the pressed/active state\n }\n border-color: $active-border;\n\n &:focus {\n @if $enable-shadows and $btn-active-box-shadow != none {\n @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n }\n }\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n color: $color;\n border-color: $color;\n\n @include hover() {\n color: $color-hover;\n background-color: $active-background;\n border-color: $active-border;\n }\n\n &:focus,\n &.focus {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n border-color: $active-border;\n\n &:focus {\n @if $enable-shadows and $btn-active-box-shadow != none {\n @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n", + "@mixin caret-down() {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up() {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-right() {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-left() {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down();\n } @else if $direction == up {\n @include caret-up();\n } @else if $direction == right {\n @include caret-right();\n }\n }\n\n @if $direction == left {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-left();\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n", + "// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n .page-link {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n }\n\n .page-item {\n &:first-child {\n .page-link {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n", + "// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled() {\n padding-left: 0;\n list-style: none;\n}\n", + "// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n &.list-group-item-action {\n @include hover-focus() {\n color: $color;\n background-color: darken($background, 5%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n", + "// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y, $ignore-warning: false) {\n height: 0;\n margin: $margin-y 0;\n overflow: hidden;\n border-top: 1px solid $color;\n @include deprecate(\"The `nav-divider()` mixin\", \"v4.4.0\", \"v5\", $ignore-warning);\n}\n", + "// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-focus-border-color` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus($ignore-warning: false) {\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n @include box-shadow($input-box-shadow, $input-focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $input-focus-box-shadow;\n }\n }\n @include deprecate(\"The `form-control-focus()` mixin\", \"v4.4.0\", \"v5\", $ignore-warning);\n}\n\n// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n@mixin form-validation-state-selector($state) {\n @if ($state == \"valid\" or $state == \"invalid\") {\n .was-validated #{if(&, \"&\", \"\")}:#{$state},\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n } @else {\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n }\n}\n\n@mixin form-validation-state($state, $color, $icon) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: color-yiq($color);\n background-color: rgba($color, $form-feedback-tooltip-opacity);\n @include border-radius($form-feedback-tooltip-border-radius);\n\n // See https://github.com/twbs/bootstrap/pull/31557\n // Align tooltip to form elements\n .form-row > .col > &,\n .form-row > [class*=\"col-\"] > & {\n left: $form-grid-gutter-width * .5;\n }\n }\n\n @include form-validation-state-selector($state) {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n\n .form-control {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner !important; // stylelint-disable-line declaration-no-important\n background-image: escape-svg($icon);\n background-repeat: no-repeat;\n background-position: right $input-height-inner-quarter center;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n select.form-control {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n padding-right: $input-padding-x * 4 !important; // stylelint-disable-line declaration-no-important\n background-position: right $input-padding-x * 2 center;\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .custom-select {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $custom-select-feedback-icon-padding-right !important; // stylelint-disable-line declaration-no-important\n background: $custom-select-background, $custom-select-bg escape-svg($icon) $custom-select-feedback-icon-position / $custom-select-feedback-icon-size no-repeat;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n }\n }\n\n .form-check-input {\n @include form-validation-state-selector($state) {\n ~ .form-check-label {\n color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .custom-control-input {\n @include form-validation-state-selector($state) {\n ~ .custom-control-label {\n color: $color;\n\n &::before {\n border-color: $color;\n }\n }\n\n &:checked {\n ~ .custom-control-label::before {\n border-color: lighten($color, 10%);\n @include gradient-bg(lighten($color, 10%));\n }\n }\n\n &:focus {\n ~ .custom-control-label::before {\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n\n &:not(:checked) ~ .custom-control-label::before {\n border-color: $color;\n }\n }\n }\n }\n\n // custom file\n .custom-file-input {\n @include form-validation-state-selector($state) {\n ~ .custom-file-label {\n border-color: $color;\n }\n\n &:focus {\n ~ .custom-file-label {\n border-color: $color;\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n }\n }\n }\n}\n", + "// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover() {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n", + "// stylelint-disable declaration-no-important\n\n// Contextual backgrounds\n\n@mixin bg-variant($parent, $color, $ignore-warning: false) {\n #{$parent} {\n background-color: $color !important;\n }\n a#{$parent},\n button#{$parent} {\n @include hover-focus() {\n background-color: darken($color, 10%) !important;\n }\n }\n @include deprecate(\"The `bg-variant` mixin\", \"v4.4.0\", \"v5\", $ignore-warning);\n}\n\n@mixin bg-gradient-variant($parent, $color, $ignore-warning: false) {\n #{$parent} {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\n }\n @include deprecate(\"The `bg-gradient-variant` mixin\", \"v4.5.0\", \"v5\", $ignore-warning);\n}\n", + "// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n", + "@mixin box-shadow($shadow...) {\n @if $enable-shadows {\n $result: ();\n\n @if (length($shadow) == 1) {\n // We can pass `@include box-shadow(none);`\n $result: $shadow;\n } @else {\n // Filter to avoid invalid properties for example `box-shadow: none, 1px 1px black;`\n @for $i from 1 through length($shadow) {\n @if nth($shadow, $i) != \"none\" {\n $result: append($result, nth($shadow, $i), \"comma\");\n }\n }\n }\n @if (length($result) > 0) {\n box-shadow: $result;\n }\n }\n}\n", + "// Gradients\n\n@mixin gradient-bg($color) {\n @if $enable-gradients {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\n } @else {\n background-color: $color;\n }\n}\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n", + "// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-prefers-reduced-motion-media-query and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n", + "@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n", + "// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter * .5;\n padding-left: $gutter * .5;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @if $columns > 0 {\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n }\n\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n @if $columns > 0 {\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n }\n}\n", + "/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter * .5;\n padding-left: $gutter * .5;\n margin-right: auto;\n margin-left: auto;\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter * .5;\n margin-left: -$gutter * .5;\n}\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n @include deprecate(\"The `make-container-max-widths` mixin\", \"v4.5.2\", \"v5\");\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter * .5;\n padding-left: $gutter * .5;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage(divide($size, $columns));\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage(divide($size, $columns));\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// numberof columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 divide(100%, $count);\n max-width: divide(100%, $count);\n }\n}\n", + "// stylelint-disable declaration-no-important\n\n@mixin float-left() {\n float: left !important;\n @include deprecate(\"The `float-left` mixin\", \"v4.3.0\", \"v5\");\n}\n@mixin float-right() {\n float: right !important;\n @include deprecate(\"The `float-right` mixin\", \"v4.3.0\", \"v5\");\n}\n@mixin float-none() {\n float: none !important;\n @include deprecate(\"The `float-none` mixin\", \"v4.3.0\", \"v5\");\n}\n", + ":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n", + "// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline\n// on elements that programmatically receive focus but wouldn't normally show a visible\n// focus outline. In general, this would mean that the outline is only applied if the\n// interaction that led to the element receiving programmatic focus was a keyboard interaction,\n// or the browser has somehow determined that the user is primarily a keyboard user and/or\n// wants focus outlines to always be presented.\n//\n// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible\n// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

    `-`

    ` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

    `s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover() {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n\n @include hover() {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap,\n // making it impossible to interact with the content\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Set the cursor for non-` - - - - - - - - - - - - - - - - - - - -

    - - -
    -
    -
    - - -
    - - - -
    -
    - -
    -

    Eclipse Con France 2017 Talk

    -
    -

    - - - - in talk - - - -

    -

    - July 11, 2017 -

    -
    -

    Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. -

    -

    Continue reading -

    -
    -
    -
    - - - -
    - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
    - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tags/ecf17/index.xml b/tags/ecf17/index.xml deleted file mode 100644 index c3cbed5..0000000 --- a/tags/ecf17/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Ecf17 on Eclipse SW360 - https://www.eclipse.org/sw360/tags/ecf17/ - Recent content in Ecf17 on Eclipse SW360 - Hugo -- gohugo.io - en-us - Tue, 11 Jul 2017 11:27:33 +0200 - - - - - - Eclipse Con France 2017 Talk - https://www.eclipse.org/sw360/blog/ecf2017/ - Tue, 11 Jul 2017 11:27:33 +0200 - - https://www.eclipse.org/sw360/blog/ecf2017/ - Talk @EclipseCon France 2017 Eclipse SW360 was presented at EclipseCon France 2017 by Johannes Kristan. - - - - - \ No newline at end of file diff --git a/tags/ecf17/page/1/index.html b/tags/ecf17/page/1/index.html deleted file mode 100644 index 4fb28d0..0000000 --- a/tags/ecf17/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.eclipse.org/sw360/tags/ecf17/ \ No newline at end of file diff --git a/tags/index.html b/tags/index.html deleted file mode 100644 index 4001fc0..0000000 --- a/tags/index.html +++ /dev/null @@ -1,374 +0,0 @@ - - - - - - - - - Tags - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - - - - -
    - -
    -
    -
    -
    -

    Tags

    -
    -
    -
    -
    - - -
    -
    -
    - - -
    - - - - - -
    - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
    - -
    - -
    - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tags/index.xml b/tags/index.xml deleted file mode 100644 index d92bfc4..0000000 --- a/tags/index.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - Tags on Eclipse SW360 - https://www.eclipse.org/sw360/tags/ - Recent content in Tags on Eclipse SW360 - Hugo -- gohugo.io - en-us - Tue, 11 Jul 2017 11:27:33 +0200 - - - - - - Ecf17 - https://www.eclipse.org/sw360/tags/ecf17/ - Tue, 11 Jul 2017 11:27:33 +0200 - - https://www.eclipse.org/sw360/tags/ecf17/ - - - - - \ No newline at end of file diff --git a/tags/page/1/index.html b/tags/page/1/index.html deleted file mode 100644 index b6f429c..0000000 --- a/tags/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.eclipse.org/sw360/tags/ \ No newline at end of file diff --git a/webfonts/fa-brands-400.eot b/webfonts/fa-brands-400.eot new file mode 100644 index 0000000..2cca660 Binary files /dev/null and b/webfonts/fa-brands-400.eot differ diff --git a/webfonts/fa-brands-400.svg b/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..d9939bc --- /dev/null +++ b/webfonts/fa-brands-400.svg @@ -0,0 +1,3451 @@ + + + + + +Created by FontForge 20190112 at Fri Aug 2 14:41:09 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webfonts/fa-brands-400.ttf b/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..2cb180b Binary files /dev/null and b/webfonts/fa-brands-400.ttf differ diff --git a/webfonts/fa-brands-400.woff b/webfonts/fa-brands-400.woff new file mode 100644 index 0000000..e192c51 Binary files /dev/null and b/webfonts/fa-brands-400.woff differ diff --git a/webfonts/fa-brands-400.woff2 b/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..e916d75 Binary files /dev/null and b/webfonts/fa-brands-400.woff2 differ diff --git a/webfonts/fa-regular-400.eot b/webfonts/fa-regular-400.eot new file mode 100644 index 0000000..54c8991 Binary files /dev/null and b/webfonts/fa-regular-400.eot differ diff --git a/webfonts/fa-regular-400.svg b/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..e04c2e0 --- /dev/null +++ b/webfonts/fa-regular-400.svg @@ -0,0 +1,803 @@ + + + + + +Created by FontForge 20190112 at Fri Aug 2 14:41:09 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webfonts/fa-regular-400.ttf b/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..ef43cfd Binary files /dev/null and b/webfonts/fa-regular-400.ttf differ diff --git a/webfonts/fa-regular-400.woff b/webfonts/fa-regular-400.woff new file mode 100644 index 0000000..13f0191 Binary files /dev/null and b/webfonts/fa-regular-400.woff differ diff --git a/webfonts/fa-regular-400.woff2 b/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..004b29b Binary files /dev/null and b/webfonts/fa-regular-400.woff2 differ diff --git a/webfonts/fa-solid-900.eot b/webfonts/fa-solid-900.eot new file mode 100644 index 0000000..8f11368 Binary files /dev/null and b/webfonts/fa-solid-900.eot differ diff --git a/webfonts/fa-solid-900.svg b/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..b80d477 --- /dev/null +++ b/webfonts/fa-solid-900.svg @@ -0,0 +1,4649 @@ + + + + + +Created by FontForge 20190112 at Fri Aug 2 14:41:09 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webfonts/fa-solid-900.ttf b/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..5a6d747 Binary files /dev/null and b/webfonts/fa-solid-900.ttf differ diff --git a/webfonts/fa-solid-900.woff b/webfonts/fa-solid-900.woff new file mode 100644 index 0000000..d92df45 Binary files /dev/null and b/webfonts/fa-solid-900.woff differ diff --git a/webfonts/fa-solid-900.woff2 b/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..df7e704 Binary files /dev/null and b/webfonts/fa-solid-900.woff2 differ + echo 'Changes have been detected, publishing to repo '\''www.eclipse.org/sw360'\''' Changes have been detected, publishing to repo 'www.eclipse.org/sw360' + git commit -m 'Website build sw360.website.staging-4' [master e392ba8] Website build sw360.website.staging-4 193 files changed, 81940 insertions(+), 40159 deletions(-) rewrite 404.html (95%) rewrite about/index.html (81%) delete mode 100644 blog/ecf2017/index.html delete mode 100644 blog/index.html delete mode 100644 blog/index.xml delete mode 100644 blog/page/1/index.html delete mode 100644 categories/index.html delete mode 100644 categories/index.xml delete mode 100644 categories/introduction/index.html delete mode 100644 categories/introduction/index.xml delete mode 100644 categories/introduction/page/1/index.html delete mode 100644 categories/page/1/index.html delete mode 100644 categories/talk/index.html delete mode 100644 categories/talk/index.xml delete mode 100644 categories/talk/page/1/index.html delete mode 100644 categories/video/index.html delete mode 100644 categories/video/index.xml delete mode 100644 categories/video/page/1/index.html delete mode 100644 css/animate.css delete mode 100644 css/custom.css delete mode 100644 css/owl.carousel.css delete mode 100644 css/owl.theme.css create mode 100644 css/prism.css create mode 100644 css/shortcodes.css create mode 100644 css/shortcodes/cards-pane.css create mode 100644 css/shortcodes/tabbed-pane.css delete mode 100644 css/style.blue.css delete mode 100644 css/style.default.css delete mode 100644 css/style.green.css delete mode 100644 css/style.marsala.css delete mode 100644 css/style.pink.css delete mode 100644 css/style.red.css delete mode 100644 css/style.sw360.css delete mode 100644 css/style.turquoise.css delete mode 100644 css/style.violet.css create mode 100644 css/swagger-ui.css create mode 100644 docs/deployment/baremetal/deploy-natively-11/index.html create mode 100644 docs/deployment/baremetal/index.html create mode 100644 docs/deployment/baremetal/index.xml create mode 100644 docs/deployment/deploy-authorization-concept/index.html create mode 100644 docs/deployment/deploy-configuration-country-codes/index.html create mode 100644 docs/deployment/deploy-configuration-files/index.html create mode 100644 docs/deployment/deploy-cve-search/index.html create mode 100644 docs/deployment/deploy-docker/index.html create mode 100644 docs/deployment/deploy-export-and-import/index.html create mode 100644 docs/deployment/deploy-requirements/index.html create mode 100644 docs/deployment/deploy-secure-deployment/index.html create mode 100644 docs/deployment/index.html create mode 100644 docs/deployment/index.xml create mode 100644 docs/deployment/upgrading/deploy-upgrade-to-liferay-7.3-and-java-11/index.html create mode 100644 docs/deployment/upgrading/index.html create mode 100644 docs/deployment/upgrading/index.xml create mode 100644 docs/developers/dev-adding-a-new-portlet-backend/index.html create mode 100644 docs/developers/dev-adding-a-new-portlet-frontend/index.html create mode 100644 docs/developers/dev-adding-new-fields-to-existing-classes/index.html create mode 100644 docs/developers/dev-branches/index.html create mode 100644 docs/developers/dev-database-migration-using-costco/index.html create mode 100644 docs/developers/dev-dod-and-style/index.html create mode 100644 docs/developers/dev-external-documents-with-couchdb/index.html create mode 100644 docs/developers/dev-filtering-in-portlets/index.html create mode 100644 docs/developers/dev-fossology-integration/index.html create mode 100644 docs/developers/dev-liferay-friendly-url/index.html create mode 100644 docs/developers/dev-moderation-requests/index.html create mode 100644 docs/developers/dev-releasing-sw360/index.html create mode 100644 docs/developers/dev-rest-api/index.html create mode 100644 docs/developers/dev-role-authorisation-model/index.html create mode 100644 docs/developers/dev-semantic-commits/index.html create mode 100644 docs/developers/dev-testing-frameworks/index.html create mode 100644 docs/developers/dev-troubleshooting/index.html create mode 100644 docs/developers/dev-using-requirejs-for-javascript-modules/index.html create mode 100644 docs/developers/index.html create mode 100644 docs/developers/index.xml create mode 100644 docs/developers/testcases/index.html create mode 100644 docs/developers/testcases/index.xml create mode 100644 docs/developers/testcases/test-cases-components/index.html create mode 100644 docs/developers/testcases/test-cases-licenses/index.html create mode 100644 docs/developers/testcases/test-cases-moderations/index.html create mode 100644 docs/developers/testcases/test-cases-projects/index.html create mode 100644 docs/index.html create mode 100644 docs/index.xml create mode 100644 docs/userguide/index.html create mode 100644 docs/userguide/index.xml create mode 100644 docs/userguide/user-attachment-file-types/index.html create mode 100644 docs/userguide/user-bdp-import/index.html create mode 100644 docs/userguide/user-data-model-enumerations/index.html create mode 100644 docs/userguide/user-scheduling-cve-search-by-admins/index.html create mode 100644 docs/userguide/user-search/index.html create mode 100644 docs/userguide/vulnerabilitymanagement/index.html create mode 100644 docs/userguide/vulnerabilitymanagement/index.xml create mode 100644 docs/userguide/vulnerabilitymanagement/user-check-vulnerabilities-for-your-project/index.html create mode 100644 docs/userguide/workflows/index.html create mode 100644 docs/userguide/workflows/index.xml create mode 100644 favicons/android-144x144.png create mode 100644 favicons/android-192x192.png create mode 100644 favicons/android-36x36.png create mode 100644 favicons/android-48x48.png create mode 100644 favicons/android-72x72.png create mode 100644 favicons/android-96x96.png create mode 100644 favicons/android-chrome-192x192.png create mode 100644 favicons/android-chrome-512x512.png create mode 100644 favicons/android-chrome-maskable-192x192.png create mode 100644 favicons/android-chrome-maskable-512x512.png create mode 100644 favicons/apple-touch-icon-120x120.png create mode 100644 favicons/apple-touch-icon-152x152.png create mode 100644 favicons/apple-touch-icon-167x167.png create mode 100644 favicons/apple-touch-icon-180x180.png create mode 100644 favicons/apple-touch-icon-60x60.png create mode 100644 favicons/apple-touch-icon-76x76.png create mode 100644 favicons/apple-touch-icon.png create mode 100644 favicons/coast-228x228.png create mode 100644 favicons/favicon-1024.png create mode 100644 favicons/favicon-128x128.png create mode 100644 favicons/favicon-16x16.png create mode 100644 favicons/favicon-256.png create mode 100644 favicons/favicon-256x256.png create mode 100644 favicons/favicon-32x32.png create mode 100644 favicons/favicon-48x48.png create mode 100644 favicons/favicon-64x64.png create mode 100644 favicons/favicon-96x96.png create mode 100644 favicons/favicon.ico create mode 100644 favicons/msapplication-icon-144x144.png create mode 100644 favicons/mstile-150x150.png create mode 100644 favicons/pwa-192x192.png create mode 100644 favicons/pwa-512x512.png create mode 100644 favicons/tile150x150.png create mode 100644 favicons/tile310x150.png create mode 100644 favicons/tile310x310.png create mode 100644 favicons/tile70x70.png delete mode 100644 img/cyber-bg.jpg delete mode 100644 img/favicons.zip delete mode 100644 img/favicons/android-chrome-192x192.png delete mode 100644 img/favicons/android-chrome-512x512.png delete mode 100644 img/favicons/apple-touch-icon.png delete mode 100644 img/favicons/browserconfig.xml delete mode 100644 img/favicons/favicon-16x16.png delete mode 100644 img/favicons/favicon-32x32.png delete mode 100644 img/favicons/manifest.json delete mode 100644 img/favicons/mstile-150x150.png delete mode 100644 img/favicons/safari-pinned-tab.svg create mode 100644 img/featured-background.jpg delete mode 100644 img/fixed-background-2.jpg create mode 100644 img/logos/logo_full.svg delete mode 100644 img/photogrid.jpg delete mode 100644 img/sw360-h-208x79.png delete mode 100644 img/sw360-icon.png delete mode 100644 img/sw360-logo-icon.png delete mode 100644 img/sw360.png delete mode 100644 img/texture-green.png delete mode 100644 img/texture-turquoise.png delete mode 100644 img/texture-violet.png rewrite index.html (94%) rewrite index.xml (95%) create mode 100644 js/deflate.js delete mode 100644 js/front.js delete mode 100644 js/gmaps.init.js delete mode 100644 js/hpneo.gmaps.js create mode 100644 js/main.js delete mode 100644 js/owl.carousel.min.js create mode 100644 js/prism.js delete mode 100644 js/respond.min.js create mode 100644 js/swagger-ui-bundle.js create mode 100644 js/swagger-ui-standalone-preset.js create mode 100644 js/tabpane-persist.js delete mode 100644 page/1/index.html rewrite presentations/index.html (65%) create mode 100644 presentations/index.xml delete mode 100644 resources/index.html create mode 100644 robots.txt rewrite screenshots/index.html (82%) create mode 100644 scss/main.css create mode 100644 scss/main.css.map rewrite sitemap.xml (82%) delete mode 100644 tags/ecf17/index.html delete mode 100644 tags/ecf17/index.xml delete mode 100644 tags/ecf17/page/1/index.html delete mode 100644 tags/index.html delete mode 100644 tags/index.xml delete mode 100644 tags/page/1/index.html create mode 100644 webfonts/fa-brands-400.eot create mode 100644 webfonts/fa-brands-400.svg create mode 100644 webfonts/fa-brands-400.ttf create mode 100644 webfonts/fa-brands-400.woff create mode 100644 webfonts/fa-brands-400.woff2 create mode 100644 webfonts/fa-regular-400.eot create mode 100644 webfonts/fa-regular-400.svg create mode 100644 webfonts/fa-regular-400.ttf create mode 100644 webfonts/fa-regular-400.woff create mode 100644 webfonts/fa-regular-400.woff2 create mode 100644 webfonts/fa-solid-900.eot create mode 100644 webfonts/fa-solid-900.svg create mode 100644 webfonts/fa-solid-900.ttf create mode 100644 webfonts/fa-solid-900.woff create mode 100644 webfonts/fa-solid-900.woff2 + git log --graph --abbrev-commit --date=relative -n 5 * commit e392ba8 | Author: SW360 Bot | Date: 1 second ago | | Website build sw360.website.staging-4 | * commit a93d469 | Author: SW360 Bot | Date: 3 years, 1 month ago | | Website build sw360.website-70 | * commit c392a1a | Author: SW360 Bot | Date: 3 years, 1 month ago | | Website build sw360.website-68 | * commit 917bdd1 | Author: SW360 Bot | Date: 3 years, 7 months ago | | Website build sw360.website-66 | * commit 909c9c3 | Author: SW360 Bot | Date: 3 years, 7 months ago | | Website build sw360.website-62 + git push origin HEAD:master remote: remote: Processing changes: (\) remote: Processing changes: refs: 1 (\) remote: Processing changes: refs: 1, done remote: commit e392ba8: ---------- remote: commit e392ba8: Reviewing commit: e392ba8f remote: commit e392ba8: Authored by: SW360 Bot remote: commit e392ba8: remote: commit e392ba8: Reviewing commit: e392ba8fc79076904fa6697f6c63c25e35cbe326 remote: commit e392ba8: Authored by: SW360 Bot remote: commit e392ba8: Automated user 'sw360-bot@eclipse.org' detected for author of commit e392ba8fc79076904fa6697f6c63c25e35cbe326 remote: commit e392ba8: Automated user 'sw360-bot@eclipse.org' detected for committer of commit e392ba8fc79076904fa6697f6c63c25e35cbe326 remote: commit e392ba8: Eclipse user 'SW360 Bot'(author) is a committer on the project. remote: commit e392ba8: Eclipse user 'SW360 Bot'(committer) is a committer on the project. remote: commit e392ba8: remote: commit e392ba8: This commit passes Eclipse validation. To ssh://git.eclipse.org:29418/www.eclipse.org/sw360.git a93d469..e392ba8 HEAD -> master [Pipeline] } $ ssh-agent -k unset SSH_AUTH_SOCK; unset SSH_AGENT_PID; echo Agent pid 281 killed; [ssh-agent] Stopped. [Pipeline] // sshagent [Pipeline] } [Pipeline] // dir [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // node [Pipeline] } [Pipeline] // podTemplate [Pipeline] End of Pipeline Finished: SUCCESS