1 Calculating error rates.

I wrote the function ‘create_matrices()’ to collect mutation counts. At least in theory the results from it should be able to address most/any question regarding the counts of mutations observed in the data.

1.1 Categorize the data with at least 3 indexes per mutant

## Loading Rerrrt
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:hpgltools':
## 
##     combine
## The following object is masked from 'package:Biobase':
## 
##     combine
## The following objects are masked from 'package:BiocGenerics':
## 
##     combine, intersect, setdiff, union
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Loading required package: tidyr
## Starting sample: s1.
##   Reading the file containing mutations: preprocessing/s1/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 1156535 reads.
##     Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1037310 reads.
##     Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
##   Mutation data: all filters removed 203354 reads, or 17.58%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1742165 indexes in all the data.
##     After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 953181 changed reads.
##     All data: before reads/index pruning, there are: 4681501 identical reads.
##     All data: after index pruning, there are: 491995 changed reads: 51.62%.
##     All data: after index pruning, there are: 3663004 identical reads: 78.24%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3663004 identical reads.
##   Before classification, there are 491995 reads with mutations.
##   After classification, there are 2738199 reads/indexes which are only identical.
##   After classification, there are 11023 reads/indexes which are strictly sequencer.
##   After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s2.
##   Reading the file containing mutations: preprocessing/s2/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 3421203 reads.
##     Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1758479 reads.
##     Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
##   Mutation data: all filters removed 1778234 reads, or 51.98%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1261478 indexes in all the data.
##     After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1642969 changed reads.
##     All data: before reads/index pruning, there are: 5230976 identical reads.
##     All data: after index pruning, there are: 814407 changed reads: 49.57%.
##     All data: after index pruning, there are: 4834092 identical reads: 92.41%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 4834092 identical reads.
##   Before classification, there are 814407 reads with mutations.
##   After classification, there are 2802107 reads/indexes which are only identical.
##   After classification, there are 111708 reads/indexes which are strictly sequencer.
##   After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s3.
##   Reading the file containing mutations: preprocessing/s3/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 4309681 reads.
##     Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1564155 reads.
##     Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
##   Mutation data: all filters removed 2857634 reads, or 66.31%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 884042 indexes in all the data.
##     After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1452047 changed reads.
##     All data: before reads/index pruning, there are: 3583390 identical reads.
##     All data: after index pruning, there are: 730397 changed reads: 50.30%.
##     All data: after index pruning, there are: 3332136 identical reads: 92.99%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3332136 identical reads.
##   Before classification, there are 730397 reads with mutations.
##   After classification, there are 1851177 reads/indexes which are only identical.
##   After classification, there are 90341 reads/indexes which are strictly sequencer.
##   After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various criteria.
## Plotting index densities.
## Error in create_matrices(sample_sheet = sample_sheet, ident_column = ident_column, : object 'pre_indent_index_density_df' not found
## Error in summary(triples): object 'triples' not found
## Starting sample: s1.
##   Reading the file containing mutations: preprocessing/s1/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 1156535 reads.
##     Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1037310 reads.
##     Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
##   Mutation data: all filters removed 203354 reads, or 17.58%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1742165 indexes in all the data.
##     After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 953181 changed reads.
##     All data: before reads/index pruning, there are: 4681501 identical reads.
##     All data: after index pruning, there are: 491995 changed reads: 51.62%.
##     All data: after index pruning, there are: 3663004 identical reads: 78.24%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3663004 identical reads.
##   Before classification, there are 491995 reads with mutations.
##   After classification, there are 2738199 reads/indexes which are only identical.
##   After classification, there are 11023 reads/indexes which are strictly sequencer.
##   After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s2.
##   Reading the file containing mutations: preprocessing/s2/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 3421203 reads.
##     Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1758479 reads.
##     Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
##   Mutation data: all filters removed 1778234 reads, or 51.98%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1261478 indexes in all the data.
##     After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1642969 changed reads.
##     All data: before reads/index pruning, there are: 5230976 identical reads.
##     All data: after index pruning, there are: 814407 changed reads: 49.57%.
##     All data: after index pruning, there are: 4834092 identical reads: 92.41%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 4834092 identical reads.
##   Before classification, there are 814407 reads with mutations.
##   After classification, there are 2802107 reads/indexes which are only identical.
##   After classification, there are 111708 reads/indexes which are strictly sequencer.
##   After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s3.
##   Reading the file containing mutations: preprocessing/s3/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 4309681 reads.
##     Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1564155 reads.
##     Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
##   Mutation data: all filters removed 2857634 reads, or 66.31%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 884042 indexes in all the data.
##     After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1452047 changed reads.
##     All data: before reads/index pruning, there are: 3583390 identical reads.
##     All data: after index pruning, there are: 730397 changed reads: 50.30%.
##     All data: after index pruning, there are: 3332136 identical reads: 92.99%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3332136 identical reads.
##   Before classification, there are 730397 reads with mutations.
##   After classification, there are 1851177 reads/indexes which are only identical.
##   After classification, there are 90341 reads/indexes which are strictly sequencer.
##   After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various criteria.
## Plotting index densities.
## Error in create_matrices(sample_sheet = sample_sheet, ident_column = ident_column, : object 'pre_indent_index_density_df' not found
## Error in summary(triples_tenmpr): object 'triples_tenmpr' not found
## Starting sample: s1.
##   Reading the file containing mutations: preprocessing/s1/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 1156535 reads.
##     Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1037310 reads.
##     Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
##   Mutation data: all filters removed 203354 reads, or 17.58%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1742165 indexes in all the data.
##     After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 953181 changed reads.
##     All data: before reads/index pruning, there are: 4681501 identical reads.
##     All data: after index pruning, there are: 491995 changed reads: 51.62%.
##     All data: after index pruning, there are: 3663004 identical reads: 78.24%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3663004 identical reads.
##   Before classification, there are 491995 reads with mutations.
##   After classification, there are 2738199 reads/indexes which are only identical.
##   After classification, there are 11023 reads/indexes which are strictly sequencer.
##   After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s2.
##   Reading the file containing mutations: preprocessing/s2/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 3421203 reads.
##     Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1758479 reads.
##     Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
##   Mutation data: all filters removed 1778234 reads, or 51.98%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1261478 indexes in all the data.
##     After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1642969 changed reads.
##     All data: before reads/index pruning, there are: 5230976 identical reads.
##     All data: after index pruning, there are: 814407 changed reads: 49.57%.
##     All data: after index pruning, there are: 4834092 identical reads: 92.41%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 4834092 identical reads.
##   Before classification, there are 814407 reads with mutations.
##   After classification, there are 2802107 reads/indexes which are only identical.
##   After classification, there are 111708 reads/indexes which are strictly sequencer.
##   After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s3.
##   Reading the file containing mutations: preprocessing/s3/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 4309681 reads.
##     Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1564155 reads.
##     Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
##   Mutation data: all filters removed 2857634 reads, or 66.31%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 884042 indexes in all the data.
##     After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1452047 changed reads.
##     All data: before reads/index pruning, there are: 3583390 identical reads.
##     All data: after index pruning, there are: 730397 changed reads: 50.30%.
##     All data: after index pruning, there are: 3332136 identical reads: 92.99%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3332136 identical reads.
##   Before classification, there are 730397 reads with mutations.
##   After classification, there are 1851177 reads/indexes which are only identical.
##   After classification, there are 90341 reads/indexes which are strictly sequencer.
##   After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various criteria.
## Plotting index densities.
## Error in create_matrices(sample_sheet = sample_sheet, ident_column = ident_column, : object 'pre_indent_index_density_df' not found
## Error in summary(triples_fivempr): object 'triples_fivempr' not found

1.2 Categorize the data with at least 5 indexes per mutant

## Starting sample: s1.
##   Reading the file containing mutations: preprocessing/s1/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 1156535 reads.
##     Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1037310 reads.
##     Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
##   Mutation data: all filters removed 203354 reads, or 17.58%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1742165 indexes in all the data.
##     After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 953181 changed reads.
##     All data: before reads/index pruning, there are: 4681501 identical reads.
##     All data: after index pruning, there are: 491995 changed reads: 51.62%.
##     All data: after index pruning, there are: 3663004 identical reads: 78.24%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3663004 identical reads.
##   Before classification, there are 491995 reads with mutations.
##   After classification, there are 2738199 reads/indexes which are only identical.
##   After classification, there are 11023 reads/indexes which are strictly sequencer.
##   After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s2.
##   Reading the file containing mutations: preprocessing/s2/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 3421203 reads.
##     Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1758479 reads.
##     Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
##   Mutation data: all filters removed 1778234 reads, or 51.98%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1261478 indexes in all the data.
##     After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1642969 changed reads.
##     All data: before reads/index pruning, there are: 5230976 identical reads.
##     All data: after index pruning, there are: 814407 changed reads: 49.57%.
##     All data: after index pruning, there are: 4834092 identical reads: 92.41%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 4834092 identical reads.
##   Before classification, there are 814407 reads with mutations.
##   After classification, there are 2802107 reads/indexes which are only identical.
##   After classification, there are 111708 reads/indexes which are strictly sequencer.
##   After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s3.
##   Reading the file containing mutations: preprocessing/s3/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 4309681 reads.
##     Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1564155 reads.
##     Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
##   Mutation data: all filters removed 2857634 reads, or 66.31%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 884042 indexes in all the data.
##     After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1452047 changed reads.
##     All data: before reads/index pruning, there are: 3583390 identical reads.
##     All data: after index pruning, there are: 730397 changed reads: 50.30%.
##     All data: after index pruning, there are: 3332136 identical reads: 92.99%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3332136 identical reads.
##   Before classification, there are 730397 reads with mutations.
##   After classification, there are 1851177 reads/indexes which are only identical.
##   After classification, there are 90341 reads/indexes which are strictly sequencer.
##   After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various criteria.
## Plotting index densities.
## Error in create_matrices(sample_sheet = sample_sheet, ident_column = ident_column, : object 'pre_indent_index_density_df' not found
## Error in summary(quints): object 'quints' not found
## Starting sample: s1.
##   Reading the file containing mutations: preprocessing/s1/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 1156535 reads.
##     Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1037310 reads.
##     Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
##   Mutation data: all filters removed 203354 reads, or 17.58%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1742165 indexes in all the data.
##     After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 953181 changed reads.
##     All data: before reads/index pruning, there are: 4681501 identical reads.
##     All data: after index pruning, there are: 491995 changed reads: 51.62%.
##     All data: after index pruning, there are: 3663004 identical reads: 78.24%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3663004 identical reads.
##   Before classification, there are 491995 reads with mutations.
##   After classification, there are 2738199 reads/indexes which are only identical.
##   After classification, there are 11023 reads/indexes which are strictly sequencer.
##   After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s2.
##   Reading the file containing mutations: preprocessing/s2/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 3421203 reads.
##     Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1758479 reads.
##     Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
##   Mutation data: all filters removed 1778234 reads, or 51.98%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1261478 indexes in all the data.
##     After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1642969 changed reads.
##     All data: before reads/index pruning, there are: 5230976 identical reads.
##     All data: after index pruning, there are: 814407 changed reads: 49.57%.
##     All data: after index pruning, there are: 4834092 identical reads: 92.41%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 4834092 identical reads.
##   Before classification, there are 814407 reads with mutations.
##   After classification, there are 2802107 reads/indexes which are only identical.
##   After classification, there are 111708 reads/indexes which are strictly sequencer.
##   After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s3.
##   Reading the file containing mutations: preprocessing/s3/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 4309681 reads.
##     Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1564155 reads.
##     Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
##   Mutation data: all filters removed 2857634 reads, or 66.31%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 884042 indexes in all the data.
##     After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1452047 changed reads.
##     All data: before reads/index pruning, there are: 3583390 identical reads.
##     All data: after index pruning, there are: 730397 changed reads: 50.30%.
##     All data: after index pruning, there are: 3332136 identical reads: 92.99%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3332136 identical reads.
##   Before classification, there are 730397 reads with mutations.
##   After classification, there are 1851177 reads/indexes which are only identical.
##   After classification, there are 90341 reads/indexes which are strictly sequencer.
##   After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various criteria.
## Plotting index densities.
## Error in create_matrices(sample_sheet = sample_sheet, ident_column = ident_column, : object 'pre_indent_index_density_df' not found
## Error in summary(quints_tenmpr): object 'quints_tenmpr' not found
## Starting sample: s1.
##   Reading the file containing mutations: preprocessing/s1/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 1156535 reads.
##     Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1037310 reads.
##     Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
##   Mutation data: all filters removed 203354 reads, or 17.58%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1742165 indexes in all the data.
##     After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 953181 changed reads.
##     All data: before reads/index pruning, there are: 4681501 identical reads.
##     All data: after index pruning, there are: 491995 changed reads: 51.62%.
##     All data: after index pruning, there are: 3663004 identical reads: 78.24%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3663004 identical reads.
##   Before classification, there are 491995 reads with mutations.
##   After classification, there are 2738199 reads/indexes which are only identical.
##   After classification, there are 11023 reads/indexes which are strictly sequencer.
##   After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s2.
##   Reading the file containing mutations: preprocessing/s2/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 3421203 reads.
##     Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1758479 reads.
##     Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
##   Mutation data: all filters removed 1778234 reads, or 51.98%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 1261478 indexes in all the data.
##     After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1642969 changed reads.
##     All data: before reads/index pruning, there are: 5230976 identical reads.
##     All data: after index pruning, there are: 814407 changed reads: 49.57%.
##     All data: after index pruning, there are: 4834092 identical reads: 92.41%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 4834092 identical reads.
##   Before classification, there are 814407 reads with mutations.
##   After classification, there are 2802107 reads/indexes which are only identical.
##   After classification, there are 111708 reads/indexes which are strictly sequencer.
##   After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various criteria.
## Starting sample: s3.
##   Reading the file containing mutations: preprocessing/s3/step4.txt.xz
##   Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
##   Counting indexes before filtering.
##     Mutation data: removing any differences before position: 24.
##     Mutation data: before pruning, there are: 4309681 reads.
##     Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
##     Mutation data: removing any differences after position: 176.
##     Mutation data: before pruning, there are: 1564155 reads.
##     Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
##     Mutation data: removing any reads with 'N' as the hit.
##     Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
##   Mutation data: all filters removed 2857634 reads, or 66.31%.
##     Gathering information about the number of reads per index.
##     Before reads/index pruning, there are: 884042 indexes in all the data.
##     After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
##     All data: removing indexes with fewer than 3 reads/index.
##     All data: before reads/index pruning, there are: 1452047 changed reads.
##     All data: before reads/index pruning, there are: 3583390 identical reads.
##     All data: after index pruning, there are: 730397 changed reads: 50.30%.
##     All data: after index pruning, there are: 3332136 identical reads: 92.99%.
##   Gathering identical, mutant, and sequencer reads/indexes.
##   Before classification, there are 3332136 identical reads.
##   Before classification, there are 730397 reads with mutations.
##   After classification, there are 1851177 reads/indexes which are only identical.
##   After classification, there are 90341 reads/indexes which are strictly sequencer.
##   After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
##   Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various criteria.
## Plotting index densities.
## Error in create_matrices(sample_sheet = sample_sheet, ident_column = ident_column, : object 'pre_indent_index_density_df' not found
## Error in summary(quints_fivempr): object 'quints_fivempr' not found

2 Questions from Dr. DeStefano

I think what is best is to get the number of recovered mutations of each type from each data set. That would be A to T, A to G, A to C; T to A, T to G, T to C; G to A, G to C, G to T; and C to A, C to G, C to T; as well as deletions and insertions. I would then need the sum number of the reads that met all our criteria (i.e. at least 3 good recovered reads for that 14 nt index). Each set of 3 or more would ct as “1” read of that particular index so I would need the total with this in mind. I also need to know the total number of nucleotides that were in the region we decided to consider in the analysis. We may want to try this for 3 or more and 5 or more recovered indexes if it is not hard. This information does not include specific positions on the template where errors occurred but we can look at that latter. Right now I just want to get a general error rate and type of error. It would basically be calculated by dividing the number of recovered mutations of a particular type by sum number of the reads times the number of nucleotides screened in the template. As it ends up, this number does not really have a lot of meaning but it can be used to calculate the overall mutation rate as well as the rate for transversions, transitions, and deletions and insertions.

3 Answers

In order to address those queries, I invoked create_matrices() with a minimum index count of 3 and 5. It should be noted that this is not the same as requiring 3 or 5 reads per index. In both cases I require 3 reads per index.

3.1 Recovered mutations of each type

I am interpreting this question as the number of indexes recovered for each mutation type. I collect this information in 2 ways of interest: the indexes by type which are deemed to be from the RT and from the sequencer. In addition, I calculate a normalized (cpm) version of this information which may be used to look for changes across samples.

3.1.1 Mutations by RT index

This following block should print out tables of the numbers of mutant indexes observed for each type for the RT and the sequencer. One would hope that the sequencer will be consistent for all samples, but I think the results will instead suggest that my metric is not yet stringent enough.

## Error in knitr::kable(triples[["matrices"]][["miss_indexes_by_type"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["matrices"]][["miss_indexes_by_type"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["matrices"]][["miss_indexes_by_type"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["matrices"]][["miss_indexes_by_type"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["matrices"]][["miss_indexes_by_type"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["matrices"]][["miss_indexes_by_type"]]): object 'quints_fivempr' not found
## Error in knitr::kable(triples[["matrices"]][["miss_sequencer_by_type"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["matrices"]][["miss_sequencer_by_type"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["matrices"]][["miss_sequencer_by_type"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["matrices"]][["miss_sequencer_by_type"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["matrices"]][["miss_sequencer_by_type"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["matrices"]][["miss_sequencer_by_type"]]): object 'quints_fivempr' not found

Plots of this information

## Error in eval(expr, envir, enclos): object 'triples' not found
## Error in eval(expr, envir, enclos): object 'triples_tenmpr' not found
## Error in eval(expr, envir, enclos): object 'triples_fivempr' not found
## Error in eval(expr, envir, enclos): object 'quints' not found
## Error in eval(expr, envir, enclos): object 'quints_tenmpr' not found
## Error in eval(expr, envir, enclos): object 'quints_fivempr' not found

This suggests to me that this information needs to be normalized in some more sensible fashion. Thus the following:

3.1.2 Mutations by RT index, post normalization

The same numbers may be expressed in the context of the number of indexes observed / sample and/or as a cpm across samples. Thus in the first instance one can look at the apparent error rate for each sample, and in the second instance one may look for relative changes in apparent error rate across samples.

3.1.2.1 Rewriting the matrices as cpm to account for library sizes.

## Error in knitr::kable(triples[["normalized"]][["miss_indexes_by_type"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["normalized"]][["miss_indexes_by_type"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["normalized"]][["miss_indexes_by_type"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["normalized"]][["miss_indexes_by_type"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["normalized"]][["miss_indexes_by_type"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["normalized"]][["miss_indexes_by_type"]]): object 'quints_fivempr' not found
## Error in knitr::kable(triples[["normalized"]][["miss_sequencer_by_type"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["normalized"]][["miss_sequencer_by_type"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["normalized"]][["miss_sequencer_by_type"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["normalized"]][["miss_sequencer_by_type"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["normalized"]][["miss_sequencer_by_type"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["normalized"]][["miss_sequencer_by_type"]]): object 'quints_fivempr' not found

3.1.2.2 Rewriting the matrices by dividing by all indexes

This I think starts to address the later text in your query.

## Error in knitr::kable(triples[["matrices_by_counts"]][["miss_indexes_by_type"]]): object 'triples' not found
## Error in knitr::kable(quints[["matrices_by_counts"]][["miss_indexes_by_type"]]): object 'quints' not found
## Error in knitr::kable(triples[["matrices_by_counts"]][["miss_sequencer_by_type"]]): object 'triples' not found
## Error in knitr::kable(quints[["matrices_by_counts"]][["miss_sequencer_by_type"]]): object 'quints' not found

3.1.2.3 Rewriting the matrices by dividing by all indexes and cpm

I think this might prove to be where we get the most meaningful results.

The nicest thing in it is that after accounting for library sizes and total indexes observed, we finally see that the sequencer error is mostly consistent across all samples and mutation types – with a couple of notable exceptions.

By the same token, for the mutations which are identical for the sequencer, we have some which are decidedly different for the non-sequencer data. The most notable examples I think are A to G but _not G to A; and C to T.

## Error in knitr::kable(triples[["normalized_by_counts"]][["miss_indexes_by_type"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["normalized_by_counts"]][["miss_indexes_by_type"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["normalized_by_counts"]][["miss_indexes_by_type"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["normalized_by_counts"]][["miss_indexes_by_type"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["normalized_by_counts"]][["miss_indexes_by_type"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["normalized_by_counts"]][["miss_indexes_by_type"]]): object 'quints_fivempr' not found
## Error in knitr::kable(triples[["normalized_by_counts"]][["miss_sequencer_by_type"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["normalized_by_counts"]][["miss_sequencer_by_type"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["normalized_by_counts"]][["miss_sequencer_by_type"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["normalized_by_counts"]][["miss_sequencer_by_type"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["normalized_by_counts"]][["miss_sequencer_by_type"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["normalized_by_counts"]][["miss_sequencer_by_type"]]): object 'quints_fivempr' not found

3.1.3 Indels by RT index

The following blocks will repeat the above, but looking for insertions. This data does not observe sufficient deletions to make a proper count for them.

## Error in knitr::kable(triples[["matrices"]][["insert_indexes_by_nt"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["matrices"]][["insert_indexes_by_nt"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["matrices"]][["insert_indexes_by_nt"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["matrices"]][["insert_indexes_by_nt"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["matrices"]][["insert_indexes_by_nt"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["matrices"]][["insert_indexes_by_nt"]]): object 'quints_fivempr' not found
## Error in knitr::kable(triples[["matrices"]][["insert_sequencer_by_nt"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["matrices"]][["insert_sequencer_by_nt"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["matrices"]][["insert_sequencer_by_nt"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["matrices"]][["insert_sequencer_by_nt"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["matrices"]][["insert_sequencer_by_nt"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["matrices"]][["insert_sequencer_by_nt"]]): object 'quints_fivempr' not found

Plots of this information

## Error in eval(expr, envir, enclos): object 'triples' not found
## Error in eval(expr, envir, enclos): object 'triples_tenmpr' not found
## Error in eval(expr, envir, enclos): object 'triples_fivempr' not found
## Error in eval(expr, envir, enclos): object 'quints' not found
## Error in eval(expr, envir, enclos): object 'quints_tenmpr' not found
## Error in eval(expr, envir, enclos): object 'quints_fivempr' not found

3.1.4 Insertions by RT index, post normalization

3.1.4.1 Rewriting the matrices as cpm to account for library sizes.

## Error in knitr::kable(triples[["normalized"]][["insert_indexes_by_nt"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["normalized"]][["insert_indexes_by_nt"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["normalized"]][["insert_indexes_by_nt"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["normalized"]][["insert_indexes_by_nt"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["normalized"]][["insert_indexes_by_nt"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["normalized"]][["insert_indexes_by_nt"]]): object 'quints_fivempr' not found
## Error in knitr::kable(triples[["normalized"]][["insert_sequencer_by_nt"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["normalized"]][["insert_sequencer_by_nt"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["normalized"]][["insert_sequencer_by_nt"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["normalized"]][["insert_sequencer_by_nt"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["normalized"]][["insert_sequencer_by_nt"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["normalized"]][["insert_sequencer_by_nt"]]): object 'quints_fivempr' not found

3.1.4.2 Rewriting the matrices by dividing by all indexes

I think that there are few enough insertion events that this gets a bit messed up. I will double check the logic of this, but that is my initial guess given how few insertions I was seeing when reading the outputs manually. Unfortunately, this means that for these I also cannot provide a cpm measurement.

## Error in knitr::kable(triples[["matrices_by_counts"]][["insert_indexes_by_nt"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["matrices_by_counts"]][["insert_indexes_by_nt"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["matrices_by_counts"]][["insert_indexes_by_nt"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["matrices_by_counts"]][["insert_indexes_by_nt"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["matrices_by_counts"]][["insert_indexes_by_nt"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["matrices_by_counts"]][["insert_indexes_by_nt"]]): object 'quints_fivempr' not found
## Error in knitr::kable(triples[["matrices_by_counts"]][["insert_sequencer_by_nt"]]): object 'triples' not found
## Error in knitr::kable(triples_tenmpr[["matrices_by_counts"]][["insert_sequencer_by_nt"]]): object 'triples_tenmpr' not found
## Error in knitr::kable(triples_fivempr[["matrices_by_counts"]][["insert_sequencer_by_nt"]]): object 'triples_fivempr' not found
## Error in knitr::kable(quints[["matrices_by_counts"]][["insert_sequencer_by_nt"]]): object 'quints' not found
## Error in knitr::kable(quints_tenmpr[["matrices_by_counts"]][["insert_sequencer_by_nt"]]): object 'quints_tenmpr' not found
## Error in knitr::kable(quints_fivempr[["matrices_by_counts"]][["insert_sequencer_by_nt"]]): object 'quints_fivempr' not found

The following is my previous writing of this worksheet which just dumped the various tables.

LS0tCnRpdGxlOiAiQ291bnRpbmcgUlQgbXV0YXRpb25zIGZyb20gaWxsdW1pbmEgc2VxdWVuY2luZyBkYXRhLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQod2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAiaW5kZXguUm1kIgp2ZXIgPC0gIjIwMTkxMjAxIgoKIyN0bXAgPC0gc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpCnJtZF9maWxlIDwtICJlcnJvcl9xdWFudC5SbWQiCmBgYAoKIyBDYWxjdWxhdGluZyBlcnJvciByYXRlcy4KCkkgd3JvdGUgdGhlIGZ1bmN0aW9uICdjcmVhdGVfbWF0cmljZXMoKScgdG8gY29sbGVjdCBtdXRhdGlvbiBjb3VudHMuICBBdCBsZWFzdAppbiB0aGVvcnkgdGhlIHJlc3VsdHMgZnJvbSBpdCBzaG91bGQgYmUgYWJsZSB0byBhZGRyZXNzIG1vc3QvYW55IHF1ZXN0aW9uCnJlZ2FyZGluZyB0aGUgY291bnRzIG9mIG11dGF0aW9ucyBvYnNlcnZlZCBpbiB0aGUgZGF0YS4KCiMjIENhdGVnb3JpemUgdGhlIGRhdGEgd2l0aCBhdCBsZWFzdCAzIGluZGV4ZXMgcGVyIG11dGFudAoKYGBge3IgdHJpcGxlc30KZGV2dG9vbHM6OmxvYWRfYWxsKCJSZXJycnQiKQpzYW1wbGVfc2hlZXQgPC0gInNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMueGxzeCIKaWRlbnRfY29sdW1uIDwtICJpZGVudHRhYmxlIgptdXRfY29sdW1uIDwtICJtdXRhdGlvbnRhYmxlIgptaW5fcmVhZHMgPC0gMwptaW5faW5kZXhlcyA8LSAzCm1pbl9zZXF1ZW5jZXIgPC0gMTAKbWluX3Bvc2l0aW9uIDwtIDI0Cm1heF9wb3NpdGlvbiA8LSAxNzYKbWF4X211dGF0aW9uc19wZXJfcmVhZCA8LSBOVUxMCnBydW5lX24gPC0gVFJVRQp2ZXJib3NlIDwtIFRSVUUKZXhjZWwgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X3RyaXBsZXMtdnt2ZXJ9Lnhsc3giKQp0cmlwbGVzIDwtIGNyZWF0ZV9tYXRyaWNlcyhzYW1wbGVfc2hlZXQ9c2FtcGxlX3NoZWV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF9jb2x1bW49aWRlbnRfY29sdW1uLCBtdXRfY29sdW1uPW11dF9jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9yZWFkcz1taW5fcmVhZHMsIG1pbl9pbmRleGVzPW1pbl9pbmRleGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2VxdWVuY2VyPW1pbl9zZXF1ZW5jZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9wb3NpdGlvbj1taW5fcG9zaXRpb24sIG1heF9wb3NpdGlvbj1tYXhfcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBydW5lX249cHJ1bmVfbiwgdmVyYm9zZT12ZXJib3NlLCBleGNlbD1leGNlbCkKc3VtbWFyeSh0cmlwbGVzKQoKbWF4X211dGF0aW9uc19wZXJfcmVhZCA8LSAxMApleGNlbCA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fdHJpcGxlc190ZW5tcHItdnt2ZXJ9Lnhsc3giKQp0cmlwbGVzX3Rlbm1wciA8LSBjcmVhdGVfbWF0cmljZXMoc2FtcGxlX3NoZWV0PXNhbXBsZV9zaGVldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF9jb2x1bW49aWRlbnRfY29sdW1uLCBtdXRfY29sdW1uPW11dF9jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3JlYWRzPW1pbl9yZWFkcywgbWluX2luZGV4ZXM9bWluX2luZGV4ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3NlcXVlbmNlcj1taW5fc2VxdWVuY2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9wb3NpdGlvbj1taW5fcG9zaXRpb24sIG1heF9wb3NpdGlvbj1tYXhfcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJ1bmVfbj1wcnVuZV9uLCB2ZXJib3NlPXZlcmJvc2UpCnN1bW1hcnkodHJpcGxlc190ZW5tcHIpCgptYXhfbXV0YXRpb25zX3Blcl9yZWFkIDwtIDUKZXhjZWwgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X3RyaXBsZXNfZml2ZW1wci12e3Zlcn0ueGxzeCIpCnRyaXBsZXNfZml2ZW1wciA8LSBjcmVhdGVfbWF0cmljZXMoc2FtcGxlX3NoZWV0PXNhbXBsZV9zaGVldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRfY29sdW1uPWlkZW50X2NvbHVtbiwgbXV0X2NvbHVtbj1tdXRfY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcmVhZHM9bWluX3JlYWRzLCBtaW5faW5kZXhlcz1taW5faW5kZXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3NlcXVlbmNlcj1taW5fc2VxdWVuY2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcG9zaXRpb249bWluX3Bvc2l0aW9uLCBtYXhfcG9zaXRpb249bWF4X3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZV9uPXBydW5lX24sIHZlcmJvc2U9dmVyYm9zZSkKc3VtbWFyeSh0cmlwbGVzX2ZpdmVtcHIpCmBgYAoKIyMgQ2F0ZWdvcml6ZSB0aGUgZGF0YSB3aXRoIGF0IGxlYXN0IDUgaW5kZXhlcyBwZXIgbXV0YW50CgpgYGB7ciBxdWludHN9Cm1pbl9pbmRleGVzIDwtIDUKbWF4X211dGF0aW9uc19wZXJfcmVhZCA8LSBOVUxMCmV4Y2VsIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9xdWludHMtdnt2ZXJ9Lnhsc3giKQpxdWludHMgPC0gY3JlYXRlX21hdHJpY2VzKHNhbXBsZV9zaGVldD1zYW1wbGVfc2hlZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRfY29sdW1uPWlkZW50X2NvbHVtbiwgbXV0X2NvbHVtbj1tdXRfY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9yZWFkcz1taW5fcmVhZHMsIG1pbl9pbmRleGVzPW1pbl9pbmRleGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zZXF1ZW5jZXI9bWluX3NlcXVlbmNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcG9zaXRpb249bWluX3Bvc2l0aW9uLCBtYXhfcG9zaXRpb249bWF4X3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBydW5lX249cHJ1bmVfbiwgdmVyYm9zZT12ZXJib3NlKQpzdW1tYXJ5KHF1aW50cykKCm1heF9tdXRhdGlvbnNfcGVyX3JlYWQgPC0gMTAKZXhjZWwgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X3F1aW50c190ZW5tcHItdnt2ZXJ9Lnhsc3giKQpxdWludHNfdGVubXByIDwtIGNyZWF0ZV9tYXRyaWNlcyhzYW1wbGVfc2hlZXQ9c2FtcGxlX3NoZWV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF9jb2x1bW49aWRlbnRfY29sdW1uLCBtdXRfY29sdW1uPW11dF9jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9yZWFkcz1taW5fcmVhZHMsIG1pbl9pbmRleGVzPW1pbl9pbmRleGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2VxdWVuY2VyPW1pbl9zZXF1ZW5jZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9wb3NpdGlvbj1taW5fcG9zaXRpb24sIG1heF9wb3NpdGlvbj1tYXhfcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBydW5lX249cHJ1bmVfbiwgdmVyYm9zZT12ZXJib3NlKQpzdW1tYXJ5KHF1aW50c190ZW5tcHIpCgptYXhfbXV0YXRpb25zX3Blcl9yZWFkIDwtIDUKZXhjZWwgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X3F1aW50c19maXZlbXByLXZ7dmVyfS54bHN4IikKcXVpbnRzX2ZpdmVtcHIgPC0gY3JlYXRlX21hdHJpY2VzKHNhbXBsZV9zaGVldD1zYW1wbGVfc2hlZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF9jb2x1bW49aWRlbnRfY29sdW1uLCBtdXRfY29sdW1uPW11dF9jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcmVhZHM9bWluX3JlYWRzLCBtaW5faW5kZXhlcz1taW5faW5kZXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zZXF1ZW5jZXI9bWluX3NlcXVlbmNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9wb3NpdGlvbj1taW5fcG9zaXRpb24sIG1heF9wb3NpdGlvbj1tYXhfcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZV9uPXBydW5lX24sIHZlcmJvc2U9dmVyYm9zZSkKc3VtbWFyeShxdWludHNfZml2ZW1wcikKYGBgCgojIFF1ZXN0aW9ucyBmcm9tIERyLiBEZVN0ZWZhbm8KCkkgdGhpbmsgd2hhdCBpcyBiZXN0IGlzIHRvIGdldCB0aGUgbnVtYmVyIG9mIHJlY292ZXJlZCBtdXRhdGlvbnMgb2YgZWFjaCB0eXBlCmZyb20gZWFjaCBkYXRhIHNldC4gIFRoYXQgd291bGQgYmUgQSB0byBULCBBIHRvIEcsIEEgdG8gQzsgVCB0byBBLCBUIHRvIEcsIFQgdG8KQzsgRyB0byBBLCBHIHRvIEMsIEcgdG8gVDsgYW5kIEMgdG8gQSwgQyB0byBHLCBDIHRvIFQ7IGFzIHdlbGwgYXMgZGVsZXRpb25zIGFuZAppbnNlcnRpb25zLiAgSSB3b3VsZCB0aGVuIG5lZWQgdGhlIHN1bSBudW1iZXIgb2YgdGhlIHJlYWRzIHRoYXQgbWV0IGFsbCBvdXIKY3JpdGVyaWEgKGkuZS4gYXQgbGVhc3QgMyBnb29kIHJlY292ZXJlZCByZWFkcyBmb3IgdGhhdCAxNCBudCBpbmRleCkuICBFYWNoIHNldApvZiAzIG9yIG1vcmUgd291bGQgY3QgYXMgIjEiIHJlYWQgb2YgdGhhdCBwYXJ0aWN1bGFyIGluZGV4IHNvIEkgd291bGQgbmVlZCB0aGUKdG90YWwgd2l0aCB0aGlzIGluIG1pbmQuICBJIGFsc28gbmVlZCB0byBrbm93IHRoZSB0b3RhbCBudW1iZXIgb2YgbnVjbGVvdGlkZXMKdGhhdCB3ZXJlIGluIHRoZSByZWdpb24gd2UgZGVjaWRlZCB0byBjb25zaWRlciBpbiB0aGUgYW5hbHlzaXMuICBXZSBtYXkgd2FudCB0bwp0cnkgdGhpcyBmb3IgMyBvciBtb3JlIGFuZCA1IG9yIG1vcmUgcmVjb3ZlcmVkIGluZGV4ZXMgaWYgaXQgaXMgbm90IGhhcmQuICBUaGlzCmluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgc3BlY2lmaWMgcG9zaXRpb25zIG9uIHRoZSB0ZW1wbGF0ZSB3aGVyZSBlcnJvcnMKb2NjdXJyZWQgYnV0IHdlIGNhbiBsb29rIGF0IHRoYXQgbGF0dGVyLiAgUmlnaHQgbm93IEkganVzdCB3YW50IHRvIGdldCBhIGdlbmVyYWwKZXJyb3IgcmF0ZSBhbmQgdHlwZSBvZiBlcnJvci4gIEl0IHdvdWxkIGJhc2ljYWxseSBiZSBjYWxjdWxhdGVkIGJ5IGRpdmlkaW5nIHRoZQpudW1iZXIgb2YgcmVjb3ZlcmVkIG11dGF0aW9ucyBvZiBhIHBhcnRpY3VsYXIgdHlwZSBieSBzdW0gbnVtYmVyIG9mIHRoZSByZWFkcwp0aW1lcyB0aGUgbnVtYmVyIG9mIG51Y2xlb3RpZGVzIHNjcmVlbmVkIGluIHRoZSB0ZW1wbGF0ZS4gIEFzIGl0IGVuZHMgdXAsIHRoaXMKbnVtYmVyIGRvZXMgbm90IHJlYWxseSBoYXZlIGEgbG90IG9mIG1lYW5pbmcgYnV0IGl0IGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUKb3ZlcmFsbCBtdXRhdGlvbiByYXRlIGFzIHdlbGwgYXMgdGhlIHJhdGUgZm9yIHRyYW5zdmVyc2lvbnMsIHRyYW5zaXRpb25zLCBhbmQKZGVsZXRpb25zIGFuZCBpbnNlcnRpb25zLgoKIyBBbnN3ZXJzCgpJbiBvcmRlciB0byBhZGRyZXNzIHRob3NlIHF1ZXJpZXMsIEkgaW52b2tlZCBjcmVhdGVfbWF0cmljZXMoKSB3aXRoIGEgbWluaW11bQppbmRleCBjb3VudCBvZiAzIGFuZCA1LiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMKcmVxdWlyaW5nIDMgb3IgNSByZWFkcyBwZXIgaW5kZXguICBJbiBib3RoIGNhc2VzIEkgcmVxdWlyZSAzIHJlYWRzIHBlciBpbmRleC4KCiMjIFJlY292ZXJlZCBtdXRhdGlvbnMgb2YgZWFjaCB0eXBlCgpJIGFtIGludGVycHJldGluZyB0aGlzIHF1ZXN0aW9uIGFzIHRoZSBudW1iZXIgb2YgaW5kZXhlcyByZWNvdmVyZWQgZm9yIGVhY2gKbXV0YXRpb24gdHlwZS4gIEkgY29sbGVjdCB0aGlzIGluZm9ybWF0aW9uIGluIDIgd2F5cyBvZiBpbnRlcmVzdDogdGhlIGluZGV4ZXMgYnkKdHlwZSB3aGljaCBhcmUgZGVlbWVkIHRvIGJlIGZyb20gdGhlIFJUIGFuZCBmcm9tIHRoZSBzZXF1ZW5jZXIuICBJbiBhZGRpdGlvbiwgSQpjYWxjdWxhdGUgYSBub3JtYWxpemVkIChjcG0pIHZlcnNpb24gb2YgdGhpcyBpbmZvcm1hdGlvbiB3aGljaCBtYXkgYmUgdXNlZCB0byBsb29rIGZvcgpjaGFuZ2VzIGFjcm9zcyBzYW1wbGVzLgoKIyMjIE11dGF0aW9ucyBieSBSVCBpbmRleAoKVGhpcyBmb2xsb3dpbmcgYmxvY2sgc2hvdWxkIHByaW50IG91dCB0YWJsZXMgb2YgdGhlIG51bWJlcnMgb2YgbXV0YW50IGluZGV4ZXMKb2JzZXJ2ZWQgZm9yIGVhY2ggdHlwZSBmb3IgdGhlIFJUIGFuZCB0aGUgc2VxdWVuY2VyLiAgT25lIHdvdWxkIGhvcGUgdGhhdCB0aGUKc2VxdWVuY2VyIHdpbGwgYmUgY29uc2lzdGVudCBmb3IgYWxsIHNhbXBsZXMsIGJ1dCBJIHRoaW5rIHRoZSByZXN1bHRzIHdpbGwKaW5zdGVhZCBzdWdnZXN0IHRoYXQgbXkgbWV0cmljIGlzIG5vdCB5ZXQgc3RyaW5nZW50IGVub3VnaC4KCmBgYHtyIG11dGF0aW9uX2luZGV4X2NvdW50LCByZXN1bHRzPSdhc2lzJ30Ka25pdHI6OmthYmxlKHRyaXBsZXNbWyJtYXRyaWNlcyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc190ZW5tcHJbWyJtYXRyaWNlcyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc19maXZlbXByW1sibWF0cmljZXMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm1hdHJpY2VzIl1dW1sibWlzc19pbmRleGVzX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNfdGVubXByW1sibWF0cmljZXMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c19maXZlbXByW1sibWF0cmljZXMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKCmtuaXRyOjprYWJsZSh0cmlwbGVzW1sibWF0cmljZXMiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc190ZW5tcHJbWyJtYXRyaWNlcyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX2ZpdmVtcHJbWyJtYXRyaWNlcyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNbWyJtYXRyaWNlcyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNfdGVubXByW1sibWF0cmljZXMiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUocXVpbnRzX2ZpdmVtcHJbWyJtYXRyaWNlcyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmBgYAoKUGxvdHMgb2YgdGhpcyBpbmZvcm1hdGlvbgoKYGBge3IgbXV0YXRpb25faW5kZXhfY291bnRfcGxvdHN9CnRyaXBsZXNbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dCnRyaXBsZXNfdGVubXByW1sicGxvdHMiXV1bWyJjb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXQp0cmlwbGVzX2ZpdmVtcHJbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dCgpxdWludHNbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dCnF1aW50c190ZW5tcHJbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dCnF1aW50c19maXZlbXByW1sicGxvdHMiXV1bWyJjb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXQpgYGAKClRoaXMgc3VnZ2VzdHMgdG8gbWUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIG5vcm1hbGl6ZWQgaW4gc29tZSBtb3JlCnNlbnNpYmxlIGZhc2hpb24uICBUaHVzIHRoZSBmb2xsb3dpbmc6CgojIyMgTXV0YXRpb25zIGJ5IFJUIGluZGV4LCBwb3N0IG5vcm1hbGl6YXRpb24KClRoZSBzYW1lIG51bWJlcnMgbWF5IGJlIGV4cHJlc3NlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbnVtYmVyIG9mIGluZGV4ZXMKb2JzZXJ2ZWQgLyBzYW1wbGUgYW5kL29yIGFzIGEgY3BtIGFjcm9zcyBzYW1wbGVzLiAgVGh1cyBpbiB0aGUgZmlyc3QgaW5zdGFuY2UKb25lIGNhbiBsb29rIGF0IHRoZSBhcHBhcmVudCBlcnJvciByYXRlIGZvciBlYWNoIHNhbXBsZSwgYW5kIGluIHRoZSBzZWNvbmQKaW5zdGFuY2Ugb25lIG1heSBsb29rIGZvciByZWxhdGl2ZSBjaGFuZ2VzIGluIGFwcGFyZW50IGVycm9yIHJhdGUgYWNyb3NzCnNhbXBsZXMuCgojIyMjIFJld3JpdGluZyB0aGUgbWF0cmljZXMgYXMgY3BtIHRvIGFjY291bnQgZm9yIGxpYnJhcnkgc2l6ZXMuCgpgYGB7ciBtdXRhdGlvbl9pbmRleF9ub3JtYWxpemVkLCByZXN1bHRzPSdhc2lzJ30Ka25pdHI6OmthYmxlKHRyaXBsZXNbWyJub3JtYWxpemVkIl1dW1sibWlzc19pbmRleGVzX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX3Rlbm1wcltbIm5vcm1hbGl6ZWQiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfZml2ZW1wcltbIm5vcm1hbGl6ZWQiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm5vcm1hbGl6ZWQiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c190ZW5tcHJbWyJub3JtYWxpemVkIl1dW1sibWlzc19pbmRleGVzX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNfZml2ZW1wcltbIm5vcm1hbGl6ZWQiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKCmtuaXRyOjprYWJsZSh0cmlwbGVzW1sibm9ybWFsaXplZCJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX3Rlbm1wcltbIm5vcm1hbGl6ZWQiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc19maXZlbXByW1sibm9ybWFsaXplZCJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNbWyJub3JtYWxpemVkIl1dW1sibWlzc19zZXF1ZW5jZXJfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c190ZW5tcHJbWyJub3JtYWxpemVkIl1dW1sibWlzc19zZXF1ZW5jZXJfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c19maXZlbXByW1sibm9ybWFsaXplZCJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmBgYAoKIyMjIyBSZXdyaXRpbmcgdGhlIG1hdHJpY2VzIGJ5IGRpdmlkaW5nIGJ5IGFsbCBpbmRleGVzCgpUaGlzIEkgdGhpbmsgc3RhcnRzIHRvIGFkZHJlc3MgdGhlIGxhdGVyIHRleHQgaW4geW91ciBxdWVyeS4KCmBgYHtyIG11dGF0aW9uX2luZGV4X25vcm1hbGl6ZWRfYnlfY291bnRzLCByZXN1bHRzPSdhc2lzJ30Ka25pdHI6OmthYmxlKHRyaXBsZXNbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dKQoKa25pdHI6OmthYmxlKHRyaXBsZXNbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUocXVpbnRzW1sibWF0cmljZXNfYnlfY291bnRzIl1dW1sibWlzc19zZXF1ZW5jZXJfYnlfdHlwZSJdXSkKYGBgCgojIyMjIFJld3JpdGluZyB0aGUgbWF0cmljZXMgYnkgZGl2aWRpbmcgYnkgYWxsIGluZGV4ZXMgYW5kIGNwbQoKSSB0aGluayB0aGlzIG1pZ2h0IHByb3ZlIHRvIGJlIHdoZXJlIHdlIGdldCB0aGUgbW9zdCBtZWFuaW5nZnVsIHJlc3VsdHMuCgpUaGUgbmljZXN0IHRoaW5nIGluIGl0IGlzIHRoYXQgYWZ0ZXIgYWNjb3VudGluZyBmb3IgbGlicmFyeSBzaXplcyBhbmQgdG90YWwKaW5kZXhlcyBvYnNlcnZlZCwgd2UgZmluYWxseSBzZWUgdGhhdCB0aGUgc2VxdWVuY2VyIGVycm9yIGlzIG1vc3RseSBjb25zaXN0ZW50CmFjcm9zcyBhbGwgc2FtcGxlcyBhbmQgbXV0YXRpb24gdHlwZXMgLS0gd2l0aCBhIGNvdXBsZSBvZiBub3RhYmxlIGV4Y2VwdGlvbnMuCgpCeSB0aGUgc2FtZSB0b2tlbiwgZm9yIHRoZSBtdXRhdGlvbnMgd2hpY2ggX2FyZV8gaWRlbnRpY2FsIGZvciB0aGUgc2VxdWVuY2VyLCB3ZQpoYXZlIHNvbWUgd2hpY2ggYXJlIGRlY2lkZWRseSBkaWZmZXJlbnQgZm9yIHRoZSBub24tc2VxdWVuY2VyIGRhdGEuICBUaGUgbW9zdApub3RhYmxlIGV4YW1wbGVzIEkgdGhpbmsgYXJlIEEgdG8gRyBidXQgX25vdCBHIHRvIEE7IGFuZCBDIHRvIFQuCgpgYGB7ciBtdXRhdGlvbl9pbmRleF9jcG1fYnlfY291bnRzLCByZXN1bHRzPSdhc2lzJ30Ka25pdHI6OmthYmxlKHRyaXBsZXNbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc190ZW5tcHJbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc19maXZlbXByW1sibm9ybWFsaXplZF9ieV9jb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm5vcm1hbGl6ZWRfYnlfY291bnRzIl1dW1sibWlzc19pbmRleGVzX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNfdGVubXByW1sibm9ybWFsaXplZF9ieV9jb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c19maXZlbXByW1sibm9ybWFsaXplZF9ieV9jb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKCmtuaXRyOjprYWJsZSh0cmlwbGVzW1sibm9ybWFsaXplZF9ieV9jb3VudHMiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc190ZW5tcHJbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX2ZpdmVtcHJbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNfdGVubXByW1sibm9ybWFsaXplZF9ieV9jb3VudHMiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUocXVpbnRzX2ZpdmVtcHJbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmBgYAoKIyMjIEluZGVscyBieSBSVCBpbmRleAoKVGhlIGZvbGxvd2luZyBibG9ja3Mgd2lsbCByZXBlYXQgdGhlIGFib3ZlLCBidXQgbG9va2luZyBmb3IgaW5zZXJ0aW9ucy4KVGhpcyBkYXRhIGRvZXMgbm90IG9ic2VydmUgc3VmZmljaWVudCBkZWxldGlvbnMgdG8gbWFrZSBhIHByb3BlciBjb3VudCBmb3IgdGhlbS4KCmBgYHtyIGluc2VydF9pbmRleF9jb3VudCwgcmVzdWx0cz0nYXNpcyd9CmtuaXRyOjprYWJsZSh0cmlwbGVzW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfZml2ZW1wcltbIm1hdHJpY2VzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0pCmtuaXRyOjprYWJsZShxdWludHNbWyJtYXRyaWNlcyJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm1hdHJpY2VzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0pCmtuaXRyOjprYWJsZShxdWludHNfZml2ZW1wcltbIm1hdHJpY2VzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0pCgprbml0cjo6a2FibGUodHJpcGxlc1tbIm1hdHJpY2VzIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUodHJpcGxlc19maXZlbXByW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm1hdHJpY2VzIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHF1aW50c19maXZlbXByW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQpgYGAKClBsb3RzIG9mIHRoaXMgaW5mb3JtYXRpb24KCmBgYHtyIGluc2VydF9pbmRleF9jb3VudF9wbG90c30KdHJpcGxlc1tbInBsb3RzIl1dW1siY291bnRzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0KdHJpcGxlc190ZW5tcHJbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dCnRyaXBsZXNfZml2ZW1wcltbInBsb3RzIl1dW1siY291bnRzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0KCnF1aW50c1tbInBsb3RzIl1dW1siY291bnRzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0KcXVpbnRzX3Rlbm1wcltbInBsb3RzIl1dW1siY291bnRzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0KcXVpbnRzX2ZpdmVtcHJbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dCmBgYAoKIyMjIEluc2VydGlvbnMgYnkgUlQgaW5kZXgsIHBvc3Qgbm9ybWFsaXphdGlvbgoKIyMjIyBSZXdyaXRpbmcgdGhlIG1hdHJpY2VzIGFzIGNwbSB0byBhY2NvdW50IGZvciBsaWJyYXJ5IHNpemVzLgoKYGBge3IgaW5zZXJ0X2luZGV4X25vcm1hbGl6ZWQsIHJlc3VsdHM9J2FzaXMnfQprbml0cjo6a2FibGUodHJpcGxlc1tbIm5vcm1hbGl6ZWQiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibm9ybWFsaXplZCJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUodHJpcGxlc19maXZlbXByW1sibm9ybWFsaXplZCJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzW1sibm9ybWFsaXplZCJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm5vcm1hbGl6ZWQiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHF1aW50c19maXZlbXByW1sibm9ybWFsaXplZCJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQoKa25pdHI6OmthYmxlKHRyaXBsZXNbWyJub3JtYWxpemVkIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibm9ybWFsaXplZCJdXVtbImluc2VydF9zZXF1ZW5jZXJfYnlfbnQiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX2ZpdmVtcHJbWyJub3JtYWxpemVkIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm5vcm1hbGl6ZWQiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm5vcm1hbGl6ZWQiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX2ZpdmVtcHJbWyJub3JtYWxpemVkIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKYGBgCgojIyMjIFJld3JpdGluZyB0aGUgbWF0cmljZXMgYnkgZGl2aWRpbmcgYnkgYWxsIGluZGV4ZXMKCkkgdGhpbmsgdGhhdCB0aGVyZSBhcmUgZmV3IGVub3VnaCBpbnNlcnRpb24gZXZlbnRzIHRoYXQgdGhpcyBnZXRzIGEgYml0IG1lc3NlZAp1cC4gIEkgd2lsbCBkb3VibGUgY2hlY2sgdGhlIGxvZ2ljIG9mIHRoaXMsIGJ1dCB0aGF0IGlzIG15IGluaXRpYWwgZ3Vlc3MgZ2l2ZW4KaG93IGZldyBpbnNlcnRpb25zIEkgd2FzIHNlZWluZyB3aGVuIHJlYWRpbmcgdGhlIG91dHB1dHMgbWFudWFsbHkuClVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgdGhhdCBmb3IgdGhlc2UgSSBhbHNvIGNhbm5vdCBwcm92aWRlIGEgY3BtIG1lYXN1cmVtZW50LgoKYGBge3IgaW5zZXJ0X2luZGV4X25vcm1hbGl6ZWRfYnlfY291bnRzLCByZXN1bHRzPSdhc2lzJ30Ka25pdHI6OmthYmxlKHRyaXBsZXNbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibWF0cmljZXNfYnlfY291bnRzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX2ZpdmVtcHJbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX2ZpdmVtcHJbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKCmtuaXRyOjprYWJsZSh0cmlwbGVzW1sibWF0cmljZXNfYnlfY291bnRzIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibWF0cmljZXNfYnlfY291bnRzIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfZml2ZW1wcltbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbImluc2VydF9zZXF1ZW5jZXJfYnlfbnQiXV0pCmtuaXRyOjprYWJsZShxdWludHNbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbImluc2VydF9zZXF1ZW5jZXJfYnlfbnQiXV0pCmtuaXRyOjprYWJsZShxdWludHNfZml2ZW1wcltbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbImluc2VydF9zZXF1ZW5jZXJfYnlfbnQiXV0pCmBgYAoKVGhlIGZvbGxvd2luZyBpcyBteSBwcmV2aW91cyB3cml0aW5nIG9mIHRoaXMgd29ya3NoZWV0IHdoaWNoIGp1c3QgZHVtcGVkIHRoZQp2YXJpb3VzIHRhYmxlcy4KCiMgUHJpbnQgcmF3IHRhYmxlcwoKYGBge3IgcmF3LCByZXN1bHRzPSdhc2lzJ30KZm9yICh0IGluIDE6bGVuZ3RoKHRyaXBsZXNbWyJtYXRyaWNlcyJdXSkpIHsKICB0YWJsZV9uYW1lIDwtIG5hbWVzKHRyaXBsZXNbWyJtYXRyaWNlcyJdXSlbdF0KICBtZXNzYWdlKCJSYXcgdGFibGU6ICIsIHRhYmxlX25hbWUsICIuIikKICBwcmludChrbml0cjo6a2FibGUodHJpcGxlc1tbIm1hdHJpY2VzIl1dW3RdKSkKfQpgYGAKCiMgUHJpbnQgcmF3IHBsb3RzCgpgYGB7ciByYXdfcGxvdHN9CmZvciAodCBpbiAxOmxlbmd0aCh0cmlwbGVzW1sicGxvdHMiXV1bWyJtYXRyaWNlcyJdXSkpIHsKICBtZXNzYWdlKCJSYXcgdGFibGU6ICIsIHRhYmxlX25hbWUsICIuIikKICBwcmludCh0cmlwbGVzW1sicGxvdHMiXV1bWyJtYXRyaWNlcyJdXVt0XSkKfQpgYGAKCiMgUHJpbnQgbm9ybWFsaXplZCB0YWJsZXMKCmBgYHtyIG5vcm0sIHJlc3VsdHM9J2FzaXMnfQpmb3IgKHQgaW4gMTpsZW5ndGgodHJpcGxlc1tbIm1hdHJpY2VzX2NvdW50cyJdXSkpIHsKICB0YWJsZV9uYW1lIDwtIG5hbWVzKHRyaXBsZXNbWyJtYXRyaWNlc19jb3VudHMiXV0pW3RdCiAgbWVzc2FnZSgiTm9ybWFsaXplZCB0YWJsZTogIiwgdGFibGVfbmFtZSwgIi4iKQogIHByaW50KGtuaXRyOjprYWJsZSh0cmlwbGVzW1sibWF0cmljZXNfY291bnRzIl1dW3RdKSkKfQpgYGAKCiMgUHJpbnQgbm9ybWFsaXplZCBwbG90cwoKYGBge3Igbm9ybV9wbG90c30KZm9yICh0IGluIDE6bGVuZ3RoKHRyaXBsZXNbWyJwbG90cyJdXVtbImNvdW50cyJdXSkpIHsKICBtZXNzYWdlKCJOb3JtYWxpemVkIHRhYmxlOiAiLCB0YWJsZV9uYW1lLCAiLiIpCiAgcHJpbnQodHJpcGxlc1tbInBsb3RzIl1dW1siY291bnRzIl1dW3RdKQp9CmBgYAoKYGBge3Igc2F2ZW1lfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCmBgYAoKCmBgYHtyIGxvYWRtZSwgZXZhbD1GQUxTRX0KbG9hZG1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkKYGBgCg==