├── .gitattributes ├── .env_SAMPLE ├── screenshot.png ├── screenshot-env.png ├── screenshot-scrub-success.png ├── INSTALL.md ├── .github ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── bin └── open-source-checklist ├── package.json ├── .gitignore ├── scrub.sh ├── README.md ├── opensource-checklist.md ├── cmds └── check-it.js └── LICENSE /.gitattributes: -------------------------------------------------------------------------------- 1 | /CHANGELOG.md merge=union 2 | -------------------------------------------------------------------------------- /.env_SAMPLE: -------------------------------------------------------------------------------- 1 | export GHE_URL=fake.github.url 2 | echo 'Environment variable GHE_URL set' -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cfpb/open-source-checklist/HEAD/screenshot.png -------------------------------------------------------------------------------- /screenshot-env.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cfpb/open-source-checklist/HEAD/screenshot-env.png -------------------------------------------------------------------------------- /screenshot-scrub-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cfpb/open-source-checklist/HEAD/screenshot-scrub-success.png -------------------------------------------------------------------------------- /INSTALL.md: -------------------------------------------------------------------------------- 1 | # Installation instructions 2 | 3 | Detailed instructions on how to install, configure, and get the project running. 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Short description explaining the high-level reason for the new issue. 2 | 3 | ## Current behavior 4 | 5 | 6 | ## Expected behavior 7 | 8 | 9 | ## Steps to replicate behavior (include URLs) 10 | 11 | 1. 12 | 13 | 14 | ## Screenshots 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /bin/open-source-checklist: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict'; 3 | 4 | var program = require('commander'); 5 | 6 | require('../cmds/check-it.js')(program); 7 | 8 | program 9 | // .version('1.0') 10 | .option('-f, --fix', 'Automatically fix any issues.') 11 | .option('-s, --scrub', 'Automatically scrub internal URLs from Git history.') 12 | .parse(process.argv); 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "open-source-checklist", 3 | "description": "check internal repos against open source checklist requirements", 4 | "bin": { 5 | "check-it": "./bin/open-source-checklist" 6 | }, 7 | "scripts": { 8 | "test": "mocha -R spec" 9 | }, 10 | "author": { 11 | "name": "Catherine Farman", 12 | "email": "catherine.farman@cfpb.gov" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/cfpb/open-source-checklist" 17 | }, 18 | "license": "CC0-1.0", 19 | "bugs": "https://github.com/cfpb/open-source-checklist/issues", 20 | "dependencies": { 21 | "commander": "2.9.0", 22 | "npm": "5.10.0", 23 | "request": "2.84.0", 24 | "shelljs": "^0.7.0", 25 | "update-notifier": "0.6.3", 26 | "winston-color": "1.0.0" 27 | }, 28 | "devDependencies": { 29 | "mocha": "^2.4.5" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Short description explaining the high-level reason for the pull request 2 | 3 | ## Additions 4 | 5 | - 6 | 7 | ## Removals 8 | 9 | - 10 | 11 | ## Changes 12 | 13 | - 14 | 15 | ## Testing 16 | 17 | - 18 | 19 | ## Review 20 | 21 | - @user 22 | 23 | [Preview this PR without the whitespace changes](?w=0) 24 | 25 | ## Screenshots 26 | 27 | 28 | ## Notes 29 | 30 | - 31 | 32 | ## Todos 33 | 34 | - 35 | 36 | ## Checklist 37 | 38 | * [ ] Changes are limited to a single goal (no scope creep) 39 | * [ ] Code can be automatically merged (no conflicts) 40 | * [ ] Code follows the standards laid out in the [front end playbook](https://github.com/cfpb/front-end) 41 | * [ ] Passes all existing automated tests 42 | * [ ] New functions include new tests 43 | * [ ] New functions are documented (with a description, list of inputs, and expected output) 44 | * [ ] Placeholder code is flagged 45 | * [ ] Visually tested in supported browsers and devices 46 | * [ ] Project documentation has been updated (including the "Unreleased" section of the CHANGELOG) 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled source # 2 | ################### 3 | *.com 4 | *.class 5 | *.dll 6 | *.exe 7 | *.o 8 | *.so 9 | _site/ 10 | 11 | # Packages # 12 | ############ 13 | # it's better to unpack these files and commit the raw source 14 | # git has its own built in compression methods 15 | *.7z 16 | *.dmg 17 | *.gz 18 | *.iso 19 | *.jar 20 | *.rar 21 | *.tar 22 | *.zip 23 | 24 | # Logs and databases # 25 | ###################### 26 | *.log 27 | *.sql 28 | *.sqlite 29 | 30 | # OS generated files # 31 | ###################### 32 | .DS_Store 33 | .DS_Store? 34 | .Spotlight-V100 35 | .Trashes 36 | Icon? 37 | ehthumbs.db 38 | Thumbs.db 39 | 40 | # Vim swap files # 41 | ################## 42 | *.swp 43 | 44 | # Python # 45 | ################# 46 | *.pyc 47 | *.egg-info/ 48 | __pycache__/ 49 | *.py[cod] 50 | .env 51 | 52 | # Django # 53 | ################# 54 | *.egg-info 55 | .installed.cfg 56 | 57 | # Unit test / coverage reports 58 | ################# 59 | htmlcov/ 60 | .tox/ 61 | .coverage 62 | .cache 63 | nosetests.xml 64 | coverage.xml 65 | 66 | # Front-End # 67 | ############# 68 | node_modules/ 69 | bower_components/ 70 | .grunt/ 71 | src/vendor/ 72 | dist/ 73 | -------------------------------------------------------------------------------- /scrub.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | take_out_trash () { 4 | rm -rf .git/refs/original/ 5 | git reflog expire --expire=now --all 6 | git gc --prune=now 7 | git gc --aggressive --prune=now 8 | } 9 | 10 | git_log_output_source=$(git --no-pager log -S$GHE_URL --all; git --no-pager log -G$GHE_URL --all) 11 | 12 | if [ "$git_log_output_source" = "" ]; then 13 | echo "Success! No GHE references found in your source code." 14 | else 15 | echo "Found GHE references in source code. Scrubbing..." 16 | git filter-branch --force --tree-filter "find . -type f -exec grep -I -l -q . {} \; -print0 | LC_ALL=C xargs -0 sed -i '' 's/$GHE_URL/fake.ghe.domain/g'" --tag-name-filter cat -- --all 17 | take_out_trash 18 | fi 19 | 20 | 21 | git_log_output_commits=$(git --no-pager log --grep=$GHE_URL --all) 22 | 23 | edit_commit_messages () { 24 | git filter-branch -f --msg-filter 'LC_ALL=C sed "s/'$GHE_URL'/fake.ghe.domain/g"' --tag-name-filter cat -- --all 25 | } 26 | 27 | confirm_continue () { 28 | read -r -p "Do you want to continue and edit commit messages? [y/n] " response 29 | case $response in 30 | [yY][eE][sS]|[yY]) 31 | edit_commit_messages 32 | take_out_trash 33 | ;; 34 | *) 35 | echo "Goodbye." 36 | ;; 37 | esac 38 | } 39 | 40 | if [ "$git_log_output_commits" = "" ]; then 41 | echo "Success! No GHE references found in commit messages." 42 | else 43 | commit_sha=$(echo $git_log_output_commits | grep -E -o 'commit [0-9a-z]{40}' | cut -d ' ' -f 2) 44 | commit_count=$(echo $((${#commit_sha} / 40)) ) 45 | echo "Found $commit_count commit messages with GHE references to scrub:" 46 | echo $commit_sha 47 | confirm_continue 48 | fi -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Open Source Checklist 2 | 3 | Automating CFPB's [Open Source Checklist](https://github.com/cfpb/open-source-project-template/blob/master/opensource-checklist.md) for easy release of internal source code. 4 | 5 | ![](https://raw.githubusercontent.com/cfpb/open-source-checklist/master/screenshot.png) 6 | 7 | 8 | ## Dependencies 9 | 10 | - [Node.js](https://nodejs.org/en/) 11 | 12 | ## Installation 13 | 14 | To use [scrub.sh](scrub.sh) to scrub GHE urls: 15 | 16 | ### Add environment variable 17 | 18 | 1. Add `.env` and `scrub.sh` to your project's `.gitignore` list. 19 | 1. Copy [`.env_SAMPLE`](.env_SAMPLE) to your project's root. 20 | 1. Rename `.env_SAMPLE` to `.env`. 21 | 1. Edit `fake.ghe.url` to point to the real GHE url (do not include `https://`). 22 | 1. `cd` into your project repo root to activate the new environment variable. You should receive a warning and then a confirmation message: 23 | 24 | ![](https://raw.githubusercontent.com/cfpb/open-source-checklist/master/screenshot-env.png) 25 | 26 | ## Usage 27 | 28 | 1. In Terminal, from project root, run: 29 | 30 | ```bash 31 | ./scrub.sh 32 | ``` 33 | ![](https://raw.githubusercontent.com/cfpb/open-source-checklist/master/screenshot-scrub-success.png) 34 | 1. Force push your repo with tags: 35 | 36 | ```bash 37 | git push -f --tags 38 | ``` 39 | 1. Remember to tell your collaborators to clone a fresh copy! 40 | 41 | **Note:** If collaborators have branches that they’d like to maintain separately, they will need to fetch and rebase from your updated remote. This must be done via rebase, not merge. 42 | 43 | If a collaborator is just mirroring the upstream repo with their fork, they can simply delete their local copy and clone a new one. 44 | 45 | ### Rebase steps 46 | 47 | Only use if you must keep a branch that you're working with locally: 48 | 49 | ``` 50 | git checkout feature-branch 51 | git rebase master 52 | ``` 53 | 54 | ## Troubleshooting 55 | 56 | If you get the following error when running `scrub.sh`: 57 | 58 | > sed: first RE may not be empty 59 | 60 | > msg filter failed 61 | 62 | You did not activate the environment variable for the GHE url. Make sure you [update the GHE_URL variable and activate it](#add-environment-variable). 63 | 64 | ## How to test the software 65 | 66 | If the software includes automated tests, detail how to run those tests. 67 | 68 | ## Known issues 69 | 70 | Document any known significant shortcomings with the software. 71 | 72 | ## Getting help 73 | 74 | If you have questions, concerns, bug reports, etc, please file an issue in this repository's Issue Tracker. 75 | 76 | ## Getting involved 77 | 78 | This software currently has no tests which means it's certainly broken. Want to write bash scripts, node.js modules, break some git histories and probably some other things? [Contributions welcome!](CONTRIBUTING.md) 79 | 80 | ---- 81 | 82 | ## Open source licensing info 83 | 1. [TERMS](TERMS.md) 84 | 2. [LICENSE](LICENSE) 85 | 3. [CFPB Source Code Policy](https://github.com/cfpb/source-code-policy/) 86 | 87 | 88 | ---- 89 | 90 | ## Credits and references 91 | 92 | 1. Projects that inspired you 93 | 2. Related projects 94 | 3. Books, papers, talks, or other sources that have meaningful impact or influence on this project 95 | -------------------------------------------------------------------------------- /opensource-checklist.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: base 3 | title: "Open Source Checklist" 4 | --- 5 | 6 | # Open Source Check List 7 | 8 | Prior to releasing a project to GitHub.com, walk through these items and ensure they are addressed. 9 | 10 | - **Has PII been removed?** 11 | - Use [Clouseau](https://github.com/virtix/clouseau) for scanning source code. 12 | - For an Open Source Release, attach the Clouseau output. 13 | - If there are images, visually inspect each image to ensure there is no CFPB-specific information. 14 | 15 | - **Have security vulnerabilities been remediated?** 16 | - Use the [OWASP Top 10](https://www.owasp.org/index.php/Top_10_2013) 17 | - [National Vulnerability Database](http://nvd.nist.gov/) 18 | - [SANS Swat Checklist](http://www.securingthehuman.org/developer/swat) 19 | 20 | - **Are we including any other open source products? If so, is there any conflict with our public domain release?** 21 | 22 | - **Is our `TERMS.md` included?** 23 | 24 | - **Is a `CHANGELOG.md` present and does it contain structured, consistently formatted recent history?** 25 | - See and 26 | - Some Inspiration: 27 | 28 | - **Are instructions for contributing included (`CONTRIBUTING.md`)?** 29 | 30 | - **Are installation instructions clearly written in the `README` _and_ tested on a clean machine?** 31 | 32 | - **Are all dependencies described in the `README`, `requirements.txt`, and/or `buildout.cfg`?** 33 | 34 | - **Are the API docs generated?** 35 | 36 | - **Are there unit tests?** 37 | 38 | - **If appplicable and possible, is it set up in TravisCI?** 39 | 40 | - **Have multiple people reviewed the code?** 41 | 42 | - **Is there a screenshot in the `README`, if applicable?** 43 | 44 | 45 | ## Copy this version to paste into a GitHub issue with live checkboxes: 46 | 47 | ~~~ 48 | - [ ] **Has PII been removed?** 49 | - Use [Clouseau](https://github.com/virtix/clouseau) for scanning source code. 50 | - If there are images, visually inspect each image to ensure there is no CFPB-specific information. 51 | - [ ] **Have security vulnerabilities been remediated?** 52 | - [ ] **Are we including any other open source products? If so, is there any conflict with our public domain release?** 53 | - [ ] **Is our `TERMS.md` included?** 54 | - [ ] **Is a `CHANGELOG.md` present and does it contain structured, consistently formatted recent history?** 55 | - [ ] **Are instructions for contributing included (`CONTRIBUTING.md`)?** 56 | - [ ] **Are installation instructions clearly written in the `README` _and_ tested on a clean machine?** 57 | - [ ] **Are all dependencies described in the `README`, `requirements.txt`, and/or `buildout.cfg`?** 58 | - [ ] **Are the API docs generated?** 59 | - [ ] **Are there unit tests?** 60 | - [ ] **If applicable and possible, is it set up in TravisCI?** 61 | - [ ] **Have multiple people reviewed the code?** 62 | - [ ] **Is there a screenshot in the `README`, if applicable?** 63 | ~~~ 64 | 65 | ---- 66 | 67 | 68 | ## Take a look at the following projects as good models to follow: 69 | 70 | - [https://github.com/cfpb/qu](https://github.com/cfpb/qu) 71 | - [https://github.com/cfpb/idea-box](https://github.com/cfpb/idea-box) 72 | - [https://github.com/cfpb/hmda-tool](https://github.com/cfpb/hmda-tools) 73 | - [https://github.com/cfpb/django-cache-tools](https://github.com/cfpb/django-cache-tools) 74 | -------------------------------------------------------------------------------- /cmds/check-it.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var fs = require('fs'); 4 | var path = require('path'); 5 | var request = require('request'); 6 | var logger = require('winston-color'); 7 | var npm = require('npm'); 8 | var shell = require("shelljs"); 9 | 10 | var fix = false; 11 | var scrub = false; 12 | var location, failure, manifest; 13 | 14 | module.exports = function(program) { 15 | 16 | program 17 | .command('*') 18 | .description('Check that your project repo meets CFPB\'s open source checklist requirements.') 19 | .action(function(loc) { 20 | location = loc || '.'; 21 | fix = program.fix; 22 | scrub = program.scrub; 23 | [checkPII, checkTERMS, checkCONTRIBUTING, checkCHANGELOG, checkENV].forEach(function(func) { 24 | func(function(err, msg) { 25 | if (err) { 26 | return logger.error(err); 27 | process.exit(1); 28 | } 29 | return logger.info(msg); 30 | }); 31 | }); 32 | }); 33 | 34 | }; 35 | 36 | function checkPII(cb) { 37 | // Has PII been removed? 38 | } 39 | 40 | function checkTERMS(cb) { 41 | fs.readFile(path.join(location, './TERMS.md'), 'utf8', function (err, data) { 42 | if (err) return handleIssue(1, cb); 43 | cb(null, 'Your TERMS.md file looks good.'); 44 | }); 45 | } 46 | 47 | function checkCONTRIBUTING(cb) { 48 | fs.readFile(path.join(location, './CONTRIBUTING.md'), 'utf8', function (err, data) { 49 | if (err) return handleIssue(2, cb); 50 | cb(null, 'Your CONTRIBUTING.md file seems to be in order.'); 51 | }); 52 | } 53 | 54 | function checkCHANGELOG(cb) { 55 | fs.readFile(path.join(location, './CHANGELOG.md'), 'utf8', function (err, data) { 56 | if (err) return handleIssue(3, cb); 57 | cb(null, 'Your CHANGELOG.md file is good to go.'); 58 | }); 59 | } 60 | 61 | function checkENV(cb) { 62 | fs.readFile(path.join(location, './.env'), 'utf8', function (err, data) { 63 | if (err) return handleIssue(4, cb); 64 | var envPath = path.join(location, './.env'); 65 | shell.exec('. ' + envPath); 66 | }); 67 | } 68 | 69 | function scrubGHEReferences(cb) { 70 | if (scrub) { 71 | // checkENV(cb); 72 | // // do the thing 73 | // shell.exec('./scrub.sh'); 74 | } 75 | } 76 | 77 | function handleIssue(type, cb, data) { 78 | switch (type) { 79 | case 1: 80 | if (fix) { 81 | request('https://raw.githubusercontent.com/cfpb/open-source-project-template/master/TERMS.md') 82 | .on('error', function(err) { 83 | cb(err, null) 84 | }) 85 | .pipe(fs.createWriteStream(path.join(location, './TERMS.md'))) 86 | return cb(null, 'No TERMS.md file found. I created one for you.'); 87 | } 88 | cb('No TERMS.md file found. Please create one based on the Open Source Project Template: https://github.com/cfpb/open-source-project-template/blob/master/TERMS.md', null); 89 | break; 90 | case 2: 91 | if (fix) { 92 | request('https://raw.githubusercontent.com/cfpb/open-source-project-template/master/CONTRIBUTING.md') 93 | .on('error', function(err) { 94 | cb(err, null) 95 | }) 96 | .pipe(fs.createWriteStream(path.join(location, './CONTRIBUTING.md'))) 97 | return cb(null, 'No CONTRIBUTING.md file found. I created one for you.'); 98 | } 99 | cb('No CONTRIBUTING.md file found. Please create one based on the Open Source Project Template: https://github.com/cfpb/open-source-project-template/blob/master/CONTRIBUTING.md', null); 100 | break; 101 | case 3: 102 | if (fix) { 103 | request('https://raw.githubusercontent.com/cfpb/open-source-project-template/master/CHANGELOG.md') 104 | .on('error', function(err) { 105 | cb(err, null) 106 | }) 107 | .pipe(fs.createWriteStream(path.join(location, './CHANGELOG.md'))) 108 | return cb(null, 'No CHANGELOG.md file found. I created one for you.'); 109 | } 110 | cb('No CHANGELOG.md file found. Please create one based on the Open Source Project Template: https://github.com/cfpb/open-source-project-template/blob/master/CHANGELOG.md', null); 111 | break; 112 | case 4: 113 | if (fix) { 114 | request('https://raw.githubusercontent.com/cfpb/open-source-checklist/master/.env_SAMPLE') 115 | .on('error', function(err) { 116 | cb(err, null) 117 | }) 118 | .pipe( 119 | fs.createWriteStream(path.join(location, './.env') 120 | )) 121 | fs.appendFileSync(path.join(location, './.gitignore'), '.env', 'utf8'); 122 | return cb(null, 'No .env file found. I created one for you and added it to your project\'s .gitignore. Now you should edit it to update the GHE_URL variable.'); 123 | } 124 | cb('No .env file found. Please create one based on this sample, add it to your project\'s .gitignore, and update the GHE_URL variable: https://github.com/cfpb/open-source-checklist/blob/master/.env_SAMPLE', null); 125 | break; 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | --------------------------------------------------------------------------------