Basic Search¶
The CDA provides a custom python tool for searching CDA data. Q
(short for Query) offers several ways to search and filter data, and several input modes:
- Q.() builds a query that can be used by
run()
orcount()
- Q.run() returns data for the specified search
- Q.count() returns summary information (counts) data that fit the specified search
- columns() returns entity field names
- unique_terms() returns entity field contents
Before we do any work, we need to import these functions from cdapython. We're also importing functions from several other packages to make viewing and manipulating tables easier. The opt.
settings are pre-configuring how itables should display our tables, with scrolling and paging enabled.
Finally, we're telling cdapython to report it's version so we can be sure we're using the one we mean to:
from cdapython import Q, columns, unique_terms, query
import numpy as np
import pandas as pd
from itables import init_notebook_mode, show
init_notebook_mode(all_interactive=True)
import itables.options as opt
opt.maxBytes=0
opt.scrollX="200px"
opt.scrollCollapse=True
opt.paging=True
opt.maxColumns=0
print(Q.get_version())
2022.12.21
- The Proteomic Data Commons (PDC)
- The Genomic Data Commons (GDC)
- The Imaging Data Commons (IDC)
- subject: A patient entity captures the study-independent metadata for research subjects. Human research subjects are usually not traceable to a particular person to protect the subjects privacy.
- researchsubject: A research subject is the entity of interest in a specific research study or project, typically a human being or an animal, but can also be a device, group of humans or animals, or a tissue sample. Human research subjects are usually not traceable to a particular person to protect the subjects privacy. This entity plays the role of the case_id in existing data. A subject who participates in 3 studies will have 3 researchsubject IDs.
- specimen: Any material taken as a sample from a biological entity (living or dead), or from a physical object or the environment. Specimens are usually collected as an example of their kind, often for use in some investigation.
- mutation: Molecular data about specific mutations, currently limited to the TCGA-READ project from GDC.
- file: A unit of data about subjects, researchsubjects, specimens, or their associated information.
- diagnosis: A collection of characteristics that describe an abnormal condition of the body as assessed at a point in time. May be used to capture information about neoplastic and non-neoplastic conditions.
- treatment: Represent medication administration or other treatment types.
If you are looking to build a cohort of distinct individuals who meet some criteria, search by subject
. If you want to build a cohort, but are particularly interested in studies rather than the participates per se, search by researchsubject
. If you are looking for biosamples that can be ordered or a specific format of information (for e.g. histological slides) start with specimen
. If you are primarily looking for files you can reuse for your own analysis, add .file
to your call.
In the subject, researchsubject, or specimen tables, all of the rows will have one or more files associated with them that can be directly found by chaining, as in specimen.files
. Diagnosis and treatment do not have files directly associated with them, so a query statemet of diagnosis.files
or treatment.file
will not work. The mutation table does have files associated with it, but currently they cannot be accessed with mutation.file
. Look for this feature in a later release.
Any metadata field can be searched from any endpoint, the only difference between search types is what type of data is returned by default. This means that you can think of the CDA as a really, really enormous spreadsheet full of data. To search this enormous spreadsheet, you'd want select columns, and then filter rows.
Basic search with endpoints¶
Let's try a broad search of the CDA to see what information exists about cancers that were first diagnosed in the brain. To run this simple search, we would first construct a query in Q
where the syntax is Q('<name_of_column> = "<unique_term>"'
and save it to a variable myquery
:
myquery = Q('primary_diagnosis_site = "brain"')
Where did those terms come from?
If you aren't sure how we knew what terms to put in our search, please refer back to the What search terms are available? notebook.subject¶
Now we can use that query to search any of information types. Let's start by looking at what subjects meet our criteria. To do that, we will send our query to the subject endpoint, then ask for it to run:
subjectresults = myquery.subject.run()
Getting results from database
Total execution time: 0 min 3.558 sec 3558 ms
We saved the output in a variable subjectresults
, so we don't get much visible output. To see what our results are, we need to look into the variable. The simplest way is to call subjectresults
directly:
subjectresults
Offset: 0 Count: 100 Total Row Count: 3015 More pages: True
This tells us four parameters that describe our results:
- Offset: This is how many rows of information we've told the query to skip in the data, here we didn't tell it to skip anything, so the offset is zero
- Count: This is how many rows the current page of our results table has. To keep searches fast, we default to pages with 100 rows.
- Total Row Count: This is how many rows are in the full results table
- More pages: This is always a True or False. False means that our current page has all the available results. True means that we will see only the first 100 results in this table, and will need to page through for more.
In any results variable, you can also use print()
to display a 'pretty print' version of the results. This color codes the display in a way that can make it easier to find the information you care about:
print(subjectresults)
Offset: 0 Count: 100 Total Row Count: 3015 More pages: True
We have 2384 subject matches, let's look at the actual table. The easiest way to do this is by using the python function .to_dataframe()
on our subjectresults
variable:
subjectresults.to_dataframe()
subject_id | subject_identifier | species | sex | race | ethnicity | days_to_birth | subject_associated_project | vital_status | days_to_death | cause_of_death |
---|---|---|---|---|---|---|---|---|---|---|
Loading... (need help?) |
By default to_dataframe()
shows us the first and last five rows for the first page of our results, so we can easily preview our data.
Since we queried the Subject endpoint, our default results tell us Subject level information, that is, information about unique individuals: their sex, race, age, species, etc. The id
column tells us the unique identifier for each individual. The identifier column has nested information about what study or studies a Subject participated in, and will list all of their researchsubject identifiers.
The to_dataframe()
function converts the results to a pandas dataframe. So if we save the dataframe to a variable, we can use any pandas dataframe functions to explore it. For example, lets see whether any of the Subjects in our first 100 results are black or african american. First we'll save the results to a dataframe, then subset that dataframe to only show rows where the word "black" appears in the "race" column. "NAs" which are shown as "None" in these tables, so for our filter to work, we'll need to specifically tell it to ignore NAs:
subjectdata = subjectresults.to_dataframe()
subjectdata[subjectdata['race'].str.contains("black", na=False)]
subject_id | subject_identifier | species | sex | race | ethnicity | days_to_birth | subject_associated_project | vital_status | days_to_death | cause_of_death | |
---|---|---|---|---|---|---|---|---|---|---|---|
Loading... (need help?) |
There are subjects in our first hundred results that meet the criteria. If we just want to be sure that the data contains some value, this might be good enough. But often we want to search the entire set of results and not just the first page.
We'll cover how to work with large results dataframes in the Pagination notebook. Or, learn how to get summary information from search results in the Data Summaries notebook.
Subject Field Definitions
A patient entity captures the study-independent metadata for research subjects. Human research subjects are usually not traceable to a particular person to protect the subjects privacy.- id: The 'logical' identifier of the entity in the system of record, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system."
- identifier: A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.
- identifier.system: The system or namespace that defines the identifier.
- identifier.value: The value of the identifier, as defined by the system.
- species: The taxonomic group (e.g. species) of the subject.
- sex: The biologic character or quality that distinguishes male and female from one another as expressed by analysis of the person's gonadal, morphologic (internal and external), chromosomal, and hormonal characteristics.
- race: An arbitrary classification of a taxonomic group that is a division of a species. It usually arises as a consequence of geographical isolation within a species and is characterized by shared heredity, physical attributes and behavior, and in the case of humans, by common history, nationality, or geographic distribution. The provided values are based on the categories defined by the U.S. Office of Management and Business and used by the U.S. Census Bureau.
- ethnicity: An individual's self-described social and cultural grouping, specifically whether an individual describes themselves as Hispanic or Latino. The provided values are based on the categories defined by the U.S. Office of Management and Business and used by the U.S. Census Bureau.
- days_to_birth: Number of days between the date used for index and the date from a person's date of birth represented as a calculated negative number of days.
- subject_associated_project: The list of Projects associated with the Subject.
- vital_status: Coded value indicating the state or condition of being living or deceased; also includes the case where the vital status is unknown.
- days_to_death: Number of days between the date used for index and the date from a person's date of death represented as a calculated number of days.
- cause_of_death: Coded value indicating the circumstance or condition that results in the death of the subject.
researchsubject¶
If we're interested in what researchsubjects meet our criteria, we can run our query against the researchsubject endpoint:
researchsubjectresults = myquery.researchsubject.run()
print(researchsubjectresults)
Getting results from database
Total execution time: 0 min 3.365 sec 3365 ms
Offset: 0 Count: 100 Total Row Count: 4347 More pages: True
Now we see that our 2384 subjects have 3716 researchsubjects between them, that means that some, but not all, of our subjects were participants in more than one study. Let's peek at the data:
researchsubjectresults.to_dataframe()
researchsubject_id | researchsubject_identifier | member_of_research_project | primary_diagnosis_condition | primary_diagnosis_site | subject_id |
---|---|---|---|---|---|
Loading... (need help?) |
Each row from the researchsubject endpoint results tells us about a subject in a given study. Using this endpoint we can find out information like what studies fit our search criteria, and also get data that we can filter to have only subjects from multiple studies, or only subjects from single studies.
Any given subject will have one row per study they participated in. The subject_id in the last column of this view is the same as the id
in the first column of the Subjects endpoint results. You can use this to combine information across endpoints, which is covered near the end of the Cohort Building workflow notebook.
ResearchSubject Field Definitions
A research subject is the entity of interest in a specific research study or project, typically a human being or an animal, but can also be a device, group of humans or animals, or a tissue sample. Human research subjects are usually not traceable to a particular person to protect the subjects privacy. This entity plays the role of the case_id in existing data. A subject who participates in 3 studies will have 3 researchsubject IDs- id: The 'logical' identifier of the entity in the system of record, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system. For CDA, this is case_id.
- identifier: A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.
- identifier.system: The system or namespace that defines the identifier.
- identifier.value: The value of the identifier, as defined by the system.
- member_of_research_project: A reference to the Project(s) of which this ResearchSubject is a member.
- primary_diagnosis_condition: The text term used to describe the type of malignant disease, as categorized by the World Health Organization's (WHO) International Classification of Diseases for Oncology (ICD-O). This attribute represents the disease that qualified the subject for inclusion on the ResearchProject.
- primary_diagnosis_site: The text term used to describe the primary site of disease, as categorized by the World Health Organization's (WHO) International Classification of Diseases for Oncology (ICD-O). This categorization groups cases into general categories. This attribute represents the primary site of disease that qualified the subject for inclusion on the ResearchProject.
- subject_id: The 'logical' identifier of the entity in the system of record, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system. Can be joined to the `id` field from subject results
diagnosis¶
The diagnosis endpoint is an extension of the researchsubject endpoint, and returns information about researchsubjects that have a diagnosis that meets our search criteria:
diagnosisresults = myquery.diagnosis.run()
diagnosisresults.to_dataframe()
Getting results from database
Total execution time: 0 min 3.307 sec 3307 ms
diagnosis_id | diagnosis_identifier | primary_diagnosis | age_at_diagnosis | morphology | stage | grade | method_of_diagnosis | subject_id | researchsubject_id |
---|---|---|---|---|---|---|---|---|---|
Loading... (need help?) |
Diagnosis Field Definitions
A collection of characteristics that describe an abnormal condition of the body as assessed at a point in time. May be used to capture information about neoplastic and non-neoplastic conditions.- id: The 'logical' identifier of the entity in the repository, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system.
- identifier: A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.
- identifier.system: The system or namespace that defines the identifier.
- identifier.value: The value of the identifier, as defined by the system.
- primary_diagnosis: The diagnosis instance that qualified a subject for inclusion on a ResearchProject.
- age_at_diagnosis: The age in days of the individual at the time of diagnosis.
- morphology: Code that represents the histology of the disease using the third edition of the International Classification of Diseases for Oncology, published in 2000, used principally in tumor and cancer registries for coding the site (topography) and the histology (morphology) of neoplasms.
- stage: The extent of a cancer in the body. Staging is usually based on the size of the tumor, whether lymph nodes contain cancer, and whether the cancer has spread from the original site to other parts of the body. Different diseases may use different staging criteria, please refer to the originating data source to see what staging system is reported
- grade: The degree of abnormality of cancer cells, a measure of differentiation, the extent to which cancer cells are similar in appearance and function to healthy cells of the same tissue type. The degree of differentiation often relates to the clinical behavior of the particular tumor. Based on the microscopic findings, tumor grade is commonly described by one of four degrees of severity. Histopathologic grade of a tumor may be used to plan treatment and estimate the future course, outcome, and overall prognosis of disease. Certain types of cancers, such as soft tissue sarcoma, primary brain tumors, lymphomas, and breast have special grading systems.
- method_of_diagnosis: The method used to confirm the patients malignant diagnosis.
- subject_id: An identifier for the subject. Can be joined to the `id` field from subject results
- researchsubject_id: An identifier for the researchsubject. Can be joined to the `id` field from researchsubject results
treatment¶
The treatment endpoint is an extension of diagnosis and returns information about treatments undertaken on researchsubjects that have a given diagnosis that meets our search criteria:
treatmentresults = myquery.treatment.run()
treatmentresults.to_dataframe()
Getting results from database
Total execution time: 0 min 3.353 sec 3353 ms
treatment_id | treatment_identifier | treatment_type | treatment_outcome | days_to_treatment_start | days_to_treatment_end | therapeutic_agent | treatment_anatomic_site | treatment_effect | treatment_end_reason | number_of_cycles | subject_id | researchsubject_id | diagnosis_id |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Loading... (need help?) |
Treatment Field Definitions
Medication administration or other treatment types. A single research subject may have multiple treatments for a single diagnosis, and/or different diagnoses, and different treatments, across different studies- id: The 'logical' identifier of the entity in the repository, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system.
- identifier: A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.
- identifier.system: The system or namespace that defines the identifier.
- identifier.value: The value of the identifier, as defined by the system.
- treatment_type: The treatment type including medication/therapeutics or other procedures.
- treatment_outcome: The final outcome of the treatment.
- days_to_treatment_start: The timepoint at which the treatment started.
- days_to_treatment_end:The timepoint at which the treatment ended.
- therapeutic_agent: One or more therapeutic agents as part of this treatment.
- treatment_anatomic_site: The anatomical site that the treatment targets.
- treatment_effect:The effect of a treatment on the diagnosis or tumor.
- treatment_end_reason:The reason the treatment ended.
- number_of_cycles:The number of treatment cycles the subject received.
- subject_id: An identifier for the subject. Can be joined to the `id` field from subject results
- researchsubject_id: An identifier for the researchsubject. Can be joined to the `id` field from researchsubject results
- researchsubject_diagnosis_id: An identifier for the diagnosis. Can be joined to the `id` field from diagnosis results
specimen¶
We can use this same query to see what specimens are available for brain tissue at the CDA:
specimenresults = myquery.specimen.run()
specimenresults
Getting results from database
Total execution time: 0 min 3.323 sec 3323 ms
Offset: 0 Count: 100 Total Row Count: 39220 More pages: True
Nearly 40,000 specimens meet our search criteria! We would typically expect this number to be much larger than our number of subjects or researchsubjects. First because studies will often take more than one sample per subject, and second because any given specimen might be aliquoted out to be used in multiple tests. Since we didn't specify any further filters, our results will return all of these as separate speciments. Let's look at a few:
specimenresults.to_dataframe()
specimen_id | specimen_identifier | specimen_associated_project | days_to_collection | primary_disease_type | anatomical_site | source_material_type | specimen_type | derived_from_specimen | derived_from_subject | subject_id | researchsubject_id |
---|---|---|---|---|---|---|---|---|---|---|---|
Loading... (need help?) |
Specimen Field Definitions
Any material taken as a sample from a biological entity (living or dead), or from a physical object or the environment. Specimens are usually collected as an example of their kind, often for use in some investigation. A given specimen will have only a single subject ID and a single researchsubject ID- id: The 'logical' identifier of the entity in the repository, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system.
- identifier: A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.
- identifier.system: The system or namespace that defines the identifier.
- identifier.value: The value of the identifier, as defined by the system.
- associated_project: The Project associated with the specimen.
- days_to_collection: The number of days from the index date to either the date a sample was collected for a specific study or project, or the date a patient underwent a procedure (e.g. surgical resection) yielding a sample that was eventually used for research.
- primary_disease_type: The text term used to describe the type of malignant disease, as categorized by the World Health Organization's (WHO) International Classification of Diseases for Oncology (ICD-O). This attribute represents the disease that qualified the subject for inclusion on the ResearchProject.
- anatomical_site: Per GDC Dictionary, the text term that represents the name of the primary disease site of the submitted tumor sample; recommend dropping tumor; biospecimen_anatomic_site.
- source_material_type: The general kind of material from which the specimen was derived, indicating the physical nature of the source material.
- specimen_type: The high-level type of the specimen, based on its how it has been derived from the original extracted sample. One of: analyte, aliquot, portion, sample, or slide.
- derived_from_specimen: A source/parent specimen from which this one was directly derived.
- subject_id: An identifier for the subject. Can be joined to the `id` field from subject results
- researchsubject_id: An identifier for the researchsubject. Can be joined to the `id` field from researchsubject results
file¶
The file endpoint returns information about files that meet our search criteria, and that belong to subjects, researchsubjects, or specimens. You can think of three of these endpoints as being nested:
subject.file
is the broadest search. It will give you all files that have the parameters of your query
researchsubject.file
will give you all the files that match your query, and that are attached to specific studies and/or specimens. It will not return subject level files.
specimen.file
will return all the files directly attached to specimen, but not those attached to the researchsubject or subject those specimens came from.
myquery.subject.file.run()
Getting results from database
Total execution time: 0 min 3.508 sec 3508 ms
Offset: 0 Count: 100 Total Row Count: 4969686 More pages: True
myquery.researchsubject.file.run()
Getting results from database
Total execution time: 0 min 3.489 sec 3489 ms
Offset: 0 Count: 100 Total Row Count: 4969666 More pages: True
myquery.specimen.file.run()
Getting results from database
Total execution time: 0 min 3.522 sec 3522 ms
Offset: 0 Count: 100 Total Row Count: 771260 More pages: True
As you might expect, searching file gives us a huge number of results. This is great if you are surveying what kind of data is available, but is less useful for getting a coherent cohort.
A better way to get files for a specific cohort is to build a more complex query using Operators.
Another useful way to look at high level information is to use our counts feature which returns summary information rather than the full search results. Check out the Data Summaries tutorial to try it.
File Field Definitions
A file is an information-bearing electronic object that contains a physical embodiment of some information using a particular character encoding.- id: The 'logical' identifier of the entity in the system of record, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system.
- identifier: A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.
- identifier.system: The system or namespace that defines the identifier.
- identifier.value: The value of the identifier, as defined by the system.
- label: Short name or abbreviation for dataset. Maps to rdfs:label.
- data_catagory: Broad categorization of the contents of the data file.
- data_type: Specific content type of the data file.
- file_format: Format of the data files.
- associated_project: A reference to the Project(s) of which this ResearchSubject is a member. The associated_project may be embedded using the ref definition or may be a reference to the id for the Project - or a URI expressed as a string to an existing entity.
- drs_uri: A string of characters used to identify a resource on the Data Repo Service(DRS). Can be used to retrieve this specific file from a server.
- byte_size: Size of the file in bytes. Maps to dcat:byteSize.
- checksum: The md5 value for the file. A digit representing the sum of the correct digits in a piece of stored or transmitted digital data, against which later comparisons can be made to detect errors in the data.
- data_modality: Data modality describes the biological nature of the information gathered as the result of an activity, independent of the technology or methods used to produce the information. Always one of "Genomic", "Proteomic", or "Imaging".
- imaging_modality: An imaging modality describes the imaging equipment and/or method used to acquire certain structural or functional information about the body. These include but are not limited to computed tomography (CT) and magnetic resonance imaging (MRI). Taken from the DICOM standard.
- dbgap_accession_number: The dbgap accession number for the project.
mutation¶
The file endpoint returns molecular data about specific mutations that meet our search criteria. Search is currently limited to the TCGA-READ project from GDC:
myquery.mutation.run()
Getting results from database
Total execution time: 0 min 3.676 sec 3676 ms
Offset: 0 Count: 100 Total Row Count: 904 More pages: True
mutationresults = myquery.mutation.run()
mutationresults.to_dataframe()
Getting results from database
Total execution time: 0 min 3.489 sec 3489 ms
project_short_name | case_barcode | sample_barcode_tumor | sample_barcode_normal | aliquot_barcode_tumor | aliquot_barcode_normal | Hugo_Symbol | Entrez_Gene_Id | Center | NCBI_Build | Chromosome | Start_Position | End_Position | Strand | Variant_Classification | Variant_Type | Reference_Allele | Tumor_Seq_Allele1 | Tumor_Seq_Allele2 | dbSNP_RS | dbSNP_Val_Status | Tumor_Validation_Allele1 | Tumor_Validation_Allele2 | Mutation_Status | Validation_Method | Sequencer | Tumor_Sample_UUID | Matched_Norm_Sample_UUID | HGVSc | HGVSp | HGVSp_Short | Transcript_ID | Exon_Number | t_depth | t_ref_count | t_alt_count | n_depth | all_effects | Allele | Gene | Feature | Feature_type | One_Consequence | Consequence | cDNA_position | CDS_position | Protein_position | Amino_acids | Codons | Existing_variation | ALLELE_NUM | DISTANCE | TRANSCRIPT_STRAND | SYMBOL | SYMBOL_SOURCE | HGNC_ID | BIOTYPE | CANONICAL | CCDS | ENSP | SWISSPROT | TREMBL | UNIPARC | RefSeq | SIFT | PolyPhen | EXON | INTRON | DOMAINS | GMAF | AFR_MAF | AMR_MAF | EAS_MAF | EUR_MAF | SAS_MAF | AA_MAF | EA_MAF | CLIN_SIG | SOMATIC | PUBMED | IMPACT | PICK | VARIANT_CLASS | TSL | HGVS_OFFSET | PHENO | MINIMISED | ExAC_AF | ExAC_AF_Adj | ExAC_AF_AFR | ExAC_AF_AMR | ExAC_AF_EAS | ExAC_AF_FIN | ExAC_AF_NFE | ExAC_AF_OTH | ExAC_AF_SAS | FILTER | CONTEXT | src_vcf_id | tumor_bam_uuid | normal_bam_uuid | case_id | GDC_FILTER | COSMIC | MC3_Overlap | GDC_Validation_Status | callerName | fileUUID | fileName |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Loading... (need help?) |