Repository: monarch-initiative/gpsea (language: python)

Issue:
Create an example notebook to gather PTPN11 data for plotting purposes
Work on this after #63 
Implement VariantValidator TranscriptCoordinateService
Implement Ensembl TranscriptCoordinateService  - a way to get transcript and exon coordinates from Ensembl API.


Discussion / hints:

We should already have this functionality.

EDIT:
No, we don't
but don;t we already have information about the Exons etc somewhere? I thought we wanted to import all of this data when the user is setting up the analysis rather than later on?
Yes, we don't have this. We have data with respect to a variant, which includes tx id, exon number, but nothing much more useful.

> I thought we wanted to import all of this data when the user is setting up the analysis rather than later on?

We can import the data during the functional annotation, or later, but in any case we will need the functionality described by the `TranscriptCoordinateService` interface. So, this ticket is to keep track of the progress on that front.

In other words, I'd first like to have this working and then find the best place where to put it within the workflow.
OK.
We should probably ask the user to provide the name of the transcript they consider most important when they start the analysis.

Do you happen to know the best API command that does this? Not entirely obiouvs, if not I will look!
I think I found what we need - Variant validator seems to provide what we need:

```shell
curl -X 'GET' \
  'https://rest.variantvalidator.org/VariantValidator/tools/gene2transcripts/NM_003172' \
  -H 'accept: application/json'
```

I went through these before hitting variant validator

- ENSEMBL [REST API](https://rest.ensembl.org/documentation/info/lookup) could give us what we need but it needs a stable Ensembl ID (e.g. ENSG00000012345) but we work in the RefSeq space

- NCBI [Rest API](https://www.ncbi.nlm.nih.gov/datasets/docs/v2/reference-docs/rest-api/) can take RefSeq tx ID but it does not return exon coordinates:
```shell
TX_ID=NM_003172.4 # My favorite RefSeq tx id
curl -X GET "https://api.ncbi.nlm.nih.gov/datasets/v2alpha/gene/accession/${TX_ID}?returned_content=COMPLETE&table_fields=gene-id&table_fields=gene-type&table_fields=description" \
 -H "Accept: application/json"
```

- [genenames.org](https://www.genenames.org/help/rest/) can give you details for a RefSeq ID but it does not provide exon coordinates:
```shell
curl -X GET "https://rest.genenames.org/fetch/refseq_accession/NM_003172" -H "Accept: application/json"
```
A template:

```python

class VVTranscriptCoordinateService(TranscriptCoordinateService):

    def __init__(self, gb: GenomeBuild):
        """
        something like https://rest.variantvalidator.org/VariantValidator/tools/gene2transcripts/NM_000518.4
        for a ClinGen HBB transcript
        """
        self._gb = gb
        self._url = 'https://rest.variantvalidator.org/VariantValidator/tools/gene2transcripts/%s'

    def fetch(self, tx: TranscriptInfoAware) -> TranscriptCoordinates:
        # create query
        query = ''

        contig = 'NC_000009.11'
        contig = self._gb.contig_by_name(contig)
        GenomicRegion()
        return TranscriptCoordinates()

```
The example usage for now:
```python
from genophenocorr.model.genome import GRCh38

vv = VVTranscriptCoordinateService(GRCh38)
```

Then, `TranscriptCoordinateService` takes an instance `TranscriptInfoAware` which is a thing that has `gene_id` (e.g. *SURF*) and `tx_id` (e.g. *NM_003127.4* or *NM_003127*).

However, I'm thinking that it may be good to change the signature from:
```python
def fetch(self, tx: TranscriptInfoAware) -> TranscriptCoordinates:
```
to

```python
def fetch(self, tx: typing.Union[str, TranscriptInfoAware]) -> TranscriptCoordinates:
```

so that we can take a simple `str` with `tx_id` as well.

Fix patch:
diff --git a/dev/Visualizers.ipynb b/dev/Visualizers.ipynb
new file mode 100644
index 00000000..7d5e9426
--- /dev/null
+++ b/dev/Visualizers.ipynb
@@ -0,0 +1,552 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Setup for visualizers**\n",
+    "\n",
+    "The notebook loads a cohort of patients with mutations in *SUOX*, performs the functional variant annotation, and collates the data into a `Cohort` object."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%matplotlib inline\n",
+    "\n",
+    "import os\n",
+    "import hpotk\n",
+    "\n",
+    "hpotk.util.setup_logging()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Setup resources\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Load HPO\n",
+    "\n",
+    "Use HPO release *2023-10-09*. The ontology is downloaded from the PURL.\n",
+    "\n",
+    "> Note: feel free to download the file once and provide the local path, e.g. `/home/joe/path/to/hp.json`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'2023-10-09'"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "fpath_hpo = 'https://github.com/obophenotype/human-phenotype-ontology/releases/download/v2023-10-09/hp.json'\n",
+    "\n",
+    "hpo = hpotk.load_minimal_ontology(fpath_hpo)\n",
+    "hpo.version"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Load samples"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Configure patient creator\n",
+    "\n",
+    "Patient creator transforms phenopackets into `Patient`s - the internal representation of the sample data. \n",
+    "\n",
+    "The transformation includes checking that the phenotypic features -  the uses HPO to check all phenotypic features are annotated with current HPO terms "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Setup phenotypic feature validation\n",
+    "\n",
+    "We ensure that the phenotypic features of the subjects meet the following validation requirements:\n",
+    "- the phenotypic features are represented using current (non-obsolete) HPO term IDs\n",
+    "- all phenotypic features are descendants of *Phenotypic abnormality* branch of HPO\n",
+    "- the terms do not violate the annotation propagation rule - subjects are not annotated by a term and its ancestor/descendant"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from hpotk.validate import ValidationRunner\n",
+    "from hpotk.validate import ObsoleteTermIdsValidator, PhenotypicAbnormalityValidator, AnnotationPropagationValidator\n",
+    "\n",
+    "validation_runner = ValidationRunner(\n",
+    "    validators=(\n",
+    "        ObsoleteTermIdsValidator(hpo),\n",
+    "        PhenotypicAbnormalityValidator(hpo),\n",
+    "        AnnotationPropagationValidator(hpo)\n",
+    "        ))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from genophenocorr.preprocessing import configure_caching_patient_creator\n",
+    "\n",
+    "pc = configure_caching_patient_creator(hpo, validation_runner=validation_runner)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Load phenopackets\n",
+    "\n",
+    "Walk the directory, find all JSON files, load them into phenopackets, and transform the phenopackets to patients.\n",
+    "\n",
+    "> Note: the first run takes longer since we must reach out to VEP REST API. However, the subsequent runs use data that we cache in `.genophenocorr_cache` folder next to this notebook."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Patients Created: 100%|██████████| 35/35 [00:00<00:00, 511.48it/s]\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'Loaded 35 samples'"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from genophenocorr.preprocessing import load_phenopacket_folder\n",
+    "\n",
+    "fpath_suox_cohort = os.path.join(os.getcwd(), os.pardir, 'notebooks', 'SUOX', 'phenopackets')\n",
+    "cohort = load_phenopacket_folder(fpath_suox_cohort, pc)\n",
+    "f'Loaded {len(cohort)} samples'"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Gather data for visualization\n",
+    "\n",
+    "Here we get the data required for visualizing the variants on selected transcript or protein."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Choose the transcript\n",
+    "\n",
+    "We need to choose the transcript and protein IDs - currently this is done manually but we will find a way how to do this automatically, e.g. using MANE transcript.\n",
+    "\n",
+    "The MANE Select transcript for *SUOX* is [NM_001032386.2](https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/HGNC:11460) and the corresponding protein accession ID is `NP_001027558.1`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "tx_id = 'NM_001032386.2'\n",
+    "protein_id = 'NP_001027558.1'"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Gather the data for visualization\n",
+    "\n",
+    "We need to get:\n",
+    "- variants\n",
+    "- transcript coordinates\n",
+    "- protein metadata"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Variants\n",
+    "\n",
+    "Variants are easy, `Cohort` exposes all the variants via the `all_variants` property:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "48"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "variants = cohort.all_variants\n",
+    "len(variants)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Variant(variant_coordinates:VariantCoordinates(region=GenomicRegion(contig=12, start=56003672, end=56003673, strand=+), ref=G, alt=GC, change_length=1), tx_annotations:(TranscriptAnnotation(gene_id:SUOX,transcript_id:NM_000456.3,hgvsc_id:NM_000456.3:c.287dup,is_preferred:False,variant_effects:(<VariantEffect.FRAMESHIFT_VARIANT: 'SO:0001589'>,),overlapping_exons:(6,),protein_affected:(ProteinMetadata(id=NP_000447.2, label=Sulfite oxidase, mitochondrial, features=(SimpleProteinFeature(type=FeatureType.DOMAIN, info=FeatureInfo(name=Cytochrome b5 heme-binding, start=82, end=161)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Hinge, start=165, end=174)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Moco domain, start=175, end=401)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Homodimerization, start=402, end=538)))),),protein_effect_location:Region(start=94, end=95)), TranscriptAnnotation(gene_id:SUOX,transcript_id:NM_001032386.2,hgvsc_id:NM_001032386.2:c.287dup,is_preferred:True,variant_effects:(<VariantEffect.FRAMESHIFT_VARIANT: 'SO:0001589'>,),overlapping_exons:(5,),protein_affected:(ProteinMetadata(id=NP_001027558.1, label=Sulfite oxidase, mitochondrial, features=(SimpleProteinFeature(type=FeatureType.DOMAIN, info=FeatureInfo(name=Cytochrome b5 heme-binding, start=82, end=161)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Hinge, start=165, end=174)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Moco domain, start=175, end=401)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Homodimerization, start=402, end=538)))),),protein_effect_location:Region(start=94, end=95)), TranscriptAnnotation(gene_id:SUOX,transcript_id:NM_001032387.2,hgvsc_id:NM_001032387.2:c.287dup,is_preferred:False,variant_effects:(<VariantEffect.FRAMESHIFT_VARIANT: 'SO:0001589'>,),overlapping_exons:(4,),protein_affected:(ProteinMetadata(id=NP_001027559.1, label=Sulfite oxidase, mitochondrial, features=(SimpleProteinFeature(type=FeatureType.DOMAIN, info=FeatureInfo(name=Cytochrome b5 heme-binding, start=82, end=161)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Hinge, start=165, end=174)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Moco domain, start=175, end=401)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Homodimerization, start=402, end=538)))),),protein_effect_location:Region(start=94, end=95)), TranscriptAnnotation(gene_id:IKZF4,transcript_id:NM_001351089.2,hgvsc_id:None,is_preferred:False,variant_effects:(<VariantEffect.UPSTREAM_GENE_VARIANT: 'SO:0001631'>,),overlapping_exons:None,protein_affected:(),protein_effect_location:None), TranscriptAnnotation(gene_id:IKZF4,transcript_id:NM_001351091.2,hgvsc_id:None,is_preferred:False,variant_effects:(<VariantEffect.UPSTREAM_GENE_VARIANT: 'SO:0001631'>,),overlapping_exons:None,protein_affected:(),protein_effect_location:None)), genotypes:Genotypes(['5=0/1']))"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "next(iter(variants))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Transcript coordinates\n",
+    "\n",
+    "Transcript coordinates can be fetched from Variant Validator API:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "TranscriptCoordinates(identifier=NM_001032386.2, region=GenomicRegion(contig=12, start=55997275, end=56005525, strand=+))"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from genophenocorr.model.genome import GRCh38\n",
+    "from genophenocorr.preprocessing import VVTranscriptCoordinateService\n",
+    "\n",
+    "txc_service = VVTranscriptCoordinateService(genome_build=GRCh38)\n",
+    "tx_coordinates = txc_service.fetch(tx_id)\n",
+    "tx_coordinates"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The `TranscriptCoordinates` object knows about the number of coding bases and aminoacid codons. \n",
+    "\n",
+    "Note, the counts of coding bases and codons do *not* include the termination codon."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "NM_001032386.2 has 1,635 coding bases\n",
+      "NM_001032386.2 has 545 codons\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(f'{tx_id} has {tx_coordinates.get_coding_base_count():,} coding bases')\n",
+    "print(f'{tx_id} has {tx_coordinates.get_codon_count():,} codons')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We can get the UTR regions (both 5' and 3') as well as the CDS regions.\n",
+    "\n",
+    "Note, for simplicity, the CDS regions include *both* initiation and termination codons!\n",
+    "\n",
+    "5' UTR regions:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "55,997,275-55,997,339\n",
+      "55,997,614-55,997,723\n",
+      "56,002,211-56,002,221\n"
+     ]
+    }
+   ],
+   "source": [
+    "for utr in tx_coordinates.get_five_prime_utrs():\n",
+    "    print(f'{utr.start:,}-{utr.end:,}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "CDS regions:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "56,002,221-56,002,271\n",
+      "56,002,542-56,002,720\n",
+      "56,003,617-56,005,027\n"
+     ]
+    }
+   ],
+   "source": [
+    "for cds in tx_coordinates.get_cds_regions():\n",
+    "    print(f'{cds.start:,}-{cds.end:,}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "3' UTR regions"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "56,005,027-56,005,525\n"
+     ]
+    }
+   ],
+   "source": [
+    "for utr in tx_coordinates.get_three_prime_utrs():\n",
+    "    print(f'{utr.start:,}-{utr.end:,}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Protein metadata\n",
+    "\n",
+    "Last, we fetch the protein metadata from Uniprot.\n",
+    "\n",
+    "The significance of the warning that is logged is unclear to me at this time. We need to investigate."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "ProteinMetadata(id=NP_001027558.1, label=Sulfite oxidase, mitochondrial, features=(SimpleProteinFeature(type=FeatureType.DOMAIN, info=FeatureInfo(name=Cytochrome b5 heme-binding, start=82, end=161)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Hinge, start=165, end=174)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Moco domain, start=175, end=401)), SimpleProteinFeature(type=FeatureType.REGION, info=FeatureInfo(name=Homodimerization, start=402, end=538))))"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from genophenocorr.preprocessing import UniprotProteinMetadataService\n",
+    "\n",
+    "pms = UniprotProteinMetadataService()\n",
+    "\n",
+    "protein_metas = pms.annotate(protein_id)\n",
+    "\n",
+    "assert len(protein_metas) == 1\n",
+    "protein_meta = protein_metas[0]\n",
+    "protein_meta"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We get metadata with 4 features (1 domain and 3 regions), which is in line with the Uniprot [Family & Domains section](https://www.uniprot.org/uniprotkb/P51687/entry#family_and_domains)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "name: Cytochrome b5 heme-binding, type: FeatureType.DOMAIN, start: 82, end: 161, \n",
+      "name: Hinge, type: FeatureType.REGION, start: 165, end: 174, \n",
+      "name: Moco domain, type: FeatureType.REGION, start: 175, end: 401, \n",
+      "name: Homodimerization, type: FeatureType.REGION, start: 402, end: 538, \n"
+     ]
+    }
+   ],
+   "source": [
+    "for feature in protein_meta.protein_features:\n",
+    "    print(f'name: {feature.info.name}, type: {feature.feature_type}, start: {feature.info.start}, end: {feature.info.end}, ')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Visualize the data"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Draw the figures"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now, let's draw the plots:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from genophenocorr.view import VariantTranscriptVisualizer\n",
+    "\n",
+    "viz = VariantTranscriptVisualizer()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3QAAANoCAYAAACIhKhbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABiO0lEQVR4nO3de5yWc/748fd0mo4zndRUOhHlfIp0UKiV0zplHTYr7DoWEutMDmuzWJuwWFbZXTaHRVishCySRDksCaUcKqQppekw1+8Pv7m/xszUNDUzrno+H495MNfxc891zzSvua/7urKSJEkCAACA1KlR3QMAAACgYgQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHVCqr7/+Opo2bRpnnHFGle979uzZkZWVFSeccEKJeTNnzozDDz888vLyIisrKxo3bhwREVdccUVkZWXFCy+8UKVjrSodOnSIDh06lHv5NX0N+d5P8WuUxudxRcd8wgknRFZWVsyePXu99r/33ntHVlZWsWkPP/xwZGVlxYQJE9Zr2wBpIOg2sKysrMjKyor27dvH8uXLS12mQ4cOkZWVFatWrSp13aKPmjVrRvPmzWPfffeN++67b73GtXDhwhg6dGh06NAhsrOzo3Xr1nHSSSfFp59+WuY6n376aZx00knRunXryM7Ojg4dOsTQoUPjm2++KXX5v/71r3HqqadGt27don79+pGVlRWXXnrpWsf2xBNPxN577x25ubnRsGHD6NatW9xzzz2lLvvyyy/H+eefH7vvvntsttlmkZ2dHR07dozf/OY38eGHH5ZYvugXtrV9/Pe//y22XtExKu0jLy9vnfdzzDHHlPp4FixYEOeff35sv/320ahRo2jWrFnstttucf3118eSJUvW+rUr8umnn8Y111wTv/jFL6JTp05Ro0aNyMrKKvVrUl7Dhw+P7777rtRjOGPGjDj55JOjU6dOUbdu3WjQoEF07Ngx9ttvv7jqqqti/vz5Fd7vmqxevToOO+ywePLJJ+Pggw+O4cOHx4UXXrjGdbKysmLvvfeulPGwcdpQoUH1Ofzww2PXXXeNYcOGRWFhYXUPB6BS1aruAWys5syZEyNHjlzrL5ulGT58eERErFy5Mt5///0YN25cPP/88/H666/HjTfeuM7b+/rrr6NHjx7xwQcfxL777hvHHHNMvP/++zF69Oj497//HZMmTYotttii2DofffRR9OjRIxYsWBCHHnpodOnSJV577bW46aab4umnn46XX345mjVrVmydc889N/Lz86NJkybRunXr+Oijj9Y6tltuuSXOPPPMaNasWRx33HFRp06deOihh+KEE06It99+O2644YZiyw8YMCC+/PLL6NGjRwwcODBq1aoVkyZNir/+9a8xduzYGD9+fHTv3j2zfOPGjTNfzx+bO3du3H333dGsWbPYY489SszPzc2NoUOHlpjesGHDMh/PTjvtFIcddliJ6dtvv32JabNnz45u3brFggULYu+9944DDjggli9fHs8880ycf/758Y9//CNeffXVqFevXpn7K/L666/HpZdeGllZWdGxY8fIzc2NRYsWrXW9ssyZMyfuuOOOOPHEE6N169bF5j333HNx0EEHxfLly6N79+6x//77R05OTnz++efxyiuvxPjx46NHjx7RsmXLCu+/LLNmzYr//e9/cfLJJ8df/vKXYvOGDBkSxxxzTLRr126D7/enwCsNG16bNm3ivffei9zc3OoeyiZpxIgRceGFF0abNm02+LazsrLiggsuiKOPPjrGjh0bv/zlLzf4PgB+MhI2qIhImjRpkjRt2jTJzc1NvvzyyxLLtG/fPomIZOXKlSXWLe2QPPvss0lWVlaSlZWVzJo1a53HdMoppyQRkQwbNqzY9JtuuimJiKR///4l1tlvv/2SiEhGjRpVbPo555yTRERy6qmnlljnqaeeSmbPnp0kSZKMHj06iYjkkksuKXNcs2bNSrKzs5OmTZsWe1wLFy5MttxyyyQikldeeaXYOtdee23y2WefldjWNddck0REsv3225e5vx+78MILk4hIzjnnnBLz2rdvn7Rv377c25o1a1YSEcmgQYPKvc4ZZ5yRRERyxRVXFJu+atWqZN99900iIrnnnnvKta25c+cmL774YpKfn58kSZL06dMniYhk5syZ5R7PD1188cVJRCQvv/xyiXmdOnVKIiIZM2ZMqetOnz49mTNnToX2W6Ssr+fEiROTiEiGDx9e7m1FRNKnT5/1Gk8aVeQ5yfcGDRqURESFft6ur+HDhycRkTz//PNVvu+Kqu4xF/28+7Hvvvsuady4cdKzZ89qGBVA1XHKZSWoX79+XHbZZZGfnx9XXnnlem+vb9++0aVLl0iSJKZMmbJO63777bfx97//PRo0aBBXXHFFsXlDhgyJ9u3bx3/+85/4+OOPM9M/+uijeOaZZ6JDhw4xePDgYutceeWV0aBBg/j73/8eS5cuLTZv//33j/bt25d7bHfffXcUFBTEkCFDir03qEmTJnHxxRdHRMTtt99ebJ0LLrigxCtGRdPr1asX77zzTnz99ddr3ffKlStjzJgxERFxyimnlHvMG1LR1/yQQw4pNr1mzZpx0EEHRUTEl19+Wa5tbb755rHXXntFTk7Oeo8rSZIYPXp0tG3bNnr06FFs3oIFC+LDDz+M3NzcGDRoUKnr77jjjtG2bdti09Z02mN5T2/LysqKPn36RMT3z8Oi01mLntc/fh/PmDFjMu+rmThxYrFTYH/8vTB58uQ48sgjIy8vL+rUqRNt27aNU089NT7//PM1junHCgoK4tprr40ddtgh6tevHzk5ObHXXnvFAw88UGy5ovf37LnnnrFy5cpi8955552oX79+tG7dOhYsWJCZXtZ76JYsWRLDhg2LzTffPOrWrRtdunSJG2+8sczTzD744IO48MILo2vXrpnTltu3bx+nnHJKqadgJ0kS99xzT/To0SM222yzqFu3brRt2zb69+8f999/f4nlP/300xgyZEhsscUWkZ2dHc2aNYtDDjlknX92laXo/VIrV66Mq666KrbccsuoW7dudO7cOe68887McrfffnvssMMOUa9evdh8881j+PDhJb4mpb2HLisrK3PKd8eOHTPPmR9/7WfOnBnHH398tGnTJurUqROtW7eO448/PmbOnFnquFevXh2333579OzZM3Jzc6NevXrRqVOn+M1vflPmOg899FDsscceUb9+/WjatGkcc8wx8dlnn5W67LqM54ffK+uyj6lTp8b+++8fjRo1ipycnOjXr19MmjSp1GUj/u/7ft68efGb3/wm2rRpEzVr1sz87C3re3/MmDExYMCA2GKLLaJevXqRk5MTPXv2jH/84x9l7qs0devWjcMOOyxefvnleP/999dpXYA0ccplJRk8eHDccsstcccdd8RZZ50VW2211XptL0mSiIgSb/xem1dffTW+++672G+//aJRo0bF5tWoUSP69+8ff/nLX+L555/PnHb5/PPPR0TEfvvtFzVqFG/+Ro0aRc+ePeOZZ56JV199Nfr27VvRhxTPPfdcRHwfgj92wAEHFFtmbbKysqJWre+fzjVr1lzr8o899ljMmzcvevfuHV26dCl1mYKCgvjHP/4Rc+bMiQYNGsSOO+4YvXv3XuP2P//887jjjjvi66+/jmbNmkX37t1jxx13LHXZ7bbbLp5++un497//HbvssktmemFhYTz11FNRo0aN2Hfffdf6WDa0d999N7744otS3/eXm5sbtWrVim+//Ta++OKLaNWqVZWNa/jw4TF79uy45557ok+fPplALCsUd9555xg+fHhceeWV0b59+2K/tP9wnbvvvjtOOeWUyM7OjkMOOSTatm0bM2fOjLvuuisef/zxePXVV8t1GueKFSuif//+MXHixOjSpUsMHjw4li1bFg899FAcffTRMW3atPj9738fERFHHHFEDB48OG699da45JJL4rrrrouIiGXLlsVRRx0VBQUFce+990aLFi3WuM+CgoLo27dvTJkyJXbaaacYOHBgLFq0KK6++uqYOHFiqes8/PDDcfvtt8c+++wTPXr0iDp16sS7776bebyvv/56sVPgLrnkkhgxYkR07NgxjjrqqMjNzY0vvvgipkyZEg8++GAcffTRmWXfeOON2G+//WLhwoXRv3//OOKII+Krr76KRx99NHr16hWPPPJIHHjggWv9WpbHMcccE5MnT44DDzwwateuHQ899FCccsopUbt27XjrrbfinnvuiYMPPjj69u0bjz32WFx11VVRv379uOCCC9a43eHDh8ejjz4a06dPj7PPPjtz0Z2i/0ZETJkyJfr16xdLliyJQw45JLbddtt4//334x//+EeMGzcunn322dh9990zy69YsSIOPvjgGD9+fLRt2zZ++ctfRk5OTsyePTseeeSR6NWrV4l/I/785z/HY489Foccckj06dMnJk+eHPfff39Mnz49pk2bFtnZ2RUeT0X28corr0S/fv1ixYoVccQRR0SnTp1i2rRpsffee6/x59TChQtjzz33jIYNG8YRRxwRNWrUWOvp2Keffnpst9120bt372jVqlV8/fXX8eSTT8avfvWrmDFjRlx99dVrXP+HevbsGWPGjIlnn322zJ/1AKlXvS8QbnwiImnTpk2SJEny4IMPJhGRHH744cWWWddTLsePH5855bLolMbyuuWWW5KISIYMGVLq/Ouvvz6JiOT888/PTDvvvPOSiEhuuOGGUtcZPHhwEhHJn//85zL3W55TLps3b55ERPLVV1+VOr9BgwZJRCRLly4tcxtFxo4dm0REsueee6512ST5v1NK77333lLnFx2jH3907NgxeeGFF0osX3R6W2kfe++9d/LJJ5+UWGf+/PlJ586dk4hI9t133+S8885LzjrrrKRLly5J48aNk7vvvrtcj6U063PK5W233bbG4z9gwIAkIpItttgiuf7665NXX311rcco1nDaY2mnt5V1uuDzzz9f5imXZZ32taZ9z5gxI6ldu3ay5ZZbJp9++mmxec8++2xSo0aN5LDDDlvjYyvy+9//PomI5IADDij2vT1//vzM8+mHp7AuX7482WWXXZKsrKzkqaeeSpIkSU444YQkIpLLL7+8xPZLOw246FTjI444Ilm9enVm+scff5w0adKk1K/hp59+mixfvrzE9v/zn/8kNWrUSE477bRi05s2bZq0adOm1GP8w1PKV65cmWy55ZZJdnZ2ie+Rzz77LGndunWSl5dX6r7XRdFzu2vXrsk333yTmf7RRx8ltWvXTho3bpx06NCh2PH85ptvkmbNmiXNmzcvdmzKep6t6ZTLwsLCpEuXLklEJP/4xz+KzSv6OdS5c+dix+Oiiy5KIiL5+c9/XuLxL1++PFmwYEHm86LncaNGjZK33nqr2LLHHntsEhHJ/fffv17jqcg+in5WPfroo8WWHzlyZOZnXWnfexGR/OpXvyrx712SlP11/vDDD0ssW1BQkOy7775JrVq1SnyvlnXKZZIkybRp05KISH7xi1+UOh9gY+CUy0p05JFHRvfu3eORRx6Jl156qdzrXXHFFXHFFVfEJZdcEkceeWTsv//+kSRJDB06dJ1OaYyIyM/Pj4go803/RdN/eAGNiqxTEeXdT9FyZZk1a1aceeaZUatWrXJdNGb27Nkxfvz4aNasWQwYMKDUZU488cSYMGFCzJs3L5YuXRpvv/12nHrqqTF79uw44IADYvr06cWWLzrNdurUqfHNN9/EN998ExMnTox99tknXnjhhejbt2+JU1RbtGgRr776ahx++OHx3HPPxQ033BCjRo2KGTNmxFFHHRX9+vVb62OpDHPmzImIKPPVtzvvvDOOOOKImDVrVvz2t7+NPffcMxo1ahQ77bRTXHrppZV2hcvKcNttt8XKlSvjpptuKnFhhr59+8YhhxwSjz/+eLmuOHr33XdHVlZW3HjjjZlXiyO+P86XXXZZRETcddddmenZ2dlx//33R4MGDeL444+PG264IcaMGRO9e/eOyy+/vFzjHz16dNSoUSOuu+66Yq+md+zYMc4666xS12nTpk2xV16K7LfffrHddtvFf/7znxLzateuXeor082bN8/8/7///e/46KOP4swzz8ycGlukdevWcf7558e8efM22MVdrr322mKvmm2xxRbRq1evWLRoUVx22WXFjmfjxo3j5z//eXz11Vdlnk5YXq+88kq8//770b179xg4cGCxeUcffXT06tUrZsyYkfmZv3r16vjzn/8c9erVi9tvv73E1z47Ozs222yzEvs566yzYocddig27eSTT46IiNdee63C46noPmbMmBG9e/eOQw89tNjyQ4YMiS233LLEtovUqVMnbrjhhmLfE2tT2vbq1KkTgwcPjlWrVq3Tc6joqsRFP9cANkZOuaxkf/zjH6NHjx5x3nnnxauvvlqudYred1d0j6299torfv3rX8dxxx1XmUNNpQULFsQBBxwQX375Zdx6663FrnBZljvvvDOSJIlBgwaV+ottRJS4Mub2228ft99+ezRs2DD++Mc/xhVXXBGPPPJIZn6LFi3iqquuKrZO796945lnnolevXrF5MmT46677oqzzz47M3/27NlxyCGHxHfffRdPPvlk9OzZM5YtWxbjxo2Lc889N8aNGxeTJk2Kjh07rsuXZL0VvQexSZMmpc5v0qRJ/Otf/4rZs2fHf/7zn3j99ddjypQp8dZbb8Vbb70Vt912Wzz99NOlnuL1U1P0/p+JEyeW+h6vBQsWxOrVq+ODDz6I3XbbrcztLFmyJD788MNo06ZNqad1FZ2S9uabbxabvtVWW8Xtt98exx13XPz2t7+N5s2bx3333Veu04aL9tm2bdtSfwHee++9S30Pb5Ikce+998aYMWNi+vTp8c0338Tq1asz8+vUqVNs+YEDB8bNN98c2267bRx11FHRp0+f6N69e4k/xBR9LT/55JMS71GMiMx7ud57770Nctpl165dS0wren9taceqKPA+/fTTdf7D2A+98cYbERFlnma47777xksvvRRvvvlm9O7dO95///3Iz8+Pbt26lfr+37KU9viK3pv6w1vHrOt41mcfPw71iO9Pce/Vq1eZVzXu0KHDWk8d/rE5c+bEH/7wh5gwYULMmTMnvvvuu2Lz1yXKmzZtGhERX3311TqNASBNBF0l6969exx55JHx0EMPxf3331/s/SZlSf7/++U2hLW9ylU0/Yd/6a7IOhUd21dffRX5+fklboHww/2U9QreggULYt99940ZM2bETTfdVK4bYK9atSpGjx4dERW7GMppp50Wf/zjH+PFF18s1/K1atWK3/zmNzF58uR48cUXiwVd0a0Zpk+fnnmfXU5OTpx66qmxfPnyGDp0aFx55ZWZCwhUlaLbJJR1H8UiHTp0iFNPPTVOPfXUiPj+F+UzzjgjHn/88Tj55JNj2rRplT3U9VYUr9dff/0al/v222/XOL/ouVrWq5pF00t7VXu//faLnJycWLx4cfziF78o9yXci/ZZ1vuRSrtfYkTEsGHDYuTIkdGqVavo379/tGnTJnPMx4wZE5988kmx5f/0pz/FFltsEaNHj45rr702rr322qhVq1YceOCB8cc//jE6deoUEf/3tXzwwQfXOO61fS3Lq7SfC0WvAq1p3o8vQrOu1vVYF/13XS/NX9rP16LH8MMAX5/n3rruY12fa2ubV5qPP/449thjj/jmm29ir732iv322y9yc3OjZs2amffQFhQUlHt7RTFYntu/AKSVoKsCI0aMiHHjxsVFF10Uhx9+eJXuu3PnzhHx/ZXtSlP0V/Ott956vdap6Ni++uqr+OCDD0q8svbFF1/E0qVLY/PNN4/69euXWPeLL76Ivn37xvvvvx+33npruWIuIuLxxx+PL774Ivr06ZN5nOui6NSoH58+ua7rLFmyJCZOnBhNmzYt9aIp++yzT0R8f1W5qlb01/TyXC30hzbffPMYO3ZsNGnSJKZPnx4LFy7M/HU8KysrVq1aVep663vq7vr44R8v1ucKoUXbmTdvXqnzv/jii2LLFUmSJI4//vhYvHhxNG/ePP7yl7/EMcccU+KVlDXts6xTXEsby4IFC2LUqFGx/fbbxyuvvFLiQkn//Oc/S6xTs2bNGDp0aAwdOjQWLFgQL730UowdOzYefPDBePfdd+Pdd9+N7OzszHjGjRtX4sqtG5N1PdZF0bS+p3puqPGszz7W5blWZF0v5HXjjTfG119/HaNHjy52IaOI75+fRVcgLa+in2Pr+iohQJp4D10V6NSpU5xxxhkxa9asuPnmm6t033vuuWfUq1cvXn755RLvAyosLIxnnnkmIv4vIH74/88880yJy3wvWbIkXn755ahfv37sueee6zW2olOEnn766RLznnrqqWLL/NCnn34affr0iffffz9uv/32csdcRGRuRl3RWxUUnTb74xuxr+s6K1asiIiIxYsXZ/7/h4puV/Dj09+qQlFgVuQy39nZ2Zkx//CV5iZNmsTcuXNLLL969epKfyWvRo0axV5t+KGi5/B///vf9dpHo0aNYsstt4zPPvus1MvEF105dtdddy02/frrr4+nn346Bg4cGM8991zUrl07fvnLX5Yrphs1ahSdOnWKzz77rNTT3Ypu3/BDH3/8cRQWFpZ61dtPP/202O1LStOiRYs44ogj4oEHHoh99903Pvroo3jnnXciYsN9LX8Kik55Le15U3RF2tK+vhElj3WXLl2icePG8dZbb63zbTDKY13HUxFF65Z25dTVq1ev03vE1+bDDz+MiCj1/c1lXbl1TYp+ju28887rNS6AnzJBV0Uuv/zyaNy4cVxzzTUb7JSj8mjYsGH86le/iqVLl5Z4X8stt9wSs2fPjv79+xeLjS233DL222+/mD17dtx6663F1hk+fHgsXbo0fvWrX0WDBg3Wa2wnnnhiZGdnZ8ZR5Jtvvslc3v20004rts4nn3wSvXv3jo8++ihzufny+uSTT+KZZ55Z48VQIr5/j09pr8DNnj07hgwZEhFR4v2Mb7zxRqn3/ZowYUL86U9/KrFOs2bNYptttolVq1aVuAT38uXL43e/+11ERInbQnzxxReZ9+RUlr322itq1qxZ6ns+ly5dGldffXWZf6kfOXJkfPvtt7HtttsWO412jz32iDlz5mT+gFDkd7/7XYlT/Da0Zs2alRqTEd9f0KF27dpxzjnnlPqK9IoVK8odKCeddFIkSRK//e1vi4XAV199lTnGJ510Umb6q6++Gpdcckl06tQpbrvttthhhx3iT3/6U3z22WcxaNCgcp16feKJJ0ZhYWFccMEFxZ5/s2bNilGjRpVYvuheai+99FKxMX777bdx8sknl3gVtaCgIF5++eUS21m5cmUsXLgwIiLzCvqhhx4aW265Zdx6663x5JNPljreSZMmxbJly4pNK7rP209J0XO3tAtp9OzZMzp37hwvvfRSPPTQQ8XmPfTQQ/Hf//43tt566+jVq1dEfB+HZ5xxRnz33Xdx2mmnlThdcMWKFeW+32Rp1nU8FdGjR4/o3LlzvPjiizFu3Lhi82655ZYy3z9XEUXP0R8H6n/+859iFxUqr6KfYz/8oyXAxsYpl1WkadOmcfHFF8f5559f5fv+/e9/Hy+88ELceOONMW3atNhjjz3ivffei3HjxkWLFi1KRFvE9/cn6tGjR5x11lkxYcKE2GabbWLy5Mnx/PPPx9Zbbx3XXHNNiXXuuuuuzF9qi/7K+vjjj2duVtylS5e48MILM8t37Ngxrr/++jjrrLOia9eucfTRR0edOnXioYceik8//TTOPffcEqdi7r333jF79uzYbbfdYvbs2aVefOGEE04o9QbMd911VxQWFq7xYigREffff3/88Y9/jN69e0f79u2jUaNG8dFHH8W///3vWL58eRx44IFx3nnnFVtn2LBhMXPmzOjRo0dsvvnmERHx1ltvZe6jd/XVV5e4SfeoUaPioIMOit/97ncxfvz46NGjR3z33Xfx1FNPxSeffBKdOnUqcc+siy66KO65555ST0f64edFf5W+4IILMq/E/OY3vynXL3W5ubnRt2/feOGFF+Kbb74pdnGUlStXxuWXXx5XXnll7LHHHrHzzjtHkyZNYuHChfHyyy/H22+/HQ0aNChxQ/jzzjsv/vOf/8Shhx4aRx99dDRt2jReeeWVmDVrVuy9995lvrqwIfTt2zfGjh0bP//5z2PXXXeN2rVrR+/evTP3ILz77rvjpJNOiu222y7233//2HrrrWPlypUxZ86c+O9//xubbbZZuV6tPO+88+Kpp56KcePGxU477RQHHnhgLFu2LB588MFYsGBBnH/++Zmv/6JFi+LYY4+NGjVqxNixYzPH6LTTTosJEybEQw89FDfeeGOce+65a9znueeeG48++mj861//il133TX69+8fixYtigceeCB69+4djz32WLHl8/Ly4phjjomxY8fGzjvvHPvtt1/k5+fH+PHjo27durHzzjsXe8X0u+++i169ekWnTp1it912i/bt28fy5ctj/Pjx8d5778UhhxwS22yzTUR8fyXMhx9+OPr37x8HHXRQ9OjRI3beeeeoX79+zJ07N6ZMmRIff/xxfPHFF5kILIrQ8lwEpir17ds3rr/++jj55JNjwIAB0ahRo2jcuHEMGTIkc+Pxn/3sZ3H00UfHoYceGl26dIkZM2bEo48+Go0aNYq//e1vxa46Onz48Jg8eXI8/vjjsfXWW8fBBx8cjRo1irlz58YzzzwT119/fYnv5/KqyHgqso+//vWv8bOf/SwGDBhQ7D50EyZMiP3337/UMy0q4owzzojRo0fHL37xizjyyCOjdevW8c4778TTTz8dRx11VKk3s1+TZ555Jho3blwt9/QEqDLVd8eEjVP84D50P7Z8+fKkQ4cOmXvzlPc+dBvC119/nZx11llJu3btktq1ayd5eXnJiSeemMydO7fMdebMmZOccMIJSV5eXlK7du2kXbt2ydlnn50sXLiw1OWL7ilU1kdZ9wJ77LHHkt69eycNGzZM6tevn3Tt2jUZM2ZMqcuuaftRxr2QkiRJVq1albRu3TqJiOT9999f49fqhRdeSI455pikc+fOSW5ublKrVq2kefPmSb9+/ZJ77rknKSwsLLHOXXfdlRx00EFJ+/btkwYNGiR16tRJ2rZtmxx11FHJiy++WOa+pk+fnhx33HFJ27Ztk9q1ayd169ZNtt122+Siiy4qdo+tIkVf49GjR6/z16a0dcry6KOPlnqvwdWrVydPPfVUMmzYsGSPPfZIWrVqldSqVStp2LBhssMOOyRnn312qffuSpIkGTduXLLbbrsl2dnZSdOmTZOjjz46mT17dqXfh27+/PnJsccem7Ro0SKpUaNGqeu/9dZbyaBBg5J27dolderUSZo0aZJst912ySmnnJJMmDChnF+1JPnuu++Sa665Jtluu+2SunXrJg0bNkx69uyZ3HfffcWWO+KII5KISG688cYS21i0aFHSsWPHpHbt2snkyZMz00u7D12SJEl+fn5yzjnnJK1bt06ys7OTzp07JzfccEPy0Ucflfo1XLp0aXLxxRdn7hm3+eabJ2eccUby1Vdflbif14oVK5I//OEPyf7775+0bds2yc7OTpo3b55069Ytue2225KCgoIS45k/f35ywQUXJNttt11Sr169pEGDBkmnTp2SAQMGJH//+9+L/dwrukfYwIEDy/slXuM9x9Z0/7jSnh9lPc+SJEn++Mc/Jl26dEnq1KmTRESJr/3777+fHHfccUleXl5Sq1atJC8vLxk4cGCZP19WrlyZ3Hzzzcnuu++eNGjQIKlfv37SqVOn5OSTTy52v8iynsdrG++6jKei+3j99deT/v37Jw0bNkwaNmyY9O3bN3nllVcqdA/IJCn7eL388svJPvvskzRu3DjzPfTII4+U+f1f1nNixowZSUQkZ599dpljANgYZCXJBrykIrBRWL16deywww5Rp06dePPNN39yp8SxcRg1alQMHTo03n777dhuu+2qezhsZM4999y45ZZb4r333lun9z0DpI330AEl1KxZM2644YaYPn16PPzww9U9HDZSEydOjEMOOUTMscF98cUXcdttt8WZZ54p5oCNnlfogDKNGjUqmjVrFgMHDqzuoQCU26RJk+KZZ56Js88+e73vmQrwUyfoUmbRokUxcuTIci1b1sVBAACAjUOqg+7FF1+M66+/PqZOnRpffPFFPPLII3HYYYdFxPdX47v00kvjySefjI8//jhyc3OjX79+ce2110br1q0z21i4cGGceeaZ8fjjj0eNGjViwIABcdNNN0XDhg2r6VGt2ezZs6Njx47lWvb555+Pvffeu3IHBAAAVJtUv4du6dKlsdNOO5V62f1ly5bFG2+8EZdddlm88cYb8fDDD8eMGTPikEMOKbbcwIED4913343x48fHE088ES+++GKFbzpdFTp06BBJkpTrQ8wBAMDGLdWv0P1QVlZWsVfoSjNlypTYY4894pNPPol27drFe++9F9tuu21MmTIlunbtGhERTz/9dBx44IHx6aefFnslDwAA4Kdmk7qxeH5+fmRlZWXeID1p0qRo3LhxJuYiIvr16xc1atSIyZMnx+GHH17qdgoKCqKgoCDzeWFhYSxcuDCaNWvm8u4AALAJS5IklixZEq1bt44aNSr/hMhNJuiWL18eF1xwQRx77LGRk5MTERHz5s2LFi1aFFuuVq1a0bRp05g3b16Z2xoxYkRceeWVlTpeAAAgvebOnRubb755pe9nkwi6lStXxlFHHRVJksRtt9223tu76KKLYtiwYZnP8/Pzo127djF37txMLAIAAJuexYsXR9u2baNRo0ZVsr+NPuiKYu6TTz6J5557rlhw5eXlxYIFC4otv2rVqli4cGHk5eWVuc3s7OzIzs4uMT0nJ0fQAQAAVfZWrFRf5XJtimJu5syZ8eyzz0azZs2Kze/evXssWrQopk6dmpn23HPPRWFhYXTr1q2qhwsAALBOUv0K3bfffhsffvhh5vNZs2bFtGnTomnTptGqVas48sgj44033ognnngiVq9enXlfXNOmTaNOnTqxzTbbxP777x8nn3xy3H777bFy5coYMmRIHHPMMa5wCQAA/OSl+rYFL7zwQuyzzz4lpg8aNCiuuOKKMm/A/cMbbi9cuDCGDBlS7Mbio0aNWqcbiy9evDhyc3MjPz/fKZcAALAJq+o2SHXQ/VQIOgAAIKLq22Cjfg8dAADAxkzQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpVIddC+++GL8/Oc/j9atW0dWVlY8+uijxeYnSRKXX355tGrVKurVqxf9+vWLmTNnFltm4cKFMXDgwMjJyYnGjRvHr3/96/j222+r8FEAAABUTKqDbunSpbHTTjvFrbfeWur86667LkaNGhW33357TJ48ORo0aBD9+/eP5cuXZ5YZOHBgvPvuuzF+/Ph44okn4sUXX4xTTjmlqh4CAABAhWUlSZJU9yA2hKysrHjkkUfisMMOi4jvX51r3bp1nHvuuXHeeedFRER+fn60bNkyxowZE8ccc0y89957se2228aUKVOia9euERHx9NNPx4EHHhiffvpptG7dulz7Xrx4ceTm5kZ+fn7k5ORUyuMDAAB++qq6DVL9Ct2azJo1K+bNmxf9+vXLTMvNzY1u3brFpEmTIiJi0qRJ0bhx40zMRUT069cvatSoEZMnTy5z2wUFBbF48eJiHwAAAFVtow26efPmRUREy5Yti01v2bJlZt68efOiRYsWxebXqlUrmjZtmlmmNCNGjIjc3NzMR9u2bTfw6AEAANZuow26ynTRRRdFfn5+5mPu3LnVPSQAAGATtNEGXV5eXkREzJ8/v9j0+fPnZ+bl5eXFggULis1ftWpVLFy4MLNMabKzsyMnJ6fYBwAAQFXbaIOuY8eOkZeXFxMmTMhMW7x4cUyePDm6d+8eERHdu3ePRYsWxdSpUzPLPPfcc1FYWBjdunWr8jEDAACsi1rVPYD18e2338aHH36Y+XzWrFkxbdq0aNq0abRr1y6GDh0av/vd72KrrbaKjh07xmWXXRatW7fOXAlzm222if333z9OPvnkuP3222PlypUxZMiQOOaYY8p9hUsAAIDqkuqge/3112OfffbJfD5s2LCIiBg0aFCMGTMmzj///Fi6dGmccsopsWjRoujVq1c8/fTTUbdu3cw69957bwwZMiT69u0bNWrUiAEDBsSoUaOq/LEAAACsq43mPnTVyX3oAACACPehAwAAoJwEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKVWrugcAG1qSJPHdytUREVGvds3IysraIMtWtuocS2XtuyLbTZIklq1YFd+tXB31ateM+nVqrfd4KuPx/ZSeO5Vp1apV8fFXyyIiYovm9aNWrer/Z2NDfu3Lu60fLxcRP7njX1hYGAuXrYiIiKb160SNGv5mW1nKet5U5PulKp9bZY27oKAgXp31TRSsKozd2+dG44b1K/05vbbvvZ/Kv4l1a9WI5asK1ziO1atXx+f5yyMiIq9Rncgv+H7dTeX7sCI/e/y82rCq/19m2MC+W7k6tr38PxER8b+r+kf9OmU/zddl2cpWnWOprH1XZLvfrVwd2w1/JvP5hhhPZTy+n9JzpzJ9/NWy2G/kfyMi4pmhe8XWeTnVPKIN+7Uv77Z+vFxE/OSO/8JlK6Lr7yZERMTrl/aN5g3rVvOINl5lPW8q8v1Slc+tssb96uxFMWjM1MxyVfGcXtv33k/l38TXL+2b+b4qaxyf5y+Pva57ISIixg3uEYfe+kpm3U3h+7AiP3v8vNqw5DAAAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSG3XQrV69Oi677LLo2LFj1KtXL7bccsu4+uqrI0mSzDJJksTll18erVq1inr16kW/fv1i5syZ1ThqAACA8tmog+4Pf/hD3HbbbXHLLbfEe++9F3/4wx/iuuuui5tvvjmzzHXXXRejRo2K22+/PSZPnhwNGjSI/v37x/Lly6tx5AAAAGtXq7oHUJleeeWVOPTQQ+Oggw6KiIgOHTrEP//5z3jttdci4vtX50aOHBmXXnppHHrooRER8be//S1atmwZjz76aBxzzDHVNnYAAIC12ahfoevRo0dMmDAhPvjgg4iImD59erz00ktxwAEHRETErFmzYt68edGvX7/MOrm5udGtW7eYNGlSmdstKCiIxYsXF/sAAACoahv1K3QXXnhhLF68OLp06RI1a9aM1atXxzXXXBMDBw6MiIh58+ZFRETLli2LrdeyZcvMvNKMGDEirrzyysobOAAAQDls1K/QPfDAA3HvvffGfffdF2+88Ubcc889ccMNN8Q999yzXtu96KKLIj8/P/Mxd+7cDTRiAACA8tuoX6H77W9/GxdeeGHmvXA77LBDfPLJJzFixIgYNGhQ5OXlRUTE/Pnzo1WrVpn15s+fHzvvvHOZ283Ozo7s7OxKHTsAAMDabNSv0C1btixq1Cj+EGvWrBmFhYUREdGxY8fIy8uLCRMmZOYvXrw4Jk+eHN27d6/SsQIAAKyrjfoVup///OdxzTXXRLt27WK77baLN998M2688cY46aSTIiIiKysrhg4dGr/73e9iq622io4dO8Zll10WrVu3jsMOO6x6Bw8AALAWG3XQ3XzzzXHZZZfFGWecEQsWLIjWrVvHqaeeGpdffnlmmfPPPz+WLl0ap5xySixatCh69eoVTz/9dNStW7caRw4AALB2G3XQNWrUKEaOHBkjR44sc5msrKy46qqr4qqrrqq6gQEAAGwAG/V76AAAADZmgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACkVFaSJEl1DyLtFi9eHLm5uZGfnx85OTnVPZxNXpIk8d3K1RERUa92zcjKytogy1a26hxLZe27IttNkiSWrVgV361cHfVq14z6dWqt93gq4/H9lJ47lWnVqlXx8VfLIiJii+b1o1at6r996Yb82pd3Wz9eLiJ+cse/sLAwFi5bERERTevXiRo1/M22spT1vKnI90tVPrfKGndBQUG8OuubKFhVGLu3z43GDetX+nN6bd97P5V/E+vWqhHLVxWucRyrV6+Oz/OXR0REXqM6kV/w/bqbyvdhRX72bOw/r6q6DQTdBiDoAACAiKpvg40rhwEAADYhgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKRUreoeAJUrPz8/li1bVt3D2KR06NAhVqxYUd3DoBzq1KkTs2fPru5hAAAbkSVLllTp/gTdRiw/Pz9uueWWWLlyZXUPZZNx5ZVXRruIaF7dA6FcvlqxIlq3bh3Dhw+v7qEAABuJgoKCKt1fVpIkSZXucSO0ePHiyM3Njfz8/MjJyanu4WR88cUXcccdd8QRRxwRm222WXUPZ5PQunXr2DUihkdEh2oeC2s2OyKujIg3IuLzzz+v3sEAABuNJUuWROfOnausDbxCtwnYbLPNolWrVtU9jE1Kh4jYsboHQbn5/gAANpQGDRpU6f5cFAUAACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIqVrlWeiqq66q0MazsrLisssuq9C6AAAArFm5gu6KK66o0MYFHQAAQOUpV9A9//zzlT0OAAAA1lG5gq5Pnz6VPQ4AAADWkYuiAAAApFS5XqEry9tvvx333ntvvPfee7F06dJ49tlnIyJi7ty58eabb0afPn0iNzd3gwwUAACA4iocdFdddVVcddVVUVhYGBHfXwClyPLly+Pwww+Pm2++Oc4444z1HyUAAAAlVOiUy4ceeiiuuOKK2GmnnWLcuHFx+umnF5u/1VZbxc477xyPPfbYBhkkAAAAJVXoFbqbbrop2rRpExMnToyGDRvGG2+8UWKZ7bbbLl566aX1HiAAAAClq9ArdNOnT4+DDjooGjZsWOYybdq0iXnz5lV4YAAAAKxZhYJu9erV0aBBgzUus3Dhwqhdu3aFBgUAAMDaVSjotthii5g6deoal3n11VejS5cuFRoUAAAAa1ehoDv88MPjv//9bzzwwAOlzr/rrrvinXfeiSOPPHK9BgcAAEDZKnRRlPPOOy/Gjh0bv/zlL+OBBx6IxYsXR0TEyJEj47///W+MGzcuunTpEkOGDNmggwUAAOD/VCjocnJy4oUXXojjjz8+Hn744cz0YcOGRUREnz594r777ot69eptmFECAABQQoVvLN66det49tln45133omXX345vv7668jNzY3u3bvHrrvuuiHHCAAAQCkqHHRFtt9++9h+++03xFgAAABYB+sddKtXr44ZM2ZEfn5+5ObmRufOnaNmzZobYmwAAACsQYWuchkR8c0338Tpp58ejRs3jh122CF69eoVO+ywQzRu3DhOP/30WLhw4YYcJwAAAD9SoVfoFixYED179oyPPvooGjRoEN26dYuWLVvG/Pnz4+2334477rgjJkyYEC+//HJsttlmG3rMAAAARAVfobvkkkvio48+iiFDhsScOXPilVdeiUceeSReeeWVmDt3bgwePDg+/PDDuOSSSzb0eAEAAPj/KhR0jz/+ePTs2TNGjRoVTZo0KTavcePGcfPNN0f37t3jscce2yCDBAAAoKQKBd3ixYujd+/ea1ymT58+sWTJkgoNCgAAgLWrUNB17tw55s2bt8Zl5s2bF1tvvXWFBgUAAMDaVSjozjrrrLj//vvjrbfeKnX+tGnT4v7774+zzz57vQYHAABA2cp1lcsXX3yx2Odbbrll9O3bN/bYY484/vjjo3fv3pmrXE6cODH+/ve/x/777x9bbLFFpQwaAACAcgbd3nvvHVlZWSWmJ0kSd911V/z1r38tNi0i4rHHHovHH388Vq9evYGGCgAAwA+VK+iOP/74UoMuDT777LO44IIL4qmnnoply5ZFp06dYvTo0dG1a9eI+D5Ahw8fHnfeeWcsWrQoevbsGbfddltstdVW1TxyAACANStX0I0ZM6aSh1E5vvnmm+jZs2fss88+8dRTT8Vmm20WM2fOLHarheuuuy5GjRoV99xzT3Ts2DEuu+yy6N+/f/zvf/+LunXrVuPoAQAA1qxcQZdWf/jDH6Jt27YxevTozLSOHTtm/j9Jkhg5cmRceumlceihh0ZExN/+9rdo2bJlPProo3HMMcdU+ZgBAADKq0JXuUyLxx57LLp27Rq/+MUvokWLFrHLLrvEnXfemZk/a9asmDdvXvTr1y8zLTc3N7p16xaTJk0qc7sFBQWxePHiYh8AAABVbb1eoXvttdfimWeeic8++ywKCgpKzM/Kyip2wZSq9vHHH8dtt90Ww4YNi4svvjimTJkSZ511VtSpUycGDRqUuZdey5Yti63XsmXLNd5nb8SIEXHllVdW6tgBAADWpkJBV1hYGMcff3z885//jCRJIisrK3N1y4jIfF7dQVdYWBhdu3aN3//+9xERscsuu8Q777wTt99+ewwaNKjC273oooti2LBhmc8XL14cbdu2Xe/xAgAArIsKnXJ58803x3333Re/+tWv4vXXX48kSWLo0KHxyiuvxO9///to1KhRHHPMMfHxxx9v6PGuk1atWsW2225bbNo222wTc+bMiYiIvLy8iIiYP39+sWXmz5+fmVea7OzsyMnJKfYBAABQ1SoUdH/729+ic+fOMWbMmNh1110jIqJx48ax5557xoUXXhjPP/98/Otf/4rnnntugw52XfXs2TNmzJhRbNoHH3wQ7du3j4jvL5CSl5cXEyZMyMxfvHhxTJ48Obp3716lYwUAAFhXFQq6GTNmxL777lts2qpVqzL/v8suu8TBBx8cf/7zn9dvdOvpnHPOiVdffTV+//vfx4cffhj33Xdf/OUvf4nBgwdHxPenhg4dOjR+97vfxWOPPRZvv/12HH/88dG6des47LDDqnXsAAAAa1Phi6Lk5uZm/r9BgwaxcOHCYvO32mqreOaZZyo+sg1g9913j0ceeSQuuuiiuOqqq6Jjx44xcuTIGDhwYGaZ888/P5YuXRqnnHJKLFq0KHr16hVPP/20e9ABAAA/eRUKujZt2sRnn32W+XyLLbaIqVOnFltm5syZ0aBBg/Ub3QZw8MEHx8EHH1zm/KysrLjqqqviqquuqsJRAQAArL8KnXK5xx57FAu4Aw44IF577bW4+uqr4913341bb701xo0bF3vuuecGGygAAADFVSjoBgwYEKtXr45Zs2ZFxPenLbZv3z6GDx8eO+64Y5x55pnRuHHjuPbaazfoYAEAAPg/FTrl8rDDDit20ZCmTZvGm2++GXfeeWd89NFH0aFDhzj++OOjVatWG2qcAAAA/EiFL4ryY7m5uXHeeedtqM0BAACwFhU65RIAAIDqV65X6F588cUK76B3794VXhcAAICylSvo9t5778jKyqrQDlavXl2h9QAAAFizcgXd5ZdfXuGgAwAAoHKUK+iuuOKKSh4GAAAA68pFUQAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClyh10+fn5lTkOAAAA1lG5g27HHXeMF198sTLHAgAAwDood9DNmzcv+vbtGxdddFGsWrWqMscEAABAOZQ76CZPnhxbb711XHfddbHnnnvGBx98UJnjAgAAYC3KHXQ777xzTJ06Nc4444x48803Y9ddd4077rijMscGAADAGqzTVS7r1q0bN998czz55JORk5MTZ5xxRhx66KExY8aMmDNnTqkfAAAAVI5aFVmpf//+8c4778Txxx8fTzzxRDzxxBOlLpeVleX9dgAAAJWkQkEXETF9+vSYPn16JEkSeXl5kZ2dvSHHBQAAwFqsc9CtWrUqLr744rjxxhujVq1a8Yc//CHOO++8yMrKqozxAQAAUIZ1Crr3338/fvnLX8a0adOiS5cucd9998XOO+9cSUMDAABgTcp9UZRbbrkldtttt5g2bVqcfvrp8cYbb4g5AACAalTuV+jOOuusaNGiRTzwwANx0EEHVeaYAAAAKIdyB91BBx0Ud999d2y22WaVOR4AAADKqdxB9/jjj1fmOAAAAFhH63RjcQAAAH46BB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKU2qaC79tprIysrK4YOHZqZtnz58hg8eHA0a9YsGjZsGAMGDIj58+dX3yABAADKaZMJuilTpsQdd9wRO+64Y7Hp55xzTjz++OPx4IMPxsSJE+Pzzz+PI444oppGCQAAUH6bRNB9++23MXDgwLjzzjujSZMmmen5+fnx17/+NW688cbYd999Y7fddovRo0fHK6+8Eq+++mo1jhgAAGDtNomgGzx4cBx00EHRr1+/YtOnTp0aK1euLDa9S5cu0a5du5g0aVKZ2ysoKIjFixcX+wAAAKhqtap7AJVt7Nix8cYbb8SUKVNKzJs3b17UqVMnGjduXGx6y5YtY968eWVuc8SIEXHllVdu6KECAACsk436Fbq5c+fG2WefHffee2/UrVt3g233oosuivz8/MzH3LlzN9i2AQAAymujDrqpU6fGggULYtddd41atWpFrVq1YuLEiTFq1KioVatWtGzZMlasWBGLFi0qtt78+fMjLy+vzO1mZ2dHTk5OsQ8AAICqtlGfctm3b994++23i0078cQTo0uXLnHBBRdE27Zto3bt2jFhwoQYMGBARETMmDEj5syZE927d6+OIQMAAJTbRh10jRo1iu23377YtAYNGkSzZs0y03/961/HsGHDomnTppGTkxNnnnlmdO/ePfbcc8/qGDIAAEC5bdRBVx5/+tOfokaNGjFgwIAoKCiI/v37x5///OfqHhYAAMBabXJB98ILLxT7vG7dunHrrbfGrbfeWj0DAgAAqKCN+qIoAAAAGzNBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKRUreoeAJXvyy+/rO4hbHJmV/cAWKvZP/j/L774orqGAQBsZJYsWVKl+xN0G7H69etH7dq14+GHH67uoWxSvoqIK6t7EJTLV///v3fccUe1jgMA2HgUFBRU6f6ykiRJqnSPG6HFixdHbm5u5OfnR05OTnUPp5j8/PxYtmxZdQ9jk9KhQ4dYsWJFdQ+DcqhTp07Mnj27uocBAGxElixZEp07d66yNvAK3UYuNzc3cnNzq3sYm5Sq/qsMAAA/HQ0aNKjS/bkoCgAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKbfRBN2LEiNh9992jUaNG0aJFizjssMNixowZxZZZvnx5DB48OJo1axYNGzaMAQMGxPz586tpxAAAAOWz0QfdxIkTY/DgwfHqq6/G+PHjY+XKlbHffvvF0qVLM8ucc8458fjjj8eDDz4YEydOjM8//zyOOOKIahw1AADA2mUlSZJU9yCq0pdffhktWrSIiRMnRu/evSM/Pz8222yzuO++++LII4+MiIj3338/ttlmm5g0aVLsueeea93m4sWLIzc3N/Lz8yMnJ6eyHwIAAPATVdVtsNG/Qvdj+fn5ERHRtGnTiIiYOnVqrFy5Mvr165dZpkuXLtGuXbuYNGlSqdsoKCiIxYsXF/sAAACoaptU0BUWFsbQoUOjZ8+esf3220dExLx586JOnTrRuHHjYsu2bNky5s2bV+p2RowYEbm5uZmPtm3bVvbQAQAAStikgm7w4MHxzjvvxNixY9drOxdddFHk5+dnPubOnbuBRggAAFB+tap7AFVlyJAh8cQTT8SLL74Ym2++eWZ6Xl5erFixIhYtWlTsVbr58+dHXl5eqdvKzs6O7Ozsyh4yAADAGm30r9AlSRJDhgyJRx55JJ577rno2LFjsfm77bZb1K5dOyZMmJCZNmPGjJgzZ0507969qocLAABQbhv9K3SDBw+O++67L8aNGxeNGjXKvC8uNzc36tWrF7m5ufHrX/86hg0bFk2bNo2cnJw488wzo3v37uW6wiUAAEB12ehvW5CVlVXq9NGjR8cJJ5wQEd/fWPzcc8+Nf/7zn1FQUBD9+/ePP//5z2WecvljblsAAABEVH0bbPRBVxUEHQAAEOE+dAAAAJSToAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AAEBKCToAAICUEnQAAAApJegAAABSStABAACklKADAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdP/frbfeGh06dIi6detGt27d4rXXXqvuIQEAAKyRoIuI+++/P4YNGxbDhw+PN954I3baaafo379/LFiwoLqHBgAAUCZBFxE33nhjnHzyyXHiiSfGtttuG7fffnvUr18/7r777uoeGgAAQJlqVfcAqtuKFSti6tSpcdFFF2Wm1ahRI/r16xeTJk0qdZ2CgoIoKCjIfJ6fnx8REYsXL67cwQIAAD9pRU2QJEmV7G+TD7qvvvoqVq9eHS1btiw2vWXLlvH++++Xus6IESPiyiuvLDG9bdu2lTJGAAAgXb7++uvIzc2t9P1s8kFXERdddFEMGzYs83lhYWEsXLgwmjVrFllZWZnpixcvjrZt28bcuXMjJyenOoZKNXL8N22O/6bN8cdzYNPm+G/a8vPzo127dtG0adMq2d8mH3TNmzePmjVrxvz584tNnz9/fuTl5ZW6TnZ2dmRnZxeb1rhx4zL3kZOT45t5E+b4b9oc/02b44/nwKbN8d+01ahRNZcr2eQvilKnTp3YbbfdYsKECZlphYWFMWHChOjevXs1jgwAAGDNNvlX6CIihg0bFoMGDYquXbvGHnvsESNHjoylS5fGiSeeWN1DAwAAKJOgi4ijjz46vvzyy7j88stj3rx5sfPOO8fTTz9d4kIp6yo7OzuGDx9e4vRMNg2O/6bN8d+0Of54DmzaHP9NW1Uf/6ykqq6nCQAAwAa1yb+HDgAAIK0EHQAAQEoJOgAAgJQSdAAAACkl6CrRrbfeGh06dIi6detGt27d4rXXXqvuIbGeRowYEbvvvns0atQoWrRoEYcddljMmDGj2DLLly+PwYMHR7NmzaJhw4YxYMCAEjeunzNnThx00EFRv379aNGiRfz2t7+NVatWVeVDYQO49tprIysrK4YOHZqZ5vhv3D777LM47rjjolmzZlGvXr3YYYcd4vXXX8/MT5IkLr/88mjVqlXUq1cv+vXrFzNnziy2jYULF8bAgQMjJycnGjduHL/+9a/j22+/reqHwjpavXp1XHbZZdGxY8eoV69ebLnllnH11VfHD68t5/hvXF588cX4+c9/Hq1bt46srKx49NFHi83fUMf7rbfeir322ivq1q0bbdu2jeuuu66yHxrlsKbjv3Llyrjgggtihx12iAYNGkTr1q3j+OOPj88//7zYNqrs+CdUirFjxyZ16tRJ7r777uTdd99NTj755KRx48bJ/Pnzq3torIf+/fsno0ePTt55551k2rRpyYEHHpi0a9cu+fbbbzPLnHbaaUnbtm2TCRMmJK+//nqy5557Jj169MjMX7VqVbL99tsn/fr1S958883kySefTJo3b55cdNFF1fGQqKDXXnst6dChQ7LjjjsmZ599dma647/xWrhwYdK+ffvkhBNOSCZPnpx8/PHHyX/+85/kww8/zCxz7bXXJrm5ucmjjz6aTJ8+PTnkkEOSjh07Jt99911mmf333z/ZaaedkldffTX573//m3Tq1Ck59thjq+MhsQ6uueaapFmzZskTTzyRzJo1K3nwwQeThg0bJjfddFNmGcd/4/Lkk08ml1xySfLwww8nEZE88sgjxeZviOOdn5+ftGzZMhk4cGDyzjvvJP/85z+TevXqJXfccUdVPUzKsKbjv2jRoqRfv37J/fffn7z//vvJpEmTkj322CPZbbfdim2jqo6/oKske+yxRzJ48ODM56tXr05at26djBgxohpHxYa2YMGCJCKSiRMnJkny/Td47dq1kwcffDCzzHvvvZdERDJp0qQkSb7/AVGjRo1k3rx5mWVuu+22JCcnJykoKKjaB0CFLFmyJNlqq62S8ePHJ3369MkEneO/cbvggguSXr16lTm/sLAwycvLS66//vrMtEWLFiXZ2dnJP//5zyRJkuR///tfEhHJlClTMss89dRTSVZWVvLZZ59V3uBZbwcddFBy0kknFZt2xBFHJAMHDkySxPHf2P34F/oNdbz//Oc/J02aNCn28/+CCy5IOnfuXMmPiHVRWtD/2GuvvZZERPLJJ58kSVK1x98pl5VgxYoVMXXq1OjXr19mWo0aNaJfv34xadKkahwZG1p+fn5ERDRt2jQiIqZOnRorV64sduy7dOkS7dq1yxz7SZMmxQ477FDsxvX9+/ePxYsXx7vvvluFo6eiBg8eHAcddFCx4xzh+G/sHnvssejatWv84he/iBYtWsQuu+wSd955Z2b+rFmzYt68ecWOf25ubnTr1q3Y8W/cuHF07do1s0y/fv2iRo0aMXny5Kp7MKyzHj16xIQJE+KDDz6IiIjp06fHSy+9FAcccEBEOP6bmg11vCdNmhS9e/eOOnXqZJbp379/zJgxI7755psqejRsCPn5+ZGVlRWNGzeOiKo9/rU2zEPgh7766qtYvXp1sV/YIiJatmwZ77//fjWNig2tsLAwhg4dGj179oztt98+IiLmzZsXderUyXwzF2nZsmXMmzcvs0xpz42iefy0jR07Nt54442YMmVKiXmO/8bt448/jttuuy2GDRsWF198cUyZMiXOOuusqFOnTgwaNChz/Eo7vj88/i1atCg2v1atWtG0aVPH/yfuwgsvjMWLF0eXLl2iZs2asXr16rjmmmti4MCBERGO/yZmQx3vefPmRceOHUtso2hekyZNKmX8bFjLly+PCy64II499tjIycmJiKo9/oIOKmjw4MHxzjvvxEsvvVTdQ6GKzJ07N84+++wYP3581K1bt7qHQxUrLCyMrl27xu9///uIiNhll13inXfeidtvvz0GDRpUzaOjsj3wwANx7733xn333RfbbbddTJs2LYYOHRqtW7d2/GETtnLlyjjqqKMiSZK47bbbqmUMTrmsBM2bN4+aNWuWuLLd/PnzIy8vr5pGxYY0ZMiQeOKJJ+L555+PzTffPDM9Ly8vVqxYEYsWLSq2/A+PfV5eXqnPjaJ5/HRNnTo1FixYELvuumvUqlUratWqFRMnToxRo0ZFrVq1omXLlo7/RqxVq1ax7bbbFpu2zTbbxJw5cyLi/47fmn725+XlxYIFC4rNX7VqVSxcuNDx/4n77W9/GxdeeGEcc8wxscMOO8SvfvWrOOecc2LEiBER4fhvajbU8fZvQroVxdwnn3wS48ePz7w6F1G1x1/QVYI6derEbrvtFhMmTMhMKywsjAkTJkT37t2rcWSsryRJYsiQIfHII4/Ec889V+Jl8t122y1q165d7NjPmDEj5syZkzn23bt3j7fffrvYN3nRD4Ef/7LIT0vfvn3j7bffjmnTpmU+unbtGgMHDsz8v+O/8erZs2eJ25R88MEH0b59+4iI6NixY+Tl5RU7/osXL47JkycXO/6LFi2KqVOnZpZ57rnnorCwMLp161YFj4KKWrZsWdSoUfzXppo1a0ZhYWFEOP6bmg11vLt37x4vvvhirFy5MrPM+PHjo3Pnzk63/IkrirmZM2fGs88+G82aNSs2v0qP/zpdQoVyGzt2bJKdnZ2MGTMm+d///peccsopSePGjYtd2Y70Of3005Pc3NzkhRdeSL744ovMx7JlyzLLnHbaaUm7du2S5557Lnn99deT7t27J927d8/ML7ps/X777ZdMmzYtefrpp5PNNtvMZetT6odXuUwSx39j9tprryW1atVKrrnmmmTmzJnJvffem9SvXz/5xz/+kVnm2muvTRo3bpyMGzcueeutt5JDDz201MuY77LLLsnkyZOTl156Kdlqq61ctj4FBg0alLRp0yZz24KHH344ad68eXL++ednlnH8Ny5LlixJ3nzzzeTNN99MIiK58cYbkzfffDNzFcMNcbwXLVqUtGzZMvnVr36VvPPOO8nYsWOT+vXru23BT8Cajv+KFSuSQw45JNl8882TadOmFfud8IdXrKyq4y/oKtHNN9+ctGvXLqlTp06yxx57JK+++mp1D4n1FBGlfowePTqzzHfffZecccYZSZMmTZL69esnhx9+ePLFF18U287s2bOTAw44IKlXr17SvHnz5Nxzz01WrlxZxY+GDeHHQef4b9wef/zxZPvtt0+ys7OTLl26JH/5y1+KzS8sLEwuu+yypGXLlkl2dnbSt2/fZMaMGcWW+frrr5Njjz02adiwYZKTk5OceOKJyZIlS6ryYVABixcvTs4+++ykXbt2Sd26dZMtttgiueSSS4r98ub4b1yef/75Uv/NHzRoUJIkG+54T58+PenVq1eSnZ2dtGnTJrn22mur6iGyBms6/rNmzSrzd8Lnn38+s42qOv5ZSZIk5X89DwAAgJ8K76EDAABIKUEHAACQUoIOAAAgpQQdAABASgk6AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKSUoAMAAEgpQQcAAJBSgg4AACClBB0AVJExY8ZEVlZWXHHFFZW6n6ysrNh7770rdR8A/DQIOgBS6+67746srKzYZ599orCwsNRljj/++MjKyoqrrrqqXNvs0KFDZGVlxezZszfgSAGgcgg6AFLrpJNOisMOOyxeeOGFuPHGG0vMv//+++Pvf/97dO/ePS655JJqGCEAVC5BB0Cq3XnnnZGXlxeXXnppvPXWW5npn376aZx22mnRsGHD+Pvf/x41a9asxlECQOUQdACkWvPmzePuu++OgoKCOO6446KgoCAKCwvj+OOPj0WLFsVNN90UW265ZaXse+rUqXH22WfHTjvtFE2bNo26devGVlttFeecc04sXLhwjeu+/PLL0bdv38jJyYmcnJw44IAD4o033ih12cLCwrjrrruiZ8+ekZubG3Xr1o3tt98+RowYEStWrKiMhwZASgg6AFLvgAMOiDPOOCPefvvtuPjii+OPf/xjPP/883H44YfHSSedVGn7vfPOO2Ps2LHRuXPnOPHEE+P000+PVq1axciRI6NHjx6xZMmSUtebPHly7LvvvlGvXr0YMmRI9O/fP5555pno1atXvPLKK8WWXbVqVRx22GFx8sknx1dffRXHHntsnHbaaVG7du24+OKL48ADD4xVq1ZV2mME4CcuAYCNwLJly5IuXbokWVlZSe3atZNWrVolX3755Tpvp3379klEJLNmzVrrsrNnz05WrVpVYvpdd92VREQyYsSIYtNHjx6dREQSEcktt9xSbN5DDz2URETSuXPnpLCwMDP96quvTiIiGTx4cLF9rV69Ojn55JOTiEhGjRpVbFsRkfTp06ccjxaAtPMKHQAbhXr16sVVV10VSZLEypUr46abbormzZtX6j7bt29f6nvzTjrppMjJyYlnnnmm1PU6deoUp59+erFpAwYMiO7du8eMGTMyr9IVFhbGTTfdFC1atIiRI0cW21eNGjXiuuuui6ysrPj73/++AR8VAGlSq7oHAAAbwooVK+Kaa67JfP7QQw/FL37xi0rd58qVK+OOO+6IsWPHxv/+97/Iz88vdvuEzz77rNT19tprr6hRo+TfVPv06ROTJk2KN998M3r27BkffPBBfPXVV7HlllvG7373u1K3Va9evXjvvfc2zAMCIHUEHQAbhUsuuSSmT58ep5xySrz77rvxwAMPxKGHHhq//OUvK22fRx99dDzyyCOxxRZbxKGHHhp5eXmRnZ0dEREjR46MgoKCUtdr2bLlGqfn5+dHRMTXX38dEREfffRRXHnllRt6+ABsBAQdAKlXdB+6rbfeOv70pz/FvHnzYqeddorBgwdH7969Y/PNN9/g+3z99dfjkUceiX79+sVTTz0VtWr93z+phYWFcd1115W57vz589c4PTc3t9h/f/7zn8djjz22oYYOwEbEe+gASLVFixbF8ccfHzVq1Ih//OMfUb9+/dhiiy3ixhtvjEWLFsWJJ54YSZJs8P1++OGHERFxyCGHFIu5iIjXXnstvvvuuzLXfemll4qdmllk4sSJERGxyy67REREly5donHjxvHaa6+5PQEApRJ0AKTaGWecEXPnzo3LLrssdt9998z0k08+OQ4++OB49tln45Zbbtng++3QoUNEfP/q4A8tWLAgBg8evMZ1Z86cGbfddluxaf/6179i0qRJ0blz5+jRo0dERNSqVSvOPvvsmD9/fgwePDiWLVtWYltfffVVTJs2rcKPA4B0y0oq48+WAFAF7r333jjuuONizz33jJdeeqnEFSfnz58f22+/fSxdujTefPPN6Ny581q32aFDh/jkk09iwIAB0bBhw1KXufDCC2OrrbaKPn36xMsvvxzdu3ePXr16xfz58+Opp56Kzp07x8cffxy1a9eO2bNnZ9YbM2ZMnHjiidG/f/94/vnn42c/+1nsuOOOMXPmzHj44YcjOzs7xo8fHz179syss2rVqjj66KPj4YcfjlatWkXfvn1j8803jy+//DI++uijeOmll2Lw4MExcuTIzDpZWVnRp0+fErEJwMZH0AGQSnPmzIkdd9wxVq1aFdOmTYtOnTqVutwjjzwSRxxxROy+++7xyiuvlDg98seKgm5Nnn/++dh7771j4cKFcemll8aTTz4Z8+bNizZt2sTRRx8dl156aWy77bYREaUG3fDhw+NnP/tZXHbZZTFlypSIiOjZs2dcc801sdtuu5XYX5IkMXbs2Bg9enRMnTo1lixZEs2aNYv27dtH//7947jjjoutttoqs7ygA9h0CDoAAICU8h46AACAlBJ0AAAAKSXoAAAAUkrQAQAApJSgAwAASClBBwAAkFKCDgAAIKUEHQAAQEoJOgAAgJQSdAAAACkl6AAAAFJK0AEAAKTU/wOpkhgGMM8xgQAAAABJRU5ErkJggg==",
+      "text/plain": [
+       "<Figure size 1000x1000 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "viz.draw_variants(variants, tx_coordinates, protein_meta)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### TODO - implement"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "exploratory",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.12"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/pyproject.toml b/pyproject.toml
index 72e09c4a..3b56f661 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -40,6 +40,7 @@ dependencies = [
     "scipy>=1.10",
     "statsmodels>=0.13.0",
     "numpy>=1.23",
+    "matplotlib>=3.2.0,<4.0",
     "tqdm>=4.66.1"
 ]
 dynamic = ["version"]
diff --git a/src/genophenocorr/model/_tx.py b/src/genophenocorr/model/_tx.py
index d8d9b615..5c5f7acf 100644
--- a/src/genophenocorr/model/_tx.py
+++ b/src/genophenocorr/model/_tx.py
@@ -9,17 +9,32 @@ class TranscriptCoordinates:
     """
     `TranscriptCoordinates` knows about genomic region of the transcript, exonic/intronic regions, as well as
     the coding and non-coding regions.
+
+    If both CDS coordinates are `None`, then the transcript coordinates are assumed to represent a non-coding transcript.
     """
 
     def __init__(self, identifier: str,
                  region: GenomicRegion,
                  exons: typing.Iterable[GenomicRegion],
-                 cds_start: int,
-                 cds_end: int):
+                 cds_start: typing.Optional[int],
+                 cds_end: typing.Optional[int]):
         self._id = hpotk.util.validate_instance(identifier, str, 'identifier')
         self._region = hpotk.util.validate_instance(region, GenomicRegion, 'region')
         self._exons = tuple(exons)
-        # TODO - check CDS
+
+        if cds_start is None and cds_end is None:
+            # non-coding transcript, no validation necessary
+            pass
+        else:
+            # coding transcript
+            if cds_start is None or cds_end is None:
+                raise ValueError(f'Both cds_start={cds_start} and cds_end={cds_end} must not be `None`')
+            if not isinstance(cds_start, int) or not isinstance(cds_end, int):
+                raise ValueError(f'CDS coordinates must be `int`s but were cds_start={cds_start}, cds_end={cds_end}')
+            if not self._region.contains_pos(cds_start + 1) or not self._region.contains_pos(cds_end):
+                # `+1` to convert the 0-based start into a 1-based coordinate for a moment
+                raise ValueError(f'CDS coordinates cds_start={cds_start:,}, cds_end={cds_end:,} must be '
+                                 f'in the tx region: ({self._region.end}, {self._region.end}]')
         self._cds_start = cds_start
         self._cds_end = cds_end
 
@@ -45,13 +60,135 @@ def exons(self) -> typing.Sequence[GenomicRegion]:
         return self._exons
 
     @property
-    def cds_start(self) -> int:
+    def cds_start(self) -> typing.Optional[int]:
+        """
+        Get the 0-based (excluded) start coordinate of the first base of the start codon of the transcript or `None`
+        if the transcript is not coding.
+        """
         return self._cds_start
 
     @property
-    def cds_end(self) -> int:
+    def cds_end(self) -> typing.Optional[int]:
+        """
+        Get the 0-based (included) end coordinate of the last base of the termination codon of the transcript or `None`
+        if the transcript is not coding.
+        """
         return self._cds_end
 
+    def is_coding(self) -> bool:
+        """
+        Return `True` if the transcript is coding/translated.
+        """
+        return self._cds_start is not None and self._cds_end is not None
+
+    def get_coding_base_count(self) -> typing.Optional[int]:
+        """
+        Calculate the number of coding bases present in the transcript. Note, the count does *NOT* include
+        the termination codon since it does not code for an aminoacid.
+        Returns: an `int` with the coding base count or `None` if the transcript is non-coding.
+        """
+        if not self.is_coding():
+            return None
+
+        n_bases = 0
+        for exon in self.exons:
+            start = max(self._cds_start, exon.start)
+            end = min(self._cds_end, exon.end)
+            n_bases += max(end - start, 0)
+
+        return n_bases - 3  # minus stop codon
+
+    def get_codon_count(self) -> typing.Optional[int]:
+        """
+        Calculate the count of codons present in the transcript. Note, the count does *NOT* include the termination codon!
+
+        Returns: the number of codons of the transcript or `None` if the transcript is non-coding.
+        """
+        n_coding_bases = self.get_coding_base_count()
+        assert n_coding_bases % 3 == 0, (f"Transcript {self._id} has {n_coding_bases:,} "
+                                         f"coding bases that is not divisible by 3!")
+        return int(n_coding_bases / 3)
+
+    def get_five_prime_utrs(self) -> typing.Sequence[GenomicRegion]:
+        """
+        Get a sequence of genomic regions that correspond to 5' untranslated regions of the transcript.
+
+        Returns: a sequence of genomic regions, an empty sequence if the transcript is non-coding.
+        """
+        if not self.is_coding():
+            return ()
+
+        utrs = []
+
+        for exon in self.exons:
+            if exon.start >= self._cds_start:
+                break
+            if exon.end <= self._cds_start:
+                # An entire exon is UTR.
+                utrs.append(exon)
+            else:
+                # Just a part of an exon is UTR.
+                utrs.append(GenomicRegion(exon.contig, exon.start, self._cds_start, exon.strand))
+
+        return tuple(utrs)
+
+    def get_three_prime_utrs(self) -> typing.Sequence[GenomicRegion]:
+        """
+        Get a sequence of genomic regions that correspond to 3' untranslated regions of the transcript.
+
+        Note, the termination codon is *NOT* included in the regions!
+
+        Returns: a sequence of genomic regions, an empty sequence if the transcript is non-coding.
+        """
+        if not self.is_coding():
+            return ()
+
+        utrs = []
+
+        for exon in self.exons:
+            if exon.end > self._cds_end:
+                if self._cds_end <= exon.start:
+                    # An entire exon is UTR.
+                    utrs.append(exon)
+                else:
+                    # Just a part of an exon is UTR.
+                    utrs.append(GenomicRegion(exon.contig, self._cds_end, exon.end, exon.strand))
+
+        return tuple(utrs)
+
+    def get_cds_regions(self) -> typing.Sequence[GenomicRegion]:
+        """
+        Get a sequence of genomic regions that correspond to coding regions of the transcript, including
+        BOTH the initiation and termination codons.
+
+        Returns: a sequence of genomic regions, an empty sequence if the transcript is non-coding.
+        """
+        if not self.is_coding():
+            return ()
+
+        coding_regions = []
+        for exon in self.exons:
+            if self._cds_start >= exon.end or self._cds_end <= exon.start:
+                # An entire exon is UTR.
+                continue
+            else:
+                cds_start_is_at_or_before_start = self._cds_start <= exon.start
+                cds_end_is_at_or_after_end = exon.end <= self._cds_end
+                if cds_start_is_at_or_before_start or cds_end_is_at_or_after_end:
+                    # At least one base of the exon must be coding.
+                    if cds_start_is_at_or_before_start and cds_end_is_at_or_after_end:
+                        # The entire exon is coding
+                        coding_regions.append(exon)
+                    else:
+                        # Part of the exon is coding, another part is UTR
+                        cds = GenomicRegion(exon.contig,
+                                            max(self._cds_start, exon.start),
+                                            min(exon.end, self._cds_end),
+                                            exon.strand)
+                        coding_regions.append(cds)
+
+        return tuple(coding_regions)
+
     def __eq__(self, other):
         return (isinstance(other, TranscriptCoordinates)
                 and self.identifier == other.identifier
@@ -68,4 +205,3 @@ def __str__(self):
 
     def __repr__(self):
         return str(self)
-    
\ No newline at end of file
diff --git a/src/genophenocorr/model/genome/__init__.py b/src/genophenocorr/model/genome/__init__.py
index db783579..a21b049a 100644
--- a/src/genophenocorr/model/genome/__init__.py
+++ b/src/genophenocorr/model/genome/__init__.py
@@ -12,3 +12,4 @@
 
 from ._builds import GRCh37, GRCh38
 from ._genome import Contig, GenomeBuild, GenomeBuildIdentifier, Strand, Stranded, Transposable, GenomicRegion, Region
+from ._genome import transpose_coordinate
diff --git a/src/genophenocorr/model/genome/_genome.py b/src/genophenocorr/model/genome/_genome.py
index 518eccd2..9b2181d6 100644
--- a/src/genophenocorr/model/genome/_genome.py
+++ b/src/genophenocorr/model/genome/_genome.py
@@ -261,6 +261,24 @@ def contains(self, other) -> bool:
         other = Region._check_is_region(other)
         return _a_contains_b(self.start, self.end, other.start, other.end)
 
+    def contains_pos(self, pos: int) -> bool:
+        """
+        Test if this `Region` contains the base or protein located at the `pos`. Note, `pos` is represented by
+        a 1-based coordinate system.
+
+        No bound checking is done here and `False` is returned for a position that is e.g. out of bounds of a contig,
+        or for a negative `pos`. For :class:`Stranded` entities, the position is assumed to be located on
+        strand of the :class:`GenomicRegion`.
+
+        An empty region contains no positions.
+
+        Args:
+            pos: an `int` with 1-based position to check.
+
+        Returns: `True` if the `Region` contains the base/aminoacid located at `pos`.
+        """
+        return self._start < pos <= self._end
+
     def distance_to(self, other) -> int:
         """
         Calculate the number of bases present between this and the `other` region.
@@ -353,6 +371,21 @@ def __str__(self):
         return self._symbol
 
 
+def transpose_coordinate(contig: Contig, coordinate: int) -> int:
+    """
+    Transpose a 0-based coordinate to other strand of the contig.
+    Args:
+        contig: contig to transpose the coordinate on.
+        coordinate: the coordinate to transpose.
+
+    Returns: an `int` with transposed coordinate.
+    Raises: ValueError if the `coordinate` is out of contig bounds.
+    """
+    if not 0 <= coordinate <= len(contig):
+        raise ValueError(f'Coordinate {coordinate:,} is out of bounds [0,{len(contig):,}] for contig {contig.name}')
+    return len(contig) - coordinate
+
+
 class Stranded(metaclass=abc.ABCMeta):
     """
     Mixin for classes that are on double-stranded sequences.
@@ -409,13 +442,13 @@ def start_on_strand(self, other: Strand) -> int:
         if self.strand == other:
             return self.start
         else:
-            return len(self.contig) - self.end
+            return transpose_coordinate(self._contig, self._end)
 
     def end_on_strand(self, other: Strand) -> int:
         if self.strand == other:
             return self.end
         else:
-            return len(self.contig) - self.start
+            return transpose_coordinate(self._contig, self._start)
 
     @property
     def strand(self) -> Strand:
diff --git a/src/genophenocorr/preprocessing/__init__.py b/src/genophenocorr/preprocessing/__init__.py
index 6770ef6a..a951fe0d 100644
--- a/src/genophenocorr/preprocessing/__init__.py
+++ b/src/genophenocorr/preprocessing/__init__.py
@@ -7,8 +7,10 @@
 from ._uniprot import UniprotProteinMetadataService
 from ._variant import VariantAnnotationCache, VarCachingFunctionalAnnotator
 from ._vep import VepFunctionalAnnotator
+from ._vv import VVHgvsVariantCoordinateFinder, VVTranscriptCoordinateService
 
 __all__ = [
+    'configure_caching_patient_creator', 'configure_patient_creator',
     'VariantCoordinateFinder', 'FunctionalAnnotator', 'ProteinMetadataService',
     'PatientCreator',
     'PhenopacketVariantCoordinateFinder', 'PhenopacketPatientCreator', 'load_phenopacket_folder', 'load_phenopacket',
@@ -16,5 +18,5 @@
     'ProteinAnnotationCache', 'ProtCachingFunctionalAnnotator',
     'UniprotProteinMetadataService',
     'VepFunctionalAnnotator', 'VariantAnnotationCache', 'VarCachingFunctionalAnnotator',
-    'configure_caching_patient_creator', 'configure_patient_creator'
+    'VVHgvsVariantCoordinateFinder', 'VVTranscriptCoordinateService'
 ]
diff --git a/src/genophenocorr/preprocessing/_api.py b/src/genophenocorr/preprocessing/_api.py
index 241f4b4e..36cc4cb7 100644
--- a/src/genophenocorr/preprocessing/_api.py
+++ b/src/genophenocorr/preprocessing/_api.py
@@ -24,9 +24,23 @@ def annotate(self, variant_coordinates: VariantCoordinates) -> typing.Sequence[T
 
 
 class TranscriptCoordinateService(metaclass=abc.ABCMeta):
+    """
+    `TranscriptCoordinateService` gets transcript (tx) coordinates for a given transcript ID.
+    """
 
     @abc.abstractmethod
-    def fetch(self, tx: TranscriptInfoAware) -> TranscriptCoordinates:
+    def fetch(self, tx: typing.Union[str, TranscriptInfoAware]) -> TranscriptCoordinates:
+        """
+        Get tx coordinates for a tx ID or an entity that knows about the tx ID.
+
+        The method will raise an exception in case of an issue.
+
+        Args:
+            tx: a `str` with tx ID (e.g. `NM_002834.5`) or an entity that knows about the transcript ID
+            (e.g. :class:`genophenocorr.model.TranscriptAnnotation`).
+
+        Returns: the transcript coordinates.
+        """
         pass
 
 
diff --git a/src/genophenocorr/preprocessing/_vv.py b/src/genophenocorr/preprocessing/_vv.py
index 1c3cfbc3..063bfd1d 100644
--- a/src/genophenocorr/preprocessing/_vv.py
+++ b/src/genophenocorr/preprocessing/_vv.py
@@ -1,13 +1,14 @@
 # A module with classes that interact with Variant validator's REST API to fetch required data.
+import logging
 import re
 import typing
 
 import hpotk
 import requests
 
-from genophenocorr.model import VariantCoordinates
-from genophenocorr.model.genome import GenomeBuild, GenomicRegion, Strand
-from ._api import VariantCoordinateFinder
+from genophenocorr.model import VariantCoordinates, TranscriptInfoAware, TranscriptCoordinates
+from genophenocorr.model.genome import GenomeBuild, GenomicRegion, Strand, Contig, transpose_coordinate
+from ._api import VariantCoordinateFinder, TranscriptCoordinateService
 
 
 class VVHgvsVariantCoordinateFinder(VariantCoordinateFinder[str]):
@@ -69,7 +70,8 @@ def _extract_variant_coordinates(self, response: typing.Dict) -> typing.Optional
 
         contig = self._build.contig_by_name(variant_data['chr'])
         if contig is None:
-            raise VariantValidatorDecodeException(f'Contig {variant_data["chr"]} was not found in build {self._build.identifier}')
+            raise VariantValidatorDecodeException(f'Contig {variant_data["chr"]} was not found in build '
+                                                  f'{self._build.identifier}')
 
         pos = int(variant_data['pos'])
         ref = variant_data['ref']
@@ -111,3 +113,161 @@ class VariantValidatorDecodeException(BaseException):
     An exception thrown when parsing variant validator response fails.
     """
     pass
+
+
+class VVTranscriptCoordinateService(TranscriptCoordinateService):
+    """
+    `VVTranscriptCoordinateService` fetches the transcript coordinates from the Variant Validator REST API.
+
+    :param genome_build: the genome build for constructing the transcript coordinates.
+    :param timeout: a positive `float` with the REST API timeout in seconds.
+    """
+
+    def __init__(self, genome_build: GenomeBuild, timeout: float = 30.):
+        self._logger = logging.getLogger(__name__)
+        self._genome_build = hpotk.util.validate_instance(genome_build, GenomeBuild, 'genome_build')
+
+        self._timeout = hpotk.util.validate_instance(timeout, float, 'timeout')
+        if self._timeout <= 0:
+            raise ValueError(f'`timeout` must be a positive `float` but got {timeout}')
+
+        self._url = "https://rest.variantvalidator.org/VariantValidator/tools/gene2transcripts/%s"
+        self._headers = {'Accept': 'application/json'}
+
+    def fetch(self, tx: typing.Union[str, TranscriptInfoAware]) -> TranscriptCoordinates:
+        tx_id = self._parse_tx(tx)
+        api_url = self._url % tx_id
+
+        response = requests.get(api_url, headers=self._headers, timeout=self._timeout)
+
+        if not response.ok:
+            response.raise_for_status()
+
+        return self.parse_response(tx_id, response.json())
+
+    @staticmethod
+    def _parse_tx(tx: typing.Union[str, TranscriptInfoAware]) -> str:
+        if isinstance(tx, str):
+            return tx
+        elif isinstance(tx, TranscriptInfoAware):
+            return tx.transcript_id
+        else:
+            raise ValueError(f'Expected a `str` or `TranscriptInfoAware` but got {type(tx)}: {tx}')
+
+    def parse_response(self, tx_id: str, response) -> TranscriptCoordinates:
+        if len(response) != 1:
+            self._logger.warning('Response has %s!=1 items. Choosing the first', len(response))
+
+        item = response[0]
+        if 'requested_symbol' not in item or item['requested_symbol'] != tx_id:
+            raise ValueError(
+                f'Could not find {tx_id} in the `requested_symbol` field in the response from Variant Validator API'
+            )
+        if 'transcripts' not in item:
+            raise ValueError(f'A required `transcripts` field is missing in the response from Variant Validator API')
+        tx = self._find_tx_data(tx_id, item['transcripts'])
+
+        if 'genomic_spans' not in tx:
+            raise ValueError(f'A required `genomic_spans` field is missing in the response from Variant Validator API')
+        contig, genomic_span = self._find_genomic_span(tx['genomic_spans'])
+
+        strand = self._parse_strand(genomic_span)
+        start_pos = genomic_span['start_position']
+        end_pos = genomic_span['end_position']
+        region = self._parse_tx_region(contig, start_pos, end_pos, strand)
+
+        exons = self._parse_exons(contig, strand, genomic_span)
+
+        cds_start, cds_end = self._parse_cds(tx['coding_start'], tx['coding_end'], exons)
+
+        return TranscriptCoordinates(tx_id, region, exons, cds_start, cds_end)
+
+    def _find_tx_data(self, tx_id: str, txs: typing.Dict) -> typing.Dict:
+        for i, tx_data in enumerate(txs):
+            if 'reference' not in tx_data:
+                self._logger.warning('Skipping `transcripts` element %d due to missing `reference` field', i)
+                continue
+            if tx_data['reference'] == tx_id:
+                return tx_data
+
+        # If we get here, we did not find the transcript data, so we raise.
+        raise ValueError(f'Did not find transcript data for the requested transcript {tx_id}')
+
+    def _find_genomic_span(self, genomic_spans: typing.Dict) -> typing.Tuple[Contig, typing.Dict]:
+        for contig_name, value in genomic_spans.items():
+            contig = self._genome_build.contig_by_name(contig_name)
+            if contig is not None:
+                return contig, value
+
+        contig_names = sorted(genomic_spans.keys())
+        raise ValueError(f'Contigs {contig_names} were not found in genome build `{self._genome_build.identifier}`')
+
+    @staticmethod
+    def _parse_strand(genomic_span) -> Strand:
+        orientation = genomic_span['orientation']
+        if orientation == 1:
+            return Strand.POSITIVE
+        elif orientation == -1:
+            return Strand.NEGATIVE
+        else:
+            raise ValueError(f'Invalid orientation value {orientation} was not {{-1, 1}}')
+
+    @staticmethod
+    def _parse_tx_region(contig: Contig, start_pos: int, end_pos: int, strand: Strand) -> GenomicRegion:
+        """
+        The `start_pos` and `end_pos` coordinates are on the positive strand, but the genomic region that we
+        are returning must be on given `strand`. Therefore, we transpose accordingly.
+
+        However, note that start_pos > end_pos if `strand == Strand.NEGATIVE`. This is unusual in our environment,
+        where we ensure the following: `start <= end`.
+        """
+        if strand == Strand.POSITIVE:
+            start = start_pos - 1  # Convert from 1-based to 0-based coordinate
+            end = end_pos
+        else:
+            end = transpose_coordinate(contig, start_pos - 1)  # Convert from 1-based to 0-based coordinate
+            start = transpose_coordinate(contig, end_pos)
+
+        return GenomicRegion(contig, start, end, strand)
+
+    @staticmethod
+    def _parse_exons(contig: Contig, strand: Strand, genomic_span: typing.Dict) -> typing.Sequence[GenomicRegion]:
+        # Ensure the exons are sorted in ascending order
+        exons = []
+        for exon in sorted(genomic_span['exon_structure'], key=lambda exon_data: exon_data['exon_number']):
+            gen_start = exon['genomic_start'] - 1  # -1 to convert to 0-based coordinates.
+            gen_end = exon['genomic_end']
+            if strand.is_positive():
+                start = gen_start
+                end = gen_end
+            else:
+                start = transpose_coordinate(contig, gen_end)  # !
+                end = transpose_coordinate(contig, gen_start)  # !
+            gr = GenomicRegion(contig, start, end, strand)
+            exons.append(gr)
+
+        return exons
+
+    @staticmethod
+    def _parse_cds(coding_start: int, coding_end: int, exons: typing.Iterable[GenomicRegion]) -> typing.Tuple[int, int]:
+        # Variant validator reports CDS start and end as n-th exonic bases. We need to figure out which exon overlaps
+        # with `coding_start` and `coding_end` in the CDS space and then calculate the
+        start = None
+        end = None
+        processed = 0
+        for exon in exons:
+            exon_len = len(exon)
+            if start is None:
+                if processed < coding_start <= processed + exon_len:
+                    start = exon.start + coding_start - processed - 1  # `-1` to convert to 0-based coordinate!
+
+            if end is None:
+                if processed < coding_end <= processed + exon_len:
+                    end = exon.start + coding_end - processed
+
+            if start is not None and end is not None:
+                return start, end
+
+            processed += exon_len
+
+        raise ValueError(f'Could not parse CDS start and end from given coordinates')
diff --git a/src/genophenocorr/view/__init__.py b/src/genophenocorr/view/__init__.py
index e456a661..a8adcd44 100644
--- a/src/genophenocorr/view/__init__.py
+++ b/src/genophenocorr/view/__init__.py
@@ -1,7 +1,7 @@
 from ._cohort import CohortViewer
-from ._txp import VariantTranscriptProteinArtist
+from ._txp import VariantTranscriptVisualizer
 
 __all__ = [
     'CohortViewer',
-    'VariantTranscriptProteinArtist'
+    'VariantTranscriptVisualizer'
 ]
diff --git a/src/genophenocorr/view/_txp.py b/src/genophenocorr/view/_txp.py
index dae2e771..45929fc2 100644
--- a/src/genophenocorr/view/_txp.py
+++ b/src/genophenocorr/view/_txp.py
@@ -1,16 +1,108 @@
 import typing
-
+from collections import defaultdict
+from matplotlib import pyplot as plt
+from matplotlib.patches import Rectangle
+from matplotlib.collections import PatchCollection
+from matplotlib.lines import Line2D
+import typing
 from genophenocorr.model import Variant, TranscriptCoordinates, ProteinMetadata
 
 
-class VariantTranscriptProteinArtist:
+def get_interpolated_location_in_protein(aa_pos_in_prot:int,
+                                        prot_len:int,
+                                        plot_width:int=1200,
+                                        margin_size:int=20) -> typing.Tuple[int,int]:
+    used_plot_width = plot_width - 2*margin_size
+    rel_pos_in_prot = aa_pos_in_prot / prot_len
+    interpolated_x = margin_size + used_plot_width * rel_pos_in_prot
+    return interpolated_x
+
+
+
+class VariantTranscriptVisualizer:
     """
     `VariantTranscriptProteinArtist` creates a graphic to show distributions of variants across a provided transcript
     and its protein product.
     """
 
-    def draw_variants(self, variants: typing.Sequence[Variant],
-                      tx: TranscriptCoordinates,
-                      protein: ProteinMetadata):
-        # TODO - Peter implement
-        pass
+    # noinspection PyMethodMayBeStatic
+    def draw_variants(self, variants: typing.Iterable[Variant],
+                    tx: TranscriptCoordinates,
+                    protein: ProteinMetadata):
+        title = f"{protein.protein_id} ({protein.label})"
+        fig, ax = plt.subplots(1, figsize=(10, 10))
+        protein_domains = set()
+        THRESHOLD = 2
+        BOTTOM_MARGIN = 20
+        amino_acid_len = tx.get_codon_count()
+        # draw a box that is ten aax tall, where aax is the dimension of one amino acid
+        prot_start = get_interpolated_location_in_protein(1, amino_acid_len)
+        prot_end = get_interpolated_location_in_protein(amino_acid_len, amino_acid_len)
+        box_height = 10/amino_acid_len
+        prot_width = prot_end - prot_start + 1
+        protein_height = prot_width/20
+        #rect = Rectangle((prot_start, BOTTOM_MARGIN), prot_width, protein_height)
+        rect = Rectangle((50, 30), prot_width, 40, edgecolor='black', facecolor='white', alpha=0.5)
+        ax.add_patch(rect)
+        for variant in variants:
+            tx_annot_list = [txa for txa in variant.tx_annotations if txa.transcript_id == tx.identifier]
+            if len(tx_annot_list) == 0:
+                raise ValueError(f"Could not find variant transcript annotations for {tx.identifier}")
+            if len(tx_annot_list) > 1:
+                # Should never happen
+                raise ValueError(f"Found mutiple variant transcript annotations for {tx.identifier}")
+            tx_annot = tx_annot_list[0]
+            hgvs = tx_annot.hgvsc_id.split(":")
+            if len(hgvs) > 1:
+                hgvs_cdna = hgvs[1]
+            else:
+                hgvs_cdna = hgvs
+            variant_effects = tx_annot.variant_effects
+            if len(variant_effects) > 1:
+                var_effect = "MULTIPLE"
+            elif len(variant_effects) == 0:
+                var_effect = "UNKNOWN"
+            else:
+                var_effect = variant_effects[0].name
+            for p in tx_annot.protein_affected:
+                for f in p.domains():
+                    protein_domains.add(f.info)
+            if tx_annot.protein_effect_location is None:
+                print(f"skipping {hgvs_cdna} because no protein effect location was found")
+                continue
+            # for plotting, we will just show the start position; note there is also end
+            pe_loc = tx_annot.protein_effect_location.start
+            prot_variant_location = get_interpolated_location_in_protein(pe_loc, amino_acid_len)
+            x = [prot_variant_location, prot_variant_location]
+            ybase = BOTTOM_MARGIN + protein_height
+            ytop = ybase + 10
+            y = [ybase, ytop]
+            line = Line2D(x, y)
+            ax.add_line(line)
+            # TODO show one box per mutation or otherwise represent frequency
+            color_list = ['red', 'blue', 'green', 'orange', 'brown', 'yellow', 'purple']
+            feature_to_color_index_d = defaultdict(int) # default is red
+            for feature in protein_domains:
+                name = feature.name
+                if name not in feature_to_color_index_d:
+                    new_idx = len(feature_to_color_index_d) % len(color_list)
+                    feature_to_color_index_d[name] = new_idx
+                color_idx = feature_to_color_index_d.get(name)
+                box_color = color_list[color_idx]
+                start = feature.start
+                end = feature.end
+                #print(name, start, end, box_color)
+                box_height = 10/amino_acid_len
+                prot_width = prot_end - prot_start + 1
+                protein_height = prot_width/20
+                #rect = Rectangle((prot_start, BOTTOM_MARGIN), prot_width, protein_height)
+                box_start = get_interpolated_location_in_protein(start,  amino_acid_len)
+                box_end = get_interpolated_location_in_protein(end, amino_acid_len)
+                box_width = box_end - box_start
+                rect = Rectangle((box_start, 30), box_width, 40, edgecolor='black', facecolor=box_color, alpha=0.5)
+                ax.add_patch(rect)
+        ax.set_title(title, loc='left', fontsize='x-large')
+        ax.set_xlabel('X Label', labelpad=12, fontsize=14.5)
+        ax.set_ylabel('Y label', labelpad=12, fontsize=14.5)
+        ax.set_xlim(-10, 1200)
+        ax.set_ylim(0,120)


Test patch:
diff --git a/src/genophenocorr/model/_test_tx.py b/src/genophenocorr/model/_test_tx.py
new file mode 100644
index 00000000..7416de7e
--- /dev/null
+++ b/src/genophenocorr/model/_test_tx.py
@@ -0,0 +1,64 @@
+import pytest
+
+from ._tx import TranscriptCoordinates
+from .genome import Contig, GenomicRegion, Strand
+
+
+class TestTranscriptCoordinates:
+
+    @pytest.fixture
+    def contig(self) -> Contig:
+        return Contig('a', 'b', 'c', 'd', 100)
+
+    @pytest.fixture
+    def simple_tx(self, contig: Contig) -> TranscriptCoordinates:
+        return TranscriptCoordinates('some_id', region=GenomicRegion(contig, 20, 80, Strand.POSITIVE), exons=(
+            GenomicRegion(contig, 20, 30, Strand.POSITIVE), GenomicRegion(contig, 50, 60, Strand.POSITIVE),
+            GenomicRegion(contig, 70, 80, Strand.POSITIVE)), cds_start=25, cds_end=76)
+
+    @pytest.fixture
+    def noncoding_exons_tx(self, contig: Contig) -> TranscriptCoordinates:
+        """
+        Transcript coordinates with the same coding regions as above, but with extra non-coding exons for UTRs.
+        """
+        return TranscriptCoordinates('some_id', region=GenomicRegion(contig, 5, 95, Strand.POSITIVE), exons=(
+            GenomicRegion(contig, 5, 10, Strand.POSITIVE), GenomicRegion(contig, 20, 30, Strand.POSITIVE),
+            GenomicRegion(contig, 50, 60, Strand.POSITIVE), GenomicRegion(contig, 70, 80, Strand.POSITIVE),
+            GenomicRegion(contig, 88, 95, Strand.POSITIVE),), cds_start=25, cds_end=76)
+
+    def test_simple_tx_compute_n_codons(self, simple_tx: TranscriptCoordinates):
+        assert simple_tx.get_coding_base_count() == 18
+        assert simple_tx.get_codon_count() == 6
+
+    def test_tx_w_noncoding_exons__compute_n_codons(self, noncoding_exons_tx: TranscriptCoordinates):
+        assert noncoding_exons_tx.get_coding_base_count() == 18
+        assert noncoding_exons_tx.get_codon_count() == 6
+
+    def test_five_prime_utrs(self, simple_tx: TranscriptCoordinates, noncoding_exons_tx: TranscriptCoordinates):
+        utrs = simple_tx.get_five_prime_utrs()
+        assert len(utrs) == 1
+        utr = utrs[0]
+        assert utr.start == 20
+        assert utr.end == 25
+
+        utrs = noncoding_exons_tx.get_five_prime_utrs()
+        assert len(utrs) == 2
+
+        assert utrs[0].start == 5
+        assert utrs[0].end == 10
+        assert utrs[1].start == 20
+        assert utrs[1].end == 25
+
+    def test_three_prime_utrs(self, simple_tx: TranscriptCoordinates, noncoding_exons_tx: TranscriptCoordinates):
+        utrs = simple_tx.get_three_prime_utrs()
+        assert len(utrs) == 1
+        utr = utrs[0]
+        assert utr.start == 76
+        assert utr.end == 80
+
+        utrs = noncoding_exons_tx.get_three_prime_utrs()
+        assert len(utrs) == 2
+        assert utrs[0].start == 76
+        assert utrs[0].end == 80
+        assert utrs[1].start == 88
+        assert utrs[1].end == 95
diff --git a/src/genophenocorr/model/genome/_test_genome.py b/src/genophenocorr/model/genome/_test_genome.py
index 0ba24fc3..ae2dd954 100644
--- a/src/genophenocorr/model/genome/_test_genome.py
+++ b/src/genophenocorr/model/genome/_test_genome.py
@@ -171,6 +171,28 @@ def test_contains_genomic_region__other_contig(self):
 
         assert not a.contains(b)
 
+    @pytest.mark.parametrize("a_start, a_end, pos, expected",
+                             [
+                                 (2, 3, 0, False),
+                                 (2, 3, 1, False),
+                                 (2, 3, 2, False),
+                                 (2, 3, 3, True),
+                                 (2, 3, 4, False),
+                                 (2, 3, 5, False),
+
+                                 # Empty region contains no position
+                                 (3, 3, 2, False),
+                                 (3, 3, 3, False),
+                                 (3, 3, 4, False),
+
+                                 # Negative coordinate does not raise
+                                 (2, 3, -1, False),
+                             ])
+    def test_contains_pos(self, a_start, a_end, pos, expected):
+        region = Region(a_start, a_end)
+
+        assert region.contains_pos(pos) == expected
+
 
 class TestDistanceTo:
 
diff --git a/src/genophenocorr/preprocessing/_test_vv.py b/src/genophenocorr/preprocessing/_test_vv.py
index 4ee9d292..3844e16b 100644
--- a/src/genophenocorr/preprocessing/_test_vv.py
+++ b/src/genophenocorr/preprocessing/_test_vv.py
@@ -6,9 +6,9 @@
 import pytest
 
 
-from genophenocorr.model.genome import GRCh38
+from genophenocorr.model.genome import GRCh38, Strand, transpose_coordinate
 
-from ._vv import VVHgvsVariantCoordinateFinder
+from ._vv import VVHgvsVariantCoordinateFinder, VVTranscriptCoordinateService
 
 
 @pytest.fixture
@@ -96,6 +96,105 @@ def test_find_coordinates(self, coordinate_finder: VVHgvsVariantCoordinateFinder
         print(vc)
 
 
+class TestVVTranscriptCoordinateService:
+    TEST_DATA_DIR = resource_filename(__name__, os.path.join('test_data', 'vv_response'))
+
+    @pytest.fixture
+    def tx_coordinate_service(self) -> VVTranscriptCoordinateService:
+        return VVTranscriptCoordinateService(genome_build=GRCh38)
+
+    def test_ptpn11(self, tx_coordinate_service: VVTranscriptCoordinateService):
+        tx_id = 'NM_002834.5'
+
+        response_fpath = os.path.join(self.TEST_DATA_DIR, 'txid-NM_002834.5-PTPN11.json')
+        response = load_response_json(response_fpath)
+
+        tc = tx_coordinate_service.parse_response(tx_id, response)
+
+        assert tc.identifier == tx_id
+
+        tx_region = tc.region
+        assert tx_region.contig.name == '12'
+        assert tx_region.start == 112_418_946
+        assert tx_region.end == 112_509_918
+        assert tx_region.strand == Strand.POSITIVE
+
+        exons = tc.exons
+        assert len(exons) == 16
+        first = exons[0]
+        assert first.start == tx_region.start
+        assert first.end == 112_419_125
+        last = exons[-1]
+        assert last.start == 112_505_824
+        assert last.end == tx_region.end
+        assert all(exon.strand == tx_region.strand for exon in exons)
+
+        assert tc.cds_start == 112_419_111
+        assert tc.cds_end == 112_504_764
+
+    def test_hbb(self, tx_coordinate_service: VVTranscriptCoordinateService):
+        tx_id = 'NM_000518.4'
+
+        response_fpath = os.path.join(self.TEST_DATA_DIR, 'txid-NM_000518.4-HBB.json')
+        response = load_response_json(response_fpath)
+
+        tc = tx_coordinate_service.parse_response(tx_id, response)
+
+        assert tc.identifier == tx_id
+
+        tx_region = tc.region
+        assert tx_region.contig.name == '11'
+        assert tx_region.start_on_strand(Strand.POSITIVE) == 5_225_465
+        assert tx_region.end_on_strand(Strand.POSITIVE) == 5_227_071
+        assert tx_region.strand == Strand.NEGATIVE
+
+        exons = tc.exons
+        assert len(exons) == 3
+        first = exons[0]
+        assert first.start == tx_region.start
+        assert first.start_on_strand(Strand.POSITIVE) == 5_226_929
+        assert first.end_on_strand(Strand.POSITIVE) == 5_227_071
+
+
+        last = exons[-1]
+        assert last.end == tx_region.end
+        assert last.start_on_strand(Strand.POSITIVE) == 5_225_465
+        assert last.end_on_strand(Strand.POSITIVE) == 52_25_726
+        assert all(exon.strand == tx_region.strand for exon in exons)
+
+        assert transpose_coordinate(tc.region.contig, tc.cds_start) == 5_227_021
+        assert transpose_coordinate(tc.region.contig, tc.cds_end) == 5_225_597
+        assert tc.cds_start == 129_859_601
+        assert tc.cds_end == 129_861_025
+
+    @pytest.mark.skip('Online tests are disabled by default')
+    def test_fetch_ptpn11(self, tx_coordinate_service: VVTranscriptCoordinateService):
+        tx_id = 'NM_002834.5'
+
+        tc = tx_coordinate_service.fetch(tx_id)
+
+        assert tc.identifier == tx_id
+
+        tx_region = tc.region
+        assert tx_region.contig.name == '12'
+        assert tx_region.start == 112_418_946
+        assert tx_region.end == 112_509_918
+        assert tx_region.strand == Strand.POSITIVE
+
+        exons = tc.exons
+        assert len(exons) == 16
+        first = exons[0]
+        assert first.start == tx_region.start
+        assert first.end == 112_419_125
+        last = exons[-1]
+        assert last.start == 112_505_824
+        assert last.end == tx_region.end
+        assert all(exon.strand == tx_region.strand for exon in exons)
+
+        assert tc.cds_start == 112_419_111
+        assert tc.cds_end == 112_504_764
+
+
 def load_response_json(path: str):
     with open(path) as fh:
         return json.load(fh)
diff --git a/src/genophenocorr/preprocessing/test_data/vv_response/README.md b/src/genophenocorr/preprocessing/test_data/vv_response/README.md
index 38172d33..3a8e2fa2 100644
--- a/src/genophenocorr/preprocessing/test_data/vv_response/README.md
+++ b/src/genophenocorr/preprocessing/test_data/vv_response/README.md
@@ -53,3 +53,25 @@ curl -X 'GET' \
   'https://rest.variantvalidator.org/VariantValidator/variantvalidator/hg38/NM_017503.5:c.333_334insAGC/mane_select' \
   -H 'Content-type:application/json' | python3 -m json.tool > hgvs_SURF2_ins.json
 ```
+
+## Test `VVTranscriptCoordinateService`
+
+### `tx_id_PTPN11.json`
+
+Corresponds to `NM_002834.5` in *PTPN11*:
+
+```shell
+curl -X 'GET' \
+  'https://rest.variantvalidator.org/VariantValidator/tools/gene2transcripts/NM_002834.5' \
+  -H 'Content-type:application/json' | python3 -m json.tool > txid-NM_002834.5-PTPN11.json
+```
+
+### `tx_id_HBB`
+
+Corresponds to `NM_000518.4` in *HBB*:
+
+```shell
+curl -X 'GET' \
+  'https://rest.variantvalidator.org/VariantValidator/tools/gene2transcripts/NM_000518.4' \
+  -H 'Content-type:application/json' | python3 -m json.tool > txid-NM_000518.4-HBB.json
+```
diff --git a/src/genophenocorr/preprocessing/test_data/vv_response/txid-NM_000518.4-HBB.json b/src/genophenocorr/preprocessing/test_data/vv_response/txid-NM_000518.4-HBB.json
new file mode 100644
index 00000000..98a35f59
--- /dev/null
+++ b/src/genophenocorr/preprocessing/test_data/vv_response/txid-NM_000518.4-HBB.json
@@ -0,0 +1,380 @@
+[
+    {
+        "current_name": "hemoglobin subunit beta",
+        "current_symbol": "HBB",
+        "hgnc": "HGNC:4827",
+        "previous_symbol": "",
+        "requested_symbol": "NM_000518.4",
+        "transcripts": [
+            {
+                "annotations": {
+                    "chromosome": "11",
+                    "db_xref": {
+                        "CCDS": "CCDS7753.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:4827",
+                        "ncbigene": "3043",
+                        "select": "MANE"
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": true,
+                    "map": "11p15.4",
+                    "note": "hemoglobin subunit beta",
+                    "refseq_select": true,
+                    "variant": "0"
+                },
+                "coding_end": 494,
+                "coding_start": 51,
+                "description": "Homo sapiens hemoglobin subunit beta (HBB), mRNA",
+                "genomic_spans": {
+                    "NC_000011.10": {
+                        "end_position": 5227071,
+                        "exon_structure": [
+                            {
+                                "cigar": "142=",
+                                "exon_number": 1,
+                                "genomic_end": 5227071,
+                                "genomic_start": 5226930,
+                                "transcript_end": 142,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "223=",
+                                "exon_number": 2,
+                                "genomic_end": 5226799,
+                                "genomic_start": 5226577,
+                                "transcript_end": 365,
+                                "transcript_start": 143
+                            },
+                            {
+                                "cigar": "263=",
+                                "exon_number": 3,
+                                "genomic_end": 5225726,
+                                "genomic_start": 5225464,
+                                "transcript_end": 628,
+                                "transcript_start": 366
+                            }
+                        ],
+                        "orientation": -1,
+                        "start_position": 5225464,
+                        "total_exons": 3
+                    },
+                    "NC_000011.9": {
+                        "end_position": 5248301,
+                        "exon_structure": [
+                            {
+                                "cigar": "142=",
+                                "exon_number": 1,
+                                "genomic_end": 5248301,
+                                "genomic_start": 5248160,
+                                "transcript_end": 142,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "223=",
+                                "exon_number": 2,
+                                "genomic_end": 5248029,
+                                "genomic_start": 5247807,
+                                "transcript_end": 365,
+                                "transcript_start": 143
+                            },
+                            {
+                                "cigar": "263=",
+                                "exon_number": 3,
+                                "genomic_end": 5246956,
+                                "genomic_start": 5246694,
+                                "transcript_end": 628,
+                                "transcript_start": 366
+                            }
+                        ],
+                        "orientation": -1,
+                        "start_position": 5246694,
+                        "total_exons": 3
+                    },
+                    "NG_000007.3": {
+                        "end_position": 72152,
+                        "exon_structure": [
+                            {
+                                "cigar": "142=",
+                                "exon_number": 1,
+                                "genomic_end": 70686,
+                                "genomic_start": 70545,
+                                "transcript_end": 142,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "223=",
+                                "exon_number": 2,
+                                "genomic_end": 71039,
+                                "genomic_start": 70817,
+                                "transcript_end": 365,
+                                "transcript_start": 143
+                            },
+                            {
+                                "cigar": "263=",
+                                "exon_number": 3,
+                                "genomic_end": 72152,
+                                "genomic_start": 71890,
+                                "transcript_end": 628,
+                                "transcript_start": 366
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 70545,
+                        "total_exons": 3
+                    },
+                    "NG_059281.1": {
+                        "end_position": 6608,
+                        "exon_structure": [
+                            {
+                                "cigar": "142=",
+                                "exon_number": 1,
+                                "genomic_end": 5142,
+                                "genomic_start": 5001,
+                                "transcript_end": 142,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "223=",
+                                "exon_number": 2,
+                                "genomic_end": 5495,
+                                "genomic_start": 5273,
+                                "transcript_end": 365,
+                                "transcript_start": 143
+                            },
+                            {
+                                "cigar": "263=",
+                                "exon_number": 3,
+                                "genomic_end": 6608,
+                                "genomic_start": 6346,
+                                "transcript_end": 628,
+                                "transcript_start": 366
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 5001,
+                        "total_exons": 3
+                    }
+                },
+                "length": 628,
+                "reference": "NM_000518.5",
+                "translation": "NP_000509.1"
+            },
+            {
+                "annotations": {
+                    "chromosome": "11",
+                    "db_xref": {
+                        "CCDS": "CCDS7753.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:4827",
+                        "ncbigene": "3043",
+                        "select": "MANE"
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": true,
+                    "map": "11p15.4",
+                    "note": "hemoglobin subunit beta",
+                    "refseq_select": true,
+                    "variant": "0"
+                },
+                "coding_end": 494,
+                "coding_start": 51,
+                "description": "Homo sapiens hemoglobin subunit beta (HBB), mRNA",
+                "genomic_spans": {
+                    "LRG_1232": {
+                        "end_position": 6608,
+                        "exon_structure": [
+                            {
+                                "cigar": "142=",
+                                "exon_number": 1,
+                                "genomic_end": 5142,
+                                "genomic_start": 5001,
+                                "transcript_end": 142,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "223=",
+                                "exon_number": 2,
+                                "genomic_end": 5495,
+                                "genomic_start": 5273,
+                                "transcript_end": 365,
+                                "transcript_start": 143
+                            },
+                            {
+                                "cigar": "263=",
+                                "exon_number": 3,
+                                "genomic_end": 6608,
+                                "genomic_start": 6346,
+                                "transcript_end": 628,
+                                "transcript_start": 366
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 5001,
+                        "total_exons": 3
+                    },
+                    "NG_059281.1": {
+                        "end_position": 6608,
+                        "exon_structure": [
+                            {
+                                "cigar": "142=",
+                                "exon_number": 1,
+                                "genomic_end": 5142,
+                                "genomic_start": 5001,
+                                "transcript_end": 142,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "223=",
+                                "exon_number": 2,
+                                "genomic_end": 5495,
+                                "genomic_start": 5273,
+                                "transcript_end": 365,
+                                "transcript_start": 143
+                            },
+                            {
+                                "cigar": "263=",
+                                "exon_number": 3,
+                                "genomic_end": 6608,
+                                "genomic_start": 6346,
+                                "transcript_end": 628,
+                                "transcript_start": 366
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 5001,
+                        "total_exons": 3
+                    }
+                },
+                "length": 628,
+                "reference": "LRG_1232t1",
+                "translation": "LRG_1232p1"
+            },
+            {
+                "annotations": {
+                    "chromosome": "11",
+                    "db_xref": {
+                        "CCDS": "CCDS7753.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:4827",
+                        "ncbigene": "3043",
+                        "select": false
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": false,
+                    "map": "11p15.4",
+                    "note": "hemoglobin subunit beta",
+                    "refseq_select": false,
+                    "variant": "0"
+                },
+                "coding_end": 494,
+                "coding_start": 51,
+                "description": "Homo sapiens hemoglobin subunit beta (HBB), mRNA",
+                "genomic_spans": {
+                    "NC_000011.10": {
+                        "end_position": 5227071,
+                        "exon_structure": [
+                            {
+                                "cigar": "142=",
+                                "exon_number": 1,
+                                "genomic_end": 5227071,
+                                "genomic_start": 5226930,
+                                "transcript_end": 142,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "223=",
+                                "exon_number": 2,
+                                "genomic_end": 5226799,
+                                "genomic_start": 5226577,
+                                "transcript_end": 365,
+                                "transcript_start": 143
+                            },
+                            {
+                                "cigar": "261=",
+                                "exon_number": 3,
+                                "genomic_end": 5225726,
+                                "genomic_start": 5225466,
+                                "transcript_end": 626,
+                                "transcript_start": 366
+                            }
+                        ],
+                        "orientation": -1,
+                        "start_position": 5225466,
+                        "total_exons": 3
+                    },
+                    "NC_000011.9": {
+                        "end_position": 5248301,
+                        "exon_structure": [
+                            {
+                                "cigar": "142=",
+                                "exon_number": 1,
+                                "genomic_end": 5248301,
+                                "genomic_start": 5248160,
+                                "transcript_end": 142,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "223=",
+                                "exon_number": 2,
+                                "genomic_end": 5248029,
+                                "genomic_start": 5247807,
+                                "transcript_end": 365,
+                                "transcript_start": 143
+                            },
+                            {
+                                "cigar": "261=",
+                                "exon_number": 3,
+                                "genomic_end": 5246956,
+                                "genomic_start": 5246696,
+                                "transcript_end": 626,
+                                "transcript_start": 366
+                            }
+                        ],
+                        "orientation": -1,
+                        "start_position": 5246696,
+                        "total_exons": 3
+                    },
+                    "NG_000007.3": {
+                        "end_position": 72150,
+                        "exon_structure": [
+                            {
+                                "cigar": "142=",
+                                "exon_number": 1,
+                                "genomic_end": 70686,
+                                "genomic_start": 70545,
+                                "transcript_end": 142,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "223=",
+                                "exon_number": 2,
+                                "genomic_end": 71039,
+                                "genomic_start": 70817,
+                                "transcript_end": 365,
+                                "transcript_start": 143
+                            },
+                            {
+                                "cigar": "261=",
+                                "exon_number": 3,
+                                "genomic_end": 72150,
+                                "genomic_start": 71890,
+                                "transcript_end": 626,
+                                "transcript_start": 366
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 70545,
+                        "total_exons": 3
+                    }
+                },
+                "length": 626,
+                "reference": "NM_000518.4",
+                "translation": "NP_000509.1"
+            }
+        ]
+    }
+]
diff --git a/src/genophenocorr/preprocessing/test_data/vv_response/txid-NM_002834.5-PTPN11.json b/src/genophenocorr/preprocessing/test_data/vv_response/txid-NM_002834.5-PTPN11.json
new file mode 100644
index 00000000..5022948e
--- /dev/null
+++ b/src/genophenocorr/preprocessing/test_data/vv_response/txid-NM_002834.5-PTPN11.json
@@ -0,0 +1,2897 @@
+[
+    {
+        "current_name": "protein tyrosine phosphatase non-receptor type 11",
+        "current_symbol": "PTPN11",
+        "hgnc": "HGNC:9644",
+        "previous_symbol": "NS1",
+        "requested_symbol": "NM_002834.5",
+        "transcripts": [
+            {
+                "annotations": {
+                    "chromosome": "12",
+                    "db_xref": {
+                        "CCDS": null,
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:9644",
+                        "ncbigene": "5781",
+                        "select": false
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": false,
+                    "map": "12q24.13",
+                    "note": "protein tyrosine phosphatase non-receptor type 11",
+                    "refseq_select": false,
+                    "variant": "4"
+                },
+                "coding_end": 1944,
+                "coding_start": 166,
+                "description": "Homo sapiens protein tyrosine phosphatase non-receptor type 11 (PTPN11), transcript variant 4, mRNA",
+                "genomic_spans": {
+                    "NC_000012.11": {
+                        "end_position": 112947722,
+                        "exon_structure": [
+                            {
+                                "cigar": "179=",
+                                "exon_number": 1,
+                                "genomic_end": 112856929,
+                                "genomic_start": 112856751,
+                                "transcript_end": 179,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112884202,
+                                "genomic_start": 112884080,
+                                "transcript_end": 302,
+                                "transcript_start": 180
+                            },
+                            {
+                                "cigar": "192=",
+                                "exon_number": 3,
+                                "genomic_end": 112888316,
+                                "genomic_start": 112888125,
+                                "transcript_end": 494,
+                                "transcript_start": 303
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112891191,
+                                "genomic_start": 112890999,
+                                "transcript_end": 687,
+                                "transcript_start": 495
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112892484,
+                                "genomic_start": 112892368,
+                                "transcript_end": 804,
+                                "transcript_start": 688
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112893867,
+                                "genomic_start": 112893754,
+                                "transcript_end": 918,
+                                "transcript_start": 805
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112910844,
+                                "genomic_start": 112910748,
+                                "transcript_end": 1015,
+                                "transcript_start": 919
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112915534,
+                                "genomic_start": 112915455,
+                                "transcript_end": 1095,
+                                "transcript_start": 1016
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112915819,
+                                "genomic_start": 112915661,
+                                "transcript_end": 1254,
+                                "transcript_start": 1096
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112920009,
+                                "genomic_start": 112919878,
+                                "transcript_end": 1386,
+                                "transcript_start": 1255
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 112924433,
+                                "genomic_start": 112924279,
+                                "transcript_end": 1541,
+                                "transcript_start": 1387
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112926314,
+                                "genomic_start": 112926247,
+                                "transcript_end": 1609,
+                                "transcript_start": 1542
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112926979,
+                                "genomic_start": 112926828,
+                                "transcript_end": 1761,
+                                "transcript_start": 1610
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112940060,
+                                "genomic_start": 112939948,
+                                "transcript_end": 1874,
+                                "transcript_start": 1762
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112942600,
+                                "genomic_start": 112942499,
+                                "transcript_end": 1976,
+                                "transcript_start": 1875
+                            },
+                            {
+                                "cigar": "4094=",
+                                "exon_number": 16,
+                                "genomic_end": 112947722,
+                                "genomic_start": 112943629,
+                                "transcript_end": 6070,
+                                "transcript_start": 1977
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112856751,
+                        "total_exons": 16
+                    },
+                    "NC_000012.12": {
+                        "end_position": 112509918,
+                        "exon_structure": [
+                            {
+                                "cigar": "179=",
+                                "exon_number": 1,
+                                "genomic_end": 112419125,
+                                "genomic_start": 112418947,
+                                "transcript_end": 179,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112446398,
+                                "genomic_start": 112446276,
+                                "transcript_end": 302,
+                                "transcript_start": 180
+                            },
+                            {
+                                "cigar": "192=",
+                                "exon_number": 3,
+                                "genomic_end": 112450512,
+                                "genomic_start": 112450321,
+                                "transcript_end": 494,
+                                "transcript_start": 303
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112453387,
+                                "genomic_start": 112453195,
+                                "transcript_end": 687,
+                                "transcript_start": 495
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112454680,
+                                "genomic_start": 112454564,
+                                "transcript_end": 804,
+                                "transcript_start": 688
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112456063,
+                                "genomic_start": 112455950,
+                                "transcript_end": 918,
+                                "transcript_start": 805
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112473040,
+                                "genomic_start": 112472944,
+                                "transcript_end": 1015,
+                                "transcript_start": 919
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112477730,
+                                "genomic_start": 112477651,
+                                "transcript_end": 1095,
+                                "transcript_start": 1016
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112478015,
+                                "genomic_start": 112477857,
+                                "transcript_end": 1254,
+                                "transcript_start": 1096
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112482205,
+                                "genomic_start": 112482074,
+                                "transcript_end": 1386,
+                                "transcript_start": 1255
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 112486629,
+                                "genomic_start": 112486475,
+                                "transcript_end": 1541,
+                                "transcript_start": 1387
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112488510,
+                                "genomic_start": 112488443,
+                                "transcript_end": 1609,
+                                "transcript_start": 1542
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112489175,
+                                "genomic_start": 112489024,
+                                "transcript_end": 1761,
+                                "transcript_start": 1610
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112502256,
+                                "genomic_start": 112502144,
+                                "transcript_end": 1874,
+                                "transcript_start": 1762
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112504796,
+                                "genomic_start": 112504695,
+                                "transcript_end": 1976,
+                                "transcript_start": 1875
+                            },
+                            {
+                                "cigar": "4094=",
+                                "exon_number": 16,
+                                "genomic_end": 112509918,
+                                "genomic_start": 112505825,
+                                "transcript_end": 6070,
+                                "transcript_start": 1977
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112418947,
+                        "total_exons": 16
+                    }
+                },
+                "length": 6070,
+                "reference": "NM_001374625.1",
+                "translation": "NP_001361554.1"
+            },
+            {
+                "annotations": {
+                    "chromosome": "12",
+                    "db_xref": {
+                        "CCDS": "CCDS81741.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:9644",
+                        "ncbigene": "5781",
+                        "select": false
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": false,
+                    "map": "12q24.13",
+                    "note": "protein tyrosine phosphatase non-receptor type 11",
+                    "refseq_select": false,
+                    "variant": "3"
+                },
+                "coding_end": 1959,
+                "coding_start": 166,
+                "description": "Homo sapiens protein tyrosine phosphatase non-receptor type 11 (PTPN11), transcript variant 3, mRNA",
+                "genomic_spans": {
+                    "NC_000012.11": {
+                        "end_position": 112947722,
+                        "exon_structure": [
+                            {
+                                "cigar": "179=",
+                                "exon_number": 1,
+                                "genomic_end": 112856929,
+                                "genomic_start": 112856751,
+                                "transcript_end": 179,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112884202,
+                                "genomic_start": 112884080,
+                                "transcript_end": 302,
+                                "transcript_start": 180
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112888316,
+                                "genomic_start": 112888122,
+                                "transcript_end": 497,
+                                "transcript_start": 303
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112891191,
+                                "genomic_start": 112890999,
+                                "transcript_end": 690,
+                                "transcript_start": 498
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112892484,
+                                "genomic_start": 112892368,
+                                "transcript_end": 807,
+                                "transcript_start": 691
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112893867,
+                                "genomic_start": 112893754,
+                                "transcript_end": 921,
+                                "transcript_start": 808
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112910844,
+                                "genomic_start": 112910748,
+                                "transcript_end": 1018,
+                                "transcript_start": 922
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112915534,
+                                "genomic_start": 112915455,
+                                "transcript_end": 1098,
+                                "transcript_start": 1019
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112915819,
+                                "genomic_start": 112915661,
+                                "transcript_end": 1257,
+                                "transcript_start": 1099
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112920009,
+                                "genomic_start": 112919878,
+                                "transcript_end": 1389,
+                                "transcript_start": 1258
+                            },
+                            {
+                                "cigar": "167=",
+                                "exon_number": 11,
+                                "genomic_end": 112924433,
+                                "genomic_start": 112924267,
+                                "transcript_end": 1556,
+                                "transcript_start": 1390
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112926314,
+                                "genomic_start": 112926247,
+                                "transcript_end": 1624,
+                                "transcript_start": 1557
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112926979,
+                                "genomic_start": 112926828,
+                                "transcript_end": 1776,
+                                "transcript_start": 1625
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112940060,
+                                "genomic_start": 112939948,
+                                "transcript_end": 1889,
+                                "transcript_start": 1777
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112942600,
+                                "genomic_start": 112942499,
+                                "transcript_end": 1991,
+                                "transcript_start": 1890
+                            },
+                            {
+                                "cigar": "4094=",
+                                "exon_number": 16,
+                                "genomic_end": 112947722,
+                                "genomic_start": 112943629,
+                                "transcript_end": 6085,
+                                "transcript_start": 1992
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112856751,
+                        "total_exons": 16
+                    },
+                    "NC_000012.12": {
+                        "end_position": 112509918,
+                        "exon_structure": [
+                            {
+                                "cigar": "179=",
+                                "exon_number": 1,
+                                "genomic_end": 112419125,
+                                "genomic_start": 112418947,
+                                "transcript_end": 179,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112446398,
+                                "genomic_start": 112446276,
+                                "transcript_end": 302,
+                                "transcript_start": 180
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112450512,
+                                "genomic_start": 112450318,
+                                "transcript_end": 497,
+                                "transcript_start": 303
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112453387,
+                                "genomic_start": 112453195,
+                                "transcript_end": 690,
+                                "transcript_start": 498
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112454680,
+                                "genomic_start": 112454564,
+                                "transcript_end": 807,
+                                "transcript_start": 691
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112456063,
+                                "genomic_start": 112455950,
+                                "transcript_end": 921,
+                                "transcript_start": 808
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112473040,
+                                "genomic_start": 112472944,
+                                "transcript_end": 1018,
+                                "transcript_start": 922
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112477730,
+                                "genomic_start": 112477651,
+                                "transcript_end": 1098,
+                                "transcript_start": 1019
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112478015,
+                                "genomic_start": 112477857,
+                                "transcript_end": 1257,
+                                "transcript_start": 1099
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112482205,
+                                "genomic_start": 112482074,
+                                "transcript_end": 1389,
+                                "transcript_start": 1258
+                            },
+                            {
+                                "cigar": "167=",
+                                "exon_number": 11,
+                                "genomic_end": 112486629,
+                                "genomic_start": 112486463,
+                                "transcript_end": 1556,
+                                "transcript_start": 1390
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112488510,
+                                "genomic_start": 112488443,
+                                "transcript_end": 1624,
+                                "transcript_start": 1557
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112489175,
+                                "genomic_start": 112489024,
+                                "transcript_end": 1776,
+                                "transcript_start": 1625
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112502256,
+                                "genomic_start": 112502144,
+                                "transcript_end": 1889,
+                                "transcript_start": 1777
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112504796,
+                                "genomic_start": 112504695,
+                                "transcript_end": 1991,
+                                "transcript_start": 1890
+                            },
+                            {
+                                "cigar": "4094=",
+                                "exon_number": 16,
+                                "genomic_end": 112509918,
+                                "genomic_start": 112505825,
+                                "transcript_end": 6085,
+                                "transcript_start": 1992
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112418947,
+                        "total_exons": 16
+                    }
+                },
+                "length": 6085,
+                "reference": "NM_001330437.2",
+                "translation": "NP_001317366.1"
+            },
+            {
+                "annotations": {
+                    "chromosome": "12",
+                    "db_xref": {
+                        "CCDS": "CCDS58280.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:9644",
+                        "ncbigene": "5781",
+                        "select": false
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": false,
+                    "map": "12q24.13",
+                    "note": "protein tyrosine phosphatase non-receptor type 11",
+                    "refseq_select": false,
+                    "variant": "2"
+                },
+                "coding_end": 1548,
+                "coding_start": 166,
+                "description": "Homo sapiens protein tyrosine phosphatase non-receptor type 11 (PTPN11), transcript variant 2, mRNA",
+                "genomic_spans": {
+                    "NC_000012.11": {
+                        "end_position": 112924727,
+                        "exon_structure": [
+                            {
+                                "cigar": "179=",
+                                "exon_number": 1,
+                                "genomic_end": 112856929,
+                                "genomic_start": 112856751,
+                                "transcript_end": 179,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112884202,
+                                "genomic_start": 112884080,
+                                "transcript_end": 302,
+                                "transcript_start": 180
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112888316,
+                                "genomic_start": 112888122,
+                                "transcript_end": 497,
+                                "transcript_start": 303
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112891191,
+                                "genomic_start": 112890999,
+                                "transcript_end": 690,
+                                "transcript_start": 498
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112892484,
+                                "genomic_start": 112892368,
+                                "transcript_end": 807,
+                                "transcript_start": 691
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112893867,
+                                "genomic_start": 112893754,
+                                "transcript_end": 921,
+                                "transcript_start": 808
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112910844,
+                                "genomic_start": 112910748,
+                                "transcript_end": 1018,
+                                "transcript_start": 922
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112915534,
+                                "genomic_start": 112915455,
+                                "transcript_end": 1098,
+                                "transcript_start": 1019
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112915819,
+                                "genomic_start": 112915661,
+                                "transcript_end": 1257,
+                                "transcript_start": 1099
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112920009,
+                                "genomic_start": 112919878,
+                                "transcript_end": 1389,
+                                "transcript_start": 1258
+                            },
+                            {
+                                "cigar": "449=",
+                                "exon_number": 11,
+                                "genomic_end": 112924727,
+                                "genomic_start": 112924279,
+                                "transcript_end": 1838,
+                                "transcript_start": 1390
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112856751,
+                        "total_exons": 11
+                    },
+                    "NC_000012.12": {
+                        "end_position": 112486923,
+                        "exon_structure": [
+                            {
+                                "cigar": "179=",
+                                "exon_number": 1,
+                                "genomic_end": 112419125,
+                                "genomic_start": 112418947,
+                                "transcript_end": 179,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112446398,
+                                "genomic_start": 112446276,
+                                "transcript_end": 302,
+                                "transcript_start": 180
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112450512,
+                                "genomic_start": 112450318,
+                                "transcript_end": 497,
+                                "transcript_start": 303
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112453387,
+                                "genomic_start": 112453195,
+                                "transcript_end": 690,
+                                "transcript_start": 498
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112454680,
+                                "genomic_start": 112454564,
+                                "transcript_end": 807,
+                                "transcript_start": 691
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112456063,
+                                "genomic_start": 112455950,
+                                "transcript_end": 921,
+                                "transcript_start": 808
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112473040,
+                                "genomic_start": 112472944,
+                                "transcript_end": 1018,
+                                "transcript_start": 922
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112477730,
+                                "genomic_start": 112477651,
+                                "transcript_end": 1098,
+                                "transcript_start": 1019
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112478015,
+                                "genomic_start": 112477857,
+                                "transcript_end": 1257,
+                                "transcript_start": 1099
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112482205,
+                                "genomic_start": 112482074,
+                                "transcript_end": 1389,
+                                "transcript_start": 1258
+                            },
+                            {
+                                "cigar": "449=",
+                                "exon_number": 11,
+                                "genomic_end": 112486923,
+                                "genomic_start": 112486475,
+                                "transcript_end": 1838,
+                                "transcript_start": 1390
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112418947,
+                        "total_exons": 11
+                    }
+                },
+                "length": 1838,
+                "reference": "NM_080601.3",
+                "translation": "NP_542168.1"
+            },
+            {
+                "annotations": {
+                    "chromosome": "12",
+                    "db_xref": {
+                        "CCDS": "CCDS9163.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:9644",
+                        "ncbigene": "5781",
+                        "select": "MANE"
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": true,
+                    "map": "12q24.13",
+                    "note": "protein tyrosine phosphatase non-receptor type 11",
+                    "refseq_select": true,
+                    "variant": "1"
+                },
+                "coding_end": 1947,
+                "coding_start": 166,
+                "description": "Homo sapiens protein tyrosine phosphatase non-receptor type 11 (PTPN11), transcript variant 1, mRNA",
+                "genomic_spans": {
+                    "NC_000012.11": {
+                        "end_position": 112947722,
+                        "exon_structure": [
+                            {
+                                "cigar": "179=",
+                                "exon_number": 1,
+                                "genomic_end": 112856929,
+                                "genomic_start": 112856751,
+                                "transcript_end": 179,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112884202,
+                                "genomic_start": 112884080,
+                                "transcript_end": 302,
+                                "transcript_start": 180
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112888316,
+                                "genomic_start": 112888122,
+                                "transcript_end": 497,
+                                "transcript_start": 303
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112891191,
+                                "genomic_start": 112890999,
+                                "transcript_end": 690,
+                                "transcript_start": 498
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112892484,
+                                "genomic_start": 112892368,
+                                "transcript_end": 807,
+                                "transcript_start": 691
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112893867,
+                                "genomic_start": 112893754,
+                                "transcript_end": 921,
+                                "transcript_start": 808
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112910844,
+                                "genomic_start": 112910748,
+                                "transcript_end": 1018,
+                                "transcript_start": 922
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112915534,
+                                "genomic_start": 112915455,
+                                "transcript_end": 1098,
+                                "transcript_start": 1019
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112915819,
+                                "genomic_start": 112915661,
+                                "transcript_end": 1257,
+                                "transcript_start": 1099
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112920009,
+                                "genomic_start": 112919878,
+                                "transcript_end": 1389,
+                                "transcript_start": 1258
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 112924433,
+                                "genomic_start": 112924279,
+                                "transcript_end": 1544,
+                                "transcript_start": 1390
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112926314,
+                                "genomic_start": 112926247,
+                                "transcript_end": 1612,
+                                "transcript_start": 1545
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112926979,
+                                "genomic_start": 112926828,
+                                "transcript_end": 1764,
+                                "transcript_start": 1613
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112940060,
+                                "genomic_start": 112939948,
+                                "transcript_end": 1877,
+                                "transcript_start": 1765
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112942600,
+                                "genomic_start": 112942499,
+                                "transcript_end": 1979,
+                                "transcript_start": 1878
+                            },
+                            {
+                                "cigar": "4094=",
+                                "exon_number": 16,
+                                "genomic_end": 112947722,
+                                "genomic_start": 112943629,
+                                "transcript_end": 6073,
+                                "transcript_start": 1980
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112856751,
+                        "total_exons": 16
+                    },
+                    "NC_000012.12": {
+                        "end_position": 112509918,
+                        "exon_structure": [
+                            {
+                                "cigar": "179=",
+                                "exon_number": 1,
+                                "genomic_end": 112419125,
+                                "genomic_start": 112418947,
+                                "transcript_end": 179,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112446398,
+                                "genomic_start": 112446276,
+                                "transcript_end": 302,
+                                "transcript_start": 180
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112450512,
+                                "genomic_start": 112450318,
+                                "transcript_end": 497,
+                                "transcript_start": 303
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112453387,
+                                "genomic_start": 112453195,
+                                "transcript_end": 690,
+                                "transcript_start": 498
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112454680,
+                                "genomic_start": 112454564,
+                                "transcript_end": 807,
+                                "transcript_start": 691
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112456063,
+                                "genomic_start": 112455950,
+                                "transcript_end": 921,
+                                "transcript_start": 808
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112473040,
+                                "genomic_start": 112472944,
+                                "transcript_end": 1018,
+                                "transcript_start": 922
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112477730,
+                                "genomic_start": 112477651,
+                                "transcript_end": 1098,
+                                "transcript_start": 1019
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112478015,
+                                "genomic_start": 112477857,
+                                "transcript_end": 1257,
+                                "transcript_start": 1099
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112482205,
+                                "genomic_start": 112482074,
+                                "transcript_end": 1389,
+                                "transcript_start": 1258
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 112486629,
+                                "genomic_start": 112486475,
+                                "transcript_end": 1544,
+                                "transcript_start": 1390
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112488510,
+                                "genomic_start": 112488443,
+                                "transcript_end": 1612,
+                                "transcript_start": 1545
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112489175,
+                                "genomic_start": 112489024,
+                                "transcript_end": 1764,
+                                "transcript_start": 1613
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112502256,
+                                "genomic_start": 112502144,
+                                "transcript_end": 1877,
+                                "transcript_start": 1765
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112504796,
+                                "genomic_start": 112504695,
+                                "transcript_end": 1979,
+                                "transcript_start": 1878
+                            },
+                            {
+                                "cigar": "4094=",
+                                "exon_number": 16,
+                                "genomic_end": 112509918,
+                                "genomic_start": 112505825,
+                                "transcript_end": 6073,
+                                "transcript_start": 1980
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112418947,
+                        "total_exons": 16
+                    }
+                },
+                "length": 6073,
+                "reference": "NM_002834.5",
+                "translation": "NP_002825.3"
+            },
+            {
+                "annotations": {
+                    "chromosome": "12",
+                    "db_xref": {
+                        "CCDS": "CCDS9163.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:9644",
+                        "ncbigene": "5781",
+                        "select": false
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": false,
+                    "map": "12q24.13",
+                    "note": "protein tyrosine phosphatase non-receptor type 11",
+                    "refseq_select": false,
+                    "variant": "1"
+                },
+                "coding_end": 2162,
+                "coding_start": 381,
+                "description": "Homo sapiens protein tyrosine phosphatase, non-receptor type 11 (PTPN11), transcript variant 1, mRNA",
+                "genomic_spans": {
+                    "NC_000012.11": {
+                        "end_position": 112947717,
+                        "exon_structure": [
+                            {
+                                "cigar": "394=",
+                                "exon_number": 1,
+                                "genomic_end": 112856929,
+                                "genomic_start": 112856536,
+                                "transcript_end": 394,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112884202,
+                                "genomic_start": 112884080,
+                                "transcript_end": 517,
+                                "transcript_start": 395
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112888316,
+                                "genomic_start": 112888122,
+                                "transcript_end": 712,
+                                "transcript_start": 518
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112891191,
+                                "genomic_start": 112890999,
+                                "transcript_end": 905,
+                                "transcript_start": 713
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112892484,
+                                "genomic_start": 112892368,
+                                "transcript_end": 1022,
+                                "transcript_start": 906
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112893867,
+                                "genomic_start": 112893754,
+                                "transcript_end": 1136,
+                                "transcript_start": 1023
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112910844,
+                                "genomic_start": 112910748,
+                                "transcript_end": 1233,
+                                "transcript_start": 1137
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112915534,
+                                "genomic_start": 112915455,
+                                "transcript_end": 1313,
+                                "transcript_start": 1234
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112915819,
+                                "genomic_start": 112915661,
+                                "transcript_end": 1472,
+                                "transcript_start": 1314
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112920009,
+                                "genomic_start": 112919878,
+                                "transcript_end": 1604,
+                                "transcript_start": 1473
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 112924433,
+                                "genomic_start": 112924279,
+                                "transcript_end": 1759,
+                                "transcript_start": 1605
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112926314,
+                                "genomic_start": 112926247,
+                                "transcript_end": 1827,
+                                "transcript_start": 1760
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112926979,
+                                "genomic_start": 112926828,
+                                "transcript_end": 1979,
+                                "transcript_start": 1828
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112940060,
+                                "genomic_start": 112939948,
+                                "transcript_end": 2092,
+                                "transcript_start": 1980
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112942600,
+                                "genomic_start": 112942499,
+                                "transcript_end": 2194,
+                                "transcript_start": 2093
+                            },
+                            {
+                                "cigar": "4089=",
+                                "exon_number": 16,
+                                "genomic_end": 112947717,
+                                "genomic_start": 112943629,
+                                "transcript_end": 6283,
+                                "transcript_start": 2195
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112856536,
+                        "total_exons": 16
+                    },
+                    "NC_000012.12": {
+                        "end_position": 112509913,
+                        "exon_structure": [
+                            {
+                                "cigar": "394=",
+                                "exon_number": 1,
+                                "genomic_end": 112419125,
+                                "genomic_start": 112418732,
+                                "transcript_end": 394,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112446398,
+                                "genomic_start": 112446276,
+                                "transcript_end": 517,
+                                "transcript_start": 395
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112450512,
+                                "genomic_start": 112450318,
+                                "transcript_end": 712,
+                                "transcript_start": 518
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112453387,
+                                "genomic_start": 112453195,
+                                "transcript_end": 905,
+                                "transcript_start": 713
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112454680,
+                                "genomic_start": 112454564,
+                                "transcript_end": 1022,
+                                "transcript_start": 906
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112456063,
+                                "genomic_start": 112455950,
+                                "transcript_end": 1136,
+                                "transcript_start": 1023
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112473040,
+                                "genomic_start": 112472944,
+                                "transcript_end": 1233,
+                                "transcript_start": 1137
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112477730,
+                                "genomic_start": 112477651,
+                                "transcript_end": 1313,
+                                "transcript_start": 1234
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112478015,
+                                "genomic_start": 112477857,
+                                "transcript_end": 1472,
+                                "transcript_start": 1314
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112482205,
+                                "genomic_start": 112482074,
+                                "transcript_end": 1604,
+                                "transcript_start": 1473
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 112486629,
+                                "genomic_start": 112486475,
+                                "transcript_end": 1759,
+                                "transcript_start": 1605
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112488510,
+                                "genomic_start": 112488443,
+                                "transcript_end": 1827,
+                                "transcript_start": 1760
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112489175,
+                                "genomic_start": 112489024,
+                                "transcript_end": 1979,
+                                "transcript_start": 1828
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112502256,
+                                "genomic_start": 112502144,
+                                "transcript_end": 2092,
+                                "transcript_start": 1980
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112504796,
+                                "genomic_start": 112504695,
+                                "transcript_end": 2194,
+                                "transcript_start": 2093
+                            },
+                            {
+                                "cigar": "4089=",
+                                "exon_number": 16,
+                                "genomic_end": 112509913,
+                                "genomic_start": 112505825,
+                                "transcript_end": 6283,
+                                "transcript_start": 2195
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112418732,
+                        "total_exons": 16
+                    },
+                    "NG_007459.1": {
+                        "end_position": 96182,
+                        "exon_structure": [
+                            {
+                                "cigar": "394=",
+                                "exon_number": 1,
+                                "genomic_end": 5394,
+                                "genomic_start": 5001,
+                                "transcript_end": 394,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 32667,
+                                "genomic_start": 32545,
+                                "transcript_end": 517,
+                                "transcript_start": 395
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 36781,
+                                "genomic_start": 36587,
+                                "transcript_end": 712,
+                                "transcript_start": 518
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 39656,
+                                "genomic_start": 39464,
+                                "transcript_end": 905,
+                                "transcript_start": 713
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 40949,
+                                "genomic_start": 40833,
+                                "transcript_end": 1022,
+                                "transcript_start": 906
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 42332,
+                                "genomic_start": 42219,
+                                "transcript_end": 1136,
+                                "transcript_start": 1023
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 59309,
+                                "genomic_start": 59213,
+                                "transcript_end": 1233,
+                                "transcript_start": 1137
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 63999,
+                                "genomic_start": 63920,
+                                "transcript_end": 1313,
+                                "transcript_start": 1234
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 64284,
+                                "genomic_start": 64126,
+                                "transcript_end": 1472,
+                                "transcript_start": 1314
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 68474,
+                                "genomic_start": 68343,
+                                "transcript_end": 1604,
+                                "transcript_start": 1473
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 72898,
+                                "genomic_start": 72744,
+                                "transcript_end": 1759,
+                                "transcript_start": 1605
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 74779,
+                                "genomic_start": 74712,
+                                "transcript_end": 1827,
+                                "transcript_start": 1760
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 75444,
+                                "genomic_start": 75293,
+                                "transcript_end": 1979,
+                                "transcript_start": 1828
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 88525,
+                                "genomic_start": 88413,
+                                "transcript_end": 2092,
+                                "transcript_start": 1980
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 91065,
+                                "genomic_start": 90964,
+                                "transcript_end": 2194,
+                                "transcript_start": 2093
+                            },
+                            {
+                                "cigar": "4089=",
+                                "exon_number": 16,
+                                "genomic_end": 96182,
+                                "genomic_start": 92094,
+                                "transcript_end": 6283,
+                                "transcript_start": 2195
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 5001,
+                        "total_exons": 16
+                    }
+                },
+                "length": 6283,
+                "reference": "NM_002834.3",
+                "translation": "NP_002825.3"
+            },
+            {
+                "annotations": {
+                    "chromosome": "12",
+                    "db_xref": {
+                        "CCDS": "CCDS9163.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:9644",
+                        "ncbigene": "5781",
+                        "select": false
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": false,
+                    "map": "12q24.13",
+                    "note": "protein tyrosine phosphatase non-receptor type 11",
+                    "refseq_select": false,
+                    "variant": "1"
+                },
+                "coding_end": 2162,
+                "coding_start": 381,
+                "description": "Homo sapiens protein tyrosine phosphatase, non-receptor type 11 (PTPN11), transcript variant 1, mRNA",
+                "genomic_spans": {
+                    "LRG_614": {
+                        "end_position": 96182,
+                        "exon_structure": [
+                            {
+                                "cigar": "394=",
+                                "exon_number": 1,
+                                "genomic_end": 5394,
+                                "genomic_start": 5001,
+                                "transcript_end": 394,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 32667,
+                                "genomic_start": 32545,
+                                "transcript_end": 517,
+                                "transcript_start": 395
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 36781,
+                                "genomic_start": 36587,
+                                "transcript_end": 712,
+                                "transcript_start": 518
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 39656,
+                                "genomic_start": 39464,
+                                "transcript_end": 905,
+                                "transcript_start": 713
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 40949,
+                                "genomic_start": 40833,
+                                "transcript_end": 1022,
+                                "transcript_start": 906
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 42332,
+                                "genomic_start": 42219,
+                                "transcript_end": 1136,
+                                "transcript_start": 1023
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 59309,
+                                "genomic_start": 59213,
+                                "transcript_end": 1233,
+                                "transcript_start": 1137
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 63999,
+                                "genomic_start": 63920,
+                                "transcript_end": 1313,
+                                "transcript_start": 1234
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 64284,
+                                "genomic_start": 64126,
+                                "transcript_end": 1472,
+                                "transcript_start": 1314
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 68474,
+                                "genomic_start": 68343,
+                                "transcript_end": 1604,
+                                "transcript_start": 1473
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 72898,
+                                "genomic_start": 72744,
+                                "transcript_end": 1759,
+                                "transcript_start": 1605
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 74779,
+                                "genomic_start": 74712,
+                                "transcript_end": 1827,
+                                "transcript_start": 1760
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 75444,
+                                "genomic_start": 75293,
+                                "transcript_end": 1979,
+                                "transcript_start": 1828
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 88525,
+                                "genomic_start": 88413,
+                                "transcript_end": 2092,
+                                "transcript_start": 1980
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 91065,
+                                "genomic_start": 90964,
+                                "transcript_end": 2194,
+                                "transcript_start": 2093
+                            },
+                            {
+                                "cigar": "4089=",
+                                "exon_number": 16,
+                                "genomic_end": 96182,
+                                "genomic_start": 92094,
+                                "transcript_end": 6283,
+                                "transcript_start": 2195
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 5001,
+                        "total_exons": 16
+                    },
+                    "NG_007459.1": {
+                        "end_position": 96182,
+                        "exon_structure": [
+                            {
+                                "cigar": "394=",
+                                "exon_number": 1,
+                                "genomic_end": 5394,
+                                "genomic_start": 5001,
+                                "transcript_end": 394,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 32667,
+                                "genomic_start": 32545,
+                                "transcript_end": 517,
+                                "transcript_start": 395
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 36781,
+                                "genomic_start": 36587,
+                                "transcript_end": 712,
+                                "transcript_start": 518
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 39656,
+                                "genomic_start": 39464,
+                                "transcript_end": 905,
+                                "transcript_start": 713
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 40949,
+                                "genomic_start": 40833,
+                                "transcript_end": 1022,
+                                "transcript_start": 906
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 42332,
+                                "genomic_start": 42219,
+                                "transcript_end": 1136,
+                                "transcript_start": 1023
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 59309,
+                                "genomic_start": 59213,
+                                "transcript_end": 1233,
+                                "transcript_start": 1137
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 63999,
+                                "genomic_start": 63920,
+                                "transcript_end": 1313,
+                                "transcript_start": 1234
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 64284,
+                                "genomic_start": 64126,
+                                "transcript_end": 1472,
+                                "transcript_start": 1314
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 68474,
+                                "genomic_start": 68343,
+                                "transcript_end": 1604,
+                                "transcript_start": 1473
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 72898,
+                                "genomic_start": 72744,
+                                "transcript_end": 1759,
+                                "transcript_start": 1605
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 74779,
+                                "genomic_start": 74712,
+                                "transcript_end": 1827,
+                                "transcript_start": 1760
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 75444,
+                                "genomic_start": 75293,
+                                "transcript_end": 1979,
+                                "transcript_start": 1828
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 88525,
+                                "genomic_start": 88413,
+                                "transcript_end": 2092,
+                                "transcript_start": 1980
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 91065,
+                                "genomic_start": 90964,
+                                "transcript_end": 2194,
+                                "transcript_start": 2093
+                            },
+                            {
+                                "cigar": "4089=",
+                                "exon_number": 16,
+                                "genomic_end": 96182,
+                                "genomic_start": 92094,
+                                "transcript_end": 6283,
+                                "transcript_start": 2195
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 5001,
+                        "total_exons": 16
+                    }
+                },
+                "length": 6283,
+                "reference": "LRG_614t1",
+                "translation": "LRG_614p1"
+            },
+            {
+                "annotations": {
+                    "chromosome": "12",
+                    "db_xref": {
+                        "CCDS": "CCDS81741.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:9644",
+                        "ncbigene": "5781",
+                        "select": false
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": false,
+                    "map": "12q24.13",
+                    "note": "protein tyrosine phosphatase non-receptor type 11",
+                    "refseq_select": false,
+                    "variant": "3"
+                },
+                "coding_end": 2008,
+                "coding_start": 215,
+                "description": "Homo sapiens protein tyrosine phosphatase non-receptor type 11 (PTPN11), transcript variant 3, mRNA",
+                "genomic_spans": {
+                    "NC_000012.11": {
+                        "end_position": 112947722,
+                        "exon_structure": [
+                            {
+                                "cigar": "228=",
+                                "exon_number": 1,
+                                "genomic_end": 112856929,
+                                "genomic_start": 112856702,
+                                "transcript_end": 228,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112884202,
+                                "genomic_start": 112884080,
+                                "transcript_end": 351,
+                                "transcript_start": 229
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112888316,
+                                "genomic_start": 112888122,
+                                "transcript_end": 546,
+                                "transcript_start": 352
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112891191,
+                                "genomic_start": 112890999,
+                                "transcript_end": 739,
+                                "transcript_start": 547
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112892484,
+                                "genomic_start": 112892368,
+                                "transcript_end": 856,
+                                "transcript_start": 740
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112893867,
+                                "genomic_start": 112893754,
+                                "transcript_end": 970,
+                                "transcript_start": 857
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112910844,
+                                "genomic_start": 112910748,
+                                "transcript_end": 1067,
+                                "transcript_start": 971
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112915534,
+                                "genomic_start": 112915455,
+                                "transcript_end": 1147,
+                                "transcript_start": 1068
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112915819,
+                                "genomic_start": 112915661,
+                                "transcript_end": 1306,
+                                "transcript_start": 1148
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112920009,
+                                "genomic_start": 112919878,
+                                "transcript_end": 1438,
+                                "transcript_start": 1307
+                            },
+                            {
+                                "cigar": "167=",
+                                "exon_number": 11,
+                                "genomic_end": 112924433,
+                                "genomic_start": 112924267,
+                                "transcript_end": 1605,
+                                "transcript_start": 1439
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112926314,
+                                "genomic_start": 112926247,
+                                "transcript_end": 1673,
+                                "transcript_start": 1606
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112926979,
+                                "genomic_start": 112926828,
+                                "transcript_end": 1825,
+                                "transcript_start": 1674
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112940060,
+                                "genomic_start": 112939948,
+                                "transcript_end": 1938,
+                                "transcript_start": 1826
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112942600,
+                                "genomic_start": 112942499,
+                                "transcript_end": 2040,
+                                "transcript_start": 1939
+                            },
+                            {
+                                "cigar": "4094=",
+                                "exon_number": 16,
+                                "genomic_end": 112947722,
+                                "genomic_start": 112943629,
+                                "transcript_end": 6134,
+                                "transcript_start": 2041
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112856702,
+                        "total_exons": 16
+                    },
+                    "NC_000012.12": {
+                        "end_position": 112509918,
+                        "exon_structure": [
+                            {
+                                "cigar": "228=",
+                                "exon_number": 1,
+                                "genomic_end": 112419125,
+                                "genomic_start": 112418898,
+                                "transcript_end": 228,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112446398,
+                                "genomic_start": 112446276,
+                                "transcript_end": 351,
+                                "transcript_start": 229
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112450512,
+                                "genomic_start": 112450318,
+                                "transcript_end": 546,
+                                "transcript_start": 352
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112453387,
+                                "genomic_start": 112453195,
+                                "transcript_end": 739,
+                                "transcript_start": 547
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112454680,
+                                "genomic_start": 112454564,
+                                "transcript_end": 856,
+                                "transcript_start": 740
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112456063,
+                                "genomic_start": 112455950,
+                                "transcript_end": 970,
+                                "transcript_start": 857
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112473040,
+                                "genomic_start": 112472944,
+                                "transcript_end": 1067,
+                                "transcript_start": 971
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112477730,
+                                "genomic_start": 112477651,
+                                "transcript_end": 1147,
+                                "transcript_start": 1068
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112478015,
+                                "genomic_start": 112477857,
+                                "transcript_end": 1306,
+                                "transcript_start": 1148
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112482205,
+                                "genomic_start": 112482074,
+                                "transcript_end": 1438,
+                                "transcript_start": 1307
+                            },
+                            {
+                                "cigar": "167=",
+                                "exon_number": 11,
+                                "genomic_end": 112486629,
+                                "genomic_start": 112486463,
+                                "transcript_end": 1605,
+                                "transcript_start": 1439
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112488510,
+                                "genomic_start": 112488443,
+                                "transcript_end": 1673,
+                                "transcript_start": 1606
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112489175,
+                                "genomic_start": 112489024,
+                                "transcript_end": 1825,
+                                "transcript_start": 1674
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112502256,
+                                "genomic_start": 112502144,
+                                "transcript_end": 1938,
+                                "transcript_start": 1826
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112504796,
+                                "genomic_start": 112504695,
+                                "transcript_end": 2040,
+                                "transcript_start": 1939
+                            },
+                            {
+                                "cigar": "4094=",
+                                "exon_number": 16,
+                                "genomic_end": 112509918,
+                                "genomic_start": 112505825,
+                                "transcript_end": 6134,
+                                "transcript_start": 2041
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112418898,
+                        "total_exons": 16
+                    }
+                },
+                "length": 6151,
+                "reference": "NM_001330437.1",
+                "translation": "NP_001317366.1"
+            },
+            {
+                "annotations": {
+                    "chromosome": "12",
+                    "db_xref": {
+                        "CCDS": "CCDS58280.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:9644",
+                        "ncbigene": "5781",
+                        "select": false
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": false,
+                    "map": "12q24.13",
+                    "note": "protein tyrosine phosphatase non-receptor type 11",
+                    "refseq_select": false,
+                    "variant": "2"
+                },
+                "coding_end": 1597,
+                "coding_start": 215,
+                "description": "Homo sapiens protein tyrosine phosphatase non-receptor type 11 (PTPN11), transcript variant 2, mRNA",
+                "genomic_spans": {
+                    "NC_000012.11": {
+                        "end_position": 112924727,
+                        "exon_structure": [
+                            {
+                                "cigar": "228=",
+                                "exon_number": 1,
+                                "genomic_end": 112856929,
+                                "genomic_start": 112856702,
+                                "transcript_end": 228,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112884202,
+                                "genomic_start": 112884080,
+                                "transcript_end": 351,
+                                "transcript_start": 229
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112888316,
+                                "genomic_start": 112888122,
+                                "transcript_end": 546,
+                                "transcript_start": 352
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112891191,
+                                "genomic_start": 112890999,
+                                "transcript_end": 739,
+                                "transcript_start": 547
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112892484,
+                                "genomic_start": 112892368,
+                                "transcript_end": 856,
+                                "transcript_start": 740
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112893867,
+                                "genomic_start": 112893754,
+                                "transcript_end": 970,
+                                "transcript_start": 857
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112910844,
+                                "genomic_start": 112910748,
+                                "transcript_end": 1067,
+                                "transcript_start": 971
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112915534,
+                                "genomic_start": 112915455,
+                                "transcript_end": 1147,
+                                "transcript_start": 1068
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112915819,
+                                "genomic_start": 112915661,
+                                "transcript_end": 1306,
+                                "transcript_start": 1148
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112920009,
+                                "genomic_start": 112919878,
+                                "transcript_end": 1438,
+                                "transcript_start": 1307
+                            },
+                            {
+                                "cigar": "449=",
+                                "exon_number": 11,
+                                "genomic_end": 112924727,
+                                "genomic_start": 112924279,
+                                "transcript_end": 1887,
+                                "transcript_start": 1439
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112856702,
+                        "total_exons": 11
+                    },
+                    "NC_000012.12": {
+                        "end_position": 112486923,
+                        "exon_structure": [
+                            {
+                                "cigar": "228=",
+                                "exon_number": 1,
+                                "genomic_end": 112419125,
+                                "genomic_start": 112418898,
+                                "transcript_end": 228,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112446398,
+                                "genomic_start": 112446276,
+                                "transcript_end": 351,
+                                "transcript_start": 229
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112450512,
+                                "genomic_start": 112450318,
+                                "transcript_end": 546,
+                                "transcript_start": 352
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112453387,
+                                "genomic_start": 112453195,
+                                "transcript_end": 739,
+                                "transcript_start": 547
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112454680,
+                                "genomic_start": 112454564,
+                                "transcript_end": 856,
+                                "transcript_start": 740
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112456063,
+                                "genomic_start": 112455950,
+                                "transcript_end": 970,
+                                "transcript_start": 857
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112473040,
+                                "genomic_start": 112472944,
+                                "transcript_end": 1067,
+                                "transcript_start": 971
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112477730,
+                                "genomic_start": 112477651,
+                                "transcript_end": 1147,
+                                "transcript_start": 1068
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112478015,
+                                "genomic_start": 112477857,
+                                "transcript_end": 1306,
+                                "transcript_start": 1148
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112482205,
+                                "genomic_start": 112482074,
+                                "transcript_end": 1438,
+                                "transcript_start": 1307
+                            },
+                            {
+                                "cigar": "449=",
+                                "exon_number": 11,
+                                "genomic_end": 112486923,
+                                "genomic_start": 112486475,
+                                "transcript_end": 1887,
+                                "transcript_start": 1439
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112418898,
+                        "total_exons": 11
+                    }
+                },
+                "length": 1903,
+                "reference": "NM_080601.2",
+                "translation": "NP_542168.1"
+            },
+            {
+                "annotations": {
+                    "chromosome": "12",
+                    "db_xref": {
+                        "CCDS": "CCDS58280.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:9644",
+                        "ncbigene": "5781",
+                        "select": false
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": false,
+                    "map": "12q24.13",
+                    "note": "protein tyrosine phosphatase non-receptor type 11",
+                    "refseq_select": false,
+                    "variant": "2"
+                },
+                "coding_end": 1763,
+                "coding_start": 381,
+                "description": "Homo sapiens protein tyrosine phosphatase, non-receptor type 11 (PTPN11), transcript variant 2, mRNA",
+                "genomic_spans": {
+                    "NC_000012.11": {
+                        "end_position": 112924727,
+                        "exon_structure": [
+                            {
+                                "cigar": "394=",
+                                "exon_number": 1,
+                                "genomic_end": 112856929,
+                                "genomic_start": 112856536,
+                                "transcript_end": 394,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112884202,
+                                "genomic_start": 112884080,
+                                "transcript_end": 517,
+                                "transcript_start": 395
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112888316,
+                                "genomic_start": 112888122,
+                                "transcript_end": 712,
+                                "transcript_start": 518
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112891191,
+                                "genomic_start": 112890999,
+                                "transcript_end": 905,
+                                "transcript_start": 713
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112892484,
+                                "genomic_start": 112892368,
+                                "transcript_end": 1022,
+                                "transcript_start": 906
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112893867,
+                                "genomic_start": 112893754,
+                                "transcript_end": 1136,
+                                "transcript_start": 1023
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112910844,
+                                "genomic_start": 112910748,
+                                "transcript_end": 1233,
+                                "transcript_start": 1137
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112915534,
+                                "genomic_start": 112915455,
+                                "transcript_end": 1313,
+                                "transcript_start": 1234
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112915819,
+                                "genomic_start": 112915661,
+                                "transcript_end": 1472,
+                                "transcript_start": 1314
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112920009,
+                                "genomic_start": 112919878,
+                                "transcript_end": 1604,
+                                "transcript_start": 1473
+                            },
+                            {
+                                "cigar": "449=",
+                                "exon_number": 11,
+                                "genomic_end": 112924727,
+                                "genomic_start": 112924279,
+                                "transcript_end": 2053,
+                                "transcript_start": 1605
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112856536,
+                        "total_exons": 11
+                    },
+                    "NC_000012.12": {
+                        "end_position": 112486923,
+                        "exon_structure": [
+                            {
+                                "cigar": "394=",
+                                "exon_number": 1,
+                                "genomic_end": 112419125,
+                                "genomic_start": 112418732,
+                                "transcript_end": 394,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112446398,
+                                "genomic_start": 112446276,
+                                "transcript_end": 517,
+                                "transcript_start": 395
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112450512,
+                                "genomic_start": 112450318,
+                                "transcript_end": 712,
+                                "transcript_start": 518
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112453387,
+                                "genomic_start": 112453195,
+                                "transcript_end": 905,
+                                "transcript_start": 713
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112454680,
+                                "genomic_start": 112454564,
+                                "transcript_end": 1022,
+                                "transcript_start": 906
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112456063,
+                                "genomic_start": 112455950,
+                                "transcript_end": 1136,
+                                "transcript_start": 1023
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112473040,
+                                "genomic_start": 112472944,
+                                "transcript_end": 1233,
+                                "transcript_start": 1137
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112477730,
+                                "genomic_start": 112477651,
+                                "transcript_end": 1313,
+                                "transcript_start": 1234
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112478015,
+                                "genomic_start": 112477857,
+                                "transcript_end": 1472,
+                                "transcript_start": 1314
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112482205,
+                                "genomic_start": 112482074,
+                                "transcript_end": 1604,
+                                "transcript_start": 1473
+                            },
+                            {
+                                "cigar": "449=",
+                                "exon_number": 11,
+                                "genomic_end": 112486923,
+                                "genomic_start": 112486475,
+                                "transcript_end": 2053,
+                                "transcript_start": 1605
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112418732,
+                        "total_exons": 11
+                    }
+                },
+                "length": 2069,
+                "reference": "NM_080601.1",
+                "translation": "NP_542168.1"
+            },
+            {
+                "annotations": {
+                    "chromosome": "12",
+                    "db_xref": {
+                        "CCDS": "CCDS9163.1",
+                        "ensemblgene": null,
+                        "hgnc": "HGNC:9644",
+                        "ncbigene": "5781",
+                        "select": "RefSeq"
+                    },
+                    "ensembl_select": false,
+                    "mane_plus_clinical": false,
+                    "mane_select": false,
+                    "map": "12q24.13",
+                    "note": "protein tyrosine phosphatase non-receptor type 11",
+                    "refseq_select": true,
+                    "variant": "1"
+                },
+                "coding_end": 1996,
+                "coding_start": 215,
+                "description": "Homo sapiens protein tyrosine phosphatase non-receptor type 11 (PTPN11), transcript variant 1, mRNA",
+                "genomic_spans": {
+                    "NC_000012.11": {
+                        "end_position": 112947722,
+                        "exon_structure": [
+                            {
+                                "cigar": "228=",
+                                "exon_number": 1,
+                                "genomic_end": 112856929,
+                                "genomic_start": 112856702,
+                                "transcript_end": 228,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112884202,
+                                "genomic_start": 112884080,
+                                "transcript_end": 351,
+                                "transcript_start": 229
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112888316,
+                                "genomic_start": 112888122,
+                                "transcript_end": 546,
+                                "transcript_start": 352
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112891191,
+                                "genomic_start": 112890999,
+                                "transcript_end": 739,
+                                "transcript_start": 547
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112892484,
+                                "genomic_start": 112892368,
+                                "transcript_end": 856,
+                                "transcript_start": 740
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112893867,
+                                "genomic_start": 112893754,
+                                "transcript_end": 970,
+                                "transcript_start": 857
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112910844,
+                                "genomic_start": 112910748,
+                                "transcript_end": 1067,
+                                "transcript_start": 971
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112915534,
+                                "genomic_start": 112915455,
+                                "transcript_end": 1147,
+                                "transcript_start": 1068
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112915819,
+                                "genomic_start": 112915661,
+                                "transcript_end": 1306,
+                                "transcript_start": 1148
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112920009,
+                                "genomic_start": 112919878,
+                                "transcript_end": 1438,
+                                "transcript_start": 1307
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 112924433,
+                                "genomic_start": 112924279,
+                                "transcript_end": 1593,
+                                "transcript_start": 1439
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112926314,
+                                "genomic_start": 112926247,
+                                "transcript_end": 1661,
+                                "transcript_start": 1594
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112926979,
+                                "genomic_start": 112926828,
+                                "transcript_end": 1813,
+                                "transcript_start": 1662
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112940060,
+                                "genomic_start": 112939948,
+                                "transcript_end": 1926,
+                                "transcript_start": 1814
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112942600,
+                                "genomic_start": 112942499,
+                                "transcript_end": 2028,
+                                "transcript_start": 1927
+                            },
+                            {
+                                "cigar": "4094=",
+                                "exon_number": 16,
+                                "genomic_end": 112947722,
+                                "genomic_start": 112943629,
+                                "transcript_end": 6122,
+                                "transcript_start": 2029
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112856702,
+                        "total_exons": 16
+                    },
+                    "NC_000012.12": {
+                        "end_position": 112509918,
+                        "exon_structure": [
+                            {
+                                "cigar": "228=",
+                                "exon_number": 1,
+                                "genomic_end": 112419125,
+                                "genomic_start": 112418898,
+                                "transcript_end": 228,
+                                "transcript_start": 1
+                            },
+                            {
+                                "cigar": "123=",
+                                "exon_number": 2,
+                                "genomic_end": 112446398,
+                                "genomic_start": 112446276,
+                                "transcript_end": 351,
+                                "transcript_start": 229
+                            },
+                            {
+                                "cigar": "195=",
+                                "exon_number": 3,
+                                "genomic_end": 112450512,
+                                "genomic_start": 112450318,
+                                "transcript_end": 546,
+                                "transcript_start": 352
+                            },
+                            {
+                                "cigar": "193=",
+                                "exon_number": 4,
+                                "genomic_end": 112453387,
+                                "genomic_start": 112453195,
+                                "transcript_end": 739,
+                                "transcript_start": 547
+                            },
+                            {
+                                "cigar": "117=",
+                                "exon_number": 5,
+                                "genomic_end": 112454680,
+                                "genomic_start": 112454564,
+                                "transcript_end": 856,
+                                "transcript_start": 740
+                            },
+                            {
+                                "cigar": "114=",
+                                "exon_number": 6,
+                                "genomic_end": 112456063,
+                                "genomic_start": 112455950,
+                                "transcript_end": 970,
+                                "transcript_start": 857
+                            },
+                            {
+                                "cigar": "97=",
+                                "exon_number": 7,
+                                "genomic_end": 112473040,
+                                "genomic_start": 112472944,
+                                "transcript_end": 1067,
+                                "transcript_start": 971
+                            },
+                            {
+                                "cigar": "80=",
+                                "exon_number": 8,
+                                "genomic_end": 112477730,
+                                "genomic_start": 112477651,
+                                "transcript_end": 1147,
+                                "transcript_start": 1068
+                            },
+                            {
+                                "cigar": "159=",
+                                "exon_number": 9,
+                                "genomic_end": 112478015,
+                                "genomic_start": 112477857,
+                                "transcript_end": 1306,
+                                "transcript_start": 1148
+                            },
+                            {
+                                "cigar": "132=",
+                                "exon_number": 10,
+                                "genomic_end": 112482205,
+                                "genomic_start": 112482074,
+                                "transcript_end": 1438,
+                                "transcript_start": 1307
+                            },
+                            {
+                                "cigar": "155=",
+                                "exon_number": 11,
+                                "genomic_end": 112486629,
+                                "genomic_start": 112486475,
+                                "transcript_end": 1593,
+                                "transcript_start": 1439
+                            },
+                            {
+                                "cigar": "68=",
+                                "exon_number": 12,
+                                "genomic_end": 112488510,
+                                "genomic_start": 112488443,
+                                "transcript_end": 1661,
+                                "transcript_start": 1594
+                            },
+                            {
+                                "cigar": "152=",
+                                "exon_number": 13,
+                                "genomic_end": 112489175,
+                                "genomic_start": 112489024,
+                                "transcript_end": 1813,
+                                "transcript_start": 1662
+                            },
+                            {
+                                "cigar": "113=",
+                                "exon_number": 14,
+                                "genomic_end": 112502256,
+                                "genomic_start": 112502144,
+                                "transcript_end": 1926,
+                                "transcript_start": 1814
+                            },
+                            {
+                                "cigar": "102=",
+                                "exon_number": 15,
+                                "genomic_end": 112504796,
+                                "genomic_start": 112504695,
+                                "transcript_end": 2028,
+                                "transcript_start": 1927
+                            },
+                            {
+                                "cigar": "4094=",
+                                "exon_number": 16,
+                                "genomic_end": 112509918,
+                                "genomic_start": 112505825,
+                                "transcript_end": 6122,
+                                "transcript_start": 2029
+                            }
+                        ],
+                        "orientation": 1,
+                        "start_position": 112418898,
+                        "total_exons": 16
+                    }
+                },
+                "length": 6139,
+                "reference": "NM_002834.4",
+                "translation": "NP_002825.3"
+            }
+        ]
+    }
+]
diff --git a/tests/genome_data.py b/tests/genome_data.py
deleted file mode 100644
index 0955c2f4..00000000
--- a/tests/genome_data.py
+++ /dev/null
@@ -1,90 +0,0 @@
-import typing
-
-import pytest
-
-from genophenocorr.model import TranscriptCoordinates, ProteinMetadata, Variant, VariantCoordinates, TranscriptAnnotation, Genotypes, VariantEffect
-from genophenocorr.model.genome import Contig, GenomicRegion, Strand
-
-
-@pytest.fixture
-def toy_contig() -> Contig:
-    return Contig('1', 'GB_ACC', 'REFSEQ_ACC', 'USCD_ACC', 2_000)
-
-
-@pytest.fixture
-def toy_tx_positive(toy_contig: Contig) -> TranscriptCoordinates:
-    return TranscriptCoordinates('fake-tx-pos',
-                                 GenomicRegion(toy_contig, 200, 800, Strand.POSITIVE),
-                                 (
-                                     GenomicRegion(toy_contig, 200, 250, Strand.POSITIVE),
-                                     GenomicRegion(toy_contig, 300, 340, Strand.POSITIVE),
-                                     GenomicRegion(toy_contig, 510, 540, Strand.POSITIVE),
-                                     GenomicRegion(toy_contig, 650, 800, Strand.POSITIVE)
-                                 ),
-                                 310, 740)
-
-
-@pytest.fixture
-def toy_protein_positive() -> ProteinMetadata:
-    return ProteinMetadata('fake-prot-pos', 'FAKE PROTEIN ON POSITIVE STRAND', ())
-
-
-@pytest.fixture
-def toy_tx_negative(toy_contig: Contig) -> TranscriptCoordinates:
-    return TranscriptCoordinates('fake-tx-neg',
-                                 GenomicRegion(toy_contig, 100, 600, Strand.NEGATIVE),
-                                 (
-                                     GenomicRegion(toy_contig, 100, 180, Strand.NEGATIVE),
-                                     GenomicRegion(toy_contig, 210, 270, Strand.NEGATIVE),
-                                     GenomicRegion(toy_contig, 400, 450, Strand.NEGATIVE),
-                                     GenomicRegion(toy_contig, 550, 600, Strand.NEGATIVE)
-                                 ),
-                                 130, 430)
-
-
-@pytest.fixture
-def toy_protein_negative() -> ProteinMetadata:
-    return ProteinMetadata('fake-prot-neg', 'FAKE PROTEIN ON NEGATIVE STRAND', ())
-
-
-@pytest.fixture
-def toy_variants(toy_contig: Contig) -> typing.Sequence[Variant]:
-    return (
-        Variant(
-            VariantCoordinates(GenomicRegion(toy_contig, 325, 326, Strand.POSITIVE),'C', 'T', 0),
-            (
-                    TranscriptAnnotation('some-gene', 'fake-tx-pos', 'fake-tx-pos-hgvsc:v1',
-                                         True, (VariantEffect.MISSENSE_VARIANT,),
-                                         (2,),
-                                         (), None),
-                ), Genotypes.empty()
-                ),
-        Variant(VariantCoordinates(GenomicRegion(toy_contig, 530, 531, Strand.POSITIVE),
-                                   'C', 'CCT', 2),
-                (
-                    TranscriptAnnotation('some-gene', 'fake-tx-pos', 'fake-tx-pos-hgvsc:v2',
-                                         True, (VariantEffect.FRAMESHIFT_VARIANT,),
-                                         (3,),
-                                         (), None),
-                ), Genotypes.empty()
-                ),
-        Variant(VariantCoordinates(GenomicRegion(toy_contig, 160, 161, Strand.NEGATIVE).with_strand(Strand.POSITIVE),
-                                   'G', 'A', 0),
-                (
-                    TranscriptAnnotation('other-gene', 'fake-tx-neg', 'fake-tx-neg-hgvsc:v3',
-                                         True, (VariantEffect.SYNONYMOUS_VARIANT,),
-                                         (1,),
-                                         (), None),
-                ), Genotypes.empty()
-                ),
-        Variant(VariantCoordinates(GenomicRegion(toy_contig, 570, 574, Strand.NEGATIVE).with_strand(Strand.POSITIVE),
-                                   'CTGA', 'C', -3),
-                (
-                    TranscriptAnnotation('other-gene', 'fake-tx-neg', 'fake-tx-neg-hgvsc:v4',
-                                         True, (VariantEffect.THREE_PRIME_UTR_VARIANT,),
-                                         (4,),
-                                         (), None),
-                ), Genotypes.empty()
-                )
-
-    )
diff --git a/tests/test_view.py b/tests/test_view.py
deleted file mode 100644
index 86f4b092..00000000
--- a/tests/test_view.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from genophenocorr.view import VariantTranscriptProteinArtist
-
-
-from .genome_data import *
-
-
-def test_draw_variants_on_transcript_pos(toy_variants: typing.Sequence[Variant],
-                                         toy_tx_positive: TranscriptCoordinates,
-                                         toy_protein_positive: ProteinMetadata):
-    artist = VariantTranscriptProteinArtist()
-    output = artist.draw_variants(toy_variants, toy_tx_positive, toy_protein_positive)
-    print(output)
-
-
-def test_draw_variants_on_transcript_neg(toy_variants: typing.Sequence[Variant],
-                                         toy_tx_negative: TranscriptCoordinates,
-                                         toy_protein_negative: ProteinMetadata):
-    artist = VariantTranscriptProteinArtist()
-    output = artist.draw_variants(toy_variants, toy_tx_negative, toy_protein_negative)
-    print(output)