What is GitHub?
GitHub is a git repository hosting service and web-based, collaborative version-control platform for developers. While GitHub offers a suite of features, in this course we will primarily use GitHub for cloud-based hosting of our coding projects. For this exercise, we will learn how to:
- Create a Github account
- Create a blank repository
- Integrate with RStudio
- Create and commit changes through the RStudio Git tab
- View Changes on GitHub
- Create a project webpage in GitHub
GitHub is generally used for version control, working on collaborative projects, creating websites, developing and sharing teaching tools, software development, and code development, but is generally not good for storing or manipulating large datasets.
Create GitHub Account
To begin, you will need to create an account on GitHub.com. This will allow you to create, fork, share, collaborate, etc. on projects.
Create Repository
Once you have created an account you can navigate to repositories and click on the green button for a new repository.
Create a name for the repository, for this example we will use GitHub-Basics, provide a description, be sure to make the repository public, uncheck the “Initialize this repository with a README” (for this example; it might be necessary to leave this checked in the future), add a .gitignore file using the R filter in the drop-down menu, and click create repository.
Copy Repository Link
Once you create your new repository you should be taken to the home page for the repo.
This link will be used in RStudio to connect your project to the GitHub repository. At this point you can move to RStudio but keep the GitHub window open so you can refer back to see changes you have made during this example.
Integration with RStudio
Rstudio has integrated version control and allows you to clone a project from any Git repository. For this example we will use the link obtained in the above step to integrate local changes with the GitHub repository we created.
While the following steps will use the GUI interface in RStudio, the majority of these steps can also be completed at the command line.
New Project
To begin we will create a new project using the File > New Project command. In previous examples the New Directory option was used, but in this exercise we will instead use the Version Control option.
Version Control
This option will provide us the ability to choose between Git and Apache Subversion. We will follow the option for using Git as we learned in the previous exercise.
Git for Versioning in RStudio
The version control option will allow you to obtain a project from a version control repository such as GitHub.
If you want to bring an already developed repository into RStudio in a blank project, from the terminal you can use the git command git clone <GitHub Link>
in the folder you wish to store the repository and then save as a new project.
Create Project
Before you finalize your project, you will be prompted to including the following information:
- Repository URL
- Here you will paste the link you copied from GitHub:
http://github.com/username/repository
- Project Directory Name
- This is the folder that will be created to organize the project.
- Tip: Making this the same as the repository name will help keep you organized between the local and online environment
- Subdirectory
- This is the local root directory where the project folder will reside. For example, if you want the project folder to be housed within the Ex-8 folder on the Z drive you would browse to: z:/students/name/Ex-8 and then click create project.
View Project in RStudio
This will open the typical RStudio Project window you are used to seeing including the project information in the upper-right corner, project files in the files tile, etc. but you will also now see a new Git tab alongside the “Environment-History-Connections” section. It is in this tab that we will control the integration for our local project and online repository.
Commit and Push to GitHub
In the commit window you can stage files, view differences in the changed files, add a commit message, and push your changes to the remote repository.
It is important to always include a commit message each time you commit files to your repository. As we have seen in the previous exercise, this helps to keep track of each stage of development and informs collaborators of changes made in each update. Because RStudio provides a text box for commits, there is ample room for an appropriate commit message. Check out these suggestions about composing better commit messages: https://chris.beams.io/posts/git-commit/
After staging your files and writing a useful commit message your next step will be to commit that information. Remember even though you have your local and GitHub repositories linked, you are only making this commit to the local repository. In order to sync the two repositories you must Push the changes to GitHub.
View Changes on GitHub
Once you have completed these steps you can navigate back to your GitHub repository and view the information you have just pushed to the repository.
Create a GitHub.io webpage
One excellent feature of GitHub is the ability to create webpages out of content within your repository. This is an extremely easy process and at this point each of the exercises you have completed in the course can be turned into a webpage with very little effort. In the setting menu of your repository, scroll down to the section for GitHub Pages and in the “Source” portion, select master branch as the source.
This will enable a webpage for your repository that utilizes a consistent url theme:
http://username.github.io/repository name
In order to create a webpage using GitHub Pages, simply create a copy of your *.nb.html and call it index.html. Once the index.html file is created, push it to your master repository and the website will automatically be created.
It may take several minutes before the site appears on your github.io page for the first time.
Your Turn!
While there are a number of features an options available in GitHub, here we covered only the basics of creating and maintaining a repository and enabling GitHub Pages. At the end of the semester your final project will be to develop materials based on your thesis research. So for this exercise I want you to create a repository and GitHub webpage for your thesis work. You should create a README.md file for your project that includes:
- Project Title
- Project Abstract
- Link to the Github.io page
- Repository Description
- References
This repository and webpage should be periodically updated throughout the remainder of the semester culminating in your final project. You should take a look at the various options and features (such as themes, notifications, social previews, wikis, projects, etc.) available in to create a useful repository for sharing and maintaining your project.
Additional Help
Colt Steele again came through with a new video after presenting this exercise in class. This GitHub tutorial, called Learn Github in 20 Minutes, walks you through many of the steps we discussed in class and covers topics that are slightly more advanced that you might need in the future.
LS0tDQp0aXRsZTogR2l0SHViIEJhc2ljcyA8YnI+PHNtYWxsPkFkdmFuY2VkIERhdGEgQW5hbHl0aWNzPC9zbWFsbD48L2JyPg0KYXV0aG9yOiBCSU9MIDU3MDAsIEZhbGwgMjAxOQ0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHJvd3MucHJpbnQ6IDEwDQogICAgdGhlbWU6IGNvc21vDQogICAgaGlnaGxpZ2h0OiBicmVlemVkYXJrDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiA0MHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCjwvc3R5bGU+DQoNCiMgV2hhdCBpcyBHaXRIdWI/DQoqKkdpdEh1YioqIGlzIGEgZ2l0IHJlcG9zaXRvcnkgaG9zdGluZyBzZXJ2aWNlIGFuZCB3ZWItYmFzZWQsIGNvbGxhYm9yYXRpdmUgdmVyc2lvbi1jb250cm9sIHBsYXRmb3JtIGZvciBkZXZlbG9wZXJzLiBXaGlsZSAqKkdpdEh1YioqIG9mZmVycyBhIHN1aXRlIG9mIGZlYXR1cmVzLCBpbiB0aGlzIGNvdXJzZSB3ZSB3aWxsIHByaW1hcmlseSB1c2UgKipHaXRIdWIqKiBmb3IgY2xvdWQtYmFzZWQgaG9zdGluZyBvZiBvdXIgY29kaW5nIHByb2plY3RzLiBGb3IgdGhpcyBleGVyY2lzZSwgd2Ugd2lsbCBsZWFybiBob3cgdG86DQoNCi0gQ3JlYXRlIGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2pvaW4iIHRhcmdldD0iX2JsYW5rIj4gR2l0aHViPC9hPiBhY2NvdW50DQotIENyZWF0ZSBhIGJsYW5rIHJlcG9zaXRvcnkNCi0gSW50ZWdyYXRlIHdpdGggUlN0dWRpbw0KLSBDcmVhdGUgYW5kIGNvbW1pdCBjaGFuZ2VzIHRocm91Z2ggdGhlIFJTdHVkaW8gR2l0IHRhYg0KLSBWaWV3IENoYW5nZXMgb24gR2l0SHViDQotIENyZWF0ZSBhIHByb2plY3Qgd2VicGFnZSBpbiBHaXRIdWINCg0KPHA+R2l0SHViIGlzIGdlbmVyYWxseSB1c2VkIGZvciB2ZXJzaW9uIGNvbnRyb2wsIHdvcmtpbmcgb24gY29sbGFib3JhdGl2ZSBwcm9qZWN0cywgY3JlYXRpbmcgd2Vic2l0ZXMsIGRldmVsb3BpbmcgYW5kIHNoYXJpbmcgdGVhY2hpbmcgdG9vbHMsIHNvZnR3YXJlIGRldmVsb3BtZW50LCBhbmQgY29kZSBkZXZlbG9wbWVudCwgYnV0IGlzIGdlbmVyYWxseSBub3QgZ29vZCBmb3Igc3RvcmluZyBvciBtYW5pcHVsYXRpbmcgbGFyZ2UgZGF0YXNldHMuPC9wPg0KDQojIyBDcmVhdGUgR2l0SHViIEFjY291bnQNClRvIGJlZ2luLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhbiBhY2NvdW50IG9uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qb2luIiB0YXJnZXQ9Il9ibGFuayI+IEdpdEh1Yi5jb208L2E+LiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIGNyZWF0ZSwgZm9yaywgc2hhcmUsIGNvbGxhYm9yYXRlLCBldGMuIG9uIHByb2plY3RzLg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtnaXRodWIgc2lnbnVwXSguL0ltYWdlcy9HaXRIdWItU2lnblVwLlBORyAiR2l0SHViIFNpZ24tVXAgV2luZG93IikNCjwvcD4NCg0KIyMgQ3JlYXRlIFJlcG9zaXRvcnkNCk9uY2UgeW91IGhhdmUgY3JlYXRlZCBhbiBhY2NvdW50IHlvdSBjYW4gbmF2aWdhdGUgdG8gcmVwb3NpdG9yaWVzIGFuZCBjbGljayBvbiB0aGUgZ3JlZW4gYnV0dG9uIGZvciBhIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9uZXciIHRhcmdldD0iX2JsYW5rIj4gbmV3IHJlcG9zaXRvcnk8L2E+Lg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtyZXBvc2l0b3J5IGJhcl0oLi9JbWFnZXMvcmVwby1iYXIuUE5HICJHaXRIdWIgUmVwb3NpdG9yeSBCYXIiKQ0KPC9wPg0KDQpDcmVhdGUgYSBuYW1lIGZvciB0aGUgcmVwb3NpdG9yeSwgZm9yIHRoaXMgZXhhbXBsZSB3ZSB3aWxsIHVzZSAqR2l0SHViLUJhc2ljcyosIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiwgYmUgc3VyZSB0byBtYWtlIHRoZSByZXBvc2l0b3J5IHB1YmxpYywgdW5jaGVjayB0aGUgIkluaXRpYWxpemUgdGhpcyByZXBvc2l0b3J5IHdpdGggYSBSRUFETUUiIChmb3IgdGhpcyBleGFtcGxlOyBpdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gbGVhdmUgdGhpcyBjaGVja2VkIGluIHRoZSBmdXR1cmUpLCBhZGQgYSAqLmdpdGlnbm9yZSogZmlsZSB1c2luZyB0aGUgKipSKiogZmlsdGVyIGluIHRoZSBkcm9wLWRvd24gbWVudSwgYW5kIGNsaWNrICpjcmVhdGUgcmVwb3NpdG9yeSouDQoNCiMjIyBDb3B5IFJlcG9zaXRvcnkgTGluaw0KT25jZSB5b3UgY3JlYXRlIHlvdXIgbmV3IHJlcG9zaXRvcnkgeW91IHNob3VsZCBiZSB0YWtlbiB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGUgcmVwby4gDQoNCjxwIGFsaWduPSJjZW50ZXIiPg0KDQohW0NvcHkgTGluayBhbmQgQ2xvbmUgT3B0aW9uXSguL0ltYWdlcy9jb3B5LWxpbmsuUE5HICJDbG9uZSBhbmQgRG93bmxvYWQgTGluayIpDQo8L3A+DQoNClRoaXMgbGluayB3aWxsIGJlIHVzZWQgaW4gKipSU3R1ZGlvKiogdG8gY29ubmVjdCB5b3VyIHByb2plY3QgdG8gdGhlICpHaXRIdWIqIHJlcG9zaXRvcnkuIEF0IHRoaXMgcG9pbnQgeW91IGNhbiBtb3ZlIHRvICoqUlN0dWRpbyoqIGJ1dCBrZWVwIHRoZSAqKkdpdEh1YioqIHdpbmRvdyBvcGVuIHNvIHlvdSBjYW4gcmVmZXIgYmFjayB0byBzZWUgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlIGR1cmluZyB0aGlzIGV4YW1wbGUuIA0KDQojIEludGVncmF0aW9uIHdpdGggUlN0dWRpbw0KDQoqKlJzdHVkaW8qKiBoYXMgaW50ZWdyYXRlZCB2ZXJzaW9uIGNvbnRyb2wgYW5kIGFsbG93cyB5b3UgdG8gY2xvbmUgYSBwcm9qZWN0IGZyb20gYW55ICpHaXQqIHJlcG9zaXRvcnkuIEZvciB0aGlzIGV4YW1wbGUgd2Ugd2lsbCB1c2UgdGhlIGxpbmsgb2J0YWluZWQgaW4gdGhlIGFib3ZlIHN0ZXAgdG8gaW50ZWdyYXRlIGxvY2FsIGNoYW5nZXMgd2l0aCB0aGUgKipHaXRIdWIqKiByZXBvc2l0b3J5IHdlIGNyZWF0ZWQuIA0KDQo+IFdoaWxlIHRoZSBmb2xsb3dpbmcgc3RlcHMgd2lsbCB1c2UgdGhlIEdVSSBpbnRlcmZhY2UgaW4gKipSU3R1ZGlvKiosIHRoZSBtYWpvcml0eSBvZiB0aGVzZSBzdGVwcyBjYW4gYWxzbyBiZSBjb21wbGV0ZWQgYXQgdGhlIGNvbW1hbmQgbGluZS4NCg0KIyMgTmV3IFByb2plY3QNClRvIGJlZ2luIHdlIHdpbGwgY3JlYXRlIGEgbmV3IHByb2plY3QgdXNpbmcgdGhlICpGaWxlID4gTmV3IFByb2plY3QqIGNvbW1hbmQuIEluIHByZXZpb3VzIGV4YW1wbGVzIHRoZSAqTmV3IERpcmVjdG9yeSogb3B0aW9uIHdhcyB1c2VkLCBidXQgaW4gdGhpcyBleGVyY2lzZSB3ZSB3aWxsIGluc3RlYWQgdXNlIHRoZSAqVmVyc2lvbiBDb250cm9sKiBvcHRpb24uIA0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtSU3R1ZGlvIFZlcnNpb24gQ29udHJvbF0oLi9JbWFnZXMvUlMtTmV3LVByb2plY3QucG5nICJOZXcgUHJvamVjdCBXaW5kb3ciKXt3aWR0aD00NSV9DQo8L3A+DQoNCiMjIyBWZXJzaW9uIENvbnRyb2wNClRoaXMgb3B0aW9uIHdpbGwgcHJvdmlkZSB1cyB0aGUgYWJpbGl0eSB0byBjaG9vc2UgYmV0d2VlbiAqKkdpdCoqIGFuZCAqQXBhY2hlIFN1YnZlcnNpb24qLiBXZSB3aWxsIGZvbGxvdyB0aGUgb3B0aW9uIGZvciB1c2luZyAqKkdpdCoqIGFzIHdlIGxlYXJuZWQgaW4gdGhlIHByZXZpb3VzIGV4ZXJjaXNlLg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtWZXJzaW9uIENvbnRyb2xdKC4vSW1hZ2VzL1JTLVZlcnNpb24tQ29udHJvbC5wbmcgIlZlcnNpb24gQ29udHJvbCBXaW5kb3ciKXt3aWR0aD00NSV9DQo8L3A+DQoNCiMjIyBHaXQgZm9yIFZlcnNpb25pbmcgaW4gUlN0dWRpbw0KVGhlICp2ZXJzaW9uIGNvbnRyb2wqIG9wdGlvbiB3aWxsIGFsbG93IHlvdSB0byBvYnRhaW4gYSBwcm9qZWN0IGZyb20gYSB2ZXJzaW9uIGNvbnRyb2wgcmVwb3NpdG9yeSBzdWNoIGFzICoqR2l0SHViKiouDQoNCj4gSWYgeW91IHdhbnQgdG8gYnJpbmcgYW4gYWxyZWFkeSBkZXZlbG9wZWQgcmVwb3NpdG9yeSBpbnRvICoqUlN0dWRpbyoqIGluIGEgYmxhbmsgcHJvamVjdCwgZnJvbSB0aGUgdGVybWluYWwgeW91IGNhbiB1c2UgdGhlIGdpdCBjb21tYW5kIGBgYGdpdCBjbG9uZSA8R2l0SHViIExpbms+YGBgIGluIHRoZSBmb2xkZXIgeW91IHdpc2ggdG8gc3RvcmUgdGhlIHJlcG9zaXRvcnkgYW5kIHRoZW4gc2F2ZSBhcyBhIG5ldyBwcm9qZWN0Lg0KDQojIyMgQ3JlYXRlIFByb2plY3QNCkJlZm9yZSB5b3UgZmluYWxpemUgeW91ciBwcm9qZWN0LCB5b3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoNCg0KPHAgYWxpZ249ImNlbnRlciI+DQoNCiFbQ2xvbmUgUmVwb3NpdG9yeV0oLi9JbWFnZXMvUlMtQ2xvbmUtUmVwby5wbmcgIkNsb25lIFJlcG9zaXRvcnkgV2luZG93Iil7d2lkdGg9NDUlfQ0KPC9wPg0KDQotIFJlcG9zaXRvcnkgVVJMDQogIC0gSGVyZSB5b3Ugd2lsbCBwYXN0ZSB0aGUgbGluayB5b3UgY29waWVkIGZyb20gKipHaXRIdWIqKjogYGBgaHR0cDovL2dpdGh1Yi5jb20vdXNlcm5hbWUvcmVwb3NpdG9yeWBgYA0KLSBQcm9qZWN0IERpcmVjdG9yeSBOYW1lDQogIC0gVGhpcyBpcyB0aGUgZm9sZGVyIHRoYXQgd2lsbCBiZSBjcmVhdGVkIHRvIG9yZ2FuaXplIHRoZSBwcm9qZWN0Lg0KICAgIC0gVGlwOiBNYWtpbmcgdGhpcyB0aGUgc2FtZSBhcyB0aGUgcmVwb3NpdG9yeSBuYW1lIHdpbGwgaGVscCBrZWVwIHlvdSBvcmdhbml6ZWQgYmV0d2VlbiB0aGUgbG9jYWwgYW5kIG9ubGluZSBlbnZpcm9ubWVudA0KLSBTdWJkaXJlY3RvcnkNCiAgLSBUaGlzIGlzIHRoZSBsb2NhbCByb290IGRpcmVjdG9yeSB3aGVyZSB0aGUgcHJvamVjdCBmb2xkZXIgd2lsbCByZXNpZGUuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0aGUgcHJvamVjdCBmb2xkZXIgdG8gYmUgaG91c2VkIHdpdGhpbiB0aGUgKkV4LTgqIGZvbGRlciBvbiB0aGUgWiBkcml2ZSB5b3Ugd291bGQgYnJvd3NlIHRvOiB6Oi9zdHVkZW50cy9uYW1lL0V4LTggYW5kIHRoZW4gY2xpY2sgKmNyZWF0ZSBwcm9qZWN0Ki4NCg0KIyMgVmlldyBQcm9qZWN0IGluIFJTdHVkaW8NClRoaXMgd2lsbCBvcGVuIHRoZSB0eXBpY2FsIFJTdHVkaW8gUHJvamVjdCB3aW5kb3cgeW91IGFyZSB1c2VkIHRvIHNlZWluZyBpbmNsdWRpbmcgdGhlIHByb2plY3QgaW5mb3JtYXRpb24gaW4gdGhlIHVwcGVyLXJpZ2h0IGNvcm5lciwgcHJvamVjdCBmaWxlcyBpbiB0aGUgZmlsZXMgdGlsZSwgZXRjLiBidXQgeW91IHdpbGwgYWxzbyBub3cgc2VlIGEgbmV3ICoqR2l0KiogdGFiIGFsb25nc2lkZSB0aGUgIkVudmlyb25tZW50LUhpc3RvcnktQ29ubmVjdGlvbnMiIHNlY3Rpb24uIEl0IGlzIGluIHRoaXMgdGFiIHRoYXQgd2Ugd2lsbCBjb250cm9sIHRoZSBpbnRlZ3JhdGlvbiBmb3Igb3VyIGxvY2FsIHByb2plY3QgYW5kIG9ubGluZSByZXBvc2l0b3J5Lg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtQcm9qZWN0IFdpbmRvd10oLi9JbWFnZXMvUlMtUHJvamVjdC1XaW5kb3cucG5nICJQcm9qZWN0IFdpbmRvdyIpDQo8L3A+DQoNCiMjIyBHaXQgVGFiDQpJbiB0aGUgKkdpdCogdGFiIHlvdSB3aWxsIG5vdGljZSBzZXZlcmFsIG9wdGlvbnMgaW5jbHVkaW5nOg0KDQotIERpZmYgPGltZyBzcmM9Ii4vSW1hZ2VzL2RpZmZfYnV0dG9uLnBuZyIgdGl0bGU9IkRpZmYgU2VsZWN0ZWQgRmlsZShzKSIvPiB3aGljaCBkZXRhaWxzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdmVyc2lvbnMgb2YgYSBmaWxlLiANCi0gQ29tbWl0IDxpbWcgc3JjPSIuL0ltYWdlcy9jb21taXRfYnV0dG9uLnBuZyIgdGl0bGU9IkNvbW1pdCBwZW5kaW5nIGNoYW5nZXMiLz4gd2hpY2ggYWxsb3dzIHVzIHRvIGluaXRpYWwgYSBjb21taXQgc2ltaWxhciB0byB0aGUgYGBgZ2l0IGNvbW1pdGBgYCBjb21tYW5kIGluIHRoZSBwcmV2aW91cyBleGVyY2lzZS4NCi0gQmx1ZSBkb3duIGFycm93IDxpbWcgc3JjPSIuL0ltYWdlcy9wdWxsX2J1dHRvbi5wbmciLz4gZm9yIGEgcHVsbCBjb21tYW5kDQotIEdyZWVuIHVwIGFycm93IDxpbWcgc3JjPSIuL0ltYWdlcy9wdXNoX2J1dHRvbi5wbmciLz4gZm9yIGEgcHVzaCBjb21tYW5kDQotIENsb2NrIDxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5naXRodWJhc3NldHMuY29tL2ltYWdlcy9pY29ucy9lbW9qaS91bmljb2RlLzFmNTUyLnBuZyIgdGl0bGU9IlZpZXcgaGlzdG9yeSBvZiBwcmV2aW91cyBjb21taXRzIiB3aWR0aD0xNSBoZWlnaHQ9MTUvPiB0byB2aWV3IGEgaGlzdG9yeSBvZiB0aGUgY29tbWl0cw0KLSBHZWFyIDxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5naXRodWJhc3NldHMuY29tL2ltYWdlcy9pY29ucy9lbW9qaS91bmljb2RlLzI2OTkucG5nIiB3aWR0aD0xNSBoZWlnaHQ9MTUvPiB0aGF0IGFsbG93cyB5b3UgdG8gcmV2ZXJ0IHRvIHByZXZpb3VzIHN0YWdlcw0KLSBOZXcgYnJhbmNoIGljb24gPGltZyBzcmM9Ii4vSW1hZ2VzL25ld19icmFuY2gucG5nIi8+DQotIEJyYW5jaCBpbmZvcm1hdGlvbiA8aW1nIHNyYz0iLi9JbWFnZXMvYnJhbmNoX3NlbGVjdC5wbmciIHRpdGxlPSJzd2l0Y2ggYnJhbmNoIi8+IHNob3dpbmcgd2hpY2ggYnJhbmNoIGlzIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQNCi0gUmVmcmVzaCBpY29uIDxpbWcgc3JjPSIuL0ltYWdlcy9yZWZyZXNoX2J1dHRvbi5wbmciLz4NCg0KIyMjIyBTdGFnZWQgRmlsZXMNClRoZXJlIGFyZSB0d28gd2F5cyB0byBzdGFnZSBmaWxlcyBpbiAqKlJTdHVkaW8qKi4gVGhlIGZpcnN0IGlzIGRpcmVjdGx5IGZyb20gdGhlICpHaXQqIHRhYi4gQnkgY2xpY2sgb24gdGhlIGJ1dHRvbiBpbiB0aGUgIlN0YWdlZCIgY29sdW1uLCB5b3Ugd2lsbCBzZWUgdGhlIGljb24gaW4gdGhlICJTdGF0dXMiIGNvbHVtbiBjaGFuZ2UuIFRoZSBzZWNvbmQgaXMgYnkgY2xpY2tpbmcgdGhlICJjb21taXQgYnV0dG9uIiBhbmQgc3RhZ2luZyB0aGUgZmlsZXMgZnJvbSB0aGVyZS4gQmVjYXVzZSBvZiB0aGUgc2ltcGxlIGludGVyZmFjZSwgZmlsZXMgY2FuIGVhc2lseSBiZSBzdGFnZWQvdW5zdGFnZWQgZnJvbSBlaXRoZXIgbG9jYXRpb24uDQoNCj4gWW91IGNvdWxkIGFsc28gY29tcGxldGUgbWFueSBvZiB0aGVzZSBzdGVwcyB2aWEgY29tbWFuZCBsaW5lIGZyb20gdGhlIHRlcm1pbmFsIHdpbmRvdy4NCg0KIyMjIyBDb2xvci1jb2RlZCBJY29ucw0KSW4gKipSU3R1ZGlvKiogYXMgeW91IHN0YWdlIGZpbGVzIHRoZWlyIGljb24gd2lsbCBjaGFuZ2UgdG8gbWF0Y2ggdGhlaXIgY3VycmVudCBzdGF0dXMuIFlvdSBhcmUgbW9zdCBsaWtlbHkgdG8gc2VlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246DQoNCi0gWWVsbG93IGJveCA8aW1nIHNyYz0iLi9JbWFnZXMvbmV3LnBuZyIgd2lkdGg9MTUgaGVpZ2h0PTE1Lz4gZm9yIG5ld2x5IGNyZWF0ZWQvdW50cmFja2VkIGZpbGVzDQotIEJsdWUgYm94ICA8aW1nIHNyYz0iLi9JbWFnZXMvbW9kaWZpZWQucG5nIiB3aWR0aD0xNSBoZWlnaHQ9MTUvPiBmb3IgZmlsZXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQNCi0gR3JlZW4gYm94IDxpbWcgc3JjPSIuL0ltYWdlcy9hZGRlZC5wbmciIHdpZHRoPTE1IGhlaWdodD0xNS8+IGZvciBmaWxlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZC9zdGFnZWQgYW5kIGFyZSByZWFkeSBmb3IgYSBjb21taXQNCi0gUmVkIGJveCA8aW1nIHNyYz0iLi9JbWFnZXMvZGVsZXRlZC5wbmciIHdpZHRoPTE1IGhlaWdodD0xNS8+IGZvciBmaWxlcyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkDQoNCk9uY2UgeW91IGhhdmUgdGhlIGZpbGVzIGFwcHJvcHJpYXRlbHkgc3RhZ2VkLCB5b3UgYXJlIHJlYWR5IHRvIGNvbW1pdCB0aGVtIHRvIHlvdXIgcmVwb3NpdG9yeS4NCg0KIyMjIENvbW1pdCBhbmQgUHVzaCB0byBHaXRIdWINCkluIHRoZSBjb21taXQgd2luZG93IHlvdSBjYW4gc3RhZ2UgZmlsZXMsIHZpZXcgZGlmZmVyZW5jZXMgaW4gdGhlIGNoYW5nZWQgZmlsZXMsIGFkZCBhIGNvbW1pdCBtZXNzYWdlLCBhbmQgcHVzaCB5b3VyIGNoYW5nZXMgdG8gdGhlIHJlbW90ZSByZXBvc2l0b3J5Lg0KDQpJdCBpcyBpbXBvcnRhbnQgdG8gYWx3YXlzIGluY2x1ZGUgYSBjb21taXQgbWVzc2FnZSBlYWNoIHRpbWUgeW91IGNvbW1pdCBmaWxlcyB0byB5b3VyIHJlcG9zaXRvcnkuIEFzIHdlIGhhdmUgc2VlbiBpbiB0aGUgcHJldmlvdXMgZXhlcmNpc2UsIHRoaXMgaGVscHMgdG8ga2VlcCB0cmFjayBvZiBlYWNoIHN0YWdlIG9mIGRldmVsb3BtZW50IGFuZCBpbmZvcm1zIGNvbGxhYm9yYXRvcnMgb2YgY2hhbmdlcyBtYWRlIGluIGVhY2ggdXBkYXRlLiBCZWNhdXNlICoqUlN0dWRpbyoqIHByb3ZpZGVzIGEgdGV4dCBib3ggZm9yIGNvbW1pdHMsIHRoZXJlIGlzIGFtcGxlIHJvb20gZm9yIGFuIGFwcHJvcHJpYXRlIGNvbW1pdCBtZXNzYWdlLiBDaGVjayBvdXQgdGhlc2Ugc3VnZ2VzdGlvbnMgYWJvdXQgY29tcG9zaW5nIGJldHRlciBjb21taXQgbWVzc2FnZXM6IGh0dHBzOi8vY2hyaXMuYmVhbXMuaW8vcG9zdHMvZ2l0LWNvbW1pdC8NCg0KQWZ0ZXIgc3RhZ2luZyB5b3VyIGZpbGVzIGFuZCB3cml0aW5nIGEgdXNlZnVsIGNvbW1pdCBtZXNzYWdlIHlvdXIgbmV4dCBzdGVwIHdpbGwgYmUgdG8gY29tbWl0IHRoYXQgaW5mb3JtYXRpb24uIFJlbWVtYmVyIGV2ZW4gdGhvdWdoIHlvdSBoYXZlIHlvdXIgbG9jYWwgYW5kICoqR2l0SHViKiogcmVwb3NpdG9yaWVzIGxpbmtlZCwgeW91IGFyZSBvbmx5IG1ha2luZyB0aGlzIGNvbW1pdCB0byB0aGUgbG9jYWwgcmVwb3NpdG9yeS4gSW4gb3JkZXIgdG8gc3luYyB0aGUgdHdvIHJlcG9zaXRvcmllcyB5b3UgbXVzdCA8aW1nIHNyYz0iLi9JbWFnZXMvcHVzaF9idXR0b24ucG5nIi8+IFB1c2ggdGhlIGNoYW5nZXMgdG8gKipHaXRIdWIqKi4NCg0KIyMgVmlldyBDaGFuZ2VzIG9uIEdpdEh1Yg0KT25jZSB5b3UgaGF2ZSBjb21wbGV0ZWQgdGhlc2Ugc3RlcHMgeW91IGNhbiBuYXZpZ2F0ZSBiYWNrIHRvIHlvdXIgKipHaXRIdWIqKiByZXBvc2l0b3J5IGFuZCB2aWV3IHRoZSBpbmZvcm1hdGlvbiB5b3UgaGF2ZSBqdXN0IHB1c2hlZCB0byB0aGUgcmVwb3NpdG9yeS4NCg0KPHAgYWxpZ249ImNlbnRlciI+DQoNCiFbVXBkYXRlZCBHaXRIdWIgUGFnZV0oLi9JbWFnZXMvR2l0SHViLXVwZGF0ZXMucG5nICJWaWV3aW5nIFVwZGF0ZXMgb24gR2l0SHViIikNCjwvcD4NCg0KIyMgQ3JlYXRlIGEgR2l0SHViLmlvIHdlYnBhZ2UNCk9uZSBleGNlbGxlbnQgZmVhdHVyZSBvZiAqKkdpdEh1YioqIGlzIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSB3ZWJwYWdlcyBvdXQgb2YgY29udGVudCB3aXRoaW4geW91ciByZXBvc2l0b3J5LiBUaGlzIGlzIGFuIGV4dHJlbWVseSBlYXN5IHByb2Nlc3MgYW5kIGF0IHRoaXMgcG9pbnQgZWFjaCBvZiB0aGUgZXhlcmNpc2VzIHlvdSBoYXZlIGNvbXBsZXRlZCBpbiB0aGUgY291cnNlIGNhbiBiZSB0dXJuZWQgaW50byBhIHdlYnBhZ2Ugd2l0aCB2ZXJ5IGxpdHRsZSBlZmZvcnQuIEluIHRoZSBzZXR0aW5nIG1lbnUgb2YgeW91ciByZXBvc2l0b3J5LCBzY3JvbGwgZG93biB0byB0aGUgc2VjdGlvbiBmb3IgKkdpdEh1YiBQYWdlcyogYW5kIGluIHRoZSAiU291cmNlIiBwb3J0aW9uLCBzZWxlY3QgbWFzdGVyIGJyYW5jaCBhcyB0aGUgc291cmNlLiANCg0KPHAgYWxpZ249ImNlbnRlciI+DQoNCiFbZ2l0aHViIHNldHRpbmdzXSguL0ltYWdlcy9naXRodWItc2V0dGluZ3MtaW8ucG5nICJHaXRIdWIgU2V0dGluZ3MgZm9yIFBhZ2VzIil7d2lkdGg9NjUlfQ0KPC9wPg0KDQpUaGlzIHdpbGwgZW5hYmxlIGEgd2VicGFnZSBmb3IgeW91ciByZXBvc2l0b3J5IHRoYXQgdXRpbGl6ZXMgYSBjb25zaXN0ZW50IHVybCB0aGVtZTogDQoNCmh0dHA6Ly8qKnVzZXJuYW1lKiouZ2l0aHViLmlvLyoqcmVwb3NpdG9yeSBuYW1lKiogDQoNCkluIG9yZGVyIHRvIGNyZWF0ZSBhIHdlYnBhZ2UgdXNpbmcgKkdpdEh1YiBQYWdlcyosIHNpbXBseSBjcmVhdGUgYSBjb3B5IG9mIHlvdXIgIFwqLm5iLmh0bWwgYW5kIGNhbGwgaXQgKippbmRleC5odG1sKiouIE9uY2UgdGhlIGluZGV4Lmh0bWwgZmlsZSBpcyBjcmVhdGVkLCBwdXNoIGl0IHRvIHlvdXIgbWFzdGVyIHJlcG9zaXRvcnkgYW5kIHRoZSB3ZWJzaXRlIHdpbGwgYXV0b21hdGljYWxseSBiZSBjcmVhdGVkLg0KDQo+IEl0IG1heSB0YWtlIHNldmVyYWwgbWludXRlcyBiZWZvcmUgdGhlIHNpdGUgYXBwZWFycyBvbiB5b3VyICpnaXRodWIuaW8qIHBhZ2UgZm9yIHRoZSBmaXJzdCB0aW1lLiANCg0KIyBZb3VyIFR1cm4hIA0KDQpXaGlsZSB0aGVyZSBhcmUgYSBudW1iZXIgb2YgZmVhdHVyZXMgYW4gb3B0aW9ucyBhdmFpbGFibGUgaW4gKipHaXRIdWIqKiwgaGVyZSB3ZSBjb3ZlcmVkIG9ubHkgdGhlIGJhc2ljcyBvZiBjcmVhdGluZyBhbmQgbWFpbnRhaW5pbmcgYSByZXBvc2l0b3J5IGFuZCBlbmFibGluZyAqR2l0SHViIFBhZ2VzKi4gQXQgdGhlIGVuZCBvZiB0aGUgc2VtZXN0ZXIgeW91ciBmaW5hbCBwcm9qZWN0IHdpbGwgYmUgdG8gZGV2ZWxvcCBtYXRlcmlhbHMgYmFzZWQgb24geW91ciB0aGVzaXMgcmVzZWFyY2guIFNvIGZvciB0aGlzIGV4ZXJjaXNlIEkgd2FudCB5b3UgdG8gY3JlYXRlIGEgcmVwb3NpdG9yeSBhbmQgR2l0SHViIHdlYnBhZ2UgZm9yIHlvdXIgdGhlc2lzIHdvcmsuIFlvdSBzaG91bGQgY3JlYXRlIGEgUkVBRE1FLm1kIGZpbGUgZm9yIHlvdXIgcHJvamVjdCB0aGF0IGluY2x1ZGVzOg0KDQotIFByb2plY3QgVGl0bGUNCi0gUHJvamVjdCBBYnN0cmFjdA0KLSBMaW5rIHRvIHRoZSBHaXRodWIuaW8gcGFnZQ0KLSBSZXBvc2l0b3J5IERlc2NyaXB0aW9uDQotIFJlZmVyZW5jZXMNCg0KVGhpcyByZXBvc2l0b3J5IGFuZCB3ZWJwYWdlIHNob3VsZCBiZSBwZXJpb2RpY2FsbHkgdXBkYXRlZCB0aHJvdWdob3V0IHRoZSByZW1haW5kZXIgb2YgdGhlIHNlbWVzdGVyIGN1bG1pbmF0aW5nIGluIHlvdXIgZmluYWwgcHJvamVjdC4gWW91IHNob3VsZCB0YWtlIGEgbG9vayBhdCB0aGUgdmFyaW91cyBvcHRpb25zIGFuZCBmZWF0dXJlcyAoc3VjaCBhcyB0aGVtZXMsIG5vdGlmaWNhdGlvbnMsIHNvY2lhbCBwcmV2aWV3cywgd2lraXMsIHByb2plY3RzLCBldGMuKSBhdmFpbGFibGUgaW4gPGltZyBzcmM9Imh0dHBzOi8vZ2l0aHViLmdpdGh1YmFzc2V0cy5jb20vaW1hZ2VzL2ljb25zL2Vtb2ppL29jdG9jYXQucG5nIiBhbHQ9IkdpdEh1YiBPY3RvY2F0IiB0aXRsZT0iR2l0SHViIE9jdG9jYXQiIHdpZHRoPTE1IGhlaWdoPTE1Lz4gdG8gY3JlYXRlIGEgdXNlZnVsIHJlcG9zaXRvcnkgZm9yIHNoYXJpbmcgYW5kIG1haW50YWluaW5nIHlvdXIgcHJvamVjdC4gDQoNCiMjIEFkZGl0aW9uYWwgSGVscA0KDQpbQ29sdCBTdGVlbGVdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNycUFHVVBQTU9kbzBqZlE2Z3Jpa1p3KSBhZ2FpbiBjYW1lIHRocm91Z2ggd2l0aCBhIG5ldyB2aWRlbyBhZnRlciBwcmVzZW50aW5nIHRoaXMgZXhlcmNpc2UgaW4gY2xhc3MuIFRoaXMgKipHaXRIdWIqKiB0dXRvcmlhbCwgY2FsbGVkIFtMZWFybiBHaXRodWIgaW4gMjAgTWludXRlc10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1uaE5xMmtJdmk5cyksIHdhbGtzIHlvdSB0aHJvdWdoIG1hbnkgb2YgdGhlIHN0ZXBzIHdlIGRpc2N1c3NlZCBpbiBjbGFzcyBhbmQgY292ZXJzIHRvcGljcyB0aGF0IGFyZSBzbGlnaHRseSBtb3JlIGFkdmFuY2VkIHRoYXQgeW91IG1pZ2h0IG5lZWQgaW4gdGhlIGZ1dHVyZS4=