Your Name 1 year ago
parent
commit
37e8d0dbf1
6 changed files with 111 additions and 110 deletions
  1. 0 0
      af_data_rivoalen.tsv
  2. 0 0
      res.json
  3. 36 15
      src/lib.rs
  4. 62 21
      src/sql/variants_sql.rs
  5. 13 9
      src/variants.rs
  6. 0 65
      thomas@10.115.34.27

File diff suppressed because it is too large
+ 0 - 0
af_data_rivoalen.tsv


+ 0 - 0
res.json


+ 36 - 15
src/lib.rs

@@ -8,16 +8,21 @@ pub mod variants;
 
 #[cfg(test)]
 mod tests {
+    use self::annotations::phase::PhaserConfig;
+    use crate::{
+        annotations::phase,
+        config::Config,
+        sql::variants_sql::load_variants_name,
+        utils::count_repetitions,
+        variants::{AnnotationType, Category, Variants},
+    };
     use anyhow::{Ok, Result};
     use indicatif::MultiProgress;
     use indicatif_log_bridge::LogWrapper;
     use log::info;
     use noodles_core::{Position, Region};
+    use sql::variants_sql::{load_annotaded, write_annotaded};
     use variants::AllStats;
-    use crate::{
-        annotations::phase, config::Config, sql::variants_sql::load_variants_name, utils::count_repetitions, variants::{AnnotationType, Category, Variants}
-    };
-    use self::annotations::phase::PhaserConfig;
 
     use super::*;
     #[test]
@@ -29,7 +34,7 @@ mod tests {
 
     #[test]
     fn load_from_vcf() -> Result<()> {
-        let name = "RICCO";
+        let name = "DAHAN";
 
         let logger =
             env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info"))
@@ -42,9 +47,20 @@ mod tests {
         Ok(())
     }
 
+    #[test]
+    fn annot() -> anyhow::Result<()> {
+        let id = "DAHAN";
+        write_annotaded(
+            &format!("/data/longreads_basic_pipe/{id}/diag/{id}_variants.sqlite"),
+            &format!("/data/longreads_basic_pipe/{id}/diag/report/data/{id}_annot_variants.json"),
+        )
+    }
+
     #[test]
     fn graph() -> anyhow::Result<()> {
-        let stats = AllStats::load_json("/data/longreads_basic_pipe/RICCO/diag/report/data/RICCO_variants_stats.json")?;
+        let stats = AllStats::load_json(
+            "/data/longreads_basic_pipe/RICCO/diag/report/data/RICCO_variants_stats.json",
+        )?;
         stats.generate_graph("/data/stats")?;
         Ok(())
     }
@@ -164,18 +180,24 @@ mod tests {
             &format!("/data/longreads_basic_pipe/{id}/diag/{id}_diag_hs1.bam",),
             contig,
         );
-        let phased = variants.with_annotation(&AnnotationType::Phase(annotations::phase::PhaseAnnotation{id: "".to_string()}));
+        let phased = variants.with_annotation(&AnnotationType::Phase(
+            annotations::phase::PhaseAnnotation { id: "".to_string() },
+        ));
         let n_phased = phased.len();
         info!("{n_phased} variants phased");
 
         for v in phased {
-            let phases_ids: Vec<String> = v.annotations.iter().flat_map(|a| {
-                if let AnnotationType::Phase(p) = a {
-                    vec![p.id.to_string()]
-                } else {
-                    vec![]
-                }
-            }).collect();
+            let phases_ids: Vec<String> = v
+                .annotations
+                .iter()
+                .flat_map(|a| {
+                    if let AnnotationType::Phase(p) = a {
+                        vec![p.id.to_string()]
+                    } else {
+                        vec![]
+                    }
+                })
+                .collect();
             if phases_ids.len() > 1 {
                 println!("{}:{}\t{}", v.contig, v.position, phases_ids.join("|"));
             }
@@ -197,5 +219,4 @@ mod tests {
         let config = PhaserConfig::new(id, "/data/longreads_basic_pipe", min_records, 0.35);
         phase::phase(config, multi)
     }
-
 }

+ 62 - 21
src/sql/variants_sql.rs

@@ -1,13 +1,15 @@
-use std::str::FromStr;
+use std::{fs::OpenOptions, io::Write, str::FromStr};
 
 use anyhow::{anyhow, Context, Ok, Result};
 use indicatif::MultiProgress;
 use serde::{Deserialize, Serialize};
 use serde_rusqlite::*;
 
-use crate::{variants::{
-    AnnotationType, Format, ReferenceAlternative, VCFSource, Variant, Variants
-}, config::Config, utils::new_pg_speed};
+use crate::{
+    config::Config,
+    utils::new_pg_speed,
+    variants::{AnnotationType, Format, ReferenceAlternative, VCFSource, Variant, Variants},
+};
 
 #[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
 pub struct VariantSQL {
@@ -31,6 +33,8 @@ pub struct VariantSQL {
     gnomad_af: Option<f64>,
     cosmic_n: Option<u64>,
     ncbi_feature: Option<String>,
+    tags: Option<String>,
+    interpretation: Option<String>,
 }
 
 impl TryFrom<&VariantSQL> for Variant {
@@ -44,7 +48,7 @@ impl TryFrom<&VariantSQL> for Variant {
             .collect();
         Ok(Self {
             contig: value.contig.clone(),
-            position: value.position.clone(),
+            position: value.position,
             reference: ReferenceAlternative::from_str(&value.reference)?,
             alternative: ReferenceAlternative::from_str(&value.alternative)?,
             callers_data: serde_json::from_str(&value.callers_data)?,
@@ -104,7 +108,7 @@ impl TryFrom<&Variant> for VariantSQL {
                 (None, None, None, None, None, None, None)
             };
 
-        let (gnomad_af, cosmic_n, ncbi_feature) = if v.annotations.len() > 0 {
+        let (gnomad_af, cosmic_n, ncbi_feature) = if !v.annotations.is_empty() {
             let mut gnomad_af: Option<f64> = None;
             let mut cosmic_n: Option<u64> = None;
             let mut ncbi_feature: Option<String> = None;
@@ -144,6 +148,8 @@ impl TryFrom<&Variant> for VariantSQL {
             gnomad_af,
             cosmic_n,
             ncbi_feature,
+            tags: None,
+            interpretation: None,
         })
     }
 }
@@ -157,11 +163,11 @@ impl VariantSQL {
         self.name = name.clone();
 
         let r = connection.execute(
-                "INSERT INTO Variants (name, contig, position, reference, alternative, m_vaf, callers, callers_data, variant_type, vep, selected_vep, annotations, consequence, gene, gene_distance, hgvs_c, hgvs_p, gnomad_af, cosmic_n, ncbi_feature) VALUES (:name, :contig, :position, :reference, :alternative, :m_vaf, :callers, :callers_data, :variant_type, :vep, :selected_vep, :annotations, :consequence, :gene, :gene_distance, :hgvs_c, :hgvs_p, :gnomad_af, :cosmic_n, :ncbi_feature)",
+                "INSERT INTO Variants (name, contig, position, reference, alternative, m_vaf, callers, callers_data, variant_type, vep, selected_vep, annotations, consequence, gene, gene_distance, hgvs_c, hgvs_p, gnomad_af, cosmic_n, ncbi_feature, tags, interpretation) VALUES (:name, :contig, :position, :reference, :alternative, :m_vaf, :callers, :callers_data, :variant_type, :vep, :selected_vep, :annotations, :consequence, :gene, :gene_distance, :hgvs_c, :hgvs_p, :gnomad_af, :cosmic_n, :ncbi_feature, :tags, :interpretation)",
                 to_params_named(&self).unwrap().to_slice().as_slice(),
             );
         match r {
-            std::result::Result::Ok(_) => return Ok(()),
+            std::result::Result::Ok(_) => Ok(()),
             Err(r) => panic!("Error with VariantSQL inserting: {} {:?}", r, self),
         }
     }
@@ -191,7 +197,9 @@ pub fn init_variants_table(connection: &rusqlite::Connection) -> Result<usize> {
                hgvs_p TEXT,
                gnomad_af REAL,
                cosmic_n INT,
-               ncbi_feature TEXT
+               ncbi_feature TEXT,
+               tags TEXT,
+               interpretation TEXT
             )",
             [],
         )
@@ -199,7 +207,7 @@ pub fn init_variants_table(connection: &rusqlite::Connection) -> Result<usize> {
 }
 
 pub fn insert_variants(variants: &Variants, path: &str) -> Result<()> {
-    let connection = rusqlite::Connection::open(&path)?;
+    let connection = rusqlite::Connection::open(path)?;
     init_variants_table(&connection)?;
     let pg = variants.mp.add(new_pg_speed(variants.len() as u64));
     pg.set_message(format!("Inserting data into DB: {path}"));
@@ -214,8 +222,11 @@ pub fn insert_variants(variants: &Variants, path: &str) -> Result<()> {
 }
 
 pub fn remove_variants_names(db_path: &str, name: &str) -> Result<()> {
-    let connection = rusqlite::Connection::open(&db_path)?;
-    connection.execute("DELETE FROM Variants WHERE name = :name", &[(":name", name)])?;
+    let connection = rusqlite::Connection::open(db_path)?;
+    connection.execute(
+        "DELETE FROM Variants WHERE name = :name",
+        &[(":name", name)],
+    )?;
     Ok(())
 }
 
@@ -223,16 +234,12 @@ pub fn load_variants_name(name: &str, mp: &MultiProgress) -> Result<Variants> {
     let cfg = Config::get()?;
     let connection = rusqlite::Connection::open(&cfg.db)?;
     let mut stmt = connection.prepare("SELECT * FROM Variants WHERE name = (?1)")?;
-    let rows = stmt.query_and_then([name], |r| {
-        match from_row::<VariantSQL>(r) {
-            std::result::Result::Ok(row) => {
-                match Variant::try_from(&row) {
-                    std::result::Result::Ok(v) => Ok(v),
-                    Err(e) => Err(anyhow!(e)),
-                }
-            },
+    let rows = stmt.query_and_then([name], |r| match from_row::<VariantSQL>(r) {
+        std::result::Result::Ok(row) => match Variant::try_from(&row) {
+            std::result::Result::Ok(v) => Ok(v),
             Err(e) => Err(anyhow!(e)),
-        }
+        },
+        Err(e) => Err(anyhow!(e)),
     })?;
 
     let mut data = Vec::new();
@@ -242,3 +249,37 @@ pub fn load_variants_name(name: &str, mp: &MultiProgress) -> Result<Variants> {
 
     Ok(Variants::from_vec(name.to_string(), mp, data))
 }
+
+pub fn load_annotaded(db_path: &str) -> anyhow::Result<String> {
+    let connection = rusqlite::Connection::open(db_path)?;
+    let mut stmt = connection.prepare(
+        "SELECT * FROM Variants WHERE interpretation != '' AND interpretation IS NOT NULL",
+    )?;
+
+    let rows = stmt.query_and_then([], |r| match from_row::<VariantSQL>(r) {
+        std::result::Result::Ok(v) => Ok(v),
+        Err(e) => Err(anyhow!(e)),
+    })?;
+
+    let mut results = Vec::new();
+    for var in rows {
+        let v = var?;
+        results.push(v);
+    }
+
+    Ok(serde_json::to_string(&results)?)
+}
+
+pub fn write_annotaded(db_path: &str, json_path: &str) -> anyhow::Result<()> {
+    let s = load_annotaded(db_path)?;
+
+    let mut file = OpenOptions::new()
+        .write(true)
+        .create(true)
+        .truncate(true)
+        .open(json_path)?;
+
+    file.write_all(s.as_bytes())?;
+
+    Ok(())
+}

+ 13 - 9
src/variants.rs

@@ -31,7 +31,7 @@ use crate::{
 use anyhow::{anyhow, bail, Context, Ok, Result};
 use charming::{
     component::{Axis, Grid},
-    element::{AxisLabel, AxisType, Label, LabelPosition},
+    element::{AxisLabel, AxisType, ItemStyle, Label, LabelPosition},
     series::Bar,
     Chart,
 };
@@ -1203,11 +1203,11 @@ impl AllStats {
 
         consequences_data.sort_by(|a, b| a.1.cmp(&b.1));
         let n = consequences_data.len() as f64;
-        let height = (n * bar_interval) + (0.25 * n * bar_interval);
+        let height = (n * bar_interval) + 30.0;
         let (y_data, x_data): (Vec<String>, Vec<i32>) = consequences_data.into_iter().unzip();
 
         let chart = Chart::new()
-            .grid(Grid::new().left("18%").right("5%").top("0%").bottom("25%"))
+            .grid(Grid::new().left("18%").right("5%").top("0%").bottom(30))
             .x_axis(Axis::new().type_(AxisType::Log))
             .y_axis(
                 Axis::new()
@@ -1219,6 +1219,8 @@ impl AllStats {
                 Bar::new()
                     .show_background(true)
                     .data(x_data)
+                    .bar_width(12)
+                    .item_style(ItemStyle::new().border_radius(3))
                     .label(Label::new().show(true).position(LabelPosition::Right)),
             );
 
@@ -1254,12 +1256,12 @@ impl AllStats {
 
         ncbi_data.sort_by(|a, b| a.1.cmp(&b.1));
         let n = ncbi_data.len() as f64;
-        let height = (n * bar_interval) + (0.25 * n * bar_interval);
+        let height = (n * bar_interval) + 30.0;
 
         let (y_data, x_data): (Vec<String>, Vec<i32>) = ncbi_data.into_iter().unzip();
 
         let chart = Chart::new()
-            .grid(Grid::new().left("18%").right("5%").top("0%").bottom("25%"))
+            .grid(Grid::new().left("18%").right("5%").top("0%").bottom(30))
             .x_axis(Axis::new().type_(AxisType::Log))
             .y_axis(
                 Axis::new()
@@ -1271,7 +1273,8 @@ impl AllStats {
                 Bar::new()
                     .show_background(true)
                     .data(x_data)
-                    .bar_width(10)
+                    .bar_width(12)
+                    .item_style(ItemStyle::new().border_radius(3))
                     .label(Label::new().show(true).position(LabelPosition::Right)),
             );
 
@@ -1296,13 +1299,13 @@ impl AllStats {
             .map(|(k, v)| (k.replace(",", " & "), *v as i32))
             .collect();
         let n = callers_data.len() as f64;
-        let height = (n * bar_interval) + (0.25 * n * bar_interval);
+        let height = (n * bar_interval) + 30.0;
 
         callers_data.sort_by(|a, b| a.1.cmp(&b.1));
         let (y_data, x_data): (Vec<String>, Vec<i32>) = callers_data.into_iter().unzip();
 
         let chart = Chart::new()
-            .grid(Grid::new().left("18%").right("5%").top("0%").bottom("25%"))
+            .grid(Grid::new().left("18%").right("5%").top("0%").bottom(30))
             .x_axis(Axis::new().type_(AxisType::Log))
             .y_axis(
                 Axis::new()
@@ -1314,7 +1317,8 @@ impl AllStats {
                 Bar::new()
                     .show_background(true)
                     .data(x_data)
-                    .bar_width(10)
+                    .bar_width(12)
+                    .item_style(ItemStyle::new().border_radius(3))
                     .label(Label::new().show(true).position(LabelPosition::Right)),
             );
 

+ 0 - 65
thomas@10.115.34.27

@@ -1,65 +0,0 @@
-depth,n_alt_0,n_alt_1,n_alt_2,n_alt_3,n_alt_4,n_alt_5,n_alt_6,n_alt_7,n_alt_8,n_alt_9,n_alt_10,n_alt_11,n_alt_12,n_alt_13,n_alt_14,n_alt_15,n_alt_16,n_alt_17,n_alt_18,n_alt_19,n_alt_20,n_alt_21,n_alt_22,n_alt_23,n_alt_24,n_alt_25,n_alt_26,n_alt_27,n_alt_28,n_alt_29,n_alt_30,n_alt_31,n_alt_32,n_alt_33,n_alt_34,n_alt_35,n_alt_36,n_alt_37,n_alt_38,n_alt_39,n_alt_40,n_alt_41,n_alt_42,n_alt_43,n_alt_44,n_alt_45,n_alt_46,n_alt_47,n_alt_48,n_alt_49,n_alt_50,n_alt_51,n_alt_52,n_alt_53,n_alt_54,n_alt_55,n_alt_56,n_alt_57,n_alt_58
-27,0,0,0,16,19,14,12,5,13,16,9,17,11,9,11,13,7,4,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-19,0,0,24,97,78,88,92,80,72,69,79,48,45,11,18,6,5,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-67,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-2,0,0,926,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-45,0,0,0,0,0,0,0,0,0,1,0,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-6,0,0,315,270,133,64,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-50,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-4,0,0,486,307,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-9,0,0,184,204,173,107,67,23,21,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-17,0,1,31,111,109,105,128,103,107,76,71,67,19,5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-40,0,0,0,1,2,0,0,0,1,1,2,1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-44,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
-10,0,0,164,248,199,142,92,37,27,7,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-3,0,0,537,383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-7,0,0,266,278,188,87,43,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-48,0,0,0,0,0,0,0,0,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-25,0,0,4,37,29,26,21,23,20,14,16,21,29,15,22,7,10,3,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-15,0,1,64,141,149,150,131,117,98,56,42,31,10,3,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
-8,0,0,223,214,176,102,63,20,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-34,0,0,0,3,4,2,2,5,4,5,3,0,1,0,0,2,1,0,0,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-11,0,0,129,200,161,164,104,92,44,13,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-23,0,0,12,57,38,44,54,38,47,39,37,32,31,17,18,10,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-21,0,1,10,72,63,46,64,44,67,42,41,54,42,30,26,13,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-49,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-29,0,0,0,14,11,14,3,10,7,2,6,6,12,6,12,1,5,5,3,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-35,0,0,0,2,2,0,3,1,0,1,2,4,1,2,2,2,2,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-24,0,0,10,41,31,31,28,34,35,40,38,29,27,27,17,12,5,4,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-31,0,0,0,3,9,3,8,6,13,10,1,2,6,3,6,4,2,4,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-68,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-43,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-12,0,0,111,172,178,163,134,91,57,19,7,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-22,0,0,15,62,43,58,51,46,42,60,59,47,31,23,20,14,2,2,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-30,0,0,0,7,6,9,6,3,12,7,6,4,6,5,4,7,5,2,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-58,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-20,0,0,17,81,70,61,75,69,72,83,59,60,39,25,16,6,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-42,0,0,0,0,1,0,0,0,2,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-39,0,0,0,0,1,3,5,1,1,0,0,2,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-52,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-57,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-32,0,0,0,5,3,10,1,4,3,5,3,1,2,5,6,2,2,1,3,3,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-33,0,0,0,3,3,4,5,3,4,6,1,2,1,3,2,3,1,1,0,2,6,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-38,0,0,0,0,1,0,2,2,1,0,1,0,2,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-28,0,0,0,12,11,11,8,9,11,8,11,12,19,9,5,5,4,6,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-26,0,0,0,26,20,25,16,21,22,23,19,23,18,17,8,9,7,8,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-53,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-64,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-18,0,0,23,109,84,94,95,111,88,89,89,53,30,9,5,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-13,0,1,102,138,152,163,187,110,62,32,25,6,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-46,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-59,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-37,0,0,0,1,1,4,1,2,3,2,0,0,2,2,1,0,2,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-55,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-16,0,0,45,124,125,122,132,114,118,88,44,26,7,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-5,0,0,301,218,117,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-36,0,0,0,1,1,4,2,3,3,1,1,1,0,0,0,3,2,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-14,0,0,68,151,156,193,138,117,78,48,29,16,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-41,0,0,0,1,0,1,0,0,0,0,3,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

Some files were not shown because too many files changed in this diff