{"action":"created","comment":{"url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/comments/170593994","pull_request_review_id":99298886,"id":170593994,"diff_hunk":"@@ -0,0 +1,363 @@\n+﻿using NuGet.Common;\n+using NuGet.Packaging.Signing;\n+using NuGetPackageExplorer.Types;\n+using System;\n+using System.IO;\n+using System.Security.Cryptography.X509Certificates;\n+using System.Threading;\n+using System.Threading.Tasks;\n+using System.Windows.Input;\n+\n+namespace PackageExplorerViewModel\n+{\n+    public class SignPackageViewModel : ViewModelBase, IDisposable\n+    {\n+        // https://github.com/NuGet/NuGet.Client/blob/a05632928e11d51b81d2299ba071334a16ce17a9/src/NuGet.Core/NuGet.Commands/SignCommand/CertificateProvider.cs#L22\n+        private const int ERROR_INVALID_PASSWORD_HRESULT = unchecked((int)0x80070056);\n+\n+        private readonly PackageViewModel _packageViewModel;\n+        private readonly IUIServices _uiServices;\n+        private string _certificateFileName;\n+        private X509Certificate2 _certificate;\n+        private string _password;\n+        private bool _showPassword;\n+        private string _status;\n+        private bool _hasError;\n+        private bool _showProgress;\n+        private bool _canSign;\n+        private Timer _certificateValidationTimer;\n+        private SemaphoreSlim _certificateValidationSemaphore;\n+\n+        public SignPackageViewModel(PackageViewModel viewModel, IUIServices uiServices)\n+        {\n+            _uiServices = uiServices;\n+            _packageViewModel = viewModel;\n+\n+            SelectCertificateFileCommand = new RelayCommand(SelectCertificateFileCommandExecute);\n+            SelectCertificateStoreCommand = new RelayCommand(SelectCertificateStoreCommandExecute);\n+            ShowCertificateCommand = new RelayCommand(ShowCertificateCommandExecute);\n+        }\n+\n+        public string Id => _packageViewModel.PackageMetadata.Id;\n+\n+        public string Version => _packageViewModel.PackageMetadata.Version.ToFullString();\n+\n+        public string CertificateFileName\n+        {\n+            get => _certificateFileName;\n+            set\n+            {\n+                _certificateFileName = value;\n+                OnPropertyChanged();\n+                ValidateCertificate();\n+            }\n+        }\n+\n+        public X509Certificate2 Certificate\n+        {\n+            get => _certificate;\n+            set\n+            {\n+                if (_certificate != value)\n+                {\n+                    _certificate?.Dispose();\n+                }\n+\n+                _certificate = value;\n+                OnPropertyChanged();\n+            }\n+        }\n+\n+        public string Password\n+        {\n+            get => _password;\n+            set\n+            {\n+                _password = value;\n+                OnPropertyChanged();\n+                ValidateCertificate();\n+            }\n+        }\n+\n+        public bool ShowPassword\n+        {\n+            get => _showPassword;\n+            set\n+            {\n+                _showPassword = value;\n+                OnPropertyChanged();\n+            }\n+        }\n+\n+        public ICommand SelectCertificateFileCommand { get; }\n+\n+        public ICommand SelectCertificateStoreCommand { get; }\n+\n+        public ICommand ShowCertificateCommand { get; }\n+\n+        public bool HasError\n+        {\n+            get => _hasError;\n+            set\n+            {\n+                if (_hasError != value)\n+                {\n+                    _hasError = value;\n+                    OnPropertyChanged();\n+                }\n+            }\n+        }\n+\n+        public string Status\n+        {\n+            get => _status;\n+            set\n+            {\n+                if (_status != value)\n+                {\n+                    _status = value;\n+                    OnPropertyChanged();\n+                }\n+            }\n+        }\n+\n+        public bool ShowProgress\n+        {\n+            get => _showProgress;\n+            set\n+            {\n+                _showProgress = value;\n+                OnPropertyChanged();\n+            }\n+        }\n+\n+        public bool CanSign\n+        {\n+            get => _canSign;\n+            set\n+            {\n+                _canSign = value;\n+                OnPropertyChanged();\n+            }\n+        }\n+\n+        private void SelectCertificateFileCommandExecute()\n+        {\n+            if (_uiServices.OpenFileDialog(\"Select Certificate\", \"Certificate (*.pfx, *.p12)|*.pfx;*.p12|All files (*.*)|*.*\", out var fileName))\n+            {\n+                CertificateFileName = fileName;\n+            }\n+        }\n+\n+        private void SelectCertificateStoreCommandExecute()\n+        {\n+            try\n+            {\n+                using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser))\n+                {\n+                    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);\n+\n+                    // https://github.com/NuGet/NuGet.Client/blob/adfe6d5c37834e8eb11453518e4508a534c15f8d/src/NuGet.Core/NuGet.Commands/SignCommand/SignCommandRunner.cs#L271-L283\n+                    var collection = new X509Certificate2Collection();\n+\n+                    foreach (var certificate in store.Certificates)\n+                    {\n+                        if (CertificateUtility.IsValidForPurposeFast(certificate, Oids.CodeSigningEku))\n+                        {\n+                            collection.Add(certificate);\n+                        }\n+                    }\n+\n+                    var certificates = X509Certificate2UI.SelectFromCollection(\n+                        collection,\n+                        \"Choose a Certificate for Package Signing\",\n+                        \"Provide the code signing certificate for signing the package.\",\n+                        X509SelectionFlag.SingleSelection);\n+\n+                    if (certificates.Count > 0)\n+                    {\n+                        Certificate = certificates[0];\n+                        CertificateFileName = null;\n+                        ShowPassword = false;\n+                    }\n+                }\n+            }\n+            catch (Exception ex)\n+            {\n+                OnError(ex);\n+            }\n+        }\n+\n+        private void ShowCertificateCommandExecute()\n+        {\n+            var certificate = Certificate;\n+            if (certificate != null)\n+            {\n+                try\n+                {\n+                    X509Certificate2UI.DisplayCertificate(certificate);\n+                }\n+                catch { }\n+            }\n+        }\n+\n+        // https://github.com/NuGet/NuGet.Client/blob/4c0c9658445573845ddbeff5656e4b3129f727a2/src/NuGet.Core/NuGet.Commands/SignCommand/SignCommandRunner.cs\n+        public async Task<string> SignPackage()\n+        {\n+            ShowProgress = true;\n+            CanSign = false;\n+            Status = \"Signing package...\";\n+\n+            try\n+            {\n+                // change to AuthorSignPackageRequest when NuGet.Client is updated\n+                using (var tempCertificate = new X509Certificate2(Certificate))\n+                using (var signRequest = new SignPackageRequest(tempCertificate, GetHashAlgorithmName(tempCertificate)))\n+                {\n+                    SigningUtility.Verify(signRequest, NullLogger.Instance);\n+\n+                    var packagePath = _packageViewModel.GetCurrentPackageTempFile();\n+                    var originalPackageCopyPath = Path.GetTempFileName();\n+\n+                    File.Copy(packagePath, originalPackageCopyPath, overwrite: true);\n+\n+                    using (var packageReadStream = File.OpenRead(packagePath))","path":"PackageViewModel/SignPackageViewModel.cs","position":224,"original_position":224,"commit_id":"b2a065e26fecab7ffb260d6c0bb5c2ec6e7efa3d","original_commit_id":"b2a065e26fecab7ffb260d6c0bb5c2ec6e7efa3d","user":{"login":"onovotny","id":1427284,"avatar_url":"https://avatars2.githubusercontent.com/u/1427284?v=4","gravatar_id":"","url":"https://api.github.com/users/onovotny","html_url":"https://github.com/onovotny","followers_url":"https://api.github.com/users/onovotny/followers","following_url":"https://api.github.com/users/onovotny/following{/other_user}","gists_url":"https://api.github.com/users/onovotny/gists{/gist_id}","starred_url":"https://api.github.com/users/onovotny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/onovotny/subscriptions","organizations_url":"https://api.github.com/users/onovotny/orgs","repos_url":"https://api.github.com/users/onovotny/repos","events_url":"https://api.github.com/users/onovotny/events{/privacy}","received_events_url":"https://api.github.com/users/onovotny/received_events","type":"User","site_admin":false},"body":"The code in here should support overwriting signatures; there's a slightly different code path for that if a package is already signed.","created_at":"2018-02-26T13:42:52Z","updated_at":"2018-02-26T13:47:22Z","html_url":"https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/pull/371#discussion_r170593994","pull_request_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/371","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/comments/170593994"},"html":{"href":"https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/pull/371#discussion_r170593994"},"pull_request":{"href":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/371"}}},"pull_request":{"url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/371","id":171258376,"html_url":"https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/pull/371","diff_url":"https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/pull/371.diff","patch_url":"https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/pull/371.patch","issue_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/issues/371","number":371,"state":"open","locked":false,"title":"[WIP] add sign package dialog","user":{"login":"campersau","id":4009570,"avatar_url":"https://avatars1.githubusercontent.com/u/4009570?v=4","gravatar_id":"","url":"https://api.github.com/users/campersau","html_url":"https://github.com/campersau","followers_url":"https://api.github.com/users/campersau/followers","following_url":"https://api.github.com/users/campersau/following{/other_user}","gists_url":"https://api.github.com/users/campersau/gists{/gist_id}","starred_url":"https://api.github.com/users/campersau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/campersau/subscriptions","organizations_url":"https://api.github.com/users/campersau/orgs","repos_url":"https://api.github.com/users/campersau/repos","events_url":"https://api.github.com/users/campersau/events{/privacy}","received_events_url":"https://api.github.com/users/campersau/received_events","type":"User","site_admin":false},"body":"Add support for signing packages using a sign package dialog.\r\nAdded new `Sign and Save As...` menu item.\r\n\r\n- Currently does not update the currently editing package metadata.\r\n\r\n- Using the hash algorithm defined in the certificate. ~~Currently always using the default hash algorith name: [SHA256](https://github.com/NuGet/NuGet.Client/blob/2847a3808d3cbcdb27fdfb9dfbaf95cd3ed95a57/src/NuGet.Clients/NuGet.CommandLine/Common/CommandLineUtility.cs#L55)~~\r\n\r\n- Currently no option to provide a custom [ITimestampProvider](https://github.com/NuGet/NuGet.Client/blob/dde7f1939f5c212f7db9b8e8576cf10414f6c1c3/src/NuGet.Core/NuGet.Packaging/Signing/Timestamp/Rfc3161TimestampProvider.cs)\r\n\r\n- Currently the last choosen certificate is not remembered during a NuGetPackageExplorer session.\r\n\r\n- Currently does not remember the last used certificate across NuGetpackageExplorer sessions.\r\n\r\nCopied a lot from https://github.com/NuGet/NuGet.Client/blob/4c0c9658445573845ddbeff5656e4b3129f727a2/src/NuGet.Core/NuGet.Commands/SignCommand/SignCommandRunner.cs\r\n\r\n![image](https://user-images.githubusercontent.com/4009570/36670407-8526c0dc-1af8-11e8-93db-d12cd9fc3e05.png)\r\n\r\n![image](https://user-images.githubusercontent.com/4009570/36670458-b2f6c8cc-1af8-11e8-8591-43c749fb12b5.png)\r\n\r\n![image](https://user-images.githubusercontent.com/4009570/36670648-3e3de154-1af9-11e8-9a83-366b6f98f874.png)\r\n\r\n![image](https://user-images.githubusercontent.com/4009570/36670476-caf619d2-1af8-11e8-868b-778e153dac0c.png)\r\n\r\nfixes https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/issues/292","created_at":"2018-02-25T23:28:10Z","updated_at":"2018-02-26T13:47:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bba7ddf249e2ac3311cfbd584894595ebc1fb1da","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/371/commits","review_comments_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/371/comments","review_comment_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/comments{/number}","comments_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/issues/371/comments","statuses_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/statuses/b2a065e26fecab7ffb260d6c0bb5c2ec6e7efa3d","head":{"label":"campersau:signing","ref":"signing","sha":"b2a065e26fecab7ffb260d6c0bb5c2ec6e7efa3d","user":{"login":"campersau","id":4009570,"avatar_url":"https://avatars1.githubusercontent.com/u/4009570?v=4","gravatar_id":"","url":"https://api.github.com/users/campersau","html_url":"https://github.com/campersau","followers_url":"https://api.github.com/users/campersau/followers","following_url":"https://api.github.com/users/campersau/following{/other_user}","gists_url":"https://api.github.com/users/campersau/gists{/gist_id}","starred_url":"https://api.github.com/users/campersau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/campersau/subscriptions","organizations_url":"https://api.github.com/users/campersau/orgs","repos_url":"https://api.github.com/users/campersau/repos","events_url":"https://api.github.com/users/campersau/events{/privacy}","received_events_url":"https://api.github.com/users/campersau/received_events","type":"User","site_admin":false},"repo":{"id":49637838,"name":"NuGetPackageExplorer","full_name":"campersau/NuGetPackageExplorer","owner":{"login":"campersau","id":4009570,"avatar_url":"https://avatars1.githubusercontent.com/u/4009570?v=4","gravatar_id":"","url":"https://api.github.com/users/campersau","html_url":"https://github.com/campersau","followers_url":"https://api.github.com/users/campersau/followers","following_url":"https://api.github.com/users/campersau/following{/other_user}","gists_url":"https://api.github.com/users/campersau/gists{/gist_id}","starred_url":"https://api.github.com/users/campersau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/campersau/subscriptions","organizations_url":"https://api.github.com/users/campersau/orgs","repos_url":"https://api.github.com/users/campersau/repos","events_url":"https://api.github.com/users/campersau/events{/privacy}","received_events_url":"https://api.github.com/users/campersau/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/campersau/NuGetPackageExplorer","description":"Move from Codeplex (https://npe.codeplex.com)","fork":true,"url":"https://api.github.com/repos/campersau/NuGetPackageExplorer","forks_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/forks","keys_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/teams","hooks_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/hooks","issue_events_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/issues/events{/number}","events_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/events","assignees_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/assignees{/user}","branches_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/branches{/branch}","tags_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/tags","blobs_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/git/refs{/sha}","trees_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/statuses/{sha}","languages_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/languages","stargazers_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/stargazers","contributors_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/contributors","subscribers_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/subscribers","subscription_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/subscription","commits_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/commits{/sha}","git_commits_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/git/commits{/sha}","comments_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/comments{/number}","issue_comment_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/issues/comments{/number}","contents_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/contents/{+path}","compare_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/merges","archive_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/downloads","issues_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/issues{/number}","pulls_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/pulls{/number}","milestones_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/milestones{/number}","notifications_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/labels{/name}","releases_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/releases{/id}","deployments_url":"https://api.github.com/repos/campersau/NuGetPackageExplorer/deployments","created_at":"2016-01-14T09:42:41Z","updated_at":"2016-01-14T09:42:43Z","pushed_at":"2018-02-26T12:23:28Z","git_url":"git://github.com/campersau/NuGetPackageExplorer.git","ssh_url":"git@github.com:campersau/NuGetPackageExplorer.git","clone_url":"https://github.com/campersau/NuGetPackageExplorer.git","svn_url":"https://github.com/campersau/NuGetPackageExplorer","homepage":"","size":5113,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"NuGetPackageExplorer:master","ref":"master","sha":"cdf3abacfc66363b49f6ccbb1968334aa8eb1948","user":{"login":"NuGetPackageExplorer","id":15967039,"avatar_url":"https://avatars3.githubusercontent.com/u/15967039?v=4","gravatar_id":"","url":"https://api.github.com/users/NuGetPackageExplorer","html_url":"https://github.com/NuGetPackageExplorer","followers_url":"https://api.github.com/users/NuGetPackageExplorer/followers","following_url":"https://api.github.com/users/NuGetPackageExplorer/following{/other_user}","gists_url":"https://api.github.com/users/NuGetPackageExplorer/gists{/gist_id}","starred_url":"https://api.github.com/users/NuGetPackageExplorer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NuGetPackageExplorer/subscriptions","organizations_url":"https://api.github.com/users/NuGetPackageExplorer/orgs","repos_url":"https://api.github.com/users/NuGetPackageExplorer/repos","events_url":"https://api.github.com/users/NuGetPackageExplorer/events{/privacy}","received_events_url":"https://api.github.com/users/NuGetPackageExplorer/received_events","type":"Organization","site_admin":false},"repo":{"id":42267778,"name":"NuGetPackageExplorer","full_name":"NuGetPackageExplorer/NuGetPackageExplorer","owner":{"login":"NuGetPackageExplorer","id":15967039,"avatar_url":"https://avatars3.githubusercontent.com/u/15967039?v=4","gravatar_id":"","url":"https://api.github.com/users/NuGetPackageExplorer","html_url":"https://github.com/NuGetPackageExplorer","followers_url":"https://api.github.com/users/NuGetPackageExplorer/followers","following_url":"https://api.github.com/users/NuGetPackageExplorer/following{/other_user}","gists_url":"https://api.github.com/users/NuGetPackageExplorer/gists{/gist_id}","starred_url":"https://api.github.com/users/NuGetPackageExplorer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NuGetPackageExplorer/subscriptions","organizations_url":"https://api.github.com/users/NuGetPackageExplorer/orgs","repos_url":"https://api.github.com/users/NuGetPackageExplorer/repos","events_url":"https://api.github.com/users/NuGetPackageExplorer/events{/privacy}","received_events_url":"https://api.github.com/users/NuGetPackageExplorer/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NuGetPackageExplorer/NuGetPackageExplorer","description":"Create, update and deploy Nuget Packages with a GUI","fork":false,"url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer","forks_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/forks","keys_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/teams","hooks_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/hooks","issue_events_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/issues/events{/number}","events_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/events","assignees_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/assignees{/user}","branches_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/branches{/branch}","tags_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/tags","blobs_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/git/refs{/sha}","trees_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/statuses/{sha}","languages_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/languages","stargazers_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/stargazers","contributors_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/contributors","subscribers_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/subscribers","subscription_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/subscription","commits_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/commits{/sha}","git_commits_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/git/commits{/sha}","comments_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/comments{/number}","issue_comment_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/issues/comments{/number}","contents_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/contents/{+path}","compare_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/merges","archive_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/downloads","issues_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/issues{/number}","pulls_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls{/number}","milestones_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/milestones{/number}","notifications_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/labels{/name}","releases_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/releases{/id}","deployments_url":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/deployments","created_at":"2015-09-10T20:03:04Z","updated_at":"2018-02-26T05:27:22Z","pushed_at":"2018-02-26T12:23:30Z","git_url":"git://github.com/NuGetPackageExplorer/NuGetPackageExplorer.git","ssh_url":"git@github.com:NuGetPackageExplorer/NuGetPackageExplorer.git","clone_url":"https://github.com/NuGetPackageExplorer/NuGetPackageExplorer.git","svn_url":"https://github.com/NuGetPackageExplorer/NuGetPackageExplorer","homepage":"","size":5092,"stargazers_count":746,"watchers_count":746,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":150,"mirror_url":null,"archived":false,"open_issues_count":19,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":150,"open_issues":19,"watchers":746,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/371"},"html":{"href":"https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/pull/371"},"issue":{"href":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/issues/371"},"comments":{"href":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/issues/371/comments"},"review_comments":{"href":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/371/comments"},"review_comment":{"href":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/pulls/371/commits"},"statuses":{"href":"https://api.github.com/repos/NuGetPackageExplorer/NuGetPackageExplorer/statuses/b2a065e26fecab7ffb260d6c0bb5c2ec6e7efa3d"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"onovotny"}}