{"action":"created","comment":{"url":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/comments/147020136","pull_request_review_id":72049897,"id":147020136,"diff_hunk":"@@ -0,0 +1,244 @@\n+#!/usr/bin/env python\n+import os\n+import sys\n+import multiprocessing\n+import subprocess\n+import json\n+import csv\n+import shelve\n+import argparse\n+import re\n+import time\n+import random\n+import datetime\n+import gzip\n+import logging\n+import math\n+\n+KEY_S3_PATH = 's3://czbiohub-infectious-disease/idseq-alpha.pem'\n+ROOT_DIR = '/mnt'\n+DEST_DIR = ROOT_DIR + '/idseq/data' # generated data go here\n+REF_DIR  = ROOT_DIR + '/idseq/ref' # referene genome / ref databases go here\n+\n+# Global variable examples, to be overwritten by environment variables\n+INPUT_BUCKET = 's3://czbiohub-idseq-samples-development/samples/3/60/results'\n+OUTPUT_BUCKET = 's3://czbiohub-idseq-samples-development/samples/3/60/postprocess'\n+\n+# references\n+ACCESSION2TAXID = 's3://czbiohub-infectious-disease/references/accession2taxid.db.gz'\n+LINEAGE_SHELF = 's3://czbiohub-infectious-disease/references/taxid-lineages.db'\n+\n+# input files\n+ACCESSION_ANNOTATED_FASTA = 'taxids.rapsearch2.filter.deuterostomes.taxids.gsnapl.unmapped.bowtie2.lzw.cdhitdup.priceseqfilter.unmapped.star.fasta'\n+\n+# output files\n+TAXID_ANNOT_FASTA = 'taxid_annot.fasta'\n+TAXID_ANNOT_SORTED_FASTA_NT = 'taxid_annot_sorted_nt.fasta'\n+TAXID_LOCATIONS_JSON_NT = 'taxid_locations_nt.json'\n+TAXID_ANNOT_SORTED_FASTA_NR = 'taxid_annot_sorted_nr.fasta'\n+TAXID_LOCATIONS_JSON_NR = 'taxid_locations_nr.json'\n+LOGS_OUT_BASENAME = 'postprocess-log'\n+\n+# convenience functions\n+def return_merged_dict(dict1, dict2):\n+    result = dict1.copy()\n+    result.update(dict2)\n+    return result\n+\n+# processing functions\n+def accession2taxid(read_id, accession2taxid_dict, hit_type, lineage_map):\n+    accid_short = ((read_id.split(hit_type+':'))[1].split(\":\")[0]).split(\".\")[0]\n+    taxid = accession2taxid_dict.get(accid_short, \"NA\")\n+    species_taxid, genus_taxid, family_taxid = lineage_map.get(taxid, (\"-100\", \"-200\", \"-300\"))\n+    return species_taxid, genus_taxid, family_taxid\n+\n+def generate_taxid_fasta_from_accid(input_fasta_file, accession2taxid_path, lineagePath, output_fasta_file):\n+    accession2taxid_dict = shelve.open(accession2taxid_path)\n+    lineage_map = shelve.open(lineagePath)\n+    input_fasta_f = open(input_fasta_file, 'rb')\n+    output_fasta_f = open(output_fasta_file, 'wb')\n+    sequence_name = input_fasta_f.readline()\n+    sequence_data = input_fasta_f.readline()\n+    while len(sequence_name) > 0 and len(sequence_data) > 0:\n+        read_id = sequence_name.rstrip().lstrip('>') # example read_id: \"NR::NT:CP010376.2:NB501961:14:HM7TLBGX2:1:23109:12720:8743/2\"\n+        nr_taxid_species, nr_taxid_genus, nr_taxid_family = accession2taxid(read_id, accession2taxid_dict, 'NR', lineage_map)\n+        nt_taxid_species, nt_taxid_genus, nt_taxid_family = accession2taxid(read_id, accession2taxid_dict, 'NT', lineage_map)\n+        new_read_name = ('nr:' + nr_taxid_species + ':nt:' + nt_taxid_species\n+                         + ':' + read_id)\n+        output_fasta_f.write(\">%s\\n\" % new_read_name)\n+        output_fasta_f.write(sequence_data)\n+        sequence_name = input_fasta_f.readline()\n+        sequence_data = input_fasta_f.readline()\n+    input_fasta_f.close()\n+    output_fasta_f.close()\n+\n+def get_taxid(sequence_name, taxid_field):\n+    parts = sequence_name.split(\":\")\n+    if len(parts) < taxid_field:\n+         return 'none'\n+    return parts[taxid_field-1]\n+\n+def generate_taxid_locator(input_fasta, taxid_field, output_fasta, output_json):\n+    # put every 2-line fasta record on a single line with delimiter \":lineseparator:\":\n+    command = \"awk 'NR % 2 == 1 { o=$0 ; next } { print o \\\":lineseparator:\\\" $0 }' \" + input_fasta\n+    # sort the records based on the field containing the taxids:\n+    command += \" | sort --key %s --field-separator ':' --numeric-sort\" % taxid_field\n+    # split every record back over 2 lines:\n+    command += \" | sed 's/:lineseparator:/\\\\n/g' > %s\" % output_fasta\n+    subprocess.check_output(command, shell=True)\n+    # make json giving byte range of file corresponding to each taxid:\n+    taxon_sequence_locations = []\n+    f = open(output_fasta, 'rb')\n+    sequence_name = f.readline()\n+    sequence_data = f.readline()\n+    taxid = get_taxid(sequence_name, taxid_field)\n+    first_byte = 0\n+    new_first_byte = first_byte + len(sequence_name) + len(sequence_data)\n+    while len(sequence_name) > 0 and len(sequence_data) > 0:\n+        sequence_name = f.readline()\n+        sequence_data = f.readline()\n+        new_taxid = get_taxid(sequence_name, taxid_field)\n+        if new_taxid != taxid:\n+            taxon_sequence_locations.append({'taxid': taxid, 'first_byte': first_byte,\n+                                             'last_byte': new_first_byte - 1})\n+            taxid = new_taxid\n+            first_byte = new_first_byte\n+            new_first_byte = first_byte + len(sequence_name) + len(sequence_data)\n+        else:\n+            new_first_byte += len(sequence_name) + len(sequence_data)\n+    f.close()","path":"aws_batch/postprocess.py","position":109,"original_position":109,"commit_id":"ac4f24b5d5a70ba519b9b9b00304e4fbc222fba2","original_commit_id":"ac4f24b5d5a70ba519b9b9b00304e4fbc222fba2","user":{"login":"yunfangjuan","id":1704002,"avatar_url":"https://avatars0.githubusercontent.com/u/1704002?v=4","gravatar_id":"","url":"https://api.github.com/users/yunfangjuan","html_url":"https://github.com/yunfangjuan","followers_url":"https://api.github.com/users/yunfangjuan/followers","following_url":"https://api.github.com/users/yunfangjuan/following{/other_user}","gists_url":"https://api.github.com/users/yunfangjuan/gists{/gist_id}","starred_url":"https://api.github.com/users/yunfangjuan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yunfangjuan/subscriptions","organizations_url":"https://api.github.com/users/yunfangjuan/orgs","repos_url":"https://api.github.com/users/yunfangjuan/repos","events_url":"https://api.github.com/users/yunfangjuan/events{/privacy}","received_events_url":"https://api.github.com/users/yunfangjuan/received_events","type":"User","site_admin":false},"body":"ok. Could you document the boundary condition when sequnce name is nil? Also new_first_byte is really unintuitive to read? Can you use last_byte instead? ","created_at":"2017-10-26T00:15:21Z","updated_at":"2017-10-26T00:15:21Z","html_url":"https://github.com/chanzuckerberg/idseq-web/pull/243#discussion_r147020136","pull_request_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/243","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/comments/147020136"},"html":{"href":"https://github.com/chanzuckerberg/idseq-web/pull/243#discussion_r147020136"},"pull_request":{"href":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/243"}},"in_reply_to_id":147017304},"pull_request":{"url":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/243","id":148574016,"html_url":"https://github.com/chanzuckerberg/idseq-web/pull/243","diff_url":"https://github.com/chanzuckerberg/idseq-web/pull/243.diff","patch_url":"https://github.com/chanzuckerberg/idseq-web/pull/243.patch","issue_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/issues/243","number":243,"state":"open","locked":false,"title":"Charles/taxon fasta 4","user":{"login":"cdebourcy","id":16944816,"avatar_url":"https://avatars2.githubusercontent.com/u/16944816?v=4","gravatar_id":"","url":"https://api.github.com/users/cdebourcy","html_url":"https://github.com/cdebourcy","followers_url":"https://api.github.com/users/cdebourcy/followers","following_url":"https://api.github.com/users/cdebourcy/following{/other_user}","gists_url":"https://api.github.com/users/cdebourcy/gists{/gist_id}","starred_url":"https://api.github.com/users/cdebourcy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cdebourcy/subscriptions","organizations_url":"https://api.github.com/users/cdebourcy/orgs","repos_url":"https://api.github.com/users/cdebourcy/repos","events_url":"https://api.github.com/users/cdebourcy/events{/privacy}","received_events_url":"https://api.github.com/users/cdebourcy/received_events","type":"User","site_admin":false},"body":"Test plan:\r\n1. Rerun a sample\r\n2. When rerun has finished, click on any of the numbers in the 'NT Species r' column and you'll see the corresponding reads!","created_at":"2017-10-25T05:34:11Z","updated_at":"2017-10-26T00:15:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9f4648a144371b339c780525f098e6f3ca718ac3","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/243/commits","review_comments_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/243/comments","review_comment_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/comments{/number}","comments_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/issues/243/comments","statuses_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/statuses/ac4f24b5d5a70ba519b9b9b00304e4fbc222fba2","head":{"label":"chanzuckerberg:charles/taxon-fasta-4","ref":"charles/taxon-fasta-4","sha":"ac4f24b5d5a70ba519b9b9b00304e4fbc222fba2","user":{"login":"chanzuckerberg","id":19917299,"avatar_url":"https://avatars2.githubusercontent.com/u/19917299?v=4","gravatar_id":"","url":"https://api.github.com/users/chanzuckerberg","html_url":"https://github.com/chanzuckerberg","followers_url":"https://api.github.com/users/chanzuckerberg/followers","following_url":"https://api.github.com/users/chanzuckerberg/following{/other_user}","gists_url":"https://api.github.com/users/chanzuckerberg/gists{/gist_id}","starred_url":"https://api.github.com/users/chanzuckerberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chanzuckerberg/subscriptions","organizations_url":"https://api.github.com/users/chanzuckerberg/orgs","repos_url":"https://api.github.com/users/chanzuckerberg/repos","events_url":"https://api.github.com/users/chanzuckerberg/events{/privacy}","received_events_url":"https://api.github.com/users/chanzuckerberg/received_events","type":"Organization","site_admin":false},"repo":{"id":99148438,"name":"idseq-web","full_name":"chanzuckerberg/idseq-web","owner":{"login":"chanzuckerberg","id":19917299,"avatar_url":"https://avatars2.githubusercontent.com/u/19917299?v=4","gravatar_id":"","url":"https://api.github.com/users/chanzuckerberg","html_url":"https://github.com/chanzuckerberg","followers_url":"https://api.github.com/users/chanzuckerberg/followers","following_url":"https://api.github.com/users/chanzuckerberg/following{/other_user}","gists_url":"https://api.github.com/users/chanzuckerberg/gists{/gist_id}","starred_url":"https://api.github.com/users/chanzuckerberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chanzuckerberg/subscriptions","organizations_url":"https://api.github.com/users/chanzuckerberg/orgs","repos_url":"https://api.github.com/users/chanzuckerberg/repos","events_url":"https://api.github.com/users/chanzuckerberg/events{/privacy}","received_events_url":"https://api.github.com/users/chanzuckerberg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/chanzuckerberg/idseq-web","description":null,"fork":false,"url":"https://api.github.com/repos/chanzuckerberg/idseq-web","forks_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/forks","keys_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/keys{/key_id}","collaborators_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/teams","hooks_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/hooks","issue_events_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/issues/events{/number}","events_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/events","assignees_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/assignees{/user}","branches_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/branches{/branch}","tags_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/tags","blobs_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/git/refs{/sha}","trees_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/git/trees{/sha}","statuses_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/statuses/{sha}","languages_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/languages","stargazers_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/stargazers","contributors_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/contributors","subscribers_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/subscribers","subscription_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/subscription","commits_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/commits{/sha}","git_commits_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/git/commits{/sha}","comments_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/comments{/number}","issue_comment_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/issues/comments{/number}","contents_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/contents/{+path}","compare_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/compare/{base}...{head}","merges_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/merges","archive_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/downloads","issues_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/issues{/number}","pulls_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls{/number}","milestones_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/milestones{/number}","notifications_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/labels{/name}","releases_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/releases{/id}","deployments_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/deployments","created_at":"2017-08-02T18:24:03Z","updated_at":"2017-10-19T18:38:46Z","pushed_at":"2017-10-26T00:11:21Z","git_url":"git://github.com/chanzuckerberg/idseq-web.git","ssh_url":"git@github.com:chanzuckerberg/idseq-web.git","clone_url":"https://github.com/chanzuckerberg/idseq-web.git","svn_url":"https://github.com/chanzuckerberg/idseq-web","homepage":null,"size":19503,"stargazers_count":3,"watchers_count":3,"language":"Ruby","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":5,"forks":0,"open_issues":5,"watchers":3,"default_branch":"master"}},"base":{"label":"chanzuckerberg:master","ref":"master","sha":"4d881291d90b7da92c2c87da57c885804fcbfaa8","user":{"login":"chanzuckerberg","id":19917299,"avatar_url":"https://avatars2.githubusercontent.com/u/19917299?v=4","gravatar_id":"","url":"https://api.github.com/users/chanzuckerberg","html_url":"https://github.com/chanzuckerberg","followers_url":"https://api.github.com/users/chanzuckerberg/followers","following_url":"https://api.github.com/users/chanzuckerberg/following{/other_user}","gists_url":"https://api.github.com/users/chanzuckerberg/gists{/gist_id}","starred_url":"https://api.github.com/users/chanzuckerberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chanzuckerberg/subscriptions","organizations_url":"https://api.github.com/users/chanzuckerberg/orgs","repos_url":"https://api.github.com/users/chanzuckerberg/repos","events_url":"https://api.github.com/users/chanzuckerberg/events{/privacy}","received_events_url":"https://api.github.com/users/chanzuckerberg/received_events","type":"Organization","site_admin":false},"repo":{"id":99148438,"name":"idseq-web","full_name":"chanzuckerberg/idseq-web","owner":{"login":"chanzuckerberg","id":19917299,"avatar_url":"https://avatars2.githubusercontent.com/u/19917299?v=4","gravatar_id":"","url":"https://api.github.com/users/chanzuckerberg","html_url":"https://github.com/chanzuckerberg","followers_url":"https://api.github.com/users/chanzuckerberg/followers","following_url":"https://api.github.com/users/chanzuckerberg/following{/other_user}","gists_url":"https://api.github.com/users/chanzuckerberg/gists{/gist_id}","starred_url":"https://api.github.com/users/chanzuckerberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chanzuckerberg/subscriptions","organizations_url":"https://api.github.com/users/chanzuckerberg/orgs","repos_url":"https://api.github.com/users/chanzuckerberg/repos","events_url":"https://api.github.com/users/chanzuckerberg/events{/privacy}","received_events_url":"https://api.github.com/users/chanzuckerberg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/chanzuckerberg/idseq-web","description":null,"fork":false,"url":"https://api.github.com/repos/chanzuckerberg/idseq-web","forks_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/forks","keys_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/keys{/key_id}","collaborators_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/teams","hooks_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/hooks","issue_events_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/issues/events{/number}","events_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/events","assignees_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/assignees{/user}","branches_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/branches{/branch}","tags_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/tags","blobs_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/git/refs{/sha}","trees_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/git/trees{/sha}","statuses_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/statuses/{sha}","languages_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/languages","stargazers_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/stargazers","contributors_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/contributors","subscribers_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/subscribers","subscription_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/subscription","commits_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/commits{/sha}","git_commits_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/git/commits{/sha}","comments_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/comments{/number}","issue_comment_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/issues/comments{/number}","contents_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/contents/{+path}","compare_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/compare/{base}...{head}","merges_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/merges","archive_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/downloads","issues_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/issues{/number}","pulls_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls{/number}","milestones_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/milestones{/number}","notifications_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/labels{/name}","releases_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/releases{/id}","deployments_url":"https://api.github.com/repos/chanzuckerberg/idseq-web/deployments","created_at":"2017-08-02T18:24:03Z","updated_at":"2017-10-19T18:38:46Z","pushed_at":"2017-10-26T00:11:21Z","git_url":"git://github.com/chanzuckerberg/idseq-web.git","ssh_url":"git@github.com:chanzuckerberg/idseq-web.git","clone_url":"https://github.com/chanzuckerberg/idseq-web.git","svn_url":"https://github.com/chanzuckerberg/idseq-web","homepage":null,"size":19503,"stargazers_count":3,"watchers_count":3,"language":"Ruby","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":5,"forks":0,"open_issues":5,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/243"},"html":{"href":"https://github.com/chanzuckerberg/idseq-web/pull/243"},"issue":{"href":"https://api.github.com/repos/chanzuckerberg/idseq-web/issues/243"},"comments":{"href":"https://api.github.com/repos/chanzuckerberg/idseq-web/issues/243/comments"},"review_comments":{"href":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/243/comments"},"review_comment":{"href":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/chanzuckerberg/idseq-web/pulls/243/commits"},"statuses":{"href":"https://api.github.com/repos/chanzuckerberg/idseq-web/statuses/ac4f24b5d5a70ba519b9b9b00304e4fbc222fba2"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"yunfangjuan"}}