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.
Image of the GitHub Sign-Up Window
Create
Repository
Once you have created an account you can navigate to repositories and
click on the green button for a
new
repository.
Image of the Repository Bar to create 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, turn off the “Add README” (for this example;
it might be necessary to turn this on in the future), add a
.gitignore file using the R filter in the
drop-down menu. For now you can ignore the add license option
and create the repository by clicking create repository.
Copy Repository
Link
Once you create your new repository you should be taken to the home
page for the repo.
Image of Code Button option to copy repository
link
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 in GitHub Desktop or in 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.
Image of the RStudio Version Control
options
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.
Image of the Version Control window
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:
Image of the Clone Repository window
- 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.
Image of RStudio Project Window
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:
Chris Beams’ Commit messages matter. Here’s how to write them
well!
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.
Image of Updated GitHub Page
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, change
from GitHub Actions to Deploy from a
Branch.
Image of the GitHub Pages Settings
This will slightly alter the look of the page and you should see
a new branch section where Master is selected
as the root directory.
Image of the GitHub Branch Settings
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 has a great series of tutorials on a number of coding
related topics including Git and GitHub. 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
than you might need in the near future.
LS0tDQp0aXRsZTogR2l0SHViIEJhc2ljcyA8YnI+PHNtYWxsPkFkdmFuY2VkIERhdGEgQW5hbHl0aWNzPC9zbWFsbD48L2JyPg0KYXV0aG9yOiBCSU9MIDU2NjAsIEZhbGwgMjAyNQ0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHJvd3MucHJpbnQ6IDEwDQogICAgdGhlbWU6IGNvc21vDQogICAgaGlnaGxpZ2h0OiBicmVlemVkYXJrDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiA0MHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCjwvc3R5bGU+DQoNCiMgV2hhdCBpcyBHaXRIdWI/DQoqKkdpdEh1YioqIGlzIGEgZ2l0IHJlcG9zaXRvcnkgaG9zdGluZyBzZXJ2aWNlIGFuZCB3ZWItYmFzZWQsIGNvbGxhYm9yYXRpdmUgdmVyc2lvbi1jb250cm9sIHBsYXRmb3JtIGZvciBkZXZlbG9wZXJzLiBXaGlsZSAqKkdpdEh1YioqIG9mZmVycyBhIHN1aXRlIG9mIGZlYXR1cmVzLCBpbiB0aGlzIGNvdXJzZSB3ZSB3aWxsIHByaW1hcmlseSB1c2UgKipHaXRIdWIqKiBmb3IgY2xvdWQtYmFzZWQgaG9zdGluZyBvZiBvdXIgY29kaW5nIHByb2plY3RzLiBGb3IgdGhpcyBleGVyY2lzZSwgd2Ugd2lsbCBsZWFybiBob3cgdG86DQoNCi0gQ3JlYXRlIGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2pvaW4iIHRhcmdldD0iX2JsYW5rIj4gR2l0aHViPC9hPiBhY2NvdW50DQotIENyZWF0ZSBhIGJsYW5rIHJlcG9zaXRvcnkNCi0gSW50ZWdyYXRlIHdpdGggUlN0dWRpbw0KLSBDcmVhdGUgYW5kIGNvbW1pdCBjaGFuZ2VzIHRocm91Z2ggdGhlIFJTdHVkaW8gR2l0IHRhYg0KLSBWaWV3IENoYW5nZXMgb24gR2l0SHViDQotIENyZWF0ZSBhIHByb2plY3Qgd2VicGFnZSBpbiBHaXRIdWINCg0KPHA+R2l0SHViIGlzIGdlbmVyYWxseSB1c2VkIGZvciB2ZXJzaW9uIGNvbnRyb2wsIHdvcmtpbmcgb24gY29sbGFib3JhdGl2ZSBwcm9qZWN0cywgY3JlYXRpbmcgd2Vic2l0ZXMsIGRldmVsb3BpbmcgYW5kIHNoYXJpbmcgdGVhY2hpbmcgdG9vbHMsIHNvZnR3YXJlIGRldmVsb3BtZW50LCBhbmQgY29kZSBkZXZlbG9wbWVudCwgYnV0IGlzIGdlbmVyYWxseSBub3QgZ29vZCBmb3Igc3RvcmluZyBvciBtYW5pcHVsYXRpbmcgbGFyZ2UgZGF0YXNldHMuPC9wPg0KDQojIyBDcmVhdGUgR2l0SHViIEFjY291bnQNClRvIGJlZ2luLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhbiBhY2NvdW50IG9uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qb2luIiB0YXJnZXQ9Il9ibGFuayI+IEdpdEh1Yi5jb208L2E+LiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIGNyZWF0ZSwgZm9yaywgc2hhcmUsIGNvbGxhYm9yYXRlLCBldGMuIG9uIHByb2plY3RzLg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtJbWFnZSBvZiB0aGUgR2l0SHViIFNpZ24tVXAgV2luZG93XSguL0ltYWdlcy9HaXRIdWItU2lnblVwLlBORyAiR2l0SHViIFNpZ24tVXAgV2luZG93IikNCjwvcD4NCg0KIyMgQ3JlYXRlIFJlcG9zaXRvcnkNCk9uY2UgeW91IGhhdmUgY3JlYXRlZCBhbiBhY2NvdW50IHlvdSBjYW4gbmF2aWdhdGUgdG8gcmVwb3NpdG9yaWVzIGFuZCBjbGljayBvbiB0aGUgZ3JlZW4gYnV0dG9uIGZvciBhIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9uZXciIHRhcmdldD0iX2JsYW5rIj4gbmV3IHJlcG9zaXRvcnk8L2E+Lg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtJbWFnZSBvZiB0aGUgUmVwb3NpdG9yeSBCYXIgdG8gY3JlYXRlIG5ldyByZXBvc2l0b3J5XSguL0ltYWdlcy9yZXBvLWJhci5QTkcgIkdpdEh1YiBSZXBvc2l0b3J5IEJhciIpDQo8L3A+DQoNCkNyZWF0ZSBhIG5hbWUgZm9yIHRoZSByZXBvc2l0b3J5LCBmb3IgdGhpcyBleGFtcGxlIHdlIHdpbGwgdXNlIF9HaXRIdWItQmFzaWNzXywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uLCBiZSBzdXJlIHRvIG1ha2UgdGhlIHJlcG9zaXRvcnkgcHVibGljLCB0dXJuIG9mZiB0aGUgIkFkZCBfUkVBRE1FXyIgKGZvciB0aGlzIGV4YW1wbGU7IGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byB0dXJuIHRoaXMgb24gaW4gdGhlIGZ1dHVyZSksIGFkZCBhIF8uZ2l0aWdub3JlXyBmaWxlIHVzaW5nIHRoZSAqKlIqKiBmaWx0ZXIgaW4gdGhlIGRyb3AtZG93biBtZW51LiBGb3Igbm93IHlvdSBjYW4gaWdub3JlIHRoZSBfYWRkIGxpY2Vuc2VfIG9wdGlvbiBhbmQgY3JlYXRlIHRoZSByZXBvc2l0b3J5IGJ5IGNsaWNraW5nIF9jcmVhdGUgcmVwb3NpdG9yeV8uDQoNCiMjIyBDb3B5IFJlcG9zaXRvcnkgTGluaw0KT25jZSB5b3UgY3JlYXRlIHlvdXIgbmV3IHJlcG9zaXRvcnkgeW91IHNob3VsZCBiZSB0YWtlbiB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGUgcmVwby4gDQoNCjxwIGFsaWduPSJjZW50ZXIiPg0KDQohW0ltYWdlIG9mIENvZGUgQnV0dG9uIG9wdGlvbiB0byBjb3B5IHJlcG9zaXRvcnkgbGlua10oLi9JbWFnZXMvY29weS1saW5rLlBORyAiQ2xvbmUgYW5kIERvd25sb2FkIExpbmsiKQ0KPC9wPg0KDQpUaGlzIGxpbmsgd2lsbCBiZSB1c2VkIGluICoqUlN0dWRpbyoqIHRvIGNvbm5lY3QgeW91ciBwcm9qZWN0IHRvIHRoZSBfR2l0SHViXyByZXBvc2l0b3J5LiBBdCB0aGlzIHBvaW50IHlvdSBjYW4gbW92ZSB0byAqKlJTdHVkaW8qKiBidXQga2VlcCB0aGUgKipHaXRIdWIqKiB3aW5kb3cgb3BlbiBzbyB5b3UgY2FuIHJlZmVyIGJhY2sgdG8gc2VlIGNoYW5nZXMgeW91IGhhdmUgbWFkZSBkdXJpbmcgdGhpcyBleGFtcGxlLiANCg0KIyBJbnRlZ3JhdGlvbiB3aXRoIFJTdHVkaW8NCg0KKipSU3R1ZGlvKiogaGFzIGludGVncmF0ZWQgdmVyc2lvbiBjb250cm9sIGFuZCBhbGxvd3MgeW91IHRvIGNsb25lIGEgcHJvamVjdCBmcm9tIGFueSBfR2l0XyByZXBvc2l0b3J5LiBGb3IgdGhpcyBleGFtcGxlIHdlIHdpbGwgdXNlIHRoZSBsaW5rIG9idGFpbmVkIGluIHRoZSBhYm92ZSBzdGVwIHRvIGludGVncmF0ZSBsb2NhbCBjaGFuZ2VzIHdpdGggdGhlICoqR2l0SHViKiogcmVwb3NpdG9yeSB3ZSBjcmVhdGVkLiANCg0KPiBXaGlsZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHdpbGwgdXNlIHRoZSBHVUkgaW50ZXJmYWNlIGluICoqUlN0dWRpbyoqLCB0aGUgbWFqb3JpdHkgb2YgdGhlc2Ugc3RlcHMgY2FuIGFsc28gYmUgY29tcGxldGVkIGluICoqR2l0SHViIERlc2t0b3AqKiBvciBpbiB0aGUgY29tbWFuZCBsaW5lLg0KDQojIyBOZXcgUHJvamVjdA0KVG8gYmVnaW4gd2Ugd2lsbCBjcmVhdGUgYSBuZXcgcHJvamVjdCB1c2luZyB0aGUgKkZpbGUgPiBOZXcgUHJvamVjdCogY29tbWFuZC4gSW4gcHJldmlvdXMgZXhhbXBsZXMgdGhlICpOZXcgRGlyZWN0b3J5KiBvcHRpb24gd2FzIHVzZWQsIGJ1dCBpbiB0aGlzIGV4ZXJjaXNlIHdlIHdpbGwgaW5zdGVhZCB1c2UgdGhlICpWZXJzaW9uIENvbnRyb2wqIG9wdGlvbi4gDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KDQohW0ltYWdlIG9mIHRoZSBSU3R1ZGlvIFZlcnNpb24gQ29udHJvbCBvcHRpb25zXSguL0ltYWdlcy9SUy1OZXctUHJvamVjdC5wbmcgIk5ldyBQcm9qZWN0IFdpbmRvdyIpe3dpZHRoPTUwJX0NCjwvZGl2Pg0KDQojIyMgVmVyc2lvbiBDb250cm9sDQpUaGlzIG9wdGlvbiB3aWxsIHByb3ZpZGUgdXMgdGhlIGFiaWxpdHkgdG8gY2hvb3NlIGJldHdlZW4gKipHaXQqKiBhbmQgKkFwYWNoZSBTdWJ2ZXJzaW9uKi4gV2Ugd2lsbCBmb2xsb3cgdGhlIG9wdGlvbiBmb3IgdXNpbmcgKipHaXQqKiBhcyB3ZSBsZWFybmVkIGluIHRoZSBwcmV2aW91cyBleGVyY2lzZS4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+DQoNCiFbSW1hZ2Ugb2YgdGhlIFZlcnNpb24gQ29udHJvbCB3aW5kb3ddKC4vSW1hZ2VzL1JTLVZlcnNpb24tQ29udHJvbC5wbmcgIlZlcnNpb24gQ29udHJvbCBXaW5kb3ciKXt3aWR0aD01MCV9DQo8L2Rpdj4NCg0KIyMjIEdpdCBmb3IgVmVyc2lvbmluZyBpbiBSU3R1ZGlvDQpUaGUgKnZlcnNpb24gY29udHJvbCogb3B0aW9uIHdpbGwgYWxsb3cgeW91IHRvIG9idGFpbiBhIHByb2plY3QgZnJvbSBhIHZlcnNpb24gY29udHJvbCByZXBvc2l0b3J5IHN1Y2ggYXMgKipHaXRIdWIqKi4NCg0KPiBJZiB5b3Ugd2FudCB0byBicmluZyBhbiBhbHJlYWR5IGRldmVsb3BlZCByZXBvc2l0b3J5IGludG8gKipSU3R1ZGlvKiogaW4gYSBibGFuayBwcm9qZWN0LCBmcm9tIHRoZSB0ZXJtaW5hbCB5b3UgY2FuIHVzZSB0aGUgZ2l0IGNvbW1hbmQgYGBgZ2l0IGNsb25lIDxHaXRIdWIgTGluaz5gYGAgaW4gdGhlIGZvbGRlciB5b3Ugd2lzaCB0byBzdG9yZSB0aGUgcmVwb3NpdG9yeSBhbmQgdGhlbiBzYXZlIGFzIGEgbmV3IHByb2plY3QuDQoNCiMjIyBDcmVhdGUgUHJvamVjdA0KQmVmb3JlIHlvdSBmaW5hbGl6ZSB5b3VyIHByb2plY3QsIHlvdSB3aWxsIGJlIHByb21wdGVkIHRvIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCg0KIVtJbWFnZSBvZiB0aGUgQ2xvbmUgUmVwb3NpdG9yeSB3aW5kb3ddKC4vSW1hZ2VzL1JTLUNsb25lLVJlcG8ucG5nICJDbG9uZSBSZXBvc2l0b3J5IFdpbmRvdyIpe3dpZHRoPTUwJX0NCjwvZGl2Pg0KPGJyPg0KLSBSZXBvc2l0b3J5IFVSTA0KICAtIEhlcmUgeW91IHdpbGwgcGFzdGUgdGhlIGxpbmsgeW91IGNvcGllZCBmcm9tICoqR2l0SHViKio6IGBgYGh0dHA6Ly9naXRodWIuY29tL3VzZXJuYW1lL3JlcG9zaXRvcnlgYGANCi0gUHJvamVjdCBEaXJlY3RvcnkgTmFtZQ0KICAtIFRoaXMgaXMgdGhlIGZvbGRlciB0aGF0IHdpbGwgYmUgY3JlYXRlZCB0byBvcmdhbml6ZSB0aGUgcHJvamVjdC4NCiAgICAtIFRpcDogTWFraW5nIHRoaXMgdGhlIHNhbWUgYXMgdGhlIHJlcG9zaXRvcnkgbmFtZSB3aWxsIGhlbHAga2VlcCB5b3Ugb3JnYW5pemVkIGJldHdlZW4gdGhlIGxvY2FsIGFuZCBvbmxpbmUgZW52aXJvbm1lbnQNCi0gU3ViZGlyZWN0b3J5DQogIC0gVGhpcyBpcyB0aGUgbG9jYWwgcm9vdCBkaXJlY3Rvcnkgd2hlcmUgdGhlIHByb2plY3QgZm9sZGVyIHdpbGwgcmVzaWRlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdGhlIHByb2plY3QgZm9sZGVyIHRvIGJlIGhvdXNlZCB3aXRoaW4gdGhlICpFeC04KiBmb2xkZXIgb24gdGhlIFogZHJpdmUgeW91IHdvdWxkIGJyb3dzZSB0bzogejovc3R1ZGVudHMvbmFtZS9FeC04IGFuZCB0aGVuIGNsaWNrICpjcmVhdGUgcHJvamVjdCouDQoNCiMjIFZpZXcgUHJvamVjdCBpbiBSU3R1ZGlvDQpUaGlzIHdpbGwgb3BlbiB0aGUgdHlwaWNhbCBSU3R1ZGlvIFByb2plY3Qgd2luZG93IHlvdSBhcmUgdXNlZCB0byBzZWVpbmcgaW5jbHVkaW5nIHRoZSBwcm9qZWN0IGluZm9ybWF0aW9uIGluIHRoZSB1cHBlci1yaWdodCBjb3JuZXIsIHByb2plY3QgZmlsZXMgaW4gdGhlIGZpbGVzIHRpbGUsIGV0Yy4gYnV0IHlvdSB3aWxsIGFsc28gbm93IHNlZSBhIG5ldyAqKkdpdCoqIHRhYiBhbG9uZ3NpZGUgdGhlICJFbnZpcm9ubWVudC1IaXN0b3J5LUNvbm5lY3Rpb25zIiBzZWN0aW9uLiBJdCBpcyBpbiB0aGlzIHRhYiB0aGF0IHdlIHdpbGwgY29udHJvbCB0aGUgaW50ZWdyYXRpb24gZm9yIG91ciBsb2NhbCBwcm9qZWN0IGFuZCBvbmxpbmUgcmVwb3NpdG9yeS4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+DQoNCiFbSW1hZ2Ugb2YgUlN0dWRpbyBQcm9qZWN0IFdpbmRvd10oLi9JbWFnZXMvUlMtUHJvamVjdC1XaW5kb3cucG5nICJQcm9qZWN0IFdpbmRvdyIpDQo8L2Rpdj4NCg0KIyMjIEdpdCBUYWINCkluIHRoZSAqR2l0KiB0YWIgeW91IHdpbGwgbm90aWNlIHNldmVyYWwgb3B0aW9ucyBpbmNsdWRpbmc6DQoNCi0gRGlmZiA8aW1nIHNyYz0iLi9JbWFnZXMvZGlmZl9idXR0b24ucG5nIiB0aXRsZT0iRGlmZiBTZWxlY3RlZCBGaWxlKHMpIi8+IHdoaWNoIGRldGFpbHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2ZXJzaW9ucyBvZiBhIGZpbGUuIA0KLSBDb21taXQgPGltZyBzcmM9Ii4vSW1hZ2VzL2NvbW1pdF9idXR0b24ucG5nIiB0aXRsZT0iQ29tbWl0IHBlbmRpbmcgY2hhbmdlcyIvPiB3aGljaCBhbGxvd3MgdXMgdG8gaW5pdGlhbCBhIGNvbW1pdCBzaW1pbGFyIHRvIHRoZSBgYGBnaXQgY29tbWl0YGBgIGNvbW1hbmQgaW4gdGhlIHByZXZpb3VzIGV4ZXJjaXNlLg0KLSBCbHVlIGRvd24gYXJyb3cgPGltZyBzcmM9Ii4vSW1hZ2VzL3B1bGxfYnV0dG9uLnBuZyIvPiBmb3IgYSBwdWxsIGNvbW1hbmQNCi0gR3JlZW4gdXAgYXJyb3cgPGltZyBzcmM9Ii4vSW1hZ2VzL3B1c2hfYnV0dG9uLnBuZyIvPiBmb3IgYSBwdXNoIGNvbW1hbmQNCi0gQ2xvY2sgPGltZyBzcmM9Imh0dHBzOi8vZ2l0aHViLmdpdGh1YmFzc2V0cy5jb20vaW1hZ2VzL2ljb25zL2Vtb2ppL3VuaWNvZGUvMWY1NTIucG5nIiB0aXRsZT0iVmlldyBoaXN0b3J5IG9mIHByZXZpb3VzIGNvbW1pdHMiIHdpZHRoPTE1IGhlaWdodD0xNS8+IHRvIHZpZXcgYSBoaXN0b3J5IG9mIHRoZSBjb21taXRzDQotIEdlYXIgPGltZyBzcmM9Imh0dHBzOi8vZ2l0aHViLmdpdGh1YmFzc2V0cy5jb20vaW1hZ2VzL2ljb25zL2Vtb2ppL3VuaWNvZGUvMjY5OS5wbmciIHdpZHRoPTE1IGhlaWdodD0xNS8+IHRoYXQgYWxsb3dzIHlvdSB0byByZXZlcnQgdG8gcHJldmlvdXMgc3RhZ2VzDQotIE5ldyBicmFuY2ggaWNvbiA8aW1nIHNyYz0iLi9JbWFnZXMvbmV3X2JyYW5jaC5wbmciLz4NCi0gQnJhbmNoIGluZm9ybWF0aW9uIDxpbWcgc3JjPSIuL0ltYWdlcy9icmFuY2hfc2VsZWN0LnBuZyIgdGl0bGU9InN3aXRjaCBicmFuY2giLz4gc2hvd2luZyB3aGljaCBicmFuY2ggaXMgY3VycmVudGx5IGJlaW5nIGVkaXRlZA0KLSBSZWZyZXNoIGljb24gPGltZyBzcmM9Ii4vSW1hZ2VzL3JlZnJlc2hfYnV0dG9uLnBuZyIvPg0KDQojIyMjIFN0YWdlZCBGaWxlcw0KVGhlcmUgYXJlIHR3byB3YXlzIHRvIHN0YWdlIGZpbGVzIGluICoqUlN0dWRpbyoqLiBUaGUgZmlyc3QgaXMgZGlyZWN0bHkgZnJvbSB0aGUgKkdpdCogdGFiLiBCeSBjbGljayBvbiB0aGUgYnV0dG9uIGluIHRoZSAiU3RhZ2VkIiBjb2x1bW4sIHlvdSB3aWxsIHNlZSB0aGUgaWNvbiBpbiB0aGUgIlN0YXR1cyIgY29sdW1uIGNoYW5nZS4gVGhlIHNlY29uZCBpcyBieSBjbGlja2luZyB0aGUgImNvbW1pdCBidXR0b24iIGFuZCBzdGFnaW5nIHRoZSBmaWxlcyBmcm9tIHRoZXJlLiBCZWNhdXNlIG9mIHRoZSBzaW1wbGUgaW50ZXJmYWNlLCBmaWxlcyBjYW4gZWFzaWx5IGJlIHN0YWdlZC91bnN0YWdlZCBmcm9tIGVpdGhlciBsb2NhdGlvbi4NCg0KPiBZb3UgY291bGQgYWxzbyBjb21wbGV0ZSBtYW55IG9mIHRoZXNlIHN0ZXBzIHZpYSBjb21tYW5kIGxpbmUgZnJvbSB0aGUgdGVybWluYWwgd2luZG93Lg0KDQojIyMjIENvbG9yLWNvZGVkIEljb25zDQpJbiAqKlJTdHVkaW8qKiBhcyB5b3Ugc3RhZ2UgZmlsZXMgdGhlaXIgaWNvbiB3aWxsIGNoYW5nZSB0byBtYXRjaCB0aGVpciBjdXJyZW50IHN0YXR1cy4gWW91IGFyZSBtb3N0IGxpa2VseSB0byBzZWUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoNCg0KLSBZZWxsb3cgYm94IDxpbWcgc3JjPSIuL0ltYWdlcy9uZXcucG5nIiB3aWR0aD0xNSBoZWlnaHQ9MTUvPiBmb3IgbmV3bHkgY3JlYXRlZC91bnRyYWNrZWQgZmlsZXMNCi0gQmx1ZSBib3ggIDxpbWcgc3JjPSIuL0ltYWdlcy9tb2RpZmllZC5wbmciIHdpZHRoPTE1IGhlaWdodD0xNS8+IGZvciBmaWxlcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZA0KLSBHcmVlbiBib3ggPGltZyBzcmM9Ii4vSW1hZ2VzL2FkZGVkLnBuZyIgd2lkdGg9MTUgaGVpZ2h0PTE1Lz4gZm9yIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkL3N0YWdlZCBhbmQgYXJlIHJlYWR5IGZvciBhIGNvbW1pdA0KLSBSZWQgYm94IDxpbWcgc3JjPSIuL0ltYWdlcy9kZWxldGVkLnBuZyIgd2lkdGg9MTUgaGVpZ2h0PTE1Lz4gZm9yIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGRlbGV0ZWQNCg0KT25jZSB5b3UgaGF2ZSB0aGUgZmlsZXMgYXBwcm9wcmlhdGVseSBzdGFnZWQsIHlvdSBhcmUgcmVhZHkgdG8gY29tbWl0IHRoZW0gdG8geW91ciByZXBvc2l0b3J5Lg0KDQojIyMgQ29tbWl0IGFuZCBQdXNoIHRvIEdpdEh1Yg0KSW4gdGhlIGNvbW1pdCB3aW5kb3cgeW91IGNhbiBzdGFnZSBmaWxlcywgdmlldyBkaWZmZXJlbmNlcyBpbiB0aGUgY2hhbmdlZCBmaWxlcywgYWRkIGEgY29tbWl0IG1lc3NhZ2UsIGFuZCBwdXNoIHlvdXIgY2hhbmdlcyB0byB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuDQoNCkl0IGlzIGltcG9ydGFudCB0byBhbHdheXMgaW5jbHVkZSBhIGNvbW1pdCBtZXNzYWdlIGVhY2ggdGltZSB5b3UgY29tbWl0IGZpbGVzIHRvIHlvdXIgcmVwb3NpdG9yeS4gQXMgd2UgaGF2ZSBzZWVuIGluIHRoZSBwcmV2aW91cyBleGVyY2lzZSwgdGhpcyBoZWxwcyB0byBrZWVwIHRyYWNrIG9mIGVhY2ggc3RhZ2Ugb2YgZGV2ZWxvcG1lbnQgYW5kIGluZm9ybXMgY29sbGFib3JhdG9ycyBvZiBjaGFuZ2VzIG1hZGUgaW4gZWFjaCB1cGRhdGUuIEJlY2F1c2UgKipSU3R1ZGlvKiogcHJvdmlkZXMgYSB0ZXh0IGJveCBmb3IgY29tbWl0cywgdGhlcmUgaXMgYW1wbGUgcm9vbSBmb3IgYW4gYXBwcm9wcmlhdGUgY29tbWl0IG1lc3NhZ2UuIENoZWNrIG91dCB0aGVzZSBzdWdnZXN0aW9ucyBhYm91dCBjb21wb3NpbmcgYmV0dGVyIGNvbW1pdCBtZXNzYWdlczogPGEgaHJlZj0iaHR0cHM6Ly9jaHJpcy5iZWFtcy5pby9wb3N0cy9naXQtY29tbWl0LyIgdGFyZ2V0PSJfYmxhbmsiPiBDaHJpcyBCZWFtcycgPGVtPkNvbW1pdCBtZXNzYWdlcyBtYXR0ZXIuIEhlcmUncyBob3cgdG8gd3JpdGUgdGhlbSB3ZWxsITwvZW0+PC9hPg0KDQpBZnRlciBzdGFnaW5nIHlvdXIgZmlsZXMgYW5kIHdyaXRpbmcgYSB1c2VmdWwgY29tbWl0IG1lc3NhZ2UgeW91ciBuZXh0IHN0ZXAgd2lsbCBiZSB0byBjb21taXQgdGhhdCBpbmZvcm1hdGlvbi4gUmVtZW1iZXIgZXZlbiB0aG91Z2ggeW91IGhhdmUgeW91ciBsb2NhbCBhbmQgKipHaXRIdWIqKiByZXBvc2l0b3JpZXMgbGlua2VkLCB5b3UgYXJlIG9ubHkgbWFraW5nIHRoaXMgY29tbWl0IHRvIHRoZSBsb2NhbCByZXBvc2l0b3J5LiBJbiBvcmRlciB0byBzeW5jIHRoZSB0d28gcmVwb3NpdG9yaWVzIHlvdSBtdXN0IDxpbWcgc3JjPSIuL0ltYWdlcy9wdXNoX2J1dHRvbi5wbmciLz4gUHVzaCB0aGUgY2hhbmdlcyB0byAqKkdpdEh1YioqLg0KDQojIyBWaWV3IENoYW5nZXMgb24gR2l0SHViDQpPbmNlIHlvdSBoYXZlIGNvbXBsZXRlZCB0aGVzZSBzdGVwcyB5b3UgY2FuIG5hdmlnYXRlIGJhY2sgdG8geW91ciAqKkdpdEh1YioqIHJlcG9zaXRvcnkgYW5kIHZpZXcgdGhlIGluZm9ybWF0aW9uIHlvdSBoYXZlIGp1c3QgcHVzaGVkIHRvIHRoZSByZXBvc2l0b3J5Lg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCg0KIVtJbWFnZSBvZiBVcGRhdGVkIEdpdEh1YiBQYWdlXSguL0ltYWdlcy9HaXRIdWItdXBkYXRlcy5wbmcgIlZpZXdpbmcgVXBkYXRlcyBvbiBHaXRIdWIiKQ0KPC9kaXY+DQoNCiMjIENyZWF0ZSBhIEdpdEh1Yi5pbyB3ZWJwYWdlDQpPbmUgZXhjZWxsZW50IGZlYXR1cmUgb2YgKipHaXRIdWIqKiBpcyB0aGUgYWJpbGl0eSB0byBjcmVhdGUgd2VicGFnZXMgb3V0IG9mIGNvbnRlbnQgd2l0aGluIHlvdXIgcmVwb3NpdG9yeS4gVGhpcyBpcyBhbiBleHRyZW1lbHkgZWFzeSBwcm9jZXNzIGFuZCBhdCB0aGlzIHBvaW50IGVhY2ggb2YgdGhlIGV4ZXJjaXNlcyB5b3UgaGF2ZSBjb21wbGV0ZWQgaW4gdGhlIGNvdXJzZSBjYW4gYmUgdHVybmVkIGludG8gYSB3ZWJwYWdlIHdpdGggdmVyeSBsaXR0bGUgZWZmb3J0LiBJbiB0aGUgc2V0dGluZyBtZW51IG9mIHlvdXIgcmVwb3NpdG9yeSwgc2Nyb2xsIGRvd24gdG8gdGhlIHNlY3Rpb24gZm9yICpHaXRIdWIgUGFnZXMqIGFuZCBpbiB0aGUgIlNvdXJjZSIgcG9ydGlvbiwgY2hhbmdlIGZyb20gX0dpdEh1YiBBY3Rpb25zXyB0byAqKkRlcGxveSBmcm9tIGEgQnJhbmNoKiouIA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCg0KIVtJbWFnZSBvZiB0aGUgR2l0SHViIFBhZ2VzIFNldHRpbmdzXSguL0ltYWdlcy9naXRodWItc2V0dGluZ3MtaW8ucG5nICJHaXRIdWIgU2V0dGluZ3MgZm9yIFBhZ2VzIil7d2lkdGg9ODUlfQ0KPC9kaXY+DQo8YnI+DQpUaGlzIHdpbGwgc2xpZ2h0bHkgYWx0ZXIgdGhlIGxvb2sgb2YgdGhlIHBhZ2UgYW5kIHlvdSBzaG91bGQgc2VlIGEgbmV3IF9icmFuY2hfIHNlY3Rpb24gd2hlcmUgKipNYXN0ZXIqKiBpcyBzZWxlY3RlZCBhcyB0aGUgcm9vdCBkaXJlY3RvcnkuDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KDQohW0ltYWdlIG9mIHRoZSBHaXRIdWIgQnJhbmNoIFNldHRpbmdzXSguL0ltYWdlcy9naXRodWItaW8tZGVwbG95LWJyYW5jaC5wbmcgIkdpdEh1YiBCcmFuY2ggU2V0dGluZyIpe3dpZHRoPTg1JX0NCjwvZGl2Pg0KPGJyPg0KVGhpcyB3aWxsIGVuYWJsZSBhIHdlYnBhZ2UgZm9yIHlvdXIgcmVwb3NpdG9yeSB0aGF0IHV0aWxpemVzIGEgY29uc2lzdGVudCB1cmwgdGhlbWU6IA0KDQpodHRwJiM1ODsmIzQ3OyYjNDc7Kip1c2VybmFtZSoqLmdpdGh1Yi5pby8qKnJlcG9zaXRvcnkgbmFtZSoqDQoNCkluIG9yZGVyIHRvIGNyZWF0ZSBhIHdlYnBhZ2UgdXNpbmcgKkdpdEh1YiBQYWdlcyosIHNpbXBseSBjcmVhdGUgYSBjb3B5IG9mIHlvdXIgIFwqLm5iLmh0bWwgYW5kIGNhbGwgaXQgKippbmRleC5odG1sKiouIE9uY2UgdGhlIGluZGV4Lmh0bWwgZmlsZSBpcyBjcmVhdGVkLCBwdXNoIGl0IHRvIHlvdXIgbWFzdGVyIHJlcG9zaXRvcnkgYW5kIHRoZSB3ZWJzaXRlIHdpbGwgYXV0b21hdGljYWxseSBiZSBjcmVhdGVkLg0KDQo+IEl0IG1heSB0YWtlIHNldmVyYWwgbWludXRlcyBiZWZvcmUgdGhlIHNpdGUgYXBwZWFycyBvbiB5b3VyICpnaXRodWIuaW8qIHBhZ2UgZm9yIHRoZSBmaXJzdCB0aW1lLiANCg0KIyBZb3VyIFR1cm4hIA0KDQpXaGlsZSB0aGVyZSBhcmUgYSBudW1iZXIgb2YgZmVhdHVyZXMgYW4gb3B0aW9ucyBhdmFpbGFibGUgaW4gKipHaXRIdWIqKiwgaGVyZSB3ZSBjb3ZlcmVkIG9ubHkgdGhlIGJhc2ljcyBvZiBjcmVhdGluZyBhbmQgbWFpbnRhaW5pbmcgYSByZXBvc2l0b3J5IGFuZCBlbmFibGluZyAqR2l0SHViIFBhZ2VzKi4gQXQgdGhlIGVuZCBvZiB0aGUgc2VtZXN0ZXIgeW91ciBmaW5hbCBwcm9qZWN0IHdpbGwgYmUgdG8gZGV2ZWxvcCBtYXRlcmlhbHMgYmFzZWQgb24geW91ciB0aGVzaXMgcmVzZWFyY2guIFNvIGZvciB0aGlzIGV4ZXJjaXNlIEkgd2FudCB5b3UgdG8gY3JlYXRlIGEgcmVwb3NpdG9yeSBhbmQgR2l0SHViIHdlYnBhZ2UgZm9yIHlvdXIgdGhlc2lzIHdvcmsuIFlvdSBzaG91bGQgY3JlYXRlIGEgUkVBRE1FLm1kIGZpbGUgZm9yIHlvdXIgcHJvamVjdCB0aGF0IGluY2x1ZGVzOg0KDQotIFByb2plY3QgVGl0bGUNCi0gUHJvamVjdCBBYnN0cmFjdA0KLSBMaW5rIHRvIHRoZSBHaXRodWIuaW8gcGFnZQ0KLSBSZXBvc2l0b3J5IERlc2NyaXB0aW9uDQotIFJlZmVyZW5jZXMNCg0KVGhpcyByZXBvc2l0b3J5IGFuZCB3ZWJwYWdlIHNob3VsZCBiZSBwZXJpb2RpY2FsbHkgdXBkYXRlZCB0aHJvdWdob3V0IHRoZSByZW1haW5kZXIgb2YgdGhlIHNlbWVzdGVyIGN1bG1pbmF0aW5nIGluIHlvdXIgZmluYWwgcHJvamVjdC4gWW91IHNob3VsZCB0YWtlIGEgbG9vayBhdCB0aGUgdmFyaW91cyBvcHRpb25zIGFuZCBmZWF0dXJlcyAoc3VjaCBhcyB0aGVtZXMsIG5vdGlmaWNhdGlvbnMsIHNvY2lhbCBwcmV2aWV3cywgd2lraXMsIHByb2plY3RzLCBldGMuKSBhdmFpbGFibGUgaW4gPGltZyBzcmM9Imh0dHBzOi8vZ2l0aHViLmdpdGh1YmFzc2V0cy5jb20vaW1hZ2VzL2ljb25zL2Vtb2ppL29jdG9jYXQucG5nIiBhbHQ9IkdpdEh1YiBPY3RvY2F0IiB0aXRsZT0iR2l0SHViIE9jdG9jYXQiIHdpZHRoPTE1IGhlaWdoPTE1Lz4gdG8gY3JlYXRlIGEgdXNlZnVsIHJlcG9zaXRvcnkgZm9yIHNoYXJpbmcgYW5kIG1haW50YWluaW5nIHlvdXIgcHJvamVjdC4gDQoNCiMjIEFkZGl0aW9uYWwgSGVscA0KDQo8YSBocmVmPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDcnFBR1VQUE1PZG8wamZRNmdyaWtadyIgdGFyZ2V0PSJfYmxhbmsiPiBDb2x0IFN0ZWVsZTwvYT4gaGFzIGEgZ3JlYXQgc2VyaWVzIG9mIHR1dG9yaWFscyBvbiBhIG51bWJlciBvZiBjb2RpbmcgcmVsYXRlZCB0b3BpY3MgaW5jbHVkaW5nIF9HaXRfIGFuZCBfR2l0SHViXy4gVGhpcyAqKkdpdEh1YioqIHR1dG9yaWFsLCBjYWxsZWQgPGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1uaE5xMmtJdmk5cyIgdGFyZ2V0PSJfYmxhbmsiPiBMZWFybiBHaXRodWIgaW4gMjAgTWludXRlczwvYT4sIHdhbGtzIHlvdSB0aHJvdWdoIG1hbnkgb2YgdGhlIHN0ZXBzIHdlIGRpc2N1c3NlZCBpbiBjbGFzcyBhbmQgY292ZXJzIHRvcGljcyB0aGF0IGFyZSBzbGlnaHRseSBtb3JlIGFkdmFuY2VkIHRoYW4geW91IG1pZ2h0IG5lZWQgaW4gdGhlIG5lYXIgZnV0dXJlLg==