Apresentação

Nesta seção iremos explorar um pouco mais o poder que os commits nos oferecem, incluindo boas práticas para fazer commits nos nossos arquivos e como “viajar” entre commits passados e presente. Este momento também servirá para ficarmos um pouco mais familiarizados com o uso do git através do terminal. Vamos utilizar o teminal visto que algumas coisas que faremos aqui não podem ser feitas através do RStudio.

Sempre ao fazer commits vale lembrar essas palavras:

Workflow para os commits

Em primeiro lugar sempre cheque se está tudo certo com seu repositório, se seu trabalho local está sincronizado com seu trabalho remoto. Para tanto pode digitar na linha de comando do terminal

git status

Se sua working tree estiver no status clean, quer dizer que você está sincronizada com o origin

Faça algumas modificações e depois vamos fazer a mesma sequencia de ações que fizemos anteriormente (stage, commit, push), mas agora usando a linha de comando. Para tanto podemos fazer assim

git add .
git commit -m "uma mensagem informativa"
git push

Pronto, fizemos a mesma coisa que anteriormente, mas agora utilizando o terminal :)

Amend

Lembra que muitos commits podem te deixar muito lento na escalada? E poucos commits podem ser pouco informativos caso queira reconstruir o que aconteceu com o repositório? Pois então, existe uma estratégia interessante para realizar commits, chamada de amend

Em um amend nós basicamente adicionamos um commit a um outro já existente. Por exemplo, imagine que fez apenas algumas poucas modificações de código que não necessitam necessariamente de um commit dedicada exclusivamente para tais, você pode fazer o seguinte:

1 - stage o arquivo que modificou

git add path/to/file

2 - faça um commit

git commit -m "WIP"

Note que coloquei WIP neste commit, por que? WIP é uma sigla usada comumente no versionamente para Working In Progress. Sempre que tiver um commit desse quer dizer que o commit que fez ainda está sendo trabalhado.

Ainda não faça o push. Faça mais algumas modificações, e, digamos que agora fez modificações relevantes no código que merecem um commit dedicado. Mas lembre-se que o último commit é um WIP. O que fazemos agora é um amend ao WIP

3 - faça um amend

git commit --amend -m "Aqui um commit com uma mensagem informativa, como sempre"
git push

Pronto, agora temos uma mensagem informativa que foi adicionada ao WIP e não precisamos fazer um push do passo intermediário (WIP), deixando nossa escalada mais rápida

Viajando entre commits

Uma das maiores potencialidades dos commits é a possibilidade que podemos navegar entre commits. Ou seja, podemos navegar entre estados distintos do nosso trabalho a medida que ele é desenvolvido. Podemos checar esse histórico tanto na nossa página do repositório no GitHub quanto usando o RStudio, como mostrado na imagem a seguir

Para tanto você precisa apenas abrir a aba do Git no RStudio, como vimos anteriormente, e clicar em History no canto superior esquerdo da janela de revisões. Tudo o que vemos são todos os commits que foram realizados desde que esse repositório foi formado pela primeira vez.

Elementos importantes do commit

Alguns elementos presentes no commit são importantes. O principal deles é a chave SHA-1. Esta se trata de um identificador único do commit. Com ela podemos viajar entre commits, ou referenciar um dado commit em uma discussão no github. Por exemplo, supondo que estamos trabalhando colaborativamente (como nesse site :)), e eu gostei particularmente mais da versão do site que está há alguns commits atrás. Uma opção é abrir uma Issue (veremos isso mais tarde), e referenciar esse número. Ou simplesmente dizer para meu colaborador “Hey dê uma olhada no commit número XXXXXX”. Na imagem abaixo está em destaque a chave SHA.

Você pode abrir o arquivo no estado em que ele se encontrava em um dado commit clicando no arquivo modificado naquele commit selecionado. Por exemplo, digamos que eu queira ver o arquivo chamado rmarkdown-basics deste site editado dia 02 de Agosto, só precisamos clicar no arquivo, como mostrado na imagem abaixo:

Atividade

Explore um pouco os commits que realizaram. Abra a página do github e também através do Rstudio, veja as diferenças, as vantangens e desvantagens de cada uma das abordagens

Throwback Commit

Vamos supor que realizamos um commit errado, e agora queremos voltar ao commit anterior, mas sem perder o trabalho que fizemos nos arquivos. Para isso podemos usar a abordagem anterior, navegando entre os arquivos e selecionando o arquivo que queremos em um determinado estado, substituimos pelo arquivo atual e fazemos um novo commit. Esta opção pode ser a mais segura se estamos começando a mexer no versionamento. Outra opção é explorar as funções do git chamadas reset. As funções reset basicamente move o HEAD do seu diretório para um commit no passado. Esta abordagem pode causar algumas dores de cabeça no início, portanto recomendo usa-lá com cautela. Para mais informações sobre isso dê uma olhada nesse site.)

Inutilidades públicas necessárias

No fim do dia, aprendemos fazer commits apenas para utilizar essa ferramenta aqui. Cole o link de seu repositório contendo alguns commits e veja o que acontece

LS0tDQp0aXRsZTogJ0V4cGxvcmFuZG8gbWVsaG9yIG9zIGNvbW1pdHMnDQphdXRob3I6ICJHYWJyaWVsIE5ha2FtdXJhIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBodG1sX2RvY3VtZW50DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0KYGBgDQoNCmBgYHtyIGtsaXBweSwgZWNobz1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0Ka2xpcHB5OjprbGlwcHkoKQ0KYGBgDQoNCiMgQXByZXNlbnRhw6fDo28NCg0KTmVzdGEgc2XDp8OjbyBpcmVtb3MgZXhwbG9yYXIgdW0gcG91Y28gbWFpcyBvIHBvZGVyIHF1ZSBvcyBjb21taXRzIG5vcyBvZmVyZWNlbSwgaW5jbHVpbmRvIGJvYXMgcHLDoXRpY2FzIHBhcmEgZmF6ZXIgY29tbWl0cyBub3Mgbm9zc29zIGFycXVpdm9zIGUgY29tbyAidmlhamFyIiBlbnRyZSBjb21taXRzIHBhc3NhZG9zIGUgcHJlc2VudGUuIEVzdGUgbW9tZW50byB0YW1iw6ltIHNlcnZpcsOhIHBhcmEgZmljYXJtb3MgdW0gcG91Y28gbWFpcyBmYW1pbGlhcml6YWRvcyBjb20gbyB1c28gZG8gZ2l0IGF0cmF2w6lzIGRvIHRlcm1pbmFsLiBWYW1vcyB1dGlsaXphciBvIHRlbWluYWwgdmlzdG8gcXVlIGFsZ3VtYXMgY29pc2FzIHF1ZSBmYXJlbW9zIGFxdWkgbsOjbyBwb2RlbSBzZXIgZmVpdGFzIGF0cmF2w6lzIGRvIFJTdHVkaW8uDQoNClNlbXByZSBhbyBmYXplciBjb21taXRzIHZhbGUgbGVtYnJhciBlc3NhcyBwYWxhdnJhczoNCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLG91dC53aWR0aD0iNzAlIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImZpZ3MiLCAiY29tbWl0LXNhZmUucG5nIikpDQpgYGANCg0KIyBXb3JrZmxvdyBwYXJhIG9zIGNvbW1pdHMgDQoNCkVtIHByaW1laXJvIGx1Z2FyIHNlbXByZSBjaGVxdWUgc2UgZXN0w6EgdHVkbyBjZXJ0byBjb20gc2V1IHJlcG9zaXTDs3Jpbywgc2Ugc2V1IHRyYWJhbGhvIGxvY2FsIGVzdMOhIHNpbmNyb25pemFkbyBjb20gc2V1IHRyYWJhbGhvIHJlbW90by4gUGFyYSB0YW50byBwb2RlIGRpZ2l0YXIgbmEgbGluaGEgZGUgY29tYW5kbyBkbyB0ZXJtaW5hbA0KDQpgYGB7ciBlY2hvPVQsZXZhbD1GQUxTRX0NCmdpdCBzdGF0dXMNCmBgYA0KDQpTZSBzdWEgKndvcmtpbmcgdHJlZSogZXN0aXZlciBubyBzdGF0dXMgKmNsZWFuKiwgcXVlciBkaXplciBxdWUgdm9jw6ogZXN0w6Egc2luY3Jvbml6YWRhIGNvbSBvICpvcmlnaW4qDQoNCkZhw6dhIGFsZ3VtYXMgbW9kaWZpY2HDp8O1ZXMgZSBkZXBvaXMgdmFtb3MgZmF6ZXIgYSBtZXNtYSBzZXF1ZW5jaWEgZGUgYcOnw7VlcyBxdWUgZml6ZW1vcyBhbnRlcmlvcm1lbnRlIChzdGFnZSwgY29tbWl0LCBwdXNoKSwgbWFzIGFnb3JhIHVzYW5kbyBhIGxpbmhhIGRlIGNvbWFuZG8uIFBhcmEgdGFudG8gcG9kZW1vcyBmYXplciBhc3NpbQ0KDQpgYGB7ciBlY2hvPVRSVUUsZXZhbD1GQUxTRX0NCmdpdCBhZGQgLg0KZ2l0IGNvbW1pdCAtbSAidW1hIG1lbnNhZ2VtIGluZm9ybWF0aXZhIg0KZ2l0IHB1c2gNCmBgYA0KDQpQcm9udG8sIGZpemVtb3MgYSBtZXNtYSBjb2lzYSBxdWUgYW50ZXJpb3JtZW50ZSwgbWFzIGFnb3JhIHV0aWxpemFuZG8gbyB0ZXJtaW5hbCA6KQ0KDQojIyBBbWVuZA0KDQpMZW1icmEgcXVlIG11aXRvcyBjb21taXRzIHBvZGVtIHRlIGRlaXhhciBtdWl0byBsZW50byBuYSBlc2NhbGFkYT8gRSBwb3Vjb3MgY29tbWl0cyBwb2RlbSBzZXIgcG91Y28gaW5mb3JtYXRpdm9zIGNhc28gcXVlaXJhIHJlY29uc3RydWlyIG8gcXVlIGFjb250ZWNldSBjb20gbyByZXBvc2l0w7NyaW8/IFBvaXMgZW50w6NvLCBleGlzdGUgdW1hIGVzdHJhdMOpZ2lhIGludGVyZXNzYW50ZSBwYXJhIHJlYWxpemFyIGNvbW1pdHMsIGNoYW1hZGEgZGUgYGFtZW5kYA0KDQpFbSB1bSBhbWVuZCBuw7NzIGJhc2ljYW1lbnRlIGFkaWNpb25hbW9zIHVtIGNvbW1pdCBhIHVtIG91dHJvIGrDoSBleGlzdGVudGUuIFBvciBleGVtcGxvLCBpbWFnaW5lIHF1ZSBmZXogYXBlbmFzIGFsZ3VtYXMgcG91Y2FzIG1vZGlmaWNhw6fDtWVzIGRlIGPDs2RpZ28gcXVlIG7Do28gbmVjZXNzaXRhbSBuZWNlc3NhcmlhbWVudGUgZGUgdW0gY29tbWl0IGRlZGljYWRhIGV4Y2x1c2l2YW1lbnRlIHBhcmEgdGFpcywgdm9jw6ogcG9kZSBmYXplciBvIHNlZ3VpbnRlOg0KDQoxIC0gc3RhZ2UgbyBhcnF1aXZvIHF1ZSBtb2RpZmljb3UNCg0KYGBge3IgZWNobz1UUlVFLGV2YWw9RkFMU0V9DQpnaXQgYWRkIHBhdGgvdG8vZmlsZQ0KYGBgDQoNCjIgLSBmYcOnYSB1bSBjb21taXQgDQoNCmBgYHtyIGVjaG89VFJVRSxldmFsPUZBTFNFfQ0KZ2l0IGNvbW1pdCAtbSAiV0lQIg0KYGBgDQoNCk5vdGUgcXVlIGNvbG9xdWVpICoqV0lQKiogbmVzdGUgY29tbWl0LCBwb3IgcXVlPyBXSVAgw6kgdW1hIHNpZ2xhIHVzYWRhIGNvbXVtZW50ZSBubyB2ZXJzaW9uYW1lbnRlIHBhcmEgV29ya2luZyBJbiBQcm9ncmVzcy4gU2VtcHJlIHF1ZSB0aXZlciB1bSBjb21taXQgZGVzc2UgcXVlciBkaXplciBxdWUgbyBjb21taXQgcXVlIGZleiBhaW5kYSBlc3TDoSBzZW5kbyB0cmFiYWxoYWRvLg0KDQpBaW5kYSBuw6NvIGZhw6dhIG8gcHVzaC4gRmHDp2EgbWFpcyBhbGd1bWFzIG1vZGlmaWNhw6fDtWVzLCBlLCBkaWdhbW9zIHF1ZSBhZ29yYSBmZXogbW9kaWZpY2HDp8O1ZXMgcmVsZXZhbnRlcyBubyBjw7NkaWdvIHF1ZSBtZXJlY2VtIHVtIGNvbW1pdCBkZWRpY2Fkby4gTWFzIGxlbWJyZS1zZSBxdWUgbyDDumx0aW1vIGNvbW1pdCDDqSB1bSBXSVAuIE8gcXVlIGZhemVtb3MgYWdvcmEgw6kgdW0gYW1lbmQgYW8gV0lQDQoNCjMgLSBmYcOnYSB1bSBhbWVuZA0KDQpgYGB7ciBlY2hvPVRSVUUsZXZhbD1GQUxTRX0NCmdpdCBjb21taXQgLS1hbWVuZCAtbSAiQXF1aSB1bSBjb21taXQgY29tIHVtYSBtZW5zYWdlbSBpbmZvcm1hdGl2YSwgY29tbyBzZW1wcmUiDQpnaXQgcHVzaA0KYGBgDQoNClByb250bywgYWdvcmEgdGVtb3MgdW1hIG1lbnNhZ2VtIGluZm9ybWF0aXZhIHF1ZSBmb2kgYWRpY2lvbmFkYSBhbyBXSVAgZSBuw6NvIHByZWNpc2Ftb3MgZmF6ZXIgdW0gcHVzaCBkbyBwYXNzbyBpbnRlcm1lZGnDoXJpbyAoV0lQKSwgZGVpeGFuZG8gbm9zc2EgZXNjYWxhZGEgbWFpcyByw6FwaWRhDQoNCiMjIFZpYWphbmRvIGVudHJlIGNvbW1pdHMNCg0KVW1hIGRhcyBtYWlvcmVzIHBvdGVuY2lhbGlkYWRlcyBkb3MgY29tbWl0cyDDqSBhIHBvc3NpYmlsaWRhZGUgcXVlIHBvZGVtb3MgbmF2ZWdhciBlbnRyZSBjb21taXRzLiBPdSBzZWphLCBwb2RlbW9zIG5hdmVnYXIgZW50cmUgZXN0YWRvcyBkaXN0aW50b3MgZG8gbm9zc28gdHJhYmFsaG8gYSBtZWRpZGEgcXVlIGVsZSDDqSBkZXNlbnZvbHZpZG8uIFBvZGVtb3MgY2hlY2FyIGVzc2UgaGlzdMOzcmljbyB0YW50byBuYSBub3NzYSBww6FnaW5hIGRvIHJlcG9zaXTDs3JpbyBubyBHaXRIdWIgcXVhbnRvIHVzYW5kbyBvIFJTdHVkaW8sIGNvbW8gbW9zdHJhZG8gbmEgaW1hZ2VtIGEgc2VndWlyDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSxvdXQud2lkdGg9IjcwJSJ9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJmaWdzIiwgImdpdGh1Yi1oaXN0b3J5LnBuZyIpKQ0KYGBgDQoNClBhcmEgdGFudG8gdm9jw6ogcHJlY2lzYSBhcGVuYXMgYWJyaXIgYSBhYmEgZG8gR2l0IG5vIFJTdHVkaW8sIGNvbW8gdmltb3MgYW50ZXJpb3JtZW50ZSwgZSBjbGljYXIgZW0gKipIaXN0b3J5Kiogbm8gY2FudG8gc3VwZXJpb3IgZXNxdWVyZG8gZGEgamFuZWxhIGRlIHJldmlzw7Vlcy4gVHVkbyBvIHF1ZSB2ZW1vcyBzw6NvIHRvZG9zIG9zIGNvbW1pdHMgcXVlIGZvcmFtIHJlYWxpemFkb3MgZGVzZGUgcXVlIGVzc2UgcmVwb3NpdMOzcmlvIGZvaSBmb3JtYWRvIHBlbGEgcHJpbWVpcmEgdmV6Lg0KDQojIyBFbGVtZW50b3MgaW1wb3J0YW50ZXMgZG8gY29tbWl0DQoNCkFsZ3VucyBlbGVtZW50b3MgcHJlc2VudGVzIG5vIGNvbW1pdCBzw6NvIGltcG9ydGFudGVzLiBPIHByaW5jaXBhbCBkZWxlcyDDqSBhIGNoYXZlIFNIQS0xLiBFc3RhIHNlIHRyYXRhIGRlIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGRvIGNvbW1pdC4gQ29tIGVsYSBwb2RlbW9zIHZpYWphciBlbnRyZSBjb21taXRzLCBvdSByZWZlcmVuY2lhciB1bSBkYWRvIGNvbW1pdCBlbSB1bWEgZGlzY3Vzc8OjbyBubyBnaXRodWIuIFBvciBleGVtcGxvLCBzdXBvbmRvIHF1ZSBlc3RhbW9zIHRyYWJhbGhhbmRvIGNvbGFib3JhdGl2YW1lbnRlIChjb21vIG5lc3NlIHNpdGUgOikpLCBlIGV1IGdvc3RlaSBwYXJ0aWN1bGFybWVudGUgbWFpcyBkYSB2ZXJzw6NvIGRvIHNpdGUgcXVlIGVzdMOhIGjDoSBhbGd1bnMgY29tbWl0cyBhdHLDoXMuIFVtYSBvcMOnw6NvIMOpIGFicmlyIHVtYSBJc3N1ZSAodmVyZW1vcyBpc3NvIG1haXMgdGFyZGUpLCBlIHJlZmVyZW5jaWFyIGVzc2UgbsO6bWVyby4gT3Ugc2ltcGxlc21lbnRlIGRpemVyIHBhcmEgbWV1IGNvbGFib3JhZG9yICJIZXkgZMOqIHVtYSBvbGhhZGEgbm8gY29tbWl0IG7Dum1lcm8gWFhYWFhYIi4gTmEgaW1hZ2VtIGFiYWl4byBlc3TDoSBlbSBkZXN0YXF1ZSBhIGNoYXZlIFNIQS4NCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLG91dC53aWR0aD0iNzAlIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImZpZ3MiLCAiZ2l0LXNoYS1rZXkucG5nIikpDQpgYGANCg0KVm9jw6ogcG9kZSBhYnJpciBvIGFycXVpdm8gbm8gZXN0YWRvIGVtIHF1ZSBlbGUgc2UgZW5jb250cmF2YSBlbSB1bSBkYWRvIGNvbW1pdCBjbGljYW5kbyBubyBhcnF1aXZvIG1vZGlmaWNhZG8gbmFxdWVsZSBjb21taXQgc2VsZWNpb25hZG8uIFBvciBleGVtcGxvLCBkaWdhbW9zIHF1ZSBldSBxdWVpcmEgdmVyIG8gYXJxdWl2byBjaGFtYWRvIGBybWFya2Rvd24tYmFzaWNzYCBkZXN0ZSBzaXRlIGVkaXRhZG8gZGlhIDAyIGRlIEFnb3N0bywgc8OzIHByZWNpc2Ftb3MgY2xpY2FyIG5vIGFycXVpdm8sIGNvbW8gbW9zdHJhZG8gbmEgaW1hZ2VtIGFiYWl4bzoNCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLG91dC53aWR0aD0iNzAlIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImZpZ3MiLCAiZ2l0LWhpc3RvcnktZmlsZS5wbmciKSkNCmBgYA0KDQojIyBBdGl2aWRhZGUNCg0KRXhwbG9yZSB1bSBwb3VjbyBvcyBjb21taXRzIHF1ZSByZWFsaXphcmFtLiBBYnJhIGEgcMOhZ2luYSBkbyBnaXRodWIgZSB0YW1iw6ltIGF0cmF2w6lzIGRvIFJzdHVkaW8sIHZlamEgYXMgZGlmZXJlbsOnYXMsIGFzIHZhbnRhbmdlbnMgZSBkZXN2YW50YWdlbnMgZGUgY2FkYSB1bWEgZGFzIGFib3JkYWdlbnMNCg0KDQojIyBUaHJvd2JhY2sgQ29tbWl0DQoNClZhbW9zIHN1cG9yIHF1ZSByZWFsaXphbW9zIHVtIGNvbW1pdCBlcnJhZG8sIGUgYWdvcmEgcXVlcmVtb3Mgdm9sdGFyIGFvIGNvbW1pdCBhbnRlcmlvciwgbWFzIHNlbSBwZXJkZXIgbyB0cmFiYWxobyBxdWUgZml6ZW1vcyBub3MgYXJxdWl2b3MuIFBhcmEgaXNzbyBwb2RlbW9zIHVzYXIgYSBhYm9yZGFnZW0gYW50ZXJpb3IsIG5hdmVnYW5kbyBlbnRyZSBvcyBhcnF1aXZvcyBlIHNlbGVjaW9uYW5kbyBvIGFycXVpdm8gcXVlIHF1ZXJlbW9zIGVtIHVtIGRldGVybWluYWRvIGVzdGFkbywgc3Vic3RpdHVpbW9zIHBlbG8gYXJxdWl2byBhdHVhbCBlIGZhemVtb3MgdW0gbm92byBjb21taXQuIEVzdGEgb3DDp8OjbyBwb2RlIHNlciBhIG1haXMgc2VndXJhIHNlIGVzdGFtb3MgY29tZcOnYW5kbyBhIG1leGVyIG5vIHZlcnNpb25hbWVudG8uIE91dHJhIG9ww6fDo28gw6kgZXhwbG9yYXIgYXMgZnVuw6fDtWVzIGRvIGdpdCBjaGFtYWRhcyBgcmVzZXRgLiBBcyBmdW7Dp8O1ZXMgcmVzZXQgYmFzaWNhbWVudGUgbW92ZSBvIEhFQUQgZG8gc2V1IGRpcmV0w7NyaW8gcGFyYSB1bSBjb21taXQgbm8gcGFzc2Fkby4gRXN0YSBhYm9yZGFnZW0gcG9kZSBjYXVzYXIgYWxndW1hcyBkb3JlcyBkZSBjYWJlw6dhIG5vIGluw61jaW8sIHBvcnRhbnRvIHJlY29tZW5kbyB1c2EtbMOhIGNvbSBjYXV0ZWxhLiBQYXJhIG1haXMgaW5mb3JtYcOnw7VlcyBzb2JyZSBpc3NvIGTDqiB1bWEgb2xoYWRhIFtuZXNzZSBzaXRlXShodHRwczovL2RldmNvbm5lY3RlZC5jb20vaG93LXRvLWdpdC1yZXNldC10by1oZWFkLyM6fjp0ZXh0PVRvJTIwaGFyZCUyMHJlc2V0JTIwZmlsZXMlMjB0byxvcHRpb24lMjBhbmQlMjBzcGVjaWZ5JTIwdGhlJTIwSEVBRC4mdGV4dD1UaGUlMjBwdXJwb3NlJTIwb2YlMjB0aGUlMjAlRTIlODAlOUNnaXQsYmVmb3JlJTIwSEVBRCUyMGFuZCUyMHNvJTIwb24pLikNCg0KDQojIEludXRpbGlkYWRlcyBww7pibGljYXMgbmVjZXNzw6FyaWFzDQoNCk5vIGZpbSBkbyBkaWEsIGFwcmVuZGVtb3MgZmF6ZXIgY29tbWl0cyBhcGVuYXMgcGFyYSB1dGlsaXphciBlc3NhIGZlcnJhbWVudGEgW2FxdWldKGh0dHBzOi8vc3RhcmxvZ3MuZGV2LykuIENvbGUgbyBsaW5rIGRlIHNldSByZXBvc2l0w7NyaW8gY29udGVuZG8gYWxndW5zIGNvbW1pdHMgZSB2ZWphIG8gcXVlIGFjb250ZWNlDQoNCg==