{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/152460738","pull_request_review_id":78326022,"id":152460738,"diff_hunk":"@@ -0,0 +1,5246 @@\n+// Licensed to the .NET Foundation under one or more agreements.\n+// The .NET Foundation licenses this file to you under the MIT license.\n+// See the LICENSE file in the project root for more information.\n+\n+using System.Buffers;\n+using System.Collections.Generic;\n+using System.Diagnostics;\n+using System.Numerics;\n+using System.Runtime.InteropServices;\n+using System.Text;\n+\n+namespace System.Security.Cryptography.Asn1\n+{\n+    // Uses a masked overlay of the tag class encoding.\n+    // T-REC-X.690-201508 sec 8.1.2.2\n+    internal enum TagClass : byte\n+    {\n+        Universal = 0,\n+        Application = 0b0100_0000,\n+        ContextSpecific = 0b1000_0000,\n+        Private = 0b1100_0000,\n+    }\n+\n+    internal enum UniversalTagNumber\n+    {\n+        EndOfContents = 0,\n+        Boolean = 1,\n+        Integer = 2,\n+        BitString = 3,\n+        OctetString = 4,\n+        Null = 5,\n+        ObjectIdentifier = 6,\n+        ObjectDescriptor = 7,\n+        External = 8,\n+        InstanceOf = External,\n+        Real = 9,\n+        Enumerated = 10,\n+        Embedded = 11,\n+        UTF8String = 12,\n+        RelativeObjectIdentifier = 13,\n+        Time = 14,\n+        // 15 is reserved\n+        Sequence = 16,\n+        SequenceOf = Sequence,\n+        Set = 17,\n+        SetOf = Set,\n+        NumericString = 18,\n+        PrintableString = 19,\n+        TeletexString = 20,\n+        T61String = TeletexString,\n+        VideotexString = 21,\n+        IA5String = 22,\n+        UtcTime = 23,\n+        GeneralizedTime = 24,\n+        GraphicString = 25,\n+        VisibleString = 26,\n+        ISO646String = VisibleString,\n+        GeneralString = 27,\n+        UniversalString = 28,\n+        UnrestrictedCharacterString = 29,\n+        BMPString = 30,\n+        Date = 31,\n+        TimeOfDay = 32,\n+        DateTime = 33,\n+        Duration = 34,\n+    }\n+\n+    internal enum NamedBitListMode\n+    {\n+        /// <summary>\n+        /// In <c>BIT STRING { a(0), j(9) }</c> map <c>a | j</c> to the value <c>0x0201</c>\n+        /// </summary>\n+        NamedZeroIsOne,\n+        /// <summary>\n+        /// In <c>BIT STRING { a(0), j(9) }</c> map <c>a | j</c> to the value <c>0x4080</c>\n+        /// </summary>\n+        NamedZeroIs128LittleEndian,\n+        /// <summary>\n+        /// In <c>BIT STRING { a(0), j(9) }</c> map <c>a | j</c> to the value <c>0x8040</c>\n+        /// </summary>\n+        NamedZeroIs128BigEndian,\n+    }\n+\n+    internal struct Asn1Tag\n+    {\n+        private const byte ClassMask = 0b1100_0000;\n+        private const byte ConstructedMask = 0b0010_0000;\n+        private const byte ControlMask = ClassMask | ConstructedMask;\n+        private const byte TagNumberMask = 0b0001_1111;\n+\n+        internal static readonly Asn1Tag EndOfContents = new Asn1Tag(0);\n+        internal static readonly Asn1Tag Null = new Asn1Tag(5);\n+\n+        private readonly byte _controlFlags;\n+        private readonly int _tagValue;\n+\n+        public TagClass TagClass => (TagClass)(_controlFlags & ClassMask);\n+        public bool IsConstructed => (_controlFlags & ConstructedMask) == ConstructedMask;\n+        public int TagValue => _tagValue;\n+\n+        private Asn1Tag(byte controlFlags, int tagValue)\n+        {\n+            _controlFlags = (byte)(controlFlags & ControlMask);\n+            _tagValue = tagValue;\n+        }\n+\n+        public Asn1Tag(UniversalTagNumber universalTagNumber, bool isConstructed = false)\n+            : this(isConstructed ? ConstructedMask : (byte)0, (int)universalTagNumber)\n+        {\n+            const UniversalTagNumber ReservedIndex = (UniversalTagNumber)15;\n+\n+            if (universalTagNumber < UniversalTagNumber.EndOfContents ||\n+                universalTagNumber > UniversalTagNumber.Duration ||\n+                universalTagNumber == ReservedIndex)\n+            {\n+                throw new ArgumentOutOfRangeException(nameof(universalTagNumber), universalTagNumber, null);\n+            }\n+        }\n+\n+        public Asn1Tag(TagClass tagClass, int tagValue, bool isConstructed = false)\n+            : this((byte)((byte)tagClass | (isConstructed ? ConstructedMask : 0)), tagValue)\n+        {\n+            if (tagClass < TagClass.Universal || tagClass > TagClass.Private)\n+            {\n+                throw new ArgumentOutOfRangeException(nameof(tagClass), tagClass, null);\n+            }\n+        }\n+\n+        public Asn1Tag(byte singleByteEncoding)\n+        {\n+            Span<byte> span = stackalloc byte[1];\n+            span[0] = singleByteEncoding;\n+\n+            if (TryParse(span, out Asn1Tag parsed, out int bytesRead))\n+            {\n+                Debug.Assert(bytesRead == 1);\n+                _controlFlags = parsed._controlFlags;\n+                _tagValue = parsed._tagValue;\n+            }\n+            else\n+            {\n+                throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding);\n+            }\n+        }\n+\n+        public static bool TryParse(ReadOnlySpan<byte> source, out Asn1Tag tag, out int bytesRead)\n+        {\n+            tag = default(Asn1Tag);\n+            bytesRead = 0;\n+\n+            if (source.IsEmpty)\n+                return false;\n+\n+            byte first = source[bytesRead];\n+            bytesRead++;\n+            uint tagValue = (uint)(first & TagNumberMask);\n+\n+            if (tagValue == TagNumberMask)\n+            {\n+                // Multi-byte encoding\n+                // T-REC-X.690-201508 sec 8.1.2.4\n+                const byte ContinuationFlag = 0x80;\n+                const byte ValueMask = ContinuationFlag - 1;\n+\n+                tagValue = 0;\n+                byte current;\n+\n+                do\n+                {\n+                    if (source.Length <= bytesRead)\n+                    {\n+                        bytesRead = 0;\n+                        return false;\n+                    }\n+\n+                    current = source[bytesRead];\n+                    byte currentValue = (byte)(current & ValueMask);\n+                    bytesRead++;\n+\n+                    // The first byte cannot have the value 0 (T-REC-X.690-201508 sec 8.1.2.4.2.c)\n+                    if (currentValue == 0 && tagValue == 0)\n+                    {\n+                        bytesRead = 0;\n+                        throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding);\n+                    }\n+\n+                    // If TooBigToShift is shifted left 7, the content bit shifts out.\n+                    // So any value greater than or equal to this cannot be shifted without loss.\n+                    const int TooBigToShift = 0b00000010_00000000_00000000_00000000;\n+\n+                    if (tagValue >= TooBigToShift)\n+                    {\n+                        bytesRead = 0;\n+                        throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding);\n+                    }\n+\n+                    tagValue <<= 7;\n+                    tagValue |= currentValue;\n+                }\n+                while ((current & ContinuationFlag) == ContinuationFlag);\n+\n+                // This encoding is only valid for tag values greater than 30.\n+                // (T-REC-X.690-201508 sec 8.1.2.3, 8.1.2.4)\n+\n+                if (tagValue <= 30)\n+                {\n+                    bytesRead = 0;\n+                    throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding);\n+                }\n+\n+                // There's not really any ambiguity, but prevent negative numbers from showing up.\n+                if (tagValue > int.MaxValue)\n+                {\n+                    bytesRead = 0;\n+                    throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding);\n+                }\n+            }\n+\n+            tag = new Asn1Tag(first, (int)tagValue);\n+            return true;\n+        }\n+\n+        public int CalculateEncodedSize()\n+        {\n+            const int SevenBits = 0b0111_1111;\n+            const int FourteenBits = 0b0011_1111_1111_1111;\n+            const int TwentyOneBits = 0b0001_1111_1111_1111_1111_1111;\n+            const int TwentyEightBits = 0b0000_1111_1111_1111_1111_1111_1111_1111;\n+\n+            if (TagValue < TagNumberMask)\n+                return 1;\n+            if (TagValue <= SevenBits)\n+                return 2;\n+            if (TagValue <= FourteenBits)\n+                return 3;\n+            if (TagValue <= TwentyOneBits)\n+                return 4;\n+            if (TagValue <= TwentyEightBits)\n+                return 5;\n+\n+            return 6;\n+        }\n+\n+        public bool TryWrite(Span<byte> destination, out int bytesWritten)\n+        {\n+            int spaceRequired = CalculateEncodedSize();\n+\n+            if (destination.Length < spaceRequired)\n+            {\n+                bytesWritten = 0;\n+                return false;\n+            }\n+\n+            if (spaceRequired == 1)\n+            {\n+                byte value = (byte)(_controlFlags | TagValue);\n+                destination[0] = value;\n+                bytesWritten = 1;\n+                return true;\n+            }\n+\n+            byte firstByte = (byte)(_controlFlags | TagNumberMask);\n+            destination[0] = firstByte;\n+\n+            int remaining = TagValue;\n+            int idx = spaceRequired - 1;\n+\n+            while (remaining > 0)\n+            {\n+                int segment = remaining & 0x7F;\n+\n+                // The last byte doesn't get the marker, which we write first.\n+                if (remaining != TagValue)\n+                {\n+                    segment |= 0x80;\n+                }\n+\n+                Debug.Assert(segment <= byte.MaxValue);\n+                destination[idx] = (byte)segment;\n+                remaining >>= 7;\n+                idx--;\n+            }\n+\n+            Debug.Assert(idx == 0);\n+            bytesWritten = spaceRequired;\n+            return true;\n+        }\n+\n+        public bool Equals(Asn1Tag other)\n+        {\n+            return _controlFlags == other._controlFlags && _tagValue == other._tagValue;\n+        }\n+\n+        public override bool Equals(object obj)\n+        {\n+            if (ReferenceEquals(null, obj)) return false;\n+            return obj is Asn1Tag && Equals((Asn1Tag)obj);\n+        }\n+\n+        public override int GetHashCode()\n+        {\n+            // Most TagValue values will be in the 0-30 range,\n+            // the GetHashCode value only has collisions when TagValue is\n+            // between 2^29 and uint.MaxValue\n+            return (_controlFlags << 24) ^ _tagValue;\n+        }\n+\n+        public static bool operator ==(Asn1Tag left, Asn1Tag right)\n+        {\n+            return left.Equals(right);\n+        }\n+\n+        public static bool operator !=(Asn1Tag left, Asn1Tag right)\n+        {\n+            return !left.Equals(right);\n+        }\n+\n+        public override string ToString()\n+        {\n+            const string ConstructedPrefix = \"Constructed \";\n+            string classAndValue;\n+\n+            if (TagClass == TagClass.Universal)\n+            {\n+                classAndValue = ((UniversalTagNumber)TagValue).ToString();\n+            }\n+            else\n+            {\n+                classAndValue = TagClass + \"-\" + TagValue;\n+            }\n+\n+            if (IsConstructed)\n+            {\n+                return ConstructedPrefix + classAndValue;\n+            }\n+\n+            return classAndValue;\n+        }\n+    }\n+\n+    internal enum AsnEncodingRules","path":"src/Common/src/System/Security/Cryptography/Asn1V2.cs","position":341,"original_position":341,"commit_id":"951562711fb306b27fe5f34bd4e63d278f906256","original_commit_id":"951562711fb306b27fe5f34bd4e63d278f906256","user":{"login":"GrabYourPitchforks","id":1746272,"avatar_url":"https://avatars0.githubusercontent.com/u/1746272?v=4","gravatar_id":"","url":"https://api.github.com/users/GrabYourPitchforks","html_url":"https://github.com/GrabYourPitchforks","followers_url":"https://api.github.com/users/GrabYourPitchforks/followers","following_url":"https://api.github.com/users/GrabYourPitchforks/following{/other_user}","gists_url":"https://api.github.com/users/GrabYourPitchforks/gists{/gist_id}","starred_url":"https://api.github.com/users/GrabYourPitchforks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GrabYourPitchforks/subscriptions","organizations_url":"https://api.github.com/users/GrabYourPitchforks/orgs","repos_url":"https://api.github.com/users/GrabYourPitchforks/repos","events_url":"https://api.github.com/users/GrabYourPitchforks/events{/privacy}","received_events_url":"https://api.github.com/users/GrabYourPitchforks/received_events","type":"User","site_admin":false},"body":"Why the duplication?","created_at":"2017-11-22T03:20:22Z","updated_at":"2017-11-22T03:20:22Z","html_url":"https://github.com/dotnet/corefx/pull/25296#discussion_r152460738","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/25296","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/152460738"},"html":{"href":"https://github.com/dotnet/corefx/pull/25296#discussion_r152460738"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/25296"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/25296","id":153108710,"html_url":"https://github.com/dotnet/corefx/pull/25296","diff_url":"https://github.com/dotnet/corefx/pull/25296.diff","patch_url":"https://github.com/dotnet/corefx/pull/25296.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/25296","number":25296,"state":"open","locked":false,"title":"Create a Memory/Span-based ASN.1 reader and writer","user":{"login":"bartonjs","id":10642668,"avatar_url":"https://avatars3.githubusercontent.com/u/10642668?v=4","gravatar_id":"","url":"https://api.github.com/users/bartonjs","html_url":"https://github.com/bartonjs","followers_url":"https://api.github.com/users/bartonjs/followers","following_url":"https://api.github.com/users/bartonjs/following{/other_user}","gists_url":"https://api.github.com/users/bartonjs/gists{/gist_id}","starred_url":"https://api.github.com/users/bartonjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bartonjs/subscriptions","organizations_url":"https://api.github.com/users/bartonjs/orgs","repos_url":"https://api.github.com/users/bartonjs/repos","events_url":"https://api.github.com/users/bartonjs/events{/privacy}","received_events_url":"https://api.github.com/users/bartonjs/received_events","type":"User","site_admin":false},"body":"The AsnReader type can read any BER-encoded value for the types that it supports (for tag values up to int.MaxValue).  It also understands the CER and DER restrictions, and when reading in those modes it will enforce the restrictions that those encoding rulesets dictate.\r\n\r\nThe AsnWriter type mostly writes in DER (except where CER demands a different encoding). The only significant \"BER-relaxation\" it takes is that closing a SET OF value will not sort the contents.\r\n\r\nUnlike its predecessor, the DerEncoder class, AsnWriter never involves `byte[][]`.\r\n\r\nThe reader and writer (and helper classes) are all in one file because they're expected to be consumed as shared source until we're fully happy with things, then it can become public API and split into multiple files accordingly.\r\n\r\nReference materials:\r\n* [ITU-T-REC-X.680-201508](https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-X.680-201508-I!!PDF-E&type=items) (ASN.1 language, and some semantics behind the values)\r\n* [ITU-T-REC-X.690-201508](https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-X.690-201508-I!!PDF-E&type=items) (the BER encoding family (BER, CER, DER)).","created_at":"2017-11-16T17:52:38Z","updated_at":"2017-11-22T03:20:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9d993b6baf77885490b113dd2746f038718a02fd","assignee":{"login":"bartonjs","id":10642668,"avatar_url":"https://avatars3.githubusercontent.com/u/10642668?v=4","gravatar_id":"","url":"https://api.github.com/users/bartonjs","html_url":"https://github.com/bartonjs","followers_url":"https://api.github.com/users/bartonjs/followers","following_url":"https://api.github.com/users/bartonjs/following{/other_user}","gists_url":"https://api.github.com/users/bartonjs/gists{/gist_id}","starred_url":"https://api.github.com/users/bartonjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bartonjs/subscriptions","organizations_url":"https://api.github.com/users/bartonjs/orgs","repos_url":"https://api.github.com/users/bartonjs/repos","events_url":"https://api.github.com/users/bartonjs/events{/privacy}","received_events_url":"https://api.github.com/users/bartonjs/received_events","type":"User","site_admin":false},"assignees":[{"login":"bartonjs","id":10642668,"avatar_url":"https://avatars3.githubusercontent.com/u/10642668?v=4","gravatar_id":"","url":"https://api.github.com/users/bartonjs","html_url":"https://github.com/bartonjs","followers_url":"https://api.github.com/users/bartonjs/followers","following_url":"https://api.github.com/users/bartonjs/following{/other_user}","gists_url":"https://api.github.com/users/bartonjs/gists{/gist_id}","starred_url":"https://api.github.com/users/bartonjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bartonjs/subscriptions","organizations_url":"https://api.github.com/users/bartonjs/orgs","repos_url":"https://api.github.com/users/bartonjs/repos","events_url":"https://api.github.com/users/bartonjs/events{/privacy}","received_events_url":"https://api.github.com/users/bartonjs/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"ianhays","id":2606879,"avatar_url":"https://avatars0.githubusercontent.com/u/2606879?v=4","gravatar_id":"","url":"https://api.github.com/users/ianhays","html_url":"https://github.com/ianhays","followers_url":"https://api.github.com/users/ianhays/followers","following_url":"https://api.github.com/users/ianhays/following{/other_user}","gists_url":"https://api.github.com/users/ianhays/gists{/gist_id}","starred_url":"https://api.github.com/users/ianhays/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianhays/subscriptions","organizations_url":"https://api.github.com/users/ianhays/orgs","repos_url":"https://api.github.com/users/ianhays/repos","events_url":"https://api.github.com/users/ianhays/events{/privacy}","received_events_url":"https://api.github.com/users/ianhays/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/dotnet/corefx/milestones/12","html_url":"https://github.com/dotnet/corefx/milestone/12","labels_url":"https://api.github.com/repos/dotnet/corefx/milestones/12/labels","id":2323293,"number":12,"title":"2.1.0","description":".NET Core 2.1, next major release. See [official release dates](https://github.com/dotnet/core/blob/master/roadmap.md) for details.","creator":{"login":"karelz","id":5776068,"avatar_url":"https://avatars2.githubusercontent.com/u/5776068?v=4","gravatar_id":"","url":"https://api.github.com/users/karelz","html_url":"https://github.com/karelz","followers_url":"https://api.github.com/users/karelz/followers","following_url":"https://api.github.com/users/karelz/following{/other_user}","gists_url":"https://api.github.com/users/karelz/gists{/gist_id}","starred_url":"https://api.github.com/users/karelz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/karelz/subscriptions","organizations_url":"https://api.github.com/users/karelz/orgs","repos_url":"https://api.github.com/users/karelz/repos","events_url":"https://api.github.com/users/karelz/events{/privacy}","received_events_url":"https://api.github.com/users/karelz/received_events","type":"User","site_admin":false},"open_issues":406,"closed_issues":3504,"state":"open","created_at":"2017-02-15T02:14:11Z","updated_at":"2017-11-22T02:45:34Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/25296/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/25296/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/25296/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/951562711fb306b27fe5f34bd4e63d278f906256","head":{"label":"bartonjs:asn1-v2","ref":"asn1-v2","sha":"951562711fb306b27fe5f34bd4e63d278f906256","user":{"login":"bartonjs","id":10642668,"avatar_url":"https://avatars3.githubusercontent.com/u/10642668?v=4","gravatar_id":"","url":"https://api.github.com/users/bartonjs","html_url":"https://github.com/bartonjs","followers_url":"https://api.github.com/users/bartonjs/followers","following_url":"https://api.github.com/users/bartonjs/following{/other_user}","gists_url":"https://api.github.com/users/bartonjs/gists{/gist_id}","starred_url":"https://api.github.com/users/bartonjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bartonjs/subscriptions","organizations_url":"https://api.github.com/users/bartonjs/orgs","repos_url":"https://api.github.com/users/bartonjs/repos","events_url":"https://api.github.com/users/bartonjs/events{/privacy}","received_events_url":"https://api.github.com/users/bartonjs/received_events","type":"User","site_admin":false},"repo":{"id":29888389,"name":"corefx","full_name":"bartonjs/corefx","owner":{"login":"bartonjs","id":10642668,"avatar_url":"https://avatars3.githubusercontent.com/u/10642668?v=4","gravatar_id":"","url":"https://api.github.com/users/bartonjs","html_url":"https://github.com/bartonjs","followers_url":"https://api.github.com/users/bartonjs/followers","following_url":"https://api.github.com/users/bartonjs/following{/other_user}","gists_url":"https://api.github.com/users/bartonjs/gists{/gist_id}","starred_url":"https://api.github.com/users/bartonjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bartonjs/subscriptions","organizations_url":"https://api.github.com/users/bartonjs/orgs","repos_url":"https://api.github.com/users/bartonjs/repos","events_url":"https://api.github.com/users/bartonjs/events{/privacy}","received_events_url":"https://api.github.com/users/bartonjs/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/bartonjs/corefx","description":"This repository contains the foundational libraries that make up the .NET Core development stack.","fork":true,"url":"https://api.github.com/repos/bartonjs/corefx","forks_url":"https://api.github.com/repos/bartonjs/corefx/forks","keys_url":"https://api.github.com/repos/bartonjs/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bartonjs/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bartonjs/corefx/teams","hooks_url":"https://api.github.com/repos/bartonjs/corefx/hooks","issue_events_url":"https://api.github.com/repos/bartonjs/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/bartonjs/corefx/events","assignees_url":"https://api.github.com/repos/bartonjs/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/bartonjs/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/bartonjs/corefx/tags","blobs_url":"https://api.github.com/repos/bartonjs/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bartonjs/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bartonjs/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/bartonjs/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bartonjs/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/bartonjs/corefx/languages","stargazers_url":"https://api.github.com/repos/bartonjs/corefx/stargazers","contributors_url":"https://api.github.com/repos/bartonjs/corefx/contributors","subscribers_url":"https://api.github.com/repos/bartonjs/corefx/subscribers","subscription_url":"https://api.github.com/repos/bartonjs/corefx/subscription","commits_url":"https://api.github.com/repos/bartonjs/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/bartonjs/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/bartonjs/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/bartonjs/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/bartonjs/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/bartonjs/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bartonjs/corefx/merges","archive_url":"https://api.github.com/repos/bartonjs/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bartonjs/corefx/downloads","issues_url":"https://api.github.com/repos/bartonjs/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/bartonjs/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/bartonjs/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/bartonjs/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bartonjs/corefx/labels{/name}","releases_url":"https://api.github.com/repos/bartonjs/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/bartonjs/corefx/deployments","created_at":"2015-01-26T23:55:53Z","updated_at":"2016-10-26T14:28:39Z","pushed_at":"2017-11-21T15:26:27Z","git_url":"git://github.com/bartonjs/corefx.git","ssh_url":"git@github.com:bartonjs/corefx.git","clone_url":"https://github.com/bartonjs/corefx.git","svn_url":"https://github.com/bartonjs/corefx","homepage":"","size":161528,"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":1,"mirror_url":null,"archived":false,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"6a9f579209491ae9041f208bfe34b89085c0279e","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars0.githubusercontent.com/u/9141961?v=4","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":26295345,"name":"corefx","full_name":"dotnet/corefx","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars0.githubusercontent.com/u/9141961?v=4","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others. We welcome contributions.","fork":false,"url":"https://api.github.com/repos/dotnet/corefx","forks_url":"https://api.github.com/repos/dotnet/corefx/forks","keys_url":"https://api.github.com/repos/dotnet/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/corefx/teams","hooks_url":"https://api.github.com/repos/dotnet/corefx/hooks","issue_events_url":"https://api.github.com/repos/dotnet/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/corefx/events","assignees_url":"https://api.github.com/repos/dotnet/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/corefx/tags","blobs_url":"https://api.github.com/repos/dotnet/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/corefx/languages","stargazers_url":"https://api.github.com/repos/dotnet/corefx/stargazers","contributors_url":"https://api.github.com/repos/dotnet/corefx/contributors","subscribers_url":"https://api.github.com/repos/dotnet/corefx/subscribers","subscription_url":"https://api.github.com/repos/dotnet/corefx/subscription","commits_url":"https://api.github.com/repos/dotnet/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/corefx/merges","archive_url":"https://api.github.com/repos/dotnet/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/corefx/downloads","issues_url":"https://api.github.com/repos/dotnet/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/corefx/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/corefx/deployments","created_at":"2014-11-06T23:42:48Z","updated_at":"2017-11-22T03:18:33Z","pushed_at":"2017-11-22T03:10:55Z","git_url":"git://github.com/dotnet/corefx.git","ssh_url":"git@github.com:dotnet/corefx.git","clone_url":"https://github.com/dotnet/corefx.git","svn_url":"https://github.com/dotnet/corefx","homepage":"https://github.com/dotnet/core","size":162019,"stargazers_count":12895,"watchers_count":12895,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3609,"mirror_url":null,"archived":false,"open_issues_count":2176,"forks":3609,"open_issues":2176,"watchers":12895,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/25296"},"html":{"href":"https://github.com/dotnet/corefx/pull/25296"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/25296"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/25296/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/25296/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/25296/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/951562711fb306b27fe5f34bd4e63d278f906256"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"GrabYourPitchforks"}}