{"action":"created","comment":{"url":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/comments/22741436","id":22741436,"diff_hunk":"@@ -0,0 +1,562 @@\n+/*\n+ * == BSD2 LICENSE ==\n+ * Copyright (c) 2014, Tidepool Project\n+ *\n+ * This program is free software; you can redistribute it and/or modify it under\n+ * the terms of the associated License, which is identical to the BSD 2-Clause\n+ * License as published by the Open Source Initiative at opensource.org.\n+ *\n+ * This program is distributed in the hope that it will be useful, but WITHOUT\n+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n+ * FOR A PARTICULAR PURPOSE. See the License for more details.\n+ *\n+ * You should have received a copy of the License along with this program; if\n+ * not, you can obtain one from Tidepool Project at tidepool.org.\n+ * == BSD2 LICENSE ==\n+ */\n+\n+var _ = require('lodash');\n+var async = require('async');\n+var sundial = require('sundial');\n+var struct = require('../struct.js')();\n+\n+module.exports = function (config) {\n+  var cfg = _.clone(config);\n+  cfg.deviceData = null;\n+  var serialDevice = config.deviceComms;\n+\n+  var STX = 0x02;\n+  var ETX = 0x03;\n+  var CR = 0x0D;\n+  var LF = 0x0A;\n+\n+  var dateTimePattern = '([A-Za-z ]{4}) ([0-3][0-9]) ([0-9]{4}) ' +\n+                        '([012][0-9]):([0-5][0-9])(?::([0-6][0-9]))*';\n+  function parseDateTime(match, offset) {\n+    var fmt = 'MMMM DD YYYY HH:mm:ss';\n+    var utc = sundial.parseAndApplyTimezone(match[0], fmt, cfg.timezone).toISOString();\n+    var dev = sundial.formatDeviceTime(utc);\n+    return { dev: dev, utc: utc };\n+  }\n+\n+  var patterns = {\n+    serialNumber: {\n+      pattern: '^(?:[A-Z]-....-.....|[A-Z][A-Z][A-Z]....-.....|[XC][A-Z][GM]........)$',\n+      handler: function(match, packet) {\n+        packet.serialNumber = match[0];\n+      }\n+    },\n+    softwareVersion: {\n+      pattern: '^[0-9.]{4,13}$',\n+      handler: function(match, packet) {\n+        packet.softwareVersion = match[0];\n+      }\n+    },\n+    deviceTime: {\n+      pattern: '^' + dateTimePattern + '$',\n+      handler: function(match, packet) {\n+        var times = parseDateTime(match, 1);\n+        packet.deviceTime = times.dev;\n+        packet.time = times.utc;\n+      }\n+    },\n+    numEntries: {\n+      pattern: '^(?:[0-9]{3}|Log Empty)$',\n+      handler: function(match, packet) {\n+        packet.numEntries = parseInt(match[0], 10);\n+        if (_.isNaN(packet.numEntries)) {\n+          packet.numEntries = 0;\n+        }\n+      }\n+    },\n+    notFound: {\n+      pattern: '^Log Not Found$',\n+      handler: function(match, packet) {\n+        packet.notFound = true;\n+      }\n+    },\n+    end: {\n+      pattern: '^END$',\n+      handler: function(match, packet) {\n+        packet.end = true;\n+      }\n+    },\n+    ok: {\n+      pattern: '^CMD OK$',\n+      handler: function(match, packet) {\n+        packet.ok = true;\n+      }\n+    },\n+    fail: {\n+      pattern: '^CMD Fail!$',\n+      handler: function(match, packet) {\n+        packet.fail = true;\n+      }\n+    },\n+    logEntry: {\n+      pattern: '^([0-9HL][0-9OI][0-9 ])  ' + dateTimePattern + ' ([KG]) (0x[0-9A-Fa-f][0-9A-Fa-f])$',\n+      handler: function(match, packet) {\n+        var entry = {};\n+        var reading = match[1];\n+        if (reading == 'HI ') {\n+          entry.reading = 501;\n+        } else if (reading == 'LO ') {\n+          entry.reading = 20;\n+        } else {\n+          entry.reading = parseInt(reading, 10);\n+        }\n+        entry.datetime = parseDateTime(match, 2);\n+        var readingType = match[8];\n+        if (readingType === 'K') {\n+          entry.readingType = 'ketone';\n+        } else {\n+          entry.readingType = 'glucose';\n+        }\n+        entry.status = parseInt(match[9], 16);   // this is in hex\n+        packet.logEntries.push(entry);\n+      }\n+    },\n+    checksum: {\n+      pattern: '^(0x[0-9A-F]{4})  END',\n+      handler: function(match, packet) {\n+        packet.receivedChecksum = parseInt(match[1], 16); // in hex\n+      }\n+    }\n+  };\n+  var logEntry = 'logEntry';\n+\n+\n+  // accepts a stream of bytes and tries to find a packet\n+  // at the beginning of it.\n+  // returns a packet object; if valid == true it's a valid packet\n+  // if packet_len is nonzero, that much should be deleted from the stream\n+  // if valid is false and packet_len is nonzero, the previous packet\n+  // should be NAKed.\n+  // don't call this if you don't have at least a few bytes available\n+  var extractPacket = function (bytes) {\n+    var packet = {\n+      bytes: bytes,\n+      valid: false,\n+      packet_len: 0,\n+      lcb: 0,\n+      lines: [],\n+      logEntries: []\n+    };\n+\n+    // look for a terminating ETX\n+    var startIndex = 0;\n+    var endIndex = _.indexOf(bytes, ETX, startIndex + 1);\n+    if (endIndex === -1) {\n+      // didn't find end of packet, so bail for now\n+      return packet;\n+    }\n+\n+    // we have what looks like a packet, so now's a good time to\n+    // calculate the checksum if we have one\n+    // first, we have to find the start of the checksum, if it exists.\n+    // let's convert the whole array to strings\n+\n+    // I tried to do this with:\n+    // _.map(bytes, String.fromCharCode).join('');\n+    // but I kept getting semi-random characters in the resulting string, so I'm using this instead\n+    function stringFromBytes(bytes, start, end) {\n+      var s = '';\n+      for (var i=start; i<end; ++i) {\n+        s += String.fromCharCode(bytes[i]);\n+      }\n+      return s;\n+    }\n+\n+    // this is a search for a fixed set of bytes within a larger block. It's not exactly\n+    // Boyer-Moore, but it'll do for now\n+    function searchForSequence(bytes, sequence) {\n+      var found = false;\n+      for (var ix=0; ix<bytes.length; ++ix) {\n+        found = true;\n+        for (var jx=0; jx<sequence.length; ++jx) {\n+          if (bytes[ix + jx] != sequence[jx]) {\n+            found = false;\n+            break;\n+          }\n+        }\n+        if (found) {\n+          return ix;\n+        }\n+      }\n+      return -1;\n+    }\n+\n+    // bstring = stringFromBytes(bytes, 0, bytes.length);\n+    // console.log(bstring);","path":"lib/drivers/abbottFreeStyle.js","position":190,"original_position":190,"commit_id":"421049646d259c646a70fb4bf943931f8c24aa76","original_commit_id":"421049646d259c646a70fb4bf943931f8c24aa76","user":{"login":"jebeck","id":1588547,"avatar_url":"https://avatars.githubusercontent.com/u/1588547?v=3","gravatar_id":"","url":"https://api.github.com/users/jebeck","html_url":"https://github.com/jebeck","followers_url":"https://api.github.com/users/jebeck/followers","following_url":"https://api.github.com/users/jebeck/following{/other_user}","gists_url":"https://api.github.com/users/jebeck/gists{/gist_id}","starred_url":"https://api.github.com/users/jebeck/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jebeck/subscriptions","organizations_url":"https://api.github.com/users/jebeck/orgs","repos_url":"https://api.github.com/users/jebeck/repos","events_url":"https://api.github.com/users/jebeck/events{/privacy}","received_events_url":"https://api.github.com/users/jebeck/received_events","type":"User","site_admin":false},"body":"Do you anticipate needing this (and any other) logging statements in the near future or can they be deleted?","created_at":"2015-01-09T20:38:42Z","updated_at":"2015-01-09T20:38:42Z","html_url":"https://github.com/tidepool-org/chrome-uploader/pull/46#discussion_r22741436","pull_request_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/46","_links":{"self":{"href":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/comments/22741436"},"html":{"href":"https://github.com/tidepool-org/chrome-uploader/pull/46#discussion_r22741436"},"pull_request":{"href":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/46"}}},"pull_request":{"url":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/46","id":27067354,"html_url":"https://github.com/tidepool-org/chrome-uploader/pull/46","diff_url":"https://github.com/tidepool-org/chrome-uploader/pull/46.diff","patch_url":"https://github.com/tidepool-org/chrome-uploader/pull/46.patch","issue_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/issues/46","number":46,"state":"open","locked":false,"title":"Support Precision Xtra BGM","user":{"login":"kentquirk","id":755528,"avatar_url":"https://avatars.githubusercontent.com/u/755528?v=3","gravatar_id":"","url":"https://api.github.com/users/kentquirk","html_url":"https://github.com/kentquirk","followers_url":"https://api.github.com/users/kentquirk/followers","following_url":"https://api.github.com/users/kentquirk/following{/other_user}","gists_url":"https://api.github.com/users/kentquirk/gists{/gist_id}","starred_url":"https://api.github.com/users/kentquirk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kentquirk/subscriptions","organizations_url":"https://api.github.com/users/kentquirk/orgs","repos_url":"https://api.github.com/users/kentquirk/repos","events_url":"https://api.github.com/users/kentquirk/events{/privacy}","received_events_url":"https://api.github.com/users/kentquirk/received_events","type":"User","site_admin":false},"body":"And a bunch of cleanup along the way:\r\n* Move active drivers into the drivers subdirectory (still more to do)\r\n* This also has the early stages of OneTouch UltraMini support, but that doesn't work yet, so the driver is in there but it's not enabled in the UI. (Commented out in appState.js.)\r\n* A new helper function in struct\r\n* A change to npm start so that it works on windows\r\n\r\n\r\n","created_at":"2015-01-08T22:59:02Z","updated_at":"2015-01-09T20:38:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"90af0855e20736269a82c73354deddbaad42059c","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/46/commits","review_comments_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/46/comments","review_comment_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/comments/{number}","comments_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/issues/46/comments","statuses_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/statuses/421049646d259c646a70fb4bf943931f8c24aa76","head":{"label":"tidepool-org:kjq/precisionXtra","ref":"kjq/precisionXtra","sha":"421049646d259c646a70fb4bf943931f8c24aa76","user":{"login":"tidepool-org","id":4390820,"avatar_url":"https://avatars.githubusercontent.com/u/4390820?v=3","gravatar_id":"","url":"https://api.github.com/users/tidepool-org","html_url":"https://github.com/tidepool-org","followers_url":"https://api.github.com/users/tidepool-org/followers","following_url":"https://api.github.com/users/tidepool-org/following{/other_user}","gists_url":"https://api.github.com/users/tidepool-org/gists{/gist_id}","starred_url":"https://api.github.com/users/tidepool-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tidepool-org/subscriptions","organizations_url":"https://api.github.com/users/tidepool-org/orgs","repos_url":"https://api.github.com/users/tidepool-org/repos","events_url":"https://api.github.com/users/tidepool-org/events{/privacy}","received_events_url":"https://api.github.com/users/tidepool-org/received_events","type":"Organization","site_admin":false},"repo":{"id":20790599,"name":"chrome-uploader","full_name":"tidepool-org/chrome-uploader","owner":{"login":"tidepool-org","id":4390820,"avatar_url":"https://avatars.githubusercontent.com/u/4390820?v=3","gravatar_id":"","url":"https://api.github.com/users/tidepool-org","html_url":"https://github.com/tidepool-org","followers_url":"https://api.github.com/users/tidepool-org/followers","following_url":"https://api.github.com/users/tidepool-org/following{/other_user}","gists_url":"https://api.github.com/users/tidepool-org/gists{/gist_id}","starred_url":"https://api.github.com/users/tidepool-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tidepool-org/subscriptions","organizations_url":"https://api.github.com/users/tidepool-org/orgs","repos_url":"https://api.github.com/users/tidepool-org/repos","events_url":"https://api.github.com/users/tidepool-org/events{/privacy}","received_events_url":"https://api.github.com/users/tidepool-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/tidepool-org/chrome-uploader","description":"A Chrome app for uploading data to Tidepool's backend","fork":false,"url":"https://api.github.com/repos/tidepool-org/chrome-uploader","forks_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/forks","keys_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/teams","hooks_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/hooks","issue_events_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/issues/events{/number}","events_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/events","assignees_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/assignees{/user}","branches_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/branches{/branch}","tags_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/tags","blobs_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/git/refs{/sha}","trees_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/statuses/{sha}","languages_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/languages","stargazers_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/stargazers","contributors_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/contributors","subscribers_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/subscribers","subscription_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/subscription","commits_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/commits{/sha}","git_commits_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/git/commits{/sha}","comments_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/comments{/number}","issue_comment_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/issues/comments/{number}","contents_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/contents/{+path}","compare_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/merges","archive_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/downloads","issues_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/issues{/number}","pulls_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls{/number}","milestones_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/milestones{/number}","notifications_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/labels{/name}","releases_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/releases{/id}","created_at":"2014-06-13T03:12:49Z","updated_at":"2015-01-09T03:36:14Z","pushed_at":"2015-01-09T04:32:59Z","git_url":"git://github.com/tidepool-org/chrome-uploader.git","ssh_url":"git@github.com:tidepool-org/chrome-uploader.git","clone_url":"https://github.com/tidepool-org/chrome-uploader.git","svn_url":"https://github.com/tidepool-org/chrome-uploader","homepage":null,"size":3749,"stargazers_count":7,"watchers_count":7,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":3,"forks":2,"open_issues":3,"watchers":7,"default_branch":"master"}},"base":{"label":"tidepool-org:master","ref":"master","sha":"a48e3d93d0412ff2eb39c677478b8c36d32e754f","user":{"login":"tidepool-org","id":4390820,"avatar_url":"https://avatars.githubusercontent.com/u/4390820?v=3","gravatar_id":"","url":"https://api.github.com/users/tidepool-org","html_url":"https://github.com/tidepool-org","followers_url":"https://api.github.com/users/tidepool-org/followers","following_url":"https://api.github.com/users/tidepool-org/following{/other_user}","gists_url":"https://api.github.com/users/tidepool-org/gists{/gist_id}","starred_url":"https://api.github.com/users/tidepool-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tidepool-org/subscriptions","organizations_url":"https://api.github.com/users/tidepool-org/orgs","repos_url":"https://api.github.com/users/tidepool-org/repos","events_url":"https://api.github.com/users/tidepool-org/events{/privacy}","received_events_url":"https://api.github.com/users/tidepool-org/received_events","type":"Organization","site_admin":false},"repo":{"id":20790599,"name":"chrome-uploader","full_name":"tidepool-org/chrome-uploader","owner":{"login":"tidepool-org","id":4390820,"avatar_url":"https://avatars.githubusercontent.com/u/4390820?v=3","gravatar_id":"","url":"https://api.github.com/users/tidepool-org","html_url":"https://github.com/tidepool-org","followers_url":"https://api.github.com/users/tidepool-org/followers","following_url":"https://api.github.com/users/tidepool-org/following{/other_user}","gists_url":"https://api.github.com/users/tidepool-org/gists{/gist_id}","starred_url":"https://api.github.com/users/tidepool-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tidepool-org/subscriptions","organizations_url":"https://api.github.com/users/tidepool-org/orgs","repos_url":"https://api.github.com/users/tidepool-org/repos","events_url":"https://api.github.com/users/tidepool-org/events{/privacy}","received_events_url":"https://api.github.com/users/tidepool-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/tidepool-org/chrome-uploader","description":"A Chrome app for uploading data to Tidepool's backend","fork":false,"url":"https://api.github.com/repos/tidepool-org/chrome-uploader","forks_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/forks","keys_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/teams","hooks_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/hooks","issue_events_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/issues/events{/number}","events_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/events","assignees_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/assignees{/user}","branches_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/branches{/branch}","tags_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/tags","blobs_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/git/refs{/sha}","trees_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/statuses/{sha}","languages_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/languages","stargazers_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/stargazers","contributors_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/contributors","subscribers_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/subscribers","subscription_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/subscription","commits_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/commits{/sha}","git_commits_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/git/commits{/sha}","comments_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/comments{/number}","issue_comment_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/issues/comments/{number}","contents_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/contents/{+path}","compare_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/merges","archive_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/downloads","issues_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/issues{/number}","pulls_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls{/number}","milestones_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/milestones{/number}","notifications_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/labels{/name}","releases_url":"https://api.github.com/repos/tidepool-org/chrome-uploader/releases{/id}","created_at":"2014-06-13T03:12:49Z","updated_at":"2015-01-09T03:36:14Z","pushed_at":"2015-01-09T04:32:59Z","git_url":"git://github.com/tidepool-org/chrome-uploader.git","ssh_url":"git@github.com:tidepool-org/chrome-uploader.git","clone_url":"https://github.com/tidepool-org/chrome-uploader.git","svn_url":"https://github.com/tidepool-org/chrome-uploader","homepage":null,"size":3749,"stargazers_count":7,"watchers_count":7,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":3,"forks":2,"open_issues":3,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/46"},"html":{"href":"https://github.com/tidepool-org/chrome-uploader/pull/46"},"issue":{"href":"https://api.github.com/repos/tidepool-org/chrome-uploader/issues/46"},"comments":{"href":"https://api.github.com/repos/tidepool-org/chrome-uploader/issues/46/comments"},"review_comments":{"href":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/46/comments"},"review_comment":{"href":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/tidepool-org/chrome-uploader/pulls/46/commits"},"statuses":{"href":"https://api.github.com/repos/tidepool-org/chrome-uploader/statuses/421049646d259c646a70fb4bf943931f8c24aa76"}}}}