はじめに

サンプルID DNA抽出キット 保存バッファ リード数
SRR6325813 QMINI Native 282517
SRR6325815 QMINI LysisBuffer 266259
SRR6325816 QMINI RNA-later 359984
SRR6325817 QMINI PBS 325660
SRR6325828 MOBIO RNA-later 206939
SRR6325829 MOBIO PBS 261767
SRR6325830 MOBIO Native 238627
SRR6325831 MOBIO LysisBuffer 225548
SRR6325859 GENIAL LysisBuffer 290383
SRR6325860 GENIAL Native 253908
SRR6325861 GENIAL PBS 120789
SRR6325862 GENIAL RNA-later 258792

W1 ファイルの読込

 ここでは、タブ区切りテキストファイルとxlsx形式ファイルの読込を行います。入力ファイルが同じでも、読み込み時のオプション次第で、読み込み後のオブジェクト(この場合はhoge)の行数や列数、行名や列名の有無なども変わりますので、ご注意ください。

W1.1 dada2実行結果ファイル

 第24回の図5で見えているファイルの読込を行うのが主な目的です。タブ区切りテキストファイル(output_JSLAB24.txt)の読込、xlsx形式ファイル(output_JSLAB24.xlsx)の読込の2パターンを示します。但し後者の場合は、xlsx形式ファイルを読み込むための関数を提供しているパッケージのロードからになります。ここではそのうちの1つであるopenxlsxパッケージのロードから行います。ヒトによってこのパッケージのインストールができているかどうかは異なります。それゆえ、若干挙動も異なりますが、W1.1を一通りやれば全員タブ区切りテキストファイルでもxlsx形式ファイルでも読み込めるようになると思います。

W1.1.1 read.table関数

 read.table関数は、様々なテキストファイルを読み込むための関数です。header=TRUEは、1行目を列名として取り扱うという宣言です。row.names=1は、1列目を行名として取り扱うという宣言です。sep="\t"は、区切り文字がタブ(\t)であるという宣言です。例えばもし半角スペースで中身を区切りたい場合は、sep=" "とします。また、コンマ区切りにして読み込みたい場合は、sep=","にします。  

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t")# in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
dim(hoge)                                 # hogeの行数と列数
## [1] 580  19

 読み込み後のオブジェクトの行数は580、列数は19であることがわかります。 一番右から2番目のGenus列が属名、一番右のSpecies列が種名ですので、この中にどれくらい計19属(22種)の既知微生物群集HM-280Gevers et al., PLoS Comput Biol., 2012)が含まれているのかなどを評価していくことになります。

W1.1.2 read.xlsx関数

 read.xlsx関数は、openxlsxパッケージから提供する、xlsx形式ファイルを読み込むための関数です。colNames=Tオプションは、1行目を列名として取り扱うという宣言になります(1行目が列名情報ではない場合はcolNames=Fとします)。それゆえ、openxlsxパッケージがインストールされていないヒトは、このパッケージのロード部分以降でエラーになります。

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.xlsx" # 読み込みたいファイル情報をin_fに格納
library(openxlsx)                         # openxlsxパッケージのロード
hoge <- read.xlsx(in_f, colNames=T, rowNames=T)# in_fを、1行目を列名として読み込んだ結果をhogeに格納
dim(hoge)                                 # hogeの行数と列数
## [1] 580  19

W1.1.3 openxlsxのインストール

 連載第18回でも言及した、openxlsxパッケージのインストールを行います。このパッケージ自体はCRANというリポジトリから提供されていますので、本当はもう少しシンプルに書けます。しかし、dada2のようにBioconductorというリポジトリから提供されているパッケージに対しては、その書き方は通用しません。以下はどちらのリポジトリから提供されているパッケージに対しても適用可能なインストール手段になります。

if (!requireNamespace("BiocManager", quietly=T))# もしBiocManagerパッケージが入っていなければ...
    install.packages("BiocManager")       # BiocManagerパッケージをインストールせよ
BiocManager::install("openxlsx", update=F)# openxlsxパッケージをインストールせよ

W1.1.4 openxlsxがある状態

 実行時に「警告: パッケージ ‘openxlsx’ はバージョン 4.x.x の R の下で造られました 」のような警告が出ることがありますが、これは気にする必要はありません。

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.xlsx" # 読み込みたいファイル情報をin_fに格納
library(openxlsx)                         # openxlsxパッケージのロード
hoge <- read.xlsx(in_f, colNames=T, rowNames=T)# in_fを、1行目を列名として読み込んだ結果をhogeに格納
dim(hoge)                                 # hogeの行数と列数
## [1] 580  19

なお、上記の2-3行目の部分については、以下のようにまとめて書くヒトもいます。見慣れないうちは相当困惑しますので、今のうちに慣れておきましょう。「パッケージ名::そのパッケージが提供する関数名」というフォーマットになります。

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.xlsx" # 読み込みたいファイル情報をin_fに格納
hoge <- openxlsx::read.xlsx(in_f, colNames=T, rowNames=T)# in_fを、1行目を列名として読み込んだ結果をhogeに格納
dim(hoge)                                 # hogeの行数と列数
## [1] 580  19

W1.2 菌株情報ファイル

 連載第23回の表1のタブ区切りテキストファイル(JSLAB23_table1.txt)を読込みます。このファイルの中身は、計19属(22種)の既知微生物群集HM-280Gevers et al., PLoS Comput Biol., 2012)の情報になります。header=TRUEは、1行目を列名として取り扱うという宣言です。row.names=1は、1列目を行名として取り扱うという宣言です。sep="\t"は、区切り文字がタブ(\t)であるという宣言です。

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB23_table1.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t") #in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
dim(hoge)                                 # hogeの行数と列数
## [1] 22  3

読み込み後の行数は22、列数は3であることがわかります。以下は、hogeの最初の4行分を表示して確認しているだけです。

head(hoge, n = 4)                         # hoge中の最初の4つを確認
##                                   Organism copy_num_16S.rRNA
## 1    Acinetobacter baumannii, strain 5377                  5
## 2 Actinomyces odontolyticus, strain 1A.21                  2
## 3         Bacillus cereus, strain NRS 248                 12
## 4  Bacteroides vulgatus, strain NTC 11154                  7
##                  RefSeq_ID
## 1                NC_009085
## 2 NZ_DS264585, NZ_DS264586
## 3                NC_003909
## 4                NC_009614

W2 前処理

 ここでは、W1で読み込んだ2つのファイルの中から必要な部分だけを抽出する操作などを行います。W1.1で読み込んだdada2実行結果ファイル(output_JSLAB24.txt)とW1.2で読み込んだ計19属(22種)の既知微生物群集の情報を含んだファイル(JSLAB23_table1.txt

W2.1 dada2実行結果ファイル

 W1.1で読み込んだdada2実行結果ファイル(output_JSLAB24.txt)を再度読み込むところからスタートし、計12サンプル分のASVごとの出現頻度情報に相当する列(“SRR…”という名前の12列)をdataというオブジェクト名で、Genus列をgenusというオブジェクト名で、そしてSpecies列をspeciesというオブジェクト名で得ます。

W2.1.1 colnames関数

 ここでは、W1.1.1を再度実行した後、colnames関数を用いて行列hogeオブジェクトの列名情報を表示させます。read.table関数実行時に、header=TRUEオプションをつけているので、行列hogeに列名が付与されています。もしheader=TRUEオプションをつけずに読み込んでいれば、(hogeに列名情報が付与されないので)colnames関数を実行しても何も表示されません。

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t")# in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
dim(hoge)                                 # hogeの行数と列数
## [1] 580  19
colnames(hoge)                            # hogeの列名情報
##  [1] "SRR6325813" "SRR6325815" "SRR6325816" "SRR6325817" "SRR6325828"
##  [6] "SRR6325829" "SRR6325830" "SRR6325831" "SRR6325859" "SRR6325860"
## [11] "SRR6325861" "SRR6325862" "Kingdom"    "Phylum"     "Class"     
## [16] "Order"      "Family"     "Genus"      "Species"

W2.1.2 grep関数

 次に、計12サンプル分のASVごとの出現頻度情報に相当する列(“SRR…”という名前の12列)をdataというオブジェクトに格納します。作業自体はdata <- hoge[, 1:12]でもよいのですが、ここではせっかくですのでgrep関数を利用します。grep関数は、入力が文字列ベクトルの場合、検索したい文字列を含む要素番号を返します。まずやりたいことは、colnames(hoge)という文字列ベクトルの中から、"SRR"という文字列を含む要素番号情報を得ることです。pattern = "SRR"が検索文字列情報、x = colnames(hoge)が被検索対象になります。

colnames(hoge)                            # hogeの列名情報
##  [1] "SRR6325813" "SRR6325815" "SRR6325816" "SRR6325817" "SRR6325828"
##  [6] "SRR6325829" "SRR6325830" "SRR6325831" "SRR6325859" "SRR6325860"
## [11] "SRR6325861" "SRR6325862" "Kingdom"    "Phylum"     "Class"     
## [16] "Order"      "Family"     "Genus"      "Species"
obj <- grep(pattern = "SRR", x = colnames(hoge)) # colnames(hoge)の中から"SRR"という文字列を含む要素番号情報をobjに格納
obj                                       # objの中身を確認
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12

 objの中身は1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12ですので、確かに検索文字列である"SRR"を含む列番号情報を抽出できていることがわかります。

W2.1.3 列の抽出(data

 列数が19のhoge行列の中から、objで指定した列番号のみを抽出した結果をdataオブジェクトに格納します。dim(data)colnames(data)の結果からも、確かに意図通りの列を抽出できていることがわかります。

dim(hoge)                                 # hogeの行数と列数
## [1] 580  19
data <- hoge[, obj]                       # hoge行列中のobjで指定した列のみ抽出した結果をdataに格納
dim(data)                                 # dataの行数と列数
## [1] 580  12
colnames(data)                            # dataの列名情報
##  [1] "SRR6325813" "SRR6325815" "SRR6325816" "SRR6325817" "SRR6325828"
##  [6] "SRR6325829" "SRR6325830" "SRR6325831" "SRR6325859" "SRR6325860"
## [11] "SRR6325861" "SRR6325862"

W2.1.4 列の抽出(genus

 次は、580行 \(\times\) 19列のhogeオブジェクトの中から、Genus列をgenusというオブジェクト名で得ます。hogeオブジェクトがデータフレーム形式であれば(class(hoge)の実行結果が”data.frame”になっていれば)、hoge$Genusのような感じで$を間に挟んで行列hogeの列名情報を指定すれば、任意の列情報を抽出することができます。これは、列名情報がわかっていて列数が多い行列データの場合に、列番号情報を覚えておく必要がない便利な書き方です。

class(hoge)                               # hogeのクラス属性
## [1] "data.frame"
genus <- hoge$Genus                       # hoge中のGenus列を抽出した結果をgenusに格納
head(genus)                               # genus中の最初の6つを表示
## [1] "Neisseria"            "Enterococcus"         "Escherichia-Shigella"
## [4] "Pseudomonas"          NA                     "Acinetobacter"

W2.1.5 列の抽出(species

 次は、580行 \(\times\) 19列のhogeオブジェクトの中から、Species列をspeciesというオブジェクト名で得ます。hogeオブジェクトがデータフレーム形式であれば(class(hoge)の実行結果が”data.frame”になっていれば)、hoge$Speciesのような感じで$を間に挟んで行列hogeの列名情報を指定すれば、任意の列情報を抽出することができます。

class(hoge)                               # hogeのクラス属性
## [1] "data.frame"
species <- hoge$Species                   # hoge中のSpecies列を抽出した結果をspeciesに格納
head(species)                             # species中の最初の6つを表示
## [1] "meningitidis" NA             NA             NA             NA            
## [6] NA

W2.1.6 まとめて実行

 W2.1の必要最小限のスクリプトを以下に示します。

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t")# in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
obj <- grep(pattern = "SRR", x = colnames(hoge)) # colnames(hoge)の中から"SRR"という文字を含む要素番号情報をobjに格納
data <- hoge[, obj]                       # hoge行列中のobjで指定した列のみ抽出した結果をdataに格納
genus <- hoge$Genus                       # hoge中のGenus列を抽出した結果をgenusに格納
species <- hoge$Species                   # hoge中のSpecies列を抽出した結果をspeciesに格納

W2.1.7 W2.1のまとめ

 W2.1で得た結果をまとめると以下のようになります。

  • data:数値行列
    • ASV配列ごとの出現頻度情報であり、出現頻度の総和で降順にソートされている
    • dada2実行結果ファイル(output_JSLAB24.txt)のSRR列の情報
    • nrow(data):行数(ASVの総数)は580
    • ncol(data):列数(サンプル数)は12
  • genus:文字列ベクトル
    • 属の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のGenus列の情報
    • length(genus):要素数(ASVの総数)は580
  • species:文字列ベクトル
    • 種の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のSpecies列の情報
    • length(species):要素数(ASVの総数)は580

W2.2 菌株情報ファイル

 W1.2で読み込んだ菌株情報ファイル(JSLAB23_table1.txt)を再度読み込むところからスタートします。この場合は1列目のOrganism列がとりあえず欲しい情報になりますので、抽出結果をorganismオブジェクトとして得ます。次に、organismオブジェクトの中から、コンマ(,)の右側の菌株名情報を除外し、属名(genus_truth)と種名(species_truth)の情報のみをうまく抽出するのがここでの目的になります。属の場合はgenus_truth(正解情報)とW2.1.6で得たgenusを、そして種の場合はspecies_truth  (正解情報)とW2.1.6で得たspeciesを比較して、dada2実行結果の中にどれくらい計19属(22種)の既知微生物群集HM-280Gevers et al., PLoS Comput Biol., 2012)が含まれているのかなどを評価します。

W2.2.1 read.table関数

 ここでは、W1.2を再度実行した後、colnames関数を用いて行列hogeオブジェクトの列名情報を表示させるところまで行います。read.table関数実行時にheader=TRUEオプションをつけているので、行列hogeに列名が付与されています。

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB23_table1.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t") #in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
dim(hoge)                                 # hogeの行数と列数
## [1] 22  3
colnames(hoge)                            # hogeの列名情報
## [1] "Organism"          "copy_num_16S.rRNA" "RefSeq_ID"

 read.table関数実行時にrow.names=1オプションをつけているので、行列hogeに行名が付与されています。そのため、元ファイルは4列から構成されますが、dim(hoge)で得られる列数は3になります。

W2.2.2 列の抽出(organism

 22行 \(\times\) 3列のhogeオブジェクトの中から、Organism列をorganismというオブジェクト名で得ます。hogeオブジェクトがデータフレーム形式の場合(class(hoge)の実行結果が”data.frame”になっている場合)、hoge$Organismのような感じで$を間に挟んで行列hogeの列名情報を指定すれば、任意の列情報を抽出することができます。

class(hoge)                               # hogeのクラス属性
## [1] "data.frame"
organism <- hoge$Organism                 # hoge中のOrganism列を抽出した結果をorganismに格納
head(organism)                            # organism中の最初の6つを表示
## [1] "Acinetobacter baumannii, strain 5377 "       
## [2] "Actinomyces odontolyticus, strain 1A.21 "    
## [3] "Bacillus cereus, strain NRS 248 "            
## [4] "Bacteroides vulgatus, strain NTC 11154 "     
## [5] "Bifidobacterium adolescentis, strain E194a " 
## [6] "Clostridium beijerinckii, strain NCIMB 8052 "

 organismオブジェクトを眺めると、コンマ(,)の右側が菌株名情報、左側が属名と種名になっていることがわかります。例えば1番目の生物種(Acinetobacter baumannii, strain 5377 )の場合、属名はAcinetobacter、種名はbaumannii、菌株名はstrain 5377だと読み解きます。従って、organismオブジェクトから、属名と種名の情報のみをうまく抽出すれば、W2.1.6で得たgenusspeciesオブジェクトと文字列の完全一致での比較ができます。

W2.2.3 strsplit関数

 第23回のW5.3でも軽く触れていますが、strsplit関数は、文字列ベクトルを入力として、任意の区切り文字で文字列を分割した結果をリスト形式で返します。ここでは、organismオブジェクトを入力として、区切り文字をコンマ(,)にして文字列を分割します。

hoge <- strsplit(x = organism, split = ",")# organism中の文字列ベクトルをコンマで分割した結果をhogeに格納
head(hoge)                                # hoge中の最初の6つを表示
## [[1]]
## [1] "Acinetobacter baumannii" " strain 5377 "          
## 
## [[2]]
## [1] "Actinomyces odontolyticus" " strain 1A.21 "           
## 
## [[3]]
## [1] "Bacillus cereus"  " strain NRS 248 "
## 
## [[4]]
## [1] "Bacteroides vulgatus" " strain NTC 11154 "  
## 
## [[5]]
## [1] "Bifidobacterium adolescentis" " strain E194a "              
## 
## [[6]]
## [1] "Clostridium beijerinckii" " strain NCIMB 8052 "

 分割後は、「属名 種名」と「菌株名」にうまく分かれています。

W2.2.4 sapply関数

 第23回のW5.4と全く同じ使い方ですが、sapply関数は、リスト形式のオブジェクトに対して逐次的な処理を行いたい場合に用いられます。ベクトル中の指定した位置の情報を抽出する[という関数を実行し、(1番目の要素を抽出したいので)1という情報をオプションとして与えています。

hoge2 <- sapply(X = hoge, FUN = `[`, 1)   # hoge中のベクトル形式の各要素から、1番目の要素の抽出結果をhoge2に格納
head(hoge2)                               # hoge2中の最初の6つを表示
## [1] "Acinetobacter baumannii"      "Actinomyces odontolyticus"   
## [3] "Bacillus cereus"              "Bacteroides vulgatus"        
## [5] "Bifidobacterium adolescentis" "Clostridium beijerinckii"

W2.2.5 再度strsplit関数

 さきほど得たhoge2オブジェクトは「属名 種名」となってます。さらにこれを分割すべく、ここでは、hoge2オブジェクトを入力として、区切り文字を半角スペース( )にして文字列を分割した結果をhoge3として得ます。

hoge3 <- strsplit(x = hoge2, split = " ")# hoge2中の文字列ベクトルを半角スペースで分割した結果をhoge3に格納
head(hoge3)                              # hoge3中の最初の6つを表示
## [[1]]
## [1] "Acinetobacter" "baumannii"    
## 
## [[2]]
## [1] "Actinomyces"   "odontolyticus"
## 
## [[3]]
## [1] "Bacillus" "cereus"  
## 
## [[4]]
## [1] "Bacteroides" "vulgatus"   
## 
## [[5]]
## [1] "Bifidobacterium" "adolescentis"   
## 
## [[6]]
## [1] "Clostridium"  "beijerinckii"

W2.2.6 再度sapply関数

 W2.2.4と同じノリですが、hoge3を入力として、1番目の要素を属名、2番目の要素を種名として得ます。今取り扱っているのは、計19属(22種)の既知微生物群集HM-280Gevers et al., PLoS Comput Biol., 2012)の情報です。つまり、ここで得る属名と種名が、dada2実行結果にどれだけ含まれているかを調べるための答え合わせ用の正解情報になります。従って、ここではそれぞれのオブジェクト名をgenus_truthspecies_truthとします。こうすることで、dada2実行結果として得た580個の要素からなる属名情報のgenusおよび種名情報のspeciesと区別することができます。

genus_truth <- sapply(X = hoge3, FUN = `[`, 1)  # hoge3中のベクトル形式の各要素から、1番目の要素の抽出結果をgenus_truthに格納
species_truth <- sapply(X = hoge3, FUN = `[`, 2)# hoge3中のベクトル形式の各要素から、2番目の要素の抽出結果をspecies_truthに格納
head(genus_truth)                         # genus_truth中の最初の6つを表示
## [1] "Acinetobacter"   "Actinomyces"     "Bacillus"        "Bacteroides"    
## [5] "Bifidobacterium" "Clostridium"
head(species_truth)                       # species_truth中の最初の6つを表示
## [1] "baumannii"     "odontolyticus" "cereus"        "vulgatus"     
## [5] "adolescentis"  "beijerinckii"

W2.2.7 unique関数

 連載第23回の表1、および計19属(22種)の既知微生物群集HM-280Gevers et al., PLoS Comput Biol., 2012)という言葉からも想像がつきますが、計22個の要素からなるspecies_truth中のユニークな要素数は22個です。その一方で、計22個の要素からなるgenus_truth中のユニークな要素数は19個です。この理由は、18~19番目が同じStaphylococcus属、20~22番目が同じStreptococcus属だからです。第24回のW3.3.5でも利用していますが、unique関数は、入力ベクトル中のユニークな要素を返します。ここではそれを利用して、unique関数をもう一度同じオブジェクト名で上書き保存するテクニックを使って(その分不可逆にはなりますが…)、任意のベクトルをユニークな要素のみにします。

length(genus_truth)                       # genus_truth中の要素数
## [1] 22
length(species_truth)                     # species_truth中の要素数
## [1] 22
genus_truth                               # genus_truthを確認
##  [1] "Acinetobacter"     "Actinomyces"       "Bacillus"         
##  [4] "Bacteroides"       "Bifidobacterium"   "Clostridium"      
##  [7] "Deinococcus"       "Enterococcus"      "Escherichia"      
## [10] "Helicobacter"      "Lactobacillus"     "Listeria"         
## [13] "Neisseria"         "Porphyromonas"     "Propionibacterium"
## [16] "Pseudomonas"       "Rhodobacter"       "Staphylococcus"   
## [19] "Staphylococcus"    "Streptococcus"     "Streptococcus"    
## [22] "Streptococcus"
species_truth                             # species_truthを確認
##  [1] "baumannii"     "odontolyticus" "cereus"        "vulgatus"     
##  [5] "adolescentis"  "beijerinckii"  "radiodurans"   "faecalis"     
##  [9] "coli"          "pylori"        "gasseri"       "monocytogenes"
## [13] "meningitides"  "gingivalis"    "acnes"         "aeruginosa"   
## [17] "sphaeroides"   "aureus"        "epidermidis"   "agalactiae"   
## [21] "mutans"        "pneumoniae"
unique(genus_truth)                       # genus_truth中のユニークな要素
##  [1] "Acinetobacter"     "Actinomyces"       "Bacillus"         
##  [4] "Bacteroides"       "Bifidobacterium"   "Clostridium"      
##  [7] "Deinococcus"       "Enterococcus"      "Escherichia"      
## [10] "Helicobacter"      "Lactobacillus"     "Listeria"         
## [13] "Neisseria"         "Porphyromonas"     "Propionibacterium"
## [16] "Pseudomonas"       "Rhodobacter"       "Staphylococcus"   
## [19] "Streptococcus"
unique(species_truth)                     # species_truth中のユニークな要素
##  [1] "baumannii"     "odontolyticus" "cereus"        "vulgatus"     
##  [5] "adolescentis"  "beijerinckii"  "radiodurans"   "faecalis"     
##  [9] "coli"          "pylori"        "gasseri"       "monocytogenes"
## [13] "meningitides"  "gingivalis"    "acnes"         "aeruginosa"   
## [17] "sphaeroides"   "aureus"        "epidermidis"   "agalactiae"   
## [21] "mutans"        "pneumoniae"
genus_truth <- unique(genus_truth)        # genus_truth中のユニークな要素をgenus_truthに格納
species_truth <- unique(species_truth)    # species_truth中のユニークな要素をspecies_truthに格納
length(genus_truth)                       # genus_truth中の要素数
## [1] 19
length(species_truth)                     # species_truth中の要素数
## [1] 22

 上記では、unique関数実行結果が不変のspecies_truthも意図的に含めています。これは、全体を統一的な書き方にすることを意図しています。unique関数実行結果が不変な場合は、含めても特に悪さをしないので書いてもいいのです。このように、念のための確認作業はわりとよくなされます。

W2.2.8 まとめて実行

 W2.2の必要最小限のスクリプトを以下に示します。2行目と4行目で同じオブジェクト名(hoge)を重複して利用していますが、一時利用目的であれば、このように上書きしても特に問題ありません。

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB23_table1.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t") #in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
organism <- hoge$Organism                 # hoge中のOrganism列を抽出した結果をorganismに格納
hoge <- strsplit(x = organism, split = ",")# organism中の文字列ベクトルをコンマで分割した結果をhogeに格納
hoge2 <- sapply(X = hoge, FUN = `[`, 1)   # hoge中のベクトル形式の各要素から、1番目の要素の抽出結果をhoge2に格納
hoge3 <- strsplit(x = hoge2, split = " ") # hoge2中の文字列ベクトルを半角スペースで分割した結果をhoge3に格納
genus_truth <- sapply(X = hoge3, FUN = `[`, 1) # hoge3中のベクトル形式の各要素から、1番目の要素の抽出結果をgenus_truthに格納
species_truth <- sapply(X = hoge3, FUN = `[`, 2)# hoge3中のベクトル形式の各要素から、2番目の要素の抽出結果をspecies_truthに格納
genus_truth <- unique(genus_truth)        # genus_truth中のユニークな要素をgenus_truthに格納
species_truth <- unique(species_truth)    # species_truth中のユニークな要素をspecies_truthに格納

W2.2.9 W2.2のまとめ 

 W2.2で得た結果をまとめると以下のようになります。

  • genus_truth:文字列ベクトル
    • 属の正解情報に相当
    • 連載第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。1番左側の半角スペース手前までの単語。
    • 本来検出したい既知微生物群集HM-280中の属名に相当
    • length(genus_truth):要素数(ユニークな属の数)は19
  • species_truth:文字列ベクトル
    • 種の正解情報に相当
    • 連載第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。最初の半角スペースからコンマ手前までの単語。
    • length(species_truth):要素数(ユニークな種の数)は22

W2.3 まとめて実行

 W2の必要最小限のスクリプトを以下に示します。これは、W2.1.6とW2.2.8をマージしただけです。

# W2.1 dada2実行結果ファイルのほう
in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t")# in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
obj <- grep(pattern = "SRR", x = colnames(hoge)) # colnames(hoge)の中から"SRR"という文字を含む要素番号を抽出した結果をobjに格納
data <- hoge[, obj]                       # hoge行列中のobjで指定した列のみ抽出した結果をdataに格納
genus <- hoge$Genus                       # hoge中のGenus列を抽出した結果をgenusに格納
species <- hoge$Species                   # hoge中のSpecies列を抽出した結果をspeciesに格納

# W2.2 菌株情報ファイルのほう
in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB23_table1.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t") #in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
organism <- hoge$Organism                 # hoge中のOrganism列を抽出した結果をorganismに格納
hoge <- strsplit(x = organism, split = ",")# organism中の文字列ベクトルをコンマで分割した結果をhogeに格納
hoge2 <- sapply(X = hoge, FUN = `[`, 1)   # hoge中のベクトル形式の各要素から、1番目の要素の抽出結果をhoge2に格納
hoge3 <- strsplit(x = hoge2, split = " ") # hoge2中の文字列ベクトルを半角スペースで分割した結果をhoge3に格納
genus_truth <- sapply(X = hoge3, FUN = `[`, 1) # hoge3中のベクトル形式の各要素から、1番目の要素の抽出結果をgenus_truthに格納
species_truth <- sapply(X = hoge3, FUN = `[`, 2)# hoge3中のベクトル形式の各要素から、2番目の要素の抽出結果をspecies_truthに格納
genus_truth <- unique(genus_truth)        # genus_truth中のユニークな要素をgenus_truthに格納
species_truth <- unique(species_truth)    # species_truth中のユニークな要素をspecies_truthに格納

W3 サンプル全体の解析

 ここではまず、連載第24回の図5で見えているdada2実行結果ファイル(output_JSLAB24.txt)のGenus列およびSpecies列から得た「580個の要素からなるgenusおよびspeciesオブジェクト」、そして計12サンプル分のASVごとの出現頻度情報に相当する列(“SRR…”という名前の12列)を格納した「580行 \(\times\) 12列のdataオブジェクト」を主な入力として、dada2実行結果の要約情報を見ていきます(W3.1)。

 連載第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)には、計19属(22種)の既知微生物群集HM-280Gevers et al., PLoS Comput Biol., 2012)に関する情報が含まれています。この情報と突き合わせて、どれだけ本来検出されるべきものが正しく検出できているかを評価していきます。実際に使う情報は、19個の要素からなる文字列ベクトルのgenus_truthオブジェクトと22個の要素からなる文字列ベクトルのspecies_truth オブジェクトになります。

W3.1 dada2実行結果のみ

 まず、dada2実行結果ファイル(output_JSLAB24.txt)の要約情報を見ていきます。重要なのは、予めExcelなどで眺めて全体像を把握しておくことです。これは、どのような結果が得られれば正しく処理されていると判断してよいかを知っておくことと同義です。具体的には、例えば「Genus列よりもSpecies列のほうが圧倒的に”NA”の要素が多い」とか「“NA”というのは第24回のW4でリファレンス配列中にヒットしなかったものに相当する」といったことを理解しておくことです。

W3.1.1 na.omit関数

 na.omit関数は、ベクトルが入力の場合は”NA”ではない要素番号情報を返し、行列が入力の場合は”NA”を含まない行を返します。ここではまず、“NA”の要素数が非常に多いspeciesベクトルを入力として、na.omit関数を実行します。

na.omit(species)                          # speciesから"NA"の要素を除去
##  [1] "meningitidis"       "gingivalis"         "vulgatus"          
##  [4] "odontolyticus"      "radiodurans"        "pylori"            
##  [7] "vulgatus"           "vulgatus"           "mutans"            
## [10] "aerosaccus"         "clevelandensis"     "beijerinckii"      
## [13] "aureus"             "durum"              "mucilaginosa"      
## [16] "maltophilia"        "lwoffii"            "hydrogenalis"      
## [19] "dentocariosa"       "aquatilis"          "vaginae"           
## [22] "melaninogenica"     "mucilaginosa"       "nagyae"            
## [25] "elegans"            "uniformis"          "octavius"          
## [28] "magna"              "oligocarboniphilum" "timonensis"        
## [31] "carboxydivorans"    "bromii"             "carnosum"          
## [34] "psychrotolerans"    "hominis"            "massiliensis"      
## [37] "salivarius"         "nigrescens"         "geothermalis"      
## [40] "kroppenstedtii"     "stomatis"           "mucilaginosa"      
## [43] "formosensis"        "dankookensis"       "saccharivorans"    
## [46] "neonati"            "profundi"           "perfoetens"        
## [49] "edouardi"           "wisconsinensis"     "caenicola"         
## [52] "massiliensis"       "splanchnicus"       "acetatigenes"      
## [55] "pigrum"             "laidlawii"          "shahii"            
## [58] "gandavensis"        "hartonius"         
## attr(,"na.action")
##   [1]   2   3   4   5   6   8   9  12  13  14  17  20  21  23  24  25  26  27
##  [19]  28  29  30  31  32  33  35  36  37  38  39  40  41  42  43  44  47  48
##  [37]  49  50  51  52  53  56  57  58  59  60  61  62  64  65  67  68  69  71
##  [55]  72  73  74  75  77  78  79  80  81  82  84  85  86  87  88  89  90  91
##  [73]  93  94  95  97  98  99 100 101 102 103 104 105 107 108 109 110 111 112
##  [91] 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
## [109] 133 134 135 137 138 139 140 141 142 143 144 146 147 148 149 151 152 153
## [127] 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
## [145] 172 173 174 175 176 177 178 180 181 183 184 185 186 187 188 189 190 191
## [163] 192 193 194 195 196 197 200 201 202 203 204 205 206 207 208 209 210 211
## [181] 212 213 214 215 216 217 219 220 221 222 223 224 225 226 227 228 230 231
## [199] 233 235 236 237 238 239 240 241 242 243 246 247 248 249 250 251 252 253
## [217] 254 255 256 257 258 259 260 261 262 263 264 265 266 267 269 270 271 272
## [235] 273 274 275 276 277 279 280 281 283 284 285 288 289 290 291 292 293 294
## [253] 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
## [271] 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
## [289] 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 347 348 349
## [307] 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
## [325] 368 369 370 371 372 373 374 375 377 379 380 381 382 383 384 385 386 387
## [343] 388 389 390 391 392 393 394 395 396 397 399 400 401 402 403 405 406 407
## [361] 408 409 411 412 413 414 415 416 417 419 420 422 423 424 425 427 428 429
## [379] 430 431 432 433 434 436 438 439 440 441 442 443 444 445 446 447 448 449
## [397] 450 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
## [415] 469 470 471 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
## [433] 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
## [451] 506 507 508 510 511 512 513 514 515 516 517 518 519 520 521 522 524 525
## [469] 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 543 544
## [487] 545 546 547 548 549 550 551 552 554 555 556 557 558 559 560 561 562 563
## [505] 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
## attr(,"class")
## [1] "omit"

 表示結果とdada2実行結果ファイル(output_JSLAB24.txt)を見比べることで、“NA”でない1番最初の要素がmeningitidis、2番目がgingivalisなのだと解釈します。そして、“NA”でない要素数は59なのだと読み解きます。ちなみに、この”NA”でない要素数は、na.omit(species)実行結果に対して、さらにベクトルの要素数を返すlength関数を実行すれば得られます。この59という数値が、種レベルで系統割り当てできたASV数に相当します。つまり、種レベルだと、580個のASVのうち、59個の系統割り当てができているということです。

length(na.omit(species))                  # species中の"NA"以外の要素数
## [1] 59

 次に、属レベルでどれだけ系統割り当てができたかを調べます。dada2実行結果ファイル(output_JSLAB24.txt)中のGenus列情報に相当するgenusオブジェクトを入力として、同様の解析を行います。

length(na.omit(genus))                    # genus中の"NA"以外の要素数
## [1] 343

 属レベルだと、580個のASVのうち、343個の系統割り当てができていることがわかります。

W3.1.2 自作関数getNonnaNum

 さきほどまでは1つのベクトルを入力として、na.omitからlengthという流れで情報を得ましたが、dada2実行結果ファイル(output_JSLAB24.txt)を直接読み込んだ結果を入力として、列ごとに同様の解析を行うこともできます。そうすることで、Genusよりも高い階級、つまり「界(Kingdom)・門(Phylum)・綱(Class)・目(Order)・科(Family)」)についても系統割り当て結果の全体像が見られます。ここでは、「NAではない(Non-NA)数の情報を得るための関数」という意味で、以下のgetNonnaNum関数を定義します。

getNonnaNum <- function(x) length(na.omit(x))   # "NA"以外の要素数を得るための関数を定義

 自作関数については、第24回ののW1.6.3、W2.5、W2.6などでも解説しています。

W3.1.3 apply関数

 apply関数は、行列を入力として、行ごとや列ごとに任意の処理を行うための関数です。ここでは、apply関数の中で、先ほど自作したgetNonnaNum関数を実行する例を示します。dada2実行結果ファイル(output_JSLAB24.txt)を読み込んだ直後のhogeオブジェクトを入力として(X = hoge)、列ごとに(MARGIN = 2)、getNonnaNum関数を適用する(FUN = getNonnaNum)という書き方にしています。

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t")# in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
result <- apply(X = hoge, MARGIN = 2, FUN = getNonnaNum)# hogeの各列に対して、getNonnaNum関数を実行した結果をresultに格納
result                                    # resultの中身
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##        580        580        580        580        580        580        580 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862    Kingdom     Phylum 
##        580        580        580        580        580        580        568 
##      Class      Order     Family      Genus    Species 
##        558        525        454        343         59

 実行結果であるresultオブジェクトには本来不要な結果も含まれていますが、Genus列やSpecies列の結果も含まれますので、答え合わせになるメリットもあります。実際の作業としては、まずはこれをやって手順や結果に間違いがないことを確認します。例えば、“SRR”から始まる計12サンプルのASVの出現頻度情報部分は、全て580という数値になっていて妥当だと判断します。理由は、ここの元情報は出現頻度なので、0以上の整数なはずであり、原理的にNAの数が1つも含まれないはずだからです。また、界(Kingdom)が580になるのも妥当です。理由は、第24回のW4で行った系統割り当て時に利用したリファレンス配列は、全てバクテリア由来だからです。dada2実行結果ファイル(output_JSLAB24.txt)のKingdom列を実際に眺めてみると、全要素がBacteriaになっていることがわかります。こんな感じで確認しながら進めていく姿勢が大事です。

W3.1.4 grep関数

 先ほどの実行結果には、“SRR”から始まる計12サンプルのASVの出現頻度情報部分の結果も含まれていました。ここでは、“SRR”という文字を含まない列を除外したものに対して、先ほどと同様の作業を実行します。grep関数は、W2.1.2でも利用しましたが、「検索したい文字列を含む、文字列ベクトル中の要素番号」を返すのが基本形です。dada2実行結果ファイル(output_JSLAB24.txt)を読み込んだ直後のhogeオブジェクトの列名情報に相当するのがcolnames(hoge)になりますので、W2.1.2でも利用したgrep関数を利用して、“SRR”という文字を(pattern = "SRR")を含まない(invert = TRUE)要素番号を取得するというテクニックを使っています。得られたobjが「今回抽出したい列番号情報」に相当しますので、apply関数の入力をX = hoge[, obj]とすれば目的を達成できます。

in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t")# in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
obj <- grep(pattern = "SRR", x = colnames(hoge), invert = TRUE)# colnames(hoge)の中から、"SRR"という文字を含まない要素番号をobjに格納
obj                                       # objの中身
## [1] 13 14 15 16 17 18 19
result <- apply(X = hoge[, obj], MARGIN = 2, FUN = getNonnaNum)# hoge[, obj]の各列に対して、getNonnaNum関数を実行した結果をresultに格納
result                                    # resultの中身
## Kingdom  Phylum   Class   Order  Family   Genus Species 
##     580     568     558     525     454     343      59

 ここまでの結果が得られるスクリプトが、一般に論文のSupplementなどで提供されるものになります。このスクリプトだけを最初に見せられると難解なイメージを持たれると思いますが、得たい出力結果と実際の入力情報との兼ね合いで、いろいろと小細工をしないといけないものです。

W3.1.5 table関数

 第24回のW1.6.1でも利用しましたが、table関数は、ベクトルを入力として与えると、要素の種類ごとの出現頻度を返します。それゆえ、table関数実行結果のベクトルの要素数は、入力ベクトル中のユニークな要素数(但しNAは除く)と等しくなります。ここではまず、580個の要素からなるspeciesオブジェクトを入力として実行します。

table(species)                            # species中の要素の種類ごとの出現頻度
## species
##       acetatigenes         aerosaccus          aquatilis             aureus 
##                  1                  1                  1                  1 
##       beijerinckii             bromii          caenicola    carboxydivorans 
##                  1                  1                  1                  1 
##           carnosum     clevelandensis       dankookensis       dentocariosa 
##                  1                  1                  1                  1 
##              durum           edouardi            elegans        formosensis 
##                  1                  1                  1                  1 
##        gandavensis       geothermalis         gingivalis          hartonius 
##                  1                  1                  1                  1 
##            hominis       hydrogenalis     kroppenstedtii          laidlawii 
##                  1                  1                  1                  1 
##            lwoffii              magna        maltophilia       massiliensis 
##                  1                  1                  1                  2 
##     melaninogenica       meningitidis       mucilaginosa             mutans 
##                  1                  1                  3                  1 
##             nagyae            neonati         nigrescens           octavius 
##                  1                  1                  1                  1 
##      odontolyticus oligocarboniphilum         perfoetens             pigrum 
##                  1                  1                  1                  1 
##           profundi    psychrotolerans             pylori        radiodurans 
##                  1                  1                  1                  1 
##     saccharivorans         salivarius             shahii       splanchnicus 
##                  1                  1                  1                  1 
##           stomatis         timonensis          uniformis            vaginae 
##                  1                  1                  1                  1 
##           vulgatus     wisconsinensis 
##                  3                  1
length(table(species))                    # species中のユニークな要素数
## [1] 54

 連載第23回の表1でも示されているとおり、今回のサンプルは計19属(22種)の既知微生物群集(HM-280)から構成されています。従って、この54個という結果を見ただけで、最低でも(54 - 22)個の本来は存在しないはずの生物種が検出されたと解釈します。「最低でも」とわざわざ書いたのは、現時点ではこの22種全てを正しく検出できているかどうかが不明だからです。

 なお、この54という数値は、以下でも得られます。na.omit関数を挟んでいるのは、まずは”NA”の結果を除外しておきたいからです。もしlength(unique(species))と書くと、“NA”の出現回数の結果も含まれてしまうため、55という数値になって、上記と合わなくなるからです。このように、関数によってデフォルトの”NA”への対処方針は異なりますのでご注意ください。

length(unique(na.omit(species)))          # speciesベクトル中のユニークな要素数
## [1] 54

 次に、580個の要素からなるgenusオブジェクトを入力として実行します。この222個という結果を見ただけで、最低でも(222 - 19)個の本来は存在しないはずの属が検出されたと解釈します。    

length(table(genus))                      # genusベクトル中のユニークな要素数
## [1] 222

W3.1.6 W3.1のまとめ

 W3.1で得た結果をまとめると以下のようになります。「“NA”を除く要素数」よりも「“NA”を除くユニークな要素数」が少なくなるのは、ASV配列が微妙に異なっていても、同じ属または種に割り当てられることもあるからだと解釈すればよいです。

  • genus:文字列ベクトル
    • 属の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のGenus列の情報
    • length(genus):要素数(ASVの総数)は580
    • length(na.omit(genus)):“NA”を除く要素数(系統割り当てできたASV数)は343
    • length(table(genus)):“NA”を除くユニークな要素数(系統割り当てできたユニークな属の数)は222
  • species:文字列ベクトル
    • 種の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のSpecies列の情報
    • length(species):要素数(ASVの総数)は580
    • length(na.omit(species)):“NA”を除く要素数(系統割り当てできたASV数)は59
    • length(table(species)):“NA”を除くユニークな要素数(系統割り当てできたユニークな種の数)は54

W3.2 性能評価(重複なし)

 W3.1では、dada2実行結果として得られた580個のASV配列のうち、属レベルでは343個(ユニークな属の数は222個)、種レベルでは59個(ユニークな種の数は54個)について系統割り当てが行われたことを主に確認しました。ここでは、連載第23回の表1の、計19属(22種)の既知微生物群集(HM-280)をどれだけ検出できているかを調べます。例えば、属レベルの系統割り当て結果である222個のユニークな属数の中に、HM-280に属する計19属が全て含まれていれば、全て正しく検出できた(感度100%)と評価します。また、dada2結果の中にHM-280に属する計19属以外の余計なものが含まれていないかどうかも重要な指標といえます。もしdada2実行結果のASV配列全てがこの計19属のみから構成されていれば、適合率100%ということになります。ここでは、具体的な計算方法を含めて解説していきます。なお、用いる既知微生物群集情報は、W2.2で取得した以下の2つの文字列ベクトルです。

  • genus_truth:文字列ベクトル
    • 属の正解情報に相当
    • 第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。1番左側の半角スペース手前までの単語。
    • 本来検出したい既知微生物群集HM-280中の属名に相当
    • length(genus_truth):要素数(ユニークな属の数)は19
  • species_truth:文字列ベクトル
    • 種の正解情報に相当
    • 第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。最初の半角スペースからコンマ手前までの単語。
    • length(species_truth):要素数(ユニークな種の数)は22

 上記2つの正解情報が格納されたベクトルに対して、W2.1で得た以下の2つの予測結果(dada2実行結果)が格納されたベクトルと一致するものがあるかを調べるのがここでの作業になります。

  • genus:文字列ベクトル
    • 属の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のGenus列の情報
    • length(genus):要素数(ASVの総数)は580
    • length(na.omit(genus)):“NA”を除く要素数(系統割り当てできたASV数)は343
    • length(table(genus)):“NA”を除くユニークな要素数(系統割り当てできたユニークな属の数)は222
  • species:文字列ベクトル
    • 種の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のSpecies列の情報
    • length(species):要素数(ASVの総数)は580
    • length(na.omit(species)):“NA”を除く要素数(系統割り当てできたASV数)は59
    • length(table(species)):“NA”を除くユニークな要素数(系統割り当てできたユニークな種の数)は54

W3.2.1 is.element関数

 is.element関数は、2つのベクトル(例:xy)を入力として与えると、x中の要素ごとに、y中の要素と一致するものがあるかどうかを論理値(TRUE or FALSE)で返します。ここではまず、以下に示す2つの文字列ベクトルで考えます。

x <- c("A", "C", "D", "F", "J", "J")      # 文字列ベクトルを作成してxに格納
y <- c("J", "C", "C", "G", "B")           # 文字列ベクトルを作成してyに格納

 is.element関数は、与えるベクトルの順番を気にする必要があります。例えば以下のようにis.element(x, y)として実行すると、実行結果の要素数は6になります。つまり、xの要素数と同じということです。なお、is.element(x, y)x %in% yは同義です。出力結果の1番目の要素がFALSEになっているのは、x中の1番目の要素である”A”と同じものがyには存在しないことを意味します。同様に、出力結果の2番目の要素がTRUEになっているのは、x中の2番目の要素である”C”と同じものがyにも存在することを意味します。

is.element(x, y)                          # x中の各要素がyに含まれるか判定
## [1] FALSE  TRUE FALSE FALSE  TRUE  TRUE
x %in% y                                  # x中の各要素がyに含まれるか判定
## [1] FALSE  TRUE FALSE FALSE  TRUE  TRUE

 xyを入れ替えてis.element(y, x)として実行すると、実行結果の要素数は5になります。なお、is.element(y, x)y %in% xは同義です。出力結果の1番目の要素がTRUEになっているのは、y中の1番目の要素である”J”と同じものがxにも存在することを意味します。同様に、出力結果の5番目の要素がFALSEになっているのは、y中の5番目の要素である”B”と同じものがxには存在しないことを意味します。

is.element(y, x)                          # y中の各要素がxに含まれるか判定
## [1]  TRUE  TRUE  TRUE FALSE FALSE
y %in% x                                  # y中の各要素がxに含まれるか判定
## [1]  TRUE  TRUE  TRUE FALSE FALSE

W3.2.2 感度(属レベル)

 is.element関数を以下のように利用すれば、計19属のうち、どれを正しく検出できて、どれを検出できなかったかを調べることができます。genus_truthは、属の正解情報に相当する文字列ベクトルであり、要素数は19です。genusは、属の予測結果に相当する文字列ベクトルであり、要素数は580です。

obj <- is.element(genus_truth, genus)     # genus_truth中の各要素がgenusに含まれるか判定した結果をobjに格納
obj                                       # objの中身
##  [1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
## [13]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE

 出力結果はTRUE or FALSEから構成される論理値ベクトルであり、要素数はlength(genus_truth)と同じ19です。このベクトル中のTRUEの要素数が正しく検出できた数に相当します。この程度であれば目でもカウントできますが、以下のようにsum関数で15だと分かります。

sum(obj)                                  # obj中のTRUEの要素数
## [1] 15

 この時点で、計19属のうち15属を正しく検出できたことが分かったので、属レベルの検出感度は15 / 19 = 0.7894737になります。感度(sensitivityまたはrecall)は、一般に「陽性と判定されるべきものを正しく陽性と判定する確率」と定義されます。この場合の「陽性(Positive)と判定されるべきもの」がgenus_truth中の19属になります。ここで陽性はdada2で検出された(系統割り当てできた)ユニークな属のことを指し、陰性(Negative)は検出されなかった(NAとなった)属のことを指します。また、「陽性と判定されるべきもののうち、正しく陽性と判定できたもの」のことをTrue Positive (TP)といい ます。この場合、TPの数は15個ということになります。一般に、「陽性と判定されるべきもののうち、正しく陽性と判定できなかった(間違って陰性と判定してしまった)もの」のことをFalse Negative (FN)といいます。従って、残りの4個はFNのカテゴリに含まれることになります。若干省略してTP = 15、FN = 4のように表現すると、感度はTP / (TP + FN)と定義できます。感度の値の取りうる範囲は0~1であり、1に近いほどよいです。

TP <- sum(obj)                            # obj中のTRUEの要素数をTPに格納
FN <- length(genus_truth) - TP            # genus_truthの要素数 - TPをFNに格納
sensitivity <- TP / (TP + FN)             # 感度を計算した結果をsensitivityに格納
sensitivity                               # sensitivityの中身
## [1] 0.7894737

W3.2.3 適合率(属レベル)

 陽性はdada2で検出された(系統割り当てできた)ユニークな属のことを指しますので、「陽性の数」は「dada2で検出された(系統割り当てできた)ユニークな属の数」、つまり222個になります。この222は、TPの15個とそれ以外(本当は検出されるべきではないにもかかわらず、検出してしまったもの)の207個に分割可能です。一般に、この「陽性でない(陰性)と判定すべきにもかかわらず、間違って陽性と判定したもの」のことをFalse Positive (FP)といいます。ここまでで、もう1つの評価指標である、TP / (TP + FP)と定義される適合率(Precision)を算出することができます。TP = 15、FP = 207ですので、属レベルの適合率は15 / (15 + 207) = 0.0675676になります。適合率の値の取りうる範囲は0~1であり、1に近いほどよいです。

FP <- length(table(genus)) - TP           # genusのユニークな要素数 - TPをFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
precision                                 # precisionの中身
## [1] 0.06756757

W3.2.4 感度と適合率の関係

 一般に、感度と適合率はトレードオフの関係にあります。感度を100%に近づけるには、(FPがどれだけ増えてもいいので)とにかくなんでも検出できるようにしてしまえばよいです。具体的には、ASVの絶対数を増やし、系統割り当て時の判定基準を緩めればよいのです。しかしそれはFPの増加を許容することと同義ですので、結果として適合率の低下に寄与します。

 適合率を100%に近づけるには、FPが増えないように「陽性の数(系統割り当てできたユニークな属の数)」を絞ればよいです。具体的にはASVの配列数を減らし、系統割り当て時の判定基準を厳しくすればよいです。しかしそれはTPの減少を許容することと同義ですので、結果的に感度の低下に寄与します。この点を正しく認識して、1つの評価指標だけにこだわるのではなく、(感度と適合率のように)複数の指標を用いて多面的に評価することが重要です。

W3.2.5 names属性

 names属性は、ベクトルなどの各要素に名前を付与することです。以下にW3.2.2を再掲しますが、得られるobjという論理値ベクトルは、要素数が19個あります。

obj <- is.element(genus_truth, genus)     # genus_truth中の各要素がgenusに含まれるか判定した結果をobjに格納
obj                                       # objの中身
##  [1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
## [13]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE

 この中には計4個のFALSEの要素がありますが、具体的な属の名前を知るには、「FALSEは(3, 6, 9, 15)番目の要素だからgenus_truth中の(3, 6, 9, 15)番目の要素と突き合わせて…」といった作業が必要になります。

genus_truth                               # genus_truthの中身
##  [1] "Acinetobacter"     "Actinomyces"       "Bacillus"         
##  [4] "Bacteroides"       "Bifidobacterium"   "Clostridium"      
##  [7] "Deinococcus"       "Enterococcus"      "Escherichia"      
## [10] "Helicobacter"      "Lactobacillus"     "Listeria"         
## [13] "Neisseria"         "Porphyromonas"     "Propionibacterium"
## [16] "Pseudomonas"       "Rhodobacter"       "Staphylococcus"   
## [19] "Streptococcus"

 names属性の付与は、objというベクトルの何番目の要素がどの属名由来なのかがぱっと見でわかるように、要素に名前という属性を付与する作業になります。そうすることで、要素番号情報をイチイチ覚えなくてもよくなり、要素名(この場合は属の名前)で情報を抽出できるようになります。このあたりはread.table関数などを用いてファイルを読み込む際に、header=TRUEとかrow.names=1をつけるのと似たような思想になります。以下は、genus_truthobjのnames属性として付与する例です。このような、ベクトルに対してnames属性を付与するテクニックはよく使われます。

names(obj) <- genus_truth                 # objにgenus_truthをnames属性として付与
obj                                       # objの中身
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##              TRUE              TRUE             FALSE              TRUE 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              TRUE             FALSE              TRUE              TRUE 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##             FALSE              TRUE              TRUE              TRUE 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##              TRUE              TRUE             FALSE              TRUE 
##       Rhodobacter    Staphylococcus     Streptococcus 
##              TRUE              TRUE              TRUE

 このような一目で分かる情報が得られると、例えば以下のような感じで、dada2実行結果ファイル(output_JSLAB24.txt)のGenus列に、“Actinomyces”が文字列検索で引っ掛かってくるであろう行番号の目安が得られたり、“Bacillus”が本当に文字列検索で引っ掛かってこない(integer(0)という結果に相当)ことの確認が可能になります。話の本筋からはそれていますが、このように得られた結果が本当に正しいかを都度検証する姿勢は、ミスを防ぐという意味で非常に重要です。

grep(pattern = "Actinomyces", x = genus)  # genus中の"Actinomyces"のインデックス情報
## [1]  11  90 204
grep(pattern = "Bacillus", x = genus)     # genus中の"Bacillus"のインデックス情報
## integer(0)

W3.2.6 感度(種レベル)

 種レベルの解析も同様であり、計22種のうち、どれを正しく検出できてどれを検出できなかったかを調べることができます。species_truthは、種の正解情報に相当する文字列ベクトルであり、要素数は22です。speciesは、種の予測結果に相当する文字列ベクトルであり、要素数は580です。

obj <- is.element(species_truth, species) # species_truth中の各要素がspeciesに含まれるか判定した結果をobjに格納
obj                                       # objの中身
##  [1] FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE
## [13] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
sum(obj)                                  # obj中のTRUEの要素数
## [1] 8

 この時点で、計22種のうち8種を正しく検出できたので(TP = 8)、種レベルの感度は8 / 22 = 0.3636364になります。感度はTP / (TP + FN)と定義でき、TP = 8、FN = 14になります。なお、分母の(TP + FN)は、「陽性と判定されるべき数(真の陽性数)」ですので、種の正解情報に相当する「ユニークな種の数」になります。

TP <- sum(obj)                            # obj中のTRUEの要素数をTPに格納
FN <- length(species_truth) - TP          # species_truthの要素数 - TPをFNに格納
sensitivity <- TP / (TP + FN)             # 感度を計算した結果をsensitivityに格納
sensitivity                               # sensitivityの中身
## [1] 0.3636364

W3.2.7 適合率(種レベル)

 陽性はdada2で検出された(系統割り当てできた)ユニークな種のことを指しますので、「陽性の数」は「dada2で検出された(系統割り当てできた)ユニークな種の数」、つまり54個になります。この54は、TPの8個とそれ以外(本当は検出されるべきではないにもかかわらず、検出してしまったもの)の46個(つまりFP = 46)に分割可能です。ここまでで、TP / (TP + FP)と定義される適合率(Precision)を算出することができます。種レベルの適合率は、8 / (8 + 46) = 0.1481481になります。

FP <- length(table(species)) - TP         # speciesのユニークな要素数 - TPをFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
precision                                 # precisionの中身
## [1] 0.1481481

W3.2.8 まとめて実行

 W3.2のスクリプトを以下にまとめます。ただし、属レベルの感度と種レベルの感度などを区別する必要があるので、最終的なオブジェクト名は変えています。これを実行するために必要な4つのオブジェクト(genus_truth, genus, species_truth, and species)は、W2.3を実行すれば得られます。

# 属レベルの感度
obj <- is.element(genus_truth, genus)     # genus_truth中の各要素がgenusに含まれるか判定した結果をobjに格納
TP <- sum(obj)                            # obj中のTRUEの要素数をTPに格納
FN <- length(genus_truth) - TP            # genus_truthの要素数 - TPをFNに格納
sensitivity <- TP / (TP + FN)             # 感度を計算した結果をsensitivityに格納
# 属レベルの適合率
FP <- length(table(genus)) - TP           # genusのユニークな要素数 - TPをFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
# オブジェクト名の変更
TP_genus <- TP                            # TPをTP_genusにコピー
FN_genus <- FN                            # FNをFN_genusにコピー
FP_genus <- FP                            # FPをFP_genusにコピー
sensitivity_genus <- sensitivity          # sensitivityをsensitivity_genusにコピー
precision_genus <- precision              # precisionをprecision_genusにコピー

# 種レベルの感度
obj <- is.element(species_truth, species) # species_truth中の各要素がspeciesに含まれるか判定した結果をobjに格納
TP <- sum(obj)                            # obj中のTRUEの要素数をTPに格納
FN <- length(species_truth) - TP          # species_truthの要素数 - TPをFNに格納
sensitivity <- TP / (TP + FN)             # 感度を計算した結果をsensitivityに格納
# 種レベルの適合率
FP <- length(table(species)) - TP         # speciesのユニークな要素数 - TPをFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
# オブジェクト名の変更
TP_species <- TP                          # TPをTP_speciesにコピー
FN_species <- FN                          # FNをFN_speciesにコピー
FP_species <- FP                          # FPをFP_speciesにコピー
sensitivity_species <- sensitivity        # sensitivityをsensitivity_speciesにコピー
precision_species <- precision            # precisionをprecision_speciesにコピー

W3.2.9 W3.2のまとめ

 ここでは、重複なしの性能評価として、属レベルの感度と適合率、種レベルの感度と適合率を算出しました。ここでの「重複なし」は「ユニークな」と同義です。dada2実行結果ファイル(output_JSLAB24.txt)では、ASVの配列が違っていても同じ属や種に割り当てられることがあります。それらを重複カウントせずに、ユニークな属や種の数を調べた上で性能評価を行っています。性能評価指標を算出する際に何をどのように定義したかを正しく把握しておく必要があります。

  • 属レベル(重複なし)
    • 予測結果の陽性数(dada2実行結果として得られたユニークな属の数):222
    • 真の陽性数(既知微生物群集HM-280中の属の数):19
      • 陽性と判定されるべき属のうち、正しく陽性と判定できた属の数(True Positive; TP):15
      • 陽性と判定されるべき属のうち、間違って陰性と判定した属の数(False Negative; FN):4
    • 真の陰性数(今回解析した既知微生物群集HM-280以外の属の数):不明(多数)
      • 陰性と判定されるべき属のうち、正しく陰性と判定できた属の数(True Negative; TN):不明(多数)
      • 陰性と判定されるべき属のうち、間違って陽性と判定した属の数(False Positive; FP):207 (= 222 - 15)
    • 感度(sensitivity):TP / (TP + FN) = 15 / (15 + 4) = 0.7894737
    • 適合率(precision):TP / (TP + FP) = 15 / (15 + 207) = 0.0675676
  • 種レベル(重複なし)
    • 予測結果の陽性数(dada2実行結果として得られたユニークな種の数):54
    • 真の陽性数(既知微生物群集HM-280中の種の数):22
      • 陽性と判定されるべき種のうち、正しく陽性と判定できた種の数(True Positive; TP):8
      • 陽性と判定されるべき種のうち、間違って陰性と判定した種の数(False Negative; FN):14
    • 真の陰性数(今回解析した既知微生物群集HM-280以外の種の数):不明(多数)
      • 陰性と判定されるべき種のうち、正しく陰性と判定できた種の数(True Negative; TN):不明(多数)
      • 陰性と判定されるべき種のうち、間違って陽性と判定した種の数(False Positive; FP):46 (= 54 - 8)
    • 感度(sensitivity):TP / (TP + FN) = 8 / (8 + 4) = 0.3636364
    • 適合率(precision):TP / (TP + FP) = 8 / (8 + 46) = 0.1481481

W3.3 性能評価(重複あり)

 W3.2では、dada2実行結果として得られた580個のASV配列のうち、222個の系統割り当てできたユニークな属の数と54個の系統割り当てできたユニークな種の数をベースとして性能評価を行いました。ここでは、343個の系統割り当てできた(重複を含む)属の数と59個の系統割り当てできた(重複を含む)種の数をベースとして性能評価を行います。なお、ここでは感度は算出せず、適合率のみ算出します。理由は、適合率はTP / (TP + FP) として計算されますが、その基礎情報であるTPとFPはともに重複ありで等価にカウント可能だからです。その一方で、感度はTP / (TP + FN) として計算されますが、FNは重複の有無にかかわらず属レベルでは常に4、種レベルでは常に14になり(W3.2.9)、原理的に重複(異なる複数のASV配列が同一の属に割り当てられうること)の影響を考慮できないからです。入力として用いる情報はW3.2と同じですが、念のため以下でも再掲します。

  • genus_truth:文字列ベクトル
    • 属の正解情報に相当
    • 第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。1番左側の半角スペース手前までの単語。
    • 本来検出したい既知微生物群集HM-280中の属名に相当
    • length(genus_truth):要素数(ユニークな属の数)は19
  • species_truth:文字列ベクトル
    • 種の正解情報に相当
    • 第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。最初の半角スペースからコンマ手前までの単語。
    • length(species_truth):要素数(ユニークな種の数)は22
  • genus:文字列ベクトル
    • 属の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のGenus列の情報
    • length(genus):要素数(ASVの総数)は580
    • length(na.omit(genus)):“NA”を除く要素数(系統割り当てできたASV数)は343
    • length(table(genus)):“NA”を除くユニークな要素数(系統割り当てできたユニークな属の数)は222
  • species:文字列ベクトル
    • 種の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のSpecies列の情報
    • length(species):要素数(ASVの総数)は580
    • length(na.omit(species)):“NA”を除く要素数(系統割り当てできたASV数)は59
    • length(table(species)):“NA”を除くユニークな要素数(系統割り当てできたユニークな種の数)は54

W3.3.1 適合率(属レベル)

 重複ありの場合は、以下のように書けば属レベルの適合率の値までを一気に得ることができます。

obj <- is.element(genus, genus_truth)     # genus中の各要素がgenus_truthに含まれるか判定した結果をobjに格納
TP <- sum(obj)                            # obj中のTRUEの要素数をTPに格納
FP <- length(na.omit(genus)) - TP         # genusのNAを除く要素数 - TPをFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
precision                                 # precisionの中身
## [1] 0.148688

 W3.2.3との主な違いは、is.element関数の入力として与えている2つのベクトルの順序です。ここでは、580個の要素からなるgenus中の要素1つ1つに対して、それが19個の要素からなるgenus_truth中に存在するかどうかをTRUE or FALSEで判定しています。従って、objの要素数は580個になります。

length(obj)                               # objの要素数
## [1] 580

 objの中身を見ると、全体としてはFALSEがほとんどで、TRUEは最初のほうに偏って存在していることがわかります。この理由は、dada2実行結果ファイル(output_JSLAB24.txt)を眺めるとよくわかると思います。つまり、genus中の要素(ASV)の並びは、計12サンプルの出現頻度の総和が高い順になっているということです。どのサンプルでも検出されるようなASV配列は、本来検出したい既知微生物群集HM-280である確率が高いという直感ともよく一致します。

obj                                       # objの中身
##   [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
##  [25]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE
##  [37] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [49] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [85] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97]  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
## [133]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [397] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
## [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [421] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [433] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [445] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [457] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [481] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [493] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [505] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [517] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [529] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [541] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [553] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [565] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [577] FALSE FALSE FALSE FALSE

 この中のTRUEの要素数が「陽性と判定されるべき属のうち、正しく陽性と判定できた属の数(True Positive; TP)」になります。つまり、TP = 51です。

TP                                        # TPの中身
## [1] 51

 注意点というわけではないですが、objの中で見えているFALSEに対応するASV配列の中には、そもそも系統割り当てできなかったものが(580 - 343) = 237個含まれます。これらの系統割り当てされなかったものは、dada2の予測結果は陰性扱いになります。したがって、「陰性と判定されるべき属のうち、間違って陽性と判定した属の数(False Positive; FP)」は、系統割り当てできたASV数(343個)からTP(51個)を引いた数(= 343 - 51 = 292)になります。つまり、FP = 292です。

FP                                        # FPの中身
## [1] 292

 TP / (TP + FP)で定義される適合率(precision)の値は、冒頭でも示していますが0.148688になります。

precision                                 # precisionの中身
## [1] 0.148688

W3.3.2 最多の重複ASVをもつ属

 ここは少しTips的な話になりますが、以下のようにすれば580個の要素からなるgenusオブジェクトの中から、objがTRUEの要素のみを得ることができます。これは、今回属レベル系統割り当て結果(NA含む)の計580個のASV配列のうち、既知微生物群集HM-280中に存在する計19種類の属名と一致するものを、重複ありでリストアップしていることと同義です。

genus[obj]                                # genus中のobjがTRUEの要素
##  [1] "Neisseria"       "Enterococcus"    "Pseudomonas"     "Acinetobacter"  
##  [5] "Porphyromonas"   "Staphylococcus"  "Listeria"        "Bacteroides"    
##  [9] "Actinomyces"     "Rhodobacter"     "Lactobacillus"   "Streptococcus"  
## [13] "Deinococcus"     "Helicobacter"    "Pseudomonas"     "Bacteroides"    
## [17] "Bacteroides"     "Bifidobacterium" "Streptococcus"   "Streptococcus"  
## [21] "Pseudomonas"     "Porphyromonas"   "Streptococcus"   "Pseudomonas"    
## [25] "Streptococcus"   "Neisseria"       "Acinetobacter"   "Streptococcus"  
## [29] "Pseudomonas"     "Neisseria"       "Actinomyces"     "Acinetobacter"  
## [33] "Neisseria"       "Neisseria"       "Pseudomonas"     "Pseudomonas"    
## [37] "Enterococcus"    "Bacteroides"     "Bacteroides"     "Neisseria"      
## [41] "Actinomyces"     "Streptococcus"   "Porphyromonas"   "Acinetobacter"  
## [45] "Deinococcus"     "Pseudomonas"     "Bacteroides"     "Acinetobacter"  
## [49] "Helicobacter"    "Bacteroides"     "Porphyromonas"

 従って、これをtable関数の入力として実行すると、属の種類ごとの出現頻度が結果として返されます。結果を眺めることで、例えばPseudomonasが最多の重複ASV数をもつ属だということがわかります。

table(genus[obj])                         # genus[obj]中の要素の種類ごとの出現頻度
## 
##   Acinetobacter     Actinomyces     Bacteroides Bifidobacterium     Deinococcus 
##               5               3               7               1               2 
##    Enterococcus    Helicobacter   Lactobacillus        Listeria       Neisseria 
##               2               2               1               1               6 
##   Porphyromonas     Pseudomonas     Rhodobacter  Staphylococcus   Streptococcus 
##               4               8               1               1               7

 この結果を入力として、sort関数をdecreasing = Tオプションをつけて実行すれば、出現頻度の多い順(降順)にソートすることができます。

sort(table(genus[obj]), decreasing = T)   # table(genus[obj])を降順にソート
## 
##     Pseudomonas     Bacteroides   Streptococcus       Neisseria   Acinetobacter 
##               8               7               7               6               5 
##   Porphyromonas     Actinomyces     Deinococcus    Enterococcus    Helicobacter 
##               4               3               2               2               2 
## Bifidobacterium   Lactobacillus        Listeria     Rhodobacter  Staphylococcus 
##               1               1               1               1               1

 decreasing = Tオプションをつけてsort関数を実行した時点で、出力結果の1番目の要素が出現頻度最大のものであることが確定しています。それを利用すれば、以下のように1番右側に[1]を追加するだけで、出現頻度が最大のもののみを抽出可能です。

sort(table(genus[obj]), decreasing = T)[1]# table(genus[obj])中の最多の要素
## Pseudomonas 
##           8

 一連の結果を見ると、W3.2.5で解説したnames属性が最初からつけられていることがわかります。これを利用すれば、以下のように先ほどの結果を入力としてnames関数を実行すれば、出現頻度が最大の属名情報のみを抽出可能です。

names(sort(table(genus[obj]), decreasing = T)[1])# table(genus[obj])中の最多の要素のnames属性
## [1] "Pseudomonas"

W3.3.3 which.max関数

 最初から出現頻度が最大のものがターゲットの場合は、which.max関数も利用できます。which.max関数は、数値ベクトルを入力として与えると、最大値をもつ要素の位置(インデックス)を返します。これは数学記号のarg max(またはargmax)に相当します。「maxならギリギリわかるがarg max(またはargmax)という記号は見ただけでもうムリ!」というヒトも大勢いらっしゃるとは思います。しかし、which.max関数の入力情報と出力結果を見比べれば、「単にtable(genus[obj])の実行結果中の最大値は12番目の要素ですよ。」だと言っているだけということに気づけます。argmaxやargminはバイオインフォマティクス系の論文でよく出現します(例えばOsabe et al., BMC Bioinformatics, 2021ではargminが出ます)ので、このような例を突破口として数学記号にも慣れていくとよいです。

table(genus[obj])                         # genus[obj]中の要素の種類ごとの出現頻度
## 
##   Acinetobacter     Actinomyces     Bacteroides Bifidobacterium     Deinococcus 
##               5               3               7               1               2 
##    Enterococcus    Helicobacter   Lactobacillus        Listeria       Neisseria 
##               2               2               1               1               6 
##   Porphyromonas     Pseudomonas     Rhodobacter  Staphylococcus   Streptococcus 
##               4               8               1               1               7
which.max(table(genus[obj]))              # table(genus[obj])中の最大値のインデックス
## Pseudomonas 
##          12
names(which.max(table(genus[obj])))       # which.max(table(genus[obj]))のnames属性
## [1] "Pseudomonas"

W3.3.4 関数マニュアル

 以下を実行すると、which.maxwhich.min関数の利用上の注意点もわかると思います。これはwhich.minでの例ですが、実際には最小値の要素は複数存在するのですが、which.min条件を満たす最初の要素のみを返します。ここで見えている4という数値は、条件を満たす最初の属であるBifidobacteriumの要素のインデックス(位置情報)になります。

table(genus[obj])                         #  genus[obj]中の要素の種類ごとの出現頻度
## 
##   Acinetobacter     Actinomyces     Bacteroides Bifidobacterium     Deinococcus 
##               5               3               7               1               2 
##    Enterococcus    Helicobacter   Lactobacillus        Listeria       Neisseria 
##               2               2               1               1               6 
##   Porphyromonas     Pseudomonas     Rhodobacter  Staphylococcus   Streptococcus 
##               4               8               1               1               7
which.min(table(genus[obj]))              # table(genus[obj])中の最小値のインデックス
## Bifidobacterium 
##               4

 この事実を理解した上で?which.minhelp(which.min)などで関数のマニュアルを見ると、例えばDescription部分で「Determines the location, i.e., index of the (first) minimum or maximum of a numeric (or logical) vector.」と書かれている意味がよくわかると思います。このあたりは通常は読み飛ばしてしまうものですが、いろいろと自分で動作確認しながら進めていく姿勢が大事です。

 また、上の実行結果をみると、「which.minの実体は、sort結果の1番目の要素抽出だな」というにも気づけると思います。このようなwhich.minの内部で実際に動いている関数の挙動を想像できるようになれば、プログラム開発者の思考回路に近づいていけます。なお、ここで見えている1という数値は、条件を満たす最初の属であるBifidobacteriumの要素の出現頻度になります。

sort(table(genus[obj]))[1]                # table(genus[obj])中の最小の要素
## Bifidobacterium 
##               1

W3.3.5 適合率(種レベル)

 重複ありの場合は、以下のように書けば種レベルの適合率の値までを一気に得ることができます。

obj <- is.element(species, species_truth) # species中の各要素がspecies_truthに含まれるか判定した結果をobjに格納
TP <- sum(obj)                            # obj中のTRUEの要素数をTPに格納
FP <- length(na.omit(species)) - TP       # speciesのNAを除く要素数 - TPをFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
precision                                 # precisionの中身
## [1] 0.1694915

 W3.2.7との主な違いは、is.element関数の入力として与えている2つのベクトルの順序です。ここでは、580個の要素からなるspecies中の要素1つ1つに対して、それが22個の要素からなるspecies_truth中に存在するかどうかをTRUE or FALSEで判定しています。従って、objの要素数は580個になります。

length(obj)                               # objの要素数
## [1] 580

 objの中身を見ると、全体としてはFALSEがほとんどで、TRUEは最初のほうに偏って存在していることがわかります。この理由は、dada2実行結果ファイル(output_JSLAB24.txt)を眺めるとよくわかると思います。つまり、species中の要素(ASV)の並びは、計12サンプルの出現頻度の総和が高い順になっているということです。どのサンプルでも検出されるようなASV配列は、本来検出したい既知微生物群集HM-280である確率が高いという直感ともよく一致します。

obj                                       # objの中身
##   [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
##  [13] FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE
##  [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [49] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [397] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [421] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [433] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [445] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [457] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [481] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [493] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [505] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [517] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [529] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [541] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [553] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [565] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [577] FALSE FALSE FALSE FALSE

 この中のTRUEの要素数が「陽性と判定されるべき種のうち、正しく陽性と判定できた種の数(True Positive; TP)」になります。つまり、TP = 10です。

TP                                        # TPの中身
## [1] 10

 注意点というわけではないですが、objの中で見えているFALSEに対応するASV配列の中には、そもそも系統割り当てできなかったものが(580 - 59) = 521個含まれます。これらの系統割り当てされなかったものは、dada2の予測結果は陰性扱いになります。したがって、「陰性と判定されるべき種のうち、間違って陽性と判定した種の数(False Positive; FP)」は、系統割り当てできたASV数(59個)からTP(10個)を引いた数(= 59 - 10 = 49)になります。つまり、FP = 49です。

FP                                        # FPの中身
## [1] 49

 TP / (TP + FP)で定義される適合率(precision)の値は、冒頭でも示していますが0.1694915になります。

precision                                 # precisionの中身
## [1] 0.1694915

 なお、計10個のTPの内訳(どの種が何回割り当てられたか)は、下記の通りです。

sort(table(species[obj]), decreasing = T) # table(species[obj])を降順にソート
## 
##      vulgatus        aureus  beijerinckii    gingivalis        mutans 
##             3             1             1             1             1 
## odontolyticus        pylori   radiodurans 
##             1             1             1

W3.3.6 まとめて実行

 W3.3のスクリプトを以下にまとめます。ただし、属レベルの適合率と種レベルの適合率を区別する必要があるので、最終的なオブジェクト名は変えています。これを実行するために必要な4つのオブジェクト(genus_truth, genus, species_truth, and species)は、W2.3を実行すれば得られます。

# 属レベルの適合率
obj <- is.element(genus, genus_truth)     # genus中の各要素がgenus_truthに含まれるか判定した結果をobjに格納
TP <- sum(obj)                            # obj中のTRUEの要素数をTPに格納
FP <- length(na.omit(genus)) - TP         # genusのNAを除く要素数 - TPをFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
# オブジェクト名の変更
TP_genus_dup <- TP                        # TPをTP_genus_dupにコピー
FP_genus_dup <- FP                        # FPをFP_genus_dupにコピー
precision_genus_dup <- precision          # precisionをprecision_genus_dupにコピー

# 種レベルの適合率
obj <- is.element(species, species_truth) # species中の各要素がspecies_truthに含まれるか判定した結果をobjに格納
TP <- sum(obj)                            # obj中のTRUEの要素数をTPに格納
FP <- length(na.omit(species)) - TP       # speciesのNAを除く要素数 - TPをFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
# オブジェクト名の変更
TP_species_dup <- TP                      # TPをTP_species_dupにコピー
FP_species_dup <- FP                      # FPをFP_species_dupにコピー
precision_species_dup <- precision        # precisionをprecision_species_dupにコピー

W3.3.7 W3.3のまとめ

 ここでは、重複ありの性能評価として、属レベルと種レベルの適合率を算出しました。dada2実行結果ファイル(output_JSLAB24.txt)では、ASVの配列が違っていても同じ属や種に割り当てられることがあります。それらをそのまま重複ありでカウントして性能評価を行っています。

  • 属レベル(重複あり)
    • 予測結果の陽性数(dada2実行結果として得られた属の数):343
    • 陽性と判定されるべき属のうち、正しく陽性と判定できた属の数(True Positive; TP):51
    • 陰性と判定されるべき属のうち、間違って陽性と判定した属の数(False Positive; FP):292 (= 343 - 51)
    • 適合率(precision):TP / (TP + FP) = 51 / (51 + 292) = 0.148688
  • 種レベル(重複あり)
    • 予測結果の陽性数(dada2実行結果として得られた種の数):59
    • 陽性と判定されるべき種のうち、正しく陽性と判定できた種の数(True Positive; TP):10
    • 陰性と判定されるべき種のうち、間違って陽性と判定した種の数(False Positive; FP):49 (= 59 - 10)
    • 適合率(precision):TP / (TP + FP) = 10 / (10 + 49) = 0.1694915

 比較しやすいように、W3.2.9のまとめ情報も以下に再掲します。FNとTNの情報が存在しないため同じフォーマットにはしていませんが、重複ありのTPが確かに重複なしよりも多くなっており妥当だと判断できます。また、重複ありの適合率は、属レベル(0.148688 > 0.0675676)・種レベル(0.1694915 > 0.1481481)ともに重複なしよりも高くなっていることが分かります。

  • 属レベル(重複なし)
    • 予測結果の陽性数(dada2実行結果として得られたユニークな属の数):222
    • 真の陽性数(既知微生物群集HM-280中の属の数):19
      • 陽性と判定されるべき属のうち、正しく陽性と判定できた属の数(True Positive; TP):15
      • 陽性と判定されるべき属のうち、間違って陰性と判定した属の数(False Negative; FN):4
    • 真の陰性数(今回解析した既知微生物群集HM-280以外の属の数):不明(多数)
      • 陰性と判定されるべき属のうち、正しく陰性と判定できた属の数(True Negative; TN):不明(多数)
      • 陰性と判定されるべき属のうち、間違って陽性と判定した属の数(False Positive; FP):207 (= 222 - 15)
    • 感度(sensitivity):TP / (TP + FN) = 15 / (15 + 4) = 0.7894737
    • 適合率(precision):TP / (TP + FP) = 15 / (15 + 207) = 0.0675676
  • 種レベル(重複なし)
    • 予測結果の陽性数(dada2実行結果として得られたユニークな種の数):54
    • 真の陽性数(既知微生物群集HM-280中の種の数):22
      • 陽性と判定されるべき種のうち、正しく陽性と判定できた種の数(True Positive; TP):8
      • 陽性と判定されるべき種のうち、間違って陰性と判定した種の数(False Negative; FN):14
    • 真の陰性数(今回解析した既知微生物群集HM-280以外の種の数):不明(多数)
      • 陰性と判定されるべき種のうち、正しく陰性と判定できた種の数(True Negative; TN):不明(多数)
      • 陰性と判定されるべき種のうち、間違って陽性と判定した種の数(False Positive; FP):46 (= 54 - 8)
    • 感度(sensitivity):TP / (TP + FN) = 8 / (8 + 4) = 0.3636364
    • 適合率(precision):TP / (TP + FP) = 8 / (8 + 46) = 0.1481481

W3.4 性能評価(出現頻度含む)

 W3.2は同じ属または種単位で、そしてW3.3はASV配列単位で、既知微生物群集HM-280のものと一致するかどうかの評価を行いました。特に適合率は、属レベル、種レベル、重複の有無にかかわらず全て0.2未満であり、随分低い印象を受けます。これはこれで真実ではありますが、実際にはASV配列ごとに出現頻度情報があり、W3.3.1やW3.3.5のobjベクトル中のTRUEの要素が前半部分に偏っていたことからもわかりますが、出現頻度が高いASVはそれなりに検出できていました。ここでは、dada2実行結果ファイル(output_JSLAB24.txt)のSRR列に相当する計12サンプルの出現頻度の総和をASV配列ごとに算出し、出現頻度を含めて属レベルおよび種レベルの適合率を算出します。

 ここで用いる入力データは下記の通りです。W3.2やW3.3と比べると、dataオブジェクトが増えただけになります。計5つのオブジェクトを用いますが、いずれもW2.3のコピペ実行で得られます。

  • data:数値行列
    • ASV配列ごとの出現頻度情報であり、出現頻度の総和でソートされている
    • dada2実行結果ファイル(output_JSLAB24.txt)のSRR列の情報
    • nrow(data):行数(ASVの総数)は580
    • ncol(data):列数(サンプル数)は12
  • genus:文字列ベクトル
    • 属の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のGenus列の情報
    • length(genus):要素数(ASVの総数)は580
    • length(na.omit(genus)):“NA”を除く要素数(系統割り当てできたASV数)は343
    • length(table(genus)):“NA”を除くユニークな要素数(系統割り当てできたユニークな属の数)は222
  • species:文字列ベクトル
    • 種の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のSpecies列の情報
    • length(species):要素数(ASVの総数)は580
    • length(na.omit(species)):“NA”を除く要素数(系統割り当てできたASV数)は59
    • length(table(species)):“NA”を除くユニークな要素数(系統割り当てできたユニークな種の数)は54
  • genus_truth:文字列ベクトル
    • 属の正解情報に相当
    • 第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。1番左側の半角スペース手前までの単語。
    • 本来検出したい既知微生物群集HM-280中の属名に相当
    • length(genus_truth):要素数(ユニークな属の数)は19
  • species_truth:文字列ベクトル
    • 種の正解情報に相当
    • 第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。最初の半角スペースからコンマ手前までの単語。
    • length(species_truth):要素数(ユニークな種の数)は22

W3.4.1 rowSums関数

 rowSums関数は、数値行列を入力として、行ごとの和を返します。

frequency <- rowSums(data)                # dataの行ごとの総和をfrequencyに格納

 計算手順的に、得られる結果であるfrequencyオブジェクトは、入力行列の行数と同じ数だけの要素からなる数値ベクトルになります。つまり、その要素数は580です。

length(frequency)                         # frequencyの要素数
## [1] 580

 frequencyオブジェクトの最初の3つの要素(n = 3)で確認します。dada2実行結果ファイル(output_JSLAB24.txt)のSRR列で手計算されると分かりますが、計算結果は確かに一致しています。

head(frequency, n = 3)                    # frequency中の最初の3つを表示
## ATCGGAATTACTGGGCGTAAAGCGGGCGCAGACGGTTACTTAAGCAGGATGTGAAATCCCCGGGCTCAACCCGGGAACTGCGTTCTGAACTGGGTGACTCGAGTGTGTCAGAGGGAGGTAGAATTCCACGTGTAGCAGTGAAATGCGTAGAGATGTGGAGGAATACCGATGGCGAAGGCAGCCTCCTGGGACAACACTGACGTTCATGCCCGA 
##                                                                                                                                                                                                                685510 
## TCCGGATTTATTGGGCGTAAAGCGAGCGCAGGCGGTTTCTTAAGTCTGATGTGAAAGCCCCCGGCTCAACCGGGGAGGGTCATTGGAAACTGGGAGACTTGAGTGCAGAAGAGGAGAGTGGAATTCCATGTGTAGCGGTGAAATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGGCTCTCTGGTCTGTAACTGACGCTGAGGCTCGA 
##                                                                                                                                                                                                                493326 
## ATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTGGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAGGTGCGA 
##                                                                                                                                                                                                                484236

 なお、rowSums関数は、W3.1.3で紹介したapply関数をMARGIN = 1およびFUN = sumで実行することと同義です。

hoge <- apply(X = data, MARGIN = 1, FUN = sum)# dataの各行に対して和を計算した結果をhogeに格納
head(hoge, n = 3)                         # hoge中の最初の3つを表示
## ATCGGAATTACTGGGCGTAAAGCGGGCGCAGACGGTTACTTAAGCAGGATGTGAAATCCCCGGGCTCAACCCGGGAACTGCGTTCTGAACTGGGTGACTCGAGTGTGTCAGAGGGAGGTAGAATTCCACGTGTAGCAGTGAAATGCGTAGAGATGTGGAGGAATACCGATGGCGAAGGCAGCCTCCTGGGACAACACTGACGTTCATGCCCGA 
##                                                                                                                                                                                                                685510 
## TCCGGATTTATTGGGCGTAAAGCGAGCGCAGGCGGTTTCTTAAGTCTGATGTGAAAGCCCCCGGCTCAACCGGGGAGGGTCATTGGAAACTGGGAGACTTGAGTGCAGAAGAGGAGAGTGGAATTCCATGTGTAGCGGTGAAATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGGCTCTCTGGTCTGTAACTGACGCTGAGGCTCGA 
##                                                                                                                                                                                                                493326 
## ATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTGGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAGGTGCGA 
##                                                                                                                                                                                                                484236

W3.4.2 is.na関数

 is.na関数は、ベクトルを入力として、要素がNAかどうかをTRUE or FALSEの論理値ベクトルとして返します。これを属の予測結果であるgenusオブジェクトを入力として実行すると、予測結果がNAとなった(dada2で系統割り当てができなかった)ASVに相当する要素をTRUE、そうでない要素をFALSEとした結果が返されます。

obj <- is.na(genus)                       # genusの各要素がNAかどうかの判定結果をobjに格納

 従って、obj中のTRUEの要素数はgenus中の系統割り当てできなかったASV数に対応します。

sum(obj)                                  # obj中のTRUEの要素数
## [1] 237

W3.4.3 論理演算子!

 obj中のFALSEの要素数は、genus中の系統割り当てできたASV数に対応します。この情報が欲しい場合は、論理値ベクトルのTRUEとFALSEを入れ替えてやればよいです。これを実現するには、オブジェクトの左側に!をつけてやればよいです。つまり、論理値ベクトルのTRUEとFALSEを交換したい場合は、論理演算子である!をつければよいです。!objの時点でTRUEとFALSEが入れ替わっています。

sum(!obj)                                 # obj中のFALSEの要素数
## [1] 343

W3.4.4 論理演算子&

 論理演算子&は、要素数が同じ2つ論理値ベクトルを入力として、両方ともTRUEの要素のみをTRUE、それ以外をFALSEとして返します。これを利用すれば、以下の2つの論理値ベクトルを利用して、「系統割り当てはできたが、本来検出したい既知微生物群集HM-280には含まれなかったASVの要素」のみをTRUEとした論理値ベクトルobj_FPを作成することができます。

  • obj_P:dada2で属レベルの系統割り当てができた(NAではない)ASVをTRUE、それ以外をFALSEとした論理値ベクトル
  • obj_TP:「属レベルの系統割り当て結果(genus)が本来検出したい既知微生物群集HM-280genus_truth)に含まれるか否かを判定した論理値ベクトル

 obj_FPは、「属レベルの系統割り当てができた(NAではない)ASVのうち、本来検出したい既知微生物群集HM-280ではないものの位置情報」に相当します。この情報を得るには、obj_P & obj_TPではなくobj_P & !obj_TPとせねばならない点に注意が必要です。「…ではない」なので!obj_TPとせねばならないのです。

obj_P <- !is.na(genus)                    # genusの各要素がNAでないかどうかの判定結果をobj_Pに格納
obj_TP <- is.element(genus, genus_truth)  # genus中の各要素がgenus_truthに含まれるかどうかの判定結果をobj_TPに格納
obj_FP <- obj_P & !obj_TP                 # obj_Pと!obj_TPの両方でTRUEの要素のみをTRUEとした結果をobj_FPに格納

 obj_PのTRUEの要素数は343です。W3.4の冒頭の情報からもある程度想像がつきますが、sum(obj_P)length(na.omit(genus))は、予測結果の陽性数(dada2実行結果として得られた属の数)に相当します。

sum(obj_P)                                # obj_P中のTRUEの要素数
## [1] 343

 obj_TPのTRUEの要素数は51です。これは、W3.3.7の「属レベル(重複あり)」の中の、「陽性と判定されるべき属のうち、正しく陽性と判定できた属の数(True Positive; TP)」に相当します。

sum(obj_TP)                               # obj_TP中のTRUEの要素数
## [1] 51

 obj_FPのTRUEの要素数は292です。これは、W3.3.7の「属レベル(重複あり)」の中の、「陰性と判定されるべき属のうち、間違って陽性と判定した属の数(False Positive; FP)」に相当します。この数自体は、sum(obj_P) - sum(obj_TP) = 343 - 51からも簡単に算出できます。

sum(obj_FP)                               # obj_FP中のTRUEの要素数
## [1] 292

W3.4.5 適合率(属レベル)

 出現頻度を加味した属レベルの適合率は、以下のような感じで算出します。最初の4行は、おさらいです。

frequency <- rowSums(data)                # dataの行ごとの総和をfrequencyに格納
obj_P <- !is.na(genus)                    # genusの各要素がNAでないかどうかの判定結果をobj_Pに格納
obj_TP <- is.element(genus, genus_truth)  # genus中の各要素がgenus_truthに含まれるかどうかの判定結果をobj_TPに格納
obj_FP <- obj_P & !obj_TP                 # obj_Pと!obj_TPの両方でTRUEの要素のみをTRUEとした結果をobj_FPに格納

TP <- sum(frequency[obj_TP])              # obj_TPがTRUEのfrequencyの総和を計算した結果をTPに格納
FP <- sum(frequency[obj_FP])              # obj_FPがTRUEのfrequencyの総和を計算した結果をFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
precision                                 # precisionの中身
## [1] 0.8066153

 出現頻度情報を加味した属レベルの適合率は0.8066153となり、W3.3で行った「出現頻度情報を加味しない、重複あり属レベルの適合率(0.148688)」と比べて非常に高いことが分かります。この理由は、「陽性と判定されるべき属のうち、正しく陽性と判定できた属」の出現頻度の総和(TP)が、「陰性と判定されるべき属のうち、間違って陽性と判定した属」の出現頻度の総和(FP)よりもかなり多いためです。

TP                                        # TPの中身
## [1] 2057950
FP                                        # FPの中身
## [1] 493390

 W3.3.7やW3.4.4でも示した「陽性と判定されるべき属のうち、正しく陽性と判定できた属」の数(sum(obj_TP))と、「陰性と判定されるべき属のうち、間違って陽性と判定した属」の数(sum(obj_FP))の大小関係と比較していただければ、出現頻度情報まで加味することの意味がよくわかると思います。

sum(obj_TP)                               # obj_TP中のTRUEの要素数
## [1] 51
sum(obj_FP)                               # obj_FP中のTRUEの要素数
## [1] 292

W3.4.6 適合率(種レベル)

 出現頻度を加味した種レベルの適合率は、以下のような感じで算出します。

frequency <- rowSums(data)                # dataの行ごとの総和をfrequencyに格納
obj_P <- !is.na(species)                  # speciesの各要素がNAでないかどうかの判定結果をobj_Pに格納
obj_TP <- is.element(species, species_truth) # species中の各要素がspecies_truthに含まれるかどうかの判定結果をobj_TPに格納
obj_FP <- obj_P & !obj_TP                 # obj_Pと!obj_TPの両方でTRUEの要素のみをTRUEとした結果をobj_FPに格納

TP <- sum(frequency[obj_TP])              # obj_TPがTRUEのfrequencyの総和を計算した結果をTPに格納
FP <- sum(frequency[obj_FP])              # obj_FPがTRUEのfrequencyの総和を計算した結果をFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
precision                                 # precisionの中身
## [1] 0.2237251

 出現頻度情報を加味した種レベルの適合率は0.2237251となり、W3.3で行った「出現頻度情報を加味しない、重複あり種レベルの適合率(0.1694915)」と比べて少し高い程度で、それほど変わらないことが分かります。「陽性と判定されるべき種のうち、正しく陽性と判定できた種」の出現頻度の総和(TP)と「陰性と判定されるべき属のうち、間違って陽性と判定した種」の出現頻度の総和(FP)は、下記の通りです。

TP                                        # TPの中身
## [1] 197835
FP                                        # FPの中身
## [1] 686442

 W3.3.7でも示した「陽性と判定されるべき種のうち、正しく陽性と判定できた種」の数(sum(obj_TP))と、「陰性と判定されるべき種のうち、間違って陽性と判定した種」の数(sum(obj_FP))は以下の通りでした。種レベルの場合は、出現頻度情報まで加味しても適合率の値はそれほど変わらない理由は、系統割り当てができた種の絶対数が少ないためといえます。

sum(obj_TP)                               # obj_TP中のTRUEの要素数
## [1] 10
sum(obj_FP)                               # obj_FP中のTRUEの要素数
## [1] 49

W3.4.7 まとめて実行

 W3.4のスクリプトを以下にまとめます。ただし、W3.2.8およびW3.3.6で得られるオブジェクトと区別する必要があるので、最終的なオブジェクト名は変えています。これを実行するために必要な5つのオブジェクト(data, genus_truth, genus, species_truth, and species)は、W2.3を実行すれば得られます。W3.3.6とノリが若干違う点としては、属レベル・種レベルの適合率計算部分のスクリプトを統一すべく、一旦hogeおよびhoge_truthにしています。作業的に誤差範囲という考え方もあるかとは思いますが、このような積み重ねがオブジェクト名変更ミス発生率を下げます。

frequency <- rowSums(data)                # dataの行ごとの総和をfrequencyに格納
# 属レベルの適合率
hoge <- genus                             # genusをhogeにコピー
hoge_truth <- genus_truth                 # genus_truthをhoge_truthにコピー
obj_P <- !is.na(hoge)                     # hogeの各要素がNAでないかどうかの判定結果をobj_Pに格納
obj_TP <- is.element(hoge, hoge_truth)    # hoge中の各要素がhoge_truthに含まれるかどうかの判定結果をobj_TPに格納
obj_FP <- obj_P & !obj_TP                 # obj_Pと!obj_TPの両方でTRUEの要素のみをTRUEとした結果をobj_FPに格納
TP <- sum(frequency[obj_TP])              # obj_TPがTRUEのfrequencyの総和を計算した結果をTPに格納
FP <- sum(frequency[obj_FP])              # obj_FPがTRUEのfrequencyの総和を計算した結果をFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
# オブジェクト名の変更
TP_genus_freq <- TP                       # TPをTP_genus_freqにコピー
FP_genus_freq <- FP                       # FPをFP_genus_freqにコピー
precision_genus_freq <- precision         # precisionをprecision_genus_freqにコピー

# 種レベルの適合率
hoge <- species                           # speciesをhogeにコピー
hoge_truth <- species_truth               # species_truthをhoge_truthにコピー
obj_P <- !is.na(hoge)                     # hogeの各要素がNAでないかどうかの判定結果をobj_Pに格納
obj_TP <- is.element(hoge, hoge_truth)    # hoge中の各要素がhoge_truthに含まれるかどうかの判定結果をobj_TPに格納
obj_FP <- obj_P & !obj_TP                 # obj_Pと!obj_TPの両方でTRUEの要素のみをTRUEとした結果をobj_FPに格納
TP <- sum(frequency[obj_TP])              # obj_TPがTRUEのfrequencyの総和を計算した結果をTPに格納
FP <- sum(frequency[obj_FP])              # obj_FPがTRUEのfrequencyの総和を計算した結果をFPに格納
precision <- TP / (TP + FP)               # 適合率を計算した結果をprecisionに格納
# オブジェクト名の変更
TP_species_freq <- TP                     # TPをTP_species_freqにコピー
FP_species_freq <- FP                     # FPをFP_species_freqにコピー
precision_species_freq <- precision       # precisionをprecision_species_freqにコピー

W3.4.8 W3.4のまとめ

 ここでは、出現頻度を加味した場合の性能評価として、属レベルと種レベルの適合率を算出しました。dada2実行結果ファイル(output_JSLAB24.txt)では、ASVの配列が違っていても同じ属や種に割り当てられることがあります。そして、個々のASV配列は出現頻度情報を持ちます。ここで行ったのは、属名がついたASV配列の総出現頻度(全陽性数 = TP + FP)のうち、計19属(22種)の既知微生物群集HM-280由来の総出現頻度(= TP)がどの程度含まれているのか(つまり適合率)を評価しています。

  • 属レベル
    • 予測結果の陽性数(dada2実行結果として得られた属の総出現頻度):2551340
    • 陽性と判定されるべき属のうち、正しく陽性と判定できた属の総出現頻度(True Positive; TP):2057950
    • 陰性と判定されるべき属のうち、間違って陽性と判定した属の総出現頻度(False Positive; FP):493390
    • 適合率(precision):TP / (TP + FP) = 2057950 / (2057950 + 493390) = 0.8066153
  • 種レベル
    • 予測結果の陽性数(dada2実行結果として得られた種の総出現頻度):884277
    • 陽性と判定されるべき種のうち、正しく陽性と判定できた種の総出現頻度(True Positive; TP):197835
    • 陰性と判定されるべき種のうち、間違って陽性と判定した種の総出現頻度(False Positive; FP):686442
    • 適合率(precision):TP / (TP + FP) = 197835 / (197835 + 686442) = 0.2237251

W3.5 属ごとの出現頻度

 これまでの解析で、計12個のサンプル全体として、計19属から構成される既知微生物群集HM-280中15属がdada2実行結果として検出されています(W3.2.9)。また、系統割り当てによって343個のASV配列に対してNA以外の属名が付与され、そのうち51個が既知微生物群集由来のASVであることが分かっています(W3.3.7)。各ASV配列がもつ出現頻度情報を加味すると、既知微生物群集由来の51個のASVの総出現頻度(2057950)は、それ以外の292個のASVの総出現頻度(493390)よりも大きな値になることも分かっています(W3.4.8)。ここでは、計19属から構成される既知微生物群集HM-280中の個々の属の総出現頻度の情報を得ます。また、計19属以外の属はothersとして1つにまとめます。

W3.5.1 rep関数

 rep関数は、xで指定した値を、timesで指定した回数分だけ生成します。xで指定したhoge1は仮想の(dada2で検出された)属名、timesで指定したhoge2は仮想の出現頻度を表します。“B”を2か所に分けて記載しているのは、異なるASVで同じ属に割り当てられるものを念頭においています。

hoge1 <- c("B", "D", "A", "B")            # 仮想属名情報をhoge1に格納
hoge2 <- c(2, 4, 3, 1)                    # 仮想出現頻度をhoge2に格納
freq <- rep(x = hoge1, times = hoge2)     # hoge1をhoge2の指定回数分生成した結果をfreqに格納
freq                                      # freqの中身
##  [1] "B" "B" "D" "D" "D" "D" "A" "A" "A" "B"

 freqを入力としてtable関数を実行すると、要素の種類ごとの出現頻度が返されます。“B”の出現頻度が意図通り3になっていることがわかります。

table(freq)                               # freq中の要素の種類ごとの出現頻度
## freq
## A B D 
## 3 3 4

W3.5.2 append関数

 append関数は、ベクトルに要素を追加したり、ベクトル同士を連結する際に使われます。これは、出現頻度が0の属は0という結果を得たい場合に利用できるテクニックです。例えば、hoge3が出力結果に含めたい、計4種類の属名情報からなる文字列ベクトルだとします。append関数を用いて、実際の属ごとの出現頻度情報に相当するfreqベクトルとhoge3ベクトルを連結した結果をhoge4とします。これにtable関数を実行すると、得られる出現頻度情報は、本当の出現頻度よりも1多い結果となるものの、実際の出現頻度が0の”C”も1足したおかげで結果に含まれるようになります。

hoge3 <- c("A", "B", "C", "D")            # 出力結果に含めたい属名情報をhoge3に格納
hoge4 <- append(freq, hoge3)              # freqとhoge3を連結した結果をhoge4に格納
table(hoge4)                              # hoge4中の要素の種類ごとの出現頻度
## hoge4
## A B C D 
## 4 4 1 5

 ここまでできれば、あとは以下のようにtable関数実行結果の各要素を全て-1してやれば、出現頻度が本当は0のものも含めつつ、本来の出現頻度として結果を得ることができます。

table(hoge4) - 1                          # hoge4中の要素の種類ごとの出現頻度
## hoge4
## A B C D 
## 3 3 0 4

 これは、計12個のサンプルを合わせた結果でも計19属中15属しかdada2実行結果として検出できていないことから、サンプルごとの結果で属ごとの出現頻度を調べた場合に、出現頻度が0の属をどう取り扱うかが課題になることを念頭において、1つの解決策を提示したものになります。

W3.5.3 15属のみの出現頻度

 本番に近い解析として、ここではW3.5.1に対応する実データ版を示します。最後のtable(freq)の結果からもわかりますが、計19属からなる本来検出したい既知微生物群集HM-280のうち、dada2で検出できた15属のみの出現頻度情報が得られるやり方になります。実行に必要な3つのオブジェクト(data, genus, and genus_truth)は、W2.3を実行すれば得られます。

frequency <- rowSums(data)                # dataの行ごとの総和をfrequencyに格納
obj_TP <- is.element(genus, genus_truth)  # genus中の各要素がgenus_truthに含まれるかどうかの判定結果をobj_TPに格納
hoge1 <- genus[obj_TP]                    # genus[obj_TP]をhoge1にコピー
hoge2 <- frequency[obj_TP]                # frequency[obj_TP]をhoge2にコピー
freq <- rep(x = hoge1, times = hoge2)     # hoge1をhoge2の指定回数分生成した結果をfreqに格納
table(freq)                               # freq中の要素の種類ごとの出現頻度
## freq
##   Acinetobacter     Actinomyces     Bacteroides Bifidobacterium     Deinococcus 
##          178135           22229           44692            2399           11155 
##    Enterococcus    Helicobacter   Lactobacillus        Listeria       Neisseria 
##          493338            8434           15355           35818          685642 
##   Porphyromonas     Pseudomonas     Rhodobacter  Staphylococcus   Streptococcus 
##          109985          376440           19232           37246           17850

 これまでの復習にはなりますが、主なオブジェクトについて以下におさらいします:

  • data:数値行列
    • ASV配列ごとの出現頻度情報であり、出現頻度の総和でソートされている
    • dada2実行結果ファイル(output_JSLAB24.txt)のSRR列の情報
    • nrow(data):行数(ASVの総数)は580
    • ncol(data):列数(サンプル数)は12
  • frequency:数値ベクトル
    • W3.4.1でも示したrowSums関数を用いて、ASV配列ごとの(計12サンプルの)出現頻度の総和
    • 要素数は計12個の)
  • genus:文字列ベクトル
    • 属の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のGenus列の情報
    • length(genus):要素数(ASVの総数)は580
    • length(na.omit(genus)):“NA”を除く要素数(系統割り当てできたASV数)は343
    • length(table(genus)):“NA”を除くユニークな要素数(系統割り当てできたユニークな属の数)は222
  • genus_truth:文字列ベクトル
    • 属の正解情報に相当
    • 第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。1番左側の半角スペース手前までの単語。
    • 本来検出したい既知微生物群集HM-280中の属名に相当
    • length(genus_truth):要素数(ユニークな属の数)は19
    • W3.5.2のhoge3に対応
  • obj_TP:論理値ベクトル
    • genus中の要素1つ1つに対して、それがgenus_truthに含まれるかどうかをTRUE or FALSEで判定した結果
    • length(obj_TP):要素数(ASVの総数)は580
    • sum(obj_TP):TRUEの要素数(本来検出したい既知微生物群集に含まれるASV数)は51
  • genus[obj_TP]:文字列ベクトル
    • genusのうち、obj_TPがTRUEの要素のみを抽出した結果
    • length(genus[obj_TP]):要素数は51
    • W3.5.1のhoge1に対応
  • frequency[obj_TP]:数値ベクトル
    • frequencyのうち、obj_TPがTRUEの要素のみを抽出した結果
    • length(frequency[obj_TP]):要素数は51
    • W3.5.1のhoge2に対応

W3.5.4 19属の出現頻度

 本番の解析として、ここではW3.5.2に対応する実データ版を示します。先ほどのW3.5.3のスクリプトに、最後の2行分を追加しただけです。

frequency <- rowSums(data)                # dataの行ごとの総和をfrequencyに格納
obj_TP <- is.element(genus, genus_truth)  # genus中の各要素がgenus_truthに含まれるかどうかの判定結果をobj_TPに格納
hoge1 <- genus[obj_TP]                    # genus[obj_TP]をhoge1にコピー
hoge2 <- frequency[obj_TP]                # frequency[obj_TP]をhoge2にコピー
freq <- rep(x = hoge1, times = hoge2)     # hoge1をhoge2の指定回数分生成した結果をfreqに格納

hoge4 <- append(freq, genus_truth)        # freqとgenus_truthを連結した結果をhoge4に格納
table(hoge4) - 1                          # hoge4中の要素の種類ごとの出現頻度-1
## hoge4
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##            178135             22229                 0             44692 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              2399                 0             11155            493338 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              8434             15355             35818 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##            685642            109985                 0            376440 
##       Rhodobacter    Staphylococcus     Streptococcus 
##             19232             37246             17850

 以下は、既知微生物群集由来の計51配列の出現頻度の総和が、W3.4.8で見えている値(2057950)と同じであることを確認しているだけです。

sum(table(hoge4) - 1)                     # hoge4中の要素の種類ごとの出現頻度-1
## [1] 2057950

W3.5.5 othersの追加

 W3.5の冒頭で述べたとおり、ここでは「既知微生物群集由来の19属の出現頻度」の数値ベクトルに、「既知微生物群集由来以外の292個のASVの総出現頻度(493390)」を、othersとして追加します。この値は、W3.4.5のFPと同じものになります。従って、ここで示すスクリプトは、先ほどの「W3.5.4で得た計19属分の出現頻度情報を格納した数値ベクトル」に対して、append関数を用いて「W3.4.5のFPに相当する数値」を追加する内容になります。

# W3.5.4
frequency <- rowSums(data)                # dataの行ごとの総和をfrequencyに格納
obj_TP <- is.element(genus, genus_truth)  # genus中の各要素がgenus_truthに含まれるかどうかの判定結果をobj_TPに格納
hoge1 <- genus[obj_TP]                    # genus[obj_TP]をhoge1にコピー
hoge2 <- frequency[obj_TP]                # frequency[obj_TP]をhoge2にコピー
freq <- rep(x = hoge1, times = hoge2)     # hoge1をhoge2の指定回数分生成した結果をfreqに格納
hoge4 <- append(freq, genus_truth)        # freqとgenus_truthを連結した結果をhoge4に格納
hoge5 <- table(hoge4) - 1                 # hoge4中の要素の種類ごとの出現頻度-1をhoge5に格納

# W3.4.5の一部
obj_P <- !is.na(genus)                    # genusの各要素がNAでないかどうかの判定結果をobj_Pに格納
obj_FP <- obj_P & !obj_TP                 # obj_Pと!obj_TPの両方でTRUEの要素のみをTRUEとした結果をobj_FPに格納
others <- sum(frequency[obj_FP])          # obj_FPがTRUEのfrequencyの総和を計算した結果をothersに格納
names(others) <- "Others"                 # othersに"Others"をnames属性として付与

# 連結
hoge6 <- append(hoge5, others)            # hoge5とothersを連結した結果をhoge6に格納
hoge6                                     # hoge6の中身
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##            178135             22229                 0             44692 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              2399                 0             11155            493338 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              8434             15355             35818 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##            685642            109985                 0            376440 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##             19232             37246             17850            493390

 以下は、dada2実行結果として得られた計580配列のうち、系統割り当てできた(NAとならなかった)343配列の出現頻度の総和が、W3.4.8で見えている値(2551340)と同じことを確認しているだけです。

sum(hoge6)
## [1] 2551340

W3.5.6 NAの出現頻度も含める

 さきほどまでの結果は、dada2実行結果として得られた計580配列のうち、系統割り当てできた(NAとならなかった)343配列のみの出現頻度をカウントしました。ここでは、系統割り当てできなかった(NAとなった)ものも全て含めて出現頻度情報を得るやり方を示します。W3.5.4に相当する部分は不変で、W3.4.5のobj_FPを得る部分のみが異なっています。

# W3.5.4
frequency <- rowSums(data)                # dataの行ごとの総和をfrequencyに格納
obj_TP <- is.element(genus, genus_truth)  # genus中の各要素がgenus_truthに含まれるかどうかの判定結果をobj_TPに格納
hoge1 <- genus[obj_TP]                    # genus[obj_TP]をhoge1にコピー
hoge2 <- frequency[obj_TP]                # frequency[obj_TP]をhoge2にコピー
freq <- rep(x = hoge1, times = hoge2)     # hoge1をhoge2の指定回数分生成した結果をfreqに格納
hoge4 <- append(freq, genus_truth)        # freqとgenus_truthを連結した結果をhoge4に格納
hoge5 <- table(hoge4) - 1                 # hoge4中の要素の種類ごとの出現頻度-1をhoge5に格納

# W3.4.5の一部
obj_FP <- !obj_TP                         # obj_TPのTRUEとFALSEを入れ替えた結果をobj_FPに格納
others <- sum(frequency[obj_FP])          # obj_FPがTRUEのfrequencyの総和を計算した結果をothersに格納
names(others) <- "Others"                 # othersに"Others"をnames属性として付与

# 連結
hoge6 <- append(hoge5, others)            # hoge5とothersを連結した結果をhoge6に格納
hoge6                                     # hoge6の中身
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##            178135             22229                 0             44692 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              2399                 0             11155            493338 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              8434             15355             35818 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##            685642            109985                 0            376440 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##             19232             37246             17850            786825

W3.6 より高度な自作関数

 W3では、サンプル全体の解析を行っています。W4ではサンプルごとの解析を行いますが、計12個あるサンプルごとにW3.5.6のような解析を都度実行するのは面倒です。自作関数についてはW3.1.2でも解説していますが、ここではW3.5.6のスクリプトに酷似した自作関数を作成します。

W3.6.1 get_W3.5.6関数

 W3.5.6実行時の入力は、3つのオブジェクト(data, genus, and genus_truth)でした。したがって、ここで作成する自作関数get_W3.5.6の入力もこの3つを指定するように設計しています。それが1行目の記述内容に相当します。また、W3.5.6の主な出力はhoge6でしたので、自作関数get_W3.5.6hoge6の中身を返すように設計しています。それが最終行付近のreturn(hoge6)に相当します。

get_W3.5.6 <- function(data, genus, genus_truth){
  # W3.5.4
  frequency <- rowSums(data)              # dataの行ごとの総和をfrequencyに格納
  obj_TP <- is.element(genus, genus_truth)# genus中の各要素がgenus_truthに含まれるかどうかの判定結果をobj_TPに格納
  hoge1 <- genus[obj_TP]                  # genus[obj_TP]をhoge1にコピー
  hoge2 <- frequency[obj_TP]              # frequency[obj_TP]をhoge2にコピー
  freq <- rep(x = hoge1, times = hoge2)   # hoge1をhoge2の指定回数分生成した結果をfreqに格納
  hoge4 <- append(freq, genus_truth)      # freqとgenus_truthを連結した結果をhoge4に格納
  hoge5 <- table(hoge4) - 1               # hoge4中の要素の種類ごとの出現頻度-1をhoge5に格納
  # W3.4.5
  obj_FP <- !obj_TP                       # obj_TPのTRUEとFALSEを入れ替えた結果をobj_FPに格納
  others <- sum(frequency[obj_FP])        # obj_FPがTRUEのfrequencyの総和を計算した結果をothersに格納
  names(others) <- "Others"               # othersに"Others"をnames属性として付与
  # Concatenate
  hoge6 <- append(hoge5, others)          # hoge5とothersを連結した結果をhoge6に格納
  return(hoge6)                           # hoge6の中身を関数実行結果として返す
}

 ここで入力として想定している3つのオブジェクト(data, genus, and genus_truth)について、復習を兼ねて以下で解説しておきます。

  • data:数値行列
    • ASV配列ごとの出現頻度情報であり、出現頻度の総和でソートされている
    • dada2実行結果ファイル(output_JSLAB24.txt)のSRR列の情報
    • nrow(data):行数(ASVの総数)は580
    • ncol(data):列数(サンプル数)は12
  • genus:文字列ベクトル
    • 属の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のGenus列の情報
    • length(genus):要素数(ASVの総数)は580
    • length(na.omit(genus)):“NA”を除く要素数(系統割り当てできたASV数)は343
    • length(table(genus)):“NA”を除くユニークな要素数(系統割り当てできたユニークな属の数)は222
  • genus_truth:文字列ベクトル
    • 属の正解情報に相当
    • 第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。1番左側の半角スペース手前までの単語。
    • 本来検出したい既知微生物群集HM-280中の属名に相当
    • length(genus_truth):要素数(ユニークな属の数)は19

W3.6.2 get_W3.5.6の実行

 get_W3.5.6関数の実行は、以下のような順番で3つのオブジェクトを入力として与えればよいです。ここでは、出力結果をresultオブジェクトに一旦保存してから中身を確認しています。出力結果はW3.5.6と同じですので、確かにこの関数がうまく機能していることが分かると思います。

result <- get_W3.5.6(data, genus, genus_truth) # 属の出現頻度のまとめ情報を取得してresultに格納
result                                    # resultの中身
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##            178135             22229                 0             44692 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              2399                 0             11155            493338 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              8434             15355             35818 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##            685642            109985                 0            376440 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##             19232             37246             17850            786825

W3.6.3 種ごとの出現頻度

 get_W3.5.6関数は、一見すると属レベルの情報しか受け付けないような印象を受けます。しかし実際には、フォーマットが同じ「種の予測結果に相当するspecies」と「種の正解情報に相当するspecies_truth」を入力として実行することもできます。

result <- get_W3.5.6(data, species, species_truth) # 種の出現頻度のまとめ情報を取得してresultに格納
result                                    # resultの中身
##         acnes  adolescentis    aeruginosa    agalactiae        aureus 
##             0             0             0             0            47 
##     baumannii  beijerinckii        cereus          coli   epidermidis 
##             0            76             0             0             0 
##      faecalis       gasseri    gingivalis  meningitides monocytogenes 
##             0             0        109189             0             0 
##        mutans odontolyticus    pneumoniae        pylori   radiodurans 
##          2081         22200             0          8430         11149 
##   sphaeroides      vulgatus        Others 
##             0         44663       2646940

 出力結果の出現頻度情報をまとめた数値ベクトルは、計22個の種と1個のothersから構成されます。また、「陽性と判定されるべき種のうち、正しく陽性と判定できた種の数(True Positive; TP)」が8であることは既知です(W3.2.6およびW3.2.9)。実際、aureus, beijerinckii, gingivalis, mutans, odontolyticus, pylori, radiodurans, vulgatusの8つが0より大きい出現頻度をもつことが確認できます。get_W3.5.6関数が属の情報だけでなく種の情報も入力として受け付け、正しい結果を返すことができる理由は、W3.6.1で定義したこの関数が内部的に利用している、入力として受け付ける引数(ひきすう)の名前が、たまたまりgenusgenus_truthと属名を連想させるものになっているだけだからです。なお、ここで引数の名前といっているのは、W3.6.1のget_W3.6.1関数定義の先頭行(get_W3.5.6 <- function(data, genus, genus_truth){)で記載しているdata, genus, genus_truthのことです。

W3.6.4 get_W3.5.6_2関数

 ここでは、「引数の名前」がgenusやgenus_truthのような名前である必要はないということを示すべく、先頭行(1行目)をpredictionおよびtruthに変更しています。これに合わせるため、以下の3~8行目のgenusおよびgenus_truthについても、それぞれpredictionおよびtruthに変更しています。

get_W3.5.6_2 <- function(data, prediction, truth){
  # W3.5.4
  frequency <- rowSums(data)              # dataの行ごとの総和をfrequencyに格納
  obj_TP <- is.element(prediction, truth) # prediction中の各要素がtruthに含まれるかどうかの判定結果をobj_TPに格納
  hoge1 <- prediction[obj_TP]             # prediction[obj_TP]をhoge1にコピー
  hoge2 <- frequency[obj_TP]              # frequency[obj_TP]をhoge2にコピー
  freq <- rep(x = hoge1, times = hoge2)   # hoge1をhoge2の指定回数分生成した結果をfreqに格納
  hoge4 <- append(freq, truth)            # freqとtruthを連結した結果をhoge4に格納
  hoge5 <- table(hoge4) - 1               # hoge4中の要素の種類ごとの出現頻度-1をhoge5に格納
  # W3.4.5
  obj_FP <- !obj_TP                       # obj_TPのTRUEとFALSEを入れ替えた結果をobj_FPに格納
  others <- sum(frequency[obj_FP])        # obj_FPがTRUEのfrequencyの総和を計算した結果をothersに格納
  names(others) <- "Others"               # othersに"Others"をnames属性として付与
  # Concatenate
  hoge6 <- append(hoge5, others)          # hoge5とothersを連結した結果をhoge6に格納
  return(hoge6)                           # hoge6の中身を関数実行結果として返す
}

W3.6.5 get_W3.5.6_2の実行

 引数の名前がpredictionおよびtruthに変更されていても、属の場合はgenusおよびgenus_truthに、そして種の場合はspeciesおよびspecies_truthを入力として与えると、適切に処理されることを示します。

get_W3.5.6_2(data, genus, genus_truth)    # 属の出現頻度のまとめ情報を取得
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##            178135             22229                 0             44692 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              2399                 0             11155            493338 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              8434             15355             35818 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##            685642            109985                 0            376440 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##             19232             37246             17850            786825
get_W3.5.6_2(data, species, species_truth)# 種の出現頻度のまとめ情報を取得
##         acnes  adolescentis    aeruginosa    agalactiae        aureus 
##             0             0             0             0            47 
##     baumannii  beijerinckii        cereus          coli   epidermidis 
##             0            76             0             0             0 
##      faecalis       gasseri    gingivalis  meningitides monocytogenes 
##             0             0        109189             0             0 
##        mutans odontolyticus    pneumoniae        pylori   radiodurans 
##          2081         22200             0          8430         11149 
##   sphaeroides      vulgatus        Others 
##             0         44663       2646940

 確かに属の結果はW3.6.2と、そして種の結果はW3.6.3と同じであることがわかります。

W3.6.6 出力内容を増やす

 get_W3.5.6_2get_W3.5.6_2関数は、3種類の入力情報(出現頻度情報を含む数値行列、dada2予測結果の文字列ベクトル、既知微生物群集情報からなる文字列ベクトル)を与えて、既知微生物群集中の属または種ごと(とそれ以外をまとめた)の出現頻度をhoge6オブジェクトにまとめ、それを返す役割を持たせたものでした。しかし、hoge6だけではなく、obj_TPのような予測結果のどの要素が既知微生物群集と合致しているかという論理値ベクトル情報も同時に得たいヒトもいるでしょう。ここでは、出力結果としてhoge6obj_TPの複数の情報をリスト形式で返すget_W3.5.6_3関数を作成します。

get_W3.5.6_3 <- function(data, prediction, truth){
  # W3.5.4
  frequency <- rowSums(data)              # dataの行ごとの総和をfrequencyに格納
  obj_TP <- is.element(prediction, truth) # prediction中の各要素がtruthに含まれるかどうかの判定結果をobj_TPに格納
  hoge1 <- prediction[obj_TP]             # prediction[obj_TP]をhoge1にコピー
  hoge2 <- frequency[obj_TP]              # frequency[obj_TP]をhoge2にコピー
  freq <- rep(x = hoge1, times = hoge2)   # hoge1をhoge2の指定回数分生成した結果をfreqに格納
  hoge4 <- append(freq, truth)            # freqとtruthを連結した結果をhoge4に格納
  hoge5 <- table(hoge4) - 1               # hoge4中の要素の種類ごとの出現頻度-1をhoge5に格納
  # W3.4.5
  obj_FP <- !obj_TP                       # obj_TPのTRUEとFALSEを入れ替えた結果をobj_FPに格納
  others <- sum(frequency[obj_FP])        # obj_FPがTRUEのfrequencyの総和を計算した結果をothersに格納
  names(others) <- "Others"               # othersに"Others"をnames属性として付与
  # Concatenate
  hoge6 <- append(hoge5, others)          # hoge5とothersを連結した結果をhoge6に格納

  # output
  rtn <- list()                           # 結果をリスト形式で返すためのrtnを作成
  rtn$freque <- hoge6                     # hoge6をfrequeという名前で追加
  rtn$TPposi <- obj_TP                    # obj_TPをTPposiという名前で追加
  return(rtn)                             # rtnの中身を関数実行結果として返す
}

 get_W3.5.6_2関数との違いは、最後の5行分のみです。hoge6obj_TPは同じベクトルではありますが、要素数は異なります。それゆえ、ここでは要素数が異なる場合でも情報を格納できるリスト形式にしています。rtn <-list()は、「listという関数を用いて中身が空のリスト形式のオブジェクトを作成し、それをrtnという名前で保存しているのだ。」と理解すればよいです。以降は後で取り出したい情報を、どのような名前で格納するかを併せて指定して、順次rtnに格納していくだけです。ここでは、hoge6の情報をfrequeという名前で格納しています。また、obj_TPの情報をTPposiという名前で格納しています。rtnというのは、リターン(return)するものというのを念頭においています。W3.6.4で解説したことと関連しますが、関数内部で用いているオブジェクト名は基本的になんでもよいいので、必ずしもrtnである必要はありません。但し、frequeTPposi`は関数実行後も継承されますのでご注意ください。

W3.6.7 get_W3.5.6_3の実行

 get_W3.5.6_3関数の実行は、get_W3.5.6get_W3.5.6_2と同じです。ここでは、属の情報(genusgenus_truth)を入力として与えて実行し、結果をresというオブジェクトに格納しています。

res <- get_W3.5.6_3(data, genus, genus_truth) # 属の出現頻度のまとめ情報を取得してresに格納
res                                       # resの中身
## $freque
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##            178135             22229                 0             44692 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              2399                 0             11155            493338 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              8434             15355             35818 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##            685642            109985                 0            376440 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##             19232             37246             17850            786825 
## 
## $TPposi
##   [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
##  [25]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE
##  [37] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [49] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [85] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97]  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
## [133]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [397] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
## [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [421] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [433] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [445] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [457] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [481] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [493] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [505] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [517] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [529] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [541] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [553] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [565] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [577] FALSE FALSE FALSE FALSE

 resの出力結果を眺めると、最初にhoge6の中身に相当する「既知微生物群集中の属とそれ以外をまとめた出現頻度」情報が$frequeという部分に、そしてobj_TPの中身に相当する「予測結果のどの要素が既知微生物群集と合致しているかという論理値ベクトル」情報が$TPposiという部分に格納されていることが分かります。これを眺めれば、前述の「但し、frequeTPposiは関数実行後も継承されますのでご注意ください。」の意味がよくわかると思います。

W3.6.8 str関数

 str関数は、入力として与えられたオブジェクトの構造(structure)を返します。通常は、ここの表示結果を頼りにして、どのようにして欲しい情報を抽出するかを判断します。

str(res)                                  # resの構造を表示
## List of 2
##  $ freque: Named num [1:20] 178135 22229 0 44692 2399 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ TPposi: logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...

 例えば、frequeという部分の情報を得たい場合は、res$frequeのようにresfrequeの間に$を挟んだような形で指定します。出力結果は、get_W3.5.6_2関数の実行結果と同じであることが分かります(W3.6.5)。また、get_W3.5.6_3関数の関数名の由来でもあるW3.5.6の出力結果とも同じです。

res$freque                                # res$frequeの中身
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##            178135             22229                 0             44692 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              2399                 0             11155            493338 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              8434             15355             35818 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##            685642            109985                 0            376440 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##             19232             37246             17850            786825

 同様に、TPposiという部分の情報を得たい場合は、res$TPposiのようにresTPposiの間に$を挟んだような形で指定します。

res$TPposi                                # res$TPposiの中身
##   [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
##  [25]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE
##  [37] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [49] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [85] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97]  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
## [133]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [397] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
## [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [421] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [433] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [445] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [457] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [481] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [493] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [505] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [517] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [529] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [541] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [553] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [565] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [577] FALSE FALSE FALSE FALSE

 論理値ベクトルであるres$TPposi中のTRUEの要素数は、51です。この数値は、W3.3.1で見えているTPの要素数に相当します。つまり、「陽性(既知微生物群集)と判定されるべき属のうち、正しく陽性と判定できた属の数(True Positive; TP)」です。このような情報が得られるもの、「予測結果のどの要素が既知微生物群集と合致しているかという論理値ベクトル」がres$TPposiとして利用可能だからです。

sum(res$TPposi)                           # res$TPposi中のTRUEの要素数
## [1] 51

W3.6.9 get_W3.6関数

 最後に、既知微生物群集中の属または種をどれだけの種類検出できたかという感度(W3.2.2やW3.2.6)、そして予測結果のうち既知微生物群集由来のものがどれだけの割合含まれるかという適合率(W3.4.5やW3.4.6)の情報も出力結果として追加します。関数名は、W3.6の集大成という意味でget_W3.6とします。

get_W3.6 <- function(data, prediction, truth){
  # W3.5.4
  frequency <- rowSums(data)              # dataの行ごとの総和をfrequencyに格納
  obj_TP <- is.element(prediction, truth) # prediction中の各要素がtruthに含まれるかどうかの判定結果をobj_TPに格納
  hoge1 <- prediction[obj_TP]             # prediction[obj_TP]をhoge1にコピー
  hoge2 <- frequency[obj_TP]              # frequency[obj_TP]をhoge2にコピー
  freq <- rep(x = hoge1, times = hoge2)   # hoge1をhoge2の指定回数分生成した結果をfreqに格納
  hoge4 <- append(freq, truth)            # freqとtruthを連結した結果をhoge4に格納
  hoge5 <- table(hoge4) - 1               # hoge4中の要素の種類ごとの出現頻度-1をhoge5に格納
  # W3.4.5
  obj_FP <- !obj_TP                       # obj_TPのTRUEとFALSEを入れ替えた結果をobj_FPに格納
  others <- sum(frequency[obj_FP])        # obj_FPがTRUEのfrequencyの総和を計算した結果をothersに格納
  names(others) <- "Others"               # othersに"Others"をnames属性として付与
  # Concatenate
  hoge6 <- append(hoge5, others)          # hoge5とothersを連結した結果をhoge6に格納
  
  # sensitivity
  obj <- is.element(truth, prediction)    # truth中の各要素がpredictionに含まれるかどうかの判定結果をobjに格納
  sensi <- sum(obj)/length(truth)         # 感度の計算結果をsensiに格納
  
  # precision(FPにNA含む)
  TP <- sum(frequency[obj_TP])            # obj_TPがTRUEのfrequencyの総和を計算した結果をTPに格納
  FP <- others                            # othersをFPにコピー
  preci1 <- TP / (TP + FP)                # 適合率を計算した結果をpreci1に格納
  
  # precision(FPにNA含まない)
  obj_P <- !is.na(prediction)             # predictionの各要素がNAでないかどうかの判定結果をobj_Pに格納
  obj_FP <- obj_P & !obj_TP               # obj_Pと!obj_TPの両方でTRUEの要素のみをTRUEとした結果をobj_FPに格納
  FP <- sum(frequency[obj_FP])            # obj_FPがTRUEのfrequencyの総和を計算した結果をFPに格納
  preci2 <- TP / (TP + FP)                # 適合率を計算した結果をpreci2に格納
  
  # output
  rtn <- list()                           # 結果をリスト形式で返すためのrtnを作成
  rtn$freque <- hoge6                     # hoge6をfrequeという名前で追加
  rtn$TPposi <- obj_TP                    # obj_TPをTPposiという名前で追加
  rtn$sensitivity <- sensi                # sensiをsensivitityという名前で追加
  rtn$precision_with_NA <- preci1         # preci1をprecision_with_NAという名前で追加
  rtn$precision_without_NA <- preci2      # preci2をprecision_without_NAという名前で追加
  return(rtn)                             # rtnの中身を関数実行結果として返す
}

 TP / (TP + FP)で定義される適合率は、FPを「TP以外の全てのASV数(NAも含める)」のようにNAを含める場合と、「TP以外の全てのASV数(但し系統割り当てできなかったNAは含めない)」の2つパターンが可能です。それゆえ、ここでは前者をpreci1として計算してprecision_with_NAで出力結果から取り出せるように、そして後者をpreci2として計算してprecision_without_NAで出力結果から取り出せるようにしています。

W3.6.10 get_W3.6の実行

 get_W3.6関数を実行し、結果をresというオブジェクトに格納しています。

res <- get_W3.6(data, genus, genus_truth) # 属の出現頻度のまとめ情報を取得してresに格納
res                                       # resの中身
## $freque
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##            178135             22229                 0             44692 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              2399                 0             11155            493338 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              8434             15355             35818 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##            685642            109985                 0            376440 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##             19232             37246             17850            786825 
## 
## $TPposi
##   [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
##  [25]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE
##  [37] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [49] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [85] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97]  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
## [133]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [397] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
## [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [421] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [433] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [445] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [457] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [481] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [493] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [505] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [517] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [529] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [541] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [553] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [565] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [577] FALSE FALSE FALSE FALSE
## 
## $sensitivity
## [1] 0.7894737
## 
## $precision_with_NA
##   Others 
## 0.723414 
## 
## $precision_without_NA
## [1] 0.8066153

 感度の値(= 0.7894737)は、res$sensitivityで抽出できます。W3.2.2で見えているものと同じであることがわかります。

res$sensitivity                           # res$sensitivityの中身
## [1] 0.7894737

 NA由来配列の出現頻度を含めて算出した適合率の値(= 0.723414)は、res$precision_with_NAで抽出できます。

res$precision_with_NA                     # res$precision_with_NAの中身
##   Others 
## 0.723414

 NA由来配列の出現頻度を含めずに算出した適合率の値(= 0.8066153)は、res$precision_without_NAで抽出できます。0.723414のres$precision_with_NAよりも値が大きいのは、至極当然です。理由は、NA由来配列の出現頻度を含めなければFPの数が少なくなること、そして適合率はTP / (TP + FP)で定義されるからです。

res$precision_without_NA                  # res$precision_without_NAの中身
## [1] 0.8066153

W3.6.11 source関数

 source関数は、入力として指定したファイルの中身を実行します。Linuxが分かるヒト向けの説明としては、シェルスクリプトのようなものになります。ご利益としては、これまでgetNonnaNumget_W3.5.6get_W3.5.6_2get_W3.5.6_3get_W3.6と5種類の自作関数を示してきました。これらの関数は、一度コンソール(Console)画面上で実行して定義しておくと、ソフトウェアを閉じない限り使えます。しかしRを再起動すると、都度関数を再読み込みせねばなりません。それゆえ、複数の自作関数を定義したファイル(JSLAB_source.R)を予め用意しておき、それを最初に一度にまとめて読み込むことがよく行われます。

source("http://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB_source.R") # 関数の読込

 このファイルの記述内容を見ていただければわかりますが、関数を定義しているだけなので見た目上何も変化はありません。エラーが出なければうまくいったと思っていただいてかまいません。

W3.6.12 sourceのご利益

source関数を用いた関数定義ファイルの読込のご利益を実感する1つの方法は、以下の3つの手順を実行し、正しく
「get_W3.6(data, genus, genus_truth) でエラー: 関数 “get_W3.6” を見つけることができませんでした」
というエラーに遭遇する
ことです。

  1. 現在起動中のRStudioを一旦終了して再度起動
  2. 以下を実行(W2.3と同じ)
# W2.1 dada2実行結果ファイルのほう
in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t")# in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
obj <- grep(pattern = "SRR", x = colnames(hoge))  # colnames(hoge)の中から"SRR"という文字を含む要素番号を抽出した結果をobjに格納
data <- hoge[, obj]                       # hoge行列中のobjで指定した列のみ抽出した結果をdataに格納
genus <- hoge$Genus                       # hoge中のGenus列を抽出した結果をgenusに格納
species <- hoge$Species                   # hoge中のSpecies列を抽出した結果をspeciesに格納

# W2.2 菌株情報ファイルのほう
in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB23_table1.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t") #in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
organism <- hoge$Organism                 # hoge中のOrganism列を抽出した結果をorganismに格納
hoge <- strsplit(x = organism, split = ",")# organism中の文字列ベクトルをコンマで分割した結果をhogeに格納
hoge2 <- sapply(X = hoge, FUN = `[`, 1)   # hoge中のベクトル形式の各要素から、1番目の要素の抽出結果をhoge2に格納
hoge3 <- strsplit(x = hoge2, split = " ") # hoge2中の文字列ベクトルを半角スペースで分割した結果をhoge3に格納
genus_truth <- sapply(X = hoge3, FUN = `[`, 1)  # hoge3中のベクトル形式の各要素から、1番目の要素の抽出結果をgenus_truthに格納
species_truth <- sapply(X = hoge3, FUN = `[`, 2)# hoge3中のベクトル形式の各要素から、2番目の要素の抽出結果をspecies_truthに格納
genus_truth <- unique(genus_truth)        # genus_truth中のユニークな要素をgenus_truthに格納
species_truth <- unique(species_truth)    # species_truth中のユニークな要素をspecies_truthに格納
  1. 以下を実行(W3.6.10と基本的に同じ)
get_W3.6(data, genus, genus_truth)        # 属の出現頻度のまとめ情報を取得

 無事「get_W3.6(data, genus, genus_truth) でエラー: 関数 “get_W3.6” を見つけることができませんでした」というエラーに遭遇できたと思います。この状態で、以下を実行すればsource関数のご利益を実感できると思います。

source("http://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB_source.R") # 関数の読込
get_W3.6(data, genus, genus_truth)        # 属の出現頻度のまとめ情報を取得
## $freque
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##            178135             22229                 0             44692 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              2399                 0             11155            493338 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              8434             15355             35818 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##            685642            109985                 0            376440 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##             19232             37246             17850            786825 
## 
## $TPposi
##   [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
##  [25]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE
##  [37] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [49] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [85] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97]  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
## [133]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [397] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
## [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [421] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [433] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [445] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [457] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [481] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [493] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [505] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [517] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [529] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [541] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [553] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [565] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [577] FALSE FALSE FALSE FALSE
## 
## $sensitivity
## [1] 0.7894737
## 
## $precision_with_NA
##   Others 
## 0.723414 
## 
## $precision_without_NA
## [1] 0.8066153

W4 サンプルごとの解析

 W3.4以降では、dada2実行結果ファイル(output_JSLAB24.txt)のSRR列に相当する計12サンプルの出現頻度の総和をASV配列ごとに算出し、出現頻度を含めた性能評価を行いました。ここでは、サンプルごとに同様の解析を行います。ここで用いる入力データは下記の通りです。計5つのオブジェクトを用いますが、いずれもW2.3のコピペ実行で得られます。

  • data:数値行列
    • ASV配列ごとの出現頻度情報であり、出現頻度の総和でソートされている
    • dada2実行結果ファイル(output_JSLAB24.txt)のSRR列の情報
    • nrow(data):行数(ASVの総数)は580
    • ncol(data):列数(サンプル数)は12
  • genus:文字列ベクトル
    • 属の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のGenus列の情報
    • length(genus):要素数(ASVの総数)は580
    • length(na.omit(genus)):“NA”を除く要素数(系統割り当てできたASV数)は343
    • length(table(genus)):“NA”を除くユニークな要素数(系統割り当てできたユニークな属の数)は222
  • species:文字列ベクトル
    • 種の予測結果に相当
    • dada2実行結果ファイル(output_JSLAB24.txt)のSpecies列の情報
    • length(species):要素数(ASVの総数)は580
    • length(na.omit(species)):“NA”を除く要素数(系統割り当てできたASV数)は59
    • length(table(species)):“NA”を除くユニークな要素数(系統割り当てできたユニークな種の数)は54
  • genus_truth:文字列ベクトル
    • 属の正解情報に相当
    • 第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。1番左側の半角スペース手前までの単語。
    • 本来検出したい既知微生物群集HM-280中の属名に相当
    • length(genus_truth):要素数(ユニークな属の数)は19
  • species_truth:文字列ベクトル
    • 種の正解情報に相当
    • 第23回の表1に相当する菌株情報ファイル(JSLAB23_table1.txt)のOrganism列の情報。最初の半角スペースからコンマ手前までの単語。
    • length(species_truth):要素数(ユニークな種の数)は22

 第23回の表2と同じものですが、現在取り扱っている計12サンプルの概要を以下に示しておきます。これは、SRP125723 (Hallmaier-Wacker et al., Sci Rep., 2018)のサブセットです。ここでやろうとしていることは、どのDNA抽出キットと保存バッファの組合せが、本来検出したい既知微生物群集HM-280をどれだけうまくカバーしているか?です。

サンプルID DNA抽出キット 保存バッファ リード数
SRR6325813 QMINI Native 282517
SRR6325815 QMINI LysisBuffer 266259
SRR6325816 QMINI RNA-later 359984
SRR6325817 QMINI PBS 325660
SRR6325828 MOBIO RNA-later 206939
SRR6325829 MOBIO PBS 261767
SRR6325830 MOBIO Native 238627
SRR6325831 MOBIO LysisBuffer 225548
SRR6325859 GENIAL LysisBuffer 290383
SRR6325860 GENIAL Native 253908
SRR6325861 GENIAL PBS 120789
SRR6325862 GENIAL RNA-later 258792

W4.1 getFreqPerSample関数

 getFreqPerSample関数は、W3.6.9で定義したget_W3.6関数をベースに作成しています。get_W3.6関数は数値行列dataを入力として受け付けて、内部的に行ごとの総和をrowSums(data)で計算していました。getFreqPerSample関数は、内部的に行ごとの総和を計算しないようにしています。また、感度の計算部分で、サンプルによって検出できていない(出現頻度が0の)ASV配列も存在しますので、出現頻度が0より大きいものに限定しています。この関数は、W3.6.11で述べたJSLAB_source.Rの中でも定義されています。

getFreqPerSample <- function(data, prediction, truth){
  # W3.5.4
  frequency <- data                       # dataをfrequencyにコピー
  obj_TP <- is.element(prediction, truth) # prediction中の各要素がtruthに含まれるかどうかの判定結果をobj_TPに格納
  hoge1 <- prediction[obj_TP]             # prediction[obj_TP]をhoge1にコピー
  hoge2 <- frequency[obj_TP]              # frequency[obj_TP]をhoge2にコピー
  freq <- rep(x = hoge1, times = hoge2)   # hoge1をhoge2の指定回数分生成した結果をfreqに格納
  hoge4 <- append(freq, truth)            # freqとtruthを連結した結果をhoge4に格納
  hoge5 <- table(hoge4) - 1               # hoge4中の要素の種類ごとの出現頻度-1をhoge5に格納
  # W3.4.5
  obj_FP <- !obj_TP                       # obj_TPのTRUEとFALSEを入れ替えた結果をobj_FPに格納
  others <- sum(frequency[obj_FP])        # obj_FPがTRUEのfrequencyの総和を計算した結果をothersに格納
  names(others) <- "Others"               # othersに"Others"をnames属性として付与
  # Concatenate
  hoge6 <- append(hoge5, others)          # hoge5とothersを連結した結果をhoge6に格納
  
  # sensitivity
  flag <- frequency > 0                   # frequency中の要素が0よりも大きいものをTRUE、それ以外をFALSEとした結果をflagに格納
  obj <- is.element(truth, prediction[flag]) # truth中の各要素がprediction (但しflagがTRUEに限定)に含まれるかどうかの判定結果をobjに格納
  sensi <- sum(obj)/length(truth)         # 感度の計算結果をsensiに格納
  
  # precision(FPにNA含む)
  TP <- sum(frequency[obj_TP])            # obj_TPがTRUEのfrequencyの総和を計算した結果をTPに格納
  FP <- others                            # othersをFPにコピー
  preci1 <- TP / (TP + FP)                # 適合率を計算した結果をpreci1に格納
  
  # precision(FPにNA含まない)
  obj_P <- !is.na(prediction)             # predictionの各要素がNAでないかどうかの判定結果をobj_Pに格納
  obj_FP <- obj_P & !obj_TP               # obj_Pと!obj_TPの両方でTRUEの要素のみをTRUEとした結果をobj_FPに格納
  FP <- sum(frequency[obj_FP])            # obj_FPがTRUEのfrequencyの総和を計算した結果をFPに格納
  preci2 <- TP / (TP + FP)                # 適合率を計算した結果をpreci2に格納
  
  # output
  rtn <- list()                           # 結果をリスト形式で返すためのrtnを作成
  rtn$freque <- hoge6                     # hoge6をfrequeという名前で追加
  rtn$TPposi <- obj_TP                    # obj_TPをTPposiという名前で追加
  rtn$sensitivity <- sensi                # sensiをsensivitityという名前で追加
  rtn$precision_with_NA <- preci1         # preci1をprecision_with_NAという名前で追加
  rtn$precision_without_NA <- preci2      # preci2をprecision_without_NAという名前で追加
  return(rtn)                             # rtnの中身を関数実行結果として返す
}

W4.2 べた書きで実行

 getFreqPerSample関数の最初の引数として与える情報はベクトルです。ここでは、計12サンプルから構成される数値行列dataうち、1列目の情報のみを入力として与えています。

j <- 1                                    # 解析したい列番号情報
result <- getFreqPerSample(data[, j], genus, genus_truth)# j列目の出現頻度のまとめ情報を取得してresultに格納
result                                    # resultの中身
## $freque
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##             10653              2688                 0              4577 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##               126                 0               531              7716 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              1501              1173              4145 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##             81414             13869                 0             51798 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##              1589              3105               674             73393 
## 
## $TPposi
##   [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
##  [25]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE
##  [37] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [49] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [85] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97]  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
## [133]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [397] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
## [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [421] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [433] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [445] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [457] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [481] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [493] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [505] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [517] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [529] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [541] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [553] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [565] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [577] FALSE FALSE FALSE FALSE
## 
## $sensitivity
## [1] 0.7894737
## 
## $precision_with_NA
##    Others 
## 0.7165768 
## 
## $precision_without_NA
## [1] 0.8284476

 (上記の結果をそのまま眺めてもよいのですが)result$frequeで見られる1番目のサンプルのみの頻度情報は、W3.6.10で見られる12サンプルを合わせた頻度情報よりも明らかに少なく妥当だと判断できます。

result$freque                             # result$frequeの中身
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##             10653              2688                 0              4577 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##               126                 0               531              7716 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              1501              1173              4145 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##             81414             13869                 0             51798 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##              1589              3105               674             73393

 なお、これは以下と実質的に同じです。

j <- 1                                    # 解析したい列番号情報
getFreqPerSample(data[, j], genus, genus_truth)$freque# j列目の出現頻度のまとめ情報を取得
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##             10653              2688                 0              4577 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##               126                 0               531              7716 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              1501              1173              4145 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##             81414             13869                 0             51798 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##              1589              3105               674             73393

 かなりローテクな感じですが、以下のようにすれば最初の6サンプル分の属ごとの出現頻度情報をまとめることができます。

freque1 <- getFreqPerSample(data[, 1], genus, genus_truth)$freque# 1列目の出現頻度情報を取得してfreque1に格納
freque2 <- getFreqPerSample(data[, 2], genus, genus_truth)$freque# 2列目の出現頻度情報を取得してfreque2に格納
freque3 <- getFreqPerSample(data[, 3], genus, genus_truth)$freque# 3列目の出現頻度情報を取得してfreque3に格納
freque4 <- getFreqPerSample(data[, 4], genus, genus_truth)$freque# 4列目の出現頻度情報を取得してfreque4に格納
freque5 <- getFreqPerSample(data[, 5], genus, genus_truth)$freque# 5列目の出現頻度情報を取得してfreque5に格納
freque6 <- getFreqPerSample(data[, 6], genus, genus_truth)$freque# 6列目の出現頻度情報を取得してfreque6に格納
result <- cbind(freque1, freque2, freque3,# 6サンプル分の頻度情報を列方向で結合した結果をresultに格納
                freque4, freque5, freque6)# 6サンプル分の頻度情報を列方向で結合した結果をresultに格納
result                                    # resultの中身
##                   freque1 freque2 freque3 freque4 freque5 freque6
## Acinetobacter       10653   10257   14988   51921    6146   10441
## Actinomyces          2688    1868    3012    4212     835    1072
## Bacillus                0       0       0       0       0       0
## Bacteroides          4577    3624    6660    9912    1057     630
## Bifidobacterium       126     115     288     247     313     527
## Clostridium             0       0       0       0       0       0
## Deinococcus           531     469     882    1974    1133    2633
## Enterococcus         7716    6148   25697   10822   82833  154386
## Escherichia             0       0       0       0       0       0
## Helicobacter         1501    1379    1344     395     245     164
## Lactobacillus        1173    1058    1488    2685     883     968
## Listeria             4145    3485    5254    5484    1156     865
## Neisseria           81414   81823  107177   33468   27625   11635
## Porphyromonas       13869   12798   14114    4283    4177    2143
## Propionibacterium       0       0       0       0       0       0
## Pseudomonas         51798   48895   62117   16931   16186    5764
## Rhodobacter          1589    1705    2302    5158     883    1216
## Staphylococcus       3105    2677    3893    1488    6586    7184
## Streptococcus         674     620    1109     366    2648    5374
## Others              73393   65793   86215  153638   39158   36743

W4.3 apply関数で実行

 apply関数は、行列を入力として、行ごとや列ごとに任意の処理を行うための関数です(W3.1.3)。ここでは、apply関数の中でgetFreqPerSample関数を実行する例を示します。580行 \(\times\) 12列からなる数値行列dataを入力として(X = data)、列ごとに(MARGIN = 2)、getFreqPerSample関数を適用する(FUN = getFreqPerSample)、getFreqPerSample関数で与えないといけない残りの引数を記載(genus, genus_truth)という書き方にしています。getFreqPerSample関数自体は、計3つの引数を入力として与えます(W4.2)。1番目の引数はdata、2番目の引数はgenus、そして3番目の引数はgenus_truthを与えて関数を実行したいので、このような書き方になっています。横長になりすぎるので、3行に分けて記載しています。

result <- apply(X = data, MARGIN = 2,     # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                FUN = getFreqPerSample,   # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                genus, genus_truth)       # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納

 str関数は、入力として与えられたオブジェクトの構造(structure)を返します(W3.6.8)。getFreqPerSample関数は、サンプルごとにfreque, TPposi, sensitivity, precision_with_NA, and precision_without_NAの計5種類の結果をリスト形式で返します(W4.1)。以下で見えているresultオブジェクトは、計12サンプル分の結果がリスト形式でまとめられた形になっていることが(全体的な見た目から)わかります。

str(result)                               # resultの構造を表示
## List of 12
##  $ SRR6325813:List of 5
##   ..$ freque              : Named num [1:20] 10653 2688 0 4577 126 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.717
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.828
##  $ SRR6325815:List of 5
##   ..$ freque              : Named num [1:20] 10257 1868 0 3624 115 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.729
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.834
##  $ SRR6325816:List of 5
##   ..$ freque              : Named num [1:20] 14988 3012 0 6660 288 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.744
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.833
##  $ SRR6325817:List of 5
##   ..$ freque              : Named num [1:20] 51921 4212 0 9912 247 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.493
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.558
##  $ SRR6325828:List of 5
##   ..$ freque              : Named num [1:20] 6146 835 0 1057 313 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.796
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.874
##  $ SRR6325829:List of 5
##   ..$ freque              : Named num [1:20] 10441 1072 0 630 527 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.848
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.926
##  $ SRR6325830:List of 5
##   ..$ freque              : Named num [1:20] 6512 1110 0 751 269 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.825
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.902
##  $ SRR6325831:List of 5
##   ..$ freque              : Named num [1:20] 7193 1156 0 686 106 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.792
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.871
##  $ SRR6325859:List of 5
##   ..$ freque              : Named num [1:20] 11293 2527 0 6465 165 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.764
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.846
##  $ SRR6325860:List of 5
##   ..$ freque              : Named num [1:20] 15193 1740 0 5152 87 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.733
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.824
##  $ SRR6325861:List of 5
##   ..$ freque              : Named num [1:20] 16686 886 0 1230 46 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.557
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.608
##  $ SRR6325862:List of 5
##   ..$ freque              : Named num [1:20] 16852 1123 0 3948 110 ...
##   .. ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ TPposi              : logi [1:580] TRUE TRUE FALSE TRUE FALSE TRUE ...
##   ..$ sensitivity         : num 0.789
##   ..$ precision_with_NA   : Named num 0.678
##   .. ..- attr(*, "names")= chr "Others"
##   ..$ precision_without_NA: num 0.745

W4.4 情報抽出(属レベル)

 ここでは、W4.3で得たリスト形式のresultオブジェクトを入力として、サンプルごとの出現頻度をまとめて数値行列として得たり、感度や適合率をまとめて数値行列の下部に追加するなどの作業を行います。

W4.4.1 出現頻度情報の抽出

 ここでは、resultオブジェクトの中から、サンプルごとの結果の1番目の要素であるfreque情報を抽出して、計12サンプル分の属ごとの出現頻度を数値行列として得る作業を行います。入力であるresultがリスト形式ですので、ここではsapply関数を用いて、リスト形式のオブジェクトに対して逐次的な処理を行います。具体的には、W2.2.4と同じような処理を行うべく、オブジェクト中の指定した位置の情報を抽出する[という関数を実行し、1という情報をオプションとして与えています。sapply関数実行結果であるhogeオブジェクトの構造をstr関数で表示させた結果(str(hoge))より、数値行列形式ではなくリスト形式ではあるものの、「サンプルごとの結果の1番目の要素であるfreque情報」のみの抽出できているっぽいことがわかります。

hoge <- sapply(X = result, FUN = `[`, 1)  # result中の各要素から、1番目の要素の抽出結果をhogeに格納
str(hoge)                                 # hogeの構造を表示
## List of 12
##  $ SRR6325813.freque: Named num [1:20] 10653 2688 0 4577 126 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325815.freque: Named num [1:20] 10257 1868 0 3624 115 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325816.freque: Named num [1:20] 14988 3012 0 6660 288 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325817.freque: Named num [1:20] 51921 4212 0 9912 247 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325828.freque: Named num [1:20] 6146 835 0 1057 313 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325829.freque: Named num [1:20] 10441 1072 0 630 527 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325830.freque: Named num [1:20] 6512 1110 0 751 269 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325831.freque: Named num [1:20] 7193 1156 0 686 106 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325859.freque: Named num [1:20] 11293 2527 0 6465 165 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325860.freque: Named num [1:20] 15193 1740 0 5152 87 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325861.freque: Named num [1:20] 16686 886 0 1230 46 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325862.freque: Named num [1:20] 16852 1123 0 3948 110 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...

 リスト形式になっているhoge中の各要素はfreque情報になります。つまり、hoge中の「各要素」は、「サンプルごとの20個の要素からなる数値ベクトル」です。したがって、「リスト形式になっているhoge中の各要素」をcbind関数を用いて列方向で結合してやれば、得られる結果(つまりfreq_mat)は数値行列になります。

freq_mat <- sapply(X = hoge, FUN = cbind) # hoge中の各要素を列方向で結合した結果をfreq_matに格納
str(freq_mat)                             # freq_matの構造を表示
##  num [1:20, 1:12] 10653 2688 0 4577 126 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:12] "SRR6325813.freque" "SRR6325815.freque" "SRR6325816.freque" "SRR6325817.freque" ...

 str(freq_mat)実行結果の最初のほうで見えている「num [1:20, 1:12]」より、20行 \(\times\) 12列の数値行列であることがなんとなくわかると思います。str関数はリスト形式など比較的複雑なオブジェクトの全体像を把握する際には便利ですが、数値行列のような簡単なオブジェクトのときにはかえってわかりづらいかもしれません。freq_matの場合は、dim(freq_mat)head(freq_mat)とかで大まかに把握するほうがわかりやすいかもしれません。最初の6列分については、W4.2の最後のほうで見えている数値行列と一致していることがわかります。W4.2は無駄と思われたかたもいらっしゃるかもしれませんが、このような答え合わせとして使えます。

dim(freq_mat)                             # freq_matの行数と列数
## [1] 20 12
head(freq_mat)                            # freq_mat中の中の最初の6つを表示
##      SRR6325813.freque SRR6325815.freque SRR6325816.freque SRR6325817.freque
## [1,]             10653             10257             14988             51921
## [2,]              2688              1868              3012              4212
## [3,]                 0                 0                 0                 0
## [4,]              4577              3624              6660              9912
## [5,]               126               115               288               247
## [6,]                 0                 0                 0                 0
##      SRR6325828.freque SRR6325829.freque SRR6325830.freque SRR6325831.freque
## [1,]              6146             10441              6512              7193
## [2,]               835              1072              1110              1156
## [3,]                 0                 0                 0                 0
## [4,]              1057               630               751               686
## [5,]               313               527               269               106
## [6,]                 0                 0                 0                 0
##      SRR6325859.freque SRR6325860.freque SRR6325861.freque SRR6325862.freque
## [1,]             11293             15193             16686             16852
## [2,]              2527              1740               886              1123
## [3,]                 0                 0                 0                 0
## [4,]              6465              5152              1230              3948
## [5,]               165                87                46               110
## [6,]                 0                 0                 0                 0

W4.4.2 rownames関数

 前述の表示結果からもわかりますが、freq_matには列名情報は含まれていますが、行名情報は含まれていません。このような場合に、rownames関数を用いて行列に行名を付与することができます。行名として付与するのは基本的に属名情報になります。さきほどW4.4.1の最初のほうで得たhogeオブジェクトをよくみると、属名情報が格納されていることがわかります。

hoge <- sapply(X = result, FUN = `[`, 1)  # result中の各要素から、1番目の要素の抽出結果をhogeに格納
str(hoge)                                 # hogeの構造を表示
## List of 12
##  $ SRR6325813.freque: Named num [1:20] 10653 2688 0 4577 126 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325815.freque: Named num [1:20] 10257 1868 0 3624 115 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325816.freque: Named num [1:20] 14988 3012 0 6660 288 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325817.freque: Named num [1:20] 51921 4212 0 9912 247 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325828.freque: Named num [1:20] 6146 835 0 1057 313 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325829.freque: Named num [1:20] 10441 1072 0 630 527 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325830.freque: Named num [1:20] 6512 1110 0 751 269 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325831.freque: Named num [1:20] 7193 1156 0 686 106 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325859.freque: Named num [1:20] 11293 2527 0 6465 165 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325860.freque: Named num [1:20] 15193 1740 0 5152 87 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325861.freque: Named num [1:20] 16686 886 0 1230 46 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##  $ SRR6325862.freque: Named num [1:20] 16852 1123 0 3948 110 ...
##   ..- attr(*, "names")= chr [1:20] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...

 具体的には、「hogeオブジェクトに含まれる、計12サンプル中のどの要素(サンプル)にも属名情報が含まれている」ことがわかります。例えばリスト形式の1番目の要素を抽出したい場合は、以下のようにします。

hoge[[1]]                                 # hoge中の1番目の要素
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##             10653              2688                 0              4577 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##               126                 0               531              7716 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              1501              1173              4145 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##             81414             13869                 0             51798 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##              1589              3105               674             73393

 これのnames属性情報が、freq_matに列名として与えたい情報になります。

names(hoge[[1]])                          # hoge中の1番目の要素のnames属性
##  [1] "Acinetobacter"     "Actinomyces"       "Bacillus"         
##  [4] "Bacteroides"       "Bifidobacterium"   "Clostridium"      
##  [7] "Deinococcus"       "Enterococcus"      "Escherichia"      
## [10] "Helicobacter"      "Lactobacillus"     "Listeria"         
## [13] "Neisseria"         "Porphyromonas"     "Propionibacterium"
## [16] "Pseudomonas"       "Rhodobacter"       "Staphylococcus"   
## [19] "Streptococcus"     "Others"

 残りは、freq_matの行名情報としてnames(hoge[[1]])を代入するだけです。

rownames(freq_mat) <- names(hoge[[1]])    # names(hoge[[1]])をfreq_matの行名情報とする

 念のため確認しているだけです。

freq_mat                                  # freq_matの中身
##                   SRR6325813.freque SRR6325815.freque SRR6325816.freque
## Acinetobacter                 10653             10257             14988
## Actinomyces                    2688              1868              3012
## Bacillus                          0                 0                 0
## Bacteroides                    4577              3624              6660
## Bifidobacterium                 126               115               288
## Clostridium                       0                 0                 0
## Deinococcus                     531               469               882
## Enterococcus                   7716              6148             25697
## Escherichia                       0                 0                 0
## Helicobacter                   1501              1379              1344
## Lactobacillus                  1173              1058              1488
## Listeria                       4145              3485              5254
## Neisseria                     81414             81823            107177
## Porphyromonas                 13869             12798             14114
## Propionibacterium                 0                 0                 0
## Pseudomonas                   51798             48895             62117
## Rhodobacter                    1589              1705              2302
## Staphylococcus                 3105              2677              3893
## Streptococcus                   674               620              1109
## Others                        73393             65793             86215
##                   SRR6325817.freque SRR6325828.freque SRR6325829.freque
## Acinetobacter                 51921              6146             10441
## Actinomyces                    4212               835              1072
## Bacillus                          0                 0                 0
## Bacteroides                    9912              1057               630
## Bifidobacterium                 247               313               527
## Clostridium                       0                 0                 0
## Deinococcus                    1974              1133              2633
## Enterococcus                  10822             82833            154386
## Escherichia                       0                 0                 0
## Helicobacter                    395               245               164
## Lactobacillus                  2685               883               968
## Listeria                       5484              1156               865
## Neisseria                     33468             27625             11635
## Porphyromonas                  4283              4177              2143
## Propionibacterium                 0                 0                 0
## Pseudomonas                   16931             16186              5764
## Rhodobacter                    5158               883              1216
## Staphylococcus                 1488              6586              7184
## Streptococcus                   366              2648              5374
## Others                       153638             39158             36743
##                   SRR6325830.freque SRR6325831.freque SRR6325859.freque
## Acinetobacter                  6512              7193             11293
## Actinomyces                    1110              1156              2527
## Bacillus                          0                 0                 0
## Bacteroides                     751               686              6465
## Bifidobacterium                 269               106               165
## Clostridium                       0                 0                 0
## Deinococcus                    1110               254               595
## Enterococcus                  90159             67629              5505
## Escherichia                       0                 0                 0
## Helicobacter                    408               296              1056
## Lactobacillus                  1094               905              1460
## Listeria                       1454              2027              3202
## Neisseria                     45205             52283             88802
## Porphyromonas                  6555              6804             18322
## Propionibacterium                 0                 0                 0
## Pseudomonas                   21605             22188             49964
## Rhodobacter                     673               386              1878
## Staphylococcus                 4487              2666              1958
## Streptococcus                  2926              1625               528
## Others                        38994             43671             59939
##                   SRR6325860.freque SRR6325861.freque SRR6325862.freque
## Acinetobacter                 15193             16686             16852
## Actinomyces                    1740               886              1123
## Bacillus                          0                 0                 0
## Bacteroides                    5152              1230              3948
## Bifidobacterium                  87                46               110
## Clostridium                       0                 0                 0
## Deinococcus                     480               558               536
## Enterococcus                   5765             19608             17070
## Escherichia                       0                 0                 0
## Helicobacter                    973                61               612
## Lactobacillus                  1782               744              1115
## Listeria                       2619              2176              3951
## Neisseria                     74848             11007             70355
## Porphyromonas                 14954              1411             10555
## Propionibacterium                 0                 0                 0
## Pseudomonas                   39483              7028             34481
## Rhodobacter                    1405               935              1102
## Staphylococcus                 1431               277              1494
## Streptococcus                   464               847               669
## Others                        60735             50553             77993

 本質的な部分ではありませんでしたが、気になるとずっと気になり続ける部分ですし、。また、最後の最後で自動的に結果をまとめて表として作成したい場合などに、後で苦労することになる場合もあります。実際、W5の作成途中でfreq_mat中に行名情報が存在しないことに気づき、最後の最後ででこの項目を追加する羽目に遭っています。

W4.4.3 感度情報の抽出

 ここでは、resultオブジェクトの中から、サンプルごとの結果の3番目の要素であるsensitivity情報を抽出して、計12サンプル分の属ごとの感度情報のみを得ます。

hoge <- sapply(X = result, FUN = `[`, 3)  # result中の各要素から3番目の要素の抽出結果をhogeに格納
str(hoge)                                 # hogeの構造を表示
## List of 12
##  $ SRR6325813.sensitivity: num 0.789
##  $ SRR6325815.sensitivity: num 0.789
##  $ SRR6325816.sensitivity: num 0.789
##  $ SRR6325817.sensitivity: num 0.789
##  $ SRR6325828.sensitivity: num 0.789
##  $ SRR6325829.sensitivity: num 0.789
##  $ SRR6325830.sensitivity: num 0.789
##  $ SRR6325831.sensitivity: num 0.789
##  $ SRR6325859.sensitivity: num 0.789
##  $ SRR6325860.sensitivity: num 0.789
##  $ SRR6325861.sensitivity: num 0.789
##  $ SRR6325862.sensitivity: num 0.789

 出力結果であるhogeオブジェクトは、12個の要素からなるリスト形式であることがわかります。1つ1つの要素はスカラー(1つの数字)で、すべて0.789であることがわかります。また、W4.4.1のhead(freq_mat)実行結果で見えている3行目と6行目に0が並んでいる状況を踏まえ、「おそらく全てのサンプルが同じ属を検出できていないのだろう。そのうちの2つは、3行目と6行目の属。15/19 = 0.7894737なので、検出できていないのは4属。」のように解釈します。表示結果の分量もたかが知れているので、以下にhoge実行結果も示します。

hoge                                      # hogeの中身
## $SRR6325813.sensitivity
## [1] 0.7894737
## 
## $SRR6325815.sensitivity
## [1] 0.7894737
## 
## $SRR6325816.sensitivity
## [1] 0.7894737
## 
## $SRR6325817.sensitivity
## [1] 0.7894737
## 
## $SRR6325828.sensitivity
## [1] 0.7894737
## 
## $SRR6325829.sensitivity
## [1] 0.7894737
## 
## $SRR6325830.sensitivity
## [1] 0.7894737
## 
## $SRR6325831.sensitivity
## [1] 0.7894737
## 
## $SRR6325859.sensitivity
## [1] 0.7894737
## 
## $SRR6325860.sensitivity
## [1] 0.7894737
## 
## $SRR6325861.sensitivity
## [1] 0.7894737
## 
## $SRR6325862.sensitivity
## [1] 0.7894737

 第24回のW1.6.5でも利用しましたが、上記hogeのような感じで見えているリスト形式のものは、リスト形式を解除するunlist関数を実行してやれば、ベクトル形式に変更することができます。

unlist(hoge)                              # hogeをベクトル形式に変更
## SRR6325813.sensitivity SRR6325815.sensitivity SRR6325816.sensitivity 
##              0.7894737              0.7894737              0.7894737 
## SRR6325817.sensitivity SRR6325828.sensitivity SRR6325829.sensitivity 
##              0.7894737              0.7894737              0.7894737 
## SRR6325830.sensitivity SRR6325831.sensitivity SRR6325859.sensitivity 
##              0.7894737              0.7894737              0.7894737 
## SRR6325860.sensitivity SRR6325861.sensitivity SRR6325862.sensitivity 
##              0.7894737              0.7894737              0.7894737

 ここまでの一連の作業は、以下のような感じでまとめることができます。

sensitivity <- unlist(sapply(X = result, FUN = `[`, 3)) # result中の各要素から3番目の要素のみ抽出した結果をベクトル形式にしてsensitivityに格納
sensitivity                               # sensitivityの中身
## SRR6325813.sensitivity SRR6325815.sensitivity SRR6325816.sensitivity 
##              0.7894737              0.7894737              0.7894737 
## SRR6325817.sensitivity SRR6325828.sensitivity SRR6325829.sensitivity 
##              0.7894737              0.7894737              0.7894737 
## SRR6325830.sensitivity SRR6325831.sensitivity SRR6325859.sensitivity 
##              0.7894737              0.7894737              0.7894737 
## SRR6325860.sensitivity SRR6325861.sensitivity SRR6325862.sensitivity 
##              0.7894737              0.7894737              0.7894737

W4.4.4 適合率情報の抽出

 ここでは、resultオブジェクトの中から、サンプルごとの結果の4番目の要素であるprecision_with_NA情報、および5番目の要素であるprecision_without_NA情報を抽出します(W3.6.9)。TP / (TP + FP)で定義される適合率は、FPを「TP以外の全てのASV数(NAも含める)」のようにNAを含める場合が前者(precision_with_NA)、含めない場合が後者(precision_without_NA)の情報になります。

precision_with_NA <- unlist(sapply(X = result, FUN = `[`, 4)) # result中の各要素から4番目の要素のみ抽出した結果をベクトル形式にしてprecision_with_NAに格納
precision_without_NA <- unlist(sapply(X = result, FUN = `[`, 5)) # result中の各要素から5番目の要素のみ抽出した結果をベクトル形式にしてprecision_without_NAに格納

 precision_with_NAの中身を念のため示します。

precision_with_NA                         # precision_with_NAの中身
## SRR6325813.precision_with_NA.Others SRR6325815.precision_with_NA.Others 
##                           0.7165768                           0.7289279 
## SRR6325816.precision_with_NA.Others SRR6325817.precision_with_NA.Others 
##                           0.7438195                           0.4929171 
## SRR6325828.precision_with_NA.Others SRR6325829.precision_with_NA.Others 
##                           0.7959075                           0.8480093 
## SRR6325830.precision_with_NA.Others SRR6325831.precision_with_NA.Others 
##                           0.8253833                           0.7919190 
## SRR6325859.precision_with_NA.Others SRR6325860.precision_with_NA.Others 
##                           0.7637025                           0.7325757 
## SRR6325861.precision_with_NA.Others SRR6325862.precision_with_NA.Others 
##                           0.5567587                           0.6776696

 precision_without_NAの中身を念のため示します。

precision_without_NA                      # precision_without_NAの中身
## SRR6325813.precision_without_NA SRR6325815.precision_without_NA 
##                       0.8284476                       0.8337307 
## SRR6325816.precision_without_NA SRR6325817.precision_without_NA 
##                       0.8325379                       0.5581588 
## SRR6325828.precision_without_NA SRR6325829.precision_without_NA 
##                       0.8735242                       0.9259893 
## SRR6325830.precision_without_NA SRR6325831.precision_without_NA 
##                       0.9019059                       0.8711495 
## SRR6325859.precision_without_NA SRR6325860.precision_without_NA 
##                       0.8460054                       0.8239576 
## SRR6325861.precision_without_NA SRR6325862.precision_without_NA 
##                       0.6077427                       0.7447868

W4.4.5 まとめて実行

 W4.3とW4.4のスクリプトを以下にまとめます。これを実行するために必要な3つのオブジェクト(data, genus_truth, and genus)は、W2.3を実行すれば得られます。

source("http://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB_source.R") # 関数の読込
result <- apply(X = data, MARGIN = 2,     # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                FUN = getFreqPerSample,   # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                genus, genus_truth)       # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
hoge <- sapply(X = result, FUN = `[`, 1)  # result中の各要素から、1番目の要素の抽出結果をhogeに格納
freq_mat <- sapply(X = hoge, FUN = cbind) # hoge中の各要素を列方向で結合した結果をfreq_matに格納
rownames(freq_mat) <- names(hoge[[1]])    # names(hoge[[1]])をfreq_matの行名情報とする
sensitivity <- unlist(sapply(X = result, FUN = `[`, 3)) # result中の各要素から3番目の要素のみ抽出した結果をベクトル形式にしてsensitivityに格納
precision_with_NA <- unlist(sapply(X = result, FUN = `[`, 4)) # result中の各要素から4番目の要素のみ抽出した結果をベクトル形式にしてprecision_with_NAに格納
precision_without_NA <- unlist(sapply(X = result, FUN = `[`, 5)) # result中の各要素から5番目の要素のみ抽出した結果をベクトル形式にしてprecision_without_NAに格納

 以下の4つのオブジェクトが主な結果です。

freq_mat
sensitivity
precision_with_NA
precision_without_NA

W4.5 情報抽出(種レベル)

 W4.4は属レベルのものでしたが、種レベルについてもW4.4.5の冒頭部分を変更するだけで簡単に結果が得られます。これを実行するために必要な3つのオブジェクト(data, species_truth, and species)は、W2.3を実行すれば得られます。

source("http://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB_source.R") # 関数の読込
result <- apply(X = data, MARGIN = 2,     # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                FUN = getFreqPerSample,   # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                species, species_truth)   # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
hoge <- sapply(X = result, FUN = `[`, 1)  # result中の各要素から、1番目の要素の抽出結果をhogeに格納
freq_mat <- sapply(X = hoge, FUN = cbind) # hoge中の各要素を列方向で結合した結果をfreq_matに格納
rownames(freq_mat) <- names(hoge[[1]])    # names(hoge[[1]])をfreq_matの行名情報とする
sensitivity <- unlist(sapply(X = result, FUN = `[`, 3)) # result中の各要素から3番目の要素のみ抽出した結果をベクトル形式にしてsensitivityに格納
precision_with_NA <- unlist(sapply(X = result, FUN = `[`, 4)) # result中の各要素から4番目の要素のみ抽出した結果をベクトル形式にしてprecision_with_NAに格納
precision_without_NA <- unlist(sapply(X = result, FUN = `[`, 5)) # result中の各要素から5番目の要素のみ抽出した結果をベクトル形式にしてprecision_witho

 種レベルの出現頻度の数値行列は以下のような感じになります。

freq_mat
##               SRR6325813.freque SRR6325815.freque SRR6325816.freque
## acnes                         0                 0                 0
## adolescentis                  0                 0                 0
## aeruginosa                    0                 0                 0
## agalactiae                    0                 0                 0
## aureus                        0                 0                 0
## baumannii                     0                 0                 0
## beijerinckii                  0                37                 0
## cereus                        0                 0                 0
## coli                          0                 0                 0
## epidermidis                   0                 0                 0
## faecalis                      0                 0                 0
## gasseri                       0                 0                 0
## gingivalis                13645             12798             13838
## meningitides                  0                 0                 0
## monocytogenes                 0                 0                 0
## mutans                       89                60               164
## odontolyticus              2688              1868              3012
## pneumoniae                    0                 0                 0
## pylori                     1501              1379              1344
## radiodurans                 531               469               882
## sphaeroides                   0                 0                 0
## vulgatus                   4577              3624              6657
## Others                   235921            222479            310643
##               SRR6325817.freque SRR6325828.freque SRR6325829.freque
## acnes                         0                 0                 0
## adolescentis                  0                 0                 0
## aeruginosa                    0                 0                 0
## agalactiae                    0                 0                 0
## aureus                        0                33                14
## baumannii                     0                 0                 0
## beijerinckii                  0                 0                 0
## cereus                        0                 0                 0
## coli                          0                 0                 0
## epidermidis                   0                 0                 0
## faecalis                      0                 0                 0
## gasseri                       0                 0                 0
## gingivalis                 4283              4177              2143
## meningitides                  0                 0                 0
## monocytogenes                 0                 0                 0
## mutans                       90               249               492
## odontolyticus              4212               835              1072
## pneumoniae                    0                 0                 0
## pylori                      395               245               164
## radiodurans                1974              1127              2633
## sphaeroides                   0                 0                 0
## vulgatus                   9901              1046               626
## Others                   282129            184152            234601
##               SRR6325830.freque SRR6325831.freque SRR6325859.freque
## acnes                         0                 0                 0
## adolescentis                  0                 0                 0
## aeruginosa                    0                 0                 0
## agalactiae                    0                 0                 0
## aureus                        0                 0                 0
## baumannii                     0                 0                 0
## beijerinckii                  0                 0                39
## cereus                        0                 0                 0
## coli                          0                 0                 0
## epidermidis                   0                 0                 0
## faecalis                      0                 0                 0
## gasseri                       0                 0                 0
## gingivalis                 6555              6804             18026
## meningitides                  0                 0                 0
## monocytogenes                 0                 0                 0
## mutans                      441               245                54
## odontolyticus              1102              1156              2527
## pneumoniae                    0                 0                 0
## pylori                      408               296              1056
## radiodurans                1110               254               595
## sphaeroides                   0                 0                 0
## vulgatus                    751               686              6465
## Others                   212945            200434            224897
##               SRR6325860.freque SRR6325861.freque SRR6325862.freque
## acnes                         0                 0                 0
## adolescentis                  0                 0                 0
## aeruginosa                    0                 0                 0
## agalactiae                    0                 0                 0
## aureus                        0                 0                 0
## baumannii                     0                 0                 0
## beijerinckii                  0                 0                 0
## cereus                        0                 0                 0
## coli                          0                 0                 0
## epidermidis                   0                 0                 0
## faecalis                      0                 0                 0
## gasseri                       0                 0                 0
## gingivalis                14954              1411             10555
## meningitides                  0                 0                 0
## monocytogenes                 0                 0                 0
## mutans                       75                72                50
## odontolyticus              1719               886              1123
## pneumoniae                    0                 0                 0
## pylori                      969                61               612
## radiodurans                 480               558               536
## sphaeroides                   0                 0                 0
## vulgatus                   5152              1230              3948
## Others                   203762            109835            225142

 種レベルの感度は以下のような感じになります。

sensitivity
## SRR6325813.sensitivity SRR6325815.sensitivity SRR6325816.sensitivity 
##              0.2727273              0.3181818              0.2727273 
## SRR6325817.sensitivity SRR6325828.sensitivity SRR6325829.sensitivity 
##              0.2727273              0.3181818              0.3181818 
## SRR6325830.sensitivity SRR6325831.sensitivity SRR6325859.sensitivity 
##              0.2727273              0.2727273              0.3181818 
## SRR6325860.sensitivity SRR6325861.sensitivity SRR6325862.sensitivity 
##              0.2727273              0.2727273              0.2727273

 種レベルの適合率(NAを含めた場合)は以下のような感じになります。

precision_with_NA
## SRR6325813.precision_with_NA.Others SRR6325815.precision_with_NA.Others 
##                          0.08893926                          0.08336973 
## SRR6325816.precision_with_NA.Others SRR6325817.precision_with_NA.Others 
##                          0.07695073                          0.06883202 
## SRR6325828.precision_with_NA.Others SRR6325829.precision_with_NA.Others 
##                          0.04019514                          0.02955180 
## SRR6325830.precision_with_NA.Others SRR6325831.precision_with_NA.Others 
##                          0.04642384                          0.04498392 
## SRR6325859.precision_with_NA.Others SRR6325860.precision_with_NA.Others 
##                          0.11338845                          0.10280876 
## SRR6325861.precision_with_NA.Others SRR6325862.precision_with_NA.Others 
##                          0.03698281                          0.06953043

 種レベルの適合率(NAを含めない場合)は以下のような感じになります。

precision_without_NA
## SRR6325813.precision_without_NA SRR6325815.precision_without_NA 
##                       0.2204894                       0.1981454 
## SRR6325816.precision_without_NA SRR6325817.precision_without_NA 
##                       0.1945461                       0.3835332 
## SRR6325828.precision_without_NA SRR6325829.precision_without_NA 
##                       0.2173864                       0.3753678 
## SRR6325830.precision_without_NA SRR6325831.precision_without_NA 
##                       0.1863261                       0.1528758 
## SRR6325859.precision_without_NA SRR6325860.precision_without_NA 
##                       0.2446185                       0.2377287 
## SRR6325861.precision_without_NA SRR6325862.precision_without_NA 
##                       0.2758305                       0.1928938

W5 取得情報の整形

 ここでは、取得した出現頻度・感度・適合率の情報をまとめる作業を示します。実行に必要な5つのオブジェクト(data, genus_truth, genus, species_truth, and species)はW2.3を実行すれば得られますが、以下にも再掲します。

# W2.1 dada2実行結果ファイルのほう
in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t")# in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
obj <- grep(pattern = "SRR", x = colnames(hoge))  # colnames(hoge)の中から"SRR"という文字を含む要素番号を抽出した結果をobjに格納
data <- hoge[, obj]                       # hoge行列中のobjで指定した列のみ抽出した結果をdataに格納
genus <- hoge$Genus                       # hoge中のGenus列を抽出した結果をgenusに格納
species <- hoge$Species                   # hoge中のSpecies列を抽出した結果をspeciesに格納

# W2.2 菌株情報ファイルのほう
in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB23_table1.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t") #in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
organism <- hoge$Organism                 # hoge中のOrganism列を抽出した結果をorganismに格納
hoge <- strsplit(x = organism, split = ",")# organism中の文字列ベクトルをコンマで分割した結果をhogeに格納
hoge2 <- sapply(X = hoge, FUN = `[`, 1)   # hoge中のベクトル形式の各要素から、1番目の要素の抽出結果をhoge2に格納
hoge3 <- strsplit(x = hoge2, split = " ") # hoge2中の文字列ベクトルを半角スペースで分割した結果をhoge3に格納
genus_truth <- sapply(X = hoge3, FUN = `[`, 1)  # hoge3中のベクトル形式の各要素から、1番目の要素の抽出結果をgenus_truthに格納
species_truth <- sapply(X = hoge3, FUN = `[`, 2)# hoge3中のベクトル形式の各要素から、2番目の要素の抽出結果をspecies_truthに格納
genus_truth <- unique(genus_truth)        # genus_truth中のユニークな要素をgenus_truthに格納
species_truth <- unique(species_truth)    # species_truth中のユニークな要素をspecies_truthに格納

W5.1 抽出結果のまとめ(属レベル)

 ここでは、属レベルの抽出結果のまとめを行います。

W5.1.1 情報抽出(サンプルごと)

 W4.4.5を再実行し、サンプルごとの属レベルの出現頻度、感度、適合率のオブジェクトを得ておきます。

source("http://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB_source.R") # 関数の読込
result <- apply(X = data, MARGIN = 2,     # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                FUN = getFreqPerSample,   # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                genus, genus_truth)       # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
hoge <- sapply(X = result, FUN = `[`, 1)  # result中の各要素から、1番目の要素の抽出結果をhogeに格納
freq_mat <- sapply(X = hoge, FUN = cbind) # hoge中の各要素を列方向で結合した結果をfreq_matに格納
rownames(freq_mat) <- names(hoge[[1]])    # names(hoge[[1]])をfreq_matの行名情報とする
sensitivity <- unlist(sapply(X = result, FUN = `[`, 3)) # result中の各要素から3番目の要素のみ抽出した結果をベクトル形式にしてsensitivityに格納
precision_with_NA <- unlist(sapply(X = result, FUN = `[`, 4)) # result中の各要素から4番目の要素のみ抽出した結果をベクトル形式にしてprecision_with_NAに格納
precision_without_NA <- unlist(sapply(X = result, FUN = `[`, 5)) # result中の各要素から5番目の要素のみ抽出した結果をベクトル形式にしてprecision_without_NAに格納

W5.1.2 整形本番(サンプルごと)

 ここでは、出現頻度、感度、適合率の結果を、行方向で結合させます。rbind関数 は、同じ要素数の複数のベクトルなどを行(row)方向で結合(bind)させたい場合に利用します。

result_pers <- rbind(freq_mat,            # 行方向で結合した結果をresult_persに格納
                     sensitivity,         # 行方向で結合した結果をresult_persに格納
                     precision_with_NA,   # 行方向で結合した結果をresult_persに格納
                     precision_without_NA)# 行方向で結合した結果をresult_persに格納

 得られるオブジェクトは以下のような感じになります。

str(result_pers)                          # result_persの構造を表示
##  num [1:23, 1:12] 10653 2688 0 4577 126 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:23] "Acinetobacter" "Actinomyces" "Bacillus" "Bacteroides" ...
##   ..$ : chr [1:12] "SRR6325813.freque" "SRR6325815.freque" "SRR6325816.freque" "SRR6325817.freque" ...
dim(result_pers)                          # result_persの行数と列数
## [1] 23 12

 result_persは、23行 \(\times\) 12列からなることがわかります。20行 \(\times\) 12列からなる行列freq_matの下部に、列数と同じ要素からなる3つのベクトル情報をそれぞれ結合して得られたものなので妥当ですね。

W5.1.3 指数表記を回避

 まず、result_persの中身を示します。指数表記で若干見づらいかもしれませんが、数値自体は妥当です。

result_pers                               # result_persの中身を表示
##                      SRR6325813.freque SRR6325815.freque SRR6325816.freque
## Acinetobacter             1.065300e+04      1.025700e+04      1.498800e+04
## Actinomyces               2.688000e+03      1.868000e+03      3.012000e+03
## Bacillus                  0.000000e+00      0.000000e+00      0.000000e+00
## Bacteroides               4.577000e+03      3.624000e+03      6.660000e+03
## Bifidobacterium           1.260000e+02      1.150000e+02      2.880000e+02
## Clostridium               0.000000e+00      0.000000e+00      0.000000e+00
## Deinococcus               5.310000e+02      4.690000e+02      8.820000e+02
## Enterococcus              7.716000e+03      6.148000e+03      2.569700e+04
## Escherichia               0.000000e+00      0.000000e+00      0.000000e+00
## Helicobacter              1.501000e+03      1.379000e+03      1.344000e+03
## Lactobacillus             1.173000e+03      1.058000e+03      1.488000e+03
## Listeria                  4.145000e+03      3.485000e+03      5.254000e+03
## Neisseria                 8.141400e+04      8.182300e+04      1.071770e+05
## Porphyromonas             1.386900e+04      1.279800e+04      1.411400e+04
## Propionibacterium         0.000000e+00      0.000000e+00      0.000000e+00
## Pseudomonas               5.179800e+04      4.889500e+04      6.211700e+04
## Rhodobacter               1.589000e+03      1.705000e+03      2.302000e+03
## Staphylococcus            3.105000e+03      2.677000e+03      3.893000e+03
## Streptococcus             6.740000e+02      6.200000e+02      1.109000e+03
## Others                    7.339300e+04      6.579300e+04      8.621500e+04
## sensitivity               7.894737e-01      7.894737e-01      7.894737e-01
## precision_with_NA         7.165768e-01      7.289279e-01      7.438195e-01
## precision_without_NA      8.284476e-01      8.337307e-01      8.325379e-01
##                      SRR6325817.freque SRR6325828.freque SRR6325829.freque
## Acinetobacter             5.192100e+04      6.146000e+03      1.044100e+04
## Actinomyces               4.212000e+03      8.350000e+02      1.072000e+03
## Bacillus                  0.000000e+00      0.000000e+00      0.000000e+00
## Bacteroides               9.912000e+03      1.057000e+03      6.300000e+02
## Bifidobacterium           2.470000e+02      3.130000e+02      5.270000e+02
## Clostridium               0.000000e+00      0.000000e+00      0.000000e+00
## Deinococcus               1.974000e+03      1.133000e+03      2.633000e+03
## Enterococcus              1.082200e+04      8.283300e+04      1.543860e+05
## Escherichia               0.000000e+00      0.000000e+00      0.000000e+00
## Helicobacter              3.950000e+02      2.450000e+02      1.640000e+02
## Lactobacillus             2.685000e+03      8.830000e+02      9.680000e+02
## Listeria                  5.484000e+03      1.156000e+03      8.650000e+02
## Neisseria                 3.346800e+04      2.762500e+04      1.163500e+04
## Porphyromonas             4.283000e+03      4.177000e+03      2.143000e+03
## Propionibacterium         0.000000e+00      0.000000e+00      0.000000e+00
## Pseudomonas               1.693100e+04      1.618600e+04      5.764000e+03
## Rhodobacter               5.158000e+03      8.830000e+02      1.216000e+03
## Staphylococcus            1.488000e+03      6.586000e+03      7.184000e+03
## Streptococcus             3.660000e+02      2.648000e+03      5.374000e+03
## Others                    1.536380e+05      3.915800e+04      3.674300e+04
## sensitivity               7.894737e-01      7.894737e-01      7.894737e-01
## precision_with_NA         4.929171e-01      7.959075e-01      8.480093e-01
## precision_without_NA      5.581588e-01      8.735242e-01      9.259893e-01
##                      SRR6325830.freque SRR6325831.freque SRR6325859.freque
## Acinetobacter             6.512000e+03      7.193000e+03      1.129300e+04
## Actinomyces               1.110000e+03      1.156000e+03      2.527000e+03
## Bacillus                  0.000000e+00      0.000000e+00      0.000000e+00
## Bacteroides               7.510000e+02      6.860000e+02      6.465000e+03
## Bifidobacterium           2.690000e+02      1.060000e+02      1.650000e+02
## Clostridium               0.000000e+00      0.000000e+00      0.000000e+00
## Deinococcus               1.110000e+03      2.540000e+02      5.950000e+02
## Enterococcus              9.015900e+04      6.762900e+04      5.505000e+03
## Escherichia               0.000000e+00      0.000000e+00      0.000000e+00
## Helicobacter              4.080000e+02      2.960000e+02      1.056000e+03
## Lactobacillus             1.094000e+03      9.050000e+02      1.460000e+03
## Listeria                  1.454000e+03      2.027000e+03      3.202000e+03
## Neisseria                 4.520500e+04      5.228300e+04      8.880200e+04
## Porphyromonas             6.555000e+03      6.804000e+03      1.832200e+04
## Propionibacterium         0.000000e+00      0.000000e+00      0.000000e+00
## Pseudomonas               2.160500e+04      2.218800e+04      4.996400e+04
## Rhodobacter               6.730000e+02      3.860000e+02      1.878000e+03
## Staphylococcus            4.487000e+03      2.666000e+03      1.958000e+03
## Streptococcus             2.926000e+03      1.625000e+03      5.280000e+02
## Others                    3.899400e+04      4.367100e+04      5.993900e+04
## sensitivity               7.894737e-01      7.894737e-01      7.894737e-01
## precision_with_NA         8.253833e-01      7.919190e-01      7.637025e-01
## precision_without_NA      9.019059e-01      8.711495e-01      8.460054e-01
##                      SRR6325860.freque SRR6325861.freque SRR6325862.freque
## Acinetobacter             1.519300e+04      1.668600e+04      1.685200e+04
## Actinomyces               1.740000e+03      8.860000e+02      1.123000e+03
## Bacillus                  0.000000e+00      0.000000e+00      0.000000e+00
## Bacteroides               5.152000e+03      1.230000e+03      3.948000e+03
## Bifidobacterium           8.700000e+01      4.600000e+01      1.100000e+02
## Clostridium               0.000000e+00      0.000000e+00      0.000000e+00
## Deinococcus               4.800000e+02      5.580000e+02      5.360000e+02
## Enterococcus              5.765000e+03      1.960800e+04      1.707000e+04
## Escherichia               0.000000e+00      0.000000e+00      0.000000e+00
## Helicobacter              9.730000e+02      6.100000e+01      6.120000e+02
## Lactobacillus             1.782000e+03      7.440000e+02      1.115000e+03
## Listeria                  2.619000e+03      2.176000e+03      3.951000e+03
## Neisseria                 7.484800e+04      1.100700e+04      7.035500e+04
## Porphyromonas             1.495400e+04      1.411000e+03      1.055500e+04
## Propionibacterium         0.000000e+00      0.000000e+00      0.000000e+00
## Pseudomonas               3.948300e+04      7.028000e+03      3.448100e+04
## Rhodobacter               1.405000e+03      9.350000e+02      1.102000e+03
## Staphylococcus            1.431000e+03      2.770000e+02      1.494000e+03
## Streptococcus             4.640000e+02      8.470000e+02      6.690000e+02
## Others                    6.073500e+04      5.055300e+04      7.799300e+04
## sensitivity               7.894737e-01      7.894737e-01      7.894737e-01
## precision_with_NA         7.325757e-01      5.567587e-01      6.776696e-01
## precision_without_NA      8.239576e-01      6.077427e-01      7.447868e-01

 指数表記になる原因は、最初の20行分に相当する出現頻度(freq_mat)のほうは~6桁の整数である一方、残りの3行分の感度や適合率のほうは1未満の実数だからです。つまり、全体として表示桁数が大きくなってしまうためです。指数表記を回避したい場合は、以下に示すようにoptions(scipen=100)というコマンドを最初に実行しておけばよいです。

options(scipen=100)                       # 指数表記を回避
result_pers                               # result_persの中身を表示
##                      SRR6325813.freque SRR6325815.freque SRR6325816.freque
## Acinetobacter            10653.0000000     10257.0000000     14988.0000000
## Actinomyces               2688.0000000      1868.0000000      3012.0000000
## Bacillus                     0.0000000         0.0000000         0.0000000
## Bacteroides               4577.0000000      3624.0000000      6660.0000000
## Bifidobacterium            126.0000000       115.0000000       288.0000000
## Clostridium                  0.0000000         0.0000000         0.0000000
## Deinococcus                531.0000000       469.0000000       882.0000000
## Enterococcus              7716.0000000      6148.0000000     25697.0000000
## Escherichia                  0.0000000         0.0000000         0.0000000
## Helicobacter              1501.0000000      1379.0000000      1344.0000000
## Lactobacillus             1173.0000000      1058.0000000      1488.0000000
## Listeria                  4145.0000000      3485.0000000      5254.0000000
## Neisseria                81414.0000000     81823.0000000    107177.0000000
## Porphyromonas            13869.0000000     12798.0000000     14114.0000000
## Propionibacterium            0.0000000         0.0000000         0.0000000
## Pseudomonas              51798.0000000     48895.0000000     62117.0000000
## Rhodobacter               1589.0000000      1705.0000000      2302.0000000
## Staphylococcus            3105.0000000      2677.0000000      3893.0000000
## Streptococcus              674.0000000       620.0000000      1109.0000000
## Others                   73393.0000000     65793.0000000     86215.0000000
## sensitivity                  0.7894737         0.7894737         0.7894737
## precision_with_NA            0.7165768         0.7289279         0.7438195
## precision_without_NA         0.8284476         0.8337307         0.8325379
##                      SRR6325817.freque SRR6325828.freque SRR6325829.freque
## Acinetobacter            51921.0000000      6146.0000000     10441.0000000
## Actinomyces               4212.0000000       835.0000000      1072.0000000
## Bacillus                     0.0000000         0.0000000         0.0000000
## Bacteroides               9912.0000000      1057.0000000       630.0000000
## Bifidobacterium            247.0000000       313.0000000       527.0000000
## Clostridium                  0.0000000         0.0000000         0.0000000
## Deinococcus               1974.0000000      1133.0000000      2633.0000000
## Enterococcus             10822.0000000     82833.0000000    154386.0000000
## Escherichia                  0.0000000         0.0000000         0.0000000
## Helicobacter               395.0000000       245.0000000       164.0000000
## Lactobacillus             2685.0000000       883.0000000       968.0000000
## Listeria                  5484.0000000      1156.0000000       865.0000000
## Neisseria                33468.0000000     27625.0000000     11635.0000000
## Porphyromonas             4283.0000000      4177.0000000      2143.0000000
## Propionibacterium            0.0000000         0.0000000         0.0000000
## Pseudomonas              16931.0000000     16186.0000000      5764.0000000
## Rhodobacter               5158.0000000       883.0000000      1216.0000000
## Staphylococcus            1488.0000000      6586.0000000      7184.0000000
## Streptococcus              366.0000000      2648.0000000      5374.0000000
## Others                  153638.0000000     39158.0000000     36743.0000000
## sensitivity                  0.7894737         0.7894737         0.7894737
## precision_with_NA            0.4929171         0.7959075         0.8480093
## precision_without_NA         0.5581588         0.8735242         0.9259893
##                      SRR6325830.freque SRR6325831.freque SRR6325859.freque
## Acinetobacter             6512.0000000      7193.0000000     11293.0000000
## Actinomyces               1110.0000000      1156.0000000      2527.0000000
## Bacillus                     0.0000000         0.0000000         0.0000000
## Bacteroides                751.0000000       686.0000000      6465.0000000
## Bifidobacterium            269.0000000       106.0000000       165.0000000
## Clostridium                  0.0000000         0.0000000         0.0000000
## Deinococcus               1110.0000000       254.0000000       595.0000000
## Enterococcus             90159.0000000     67629.0000000      5505.0000000
## Escherichia                  0.0000000         0.0000000         0.0000000
## Helicobacter               408.0000000       296.0000000      1056.0000000
## Lactobacillus             1094.0000000       905.0000000      1460.0000000
## Listeria                  1454.0000000      2027.0000000      3202.0000000
## Neisseria                45205.0000000     52283.0000000     88802.0000000
## Porphyromonas             6555.0000000      6804.0000000     18322.0000000
## Propionibacterium            0.0000000         0.0000000         0.0000000
## Pseudomonas              21605.0000000     22188.0000000     49964.0000000
## Rhodobacter                673.0000000       386.0000000      1878.0000000
## Staphylococcus            4487.0000000      2666.0000000      1958.0000000
## Streptococcus             2926.0000000      1625.0000000       528.0000000
## Others                   38994.0000000     43671.0000000     59939.0000000
## sensitivity                  0.7894737         0.7894737         0.7894737
## precision_with_NA            0.8253833         0.7919190         0.7637025
## precision_without_NA         0.9019059         0.8711495         0.8460054
##                      SRR6325860.freque SRR6325861.freque SRR6325862.freque
## Acinetobacter            15193.0000000     16686.0000000     16852.0000000
## Actinomyces               1740.0000000       886.0000000      1123.0000000
## Bacillus                     0.0000000         0.0000000         0.0000000
## Bacteroides               5152.0000000      1230.0000000      3948.0000000
## Bifidobacterium             87.0000000        46.0000000       110.0000000
## Clostridium                  0.0000000         0.0000000         0.0000000
## Deinococcus                480.0000000       558.0000000       536.0000000
## Enterococcus              5765.0000000     19608.0000000     17070.0000000
## Escherichia                  0.0000000         0.0000000         0.0000000
## Helicobacter               973.0000000        61.0000000       612.0000000
## Lactobacillus             1782.0000000       744.0000000      1115.0000000
## Listeria                  2619.0000000      2176.0000000      3951.0000000
## Neisseria                74848.0000000     11007.0000000     70355.0000000
## Porphyromonas            14954.0000000      1411.0000000     10555.0000000
## Propionibacterium            0.0000000         0.0000000         0.0000000
## Pseudomonas              39483.0000000      7028.0000000     34481.0000000
## Rhodobacter               1405.0000000       935.0000000      1102.0000000
## Staphylococcus            1431.0000000       277.0000000      1494.0000000
## Streptococcus              464.0000000       847.0000000       669.0000000
## Others                   60735.0000000     50553.0000000     77993.0000000
## sensitivity                  0.7894737         0.7894737         0.7894737
## precision_with_NA            0.7325757         0.5567587         0.6776696
## precision_without_NA         0.8239576         0.6077427         0.7447868

 ここまででサンプルごとの結果のまとめが完了になります。

W5.1.4 情報抽出(サンプル全体)

 次に、W3.6.10を再実行します。

res <- get_W3.6(data, genus, genus_truth) # 属の出現頻度のまとめ情報を取得してresに格納
res                                       # resの中身
## $freque
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##            178135             22229                 0             44692 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##              2399                 0             11155            493338 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##                 0              8434             15355             35818 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##            685642            109985                 0            376440 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##             19232             37246             17850            786825 
## 
## $TPposi
##   [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
##  [25]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE
##  [37] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [49] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [85] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97]  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
## [133]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [397] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
## [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [421] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [433] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [445] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [457] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [481] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [493] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
## [505] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [517] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [529] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [541] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [553] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [565] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [577] FALSE FALSE FALSE FALSE
## 
## $sensitivity
## [1] 0.7894737
## 
## $precision_with_NA
##   Others 
## 0.723414 
## 
## $precision_without_NA
## [1] 0.8066153

 resオブジェクトには、サンプル全体の属レベルの出現頻度、感度、適合率の情報が含まれていることがわかります。これをc関数を用いてW5.1.2と同様のノリで以下のように連結します。

overall <- c(res$freque,                  # ベクトルとして連結した結果をoverallに格納
             res$sensitivity,             # ベクトルとして連結した結果をoverallに格納
             res$precision_with_NA,       # ベクトルとして連結した結果をoverallに格納
             res$precision_without_NA)    # ベクトルとして連結した結果をoverallに格納
overall                                   # overallの中身
##     Acinetobacter       Actinomyces          Bacillus       Bacteroides 
##    178135.0000000     22229.0000000         0.0000000     44692.0000000 
##   Bifidobacterium       Clostridium       Deinococcus      Enterococcus 
##      2399.0000000         0.0000000     11155.0000000    493338.0000000 
##       Escherichia      Helicobacter     Lactobacillus          Listeria 
##         0.0000000      8434.0000000     15355.0000000     35818.0000000 
##         Neisseria     Porphyromonas Propionibacterium       Pseudomonas 
##    685642.0000000    109985.0000000         0.0000000    376440.0000000 
##       Rhodobacter    Staphylococcus     Streptococcus            Others 
##     19232.0000000     37246.0000000     17850.0000000    786825.0000000 
##                              Others                   
##         0.7894737         0.7234140         0.8066153

 overallの要素数は、サンプルごとのまとめ情報であるresult_persの行数と同じになります。

length(overall)                           # overallの要素数
## [1] 23
dim(result_pers)                          # result_persの行数と列数
## [1] 23 12

W5.1.5 全体の整形

 サンプル全体の結果であるresから、出現頻度、感度、適合率の情報のみを抽出して1つのベクトルとしてまとめます。そしてそのベクトルをサンプルごとの結果のまとめであるresult_persの右側に列方向で連結します。

result_all <- cbind(result_pers, overall) # result_persとoverallを列方向で連結してresult_allに格納

W5.1.6 ファイル出力

 ファイル出力します。第24回のW4.4.3と同様のテクニックを用いています。念のため、ここでもタブ区切りテキストファイル版(output_JSLAB25_genus.txt)とxlsx版(output_JSLAB25_genus.xlsx)をダウンロードできるようにしておきます。

tmp <- cbind(rownames(result_all), result_all)# result_allの行名と、result_allを列方向で連結してtmpに格納
write.table(x = tmp, file = "output_JSLAB25_genus.txt", sep = "\t", row.names = F)# tmpの中身を指定したファイル名でタブ区切りテキストファイルとして、行名をつけずに保存

W5.1.7 まとめて実行

 W5.1のスクリプトを以下にまとめます。

source("http://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB_source.R") # 関数の読込
# サンプルごと
result <- apply(X = data, MARGIN = 2,     # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                FUN = getFreqPerSample,   # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                genus, genus_truth)       # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
hoge <- sapply(X = result, FUN = `[`, 1)  # result中の各要素から、1番目の要素の抽出結果をhogeに格納
freq_mat <- sapply(X = hoge, FUN = cbind) # hoge中の各要素を列方向で結合した結果をfreq_matに格納
rownames(freq_mat) <- names(hoge[[1]])    # names(hoge[[1]])をfreq_matの行名情報とする
sensitivity <- unlist(sapply(X = result, FUN = `[`, 3)) # result中の各要素から3番目の要素のみ抽出した結果をベクトル形式にしてsensitivityに格納
precision_with_NA <- unlist(sapply(X = result, FUN = `[`, 4)) # result中の各要素から4番目の要素のみ抽出した結果をベクトル形式にしてprecision_with_NAに格納
precision_without_NA <- unlist(sapply(X = result, FUN = `[`, 5)) # result中の各要素から5番目の要素のみ抽出した結果をベクトル形式にしてprecision_without_NAに格納
result_pers <- rbind(freq_mat,            # 行方向で結合した結果をresult_persに格納
                     sensitivity,         # 行方向で結合した結果をresult_persに格納
                     precision_with_NA,   # 行方向で結合した結果をresult_persに格納
                     precision_without_NA)# 行方向で結合した結果をresult_persに格納

# サンプル全体
res <- get_W3.6(data, genus, genus_truth) # 属の出現頻度のまとめ情報を取得してresに格納
overall <- c(res$freque,                  # ベクトルとして連結した結果をoverallに格納
             res$sensitivity,             # ベクトルとして連結した結果をoverallに格納
             res$precision_with_NA,       # ベクトルとして連結した結果をoverallに格納
             res$precision_without_NA)    # ベクトルとして連結した結果をoverallに格納

# ファイル出力
result_all <- cbind(result_pers, overall) # result_persとoverallを列方向で連結してresult_allに格納
tmp <- cbind(rownames(result_all), result_all)# result_allの行名と、result_allを列方向で連結してtmpに格納
write.table(x = tmp, file = "output_JSLAB25_genus.txt", sep = "\t", row.names = F)# tmpの中身を指定したファイル名でタブ区切りテキストファイルとして、行名をつけずに保存

 上記のスクリプトは、W5.1で使ってきたものをそのままペタペタ貼り付けていっただけですが、この後に行う種レベルの解析を意識して、変更可能性のあるオブジェクト名を最初のほうに集約させたものも以下に示しておきます。

source("http://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB_source.R") # 関数の読込
# パラメータ
prediction <- genus                       # dada2実行結果のオブジェクトをpredictionにコピー
truth <- genus_truth                      # 正解情報をtruthにコピー
out_f <- "output_JSLAB25_genus.txt"       # 出力ファイル名をout_fにコピー

# サンプルごと
result <- apply(X = data, MARGIN = 2,     # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                FUN = getFreqPerSample,   # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                prediction, truth)        # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
hoge <- sapply(X = result, FUN = `[`, 1)  # result中の各要素から、1番目の要素の抽出結果をhogeに格納
freq_mat <- sapply(X = hoge, FUN = cbind) # hoge中の各要素を列方向で結合した結果をfreq_matに格納
rownames(freq_mat) <- names(hoge[[1]])    # names(hoge[[1]])をfreq_matの行名情報とする
sensitivity <- unlist(sapply(X = result, FUN = `[`, 3)) # result中の各要素から3番目の要素のみ抽出した結果をベクトル形式にしてsensitivityに格納
precision_with_NA <- unlist(sapply(X = result, FUN = `[`, 4)) # result中の各要素から4番目の要素のみ抽出した結果をベクトル形式にしてprecision_with_NAに格納
precision_without_NA <- unlist(sapply(X = result, FUN = `[`, 5)) # result中の各要素から5番目の要素のみ抽出した結果をベクトル形式にしてprecision_without_NAに格納
result_pers <- rbind(freq_mat,            # 行方向で結合した結果をresult_persに格納
                     sensitivity,         # 行方向で結合した結果をresult_persに格納
                     precision_with_NA,   # 行方向で結合した結果をresult_persに格納
                     precision_without_NA)# 行方向で結合した結果をresult_persに格納

# サンプル全体
res <- get_W3.6(data, prediction, truth)  # 出現頻度のまとめ情報を取得してresに格納
overall <- c(res$freque,                  # ベクトルとして連結した結果をoverallに格納
             res$sensitivity,             # ベクトルとして連結した結果をoverallに格納
             res$precision_with_NA,       # ベクトルとして連結した結果をoverallに格納
             res$precision_without_NA)    # ベクトルとして連結した結果をoverallに格納

# ファイル出力
result_all <- cbind(result_pers, overall) # result_persとoverallを列方向で連結してresult_allに格納
tmp <- cbind(rownames(result_all), result_all)# result_allの行名と、result_allを列方向で連結してtmpに格納
write.table(x = tmp, file = out_f, sep = "\t", row.names = F)# tmpの中身を指定したファイル名でタブ区切りテキストファイルとして、行名をつけずに保存

W5.2 抽出結果のまとめ(種レベル)

 W5.1.7のスクリプトの最初のほうを少し変更するだけで、種レベルの結果も簡単に得られます。念のため、ここでもタブ区切りテキストファイル版(output_JSLAB25_species.txt)とxlsx版(output_JSLAB25_species.xlsx)をダウンロードできるようにしておきます。

source("http://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB_source.R") # 関数の読込
# パラメータ
prediction <- species                     # dada2実行結果のオブジェクトをpredictionにコピー
truth <- species_truth                    # 正解情報をtruthにコピー
out_f <- "output_JSLAB25_species.txt"     # 出力ファイル名をout_fにコピー

# サンプルごと
result <- apply(X = data, MARGIN = 2,     # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                FUN = getFreqPerSample,   # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                prediction, truth)        # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
hoge <- sapply(X = result, FUN = `[`, 1)  # result中の各要素から、1番目の要素の抽出結果をhogeに格納
freq_mat <- sapply(X = hoge, FUN = cbind) # hoge中の各要素を列方向で結合した結果をfreq_matに格納
rownames(freq_mat) <- names(hoge[[1]])    # names(hoge[[1]])をfreq_matの行名情報とする
sensitivity <- unlist(sapply(X = result, FUN = `[`, 3)) # result中の各要素から3番目の要素のみ抽出した結果をベクトル形式にしてsensitivityに格納
precision_with_NA <- unlist(sapply(X = result, FUN = `[`, 4)) # result中の各要素から4番目の要素のみ抽出した結果をベクトル形式にしてprecision_with_NAに格納
precision_without_NA <- unlist(sapply(X = result, FUN = `[`, 5)) # result中の各要素から5番目の要素のみ抽出した結果をベクトル形式にしてprecision_without_NAに格納
result_pers <- rbind(freq_mat,            # 行方向で結合した結果をresult_persに格納
                     sensitivity,         # 行方向で結合した結果をresult_persに格納
                     precision_with_NA,   # 行方向で結合した結果をresult_persに格納
                     precision_without_NA)# 行方向で結合した結果をresult_persに格納

# サンプル全体
res <- get_W3.6(data, prediction, truth)  # 出現頻度のまとめ情報を取得してresに格納
overall <- c(res$freque,                  # ベクトルとして連結した結果をoverallに格納
             res$sensitivity,             # ベクトルとして連結した結果をoverallに格納
             res$precision_with_NA,       # ベクトルとして連結した結果をoverallに格納
             res$precision_without_NA)    # ベクトルとして連結した結果をoverallに格納

# ファイル出力
result_all <- cbind(result_pers, overall) # result_persとoverallを列方向で連結してresult_allに格納
tmp <- cbind(rownames(result_all), result_all)# result_allの行名と、result_allを列方向で連結してtmpに格納
write.table(x = tmp, file = out_f, sep = "\t", row.names = F)# tmpの中身を指定したファイル名でタブ区切りテキストファイルとして、行名をつけずに保存

W6 正しい種名で再解析

 菌株情報ファイル中のスペルミスを修正したうえでW5をやり直します。具体的には、meningitidesをmeningitidisに修正したJSLAB23_table1_corrected.txtを入力ファイルとして実行します。W2.3で得られるオブジェクトとの違いは、species_truthのみになります。

# W2.1 dada2実行結果ファイルのほう
in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/output_JSLAB24.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t")# in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
obj <- grep(pattern = "SRR", x = colnames(hoge))  # colnames(hoge)の中から"SRR"という文字を含む要素番号を抽出した結果をobjに格納
data <- hoge[, obj]                       # hoge行列中のobjで指定した列のみ抽出した結果をdataに格納
genus <- hoge$Genus                       # hoge中のGenus列を抽出した結果をgenusに格納
species <- hoge$Species                   # hoge中のSpecies列を抽出した結果をspeciesに格納

# W2.2 菌株情報ファイルのほう
in_f <- "https://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB23_table1_corrected.txt" # 読み込みたいファイル情報をin_fに格納
hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t") #in_fを、1行目を列名、1列目を行名として読み込んだ結果をhogeに格納
organism <- hoge$Organism                 # hoge中のOrganism列を抽出した結果をorganismに格納
hoge <- strsplit(x = organism, split = ",")# organism中の文字列ベクトルをコンマで分割した結果をhogeに格納
hoge2 <- sapply(X = hoge, FUN = `[`, 1)   # hoge中のベクトル形式の各要素から、1番目の要素の抽出結果をhoge2に格納
hoge3 <- strsplit(x = hoge2, split = " ") # hoge2中の文字列ベクトルを半角スペースで分割した結果をhoge3に格納
genus_truth <- sapply(X = hoge3, FUN = `[`, 1)  # hoge3中のベクトル形式の各要素から、1番目の要素の抽出結果をgenus_truthに格納
species_truth <- sapply(X = hoge3, FUN = `[`, 2)# hoge3中のベクトル形式の各要素から、2番目の要素の抽出結果をspecies_truthに格納
genus_truth <- unique(genus_truth)        # genus_truth中のユニークな要素をgenus_truthに格納
species_truth <- unique(species_truth)    # species_truth中のユニークな要素をspecies_truthに格納

 次に、W5.2に相当する内容を再度実行します。W5.2との違いは、出力ファイル名のみです。念のため、ここでもタブ区切りテキストファイル版(output_JSLAB25_species_corrected.txt)とxlsx版(output_JSLAB25_species_corrected.xlsx)をダウンロードできるようにしておきます

source("http://www.iu.a.u-tokyo.ac.jp/kadota/book/JSLAB_source.R") # 関数の読込
# パラメータ
prediction <- species                     # dada2実行結果のオブジェクトをpredictionにコピー
truth <- species_truth                    # 正解情報をtruthにコピー
out_f <- "output_JSLAB25_species_corrected.txt" # 出力ファイル名をout_fにコピー

# サンプルごと
result <- apply(X = data, MARGIN = 2,     # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                FUN = getFreqPerSample,   # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
                prediction, truth)        # dataの列ごとに出現頻度のまとめ情報を取得した結果をresultに格納
hoge <- sapply(X = result, FUN = `[`, 1)  # result中の各要素から、1番目の要素の抽出結果をhogeに格納
freq_mat <- sapply(X = hoge, FUN = cbind) # hoge中の各要素を列方向で結合した結果をfreq_matに格納
rownames(freq_mat) <- names(hoge[[1]])    # names(hoge[[1]])をfreq_matの行名情報とする
sensitivity <- unlist(sapply(X = result, FUN = `[`, 3)) # result中の各要素から3番目の要素のみ抽出した結果をベクトル形式にしてsensitivityに格納
precision_with_NA <- unlist(sapply(X = result, FUN = `[`, 4)) # result中の各要素から4番目の要素のみ抽出した結果をベクトル形式にしてprecision_with_NAに格納
precision_without_NA <- unlist(sapply(X = result, FUN = `[`, 5)) # result中の各要素から5番目の要素のみ抽出した結果をベクトル形式にしてprecision_without_NAに格納
result_pers <- rbind(freq_mat,            # 行方向で結合した結果をresult_persに格納
                     sensitivity,         # 行方向で結合した結果をresult_persに格納
                     precision_with_NA,   # 行方向で結合した結果をresult_persに格納
                     precision_without_NA)# 行方向で結合した結果をresult_persに格納

# サンプル全体
res <- get_W3.6(data, prediction, truth)  # 出現頻度のまとめ情報を取得してresに格納
overall <- c(res$freque,                  # ベクトルとして連結した結果をoverallに格納
             res$sensitivity,             # ベクトルとして連結した結果をoverallに格納
             res$precision_with_NA,       # ベクトルとして連結した結果をoverallに格納
             res$precision_without_NA)    # ベクトルとして連結した結果をoverallに格納

# ファイル出力
result_all <- cbind(result_pers, overall) # result_persとoverallを列方向で連結してresult_allに格納
tmp <- cbind(rownames(result_all), result_all)# result_allの行名と、result_allを列方向で連結してtmpに格納
write.table(x = tmp, file = out_f, sep = "\t", row.names = F)# tmpの中身を指定したファイル名でタブ区切りテキストファイルとして、行名をつけずに保存
LS0tDQp0aXRsZTogIlvnrKwyNeWbnl0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9yX3NlcTIuaHRtbCNib29rX0pTTEFCXzI1KeOBruOCpuOCp+ODluizh+aWmSINCmRhdGU6ICfmnIDntYLmm7TmlrA6IGByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkvJW0vJWQiKWAnDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KYGBge3Iga2xpcHB5LCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQprbGlwcHk6OmtsaXBweSgpDQpgYGANCg0KIyDjga/jgZjjgoHjgasNCi0gW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCkNCi0gW291dHB1dF9KU0xBQjI0Lnhsc3hdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC54bHN4KQ0KLSBbSlNMQUIyM190YWJsZTEudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0KQ0KLSBbZGFkYTJdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9kYWRhMi5odG1sKe+8mltDYWxsYWhhbiBldCBhbC4sIE5hdCBNZXRob2RzLCAyMDE2XShodHRwczovL3B1Ym1lZC5uY2JpLm5sbS5uaWguZ292LzI3MjE0MDQ3LykgICANCi0gW1NSUDEyNTcyM10oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JQMTI1NzIzKSAoW0hhbGxtYWllci1XYWNrZXIgZXQgYWwuLCBTY2kgUmVwLiwgMjAxOF0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yOTY3NDY0MS8pKSAgDQrku4rlm57nlKjjgYTjgovjg6rjg7zjg4njg4fjg7zjgr/jgafjgZnjgILjgqrjg6rjgrjjg4rjg6vjga/oqIg2NOOCteODs+ODl+ODq+WIhuOBruODh+ODvOOCv+OCkuWPluW+l+OBl+OBpuOBhOOBvuOBmeOBjOOAgeS7peS4i+OBrjEy44K144Oz44OX44Or5YiG44Gu44OH44O844K/44Gu44G/6Kej5p6Q44GX44G+44GZ44CCICANCg0KfCDjgrXjg7Pjg5fjg6tJRCB8IEROQeaKveWHuuOCreODg+ODiCB8IOS/neWtmOODkOODg+ODleOCoSB8IOODquODvOODieaVsCB8DQp8Oi0tLTp8Oi0tLTp8Oi0tLTp8Oi0tLTp8DQp8IFtTUlI2MzI1ODEzXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODEzKSB8IFFNSU5JIHwgTmF0aXZlIHwgMjgyNTE3IHwNCnwgW1NSUjYzMjU4MTVdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MTUpIHwgUU1JTkkgfCBMeXNpc0J1ZmZlciB8IDI2NjI1OSB8DQp8IFtTUlI2MzI1ODE2XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODE2KSB8IFFNSU5JIHwgUk5BLWxhdGVyIHwgMzU5OTg0IHwNCnwgW1NSUjYzMjU4MTddKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MTcpIHwgUU1JTkkgfCBQQlMgfCAzMjU2NjAgfA0KfCBbU1JSNjMyNTgyOF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTgyOCkgfCBNT0JJTyB8IFJOQS1sYXRlciB8IDIwNjkzOSB8DQp8IFtTUlI2MzI1ODI5XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODI5KSB8IE1PQklPIHwgUEJTIHwgMjYxNzY3IHwNCnwgW1NSUjYzMjU4MzBdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MzApIHwgTU9CSU8gfCBOYXRpdmUgfCAyMzg2MjcgfA0KfCBbU1JSNjMyNTgzMV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTgzMSkgfCBNT0JJTyB8IEx5c2lzQnVmZmVyIHwgMjI1NTQ4IHwNCnwgW1NSUjYzMjU4NTldKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4NTkpIHwgR0VOSUFMIHwgTHlzaXNCdWZmZXIgfCAyOTAzODMgfA0KfCBbU1JSNjMyNTg2MF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MCkgfCBHRU5JQUwgfCBOYXRpdmUgfCAyNTM5MDggfA0KfCBbU1JSNjMyNTg2MV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MSkgfCBHRU5JQUwgfCBQQlMgfCAxMjA3ODkgfA0KfCBbU1JSNjMyNTg2Ml0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MikgfCBHRU5JQUwgfCBSTkEtbGF0ZXIgfCAyNTg3OTIgfA0KDQojIFcxIOODleOCoeOCpOODq+OBruiqrei+vA0K44CA44GT44GT44Gn44Gv44CB44K/44OW5Yy65YiH44KK44OG44Kt44K544OI44OV44Kh44Kk44Or44GoeGxzeOW9ouW8j+ODleOCoeOCpOODq+OBruiqrei+vOOCkuihjOOBhOOBvuOBmeOAguWFpeWKm+ODleOCoeOCpOODq+OBjOWQjOOBmOOBp+OCguOAgeiqreOBv+i+vOOBv+aZguOBrioq44Kq44OX44K344On44Oz5qyh56ys44Gn44CB6Kqt44G/6L6844G/5b6M44Gu44Kq44OW44K444Kn44Kv44OI77yI44GT44Gu5aC05ZCI44GvYGhvZ2Vg77yJ44Gu6KGM5pWw44KE5YiX5pWw44CB6KGM5ZCN44KE5YiX5ZCN44Gu5pyJ54Sh44Gq44Gp44KC5aSJ44KP44KK44G+44GZKirjga7jgafjgIHjgZTms6jmhI/jgY/jgaDjgZXjgYTjgIINCg0KIyMgVzEuMSBkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODqw0K44CA56ysMjTlm57jga7lm7M144Gn6KaL44GI44Gm44GE44KL44OV44Kh44Kk44Or44Gu6Kqt6L6844KS6KGM44GG44Gu44GM5Li744Gq55uu55qE44Gn44GZ44CC44K/44OW5Yy65YiH44KK44OG44Kt44K544OI44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga7oqq3ovrzjgIF4bHN45b2i5byP44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0Lnhsc3hdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC54bHN4Ke+8ieOBruiqrei+vOOBrjLjg5Hjgr/jg7zjg7PjgpLnpLrjgZfjgb7jgZnjgILkvYbjgZflvozogIXjga7loLTlkIjjga/jgIF4bHN45b2i5byP44OV44Kh44Kk44Or44KS6Kqt44G/6L6844KA44Gf44KB44Gu6Zai5pWw44KS5o+Q5L6b44GX44Gm44GE44KL44OR44OD44Kx44O844K444Gu44Ot44O844OJ44GL44KJ44Gr44Gq44KK44G+44GZ44CC44GT44GT44Gn44Gv44Gd44Gu44GG44Gh44GuMeOBpOOBp+OBguOCi1tvcGVueGxzeF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvcGFja2FnZT1vcGVueGxzeCnjg5Hjg4PjgrHjg7zjgrjjga7jg63jg7zjg4njgYvjgonooYzjgYTjgb7jgZnjgILjg5Ljg4jjgavjgojjgaPjgabjgZPjga7jg5Hjg4PjgrHjg7zjgrjjga7jgqTjg7Pjgrnjg4jjg7zjg6vjgYzjgafjgY3jgabjgYTjgovjgYvjganjgYbjgYvjga/nlbDjgarjgorjgb7jgZnjgILjgZ3jgozjgobjgYjjgIHoi6XlubLmjJnli5XjgoLnlbDjgarjgorjgb7jgZnjgYzjgIFXMS4x44KS5LiA6YCa44KK44KE44KM44Gw5YWo5ZOh44K/44OW5Yy65YiH44KK44OG44Kt44K544OI44OV44Kh44Kk44Or44Gn44KCeGxzeOW9ouW8j+ODleOCoeOCpOODq+OBp+OCguiqreOBv+i+vOOCgeOCi+OCiOOBhuOBq+OBquOCi+OBqOaAneOBhOOBvuOBmeOAgg0KDQojIyMgVzEuMS4xIGByZWFkLnRhYmxlYOmWouaVsA0K44CAYHJlYWQudGFibGVg6Zai5pWw44Gv44CB5qeY44CF44Gq44OG44Kt44K544OI44OV44Kh44Kk44Or44KS6Kqt44G/6L6844KA44Gf44KB44Gu6Zai5pWw44Gn44GZ44CCYGhlYWRlcj1UUlVFYOOBr+OAgTHooYznm67jgpLliJflkI3jgajjgZfjgablj5bjgormibHjgYbjgajjgYTjgYblrqPoqIDjgafjgZnjgIJgcm93Lm5hbWVzPTFg44Gv44CBMeWIl+ebruOCkuihjOWQjeOBqOOBl+OBpuWPluOCiuaJseOBhuOBqOOBhOOBhuWuo+iogOOBp+OBmeOAgmBzZXA9Ilx0ImDjga/jgIHljLrliIfjgormloflrZfjgYzjgr/jg5YoYFx0YCnjgafjgYLjgovjgajjgYTjgYblrqPoqIDjgafjgZnjgILkvovjgYjjgbDjgoLjgZfljYrop5Ljgrnjg5rjg7zjgrnjgafkuK3ouqvjgpLljLrliIfjgorjgZ/jgYTloLTlkIjjga/jgIFgc2VwPSIgImDjgajjgZfjgb7jgZnjgILjgb7jgZ/jgIHjgrPjg7Pjg57ljLrliIfjgorjgavjgZfjgaboqq3jgb/ovrzjgb/jgZ/jgYTloLTlkIjjga/jgIFgc2VwPSIsImDjgavjgZfjgb7jgZnjgIINCuOAgA0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9VFJVRX0NCmluX2YgPC0gImh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQiICMg6Kqt44G/6L6844G/44Gf44GE44OV44Kh44Kk44Or5oOF5aCx44KSaW5fZuOBq+agvOe0jQ0KaG9nZSA8LSByZWFkLnRhYmxlKGluX2YsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9MSwgc2VwPSJcdCIpIyBpbl9m44KS44CBMeihjOebruOCkuWIl+WQjeOAgTHliJfnm67jgpLooYzlkI3jgajjgZfjgaboqq3jgb/ovrzjgpPjgaDntZDmnpzjgpJob2dl44Gr5qC857SNDQpkaW0oaG9nZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2Xjga7ooYzmlbDjgajliJfmlbANCmBgYA0K44CA6Kqt44G/6L6844G/5b6M44Gu44Kq44OW44K444Kn44Kv44OI44Gu6KGM5pWw44GvYHIgbnJvdyhob2dlKWDjgIHliJfmlbDjga9gciBuY29sKGhvZ2UpYOOBp+OBguOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAgiDkuIDnlarlj7PjgYvjgoky55Wq55uu44GuR2VudXPliJfjgYzlsZ7lkI3jgIHkuIDnlarlj7Pjga5TcGVjaWVz5YiX44GM56iu5ZCN44Gn44GZ44Gu44Gn44CB44GT44Gu5Lit44Gr44Gp44KM44GP44KJ44GE6KiIMTnlsZ7vvIgyMueoru+8ieOBruaXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4Ke+8iFtHZXZlcnMgZXQgYWwuLCBQTG9TIENvbXB1dCBCaW9sLiwgMjAxMl0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yMzIwOTM4OS8p77yJ44GM5ZCr44G+44KM44Gm44GE44KL44Gu44GL44Gq44Gp44KS6KmV5L6h44GX44Gm44GE44GP44GT44Go44Gr44Gq44KK44G+44GZ44CCDQoNCiMjIyBXMS4xLjIgYHJlYWQueGxzeGDplqLmlbANCuOAgGByZWFkLnhsc3hg6Zai5pWw44Gv44CBW29wZW54bHN4XShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy9wYWNrYWdlPW9wZW54bHN4KeODkeODg+OCseODvOOCuOOBi+OCieaPkOS+m+OBmeOCi+OAgXhsc3jlvaLlvI/jg5XjgqHjgqTjg6vjgpLoqq3jgb/ovrzjgoDjgZ/jgoHjga7plqLmlbDjgafjgZnjgIJgY29sTmFtZXM9VGDjgqrjg5fjgrfjg6fjg7Pjga/jgIEx6KGM55uu44KS5YiX5ZCN44Go44GX44Gm5Y+W44KK5omx44GG44Go44GE44GG5a6j6KiA44Gr44Gq44KK44G+44GZ77yIMeihjOebruOBjOWIl+WQjeaDheWgseOBp+OBr+OBquOBhOWgtOWQiOOBr2Bjb2xOYW1lcz1GYOOBqOOBl+OBvuOBme+8ieOAguOBneOCjOOChuOBiOOAgVtvcGVueGxzeF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvcGFja2FnZT1vcGVueGxzeCnjg5Hjg4PjgrHjg7zjgrjjgYzjgqTjg7Pjgrnjg4jjg7zjg6vjgZXjgozjgabjgYTjgarjgYTjg5Ljg4jjga/jgIHjgZPjga7jg5Hjg4PjgrHjg7zjgrjjga7jg63jg7zjg4npg6jliIbku6XpmY3jgafjgqjjg6njg7zjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaW5fZiA8LSAiaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0Lnhsc3giICMg6Kqt44G/6L6844G/44Gf44GE44OV44Kh44Kk44Or5oOF5aCx44KSaW5fZuOBq+agvOe0jQ0KbGlicmFyeShvcGVueGxzeCkgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcGVueGxzeOODkeODg+OCseODvOOCuOOBruODreODvOODiQ0KaG9nZSA8LSByZWFkLnhsc3goaW5fZiwgY29sTmFtZXM9VCwgcm93TmFtZXM9VCkjIGluX2bjgpLjgIEx6KGM55uu44KS5YiX5ZCN44Go44GX44Gm6Kqt44G/6L6844KT44Gg57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0KZGltKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl44Gu6KGM5pWw44Go5YiX5pWwDQpgYGANCg0KIyMjIFcxLjEuMyBvcGVueGxzeOOBruOCpOODs+OCueODiOODvOODqw0K44CAW+mAo+i8ieesrDE45ZueXShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL3Jfc2VxMi5odG1sI2Jvb2tfSlNMQUJfMTgp44Gn44KC6KiA5Y+K44GX44Gf44CBW29wZW54bHN4XShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy9wYWNrYWdlPW9wZW54bHN4KeODkeODg+OCseODvOOCuOOBruOCpOODs+OCueODiOODvOODq+OCkuihjOOBhOOBvuOBmeOAguOBk+OBruODkeODg+OCseODvOOCuOiHquS9k+OBr1tDUkFOXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy8p44Go44GE44GG44Oq44Od44K444OI44Oq44GL44KJ5o+Q5L6b44GV44KM44Gm44GE44G+44GZ44Gu44Gn44CB5pys5b2T44Gv44KC44GG5bCR44GX44K344Oz44OX44Or44Gr5pu444GR44G+44GZ44CC44GX44GL44GX44CBW2RhZGEyXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvZGFkYTIuaHRtbCnjga7jgojjgYbjgatbQmlvY29uZHVjdG9yXShodHRwczovL3d3dy5iaW9jb25kdWN0b3Iub3JnLynjgajjgYTjgYbjg6rjg53jgrjjg4jjg6rjgYvjgonmj5DkvpvjgZXjgozjgabjgYTjgovjg5Hjg4PjgrHjg7zjgrjjgavlr77jgZfjgabjga/jgIHjgZ3jga7mm7jjgY3mlrnjga/pgJrnlKjjgZfjgb7jgZvjgpPjgILku6XkuIvjga/jganjgaHjgonjga7jg6rjg53jgrjjg4jjg6rjgYvjgonmj5DkvpvjgZXjgozjgabjgYTjgovjg5Hjg4PjgrHjg7zjgrjjgavlr77jgZfjgabjgoLpgannlKjlj6/og73jgarjgqTjg7Pjgrnjg4jjg7zjg6vmiYvmrrXjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFfQ0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJCaW9jTWFuYWdlciIsIHF1aWV0bHk9VCkpIyDjgoLjgZdCaW9jTWFuYWdlcuODkeODg+OCseODvOOCuOOBjOWFpeOBo+OBpuOBhOOBquOBkeOCjOOBsC4uLg0KICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikgICAgICAgIyBCaW9jTWFuYWdlcuODkeODg+OCseODvOOCuOOCkuOCpOODs+OCueODiOODvOODq+OBm+OCiA0KQmlvY01hbmFnZXI6Omluc3RhbGwoIm9wZW54bHN4IiwgdXBkYXRlPUYpIyBvcGVueGxzeOODkeODg+OCseODvOOCuOOCkuOCpOODs+OCueODiOODvOODq+OBm+OCiA0KYGBgDQoNCiMjIyBXMS4xLjQgb3Blbnhsc3jjgYzjgYLjgovnirbmhYsNCuOAgOWun+ihjOaZguOBq+OAjOitpuWRijogICDjg5Hjg4PjgrHjg7zjgrgg4oCYb3Blbnhsc3jigJkg44Gv44OQ44O844K444On44OzIDQueC54IOOBriBSIOOBruS4i+OBp+mAoOOCieOCjOOBvuOBl+OBnyDjgI3jga7jgojjgYbjgarorablkYrjgYzlh7rjgovjgZPjgajjgYzjgYLjgorjgb7jgZnjgYzjgIHjgZPjgozjga/msJfjgavjgZnjgovlv4XopoHjga/jgYLjgorjgb7jgZvjgpPjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaW5fZiA8LSAiaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0Lnhsc3giICMg6Kqt44G/6L6844G/44Gf44GE44OV44Kh44Kk44Or5oOF5aCx44KSaW5fZuOBq+agvOe0jQ0KbGlicmFyeShvcGVueGxzeCkgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcGVueGxzeOODkeODg+OCseODvOOCuOOBruODreODvOODiQ0KaG9nZSA8LSByZWFkLnhsc3goaW5fZiwgY29sTmFtZXM9VCwgcm93TmFtZXM9VCkjIGluX2bjgpLjgIEx6KGM55uu44KS5YiX5ZCN44Go44GX44Gm6Kqt44G/6L6844KT44Gg57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0KZGltKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl44Gu6KGM5pWw44Go5YiX5pWwDQpgYGANCg0K44Gq44GK44CB5LiK6KiY44GuMi0z6KGM55uu44Gu6YOo5YiG44Gr44Gk44GE44Gm44Gv44CB5Lul5LiL44Gu44KI44GG44Gr44G+44Go44KB44Gm5pu444GP44OS44OI44KC44GE44G+44GZ44CC6KaL5oWj44KM44Gq44GE44GG44Gh44Gv55u45b2T5Zuw5oOR44GX44G+44GZ44Gu44Gn44CB5LuK44Gu44GG44Gh44Gr5oWj44KM44Gm44GK44GN44G+44GX44KH44GG44CC44CM44OR44OD44Kx44O844K45ZCNOjrjgZ3jga7jg5Hjg4PjgrHjg7zjgrjjgYzmj5DkvpvjgZnjgovplqLmlbDlkI3jgI3jgajjgYTjgYbjg5Xjgqnjg7zjg57jg4Pjg4jjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUV9DQppbl9mIDwtICJodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQueGxzeCIgIyDoqq3jgb/ovrzjgb/jgZ/jgYTjg5XjgqHjgqTjg6vmg4XloLHjgpJpbl9m44Gr5qC857SNDQpob2dlIDwtIG9wZW54bHN4OjpyZWFkLnhsc3goaW5fZiwgY29sTmFtZXM9VCwgcm93TmFtZXM9VCkjIGluX2bjgpLjgIEx6KGM55uu44KS5YiX5ZCN44Go44GX44Gm6Kqt44G/6L6844KT44Gg57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0KZGltKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl44Gu6KGM5pWw44Go5YiX5pWwDQpgYGANCg0KIyMgVzEuMiDoj4zmoKrmg4XloLHjg5XjgqHjgqTjg6sNCuOAgFvpgKPovInnrKwyM+Wbnl0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9yX3NlcTIuaHRtbCNib29rX0pTTEFCXzIzKeOBruihqDHjga7jgr/jg5bljLrliIfjgorjg4bjgq3jgrnjg4jjg5XjgqHjgqTjg6vvvIhbSlNMQUIyM190YWJsZTEudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0Ke+8ieOCkuiqrei+vOOBv+OBvuOBmeOAguOBk+OBruODleOCoeOCpOODq+OBruS4rei6q+OBr+OAgeioiDE55bGe77yIMjLnqK7vvInjga7ml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnvvIhbR2V2ZXJzIGV0IGFsLiwgUExvUyBDb21wdXQgQmlvbC4sIDIwMTJdKGh0dHBzOi8vcHVibWVkLm5jYmkubmxtLm5paC5nb3YvMjMyMDkzODkvKe+8ieOBruaDheWgseOBq+OBquOCiuOBvuOBmeOAgmBoZWFkZXI9VFJVRWDjga/jgIEx6KGM55uu44KS5YiX5ZCN44Go44GX44Gm5Y+W44KK5omx44GG44Go44GE44GG5a6j6KiA44Gn44GZ44CCYHJvdy5uYW1lcz0xYOOBr+OAgTHliJfnm67jgpLooYzlkI3jgajjgZfjgablj5bjgormibHjgYbjgajjgYTjgYblrqPoqIDjgafjgZnjgIJgc2VwPSJcdCJg44Gv44CB5Yy65YiH44KK5paH5a2X44GM44K/44OWKGBcdGAp44Gn44GC44KL44Go44GE44GG5a6j6KiA44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1UUlVFfQ0KaW5fZiA8LSAiaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCMjNfdGFibGUxLnR4dCIgIyDoqq3jgb/ovrzjgb/jgZ/jgYTjg5XjgqHjgqTjg6vmg4XloLHjgpJpbl9m44Gr5qC857SNDQpob2dlIDwtIHJlYWQudGFibGUoaW5fZiwgaGVhZGVyPVRSVUUsIHJvdy5uYW1lcz0xLCBzZXA9Ilx0IikgI2luX2bjgpLjgIEx6KGM55uu44KS5YiX5ZCN44CBMeWIl+ebruOCkuihjOWQjeOBqOOBl+OBpuiqreOBv+i+vOOCk+OBoOe1kOaenOOCkmhvZ2XjgavmoLzntI0NCmRpbShob2dlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeOBruihjOaVsOOBqOWIl+aVsA0KYGBgDQog6Kqt44G/6L6844G/5b6M44Gu6KGM5pWw44GvYHIgbnJvdyhob2dlKWDjgIHliJfmlbDjga9gciBuY29sKGhvZ2UpYOOBp+OBguOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAguS7peS4i+OBr+OAgWBob2dlYOOBruacgOWIneOBrmA0YOihjOWIhuOCkuihqOekuuOBl+OBpueiuuiqjeOBl+OBpuOBhOOCi+OBoOOBkeOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9VFJVRX0NCmhlYWQoaG9nZSwgbiA9IDQpICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeS4reOBruacgOWIneOBrjTjgaTjgpLnorroqo0NCmBgYA0KDQojIFcyIOWJjeWHpueQhg0K44CA44GT44GT44Gn44Gv44CBVzHjgafoqq3jgb/ovrzjgpPjgaAy44Gk44Gu44OV44Kh44Kk44Or44Gu5Lit44GL44KJ5b+F6KaB44Gq6YOo5YiG44Gg44GR44KS5oq95Ye644GZ44KL5pON5L2c44Gq44Gp44KS6KGM44GE44G+44GZ44CCVzEuMeOBp+iqreOBv+i+vOOCk+OBoGRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjgahXMS4y44Gn6Kqt44G/6L6844KT44Gg6KiIMTnlsZ7vvIgyMueoru+8ieOBruaXouefpeW+rueUn+eJqee+pOmbhuOBruaDheWgseOCkuWQq+OCk+OBoOODleOCoeOCpOODq++8iFtKU0xBQjIzX3RhYmxlMS50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQjIzX3RhYmxlMS50eHQp77yJDQoNCiMjIFcyLjEgZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6sNCuOAgFcxLjHjgafoqq3jgb/ovrzjgpPjgaBbZGFkYTJdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9kYWRhMi5odG1sKeWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44KS5YaN5bqm6Kqt44G/6L6844KA44Go44GT44KN44GL44KJ44K544K/44O844OI44GX44CB6KiIMTLjgrXjg7Pjg5fjg6vliIbjga5BU1bjgZTjgajjga7lh7rnj77poLvluqbmg4XloLHjgavnm7jlvZPjgZnjgovliJfvvIgiU1JSLi4uIuOBqOOBhOOBhuWQjeWJjeOBrjEy5YiX77yJ44KSYGRhdGFg44Go44GE44GG44Kq44OW44K444Kn44Kv44OI5ZCN44Gn44CBR2VudXPliJfjgpJgZ2VudXNg44Go44GE44GG44Kq44OW44K444Kn44Kv44OI5ZCN44Gn44CB44Gd44GX44GmU3BlY2llc+WIl+OCkmBzcGVjaWVzYOOBqOOBhOOBhuOCquODluOCuOOCp+OCr+ODiOWQjeOBp+W+l+OBvuOBmeOAgg0KDQojIyMgVzIuMS4xIGBjb2xuYW1lc2DplqLmlbANCuOAgOOBk+OBk+OBp+OBr+OAgVcxLjEuMeOCkuWGjeW6puWun+ihjOOBl+OBn+W+jOOAgWBjb2xuYW1lc2DplqLmlbDjgpLnlKjjgYTjgabooYzliJdgaG9nZWDjgqrjg5bjgrjjgqfjgq/jg4jjga7liJflkI3mg4XloLHjgpLooajnpLrjgZXjgZvjgb7jgZnjgIJgcmVhZC50YWJsZWDplqLmlbDlrp/ooYzmmYLjgavjgIFgaGVhZGVyPVRSVUVg44Kq44OX44K344On44Oz44KS44Gk44GR44Gm44GE44KL44Gu44Gn44CB6KGM5YiXYGhvZ2Vg44Gr5YiX5ZCN44GM5LuY5LiO44GV44KM44Gm44GE44G+44GZ44CC44KC44GXYGhlYWRlcj1UUlVFYOOCquODl+OCt+ODp+ODs+OCkuOBpOOBkeOBmuOBq+iqreOBv+i+vOOCk+OBp+OBhOOCjOOBsOOAge+8iGBob2dlYOOBq+WIl+WQjeaDheWgseOBjOS7mOS4juOBleOCjOOBquOBhOOBruOBp++8iWBjb2xuYW1lc2DplqLmlbDjgpLlrp/ooYzjgZfjgabjgoLkvZXjgoLooajnpLrjgZXjgozjgb7jgZvjgpPjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUV9DQppbl9mIDwtICJodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0IiAjIOiqreOBv+i+vOOBv+OBn+OBhOODleOCoeOCpOODq+aDheWgseOCkmluX2bjgavmoLzntI0NCmhvZ2UgPC0gcmVhZC50YWJsZShpbl9mLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEsIHNlcD0iXHQiKSMgaW5fZuOCkuOAgTHooYznm67jgpLliJflkI3jgIEx5YiX55uu44KS6KGM5ZCN44Go44GX44Gm6Kqt44G/6L6844KT44Gg57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0KZGltKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl44Gu6KGM5pWw44Go5YiX5pWwDQpjb2xuYW1lcyhob2dlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2Xjga7liJflkI3mg4XloLENCmBgYA0KDQojIyMgVzIuMS4yIGBncmVwYOmWouaVsA0K44CA5qyh44Gr44CB6KiIMTLjgrXjg7Pjg5fjg6vliIbjga5BU1bjgZTjgajjga7lh7rnj77poLvluqbmg4XloLHjgavnm7jlvZPjgZnjgovliJfvvIgiU1JSLi4uIuOBqOOBhOOBhuWQjeWJjeOBrjEy5YiX77yJ44KSYGRhdGFg44Go44GE44GG44Kq44OW44K444Kn44Kv44OI44Gr5qC857SN44GX44G+44GZ44CC5L2c5qWt6Ieq5L2T44GvYGRhdGEgPC0gaG9nZVssIDE6MTJdYOOBp+OCguOCiOOBhOOBruOBp+OBmeOBjOOAgeOBk+OBk+OBp+OBr+OBm+OBo+OBi+OBj+OBp+OBmeOBruOBp2BncmVwYOmWouaVsOOCkuWIqeeUqOOBl+OBvuOBmeOAgmBncmVwYOmWouaVsOOBr+OAgeWFpeWKm+OBjOaWh+Wtl+WIl+ODmeOCr+ODiOODq+OBruWgtOWQiOOAgeaknOe0ouOBl+OBn+OBhOaWh+Wtl+WIl+OCkuWQq+OCgOimgee0oOeVquWPt+OCkui/lOOBl+OBvuOBmeOAguOBvuOBmuOChOOCiuOBn+OBhOOBk+OBqOOBr+OAgWBjb2xuYW1lcyhob2dlKWDjgajjgYTjgYbmloflrZfliJfjg5njgq/jg4jjg6vjga7kuK3jgYvjgonjgIFgIlNSUiJg44Go44GE44GG5paH5a2X5YiX44KS5ZCr44KA6KaB57Sg55Wq5Y+35oOF5aCx44KS5b6X44KL44GT44Go44Gn44GZ44CCYHBhdHRlcm4gPSAiU1JSImDjgYzmpJzntKLmloflrZfliJfmg4XloLHjgIFgeCA9IGNvbG5hbWVzKGhvZ2UpYOOBjOiiq+aknOe0ouWvvuixoeOBq+OBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9VFJVRX0NCmNvbG5hbWVzKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeOBruWIl+WQjeaDheWgsQ0Kb2JqIDwtIGdyZXAocGF0dGVybiA9ICJTUlIiLCB4ID0gY29sbmFtZXMoaG9nZSkpICMgY29sbmFtZXMoaG9nZSnjga7kuK3jgYvjgokiU1JSIuOBqOOBhOOBhuaWh+Wtl+WIl+OCkuWQq+OCgOimgee0oOeVquWPt+aDheWgseOCkm9iauOBq+agvOe0jQ0Kb2JqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmrjga7kuK3ouqvjgpLnorroqo0NCmBgYA0K44CAYG9iamDjga7kuK3ouqvjga9gciBvYmpg44Gn44GZ44Gu44Gn44CB56K644GL44Gr5qSc57Si5paH5a2X5YiX44Gn44GC44KLYCJTUlIiYOOCkuWQq+OCgOWIl+eVquWPt+aDheWgseOCkuaKveWHuuOBp+OBjeOBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAgg0KDQojIyMgVzIuMS4zIOWIl+OBruaKveWHuu+8iGBkYXRhYO+8iQ0K44CA5YiX5pWw44GMYHIgbmNvbChob2dlKWDjga5gaG9nZWDooYzliJfjga7kuK3jgYvjgonjgIFgb2JqYOOBp+aMh+WumuOBl+OBn+WIl+eVquWPt+OBruOBv+OCkuaKveWHuuOBl+OBn+e1kOaenOOCkmBkYXRhYOOCquODluOCuOOCp+OCr+ODiOOBq+agvOe0jeOBl+OBvuOBmeOAgmBkaW0oZGF0YSlg44KEYGNvbG5hbWVzKGRhdGEpYOOBrue1kOaenOOBi+OCieOCguOAgeeiuuOBi+OBq+aEj+Wbs+mAmuOCiuOBruWIl+OCkuaKveWHuuOBp+OBjeOBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9VFJVRX0NCmRpbShob2dlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeOBruihjOaVsOOBqOWIl+aVsA0KZGF0YSA8LSBob2dlWywgb2JqXSAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl6KGM5YiX5Lit44Gub2Jq44Gn5oyH5a6a44GX44Gf5YiX44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KSZGF0YeOBq+agvOe0jQ0KZGltKGRhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkYXRh44Gu6KGM5pWw44Go5YiX5pWwDQpjb2xuYW1lcyhkYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRhdGHjga7liJflkI3mg4XloLENCmBgYA0KDQojIyMgVzIuMS40IOWIl+OBruaKveWHuu+8iGBnZW51c2DvvIkNCuOAgOasoeOBr+OAgWByIG5yb3coaG9nZSlg6KGMICRcdGltZXMkIGByIG5jb2woaG9nZSlg5YiX44GuYGhvZ2Vg44Kq44OW44K444Kn44Kv44OI44Gu5Lit44GL44KJ44CBR2VudXPliJfjgpJgZ2VudXNg44Go44GE44GG44Kq44OW44K444Kn44Kv44OI5ZCN44Gn5b6X44G+44GZ44CCYGhvZ2Vg44Kq44OW44K444Kn44Kv44OI44GM44OH44O844K/44OV44Os44O844Og5b2i5byP44Gn44GC44KM44Gw77yIYGNsYXNzKGhvZ2UpYOOBruWun+ihjOe1kOaenOOBjCJkYXRhLmZyYW1lIuOBq+OBquOBo+OBpuOBhOOCjOOBsO+8ieOAgWBob2dlJEdlbnVzYOOBruOCiOOBhuOBquaEn+OBmOOBpyTjgpLplpPjgavmjJ/jgpPjgafooYzliJdgaG9nZWDjga7liJflkI3mg4XloLHjgpLmjIflrprjgZnjgozjgbDjgIHku7vmhI/jga7liJfmg4XloLHjgpLmir3lh7rjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgILjgZPjgozjga/jgIHliJflkI3mg4XloLHjgYzjgo/jgYvjgaPjgabjgYTjgabliJfmlbDjgYzlpJrjgYTooYzliJfjg4fjg7zjgr/jga7loLTlkIjjgavjgIHliJfnlarlj7fmg4XloLHjgpLopprjgYjjgabjgYrjgY/lv4XopoHjgYzjgarjgYTkvr/liKnjgarmm7jjgY3mlrnjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUV9DQpjbGFzcyhob2dlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2Xjga7jgq/jg6njgrnlsZ7mgKcNCmdlbnVzIDwtIGhvZ2UkR2VudXMgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeS4reOBrkdlbnVz5YiX44KS5oq95Ye644GX44Gf57WQ5p6c44KSZ2VudXPjgavmoLzntI0NCmhlYWQoZ2VudXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2VudXPkuK3jga7mnIDliJ3jga4244Gk44KS6KGo56S6DQpgYGANCg0KIyMjIFcyLjEuNSDliJfjga7mir3lh7rvvIhgc3BlY2llc2DvvIkNCuOAgOasoeOBr+OAgWByIG5yb3coaG9nZSlg6KGMICRcdGltZXMkIGByIG5jb2woaG9nZSlg5YiX44GuYGhvZ2Vg44Kq44OW44K444Kn44Kv44OI44Gu5Lit44GL44KJ44CBU3BlY2llc+WIl+OCkmBzcGVjaWVzYOOBqOOBhOOBhuOCquODluOCuOOCp+OCr+ODiOWQjeOBp+W+l+OBvuOBmeOAgmBob2dlYOOCquODluOCuOOCp+OCr+ODiOOBjOODh+ODvOOCv+ODleODrOODvOODoOW9ouW8j+OBp+OBguOCjOOBsO+8iGBjbGFzcyhob2dlKWDjga7lrp/ooYzntZDmnpzjgYwiZGF0YS5mcmFtZSLjgavjgarjgaPjgabjgYTjgozjgbDvvInjgIFgaG9nZSRTcGVjaWVzYOOBruOCiOOBhuOBquaEn+OBmOOBpyTjgpLplpPjgavmjJ/jgpPjgafooYzliJdgaG9nZWDjga7liJflkI3mg4XloLHjgpLmjIflrprjgZnjgozjgbDjgIHku7vmhI/jga7liJfmg4XloLHjgpLmir3lh7rjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUV9DQpjbGFzcyhob2dlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2Xjga7jgq/jg6njgrnlsZ7mgKcNCnNwZWNpZXMgPC0gaG9nZSRTcGVjaWVzICAgICAgICAgICAgICAgICAgICMgaG9nZeS4reOBrlNwZWNpZXPliJfjgpLmir3lh7rjgZfjgZ/ntZDmnpzjgpJzcGVjaWVz44Gr5qC857SNDQpoZWFkKHNwZWNpZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNwZWNpZXPkuK3jga7mnIDliJ3jga4244Gk44KS6KGo56S6DQpgYGANCg0KIyMjIFcyLjEuNiDjgb7jgajjgoHjgablrp/ooYwNCuOAgFcyLjHjga7lv4XopoHmnIDlsI/pmZDjga7jgrnjgq/jg6rjg5fjg4jjgpLku6XkuIvjgavnpLrjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUUsIGV2YWw9RkFMU0V9DQppbl9mIDwtICJodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0IiAjIOiqreOBv+i+vOOBv+OBn+OBhOODleOCoeOCpOODq+aDheWgseOCkmluX2bjgavmoLzntI0NCmhvZ2UgPC0gcmVhZC50YWJsZShpbl9mLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEsIHNlcD0iXHQiKSMgaW5fZuOCkuOAgTHooYznm67jgpLliJflkI3jgIEx5YiX55uu44KS6KGM5ZCN44Go44GX44Gm6Kqt44G/6L6844KT44Gg57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0Kb2JqIDwtIGdyZXAocGF0dGVybiA9ICJTUlIiLCB4ID0gY29sbmFtZXMoaG9nZSkpICMgY29sbmFtZXMoaG9nZSnjga7kuK3jgYvjgokiU1JSIuOBqOOBhOOBhuaWh+Wtl+OCkuWQq+OCgOimgee0oOeVquWPt+aDheWgseOCkm9iauOBq+agvOe0jQ0KZGF0YSA8LSBob2dlWywgb2JqXSAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl6KGM5YiX5Lit44Gub2Jq44Gn5oyH5a6a44GX44Gf5YiX44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KSZGF0YeOBq+agvOe0jQ0KZ2VudXMgPC0gaG9nZSRHZW51cyAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl5Lit44GuR2VudXPliJfjgpLmir3lh7rjgZfjgZ/ntZDmnpzjgpJnZW51c+OBq+agvOe0jQ0Kc3BlY2llcyA8LSBob2dlJFNwZWNpZXMgICAgICAgICAgICAgICAgICAgIyBob2dl5Lit44GuU3BlY2llc+WIl+OCkuaKveWHuuOBl+OBn+e1kOaenOOCknNwZWNpZXPjgavmoLzntI0NCmBgYA0KDQojIyMgVzIuMS43IFcyLjHjga7jgb7jgajjgoENCuOAgFcyLjHjgaflvpfjgZ/ntZDmnpzjgpLjgb7jgajjgoHjgovjgajku6XkuIvjga7jgojjgYbjgavjgarjgorjgb7jgZnjgIINCg0KLSBgZGF0YWDvvJrmlbDlgKTooYzliJcNCiAgLSBBU1bphY3liJfjgZTjgajjga7lh7rnj77poLvluqbmg4XloLHjgafjgYLjgorjgIHlh7rnj77poLvluqbjga7nt4/lkozjgafpmY3poIbjgavjgr3jg7zjg4jjgZXjgozjgabjgYTjgosNCiAgLSBkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44GuU1JS5YiX44Gu5oOF5aCxDQogIC0gYG5yb3coZGF0YSlg77ya6KGM5pWw77yIQVNW44Gu57eP5pWw77yJ44GvYHIgbnJvdyhkYXRhKWANCiAgLSBgbmNvbChkYXRhKWDvvJrliJfmlbDvvIjjgrXjg7Pjg5fjg6vmlbDvvInjga9gciBuY29sKGRhdGEpYA0KDQotIGBnZW51c2DvvJrmloflrZfliJfjg5njgq/jg4jjg6sNCiAgLSAqKuWxnuOBruS6iOa4rOe1kOaenCoq44Gr55u45b2TDQogIC0gZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vvvIhbb3V0cHV0X0pTTEFCMjQudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0Ke+8ieOBrkdlbnVz5YiX44Gu5oOF5aCxDQogIC0gYGxlbmd0aChnZW51cylg77ya6KaB57Sg5pWw77yIQVNW44Gu57eP5pWw77yJ44GvYHIgbGVuZ3RoKGdlbnVzKWANCg0KLSBgc3BlY2llc2DvvJrmloflrZfliJfjg5njgq/jg4jjg6sNCiAgLSAqKueoruOBruS6iOa4rOe1kOaenCoq44Gr55u45b2TDQogIC0gZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vvvIhbb3V0cHV0X0pTTEFCMjQudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0Ke+8ieOBrlNwZWNpZXPliJfjga7mg4XloLENCiAgLSBgbGVuZ3RoKHNwZWNpZXMpYO+8muimgee0oOaVsO+8iEFTVuOBrue3j+aVsO+8ieOBr2ByIGxlbmd0aChzcGVjaWVzKWANCg0KIyMgVzIuMiDoj4zmoKrmg4XloLHjg5XjgqHjgqTjg6sNCuOAgFcxLjLjgafoqq3jgb/ovrzjgpPjgaDoj4zmoKrmg4XloLHjg5XjgqHjgqTjg6vvvIhbSlNMQUIyM190YWJsZTEudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0Ke+8ieOCkuWGjeW6puiqreOBv+i+vOOCgOOBqOOBk+OCjeOBi+OCieOCueOCv+ODvOODiOOBl+OBvuOBmeOAguOBk+OBruWgtOWQiOOBrzHliJfnm67jga5PcmdhbmlzbeWIl+OBjOOBqOOCiuOBguOBiOOBmuassuOBl+OBhOaDheWgseOBq+OBquOCiuOBvuOBmeOBruOBp+OAgeaKveWHuue1kOaenOOCkmBvcmdhbmlzbWDjgqrjg5bjgrjjgqfjgq/jg4jjgajjgZfjgablvpfjgb7jgZnjgILmrKHjgavjgIFgb3JnYW5pc21g44Kq44OW44K444Kn44Kv44OI44Gu5Lit44GL44KJ44CB44Kz44Oz44OeKCwp44Gu5Y+z5YG044Gu6I+M5qCq5ZCN5oOF5aCx44KS6Zmk5aSW44GX44CB5bGe5ZCN77yIYGdlbnVzX3RydXRoYO+8ieOBqOeoruWQje+8iGBzcGVjaWVzX3RydXRoYO+8ieOBruaDheWgseOBruOBv+OCkuOBhuOBvuOBj+aKveWHuuOBmeOCi+OBruOBjOOBk+OBk+OBp+OBruebrueahOOBq+OBquOCiuOBvuOBmeOAguWxnuOBruWgtOWQiOOBr2BnZW51c190cnV0aGDvvIjmraPop6Pmg4XloLHvvInjgahXMi4xLjbjgaflvpfjgZ9gZ2VudXNg44KS44CB44Gd44GX44Gm56iu44Gu5aC05ZCI44GvYHNwZWNpZXNfdHJ1dGhgDQrjgIDvvIjmraPop6Pmg4XloLHvvInjgahXMi4xLjbjgaflvpfjgZ9gc3BlY2llc2DjgpLmr5TovIPjgZfjgabjgIFbZGFkYTJdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9kYWRhMi5odG1sKeWun+ihjOe1kOaenOOBruS4reOBq+OBqeOCjOOBj+OCieOBhOioiDE55bGe77yIMjLnqK7vvInjga7ml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnvvIhbR2V2ZXJzIGV0IGFsLiwgUExvUyBDb21wdXQgQmlvbC4sIDIwMTJdKGh0dHBzOi8vcHVibWVkLm5jYmkubmxtLm5paC5nb3YvMjMyMDkzODkvKe+8ieOBjOWQq+OBvuOCjOOBpuOBhOOCi+OBruOBi+OBquOBqeOCkuipleS+oeOBl+OBvuOBmeOAgg0KDQojIyMgVzIuMi4xIGByZWFkLnRhYmxlYOmWouaVsA0K44CA44GT44GT44Gn44Gv44CBVzEuMuOCkuWGjeW6puWun+ihjOOBl+OBn+W+jOOAgWBjb2xuYW1lc2DplqLmlbDjgpLnlKjjgYTjgabooYzliJdgaG9nZWDjgqrjg5bjgrjjgqfjgq/jg4jjga7liJflkI3mg4XloLHjgpLooajnpLrjgZXjgZvjgovjgajjgZPjgo3jgb7jgafooYzjgYTjgb7jgZnjgIJgcmVhZC50YWJsZWDplqLmlbDlrp/ooYzmmYLjgatgaGVhZGVyPVRSVUVg44Kq44OX44K344On44Oz44KS44Gk44GR44Gm44GE44KL44Gu44Gn44CB6KGM5YiXYGhvZ2Vg44Gr5YiX5ZCN44GM5LuY5LiO44GV44KM44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1UUlVFfQ0KaW5fZiA8LSAiaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCMjNfdGFibGUxLnR4dCIgIyDoqq3jgb/ovrzjgb/jgZ/jgYTjg5XjgqHjgqTjg6vmg4XloLHjgpJpbl9m44Gr5qC857SNDQpob2dlIDwtIHJlYWQudGFibGUoaW5fZiwgaGVhZGVyPVRSVUUsIHJvdy5uYW1lcz0xLCBzZXA9Ilx0IikgI2luX2bjgpLjgIEx6KGM55uu44KS5YiX5ZCN44CBMeWIl+ebruOCkuihjOWQjeOBqOOBl+OBpuiqreOBv+i+vOOCk+OBoOe1kOaenOOCkmhvZ2XjgavmoLzntI0NCmRpbShob2dlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeOBruihjOaVsOOBqOWIl+aVsA0KY29sbmFtZXMoaG9nZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl44Gu5YiX5ZCN5oOF5aCxDQpgYGANCuOAgGByZWFkLnRhYmxlYOmWouaVsOWun+ihjOaZguOBq2Byb3cubmFtZXM9MWDjgqrjg5fjgrfjg6fjg7PjgpLjgaTjgZHjgabjgYTjgovjga7jgafjgIHooYzliJdgaG9nZWDjgavooYzlkI3jgYzku5jkuI7jgZXjgozjgabjgYTjgb7jgZnjgILjgZ3jga7jgZ/jgoHjgIHlhYPjg5XjgqHjgqTjg6vjga805YiX44GL44KJ5qeL5oiQ44GV44KM44G+44GZ44GM44CBYGRpbShob2dlKWDjgaflvpfjgonjgozjgovliJfmlbDjga9gciBuY29sKGhvZ2UpYOOBq+OBquOCiuOBvuOBmeOAgg0KDQojIyMgVzIuMi4yIOWIl+OBruaKveWHuu+8iGBvcmdhbmlzbWDvvIkNCuOAgGByIG5yb3coaG9nZSlg6KGMICRcdGltZXMkIGByIG5jb2woaG9nZSlg5YiX44GuYGhvZ2Vg44Kq44OW44K444Kn44Kv44OI44Gu5Lit44GL44KJ44CBT3JnYW5pc23liJfjgpJgb3JnYW5pc21g44Go44GE44GG44Kq44OW44K444Kn44Kv44OI5ZCN44Gn5b6X44G+44GZ44CCYGhvZ2Vg44Kq44OW44K444Kn44Kv44OI44GM44OH44O844K/44OV44Os44O844Og5b2i5byP44Gu5aC05ZCI77yIYGNsYXNzKGhvZ2UpYOOBruWun+ihjOe1kOaenOOBjCJkYXRhLmZyYW1lIuOBq+OBquOBo+OBpuOBhOOCi+WgtOWQiO+8ieOAgWBob2dlJE9yZ2FuaXNtYOOBruOCiOOBhuOBquaEn+OBmOOBpyTjgpLplpPjgavmjJ/jgpPjgafooYzliJdgaG9nZWDjga7liJflkI3mg4XloLHjgpLmjIflrprjgZnjgozjgbDjgIHku7vmhI/jga7liJfmg4XloLHjgpLmir3lh7rjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUV9DQpjbGFzcyhob2dlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2Xjga7jgq/jg6njgrnlsZ7mgKcNCm9yZ2FuaXNtIDwtIGhvZ2UkT3JnYW5pc20gICAgICAgICAgICAgICAgICMgaG9nZeS4reOBrk9yZ2FuaXNt5YiX44KS5oq95Ye644GX44Gf57WQ5p6c44KSb3JnYW5pc23jgavmoLzntI0NCmhlYWQob3JnYW5pc20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3JnYW5pc23kuK3jga7mnIDliJ3jga4244Gk44KS6KGo56S6DQpgYGANCuOAgGBvcmdhbmlzbWDjgqrjg5bjgrjjgqfjgq/jg4jjgpLnnLrjgoHjgovjgajjgIHjgrPjg7Pjg54oLCnjga7lj7PlgbTjgYzoj4zmoKrlkI3mg4XloLHjgIHlt6blgbTjgYzlsZ7lkI3jgajnqK7lkI3jgavjgarjgaPjgabjgYTjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgILkvovjgYjjgbAx55Wq55uu44Gu55Sf54mp56iu77yIYHIgb3JnYW5pc21bMV1g77yJ44Gu5aC05ZCI44CB5bGe5ZCN44GvQWNpbmV0b2JhY3RlcuOAgeeoruWQjeOBr2JhdW1hbm5paeOAgeiPjOagquWQjeOBr3N0cmFpbiA1Mzc344Gg44Go6Kqt44G/6Kej44GN44G+44GZ44CC5b6T44Gj44Gm44CBYG9yZ2FuaXNtYOOCquODluOCuOOCp+OCr+ODiOOBi+OCieOAgeWxnuWQjeOBqOeoruWQjeOBruaDheWgseOBruOBv+OCkuOBhuOBvuOBj+aKveWHuuOBmeOCjOOBsOOAgVcyLjEuNuOBp+W+l+OBn2BnZW51c2DjgoRgc3BlY2llc2Djgqrjg5bjgrjjgqfjgq/jg4jjgajmloflrZfliJfjga7lrozlhajkuIDoh7Tjgafjga7mr5TovIPjgYzjgafjgY3jgb7jgZnjgIINCg0KIyMjIFcyLjIuMyBgc3Ryc3BsaXRg6Zai5pWwDQrjgIBb56ysMjPlm57jga5XNS4zXShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyMy5odG1sI1c1M19zdHJzcGxpdCVFOSU5NiVBMiVFNiU5NSVCMCnjgafjgoLou73jgY/op6bjgozjgabjgYTjgb7jgZnjgYzjgIFgc3Ryc3BsaXRg6Zai5pWw44Gv44CB5paH5a2X5YiX44OZ44Kv44OI44Or44KS5YWl5Yqb44Go44GX44Gm44CB5Lu75oSP44Gu5Yy65YiH44KK5paH5a2X44Gn5paH5a2X5YiX44KS5YiG5Ymy44GX44Gf57WQ5p6c44KS44Oq44K544OI5b2i5byP44Gn6L+U44GX44G+44GZ44CC44GT44GT44Gn44Gv44CBYG9yZ2FuaXNtYOOCquODluOCuOOCp+OCr+ODiOOCkuWFpeWKm+OBqOOBl+OBpuOAgeWMuuWIh+OCiuaWh+Wtl+OCkuOCs+ODs+ODnu+8iCzvvInjgavjgZfjgabmloflrZfliJfjgpLliIblibLjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUV9DQpob2dlIDwtIHN0cnNwbGl0KHggPSBvcmdhbmlzbSwgc3BsaXQgPSAiLCIpIyBvcmdhbmlzbeS4reOBruaWh+Wtl+WIl+ODmeOCr+ODiOODq+OCkuOCs+ODs+ODnuOBp+WIhuWJsuOBl+OBn+e1kOaenOOCkmhvZ2XjgavmoLzntI0NCmhlYWQoaG9nZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeS4reOBruacgOWIneOBrjbjgaTjgpLooajnpLoNCmBgYA0K44CA5YiG5Ymy5b6M44Gv44CB44CM5bGe5ZCNIOeoruWQjeOAjeOBqOOAjOiPjOagquWQjeOAjeOBq+OBhuOBvuOBj+WIhuOBi+OCjOOBpuOBhOOBvuOBmeOAgg0KDQojIyMgVzIuMi40IGBzYXBwbHlg6Zai5pWwDQrjgIBb56ysMjPlm57jga5XNS40XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyMy5odG1sI1c1NF9zYXBwbHklRTklOTYlQTIlRTYlOTUlQjAp44Go5YWo44GP5ZCM44GY5L2/44GE5pa544Gn44GZ44GM44CBYHNhcHBseWDplqLmlbDjga/jgIHjg6rjgrnjg4jlvaLlvI/jga7jgqrjg5bjgrjjgqfjgq/jg4jjgavlr77jgZfjgabpgJDmrKHnmoTjgarlh6bnkIbjgpLooYzjgYTjgZ/jgYTloLTlkIjjgavnlKjjgYTjgonjgozjgb7jgZnjgILjg5njgq/jg4jjg6vkuK3jga7mjIflrprjgZfjgZ/kvY3nva7jga7mg4XloLHjgpLmir3lh7rjgZnjgotb44Go44GE44GG6Zai5pWw44KS5a6f6KGM44GX44CB77yIYDFg55Wq55uu44Gu6KaB57Sg44KS5oq95Ye644GX44Gf44GE44Gu44Gn77yJYDFg44Go44GE44GG5oOF5aCx44KS44Kq44OX44K344On44Oz44Go44GX44Gm5LiO44GI44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1UUlVFfQ0KaG9nZTIgPC0gc2FwcGx5KFggPSBob2dlLCBGVU4gPSBgW2AsIDEpICAgIyBob2dl5Lit44Gu44OZ44Kv44OI44Or5b2i5byP44Gu5ZCE6KaB57Sg44GL44KJ44CBMeeVquebruOBruimgee0oOOBruaKveWHuue1kOaenOOCkmhvZ2Uy44Gr5qC857SNDQpoZWFkKGhvZ2UyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2Uy5Lit44Gu5pyA5Yid44GuNuOBpOOCkuihqOekug0KYGBgDQoNCiMjIyBXMi4yLjUg5YaN5bqmYHN0cnNwbGl0YOmWouaVsA0K44CA44GV44GN44G744Gp5b6X44GfYGhvZ2UyYOOCquODluOCuOOCp+OCr+ODiOOBr+OAjOWxnuWQjSDnqK7lkI3jgI3jgajjgarjgaPjgabjgb7jgZnjgILjgZXjgonjgavjgZPjgozjgpLliIblibLjgZnjgbnjgY/jgIHjgZPjgZPjgafjga/jgIFgaG9nZTJg44Kq44OW44K444Kn44Kv44OI44KS5YWl5Yqb44Go44GX44Gm44CB5Yy65YiH44KK5paH5a2X44KS5Y2K6KeS44K544Oa44O844K577yIIO+8ieOBq+OBl+OBpuaWh+Wtl+WIl+OCkuWIhuWJsuOBl+OBn+e1kOaenOOCkmBob2dlM2DjgajjgZfjgablvpfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUV9DQpob2dlMyA8LSBzdHJzcGxpdCh4ID0gaG9nZTIsIHNwbGl0ID0gIiAiKSMgaG9nZTLkuK3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLljYrop5Ljgrnjg5rjg7zjgrnjgafliIblibLjgZfjgZ/ntZDmnpzjgpJob2dlM+OBq+agvOe0jQ0KaGVhZChob2dlMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2Uz5Lit44Gu5pyA5Yid44GuNuOBpOOCkuihqOekug0KYGBgDQoNCiMjIyBXMi4yLjYg5YaN5bqmYHNhcHBseWDplqLmlbANCuOAgFcyLjIuNOOBqOWQjOOBmOODjuODquOBp+OBmeOBjOOAgWBob2dlM2DjgpLlhaXlipvjgajjgZfjgabjgIEx55Wq55uu44Gu6KaB57Sg44KS5bGe5ZCN44CBMueVquebruOBruimgee0oOOCkueoruWQjeOBqOOBl+OBpuW+l+OBvuOBmeOAguS7iuWPluOCiuaJseOBo+OBpuOBhOOCi+OBruOBr+OAgeioiDE55bGe77yIMjLnqK7vvInjga7ml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnvvIhbR2V2ZXJzIGV0IGFsLiwgUExvUyBDb21wdXQgQmlvbC4sIDIwMTJdKGh0dHBzOi8vcHVibWVkLm5jYmkubmxtLm5paC5nb3YvMjMyMDkzODkvKe+8ieOBruaDheWgseOBp+OBmeOAguOBpOOBvuOCiuOAgeOBk+OBk+OBp+W+l+OCi+WxnuWQjeOBqOeoruWQjeOBjOOAgWRhZGEy5a6f6KGM57WQ5p6c44Gr44Gp44KM44Gg44GR5ZCr44G+44KM44Gm44GE44KL44GL44KS6Kq/44G544KL44Gf44KB44Gu562U44GI5ZCI44KP44Gb55So44Gu5q2j6Kej5oOF5aCx44Gr44Gq44KK44G+44GZ44CC5b6T44Gj44Gm44CB44GT44GT44Gn44Gv44Gd44KM44Ge44KM44Gu44Kq44OW44K444Kn44Kv44OI5ZCN44KSYGdlbnVzX3RydXRoYOOBqGBzcGVjaWVzX3RydXRoYOOBqOOBl+OBvuOBmeOAguOBk+OBhuOBmeOCi+OBk+OBqOOBp+OAgWRhZGEy5a6f6KGM57WQ5p6c44Go44GX44Gm5b6X44GfYHIgbGVuZ3RoKGdlbnVzKWDlgIvjga7opoHntKDjgYvjgonjgarjgovlsZ7lkI3mg4XloLHjga5gZ2VudXNg44GK44KI44Gz56iu5ZCN5oOF5aCx44GuYHNwZWNpZXNg44Go5Yy65Yil44GZ44KL44GT44Go44GM44Gn44GN44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1UUlVFfQ0KZ2VudXNfdHJ1dGggPC0gc2FwcGx5KFggPSBob2dlMywgRlVOID0gYFtgLCAxKSAgIyBob2dlM+S4reOBruODmeOCr+ODiOODq+W9ouW8j+OBruWQhOimgee0oOOBi+OCieOAgTHnlarnm67jga7opoHntKDjga7mir3lh7rntZDmnpzjgpJnZW51c190cnV0aOOBq+agvOe0jQ0Kc3BlY2llc190cnV0aCA8LSBzYXBwbHkoWCA9IGhvZ2UzLCBGVU4gPSBgW2AsIDIpIyBob2dlM+S4reOBruODmeOCr+ODiOODq+W9ouW8j+OBruWQhOimgee0oOOBi+OCieOAgTLnlarnm67jga7opoHntKDjga7mir3lh7rntZDmnpzjgpJzcGVjaWVzX3RydXRo44Gr5qC857SNDQpoZWFkKGdlbnVzX3RydXRoKSAgICAgICAgICAgICAgICAgICAgICAgICAjIGdlbnVzX3RydXRo5Lit44Gu5pyA5Yid44GuNuOBpOOCkuihqOekug0KaGVhZChzcGVjaWVzX3RydXRoKSAgICAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWVzX3RydXRo5Lit44Gu5pyA5Yid44GuNuOBpOOCkuihqOekug0KYGBgDQoNCiMjIyBXMi4yLjcgYHVuaXF1ZWDplqLmlbANCuOAgFvpgKPovInnrKwyM+Wbnl0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCMjMuaHRtbCnjga7ooagx44CB44GK44KI44Gz6KiIMTnlsZ7vvIgyMueoru+8ieOBruaXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4Ke+8iFtHZXZlcnMgZXQgYWwuLCBQTG9TIENvbXB1dCBCaW9sLiwgMjAxMl0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yMzIwOTM4OS8p77yJ44Go44GE44GG6KiA6JGJ44GL44KJ44KC5oOz5YOP44GM44Gk44GN44G+44GZ44GM44CB6KiIMjLlgIvjga7opoHntKDjgYvjgonjgarjgotgc3BlY2llc190cnV0aGDkuK3jga7jg6bjg4vjg7zjgq/jgaropoHntKDmlbDjga8yMuWAi+OBp+OBmeOAguOBneOBruS4gOaWueOBp+OAgeioiDIy5YCL44Gu6KaB57Sg44GL44KJ44Gq44KLYGdlbnVzX3RydXRoYOS4reOBruODpuODi+ODvOOCr+OBquimgee0oOaVsOOBrzE55YCL44Gn44GZ44CC44GT44Gu55CG55Sx44Gv44CBMTjvvZ4xOeeVquebruOBjOWQjOOBmFN0YXBoeWxvY29jY3Vz5bGe44CBMjDvvZ4yMueVquebruOBjOWQjOOBmFN0cmVwdG9jb2NjdXPlsZ7jgaDjgYvjgonjgafjgZnjgILnrKwyNOWbnuOBrlczLjMuNeOBp+OCguWIqeeUqOOBl+OBpuOBhOOBvuOBmeOBjOOAgWB1bmlxdWVg6Zai5pWw44Gv44CB5YWl5Yqb44OZ44Kv44OI44Or5Lit44Gu44Om44OL44O844Kv44Gq6KaB57Sg44KS6L+U44GX44G+44GZ44CC44GT44GT44Gn44Gv44Gd44KM44KS5Yip55So44GX44Gm44CBYHVuaXF1ZWDplqLmlbDjgpLjgoLjgYbkuIDluqblkIzjgZjjgqrjg5bjgrjjgqfjgq/jg4jlkI3jgafkuIrmm7jjgY3kv53lrZjjgZnjgovjg4bjgq/jg4vjg4Pjgq/jgpLkvb/jgaPjgabvvIjjgZ3jga7liIbkuI3lj6/pgIbjgavjga/jgarjgorjgb7jgZnjgYwuLi7vvInjgIHku7vmhI/jga7jg5njgq/jg4jjg6vjgpLjg6bjg4vjg7zjgq/jgaropoHntKDjga7jgb/jgavjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUV9DQpsZW5ndGgoZ2VudXNfdHJ1dGgpICAgICAgICAgICAgICAgICAgICAgICAjIGdlbnVzX3RydXRo5Lit44Gu6KaB57Sg5pWwDQpsZW5ndGgoc3BlY2llc190cnV0aCkgICAgICAgICAgICAgICAgICAgICAjIHNwZWNpZXNfdHJ1dGjkuK3jga7opoHntKDmlbANCmdlbnVzX3RydXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2VudXNfdHJ1dGjjgpLnorroqo0NCnNwZWNpZXNfdHJ1dGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2llc190cnV0aOOCkueiuuiqjQ0KdW5pcXVlKGdlbnVzX3RydXRoKSAgICAgICAgICAgICAgICAgICAgICAgIyBnZW51c190cnV0aOS4reOBruODpuODi+ODvOOCr+OBquimgee0oA0KdW5pcXVlKHNwZWNpZXNfdHJ1dGgpICAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWVzX3RydXRo5Lit44Gu44Om44OL44O844Kv44Gq6KaB57SgDQpnZW51c190cnV0aCA8LSB1bmlxdWUoZ2VudXNfdHJ1dGgpICAgICAgICAjIGdlbnVzX3RydXRo5Lit44Gu44Om44OL44O844Kv44Gq6KaB57Sg44KSZ2VudXNfdHJ1dGjjgavmoLzntI0NCnNwZWNpZXNfdHJ1dGggPC0gdW5pcXVlKHNwZWNpZXNfdHJ1dGgpICAgICMgc3BlY2llc190cnV0aOS4reOBruODpuODi+ODvOOCr+OBquimgee0oOOCknNwZWNpZXNfdHJ1dGjjgavmoLzntI0NCmxlbmd0aChnZW51c190cnV0aCkgICAgICAgICAgICAgICAgICAgICAgICMgZ2VudXNfdHJ1dGjkuK3jga7opoHntKDmlbANCmxlbmd0aChzcGVjaWVzX3RydXRoKSAgICAgICAgICAgICAgICAgICAgICMgc3BlY2llc190cnV0aOS4reOBruimgee0oOaVsA0KYGBgDQrjgIDkuIroqJjjgafjga/jgIFgdW5pcXVlYOmWouaVsOWun+ihjOe1kOaenOOBjOS4jeWkieOBrmBzcGVjaWVzX3RydXRoYOOCguaEj+Wbs+eahOOBq+WQq+OCgeOBpuOBhOOBvuOBmeOAguOBk+OCjOOBr+OAgeWFqOS9k+OCkue1seS4gOeahOOBquabuOOBjeaWueOBq+OBmeOCi+OBk+OBqOOCkuaEj+Wbs+OBl+OBpuOBhOOBvuOBmeOAgmB1bmlxdWVg6Zai5pWw5a6f6KGM57WQ5p6c44GM5LiN5aSJ44Gq5aC05ZCI44Gv44CB5ZCr44KB44Gm44KC54m544Gr5oKq44GV44KS44GX44Gq44GE44Gu44Gn5pu444GE44Gm44KC44GE44GE44Gu44Gn44GZ44CC44GT44Gu44KI44GG44Gr44CB5b+144Gu44Gf44KB44Gu56K66KqN5L2c5qWt44Gv44KP44KK44Go44KI44GP44Gq44GV44KM44G+44GZ44CCDQoNCiMjIyBXMi4yLjgg44G+44Go44KB44Gm5a6f6KGMDQrjgIBXMi4y44Gu5b+F6KaB5pyA5bCP6ZmQ44Gu44K544Kv44Oq44OX44OI44KS5Lul5LiL44Gr56S644GX44G+44GZ44CCMuihjOebruOBqDTooYznm67jgaflkIzjgZjjgqrjg5bjgrjjgqfjgq/jg4jlkI3vvIhgaG9nZWDvvInjgpLph43opIfjgZfjgabliKnnlKjjgZfjgabjgYTjgb7jgZnjgYzjgIHkuIDmmYLliKnnlKjnm67nmoTjgafjgYLjgozjgbDjgIHjgZPjga7jgojjgYbjgavkuIrmm7jjgY3jgZfjgabjgoLnibnjgavllY/poYzjgYLjgorjgb7jgZvjgpPjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUUsIGV2YWw9RkFMU0V9DQppbl9mIDwtICJodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0IiAjIOiqreOBv+i+vOOBv+OBn+OBhOODleOCoeOCpOODq+aDheWgseOCkmluX2bjgavmoLzntI0NCmhvZ2UgPC0gcmVhZC50YWJsZShpbl9mLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEsIHNlcD0iXHQiKSAjaW5fZuOCkuOAgTHooYznm67jgpLliJflkI3jgIEx5YiX55uu44KS6KGM5ZCN44Go44GX44Gm6Kqt44G/6L6844KT44Gg57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0Kb3JnYW5pc20gPC0gaG9nZSRPcmdhbmlzbSAgICAgICAgICAgICAgICAgIyBob2dl5Lit44GuT3JnYW5pc23liJfjgpLmir3lh7rjgZfjgZ/ntZDmnpzjgpJvcmdhbmlzbeOBq+agvOe0jQ0KaG9nZSA8LSBzdHJzcGxpdCh4ID0gb3JnYW5pc20sIHNwbGl0ID0gIiwiKSMgb3JnYW5pc23kuK3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLjgrPjg7Pjg57jgafliIblibLjgZfjgZ/ntZDmnpzjgpJob2dl44Gr5qC857SNDQpob2dlMiA8LSBzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGBbYCwgMSkgICAjIGhvZ2XkuK3jga7jg5njgq/jg4jjg6vlvaLlvI/jga7lkITopoHntKDjgYvjgonjgIEx55Wq55uu44Gu6KaB57Sg44Gu5oq95Ye657WQ5p6c44KSaG9nZTLjgavmoLzntI0NCmhvZ2UzIDwtIHN0cnNwbGl0KHggPSBob2dlMiwgc3BsaXQgPSAiICIpICMgaG9nZTLkuK3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLljYrop5Ljgrnjg5rjg7zjgrnjgafliIblibLjgZfjgZ/ntZDmnpzjgpJob2dlM+OBq+agvOe0jQ0KZ2VudXNfdHJ1dGggPC0gc2FwcGx5KFggPSBob2dlMywgRlVOID0gYFtgLCAxKSAjIGhvZ2Uz5Lit44Gu44OZ44Kv44OI44Or5b2i5byP44Gu5ZCE6KaB57Sg44GL44KJ44CBMeeVquebruOBruimgee0oOOBruaKveWHuue1kOaenOOCkmdlbnVzX3RydXRo44Gr5qC857SNDQpzcGVjaWVzX3RydXRoIDwtIHNhcHBseShYID0gaG9nZTMsIEZVTiA9IGBbYCwgMikjIGhvZ2Uz5Lit44Gu44OZ44Kv44OI44Or5b2i5byP44Gu5ZCE6KaB57Sg44GL44KJ44CBMueVquebruOBruimgee0oOOBruaKveWHuue1kOaenOOCknNwZWNpZXNfdHJ1dGjjgavmoLzntI0NCmdlbnVzX3RydXRoIDwtIHVuaXF1ZShnZW51c190cnV0aCkgICAgICAgICMgZ2VudXNfdHJ1dGjkuK3jga7jg6bjg4vjg7zjgq/jgaropoHntKDjgpJnZW51c190cnV0aOOBq+agvOe0jQ0Kc3BlY2llc190cnV0aCA8LSB1bmlxdWUoc3BlY2llc190cnV0aCkgICAgIyBzcGVjaWVzX3RydXRo5Lit44Gu44Om44OL44O844Kv44Gq6KaB57Sg44KSc3BlY2llc190cnV0aOOBq+agvOe0jQ0KYGBgDQoNCiMjIyBXMi4yLjkgVzIuMuOBruOBvuOBqOOCgeOAgA0K44CAVzIuMuOBp+W+l+OBn+e1kOaenOOCkuOBvuOBqOOCgeOCi+OBqOS7peS4i+OBruOCiOOBhuOBq+OBquOCiuOBvuOBmeOAgg0KDQotIGBnZW51c190cnV0aGDvvJrmloflrZfliJfjg5njgq/jg4jjg6sNCiAgLSAqKuWxnuOBruato+ino+aDheWgsSoq44Gr55u45b2TDQogIC0gW+mAo+i8ieesrDIz5ZueXShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyMy5odG1sKeOBruihqDHjgavnm7jlvZPjgZnjgovoj4zmoKrmg4XloLHjg5XjgqHjgqTjg6vvvIhbSlNMQUIyM190YWJsZTEudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0Ke+8ieOBrk9yZ2FuaXNt5YiX44Gu5oOF5aCx44CCMeeVquW3puWBtOOBruWNiuinkuOCueODmuODvOOCueaJi+WJjeOBvuOBp+OBruWNmOiqnuOAgg0KICAtIOacrOadpeaknOWHuuOBl+OBn+OBhOaXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeS4reOBruWxnuWQjeOBq+ebuOW9kw0KICAtIGBsZW5ndGgoZ2VudXNfdHJ1dGgpYO+8muimgee0oOaVsO+8iOODpuODi+ODvOOCr+OBquWxnuOBruaVsO+8ieOBr2ByIGxlbmd0aChnZW51c190cnV0aClgDQoNCi0gYHNwZWNpZXNfdHJ1dGhg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirnqK7jga7mraPop6Pmg4XloLEqKuOBq+ebuOW9kw0KICAtIFvpgKPovInnrKwyM+Wbnl0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCMjMuaHRtbCnjga7ooagx44Gr55u45b2T44GZ44KL6I+M5qCq5oOF5aCx44OV44Kh44Kk44Or77yIW0pTTEFCMjNfdGFibGUxLnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCMjNfdGFibGUxLnR4dCnvvInjga5PcmdhbmlzbeWIl+OBruaDheWgseOAguacgOWIneOBruWNiuinkuOCueODmuODvOOCueOBi+OCieOCs+ODs+ODnuaJi+WJjeOBvuOBp+OBruWNmOiqnuOAgg0KICAtIGBsZW5ndGgoc3BlY2llc190cnV0aClg77ya6KaB57Sg5pWw77yI44Om44OL44O844Kv44Gq56iu44Gu5pWw77yJ44GvYHIgbGVuZ3RoKHNwZWNpZXNfdHJ1dGgpYA0KDQojIyBXMi4zIOOBvuOBqOOCgeOBpuWun+ihjA0K44CAVzLjga7lv4XopoHmnIDlsI/pmZDjga7jgrnjgq/jg6rjg5fjg4jjgpLku6XkuIvjgavnpLrjgZfjgb7jgZnjgILjgZPjgozjga/jgIFXMi4xLjbjgahXMi4yLjjjgpLjg57jg7zjgrjjgZfjgZ/jgaDjgZHjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPVRSVUUsIGV2YWw9RkFMU0V9DQojIFcyLjEgZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vjga7jgbvjgYYNCmluX2YgPC0gImh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQiICMg6Kqt44G/6L6844G/44Gf44GE44OV44Kh44Kk44Or5oOF5aCx44KSaW5fZuOBq+agvOe0jQ0KaG9nZSA8LSByZWFkLnRhYmxlKGluX2YsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9MSwgc2VwPSJcdCIpIyBpbl9m44KS44CBMeihjOebruOCkuWIl+WQjeOAgTHliJfnm67jgpLooYzlkI3jgajjgZfjgaboqq3jgb/ovrzjgpPjgaDntZDmnpzjgpJob2dl44Gr5qC857SNDQpvYmogPC0gZ3JlcChwYXR0ZXJuID0gIlNSUiIsIHggPSBjb2xuYW1lcyhob2dlKSkgIyBjb2xuYW1lcyhob2dlKeOBruS4reOBi+OCiSJTUlIi44Go44GE44GG5paH5a2X44KS5ZCr44KA6KaB57Sg55Wq5Y+344KS5oq95Ye644GX44Gf57WQ5p6c44KSb2Jq44Gr5qC857SNDQpkYXRhIDwtIGhvZ2VbLCBvYmpdICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XooYzliJfkuK3jga5vYmrjgafmjIflrprjgZfjgZ/liJfjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpJkYXRh44Gr5qC857SNDQpnZW51cyA8LSBob2dlJEdlbnVzICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XkuK3jga5HZW51c+WIl+OCkuaKveWHuuOBl+OBn+e1kOaenOOCkmdlbnVz44Gr5qC857SNDQpzcGVjaWVzIDwtIGhvZ2UkU3BlY2llcyAgICAgICAgICAgICAgICAgICAjIGhvZ2XkuK3jga5TcGVjaWVz5YiX44KS5oq95Ye644GX44Gf57WQ5p6c44KSc3BlY2llc+OBq+agvOe0jQ0KDQojIFcyLjIg6I+M5qCq5oOF5aCx44OV44Kh44Kk44Or44Gu44G744GGDQppbl9mIDwtICJodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0IiAjIOiqreOBv+i+vOOBv+OBn+OBhOODleOCoeOCpOODq+aDheWgseOCkmluX2bjgavmoLzntI0NCmhvZ2UgPC0gcmVhZC50YWJsZShpbl9mLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEsIHNlcD0iXHQiKSAjaW5fZuOCkuOAgTHooYznm67jgpLliJflkI3jgIEx5YiX55uu44KS6KGM5ZCN44Go44GX44Gm6Kqt44G/6L6844KT44Gg57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0Kb3JnYW5pc20gPC0gaG9nZSRPcmdhbmlzbSAgICAgICAgICAgICAgICAgIyBob2dl5Lit44GuT3JnYW5pc23liJfjgpLmir3lh7rjgZfjgZ/ntZDmnpzjgpJvcmdhbmlzbeOBq+agvOe0jQ0KaG9nZSA8LSBzdHJzcGxpdCh4ID0gb3JnYW5pc20sIHNwbGl0ID0gIiwiKSMgb3JnYW5pc23kuK3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLjgrPjg7Pjg57jgafliIblibLjgZfjgZ/ntZDmnpzjgpJob2dl44Gr5qC857SNDQpob2dlMiA8LSBzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGBbYCwgMSkgICAjIGhvZ2XkuK3jga7jg5njgq/jg4jjg6vlvaLlvI/jga7lkITopoHntKDjgYvjgonjgIEx55Wq55uu44Gu6KaB57Sg44Gu5oq95Ye657WQ5p6c44KSaG9nZTLjgavmoLzntI0NCmhvZ2UzIDwtIHN0cnNwbGl0KHggPSBob2dlMiwgc3BsaXQgPSAiICIpICMgaG9nZTLkuK3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLljYrop5Ljgrnjg5rjg7zjgrnjgafliIblibLjgZfjgZ/ntZDmnpzjgpJob2dlM+OBq+agvOe0jQ0KZ2VudXNfdHJ1dGggPC0gc2FwcGx5KFggPSBob2dlMywgRlVOID0gYFtgLCAxKSAjIGhvZ2Uz5Lit44Gu44OZ44Kv44OI44Or5b2i5byP44Gu5ZCE6KaB57Sg44GL44KJ44CBMeeVquebruOBruimgee0oOOBruaKveWHuue1kOaenOOCkmdlbnVzX3RydXRo44Gr5qC857SNDQpzcGVjaWVzX3RydXRoIDwtIHNhcHBseShYID0gaG9nZTMsIEZVTiA9IGBbYCwgMikjIGhvZ2Uz5Lit44Gu44OZ44Kv44OI44Or5b2i5byP44Gu5ZCE6KaB57Sg44GL44KJ44CBMueVquebruOBruimgee0oOOBruaKveWHuue1kOaenOOCknNwZWNpZXNfdHJ1dGjjgavmoLzntI0NCmdlbnVzX3RydXRoIDwtIHVuaXF1ZShnZW51c190cnV0aCkgICAgICAgICMgZ2VudXNfdHJ1dGjkuK3jga7jg6bjg4vjg7zjgq/jgaropoHntKDjgpJnZW51c190cnV0aOOBq+agvOe0jQ0Kc3BlY2llc190cnV0aCA8LSB1bmlxdWUoc3BlY2llc190cnV0aCkgICAgIyBzcGVjaWVzX3RydXRo5Lit44Gu44Om44OL44O844Kv44Gq6KaB57Sg44KSc3BlY2llc190cnV0aOOBq+agvOe0jQ0KYGBgDQoNCiMgVzMg44K144Oz44OX44Or5YWo5L2T44Gu6Kej5p6QDQrjgIDjgZPjgZPjgafjga/jgb7jgZrjgIFb6YCj6LyJ56ysMjTlm55dKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQjI0Lmh0bWwp44Gu5ZuzNeOBp+imi+OBiOOBpuOBhOOCi2RhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5HZW51c+WIl+OBiuOCiOOBs1NwZWNpZXPliJfjgYvjgonlvpfjgZ/jgIxgciBsZW5ndGgoZ2VudXMpYOWAi+OBruimgee0oOOBi+OCieOBquOCi2BnZW51c2DjgYrjgojjgbNgc3BlY2llc2Djgqrjg5bjgrjjgqfjgq/jg4jjgI3jgIHjgZ3jgZfjgaboqIgxMuOCteODs+ODl+ODq+WIhuOBrkFTVuOBlOOBqOOBruWHuuePvumgu+W6puaDheWgseOBq+ebuOW9k+OBmeOCi+WIl++8iOKAnFNSUuKApuKAneOBqOOBhOOBhuWQjeWJjeOBrjEy5YiX77yJ44KS5qC857SN44GX44Gf44CMYHIgbnJvdyhkYXRhKWDooYwgJFx0aW1lcyQgYHIgbmNvbChkYXRhKWDliJfjga5gZGF0YWDjgqrjg5bjgrjjgqfjgq/jg4jjgI3jgpLkuLvjgarlhaXlipvjgajjgZfjgabjgIFkYWRhMuWun+ihjOe1kOaenOOBruimgee0hOaDheWgseOCkuimi+OBpuOBhOOBjeOBvuOBme+8iFczLjHvvInjgIINCg0K44CAW+mAo+i8ieesrDIz5ZueXShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyMy5odG1sKeOBruihqDHjgavnm7jlvZPjgZnjgovoj4zmoKrmg4XloLHjg5XjgqHjgqTjg6vvvIhbSlNMQUIyM190YWJsZTEudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0Ke+8ieOBq+OBr+OAgeioiDE55bGe77yIMjLnqK7vvInjga7ml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnvvIhbR2V2ZXJzIGV0IGFsLiwgUExvUyBDb21wdXQgQmlvbC4sIDIwMTJdKGh0dHBzOi8vcHVibWVkLm5jYmkubmxtLm5paC5nb3YvMjMyMDkzODkvKe+8ieOBq+mWouOBmeOCi+aDheWgseOBjOWQq+OBvuOCjOOBpuOBhOOBvuOBmeOAguOBk+OBruaDheWgseOBqOeqgeOBjeWQiOOCj+OBm+OBpuOAgeOBqeOCjOOBoOOBkeacrOadpeaknOWHuuOBleOCjOOCi+OBueOBjeOCguOBruOBjOato+OBl+OBj+aknOWHuuOBp+OBjeOBpuOBhOOCi+OBi+OCkuipleS+oeOBl+OBpuOBhOOBjeOBvuOBmeOAguWun+mam+OBq+S9v+OBhuaDheWgseOBr+OAgWByIGxlbmd0aChnZW51c190cnV0aClg5YCL44Gu6KaB57Sg44GL44KJ44Gq44KL5paH5a2X5YiX44OZ44Kv44OI44Or44GuYGdlbnVzX3RydXRoYOOCquODluOCuOOCp+OCr+ODiOOBqGByIGxlbmd0aChzcGVjaWVzX3RydXRoKWDlgIvjga7opoHntKDjgYvjgonjgarjgovmloflrZfliJfjg5njgq/jg4jjg6vjga5gc3BlY2llc190cnV0aGANCuOCquODluOCuOOCp+OCr+ODiOOBq+OBquOCiuOBvuOBmeOAgg0KDQojIyBXMy4xIGRhZGEy5a6f6KGM57WQ5p6c44Gu44G/DQrjgIDjgb7jgZrjgIFkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44Gu6KaB57SE5oOF5aCx44KS6KaL44Gm44GE44GN44G+44GZ44CC6YeN6KaB44Gq44Gu44Gv44CB5LqI44KBRXhjZWzjgarjganjgafnnLrjgoHjgablhajkvZPlg4/jgpLmiormj6HjgZfjgabjgYrjgY/jgZPjgajjgafjgZnjgILjgZPjgozjga/jgIHjganjga7jgojjgYbjgarntZDmnpzjgYzlvpfjgonjgozjgozjgbDmraPjgZfjgY/lh6bnkIbjgZXjgozjgabjgYTjgovjgajliKTmlq3jgZfjgabjgojjgYTjgYvjgpLnn6XjgaPjgabjgYrjgY/jgZPjgajjgajlkIznvqnjgafjgZnjgILlhbfkvZPnmoTjgavjga/jgIHkvovjgYjjgbDjgIxHZW51c+WIl+OCiOOCiuOCglNwZWNpZXPliJfjga7jgbvjgYbjgYzlnKflgJLnmoTjgasiTkEi44Gu6KaB57Sg44GM5aSa44GE44CN44Go44GL44CMIk5BIuOBqOOBhOOBhuOBruOBr+esrDI05Zue44GuVzTjgafjg6rjg5XjgqHjg6zjg7PjgrnphY3liJfkuK3jgavjg5Ljg4Pjg4jjgZfjgarjgYvjgaPjgZ/jgoLjga7jgavnm7jlvZPjgZnjgovjgI3jgajjgYTjgaPjgZ/jgZPjgajjgpLnkIbop6PjgZfjgabjgYrjgY/jgZPjgajjgafjgZnjgIINCg0KIyMjIFczLjEuMSBgbmEub21pdGDplqLmlbANCuOAgGBuYS5vbWl0YOmWouaVsOOBr+OAgeODmeOCr+ODiOODq+OBjOWFpeWKm+OBruWgtOWQiOOBryJOQSLjgafjga/jgarjgYTopoHntKDnlarlj7fmg4XloLHjgpLov5TjgZfjgIHooYzliJfjgYzlhaXlipvjga7loLTlkIjjga8iTkEi44KS5ZCr44G+44Gq44GE6KGM44KS6L+U44GX44G+44GZ44CC44GT44GT44Gn44Gv44G+44Ga44CBIk5BIuOBruimgee0oOaVsOOBjOmdnuW4uOOBq+WkmuOBhGBzcGVjaWVzYOODmeOCr+ODiOODq+OCkuWFpeWKm+OBqOOBl+OBpuOAgWBuYS5vbWl0YOmWouaVsOOCkuWun+ihjOOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9VFJVRX0NCm5hLm9taXQoc3BlY2llcykgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2llc+OBi+OCiSJOQSLjga7opoHntKDjgpLpmaTljrsNCmBgYA0K44CA6KGo56S657WQ5p6c44GoZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vvvIhbb3V0cHV0X0pTTEFCMjQudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0Ke+8ieOCkuimi+avlOOBueOCi+OBk+OBqOOBp+OAgSJOQSLjgafjgarjgYQx55Wq5pyA5Yid44Gu6KaB57Sg44GMYHIgbmEub21pdChzcGVjaWVzKVsxXWDjgIEy55Wq55uu44GMYHIgbmEub21pdChzcGVjaWVzKVsyXWDjgarjga7jgaDjgajop6Pph4jjgZfjgb7jgZnjgILjgZ3jgZfjgabjgIEiTkEi44Gn44Gq44GE6KaB57Sg5pWw44GvYHIgbGVuZ3RoKG5hLm9taXQoc3BlY2llcykpYOOBquOBruOBoOOBqOiqreOBv+ino+OBjeOBvuOBmeOAguOBoeOBquOBv+OBq+OAgeOBk+OBriJOQSLjgafjgarjgYTopoHntKDmlbDjga/jgIFgbmEub21pdChzcGVjaWVzKWDlrp/ooYzntZDmnpzjgavlr77jgZfjgabjgIHjgZXjgonjgavjg5njgq/jg4jjg6vjga7opoHntKDmlbDjgpLov5TjgZlgbGVuZ3RoYOmWouaVsOOCkuWun+ihjOOBmeOCjOOBsOW+l+OCieOCjOOBvuOBmeOAguOBk+OBrmByIGxlbmd0aChuYS5vbWl0KHNwZWNpZXMpKWDjgajjgYTjgYbmlbDlgKTjgYzjgIHnqK7jg6zjg5njg6vjgafns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ9BU1bmlbDjgavnm7jlvZPjgZfjgb7jgZnjgILjgaTjgb7jgorjgIHnqK7jg6zjg5njg6vjgaDjgajjgIFgciBsZW5ndGgoc3BlY2llcylg5YCL44GuQVNW44Gu44GG44Gh44CBYHIgbGVuZ3RoKG5hLm9taXQoc3BlY2llcykpYOWAi+OBruezu+e1seWJsuOCiuW9k+OBpuOBjOOBp+OBjeOBpuOBhOOCi+OBqOOBhOOBhuOBk+OBqOOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9VFJVRX0NCmxlbmd0aChuYS5vbWl0KHNwZWNpZXMpKSAgICAgICAgICAgICAgICAgICMgc3BlY2llc+S4reOBriJOQSLku6XlpJbjga7opoHntKDmlbANCmBgYA0KDQrjgIDmrKHjgavjgIHlsZ7jg6zjg5njg6vjgafjganjgozjgaDjgZHns7vntbHlibLjgorlvZPjgabjgYzjgafjgY3jgZ/jgYvjgpLoqr/jgbnjgb7jgZnjgIJkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ5Lit44GuR2VudXPliJfmg4XloLHjgavnm7jlvZPjgZnjgotgZ2VudXNg44Kq44OW44K444Kn44Kv44OI44KS5YWl5Yqb44Go44GX44Gm44CB5ZCM5qeY44Gu6Kej5p6Q44KS6KGM44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1UUlVFfQ0KbGVuZ3RoKG5hLm9taXQoZ2VudXMpKSAgICAgICAgICAgICAgICAgICAgIyBnZW51c+S4reOBriJOQSLku6XlpJbjga7opoHntKDmlbANCmBgYA0K44CA5bGe44Os44OZ44Or44Gg44Go44CBYHIgbGVuZ3RoKGdlbnVzKWDlgIvjga5BU1bjga7jgYbjgaHjgIFgciBsZW5ndGgobmEub21pdChnZW51cykpYOWAi+OBruezu+e1seWJsuOCiuW9k+OBpuOBjOOBp+OBjeOBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAgg0KDQojIyMgVzMuMS4yIOiHquS9nOmWouaVsGBnZXROb25uYU51bWANCuOAgOOBleOBjeOBu+OBqeOBvuOBp+OBrzHjgaTjga7jg5njgq/jg4jjg6vjgpLlhaXlipvjgajjgZfjgabjgIFgbmEub21pdGDjgYvjgolgbGVuZ3RoYOOBqOOBhOOBhua1geOCjOOBp+aDheWgseOCkuW+l+OBvuOBl+OBn+OBjOOAgWRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjgpLnm7TmjqXoqq3jgb/ovrzjgpPjgaDntZDmnpzjgpLlhaXlipvjgajjgZfjgabjgIHliJfjgZTjgajjgavlkIzmp5jjga7op6PmnpDjgpLooYzjgYbjgZPjgajjgoLjgafjgY3jgb7jgZnjgILjgZ3jgYbjgZnjgovjgZPjgajjgafjgIFHZW51c+OCiOOCiuOCgumrmOOBhOmajue0muOAgeOBpOOBvuOCiuOAjOeVjO+8iEtpbmdkb23vvInjg7vploDvvIhQaHlsdW3vvInjg7vntrHvvIhDbGFzc++8ieODu+ebru+8iE9yZGVy77yJ44O756eR77yIRmFtaWx577yJ44CN77yJ44Gr44Gk44GE44Gm44KC57O757Wx5Ymy44KK5b2T44Gm57WQ5p6c44Gu5YWo5L2T5YOP44GM6KaL44KJ44KM44G+44GZ44CC44GT44GT44Gn44Gv44CB44CMTkHjgafjga/jgarjgYTvvIhOb24tTkHvvInmlbDjga7mg4XloLHjgpLlvpfjgovjgZ/jgoHjga7plqLmlbDjgI3jgajjgYTjgYbmhI/lkbPjgafjgIHku6XkuIvjga5gZ2V0Tm9ubmFOdW1g6Zai5pWw44KS5a6a576p44GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmdldE5vbm5hTnVtIDwtIGZ1bmN0aW9uKHgpIGxlbmd0aChuYS5vbWl0KHgpKSAgICMgIk5BIuS7peWkluOBruimgee0oOaVsOOCkuW+l+OCi+OBn+OCgeOBrumWouaVsOOCkuWumue+qQ0KYGBgDQrjgIDoh6rkvZzplqLmlbDjgavjgaTjgYTjgabjga/jgIFb56ysMjTlm55dKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQjI0Lmh0bWwp44Gu44GuVzEuNi4z44CBVzIuNeOAgVcyLjbjgarjganjgafjgoLop6PoqqzjgZfjgabjgYTjgb7jgZnjgIINCg0KIyMjIFczLjEuMyBgYXBwbHlg6Zai5pWwDQrjgIBgYXBwbHlg6Zai5pWw44Gv44CB6KGM5YiX44KS5YWl5Yqb44Go44GX44Gm44CB6KGM44GU44Go44KE5YiX44GU44Go44Gr5Lu75oSP44Gu5Yem55CG44KS6KGM44GG44Gf44KB44Gu6Zai5pWw44Gn44GZ44CC44GT44GT44Gn44Gv44CBYGFwcGx5YOmWouaVsOOBruS4reOBp+OAgeWFiOOBu+OBqeiHquS9nOOBl+OBn2BnZXROb25uYU51bWDplqLmlbDjgpLlrp/ooYzjgZnjgovkvovjgpLnpLrjgZfjgb7jgZnjgIJkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44KS6Kqt44G/6L6844KT44Gg55u05b6M44GuYGhvZ2Vg44Kq44OW44K444Kn44Kv44OI44KS5YWl5Yqb44Go44GX44Gm77yIYFggPSBob2dlYO+8ieOAgeWIl+OBlOOBqOOBq++8iGBNQVJHSU4gPSAyYO+8ieOAgWBnZXROb25uYU51bWDplqLmlbDjgpLpgannlKjjgZnjgovvvIhgRlVOID0gZ2V0Tm9ubmFOdW1g77yJ44Go44GE44GG5pu444GN5pa544Gr44GX44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmluX2YgPC0gImh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQiICMg6Kqt44G/6L6844G/44Gf44GE44OV44Kh44Kk44Or5oOF5aCx44KSaW5fZuOBq+agvOe0jQ0KaG9nZSA8LSByZWFkLnRhYmxlKGluX2YsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9MSwgc2VwPSJcdCIpIyBpbl9m44KS44CBMeihjOebruOCkuWIl+WQjeOAgTHliJfnm67jgpLooYzlkI3jgajjgZfjgaboqq3jgb/ovrzjgpPjgaDntZDmnpzjgpJob2dl44Gr5qC857SNDQpyZXN1bHQgPC0gYXBwbHkoWCA9IGhvZ2UsIE1BUkdJTiA9IDIsIEZVTiA9IGdldE5vbm5hTnVtKSMgaG9nZeOBruWQhOWIl+OBq+WvvuOBl+OBpuOAgWdldE5vbm5hTnVt6Zai5pWw44KS5a6f6KGM44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQpyZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdOOBruS4rei6qw0KYGBgDQrjgIDlrp/ooYzntZDmnpzjgafjgYLjgotgcmVzdWx0YOOCquODluOCuOOCp+OCr+ODiOOBq+OBr+acrOadpeS4jeimgeOBque1kOaenOOCguWQq+OBvuOCjOOBpuOBhOOBvuOBmeOBjOOAgUdlbnVz5YiX44KEU3BlY2llc+WIl+OBrue1kOaenOOCguWQq+OBvuOCjOOBvuOBmeOBruOBp+OAgeetlOOBiOWQiOOCj+OBm+OBq+OBquOCi+ODoeODquODg+ODiOOCguOBguOCiuOBvuOBmeOAguWun+mam+OBruS9nOalreOBqOOBl+OBpuOBr+OAgeOBvuOBmuOBr+OBk+OCjOOCkuOChOOBo+OBpuaJi+mghuOChOe1kOaenOOBq+mWk+mBleOBhOOBjOOBquOBhOOBk+OBqOOCkueiuuiqjeOBl+OBvuOBmeOAguS+i+OBiOOBsOOAgSJTUlIi44GL44KJ5aeL44G+44KL6KiIMTLjgrXjg7Pjg5fjg6vjga5BU1bjga7lh7rnj77poLvluqbmg4XloLHpg6jliIbjga/jgIHlhajjgaY1ODDjgajjgYTjgYbmlbDlgKTjgavjgarjgaPjgabjgYTjgablpqXlvZPjgaDjgajliKTmlq3jgZfjgb7jgZnjgILnkIbnlLHjga/jgIHjgZPjgZPjga7lhYPmg4XloLHjga/lh7rnj77poLvluqbjgarjga7jgafjgIEw5Lul5LiK44Gu5pW05pWw44Gq44Gv44Ga44Gn44GC44KK44CB5Y6f55CG55qE44GrTkHjga7mlbDjgYwx44Gk44KC5ZCr44G+44KM44Gq44GE44Gv44Ga44Gg44GL44KJ44Gn44GZ44CC44G+44Gf44CB55WM77yIS2luZ2Rvbe+8ieOBjDU4MOOBq+OBquOCi+OBruOCguWmpeW9k+OBp+OBmeOAgueQhueUseOBr+OAgeesrDI05Zue44GuVzTjgafooYzjgaPjgZ/ns7vntbHlibLjgorlvZPjgabmmYLjgavliKnnlKjjgZfjgZ/jg6rjg5XjgqHjg6zjg7PjgrnphY3liJfjga/jgIHlhajjgabjg5Djgq/jg4bjg6rjgqLnlLHmnaXjgaDjgYvjgonjgafjgZnjgIJkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44GuS2luZ2RvbeWIl+OCkuWun+mam+OBq+ecuuOCgeOBpuOBv+OCi+OBqOOAgeWFqOimgee0oOOBjEJhY3Rlcmlh44Gr44Gq44Gj44Gm44GE44KL44GT44Go44GM44KP44GL44KK44G+44GZ44CC44GT44KT44Gq5oSf44GY44Gn56K66KqN44GX44Gq44GM44KJ6YCy44KB44Gm44GE44GP5ae/5Yui44GM5aSn5LqL44Gn44GZ44CCDQoNCiMjIyBXMy4xLjQgYGdyZXBg6Zai5pWwDQrjgIDlhYjjgbvjganjga7lrp/ooYzntZDmnpzjgavjga/jgIEiU1JSIuOBi+OCieWni+OBvuOCi+ioiDEy44K144Oz44OX44Or44GuQVNW44Gu5Ye654++6aC75bqm5oOF5aCx6YOo5YiG44Gu57WQ5p6c44KC5ZCr44G+44KM44Gm44GE44G+44GX44Gf44CC44GT44GT44Gn44Gv44CBIlNSUiLjgajjgYTjgYbmloflrZfjgpLlkKvjgb7jgarjgYTliJfjgpLpmaTlpJbjgZfjgZ/jgoLjga7jgavlr77jgZfjgabjgIHlhYjjgbvjganjgajlkIzmp5jjga7kvZzmpa3jgpLlrp/ooYzjgZfjgb7jgZnjgIJgZ3JlcGDplqLmlbDjga/jgIFXMi4xLjLjgafjgoLliKnnlKjjgZfjgb7jgZfjgZ/jgYzjgIHjgIzmpJzntKLjgZfjgZ/jgYTmloflrZfliJfjgpLlkKvjgoDjgIHmloflrZfliJfjg5njgq/jg4jjg6vkuK3jga7opoHntKDnlarlj7fjgI3jgpLov5TjgZnjga7jgYzln7rmnKzlvaLjgafjgZnjgIJkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44KS6Kqt44G/6L6844KT44Gg55u05b6M44GuYGhvZ2Vg44Kq44OW44K444Kn44Kv44OI44Gu5YiX5ZCN5oOF5aCx44Gr55u45b2T44GZ44KL44Gu44GMYGNvbG5hbWVzKGhvZ2UpYOOBq+OBquOCiuOBvuOBmeOBruOBp+OAgVcyLjEuMuOBp+OCguWIqeeUqOOBl+OBn2BncmVwYOmWouaVsOOCkuWIqeeUqOOBl+OBpuOAgSJTUlIi44Go44GE44GG5paH5a2X44KS77yIYHBhdHRlcm4gPSAiU1JSImDvvInjgpLlkKvjgb7jgarjgYTvvIhgaW52ZXJ0ID0gVFJVRWDvvInopoHntKDnlarlj7fjgpLlj5blvpfjgZnjgovjgajjgYTjgYbjg4bjgq/jg4vjg4Pjgq/jgpLkvb/jgaPjgabjgYTjgb7jgZnjgILlvpfjgonjgozjgZ9gb2JqYOOBjOOAjOS7iuWbnuaKveWHuuOBl+OBn+OBhOWIl+eVquWPt+aDheWgseOAjeOBq+ebuOW9k+OBl+OBvuOBmeOBruOBp+OAgWBhcHBseWDplqLmlbDjga7lhaXlipvjgpJgWCA9IGhvZ2VbLCBvYmpdYOOBqOOBmeOCjOOBsOebrueahOOCkumBlOaIkOOBp+OBjeOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQppbl9mIDwtICJodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0IiAjIOiqreOBv+i+vOOBv+OBn+OBhOODleOCoeOCpOODq+aDheWgseOCkmluX2bjgavmoLzntI0NCmhvZ2UgPC0gcmVhZC50YWJsZShpbl9mLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEsIHNlcD0iXHQiKSMgaW5fZuOCkuOAgTHooYznm67jgpLliJflkI3jgIEx5YiX55uu44KS6KGM5ZCN44Go44GX44Gm6Kqt44G/6L6844KT44Gg57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0Kb2JqIDwtIGdyZXAocGF0dGVybiA9ICJTUlIiLCB4ID0gY29sbmFtZXMoaG9nZSksIGludmVydCA9IFRSVUUpIyBjb2xuYW1lcyhob2dlKeOBruS4reOBi+OCieOAgSJTUlIi44Go44GE44GG5paH5a2X44KS5ZCr44G+44Gq44GE6KaB57Sg55Wq5Y+344KSb2Jq44Gr5qC857SNDQpvYmogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9iauOBruS4rei6qw0KcmVzdWx0IDwtIGFwcGx5KFggPSBob2dlWywgb2JqXSwgTUFSR0lOID0gMiwgRlVOID0gZ2V0Tm9ubmFOdW0pIyBob2dlWywgb2JqXeOBruWQhOWIl+OBq+WvvuOBl+OBpuOAgWdldE5vbm5hTnVt6Zai5pWw44KS5a6f6KGM44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQpyZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdOOBruS4rei6qw0KYGBgDQrjgIDjgZPjgZPjgb7jgafjga7ntZDmnpzjgYzlvpfjgonjgozjgovjgrnjgq/jg6rjg5fjg4jjgYzjgIHkuIDoiKzjgavoq5bmlofjga5TdXBwbGVtZW5044Gq44Gp44Gn5o+Q5L6b44GV44KM44KL44KC44Gu44Gr44Gq44KK44G+44GZ44CC44GT44Gu44K544Kv44Oq44OX44OI44Gg44GR44KS5pyA5Yid44Gr6KaL44Gb44KJ44KM44KL44Go6Zuj6Kej44Gq44Kk44Oh44O844K444KS5oyB44Gf44KM44KL44Go5oCd44GE44G+44GZ44GM44CB5b6X44Gf44GE5Ye65Yqb57WQ5p6c44Go5a6f6Zqb44Gu5YWl5Yqb5oOF5aCx44Go44Gu5YW844Gt5ZCI44GE44Gn44CB44GE44KN44GE44KN44Go5bCP57Sw5bel44KS44GX44Gq44GE44Go44GE44GR44Gq44GE44KC44Gu44Gn44GZ44CCDQoNCiMjIyBXMy4xLjUgYHRhYmxlYOmWouaVsA0K44CAW+esrDI05Zue44GuVzEuNi4xXShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyNC5odG1sI1cxNjFfJUU1JTlGJUJBJUU2JTlDJUFDJUU3JTlBJTg0JUUzJTgxJUFBJUU4JTgwJTgzJUUzJTgxJTg4JUU2JTk2JUI5KeOBp+OCguWIqeeUqOOBl+OBvuOBl+OBn+OBjOOAgWB0YWJsZWDplqLmlbDjga/jgIHjg5njgq/jg4jjg6vjgpLlhaXlipvjgajjgZfjgabkuI7jgYjjgovjgajjgIHopoHntKDjga7nqK7poZ7jgZTjgajjga7lh7rnj77poLvluqbjgpLov5TjgZfjgb7jgZnjgILjgZ3jgozjgobjgYjjgIFgdGFibGVg6Zai5pWw5a6f6KGM57WQ5p6c44Gu44OZ44Kv44OI44Or44Gu6KaB57Sg5pWw44Gv44CB5YWl5Yqb44OZ44Kv44OI44Or5Lit44Gu44Om44OL44O844Kv44Gq6KaB57Sg5pWw77yI5L2G44GXTkHjga/pmaTjgY/vvInjgajnrYnjgZfjgY/jgarjgorjgb7jgZnjgILjgZPjgZPjgafjga/jgb7jgZrjgIFgciBsZW5ndGgoc3BlY2llcylg5YCL44Gu6KaB57Sg44GL44KJ44Gq44KLYHNwZWNpZXNg44Kq44OW44K444Kn44Kv44OI44KS5YWl5Yqb44Go44GX44Gm5a6f6KGM44GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnRhYmxlKHNwZWNpZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2llc+S4reOBruimgee0oOOBrueorumhnuOBlOOBqOOBruWHuuePvumgu+W6pg0KbGVuZ3RoKHRhYmxlKHNwZWNpZXMpKSAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWVz5Lit44Gu44Om44OL44O844Kv44Gq6KaB57Sg5pWwDQpgYGANCuOAgFvpgKPovInnrKwyM+Wbnl0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCMjMuaHRtbCnjga7ooagx44Gn44KC56S644GV44KM44Gm44GE44KL44Go44GK44KK44CB5LuK5Zue44Gu44K144Oz44OX44Or44Gv6KiIMTnlsZ7vvIgyMueoru+8ieOBruaXouefpeW+rueUn+eJqee+pOmbhu+8iFtITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4Ke+8ieOBi+OCieani+aIkOOBleOCjOOBpuOBhOOBvuOBmeOAguW+k+OBo+OBpuOAgeOBk+OBrmByIGxlbmd0aCh0YWJsZShzcGVjaWVzKSlg5YCL44Go44GE44GG57WQ5p6c44KS6KaL44Gf44Gg44GR44Gn44CB5pyA5L2O44Gn44KCKGByIGxlbmd0aCh0YWJsZShzcGVjaWVzKSlgIC0gMjIp5YCL44Gu5pys5p2l44Gv5a2Y5Zyo44GX44Gq44GE44Gv44Ga44Gu55Sf54mp56iu44GM5qSc5Ye644GV44KM44Gf44Go6Kej6YeI44GX44G+44GZ44CC44CM5pyA5L2O44Gn44KC44CN44Go44KP44GW44KP44GW5pu444GE44Gf44Gu44Gv44CB54++5pmC54K544Gn44Gv44GT44GuMjLnqK7lhajjgabjgpLmraPjgZfjgY/mpJzlh7rjgafjgY3jgabjgYTjgovjgYvjganjgYbjgYvjgYzkuI3mmI7jgaDjgYvjgonjgafjgZnjgIINCg0K44CA44Gq44GK44CB44GT44GuYHIgbGVuZ3RoKHRhYmxlKHNwZWNpZXMpKWDjgajjgYTjgYbmlbDlgKTjga/jgIHku6XkuIvjgafjgoLlvpfjgonjgozjgb7jgZnjgIJgbmEub21pdGDplqLmlbDjgpLmjJ/jgpPjgafjgYTjgovjga7jga/jgIHjgb7jgZrjga8iTkEi44Gu57WQ5p6c44KS6Zmk5aSW44GX44Gm44GK44GN44Gf44GE44GL44KJ44Gn44GZ44CC44KC44GXYGxlbmd0aCh1bmlxdWUoc3BlY2llcykpYOOBqOabuOOBj+OBqOOAgSJOQSLjga7lh7rnj77lm57mlbDjga7ntZDmnpzjgoLlkKvjgb7jgozjgabjgZfjgb7jgYbjgZ/jgoHjgIFgciBsZW5ndGgodW5pcXVlKHNwZWNpZXMpKWDjgajjgYTjgYbmlbDlgKTjgavjgarjgaPjgabjgIHkuIroqJjjgajlkIjjgo/jgarjgY/jgarjgovjgYvjgonjgafjgZnjgILjgZPjga7jgojjgYbjgavjgIHplqLmlbDjgavjgojjgaPjgabjg4fjg5Xjgqnjg6vjg4jjga4iTkEi44G444Gu5a++5Yem5pa56Yed44Gv55Ww44Gq44KK44G+44GZ44Gu44Gn44GU5rOo5oSP44GP44Gg44GV44GE44CCDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KbGVuZ3RoKHVuaXF1ZShuYS5vbWl0KHNwZWNpZXMpKSkgICAgICAgICAgIyBzcGVjaWVz44OZ44Kv44OI44Or5Lit44Gu44Om44OL44O844Kv44Gq6KaB57Sg5pWwDQpgYGANCg0K44CA5qyh44Gr44CBYHIgbGVuZ3RoKGdlbnVzKWDlgIvjga7opoHntKDjgYvjgonjgarjgotgZ2VudXNg44Kq44OW44K444Kn44Kv44OI44KS5YWl5Yqb44Go44GX44Gm5a6f6KGM44GX44G+44GZ44CC44GT44GuYHIgbGVuZ3RoKHRhYmxlKGdlbnVzKSlg5YCL44Go44GE44GG57WQ5p6c44KS6KaL44Gf44Gg44GR44Gn44CB5pyA5L2O44Gn44KCKGByIGxlbmd0aCh0YWJsZShnZW51cykpYCAtIDE5KeWAi+OBruacrOadpeOBr+WtmOWcqOOBl+OBquOBhOOBr+OBmuOBruWxnuOBjOaknOWHuuOBleOCjOOBn+OBqOino+mHiOOBl+OBvuOBmeOAgg0K44CADQrjgIANCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KbGVuZ3RoKHRhYmxlKGdlbnVzKSkgICAgICAgICAgICAgICAgICAgICAgIyBnZW51c+ODmeOCr+ODiOODq+S4reOBruODpuODi+ODvOOCr+OBquimgee0oOaVsA0KYGBgDQoNCiMjIyBXMy4xLjYgVzMuMeOBruOBvuOBqOOCgQ0K44CAVzMuMeOBp+W+l+OBn+e1kOaenOOCkuOBvuOBqOOCgeOCi+OBqOS7peS4i+OBruOCiOOBhuOBq+OBquOCiuOBvuOBmeOAguOAjCJOQSLjgpLpmaTjgY/opoHntKDmlbDjgI3jgojjgorjgoLjgIwiTkEi44KS6Zmk44GP44Om44OL44O844Kv44Gq6KaB57Sg5pWw44CN44GM5bCR44Gq44GP44Gq44KL44Gu44Gv44CBQVNW6YWN5YiX44GM5b6u5aaZ44Gr55Ww44Gq44Gj44Gm44GE44Gm44KC44CB5ZCM44GY5bGe44G+44Gf44Gv56iu44Gr5Ymy44KK5b2T44Gm44KJ44KM44KL44GT44Go44KC44GC44KL44GL44KJ44Gg44Go6Kej6YeI44GZ44KM44Gw44KI44GE44Gn44GZ44CCDQoNCi0gYGdlbnVzYO+8muaWh+Wtl+WIl+ODmeOCr+ODiOODqw0KICAtICoq5bGe44Gu5LqI5ris57WQ5p6cKirjgavnm7jlvZMNCiAgLSBkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44GuR2VudXPliJfjga7mg4XloLENCiAgLSBgbGVuZ3RoKGdlbnVzKWDvvJropoHntKDmlbDvvIhBU1bjga7nt4/mlbDvvInjga9gciBsZW5ndGgoZ2VudXMpYA0KICAtIGBsZW5ndGgobmEub21pdChnZW51cykpYO+8miJOQSLjgpLpmaTjgY/opoHntKDmlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ9BU1bmlbDvvInjga9gciBsZW5ndGgobmEub21pdChnZW51cykpYA0KICAtIGBsZW5ndGgodGFibGUoZ2VudXMpKWDvvJoiTkEi44KS6Zmk44GP44Om44OL44O844Kv44Gq6KaB57Sg5pWw77yI57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44Gf44Om44OL44O844Kv44Gq5bGe44Gu5pWw77yJ44GvYHIgbGVuZ3RoKHRhYmxlKGdlbnVzKSlgDQoNCi0gYHNwZWNpZXNg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirnqK7jga7kuojmuKzntZDmnpwqKuOBq+ebuOW9kw0KICAtIGRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5TcGVjaWVz5YiX44Gu5oOF5aCxDQogIC0gYGxlbmd0aChzcGVjaWVzKWDvvJropoHntKDmlbDvvIhBU1bjga7nt4/mlbDvvInjga9gciBsZW5ndGgoc3BlY2llcylgDQogIC0gYGxlbmd0aChuYS5vbWl0KHNwZWNpZXMpKWDvvJoiTkEi44KS6Zmk44GP6KaB57Sg5pWw77yI57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44GfQVNW5pWw77yJ44GvYHIgbGVuZ3RoKG5hLm9taXQoc3BlY2llcykpYA0KICAtIGBsZW5ndGgodGFibGUoc3BlY2llcykpYO+8miJOQSLjgpLpmaTjgY/jg6bjg4vjg7zjgq/jgaropoHntKDmlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ/jg6bjg4vjg7zjgq/jgarnqK7jga7mlbDvvInjga9gciBsZW5ndGgodGFibGUoc3BlY2llcykpYA0KDQojIyBXMy4yIOaAp+iDveipleS+oe+8iOmHjeikh+OBquOBl++8iQ0K44CAVzMuMeOBp+OBr+OAgWRhZGEy5a6f6KGM57WQ5p6c44Go44GX44Gm5b6X44KJ44KM44GfNTgw5YCL44GuQVNW6YWN5YiX44Gu44GG44Gh44CB5bGe44Os44OZ44Or44Gn44GvMzQz5YCL77yI44Om44OL44O844Kv44Gq5bGe44Gu5pWw44GvYHIgbGVuZ3RoKHRhYmxlKGdlbnVzKSlg5YCL77yJ44CB56iu44Os44OZ44Or44Gn44GvNTnlgIvvvIjjg6bjg4vjg7zjgq/jgarnqK7jga7mlbDjga9gciBsZW5ndGgodGFibGUoc3BlY2llcykpYOWAi++8ieOBq+OBpOOBhOOBpuezu+e1seWJsuOCiuW9k+OBpuOBjOihjOOCj+OCjOOBn+OBk+OBqOOCkuS4u+OBq+eiuuiqjeOBl+OBvuOBl+OBn+OAguOBk+OBk+OBp+OBr+OAgemAo+i8ieesrDIz5Zue44Gu6KGoMeOBruOAgeioiDE55bGe77yIMjLnqK7vvInjga7ml6Lnn6Xlvq7nlJ/niannvqTpm4bvvIhbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnvvInjgpLjganjgozjgaDjgZHmpJzlh7rjgafjgY3jgabjgYTjgovjgYvjgpLoqr/jgbnjgb7jgZnjgILkvovjgYjjgbDjgIHlsZ7jg6zjg5njg6vjga7ns7vntbHlibLjgorlvZPjgabntZDmnpzjgafjgYLjgotgciBsZW5ndGgodGFibGUoZ2VudXMpKWDlgIvjga7jg6bjg4vjg7zjgq/jgarlsZ7mlbDjga7kuK3jgavjgIFITS0yODDjgavlsZ7jgZnjgovoqIgxOeWxnuOBjOWFqOOBpuWQq+OBvuOCjOOBpuOBhOOCjOOBsOOAgeWFqOOBpuato+OBl+OBj+aknOWHuuOBp+OBjeOBn++8iOaEn+W6pjEwMCXvvInjgajoqZXkvqHjgZfjgb7jgZnjgILjgb7jgZ/jgIFkYWRhMue1kOaenOOBruS4reOBq0hNLTI4MOOBq+WxnuOBmeOCi+ioiDE55bGe5Lul5aSW44Gu5L2Z6KiI44Gq44KC44Gu44GM5ZCr44G+44KM44Gm44GE44Gq44GE44GL44Gp44GG44GL44KC6YeN6KaB44Gq5oyH5qiZ44Go44GE44GI44G+44GZ44CC44KC44GXZGFkYTLlrp/ooYzntZDmnpzjga5BU1bphY3liJflhajjgabjgYzjgZPjga7oqIgxOeWxnuOBruOBv+OBi+OCieani+aIkOOBleOCjOOBpuOBhOOCjOOBsOOAgemBqeWQiOeOhzEwMCXjgajjgYTjgYbjgZPjgajjgavjgarjgorjgb7jgZnjgILjgZPjgZPjgafjga/jgIHlhbfkvZPnmoTjgaroqIjnrpfmlrnms5XjgpLlkKvjgoHjgabop6PoqqzjgZfjgabjgYTjgY3jgb7jgZnjgILjgarjgYrjgIHnlKjjgYTjgovml6Lnn6Xlvq7nlJ/niannvqTpm4bmg4XloLHjga/jgIFXMi4y44Gn5Y+W5b6X44GX44Gf5Lul5LiL44GuMuOBpOOBruaWh+Wtl+WIl+ODmeOCr+ODiOODq+OBp+OBmeOAgg0KDQotIGBnZW51c190cnV0aGDvvJrmloflrZfliJfjg5njgq/jg4jjg6sNCiAgLSAqKuWxnuOBruato+ino+aDheWgsSoq44Gr55u45b2TDQogIC0g56ysMjPlm57jga7ooagx44Gr55u45b2T44GZ44KL6I+M5qCq5oOF5aCx44OV44Kh44Kk44Or77yIW0pTTEFCMjNfdGFibGUxLnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCMjNfdGFibGUxLnR4dCnvvInjga5PcmdhbmlzbeWIl+OBruaDheWgseOAgjHnlarlt6blgbTjga7ljYrop5Ljgrnjg5rjg7zjgrnmiYvliY3jgb7jgafjga7ljZjoqp7jgIINCiAgLSDmnKzmnaXmpJzlh7rjgZfjgZ/jgYTml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnkuK3jga7lsZ7lkI3jgavnm7jlvZMNCiAgLSBgbGVuZ3RoKGdlbnVzX3RydXRoKWDvvJropoHntKDmlbDvvIjjg6bjg4vjg7zjgq/jgarlsZ7jga7mlbDvvInjga9gciBsZW5ndGgoZ2VudXNfdHJ1dGgpYA0KDQotIGBzcGVjaWVzX3RydXRoYO+8muaWh+Wtl+WIl+ODmeOCr+ODiOODqw0KICAtICoq56iu44Gu5q2j6Kej5oOF5aCxKirjgavnm7jlvZMNCiAgLSDnrKwyM+WbnuOBruihqDHjgavnm7jlvZPjgZnjgovoj4zmoKrmg4XloLHjg5XjgqHjgqTjg6vvvIhbSlNMQUIyM190YWJsZTEudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0Ke+8ieOBrk9yZ2FuaXNt5YiX44Gu5oOF5aCx44CC5pyA5Yid44Gu5Y2K6KeS44K544Oa44O844K544GL44KJ44Kz44Oz44Oe5omL5YmN44G+44Gn44Gu5Y2Y6Kqe44CCDQogIC0gYGxlbmd0aChzcGVjaWVzX3RydXRoKWDvvJropoHntKDmlbDvvIjjg6bjg4vjg7zjgq/jgarnqK7jga7mlbDvvInjga9gciBsZW5ndGgoc3BlY2llc190cnV0aClgDQoNCuOAgOS4iuiomDLjgaTjga7mraPop6Pmg4XloLHjgYzmoLzntI3jgZXjgozjgZ/jg5njgq/jg4jjg6vjgavlr77jgZfjgabjgIFXMi4x44Gn5b6X44Gf5Lul5LiL44GuMuOBpOOBruS6iOa4rOe1kOaenO+8iGRhZGEy5a6f6KGM57WQ5p6c77yJ44GM5qC857SN44GV44KM44Gf44OZ44Kv44OI44Or44Go5LiA6Ie044GZ44KL44KC44Gu44GM44GC44KL44GL44KS6Kq/44G544KL44Gu44GM44GT44GT44Gn44Gu5L2c5qWt44Gr44Gq44KK44G+44GZ44CCDQoNCi0gYGdlbnVzYO+8muaWh+Wtl+WIl+ODmeOCr+ODiOODqw0KICAtICoq5bGe44Gu5LqI5ris57WQ5p6cKirjgavnm7jlvZMNCiAgLSBkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44GuR2VudXPliJfjga7mg4XloLENCiAgLSBgbGVuZ3RoKGdlbnVzKWDvvJropoHntKDmlbDvvIhBU1bjga7nt4/mlbDvvInjga9gciBsZW5ndGgoZ2VudXMpYA0KICAtIGBsZW5ndGgobmEub21pdChnZW51cykpYO+8miJOQSLjgpLpmaTjgY/opoHntKDmlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ9BU1bmlbDvvInjga9gciBsZW5ndGgobmEub21pdChnZW51cykpYA0KICAtIGBsZW5ndGgodGFibGUoZ2VudXMpKWDvvJoiTkEi44KS6Zmk44GP44Om44OL44O844Kv44Gq6KaB57Sg5pWw77yI57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44Gf44Om44OL44O844Kv44Gq5bGe44Gu5pWw77yJ44GvYHIgbGVuZ3RoKHRhYmxlKGdlbnVzKSlgDQoNCi0gYHNwZWNpZXNg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirnqK7jga7kuojmuKzntZDmnpwqKuOBq+ebuOW9kw0KICAtIGRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5TcGVjaWVz5YiX44Gu5oOF5aCxDQogIC0gYGxlbmd0aChzcGVjaWVzKWDvvJropoHntKDmlbDvvIhBU1bjga7nt4/mlbDvvInjga9gciBsZW5ndGgoc3BlY2llcylgDQogIC0gYGxlbmd0aChuYS5vbWl0KHNwZWNpZXMpKWDvvJoiTkEi44KS6Zmk44GP6KaB57Sg5pWw77yI57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44GfQVNW5pWw77yJ44GvYHIgbGVuZ3RoKG5hLm9taXQoc3BlY2llcykpYA0KICAtIGBsZW5ndGgodGFibGUoc3BlY2llcykpYO+8miJOQSLjgpLpmaTjgY/jg6bjg4vjg7zjgq/jgaropoHntKDmlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ/jg6bjg4vjg7zjgq/jgarnqK7jga7mlbDvvInjga9gciBsZW5ndGgodGFibGUoc3BlY2llcykpYA0KDQojIyMgVzMuMi4xIGBpcy5lbGVtZW50YOmWouaVsA0K44CAYGlzLmVsZW1lbnRg6Zai5pWw44Gv44CBMuOBpOOBruODmeOCr+ODiOODqyjkvovvvJpgeGDjgahgeWAp44KS5YWl5Yqb44Go44GX44Gm5LiO44GI44KL44Go44CBYHhg5Lit44Gu6KaB57Sg44GU44Go44Gr44CBYHlg5Lit44Gu6KaB57Sg44Go5LiA6Ie044GZ44KL44KC44Gu44GM44GC44KL44GL44Gp44GG44GL44KS6KuW55CG5YCk77yIVFJVRSBvciBGQUxTRe+8ieOBp+i/lOOBl+OBvuOBmeOAguOBk+OBk+OBp+OBr+OBvuOBmuOAgeS7peS4i+OBq+ekuuOBmTLjgaTjga7mloflrZfliJfjg5njgq/jg4jjg6vjgafogIPjgYjjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KeCA8LSBjKCJBIiwgIkMiLCAiRCIsICJGIiwgIkoiLCAiSiIpICAgICAgIyDmloflrZfliJfjg5njgq/jg4jjg6vjgpLkvZzmiJDjgZfjgaZ444Gr5qC857SNDQp5IDwtIGMoIkoiLCAiQyIsICJDIiwgIkciLCAiQiIpICAgICAgICAgICAjIOaWh+Wtl+WIl+ODmeOCr+ODiOODq+OCkuS9nOaIkOOBl+OBpnnjgavmoLzntI0NCmBgYA0KDQrjgIBgaXMuZWxlbWVudGDplqLmlbDjga/jgIHkuI7jgYjjgovjg5njgq/jg4jjg6vjga7poIbnlarjgpLmsJfjgavjgZnjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgILkvovjgYjjgbDku6XkuIvjga7jgojjgYbjgatgaXMuZWxlbWVudCh4LCB5KWDjgajjgZfjgablrp/ooYzjgZnjgovjgajjgIHlrp/ooYzntZDmnpzjga7opoHntKDmlbDjga9gciBsZW5ndGgoaXMuZWxlbWVudCh4LCB5KSlg44Gr44Gq44KK44G+44GZ44CC44Gk44G+44KK44CBYHhg44Gu6KaB57Sg5pWw44Go5ZCM44GY44Go44GE44GG44GT44Go44Gn44GZ44CC44Gq44GK44CBYGlzLmVsZW1lbnQoeCwgeSlg44GoYHggJWluJSB5YOOBr+WQjOe+qeOBp+OBmeOAguWHuuWKm+e1kOaenOOBrjHnlarnm67jga7opoHntKDjgYxGQUxTReOBq+OBquOBo+OBpuOBhOOCi+OBruOBr+OAgWB4YOS4reOBrjHnlarnm67jga7opoHntKDjgafjgYLjgosiQSLjgajlkIzjgZjjgoLjga7jgYxgeWDjgavjga/lrZjlnKjjgZfjgarjgYTjgZPjgajjgpLmhI/lkbPjgZfjgb7jgZnjgILlkIzmp5jjgavjgIHlh7rlipvntZDmnpzjga4y55Wq55uu44Gu6KaB57Sg44GMVFJVReOBq+OBquOBo+OBpuOBhOOCi+OBruOBr+OAgWB4YOS4reOBrjLnlarnm67jga7opoHntKDjgafjgYLjgosiQyLjgajlkIzjgZjjgoLjga7jgYxgeWDjgavjgoLlrZjlnKjjgZnjgovjgZPjgajjgpLmhI/lkbPjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaXMuZWxlbWVudCh4LCB5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIyB45Lit44Gu5ZCE6KaB57Sg44GMeeOBq+WQq+OBvuOCjOOCi+OBi+WIpOWumg0KeCAlaW4lIHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB45Lit44Gu5ZCE6KaB57Sg44GMeeOBq+WQq+OBvuOCjOOCi+OBi+WIpOWumg0KYGBgDQoNCuOAgGB4YOOBqGB5YOOCkuWFpeOCjOabv+OBiOOBpmBpcy5lbGVtZW50KHksIHgpYOOBqOOBl+OBpuWun+ihjOOBmeOCi+OBqOOAgeWun+ihjOe1kOaenOOBruimgee0oOaVsOOBr2ByIGxlbmd0aChpcy5lbGVtZW50KHksIHgpKWDjgavjgarjgorjgb7jgZnjgILjgarjgYrjgIFgaXMuZWxlbWVudCh5LCB4KWDjgahgeSAlaW4lIHhg44Gv5ZCM576p44Gn44GZ44CC5Ye65Yqb57WQ5p6c44GuMeeVquebruOBruimgee0oOOBjFRSVUXjgavjgarjgaPjgabjgYTjgovjga7jga/jgIFgeWDkuK3jga4x55Wq55uu44Gu6KaB57Sg44Gn44GC44KLIkoi44Go5ZCM44GY44KC44Gu44GMYHhg44Gr44KC5a2Y5Zyo44GZ44KL44GT44Go44KS5oSP5ZGz44GX44G+44GZ44CC5ZCM5qeY44Gr44CB5Ye65Yqb57WQ5p6c44GuNeeVquebruOBruimgee0oOOBjEZBTFNF44Gr44Gq44Gj44Gm44GE44KL44Gu44Gv44CBYHlg5Lit44GuNeeVquebruOBruimgee0oOOBp+OBguOCiyJCIuOBqOWQjOOBmOOCguOBruOBjGB4YOOBq+OBr+WtmOWcqOOBl+OBquOBhOOBk+OBqOOCkuaEj+WRs+OBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQppcy5lbGVtZW50KHksIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAjIHnkuK3jga7lkITopoHntKDjgYx444Gr5ZCr44G+44KM44KL44GL5Yik5a6aDQp5ICVpbiUgeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHnkuK3jga7lkITopoHntKDjgYx444Gr5ZCr44G+44KM44KL44GL5Yik5a6aDQpgYGANCg0KIyMjIFczLjIuMiDmhJ/luqbvvIjlsZ7jg6zjg5njg6vvvIkNCuOAgGBpcy5lbGVtZW50YOmWouaVsOOCkuS7peS4i+OBruOCiOOBhuOBq+WIqeeUqOOBmeOCjOOBsOOAgeioiGByIGxlbmd0aChnZW51c190cnV0aClg5bGe44Gu44GG44Gh44CB44Gp44KM44KS5q2j44GX44GP5qSc5Ye644Gn44GN44Gm44CB44Gp44KM44KS5qSc5Ye644Gn44GN44Gq44GL44Gj44Gf44GL44KS6Kq/44G544KL44GT44Go44GM44Gn44GN44G+44GZ44CCYGdlbnVzX3RydXRoYOOBr+OAgeWxnuOBruato+ino+aDheWgseOBq+ebuOW9k+OBmeOCi+aWh+Wtl+WIl+ODmeOCr+ODiOODq+OBp+OBguOCiuOAgeimgee0oOaVsOOBr2ByIGxlbmd0aChnZW51c190cnV0aClg44Gn44GZ44CCYGdlbnVzYOOBr+OAgeWxnuOBruS6iOa4rOe1kOaenOOBq+ebuOW9k+OBmeOCi+aWh+Wtl+WIl+ODmeOCr+ODiOODq+OBp+OBguOCiuOAgeimgee0oOaVsOOBr2ByIGxlbmd0aChnZW51cylg44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCm9iaiA8LSBpcy5lbGVtZW50KGdlbnVzX3RydXRoLCBnZW51cykgICAgICMgZ2VudXNfdHJ1dGjkuK3jga7lkITopoHntKDjgYxnZW51c+OBq+WQq+OBvuOCjOOCi+OBi+WIpOWumuOBl+OBn+e1kOaenOOCkm9iauOBq+agvOe0jQ0Kb2JqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmrjga7kuK3ouqsNCmBgYA0K44CA5Ye65Yqb57WQ5p6c44GvVFJVRSBvciBGQUxTReOBi+OCieani+aIkOOBleOCjOOCi+irlueQhuWApOODmeOCr+ODiOODq+OBp+OBguOCiuOAgeimgee0oOaVsOOBr2BsZW5ndGgoZ2VudXNfdHJ1dGgpYOOBqOWQjOOBmGByIGxlbmd0aChnZW51c190cnV0aClg44Gn44GZ44CC44GT44Gu44OZ44Kv44OI44Or5Lit44GuVFJVReOBruimgee0oOaVsOOBjOato+OBl+OBj+aknOWHuuOBp+OBjeOBn+aVsOOBq+ebuOW9k+OBl+OBvuOBmeOAguOBk+OBrueoi+W6puOBp+OBguOCjOOBsOebruOBp+OCguOCq+OCpuODs+ODiOOBp+OBjeOBvuOBmeOBjOOAgeS7peS4i+OBruOCiOOBhuOBq2BzdW1g6Zai5pWw44GnYHIgc3VtKG9iailg44Gg44Go5YiG44GL44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnN1bShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2Jq5Lit44GuVFJVReOBruimgee0oOaVsA0KYGBgDQrjgIDjgZPjga7mmYLngrnjgafjgIHoqIhgciBsZW5ndGgoZ2VudXNfdHJ1dGgpYOWxnuOBruOBhuOBoWByIHN1bShvYmopYOWxnuOCkuato+OBl+OBj+aknOWHuuOBp+OBjeOBn+OBk+OBqOOBjOWIhuOBi+OBo+OBn+OBruOBp+OAgSoq5bGe44Os44OZ44Or44Gu5qSc5Ye65oSf5bqm44GvYHIgc3VtKG9iailgIC8gYHIgbGVuZ3RoKGdlbnVzX3RydXRoKWAgPSBgciBzdW0ob2JqKS9sZW5ndGgoZ2VudXNfdHJ1dGgpYCoq44Gr44Gq44KK44G+44GZ44CCW+aEn+W6pu+8iHNlbnNpdGl2aXR544G+44Gf44GvcmVjYWxs77yJXShodHRwczovL2phLndpa2lwZWRpYS5vcmcvd2lraS8lRTYlODQlOUYlRTUlQkElQTYlRTMlODElQTglRTclODklQjklRTclOTUlQjAlRTUlQkElQTYp44Gv44CB5LiA6Iis44Gr44CM6Zm95oCn44Go5Yik5a6a44GV44KM44KL44G544GN44KC44Gu44KS5q2j44GX44GP6Zm95oCn44Go5Yik5a6a44GZ44KL56K6546H44CN44Go5a6a576p44GV44KM44G+44GZ44CC44GT44Gu5aC05ZCI44Gu44CM6Zm95oCn77yIUG9zaXRpdmXvvInjgajliKTlrprjgZXjgozjgovjgbnjgY3jgoLjga7jgI3jgYxgZ2VudXNfdHJ1dGhg5Lit44GuYHIgbGVuZ3RoKGdlbnVzX3RydXRoKWDlsZ7jgavjgarjgorjgb7jgZnjgILjgZPjgZPjgacqKumZveaAp+OBr2RhZGEy44Gn5qSc5Ye644GV44KM44Gf77yI57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44Gf77yJ44Om44OL44O844Kv44Gq5bGe44Gu44GT44GoKirjgpLmjIfjgZfjgIEqKumZsOaAp++8iE5lZ2F0aXZl77yJ44Gv5qSc5Ye644GV44KM44Gq44GL44Gj44Gf77yITkHjgajjgarjgaPjgZ/vvInlsZ7jga7jgZPjgagqKuOCkuaMh+OBl+OBvuOBmeOAguOBvuOBn+OAgeOAjOmZveaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeOCguOBruOBruOBhuOBoeOAgSoq5q2j44GX44GP6Zm95oCn44Go5Yik5a6aKirjgafjgY3jgZ/jgoLjga7jgI3jga7jgZPjgajjgpIqKlRydWUgUG9zaXRpdmUqKiAoVFAp44Go44GE44GEDQrjgb7jgZnjgILjgZPjga7loLTlkIjjgIFUUOOBruaVsOOBr2ByIHN1bShvYmopYOWAi+OBqOOBhOOBhuOBk+OBqOOBq+OBquOCiuOBvuOBmeOAguS4gOiIrOOBq+OAgeOAjOmZveaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeOCguOBruOBruOBhuOBoeOAgeato+OBl+OBj+mZveaAp+OBqOWIpOWumuOBp+OBjeOBquOBi+OBo+OBn++8iCoq6ZaT6YGV44Gj44Gm6Zmw5oCn44Go5Yik5a6aKirjgZfjgabjgZfjgb7jgaPjgZ/vvInjgoLjga7jgI3jga7jgZPjgajjgpIqKkZhbHNlIE5lZ2F0aXZlKiogKEZOKeOBqOOBhOOBhOOBvuOBmeOAguW+k+OBo+OBpuOAgeaui+OCiuOBrmByIGxlbmd0aChnZW51c190cnV0aCkgLSBzdW0ob2JqKWDlgIvjga9GTuOBruOCq+ODhuOCtOODquOBq+WQq+OBvuOCjOOCi+OBk+OBqOOBq+OBquOCiuOBvuOBmeOAguiLpeW5suecgeeVpeOBl+OBplRQID0gYHIgc3VtKG9iailg44CBRk4gPSBgciBsZW5ndGgoZ2VudXNfdHJ1dGgpIC0gc3VtKG9iailg44Gu44KI44GG44Gr6KGo54++44GZ44KL44Go44CBKirmhJ/luqbjga9UUCAvIChUUCArIEZOKSoq44Go5a6a576p44Gn44GN44G+44GZ44CC5oSf5bqm44Gu5YCk44Gu5Y+W44KK44GG44KL56+E5Zuy44GvMO+9njHjgafjgYLjgorjgIEx44Gr6L+R44GE44G744Gp44KI44GE44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NClRQIDwtIHN1bShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2Jq5Lit44GuVFJVReOBruimgee0oOaVsOOCklRQ44Gr5qC857SNDQpGTiA8LSBsZW5ndGgoZ2VudXNfdHJ1dGgpIC0gVFAgICAgICAgICAgICAjIGdlbnVzX3RydXRo44Gu6KaB57Sg5pWwIC0gVFDjgpJGTuOBq+agvOe0jQ0Kc2Vuc2l0aXZpdHkgPC0gVFAgLyAoVFAgKyBGTikgICAgICAgICAgICAgIyDmhJ/luqbjgpLoqIjnrpfjgZfjgZ/ntZDmnpzjgpJzZW5zaXRpdml0eeOBq+agvOe0jQ0Kc2Vuc2l0aXZpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZW5zaXRpdml0eeOBruS4rei6qw0KYGBgDQoNCiMjIyBXMy4yLjMg6YGp5ZCI546H77yI5bGe44Os44OZ44Or77yJDQrjgIDpmb3mgKfjga9kYWRhMuOBp+aknOWHuuOBleOCjOOBn++8iOezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBn++8ieODpuODi+ODvOOCr+OBquWxnuOBruOBk+OBqOOCkuaMh+OBl+OBvuOBmeOBruOBp+OAgeOAjOmZveaAp+OBruaVsOOAjeOBr+OAjGRhZGEy44Gn5qSc5Ye644GV44KM44Gf77yI57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44Gf77yJ44Om44OL44O844Kv44Gq5bGe44Gu5pWw44CN44CB44Gk44G+44KKYHIgbGVuZ3RoKHRhYmxlKGdlbnVzKSlg5YCL44Gr44Gq44KK44G+44GZ44CC44GT44GuYHIgbGVuZ3RoKHRhYmxlKGdlbnVzKSlg44Gv44CBVFDjga5gciBUUGDlgIvjgajjgZ3jgozku6XlpJbvvIjmnKzlvZPjga/mpJzlh7rjgZXjgozjgovjgbnjgY3jgafjga/jgarjgYTjgavjgoLjgYvjgYvjgo/jgonjgZrjgIHmpJzlh7rjgZfjgabjgZfjgb7jgaPjgZ/jgoLjga7vvInjga5gciBsZW5ndGgodGFibGUoZ2VudXMpKSAtIFRQYOWAi+OBq+WIhuWJsuWPr+iDveOBp+OBmeOAguS4gOiIrOOBq+OAgeOBk+OBruOAjOmZveaAp+OBp+OBquOBhO+8iOmZsOaAp++8ieOBqOWIpOWumuOBmeOBueOBjeOBq+OCguOBi+OBi+OCj+OCieOBmuOAgSoq6ZaT6YGV44Gj44Gm6Zm95oCn44Go5Yik5a6aKirjgZfjgZ/jgoLjga7jgI3jga7jgZPjgajjgpIqKkZhbHNlIFBvc2l0aXZlKiogKEZQKeOBqOOBhOOBhOOBvuOBmeOAguOBk+OBk+OBvuOBp+OBp+OAgeOCguOBhjHjgaTjga7oqZXkvqHmjIfmqJnjgafjgYLjgovjgIEqKlRQIC8gKFRQICsgRlAp44Go5a6a576p44GV44KM44KL6YGp5ZCI546H77yIUHJlY2lzaW9u77yJKirjgpLnrpflh7rjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIJUUCA9IGByIFRQYOOAgUZQID0gYHIgbGVuZ3RoKHRhYmxlKGdlbnVzKSkgLSBUUGDjgafjgZnjga7jgafjgIEqKuWxnuODrOODmeODq+OBrumBqeWQiOeOh+OBr2ByIFRQYCAvIChgciBUUGAgKyBgciBsZW5ndGgodGFibGUoZ2VudXMpKSAtIFRQYCkgPSBgciBzdW0ob2JqKS9sZW5ndGgodGFibGUoZ2VudXMpKWAqKuOBq+OBquOCiuOBvuOBmeOAgumBqeWQiOeOh+OBruWApOOBruWPluOCiuOBhuOCi+evhOWbsuOBrzDvvZ4x44Gn44GC44KK44CBMeOBq+i/keOBhOOBu+OBqeOCiOOBhOOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpGUCA8LSBsZW5ndGgodGFibGUoZ2VudXMpKSAtIFRQICAgICAgICAgICAjIGdlbnVz44Gu44Om44OL44O844Kv44Gq6KaB57Sg5pWwIC0gVFDjgpJGUOOBq+agvOe0jQ0KcHJlY2lzaW9uIDwtIFRQIC8gKFRQICsgRlApICAgICAgICAgICAgICAgIyDpganlkIjnjofjgpLoqIjnrpfjgZfjgZ/ntZDmnpzjgpJwcmVjaXNpb27jgavmoLzntI0NCnByZWNpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlY2lzaW9u44Gu5Lit6LqrDQpgYGANCg0KIyMjIFczLjIuNCDmhJ/luqbjgajpganlkIjnjofjga7plqLkv4INCuOAgOS4gOiIrOOBq+OAgSoq5oSf5bqm44Go6YGp5ZCI546H44Gv44OI44Os44O844OJ44Kq44OV44Gu6Zai5L+CKirjgavjgYLjgorjgb7jgZnjgILmhJ/luqbjgpIxMDAl44Gr6L+R44Gl44GR44KL44Gr44Gv44CB77yIRlDjgYzjganjgozjgaDjgZHlopfjgYjjgabjgoLjgYTjgYTjga7jgafvvInjgajjgavjgYvjgY/jgarjgpPjgafjgoLmpJzlh7rjgafjgY3jgovjgojjgYbjgavjgZfjgabjgZfjgb7jgYjjgbDjgojjgYTjgafjgZnjgILlhbfkvZPnmoTjgavjga/jgIFBU1bjga7ntbblr77mlbDjgpLlopfjgoTjgZfjgIHns7vntbHlibLjgorlvZPjgabmmYLjga7liKTlrprln7rmupbjgpLnt6njgoHjgozjgbDjgojjgYTjga7jgafjgZnjgILjgZfjgYvjgZfjgZ3jgozjga9GUOOBruWil+WKoOOCkuioseWuueOBmeOCi+OBk+OBqOOBqOWQjOe+qeOBp+OBmeOBruOBp+OAgee1kOaenOOBqOOBl+OBpumBqeWQiOeOh+OBruS9juS4i+OBq+WvhOS4juOBl+OBvuOBmeOAgg0KDQrjgIDpganlkIjnjofjgpIxMDAl44Gr6L+R44Gl44GR44KL44Gr44Gv44CBRlDjgYzlopfjgYjjgarjgYTjgojjgYbjgavjgIzpmb3mgKfjga7mlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ/jg6bjg4vjg7zjgq/jgarlsZ7jga7mlbDvvInjgI3jgpLntZ7jgozjgbDjgojjgYTjgafjgZnjgILlhbfkvZPnmoTjgavjga9BU1bjga7phY3liJfmlbDjgpLmuJvjgonjgZfjgIHns7vntbHlibLjgorlvZPjgabmmYLjga7liKTlrprln7rmupbjgpLljrPjgZfjgY/jgZnjgozjgbDjgojjgYTjgafjgZnjgILjgZfjgYvjgZfjgZ3jgozjga9UUOOBrua4m+WwkeOCkuioseWuueOBmeOCi+OBk+OBqOOBqOWQjOe+qeOBp+OBmeOBruOBp+OAgee1kOaenOeahOOBq+aEn+W6puOBruS9juS4i+OBq+WvhOS4juOBl+OBvuOBmeOAguOBk+OBrueCueOCkuato+OBl+OBj+iqjeitmOOBl+OBpuOAgTHjgaTjga7oqZXkvqHmjIfmqJnjgaDjgZHjgavjgZPjgaDjgo/jgovjga7jgafjga/jgarjgY/jgIHvvIjmhJ/luqbjgajpganlkIjnjofjga7jgojjgYbjgavvvIkqKuikh+aVsOOBruaMh+aomeOCkueUqOOBhOOBpuWkmumdoueahOOBq+ipleS+oeOBmeOCi+OBk+OBqOOBjOmHjeimgSoq44Gn44GZ44CCDQoNCiMjIyBXMy4yLjUgbmFtZXPlsZ7mgKcNCuOAgG5hbWVz5bGe5oCn44Gv44CB44OZ44Kv44OI44Or44Gq44Gp44Gu5ZCE6KaB57Sg44Gr5ZCN5YmN44KS5LuY5LiO44GZ44KL44GT44Go44Gn44GZ44CC5Lul5LiL44GrVzMuMi4y44KS5YaN5o6y44GX44G+44GZ44GM44CB5b6X44KJ44KM44KLYG9iamDjgajjgYTjgYboq5bnkIblgKTjg5njgq/jg4jjg6vjga/jgIHopoHntKDmlbDjgYxgciBsZW5ndGgob2JqKWDlgIvjgYLjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kb2JqIDwtIGlzLmVsZW1lbnQoZ2VudXNfdHJ1dGgsIGdlbnVzKSAgICAgIyBnZW51c190cnV0aOS4reOBruWQhOimgee0oOOBjGdlbnVz44Gr5ZCr44G+44KM44KL44GL5Yik5a6a44GX44Gf57WQ5p6c44KSb2Jq44Gr5qC857SNDQpvYmogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9iauOBruS4rei6qw0KYGBgDQoNCuOAgOOBk+OBruS4reOBq+OBr+ioiGByIGxlbmd0aChvYmopIC0gc3VtKG9iailg5YCL44GuRkFMU0Xjga7opoHntKDjgYzjgYLjgorjgb7jgZnjgYzjgIHlhbfkvZPnmoTjgarlsZ7jga7lkI3liY3jgpLnn6Xjgovjgavjga/jgIHjgIxGQUxTReOBryhgciB3aGljaCghb2JqKWAp55Wq55uu44Gu6KaB57Sg44Gg44GL44KJYGdlbnVzX3RydXRoYOS4reOBrihgciB3aGljaCghb2JqKWAp55Wq55uu44Gu6KaB57Sg44Go56qB44GN5ZCI44KP44Gb44GmLi4u44CN44Go44GE44Gj44Gf5L2c5qWt44GM5b+F6KaB44Gr44Gq44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmdlbnVzX3RydXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2VudXNfdHJ1dGjjga7kuK3ouqsNCmBgYA0KDQrjgIBuYW1lc+WxnuaAp+OBruS7mOS4juOBr+OAgWBvYmpg44Go44GE44GG44OZ44Kv44OI44Or44Gu5L2V55Wq55uu44Gu6KaB57Sg44GM44Gp44Gu5bGe5ZCN55Sx5p2l44Gq44Gu44GL44GM44Gx44Gj44Go6KaL44Gn44KP44GL44KL44KI44GG44Gr44CB6KaB57Sg44Gr5ZCN5YmN44Go44GE44GG5bGe5oCn44KS5LuY5LiO44GZ44KL5L2c5qWt44Gr44Gq44KK44G+44GZ44CC44Gd44GG44GZ44KL44GT44Go44Gn44CB6KaB57Sg55Wq5Y+35oOF5aCx44KS44Kk44OB44Kk44OB6Kaa44GI44Gq44GP44Gm44KC44KI44GP44Gq44KK44CB6KaB57Sg5ZCN77yI44GT44Gu5aC05ZCI44Gv5bGe44Gu5ZCN5YmN77yJ44Gn5oOF5aCx44KS5oq95Ye644Gn44GN44KL44KI44GG44Gr44Gq44KK44G+44GZ44CC44GT44Gu44GC44Gf44KK44GvYHJlYWQudGFibGVg6Zai5pWw44Gq44Gp44KS55So44GE44Gm44OV44Kh44Kk44Or44KS6Kqt44G/6L6844KA6Zqb44Gr44CBYGhlYWRlcj1UUlVFYOOBqOOBi2Byb3cubmFtZXM9MWDjgpLjgaTjgZHjgovjga7jgajkvLzjgZ/jgojjgYbjgarmgJ3mg7Pjgavjgarjgorjgb7jgZnjgILku6XkuIvjga/jgIFgZ2VudXNfdHJ1dGhg44KSYG9iamDjga5uYW1lc+WxnuaAp+OBqOOBl+OBpuS7mOS4juOBmeOCi+S+i+OBp+OBmeOAguOBk+OBruOCiOOBhuOBquOAgeODmeOCr+ODiOODq+OBq+WvvuOBl+OBpm5hbWVz5bGe5oCn44KS5LuY5LiO44GZ44KL44OG44Kv44OL44OD44Kv44Gv44KI44GP5L2/44KP44KM44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCm5hbWVzKG9iaikgPC0gZ2VudXNfdHJ1dGggICAgICAgICAgICAgICAgICMgb2Jq44GrZ2VudXNfdHJ1dGjjgpJuYW1lc+WxnuaAp+OBqOOBl+OBpuS7mOS4jg0Kb2JqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmrjga7kuK3ouqsNCmBgYA0KDQrjgIDjgZPjga7jgojjgYbjgarkuIDnm67jgafliIbjgYvjgovmg4XloLHjgYzlvpfjgonjgozjgovjgajjgIHkvovjgYjjgbDku6XkuIvjga7jgojjgYbjgarmhJ/jgZjjgafjgIFkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44GuR2VudXPliJfjgavjgIEiQWN0aW5vbXljZXMi44GM5paH5a2X5YiX5qSc57Si44Gn5byV44Gj5o6b44GL44Gj44Gm44GP44KL44Gn44GC44KN44GG6KGM55Wq5Y+344Gu55uu5a6J44GM5b6X44KJ44KM44Gf44KK44CBIkJhY2lsbHVzIuOBjOacrOW9k+OBq+aWh+Wtl+WIl+aknOe0ouOBp+W8leOBo+aOm+OBi+OBo+OBpuOBk+OBquOBhO+8iGludGVnZXIoMCnjgajjgYTjgYbntZDmnpzjgavnm7jlvZPvvInjgZPjgajjga7norroqo3jgYzlj6/og73jgavjgarjgorjgb7jgZnjgILoqbHjga7mnKznrYvjgYvjgonjga/jgZ3jgozjgabjgYTjgb7jgZnjgYzjgIHjgZPjga7jgojjgYbjgasqKuW+l+OCieOCjOOBn+e1kOaenOOBjOacrOW9k+OBq+ato+OBl+OBhOOBi+OCkumDveW6puaknOiovOOBmeOCi+Wnv+WLouOBr+OAgeODn+OCueOCkumYsuOBkOOBqOOBhOOBhuaEj+WRs+OBp+mdnuW4uOOBq+mHjeimgSoq44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmdyZXAocGF0dGVybiA9ICJBY3Rpbm9teWNlcyIsIHggPSBnZW51cykgICMgZ2VudXPkuK3jga4iQWN0aW5vbXljZXMi44Gu44Kk44Oz44OH44OD44Kv44K55oOF5aCxDQpncmVwKHBhdHRlcm4gPSAiQmFjaWxsdXMiLCB4ID0gZ2VudXMpICAgICAjIGdlbnVz5Lit44GuIkJhY2lsbHVzIuOBruOCpOODs+ODh+ODg+OCr+OCueaDheWgsQ0KYGBgDQoNCiMjIyBXMy4yLjYg5oSf5bqm77yI56iu44Os44OZ44Or77yJDQrjgIDnqK7jg6zjg5njg6vjga7op6PmnpDjgoLlkIzmp5jjgafjgYLjgorjgIHoqIhgciBsZW5ndGgoc3BlY2llc190cnV0aClg56iu44Gu44GG44Gh44CB44Gp44KM44KS5q2j44GX44GP5qSc5Ye644Gn44GN44Gm44Gp44KM44KS5qSc5Ye644Gn44GN44Gq44GL44Gj44Gf44GL44KS6Kq/44G544KL44GT44Go44GM44Gn44GN44G+44GZ44CCYHNwZWNpZXNfdHJ1dGhg44Gv44CB56iu44Gu5q2j6Kej5oOF5aCx44Gr55u45b2T44GZ44KL5paH5a2X5YiX44OZ44Kv44OI44Or44Gn44GC44KK44CB6KaB57Sg5pWw44GvYHIgbGVuZ3RoKHNwZWNpZXNfdHJ1dGgpYOOBp+OBmeOAgmBzcGVjaWVzYOOBr+OAgeeoruOBruS6iOa4rOe1kOaenOOBq+ebuOW9k+OBmeOCi+aWh+Wtl+WIl+ODmeOCr+ODiOODq+OBp+OBguOCiuOAgeimgee0oOaVsOOBr2ByIGxlbmd0aChzcGVjaWVzKWDjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kb2JqIDwtIGlzLmVsZW1lbnQoc3BlY2llc190cnV0aCwgc3BlY2llcykgIyBzcGVjaWVzX3RydXRo5Lit44Gu5ZCE6KaB57Sg44GMc3BlY2llc+OBq+WQq+OBvuOCjOOCi+OBi+WIpOWumuOBl+OBn+e1kOaenOOCkm9iauOBq+agvOe0jQ0Kb2JqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmrjga7kuK3ouqsNCnN1bShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2Jq5Lit44GuVFJVReOBruimgee0oOaVsA0KYGBgDQrjgIDjgZPjga7mmYLngrnjgafjgIHoqIhgciBsZW5ndGgoc3BlY2llc190cnV0aClg56iu44Gu44GG44GhYHIgc3VtKG9iailg56iu44KS5q2j44GX44GP5qSc5Ye644Gn44GN44Gf44Gu44Gn77yIVFAgPSBgciBzdW0ob2JqKWDvvInjgIEqKueoruODrOODmeODq+OBruaEn+W6puOBr2ByIHN1bShvYmopYCAvIGByIGxlbmd0aChzcGVjaWVzX3RydXRoKWAgPSBgciBzdW0ob2JqKS9sZW5ndGgoc3BlY2llc190cnV0aClgKirjgavjgarjgorjgb7jgZnjgILmhJ/luqbjga9UUCAvIChUUCArIEZOKeOBqOWumue+qeOBp+OBjeOAgVRQID0gYHIgc3VtKG9iailg44CBRk4gPSBgciBsZW5ndGgoc3BlY2llc190cnV0aCkgLSBzdW0ob2JqKWDjgavjgarjgorjgb7jgZnjgILjgarjgYrjgIHliIbmr43jga4oVFAgKyBGTinjga/jgIHjgIzpmb3mgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3mlbDvvIjnnJ/jga7pmb3mgKfmlbDvvInjgI3jgafjgZnjga7jgafjgIHnqK7jga7mraPop6Pmg4XloLHjgavnm7jlvZPjgZnjgovjgIzjg6bjg4vjg7zjgq/jgarnqK7jga7mlbDjgI3jgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KVFAgPC0gc3VtKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmrkuK3jga5UUlVF44Gu6KaB57Sg5pWw44KSVFDjgavmoLzntI0NCkZOIDwtIGxlbmd0aChzcGVjaWVzX3RydXRoKSAtIFRQICAgICAgICAgICMgc3BlY2llc190cnV0aOOBruimgee0oOaVsCAtIFRQ44KSRk7jgavmoLzntI0NCnNlbnNpdGl2aXR5IDwtIFRQIC8gKFRQICsgRk4pICAgICAgICAgICAgICMg5oSf5bqm44KS6KiI566X44GX44Gf57WQ5p6c44KSc2Vuc2l0aXZpdHnjgavmoLzntI0NCnNlbnNpdGl2aXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2Vuc2l0aXZpdHnjga7kuK3ouqsNCmBgYA0KDQojIyMgVzMuMi43IOmBqeWQiOeOh++8iOeoruODrOODmeODq++8iQ0K44CA6Zm95oCn44GvZGFkYTLjgafmpJzlh7rjgZXjgozjgZ/vvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ/vvInjg6bjg4vjg7zjgq/jgarnqK7jga7jgZPjgajjgpLmjIfjgZfjgb7jgZnjga7jgafjgIHjgIzpmb3mgKfjga7mlbDjgI3jga/jgIxkYWRhMuOBp+aknOWHuuOBleOCjOOBn++8iOezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBn++8ieODpuODi+ODvOOCr+OBqueoruOBruaVsOOAjeOAgeOBpOOBvuOCimByIGxlbmd0aCh0YWJsZShzcGVjaWVzKSlg5YCL44Gr44Gq44KK44G+44GZ44CC44GT44GuYHIgbGVuZ3RoKHRhYmxlKHNwZWNpZXMpKWDjga/jgIFUUOOBrmByIFRQYOWAi+OBqOOBneOCjOS7peWklu+8iOacrOW9k+OBr+aknOWHuuOBleOCjOOCi+OBueOBjeOBp+OBr+OBquOBhOOBq+OCguOBi+OBi+OCj+OCieOBmuOAgeaknOWHuuOBl+OBpuOBl+OBvuOBo+OBn+OCguOBru+8ieOBrmByIGxlbmd0aCh0YWJsZShzcGVjaWVzKSkgLSBUUGDlgIvvvIjjgaTjgb7jgopGUCA9IGByIGxlbmd0aCh0YWJsZShzcGVjaWVzKSkgLSBUUGDvvInjgavliIblibLlj6/og73jgafjgZnjgILjgZPjgZPjgb7jgafjgafjgIFUUCAvIChUUCArIEZQKeOBqOWumue+qeOBleOCjOOCi+mBqeWQiOeOh++8iFByZWNpc2lvbu+8ieOCkueul+WHuuOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgioq56iu44Os44OZ44Or44Gu6YGp5ZCI546H44Gv44CBYHIgVFBgIC8gKGByIFRQYCArIGByIGxlbmd0aCh0YWJsZShzcGVjaWVzKSkgLSBUUGApID0gYHIgVFAgLyBsZW5ndGgodGFibGUoc3BlY2llcykpYCoq44Gr44Gq44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCkZQIDwtIGxlbmd0aCh0YWJsZShzcGVjaWVzKSkgLSBUUCAgICAgICAgICMgc3BlY2llc+OBruODpuODi+ODvOOCr+OBquimgee0oOaVsCAtIFRQ44KSRlDjgavmoLzntI0NCnByZWNpc2lvbiA8LSBUUCAvIChUUCArIEZQKSAgICAgICAgICAgICAgICMg6YGp5ZCI546H44KS6KiI566X44GX44Gf57WQ5p6c44KScHJlY2lzaW9u44Gr5qC857SNDQpwcmVjaXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZWNpc2lvbuOBruS4rei6qw0KYGBgDQoNCiMjIyBXMy4yLjgg44G+44Go44KB44Gm5a6f6KGMDQrjgIBXMy4y44Gu44K544Kv44Oq44OX44OI44KS5Lul5LiL44Gr44G+44Go44KB44G+44GZ44CC44Gf44Gg44GX44CB5bGe44Os44OZ44Or44Gu5oSf5bqm44Go56iu44Os44OZ44Or44Gu5oSf5bqm44Gq44Gp44KS5Yy65Yil44GZ44KL5b+F6KaB44GM44GC44KL44Gu44Gn44CB5pyA57WC55qE44Gq44Kq44OW44K444Kn44Kv44OI5ZCN44Gv5aSJ44GI44Gm44GE44G+44GZ44CC44GT44KM44KS5a6f6KGM44GZ44KL44Gf44KB44Gr5b+F6KaB44GqNOOBpOOBruOCquODluOCuOOCp+OCr+ODiO+8iGBnZW51c190cnV0aGAsIGBnZW51c2AsIGBzcGVjaWVzX3RydXRoYCwgYW5kIGBzcGVjaWVzYO+8ieOBr+OAgVcyLjPjgpLlrp/ooYzjgZnjgozjgbDlvpfjgonjgozjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KIyDlsZ7jg6zjg5njg6vjga7mhJ/luqYNCm9iaiA8LSBpcy5lbGVtZW50KGdlbnVzX3RydXRoLCBnZW51cykgICAgICMgZ2VudXNfdHJ1dGjkuK3jga7lkITopoHntKDjgYxnZW51c+OBq+WQq+OBvuOCjOOCi+OBi+WIpOWumuOBl+OBn+e1kOaenOOCkm9iauOBq+agvOe0jQ0KVFAgPC0gc3VtKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmrkuK3jga5UUlVF44Gu6KaB57Sg5pWw44KSVFDjgavmoLzntI0NCkZOIDwtIGxlbmd0aChnZW51c190cnV0aCkgLSBUUCAgICAgICAgICAgICMgZ2VudXNfdHJ1dGjjga7opoHntKDmlbAgLSBUUOOCkkZO44Gr5qC857SNDQpzZW5zaXRpdml0eSA8LSBUUCAvIChUUCArIEZOKSAgICAgICAgICAgICAjIOaEn+W6puOCkuioiOeul+OBl+OBn+e1kOaenOOCknNlbnNpdGl2aXR544Gr5qC857SNDQojIOWxnuODrOODmeODq+OBrumBqeWQiOeOhw0KRlAgPC0gbGVuZ3RoKHRhYmxlKGdlbnVzKSkgLSBUUCAgICAgICAgICAgIyBnZW51c+OBruODpuODi+ODvOOCr+OBquimgee0oOaVsCAtIFRQ44KSRlDjgavmoLzntI0NCnByZWNpc2lvbiA8LSBUUCAvIChUUCArIEZQKSAgICAgICAgICAgICAgICMg6YGp5ZCI546H44KS6KiI566X44GX44Gf57WQ5p6c44KScHJlY2lzaW9u44Gr5qC857SNDQojIOOCquODluOCuOOCp+OCr+ODiOWQjeOBruWkieabtA0KVFBfZ2VudXMgPC0gVFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUUOOCklRQX2dlbnVz44Gr44Kz44OU44O8DQpGTl9nZW51cyA8LSBGTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZO44KSRk5fZ2VudXPjgavjgrPjg5Tjg7wNCkZQX2dlbnVzIDwtIEZQICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRlDjgpJGUF9nZW51c+OBq+OCs+ODlOODvA0Kc2Vuc2l0aXZpdHlfZ2VudXMgPC0gc2Vuc2l0aXZpdHkgICAgICAgICAgIyBzZW5zaXRpdml0eeOCknNlbnNpdGl2aXR5X2dlbnVz44Gr44Kz44OU44O8DQpwcmVjaXNpb25fZ2VudXMgPC0gcHJlY2lzaW9uICAgICAgICAgICAgICAjIHByZWNpc2lvbuOCknByZWNpc2lvbl9nZW51c+OBq+OCs+ODlOODvA0KDQojIOeoruODrOODmeODq+OBruaEn+W6pg0Kb2JqIDwtIGlzLmVsZW1lbnQoc3BlY2llc190cnV0aCwgc3BlY2llcykgIyBzcGVjaWVzX3RydXRo5Lit44Gu5ZCE6KaB57Sg44GMc3BlY2llc+OBq+WQq+OBvuOCjOOCi+OBi+WIpOWumuOBl+OBn+e1kOaenOOCkm9iauOBq+agvOe0jQ0KVFAgPC0gc3VtKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmrkuK3jga5UUlVF44Gu6KaB57Sg5pWw44KSVFDjgavmoLzntI0NCkZOIDwtIGxlbmd0aChzcGVjaWVzX3RydXRoKSAtIFRQICAgICAgICAgICMgc3BlY2llc190cnV0aOOBruimgee0oOaVsCAtIFRQ44KSRk7jgavmoLzntI0NCnNlbnNpdGl2aXR5IDwtIFRQIC8gKFRQICsgRk4pICAgICAgICAgICAgICMg5oSf5bqm44KS6KiI566X44GX44Gf57WQ5p6c44KSc2Vuc2l0aXZpdHnjgavmoLzntI0NCiMg56iu44Os44OZ44Or44Gu6YGp5ZCI546HDQpGUCA8LSBsZW5ndGgodGFibGUoc3BlY2llcykpIC0gVFAgICAgICAgICAjIHNwZWNpZXPjga7jg6bjg4vjg7zjgq/jgaropoHntKDmlbAgLSBUUOOCkkZQ44Gr5qC857SNDQpwcmVjaXNpb24gPC0gVFAgLyAoVFAgKyBGUCkgICAgICAgICAgICAgICAjIOmBqeWQiOeOh+OCkuioiOeul+OBl+OBn+e1kOaenOOCknByZWNpc2lvbuOBq+agvOe0jQ0KIyDjgqrjg5bjgrjjgqfjgq/jg4jlkI3jga7lpInmm7QNClRQX3NwZWNpZXMgPC0gVFAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVFDjgpJUUF9zcGVjaWVz44Gr44Kz44OU44O8DQpGTl9zcGVjaWVzIDwtIEZOICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZO44KSRk5fc3BlY2llc+OBq+OCs+ODlOODvA0KRlBfc3BlY2llcyA8LSBGUCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGUOOCkkZQX3NwZWNpZXPjgavjgrPjg5Tjg7wNCnNlbnNpdGl2aXR5X3NwZWNpZXMgPC0gc2Vuc2l0aXZpdHkgICAgICAgICMgc2Vuc2l0aXZpdHnjgpJzZW5zaXRpdml0eV9zcGVjaWVz44Gr44Kz44OU44O8DQpwcmVjaXNpb25fc3BlY2llcyA8LSBwcmVjaXNpb24gICAgICAgICAgICAjIHByZWNpc2lvbuOCknByZWNpc2lvbl9zcGVjaWVz44Gr44Kz44OU44O8DQpgYGANCg0KIyMjIFczLjIuOSBXMy4y44Gu44G+44Go44KBDQrjgIDjgZPjgZPjgafjga/jgIEqKumHjeikh+OBquOBl+OBruaAp+iDveipleS+oSoq44Go44GX44Gm44CB5bGe44Os44OZ44Or44Gu5oSf5bqm44Go6YGp5ZCI546H44CB56iu44Os44OZ44Or44Gu5oSf5bqm44Go6YGp5ZCI546H44KS566X5Ye644GX44G+44GX44Gf44CC44GT44GT44Gn44Gu44CM6YeN6KSH44Gq44GX44CN44Gv44CM44Om44OL44O844Kv44Gq44CN44Go5ZCM576p44Gn44GZ44CCZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vvvIhbb3V0cHV0X0pTTEFCMjQudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0Ke+8ieOBp+OBr+OAgUFTVuOBrumFjeWIl+OBjOmBleOBo+OBpuOBhOOBpuOCguWQjOOBmOWxnuOChOeoruOBq+WJsuOCiuW9k+OBpuOCieOCjOOCi+OBk+OBqOOBjOOBguOCiuOBvuOBmeOAguOBneOCjOOCieOCkioq6YeN6KSH44Kr44Km44Oz44OI44Gb44Ga44Gr44CB44Om44OL44O844Kv44Gq5bGe44KE56iu44Gu5pWw44KS6Kq/44G544Gf5LiK44Gn5oCn6IO96KmV5L6hKirjgpLooYzjgaPjgabjgYTjgb7jgZnjgILmgKfog73oqZXkvqHmjIfmqJnjgpLnrpflh7rjgZnjgovpmpvjgavkvZXjgpLjganjga7jgojjgYbjgavlrprnvqnjgZfjgZ/jgYvjgpLmraPjgZfjgY/miormj6HjgZfjgabjgYrjgY/lv4XopoHjgYzjgYLjgorjgb7jgZnjgIINCg0KLSDlsZ7jg6zjg5njg6vvvIjph43opIfjgarjgZfvvIkNCiAgLSDkuojmuKzntZDmnpzjga7pmb3mgKfmlbDvvIhkYWRhMuWun+ihjOe1kOaenOOBqOOBl+OBpuW+l+OCieOCjOOBn+ODpuODi+ODvOOCr+OBquWxnuOBruaVsO+8ie+8mmByIGxlbmd0aCh0YWJsZShnZW51cykpYA0KICAtIOecn+OBrumZveaAp+aVsO+8iOaXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeS4reOBruWxnuOBruaVsO+8ie+8mmByIGxlbmd0aChnZW51c190cnV0aClgDQogICAgLSDpmb3mgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3lsZ7jga7jgYbjgaHjgIEqKuato+OBl+OBj+mZveaApyoq44Go5Yik5a6a44Gn44GN44Gf5bGe44Gu5pWw77yIKipUcnVlIFBvc2l0aXZlKio7IFRQ77yJ77yaYHIgVFBfZ2VudXNgDQogICAgLSDpmb3mgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3lsZ7jga7jgYbjgaHjgIEqKumWk+mBleOBo+OBpumZsOaApyoq44Go5Yik5a6a44GX44Gf5bGe44Gu5pWw77yIKipGYWxzZSBOZWdhdGl2ZSoqOyBGTu+8ie+8mmByIEZOX2dlbnVzYA0KICAtIOecn+OBrumZsOaAp+aVsO+8iOS7iuWbnuino+aekOOBl+OBn+aXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeS7peWkluOBruWxnuOBruaVsO+8ie+8muS4jeaYju+8iOWkmuaVsO+8iQ0KICAgIC0g6Zmw5oCn44Go5Yik5a6a44GV44KM44KL44G544GN5bGe44Gu44GG44Gh44CBKirmraPjgZfjgY/pmbDmgKcqKuOBqOWIpOWumuOBp+OBjeOBn+WxnuOBruaVsO+8iCoqVHJ1ZSAgICAgTmVnYXRpdmUqKjsgVE7vvInvvJrkuI3mmI7vvIjlpJrmlbDvvIkNCiAgICAtIOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeWxnuOBruOBhuOBoeOAgSoq6ZaT6YGV44Gj44Gm6Zm95oCnKirjgajliKTlrprjgZfjgZ/lsZ7jga7mlbDvvIgqKkZhbHNlIFBvc2l0aXZlKio7IEZQ77yJ77yaYHIgRlBfZ2VudXNgICg9IGByIGxlbmd0aCh0YWJsZShnZW51cykpYCAtIGByIFRQX2dlbnVzYCkNCiAgLSDmhJ/luqbvvIhzZW5zaXRpdml0ee+8ie+8mlRQIC8gKFRQICsgRk4pID0gYHIgVFBfZ2VudXNgIC8gKGByIFRQX2dlbnVzYCArIGByIEZOX2dlbnVzYCkgPSBgciBzZW5zaXRpdml0eV9nZW51c2ANCiAgLSDpganlkIjnjofvvIhwcmVjaXNpb27vvInvvJpUUCAvIChUUCArIEZQKSA9IGByIFRQX2dlbnVzYCAvIChgciBUUF9nZW51c2AgKyBgciBGUF9nZW51c2ApID0gYHIgcHJlY2lzaW9uX2dlbnVzYA0KDQotIOeoruODrOODmeODq++8iOmHjeikh+OBquOBl++8iQ0KICAtIOS6iOa4rOe1kOaenOOBrumZveaAp+aVsO+8iGRhZGEy5a6f6KGM57WQ5p6c44Go44GX44Gm5b6X44KJ44KM44Gf44Om44OL44O844Kv44Gq56iu44Gu5pWw77yJ77yaYHIgbGVuZ3RoKHRhYmxlKHNwZWNpZXMpKWANCiAgLSDnnJ/jga7pmb3mgKfmlbDvvIjml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnkuK3jga7nqK7jga7mlbDvvInvvJpgciBsZW5ndGgoc3BlY2llc190cnV0aClgDQogICAgLSDpmb3mgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3nqK7jga7jgYbjgaHjgIEqKuato+OBl+OBj+mZveaApyoq44Go5Yik5a6a44Gn44GN44Gf56iu44Gu5pWw77yIKipUcnVlIFBvc2l0aXZlKio7IFRQ77yJ77yaYHIgVFBfc3BlY2llc2ANCiAgICAtIOmZveaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgSoq6ZaT6YGV44Gj44Gm6Zmw5oCnKirjgajliKTlrprjgZfjgZ/nqK7jga7mlbDvvIgqKkZhbHNlIE5lZ2F0aXZlKio7IEZO77yJ77yaYHIgRk5fc3BlY2llc2ANCiAgLSDnnJ/jga7pmbDmgKfmlbDvvIjku4rlm57op6PmnpDjgZfjgZ/ml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnku6XlpJbjga7nqK7jga7mlbDvvInvvJrkuI3mmI7vvIjlpJrmlbDvvIkNCiAgICAtIOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgSoq5q2j44GX44GP6Zmw5oCnKirjgajliKTlrprjgafjgY3jgZ/nqK7jga7mlbDvvIgqKlRydWUgTmVnYXRpdmUqKjsgVE7vvInvvJrkuI3mmI7vvIjlpJrmlbDvvIkNCiAgICAtIOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgSoq6ZaT6YGV44Gj44Gm6Zm95oCnKirjgajliKTlrprjgZfjgZ/nqK7jga7mlbDvvIgqKkZhbHNlIFBvc2l0aXZlKio7IEZQ77yJ77yaYHIgRlBfc3BlY2llc2AgKD0gYHIgbGVuZ3RoKHRhYmxlKHNwZWNpZXMpKWAgLSBgciBUUF9zcGVjaWVzYCkNCiAgLSDmhJ/luqbvvIhzZW5zaXRpdml0ee+8ie+8mlRQIC8gKFRQICsgRk4pID0gYHIgVFBfc3BlY2llc2AgLyAoYHIgVFBfc3BlY2llc2AgKyBgciBGTl9nZW51c2ApID0gYHIgc2Vuc2l0aXZpdHlfc3BlY2llc2ANCiAgLSDpganlkIjnjofvvIhwcmVjaXNpb27vvInvvJpUUCAvIChUUCArIEZQKSA9IGByIFRQX3NwZWNpZXNgIC8gKGByIFRQX3NwZWNpZXNgICsgYHIgRlBfc3BlY2llc2ApID0gYHIgcHJlY2lzaW9uX3NwZWNpZXNgDQoNCiMjIFczLjMg5oCn6IO96KmV5L6h77yI6YeN6KSH44GC44KK77yJDQrjgIBXMy4y44Gn44Gv44CBZGFkYTLlrp/ooYzntZDmnpzjgajjgZfjgablvpfjgonjgozjgZ81ODDlgIvjga5BU1bphY3liJfjga7jgYbjgaHjgIFgciBsZW5ndGgodGFibGUoZ2VudXMpKWDlgIvjga7ns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ/jg6bjg4vjg7zjgq/jgarlsZ7jga7mlbDjgahgciBsZW5ndGgodGFibGUoc3BlY2llcykpYOWAi+OBruezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBn+ODpuODi+ODvOOCr+OBqueoruOBruaVsOOCkuODmeODvOOCueOBqOOBl+OBpuaAp+iDveipleS+oeOCkuihjOOBhOOBvuOBl+OBn+OAguOBk+OBk+OBp+OBr+OAgWByIGxlbmd0aChuYS5vbWl0KGdlbnVzKSlg5YCL44Gu57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44Gf77yI6YeN6KSH44KS5ZCr44KA77yJ5bGe44Gu5pWw44GoYHIgbGVuZ3RoKG5hLm9taXQoc3BlY2llcykpYOWAi+OBruezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBn++8iOmHjeikh+OCkuWQq+OCgO+8ieeoruOBruaVsOOCkuODmeODvOOCueOBqOOBl+OBpuaAp+iDveipleS+oeOCkuihjOOBhOOBvuOBmeOAguOBquOBiuOAgeOBk+OBk+OBp+OBr+aEn+W6puOBr+eul+WHuuOBm+OBmuOAgemBqeWQiOeOh+OBruOBv+eul+WHuuOBl+OBvuOBmeOAgueQhueUseOBr+OAgemBqeWQiOeOh+OBr1RQIC8gKFRQICsgRlApIOOBqOOBl+OBpuioiOeul+OBleOCjOOBvuOBmeOBjOOAgeOBneOBruWfuuekjuaDheWgseOBp+OBguOCi1RQ44GoRlDjga/jgajjgoLjgavph43opIfjgYLjgorjgafnrYnkvqHjgavjgqvjgqbjg7Pjg4jlj6/og73jgaDjgYvjgonjgafjgZnjgILjgZ3jga7kuIDmlrnjgafjgIHmhJ/luqbjga9UUCAvIChUUCArIEZOKSDjgajjgZfjgaboqIjnrpfjgZXjgozjgb7jgZnjgYzjgIFGTuOBr+mHjeikh+OBruacieeEoeOBq+OBi+OBi+OCj+OCieOBmuWxnuODrOODmeODq+OBp+OBr+W4uOOBqzTjgIHnqK7jg6zjg5njg6vjgafjga/luLjjgasxNOOBq+OBquOCiu+8iFczLjIuOe+8ieOAgeWOn+eQhueahOOBq+mHjeikh++8iOeVsOOBquOCi+ikh+aVsOOBrkFTVumFjeWIl+OBjOWQjOS4gOOBruWxnuOBq+WJsuOCiuW9k+OBpuOCieOCjOOBhuOCi+OBk+OBqO+8ieOBruW9semfv+OCkuiAg+aFruOBp+OBjeOBquOBhOOBi+OCieOBp+OBmeOAguWFpeWKm+OBqOOBl+OBpueUqOOBhOOCi+aDheWgseOBr1czLjLjgajlkIzjgZjjgafjgZnjgYzjgIHlv7Xjga7jgZ/jgoHku6XkuIvjgafjgoLlho3mjrLjgZfjgb7jgZnjgIINCg0KLSBgZ2VudXNfdHJ1dGhg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirlsZ7jga7mraPop6Pmg4XloLEqKuOBq+ebuOW9kw0KICAtIOesrDIz5Zue44Gu6KGoMeOBq+ebuOW9k+OBmeOCi+iPjOagquaDheWgseODleOCoeOCpOODq++8iFtKU0xBQjIzX3RhYmxlMS50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQjIzX3RhYmxlMS50eHQp77yJ44GuT3JnYW5pc23liJfjga7mg4XloLHjgIIx55Wq5bem5YG044Gu5Y2K6KeS44K544Oa44O844K55omL5YmN44G+44Gn44Gu5Y2Y6Kqe44CCDQogIC0g5pys5p2l5qSc5Ye644GX44Gf44GE5pei55+l5b6u55Sf54mp576k6ZuGW0hNLTI4MF0oaHR0cHM6Ly93d3cuYmVpcmVzb3VyY2VzLm9yZy9DYXRhbG9nL290aGVyUHJvZHVjdHMvSE0tMjgwLmFzcHgp5Lit44Gu5bGe5ZCN44Gr55u45b2TDQogIC0gYGxlbmd0aChnZW51c190cnV0aClg77ya6KaB57Sg5pWw77yI44Om44OL44O844Kv44Gq5bGe44Gu5pWw77yJ44GvYHIgbGVuZ3RoKGdlbnVzX3RydXRoKWANCg0KLSBgc3BlY2llc190cnV0aGDvvJrmloflrZfliJfjg5njgq/jg4jjg6sNCiAgLSAqKueoruOBruato+ino+aDheWgsSoq44Gr55u45b2TDQogIC0g56ysMjPlm57jga7ooagx44Gr55u45b2T44GZ44KL6I+M5qCq5oOF5aCx44OV44Kh44Kk44Or77yIW0pTTEFCMjNfdGFibGUxLnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCMjNfdGFibGUxLnR4dCnvvInjga5PcmdhbmlzbeWIl+OBruaDheWgseOAguacgOWIneOBruWNiuinkuOCueODmuODvOOCueOBi+OCieOCs+ODs+ODnuaJi+WJjeOBvuOBp+OBruWNmOiqnuOAgg0KICAtIGBsZW5ndGgoc3BlY2llc190cnV0aClg77ya6KaB57Sg5pWw77yI44Om44OL44O844Kv44Gq56iu44Gu5pWw77yJ44GvYHIgbGVuZ3RoKHNwZWNpZXNfdHJ1dGgpYA0KDQotIGBnZW51c2DvvJrmloflrZfliJfjg5njgq/jg4jjg6sNCiAgLSAqKuWxnuOBruS6iOa4rOe1kOaenCoq44Gr55u45b2TDQogIC0gZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vvvIhbb3V0cHV0X0pTTEFCMjQudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0Ke+8ieOBrkdlbnVz5YiX44Gu5oOF5aCxDQogIC0gYGxlbmd0aChnZW51cylg77ya6KaB57Sg5pWw77yIQVNW44Gu57eP5pWw77yJ44GvYHIgbGVuZ3RoKGdlbnVzKWANCiAgLSBgbGVuZ3RoKG5hLm9taXQoZ2VudXMpKWDvvJoiTkEi44KS6Zmk44GP6KaB57Sg5pWw77yI57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44GfQVNW5pWw77yJ44GvYHIgbGVuZ3RoKG5hLm9taXQoZ2VudXMpKWANCiAgLSBgbGVuZ3RoKHRhYmxlKGdlbnVzKSlg77yaIk5BIuOCkumZpOOBj+ODpuODi+ODvOOCr+OBquimgee0oOaVsO+8iOezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBn+ODpuODi+ODvOOCr+OBquWxnuOBruaVsO+8ieOBr2ByIGxlbmd0aCh0YWJsZShnZW51cykpYA0KDQotIGBzcGVjaWVzYO+8muaWh+Wtl+WIl+ODmeOCr+ODiOODqw0KICAtICoq56iu44Gu5LqI5ris57WQ5p6cKirjgavnm7jlvZMNCiAgLSBkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44GuU3BlY2llc+WIl+OBruaDheWgsQ0KICAtIGBsZW5ndGgoc3BlY2llcylg77ya6KaB57Sg5pWw77yIQVNW44Gu57eP5pWw77yJ44GvYHIgbGVuZ3RoKHNwZWNpZXMpYA0KICAtIGBsZW5ndGgobmEub21pdChzcGVjaWVzKSlg77yaIk5BIuOCkumZpOOBj+imgee0oOaVsO+8iOezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBn0FTVuaVsO+8ieOBr2ByIGxlbmd0aChuYS5vbWl0KHNwZWNpZXMpKWANCiAgLSBgbGVuZ3RoKHRhYmxlKHNwZWNpZXMpKWDvvJoiTkEi44KS6Zmk44GP44Om44OL44O844Kv44Gq6KaB57Sg5pWw77yI57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44Gf44Om44OL44O844Kv44Gq56iu44Gu5pWw77yJ44GvYHIgbGVuZ3RoKHRhYmxlKHNwZWNpZXMpKWANCg0KIyMjIFczLjMuMSDpganlkIjnjofvvIjlsZ7jg6zjg5njg6vvvIkNCuOAgOmHjeikh+OBguOCiuOBruWgtOWQiOOBr+OAgeS7peS4i+OBruOCiOOBhuOBq+abuOOBkeOBsOWxnuODrOODmeODq+OBrumBqeWQiOeOh+OBruWApOOBvuOBp+OCkuS4gOawl+OBq+W+l+OCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpvYmogPC0gaXMuZWxlbWVudChnZW51cywgZ2VudXNfdHJ1dGgpICAgICAjIGdlbnVz5Lit44Gu5ZCE6KaB57Sg44GMZ2VudXNfdHJ1dGjjgavlkKvjgb7jgozjgovjgYvliKTlrprjgZfjgZ/ntZDmnpzjgpJvYmrjgavmoLzntI0NClRQIDwtIHN1bShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2Jq5Lit44GuVFJVReOBruimgee0oOaVsOOCklRQ44Gr5qC857SNDQpGUCA8LSBsZW5ndGgobmEub21pdChnZW51cykpIC0gVFAgICAgICAgICAjIGdlbnVz44GuTkHjgpLpmaTjgY/opoHntKDmlbAgLSBUUOOCkkZQ44Gr5qC857SNDQpwcmVjaXNpb24gPC0gVFAgLyAoVFAgKyBGUCkgICAgICAgICAgICAgICAjIOmBqeWQiOeOh+OCkuioiOeul+OBl+OBn+e1kOaenOOCknByZWNpc2lvbuOBq+agvOe0jQ0KcHJlY2lzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmVjaXNpb27jga7kuK3ouqsNCmBgYA0K44CAVzMuMi4z44Go44Gu5Li744Gq6YGV44GE44Gv44CBYGlzLmVsZW1lbnRg6Zai5pWw44Gu5YWl5Yqb44Go44GX44Gm5LiO44GI44Gm44GE44KLMuOBpOOBruODmeOCr+ODiOODq+OBrumghuW6j+OBp+OBmeOAguOBk+OBk+OBp+OBr+OAgWByIGxlbmd0aChnZW51cylg5YCL44Gu6KaB57Sg44GL44KJ44Gq44KLYGdlbnVzYOS4reOBruimgee0oDHjgaQx44Gk44Gr5a++44GX44Gm44CB44Gd44KM44GMYHIgbGVuZ3RoKGdlbnVzX3RydXRoKWDlgIvjga7opoHntKDjgYvjgonjgarjgotgZ2VudXNfdHJ1dGhg5Lit44Gr5a2Y5Zyo44GZ44KL44GL44Gp44GG44GL44KSVFJVRSBvciBGQUxTReOBp+WIpOWumuOBl+OBpuOBhOOBvuOBmeOAguW+k+OBo+OBpuOAgWBvYmpg44Gu6KaB57Sg5pWw44GvYHIgbGVuZ3RoKG9iailg5YCL44Gr44Gq44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmxlbmd0aChvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2Jq44Gu6KaB57Sg5pWwDQpgYGANCuOAgGBvYmpg44Gu5Lit6Lqr44KS6KaL44KL44Go44CB5YWo5L2T44Go44GX44Gm44GvRkFMU0XjgYzjgbvjgajjgpPjganjgafjgIFUUlVF44Gv5pyA5Yid44Gu44G744GG44Gr5YGP44Gj44Gm5a2Y5Zyo44GX44Gm44GE44KL44GT44Go44GM44KP44GL44KK44G+44GZ44CC44GT44Gu55CG55Sx44Gv44CBZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vvvIhbb3V0cHV0X0pTTEFCMjQudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0Ke+8ieOCkuecuuOCgeOCi+OBqOOCiOOBj+OCj+OBi+OCi+OBqOaAneOBhOOBvuOBmeOAguOBpOOBvuOCiuOAgWBnZW51c2DkuK3jga7opoHntKDvvIhBU1bvvInjga7kuKbjgbPjga/jgIHoqIgxMuOCteODs+ODl+ODq+OBruWHuuePvumgu+W6puOBrue3j+WSjOOBjOmrmOOBhOmghuOBq+OBquOBo+OBpuOBhOOCi+OBqOOBhOOBhuOBk+OBqOOBp+OBmeOAguOBqeOBruOCteODs+ODl+ODq+OBp+OCguaknOWHuuOBleOCjOOCi+OCiOOBhuOBqkFTVumFjeWIl+OBr+OAgeacrOadpeaknOWHuuOBl+OBn+OBhOaXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeOBp+OBguOCi+eiuueOh+OBjOmrmOOBhOOBqOOBhOOBhuebtOaEn+OBqOOCguOCiOOBj+S4gOiHtOOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpvYmogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9iauOBruS4rei6qw0KYGBgDQrjgIDjgZPjga7kuK3jga5UUlVF44Gu6KaB57Sg5pWw44GM44CM6Zm95oCn44Go5Yik5a6a44GV44KM44KL44G544GN5bGe44Gu44GG44Gh44CBKirmraPjgZfjgY/pmb3mgKfjgajliKTlrpoqKuOBp+OBjeOBn+WxnuOBruaVsO+8iCoqVHJ1ZSBQb3NpdGl2ZSoqOyBUUO+8ieOAjeOBq+OBquOCiuOBvuOBmeOAguOBpOOBvuOCiuOAgVRQID0gYHIgVFBg44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NClRQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVFDjga7kuK3ouqsNCmBgYA0K44CA5rOo5oSP54K544Go44GE44GG44KP44GR44Gn44Gv44Gq44GE44Gn44GZ44GM44CBb2Jq44Gu5Lit44Gn6KaL44GI44Gm44GE44KLRkFMU0Xjgavlr77lv5zjgZnjgotBU1bphY3liJfjga7kuK3jgavjga/jgIHjgZ3jgoLjgZ3jgoLns7vntbHlibLjgorlvZPjgabjgafjgY3jgarjgYvjgaPjgZ/jgoLjga7jgYwoYHIgbGVuZ3RoKGdlbnVzKWAgLSBgciBsZW5ndGgobmEub21pdChnZW51cykpYCkgPSBgciBsZW5ndGgoZ2VudXMpIC0gbGVuZ3RoKG5hLm9taXQoZ2VudXMpKWDlgIvlkKvjgb7jgozjgb7jgZnjgILjgZPjgozjgonjga7ns7vntbHlibLjgorlvZPjgabjgZXjgozjgarjgYvjgaPjgZ/jgoLjga7jga/jgIFkYWRhMuOBruS6iOa4rOe1kOaenOOBr+mZsOaAp+aJseOBhOOBq+OBquOCiuOBvuOBmeOAguOBl+OBn+OBjOOBo+OBpuOAgeOAjOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeWxnuOBruOBhuOBoeOAgSoq6ZaT6YGV44Gj44Gm6Zm95oCn44Go5Yik5a6aKirjgZfjgZ/lsZ7jga7mlbDvvIgqKkZhbHNlIFBvc2l0aXZlKio7IEZQ77yJ44CN44Gv44CB57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44GfQVNW5pWw77yIYHIgbGVuZ3RoKG5hLm9taXQoZ2VudXMpKWDlgIvvvInjgYvjgolUUO+8iGByIFRQYOWAi++8ieOCkuW8leOBhOOBn+aVsO+8iD0gYHIgbGVuZ3RoKG5hLm9taXQoZ2VudXMpKWAgLSBgciBUUGAgPSBgciBGUGDvvInjgavjgarjgorjgb7jgZnjgILjgaTjgb7jgorjgIFGUCA9IGByIEZQYOOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpGUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZQ44Gu5Lit6LqrDQpgYGANCuOAgFRQIC8gKFRQICsgRlAp44Gn5a6a576p44GV44KM44KL6YGp5ZCI546H77yIcHJlY2lzaW9u77yJ44Gu5YCk44Gv44CB5YaS6aCt44Gn44KC56S644GX44Gm44GE44G+44GZ44GMYHIgcHJlY2lzaW9uYOOBq+OBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpwcmVjaXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZWNpc2lvbuOBruS4rei6qw0KYGBgDQoNCiMjIyBXMy4zLjIg5pyA5aSa44Gu6YeN6KSHQVNW44KS44KC44Gk5bGeDQrjgIDjgZPjgZPjga/lsJHjgZdUaXBz55qE44Gq6Kmx44Gr44Gq44KK44G+44GZ44GM44CB5Lul5LiL44Gu44KI44GG44Gr44GZ44KM44GwYHIgbGVuZ3RoKGdlbnVzKWDlgIvjga7opoHntKDjgYvjgonjgarjgotgZ2VudXNg44Kq44OW44K444Kn44Kv44OI44Gu5Lit44GL44KJ44CBYG9iamDjgYxUUlVF44Gu6KaB57Sg44Gu44G/44KS5b6X44KL44GT44Go44GM44Gn44GN44G+44GZ44CC44GT44KM44Gv44CB5LuK5Zue5bGe44Os44OZ44Or57O757Wx5Ymy44KK5b2T44Gm57WQ5p6c77yITkHlkKvjgoDvvInjga7oqIhgciBsZW5ndGgoZ2VudXMpYOWAi+OBrkFTVumFjeWIl+OBruOBhuOBoeOAgeaXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeS4reOBq+WtmOWcqOOBmeOCi+ioiGByIGxlbmd0aChnZW51c190cnV0aClg56iu6aGe44Gu5bGe5ZCN44Go5LiA6Ie044GZ44KL44KC44Gu44KS44CB6YeN6KSH44GC44KK44Gn44Oq44K544OI44Ki44OD44OX44GX44Gm44GE44KL44GT44Go44Go5ZCM576p44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmdlbnVzW29ial0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2VudXPkuK3jga5vYmrjgYxUUlVF44Gu6KaB57SgDQpgYGANCuOAgOW+k+OBo+OBpuOAgeOBk+OCjOOCkmB0YWJsZWDplqLmlbDjga7lhaXlipvjgajjgZfjgablrp/ooYzjgZnjgovjgajjgIHlsZ7jga7nqK7poZ7jgZTjgajjga7lh7rnj77poLvluqbjgYzntZDmnpzjgajjgZfjgabov5TjgZXjgozjgb7jgZnjgILntZDmnpzjgpLnnLrjgoHjgovjgZPjgajjgafjgIHkvovjgYjjgbBgciBuYW1lcyhzb3J0KHRhYmxlKGdlbnVzW29ial0pLCBkZWNyZWFzaW5nID0gVClbMV0pYOOBjOacgOWkmuOBrumHjeikh0FTVuaVsOOCkuOCguOBpOWxnuOBoOOBqOOBhOOBhuOBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0YWJsZShnZW51c1tvYmpdKSAgICAgICAgICAgICAgICAgICAgICAgICAjIGdlbnVzW29ial3kuK3jga7opoHntKDjga7nqK7poZ7jgZTjgajjga7lh7rnj77poLvluqYNCmBgYA0K44CA44GT44Gu57WQ5p6c44KS5YWl5Yqb44Go44GX44Gm44CBYHNvcnRg6Zai5pWw44KSYGRlY3JlYXNpbmcgPSBUYOOCquODl+OCt+ODp+ODs+OCkuOBpOOBkeOBpuWun+ihjOOBmeOCjOOBsOOAgeWHuuePvumgu+W6puOBruWkmuOBhOmghu+8iOmZjemghu+8ieOBq+OCveODvOODiOOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpzb3J0KHRhYmxlKGdlbnVzW29ial0pLCBkZWNyZWFzaW5nID0gVCkgICAjIHRhYmxlKGdlbnVzW29ial0p44KS6ZmN6aCG44Gr44K944O844OIDQpgYGANCuOAgGBkZWNyZWFzaW5nID0gVGDjgqrjg5fjgrfjg6fjg7PjgpLjgaTjgZHjgaZgc29ydGDplqLmlbDjgpLlrp/ooYzjgZfjgZ/mmYLngrnjgafjgIHlh7rlipvntZDmnpzjga4x55Wq55uu44Gu6KaB57Sg44GM5Ye654++6aC75bqm5pyA5aSn44Gu44KC44Gu44Gn44GC44KL44GT44Go44GM56K65a6a44GX44Gm44GE44G+44GZ44CC44Gd44KM44KS5Yip55So44GZ44KM44Gw44CB5Lul5LiL44Gu44KI44GG44GrMeeVquWPs+WBtOOBq2BbMV1g44KS6L+95Yqg44GZ44KL44Gg44GR44Gn44CB5Ye654++6aC75bqm44GM5pyA5aSn44Gu44KC44Gu44Gu44G/44KS5oq95Ye65Y+v6IO944Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnNvcnQodGFibGUoZ2VudXNbb2JqXSksIGRlY3JlYXNpbmcgPSBUKVsxXSMgdGFibGUoZ2VudXNbb2JqXSnkuK3jga7mnIDlpJrjga7opoHntKANCmBgYA0K44CA5LiA6YCj44Gu57WQ5p6c44KS6KaL44KL44Go44CBVzMuMi4144Gn6Kej6Kqs44GX44GfbmFtZXPlsZ7mgKfjgYzmnIDliJ3jgYvjgonjgaTjgZHjgonjgozjgabjgYTjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgILjgZPjgozjgpLliKnnlKjjgZnjgozjgbDjgIHku6XkuIvjga7jgojjgYbjgavlhYjjgbvjganjga7ntZDmnpzjgpLlhaXlipvjgajjgZfjgaZgbmFtZXNg6Zai5pWw44KS5a6f6KGM44GZ44KM44Gw44CB5Ye654++6aC75bqm44GM5pyA5aSn44Gu5bGe5ZCN5oOF5aCx44Gu44G/44KS5oq95Ye65Y+v6IO944Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCm5hbWVzKHNvcnQodGFibGUoZ2VudXNbb2JqXSksIGRlY3JlYXNpbmcgPSBUKVsxXSkjIHRhYmxlKGdlbnVzW29ial0p5Lit44Gu5pyA5aSa44Gu6KaB57Sg44GubmFtZXPlsZ7mgKcNCmBgYA0KDQojIyMgVzMuMy4zIGB3aGljaC5tYXhg6Zai5pWwDQrjgIDmnIDliJ3jgYvjgonlh7rnj77poLvluqbjgYzmnIDlpKfjga7jgoLjga7jgYzjgr/jg7zjgrLjg4Pjg4jjga7loLTlkIjjga/jgIFgd2hpY2gubWF4YOmWouaVsOOCguWIqeeUqOOBp+OBjeOBvuOBmeOAgmB3aGljaC5tYXhg6Zai5pWw44Gv44CB5pWw5YCk44OZ44Kv44OI44Or44KS5YWl5Yqb44Go44GX44Gm5LiO44GI44KL44Go44CB5pyA5aSn5YCk44KS44KC44Gk6KaB57Sg44Gu5L2N572u77yI44Kk44Oz44OH44OD44Kv44K577yJ44KS6L+U44GX44G+44GZ44CC44GT44KM44GvKirmlbDlraboqJjlj7fjga5bYXJnIG1heF0oaHR0cHM6Ly9qYS53aWtpcGVkaWEub3JnL3dpa2kvQXJnX21heCnvvIjjgb7jgZ/jga9hcmdtYXjvvInjgavnm7jlvZMqKuOBl+OBvuOBmeOAguOAjG1heOOBquOCieOCruODquOCruODquOCj+OBi+OCi+OBjGFyZyBtYXjvvIjjgb7jgZ/jga9hcmdtYXjvvInjgajjgYTjgYboqJjlj7fjga/opovjgZ/jgaDjgZHjgafjgoLjgYbjg6Djg6rvvIHjgI3jgajjgYTjgYbjg5Ljg4jjgoLlpKfli6LjgYTjgonjgaPjgZfjgoPjgovjgajjga/mgJ3jgYTjgb7jgZnjgILjgZfjgYvjgZfjgIFgd2hpY2gubWF4YOmWouaVsOOBruWFpeWKm+aDheWgseOBqOWHuuWKm+e1kOaenOOCkuimi+avlOOBueOCjOOBsOOAgeOAjOWNmOOBq2B0YWJsZShnZW51c1tvYmpdKWDjga7lrp/ooYzntZDmnpzkuK3jga7mnIDlpKflgKTjga9gciB3aGljaC5tYXgodGFibGUoZ2VudXNbb2JqXSkpYOeVquebruOBruimgee0oOOBp+OBmeOCiOOAguOAjeOBoOOBqOiogOOBo+OBpuOBhOOCi+OBoOOBkeOBqOOBhOOBhuOBk+OBqOOBq+awl+OBpeOBkeOBvuOBmeOAgmFyZ21heOOChGFyZ21pbuOBr+ODkOOCpOOCquOCpOODs+ODleOCqeODnuODhuOCo+OCr+OCueezu+OBruirluaWh+OBp+OCiOOBj+WHuuePvuOBl+OBvuOBme+8iOS+i+OBiOOBsFtPc2FiZSBldCBhbC4sIEJNQyBCaW9pbmZvcm1hdGljcywgMjAyMV0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8zNDY3MDQ4NS8p44Gn44GvYXJnbWlu44GM5Ye644G+44GZ77yJ44Gu44Gn44CB44GT44Gu44KI44GG44Gq5L6L44KS56qB56C05Y+j44Go44GX44Gm5pWw5a2m6KiY5Y+344Gr44KC5oWj44KM44Gm44GE44GP44Go44KI44GE44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnRhYmxlKGdlbnVzW29ial0pICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2VudXNbb2JqXeS4reOBruimgee0oOOBrueorumhnuOBlOOBqOOBruWHuuePvumgu+W6pg0Kd2hpY2gubWF4KHRhYmxlKGdlbnVzW29ial0pKSAgICAgICAgICAgICAgIyB0YWJsZShnZW51c1tvYmpdKeS4reOBruacgOWkp+WApOOBruOCpOODs+ODh+ODg+OCr+OCuQ0KbmFtZXMod2hpY2gubWF4KHRhYmxlKGdlbnVzW29ial0pKSkgICAgICAgIyB3aGljaC5tYXgodGFibGUoZ2VudXNbb2JqXSkp44GubmFtZXPlsZ7mgKcNCmBgYA0KDQojIyMgVzMuMy40IOmWouaVsOODnuODi+ODpeOCouODqw0K44CA5Lul5LiL44KS5a6f6KGM44GZ44KL44Go44CBYHdoaWNoLm1heGDjgoRgd2hpY2gubWluYOmWouaVsOOBruWIqeeUqOS4iuOBruazqOaEj+eCueOCguOCj+OBi+OCi+OBqOaAneOBhOOBvuOBmeOAguOBk+OCjOOBr2B3aGljaC5taW5g44Gn44Gu5L6L44Gn44GZ44GM44CB5a6f6Zqb44Gr44Gv5pyA5bCP5YCk44Gu6KaB57Sg44Gv6KSH5pWw5a2Y5Zyo44GZ44KL44Gu44Gn44GZ44GM44CBYHdoaWNoLm1pbmDjga8qKuadoeS7tuOCkua6gOOBn+OBmeacgOWIneOBruimgee0oOOBruOBvyoq44KS6L+U44GX44G+44GZ44CC44GT44GT44Gn6KaL44GI44Gm44GE44KLYHIgd2hpY2gubWluKHRhYmxlKGdlbnVzW29ial0pKWDjgajjgYTjgYbmlbDlgKTjga/jgIHmnaHku7bjgpLmuoDjgZ/jgZnmnIDliJ3jga7lsZ7jgafjgYLjgotgciBuYW1lcyh3aGljaC5taW4odGFibGUoZ2VudXNbb2JqXSkpKWDjga7opoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnvvIjkvY3nva7mg4XloLHvvInjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGUoZ2VudXNbb2JqXSkgICAgICAgICAgICAgICAgICAgICAgICAgIyAgZ2VudXNbb2JqXeS4reOBruimgee0oOOBrueorumhnuOBlOOBqOOBruWHuuePvumgu+W6pg0Kd2hpY2gubWluKHRhYmxlKGdlbnVzW29ial0pKSAgICAgICAgICAgICAgIyB0YWJsZShnZW51c1tvYmpdKeS4reOBruacgOWwj+WApOOBruOCpOODs+ODh+ODg+OCr+OCuQ0KYGBgDQrjgIDjgZPjga7kuovlrp/jgpLnkIbop6PjgZfjgZ/kuIrjgadgP3doaWNoLm1pbmDjgoRgaGVscCh3aGljaC5taW4pYOOBquOBqeOBp+mWouaVsOOBruODnuODi+ODpeOCouODq+OCkuimi+OCi+OBqOOAgeS+i+OBiOOBsERlc2NyaXB0aW9u6YOo5YiG44Gn44CMRGV0ZXJtaW5lcyB0aGUgbG9jYXRpb24sIGkuZS4sIGluZGV4IG9mIHRoZSAqKihmaXJzdCkqKiBtaW5pbXVtIG9yIG1heGltdW0gb2YgYSBudW1lcmljIChvciBsb2dpY2FsKSB2ZWN0b3Iu44CN44Go5pu444GL44KM44Gm44GE44KL5oSP5ZGz44GM44KI44GP44KP44GL44KL44Go5oCd44GE44G+44GZ44CC44GT44Gu44GC44Gf44KK44Gv6YCa5bi444Gv6Kqt44G/6aOb44Gw44GX44Gm44GX44G+44GG44KC44Gu44Gn44GZ44GM44CB44GE44KN44GE44KN44Go6Ieq5YiG44Gn5YuV5L2c56K66KqN44GX44Gq44GM44KJ6YCy44KB44Gm44GE44GP5ae/5Yui44GM5aSn5LqL44Gn44GZ44CCDQoNCuOAgOOBvuOBn+OAgeS4iuOBruWun+ihjOe1kOaenOOCkuOBv+OCi+OBqOOAgeOAjGB3aGljaC5taW5g44Gu5a6f5L2T44Gv44CBYHNvcnRg57WQ5p6c44GuMeeVquebruOBruimgee0oOaKveWHuuOBoOOBquOAjeOBqOOBhOOBhuOBq+OCguawl+OBpeOBkeOCi+OBqOaAneOBhOOBvuOBmeOAguOBk+OBruOCiOOBhuOBqmB3aGljaC5taW5g44Gu5YaF6YOo44Gn5a6f6Zqb44Gr5YuV44GE44Gm44GE44KL6Zai5pWw44Gu5oyZ5YuV44KS5oOz5YOP44Gn44GN44KL44KI44GG44Gr44Gq44KM44Gw44CB44OX44Ot44Kw44Op44Og6ZaL55m66ICF44Gu5oCd6ICD5Zue6Lev44Gr6L+R44Gl44GE44Gm44GE44GR44G+44GZ44CC44Gq44GK44CB44GT44GT44Gn6KaL44GI44Gm44GE44KLYHIgc29ydCh0YWJsZShnZW51c1tvYmpdKSlbMV1g44Go44GE44GG5pWw5YCk44Gv44CB5p2h5Lu244KS5rqA44Gf44GZ5pyA5Yid44Gu5bGe44Gn44GC44KLYHIgbmFtZXMoc29ydCh0YWJsZShnZW51c1tvYmpdKSlbMV0pYOOBruimgee0oOOBruWHuuePvumgu+W6puOBq+OBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpzb3J0KHRhYmxlKGdlbnVzW29ial0pKVsxXSAgICAgICAgICAgICAgICAjIHRhYmxlKGdlbnVzW29ial0p5Lit44Gu5pyA5bCP44Gu6KaB57SgDQpgYGANCg0KIyMjIFczLjMuNSDpganlkIjnjofvvIjnqK7jg6zjg5njg6vvvIkNCuOAgOmHjeikh+OBguOCiuOBruWgtOWQiOOBr+OAgeS7peS4i+OBruOCiOOBhuOBq+abuOOBkeOBsOeoruODrOODmeODq+OBrumBqeWQiOeOh+OBruWApOOBvuOBp+OCkuS4gOawl+OBq+W+l+OCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpvYmogPC0gaXMuZWxlbWVudChzcGVjaWVzLCBzcGVjaWVzX3RydXRoKSAjIHNwZWNpZXPkuK3jga7lkITopoHntKDjgYxzcGVjaWVzX3RydXRo44Gr5ZCr44G+44KM44KL44GL5Yik5a6a44GX44Gf57WQ5p6c44KSb2Jq44Gr5qC857SNDQpUUCA8LSBzdW0ob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9iauS4reOBrlRSVUXjga7opoHntKDmlbDjgpJUUOOBq+agvOe0jQ0KRlAgPC0gbGVuZ3RoKG5hLm9taXQoc3BlY2llcykpIC0gVFAgICAgICAgIyBzcGVjaWVz44GuTkHjgpLpmaTjgY/opoHntKDmlbAgLSBUUOOCkkZQ44Gr5qC857SNDQpwcmVjaXNpb24gPC0gVFAgLyAoVFAgKyBGUCkgICAgICAgICAgICAgICAjIOmBqeWQiOeOh+OCkuioiOeul+OBl+OBn+e1kOaenOOCknByZWNpc2lvbuOBq+agvOe0jQ0KcHJlY2lzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmVjaXNpb27jga7kuK3ouqsNCmBgYA0K44CAVzMuMi4344Go44Gu5Li744Gq6YGV44GE44Gv44CBYGlzLmVsZW1lbnRg6Zai5pWw44Gu5YWl5Yqb44Go44GX44Gm5LiO44GI44Gm44GE44KLMuOBpOOBruODmeOCr+ODiOODq+OBrumghuW6j+OBp+OBmeOAguOBk+OBk+OBp+OBr+OAgWByIGxlbmd0aChzcGVjaWVzKWDlgIvjga7opoHntKDjgYvjgonjgarjgotgc3BlY2llc2DkuK3jga7opoHntKAx44GkMeOBpOOBq+WvvuOBl+OBpuOAgeOBneOCjOOBjGByIGxlbmd0aChzcGVjaWVzX3RydXRoKWDlgIvjga7opoHntKDjgYvjgonjgarjgotgc3BlY2llc190cnV0aGDkuK3jgavlrZjlnKjjgZnjgovjgYvjganjgYbjgYvjgpJUUlVFIG9yIEZBTFNF44Gn5Yik5a6a44GX44Gm44GE44G+44GZ44CC5b6T44Gj44Gm44CBYG9iamDjga7opoHntKDmlbDjga9gciBsZW5ndGgob2JqKWDlgIvjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KbGVuZ3RoKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmrjga7opoHntKDmlbANCmBgYA0K44CAYG9iamDjga7kuK3ouqvjgpLopovjgovjgajjgIHlhajkvZPjgajjgZfjgabjga9GQUxTReOBjOOBu+OBqOOCk+OBqeOBp+OAgVRSVUXjga/mnIDliJ3jga7jgbvjgYbjgavlgY/jgaPjgablrZjlnKjjgZfjgabjgYTjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgILjgZPjga7nkIbnlLHjga/jgIFkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44KS55y644KB44KL44Go44KI44GP44KP44GL44KL44Go5oCd44GE44G+44GZ44CC44Gk44G+44KK44CBYHNwZWNpZXNg5Lit44Gu6KaB57Sg77yIQVNW77yJ44Gu5Lim44Gz44Gv44CB6KiIMTLjgrXjg7Pjg5fjg6vjga7lh7rnj77poLvluqbjga7nt4/lkozjgYzpq5jjgYTpoIbjgavjgarjgaPjgabjgYTjgovjgajjgYTjgYbjgZPjgajjgafjgZnjgILjganjga7jgrXjg7Pjg5fjg6vjgafjgoLmpJzlh7rjgZXjgozjgovjgojjgYbjgapBU1bphY3liJfjga/jgIHmnKzmnaXmpJzlh7rjgZfjgZ/jgYTml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnjgafjgYLjgovnorrnjofjgYzpq5jjgYTjgajjgYTjgYbnm7TmhJ/jgajjgoLjgojjgY/kuIDoh7TjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kb2JqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmrjga7kuK3ouqsNCmBgYA0K44CA44GT44Gu5Lit44GuVFJVReOBruimgee0oOaVsOOBjOOAjOmZveaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgSoq5q2j44GX44GP6Zm95oCn44Go5Yik5a6aKirjgafjgY3jgZ/nqK7jga7mlbDvvIgqKlRydWUgUG9zaXRpdmUqKjsgVFDvvInjgI3jgavjgarjgorjgb7jgZnjgILjgaTjgb7jgorjgIFUUCA9IGByIFRQYOOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpUUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRQ44Gu5Lit6LqrDQpgYGANCuOAgOazqOaEj+eCueOBqOOBhOOBhuOCj+OBkeOBp+OBr+OBquOBhOOBp+OBmeOBjOOAgW9iauOBruS4reOBp+imi+OBiOOBpuOBhOOCi0ZBTFNF44Gr5a++5b+c44GZ44KLQVNW6YWN5YiX44Gu5Lit44Gr44Gv44CB44Gd44KC44Gd44KC57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44Gq44GL44Gj44Gf44KC44Gu44GMKGByIGxlbmd0aChzcGVjaWVzKWAgLSBgciBsZW5ndGgobmEub21pdChzcGVjaWVzKSlgKSA9IGByIGxlbmd0aChzcGVjaWVzKSAtIGxlbmd0aChuYS5vbWl0KHNwZWNpZXMpKWDlgIvlkKvjgb7jgozjgb7jgZnjgILjgZPjgozjgonjga7ns7vntbHlibLjgorlvZPjgabjgZXjgozjgarjgYvjgaPjgZ/jgoLjga7jga/jgIFkYWRhMuOBruS6iOa4rOe1kOaenOOBr+mZsOaAp+aJseOBhOOBq+OBquOCiuOBvuOBmeOAguOBl+OBn+OBjOOBo+OBpuOAgeOAjOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgSoq6ZaT6YGV44Gj44Gm6Zm95oCn44Go5Yik5a6aKirjgZfjgZ/nqK7jga7mlbDvvIgqKkZhbHNlIFBvc2l0aXZlKio7IEZQ77yJ44CN44Gv44CB57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44GfQVNW5pWw77yIYHIgbGVuZ3RoKG5hLm9taXQoc3BlY2llcykpYOWAi++8ieOBi+OCiVRQ77yIYHIgVFBg5YCL77yJ44KS5byV44GE44Gf5pWw77yIPSBgciBsZW5ndGgobmEub21pdChzcGVjaWVzKSlgIC0gYHIgVFBgID0gYHIgRlBg77yJ44Gr44Gq44KK44G+44GZ44CC44Gk44G+44KK44CBRlAgPSBgciBGUGDjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KRlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGUOOBruS4rei6qw0KYGBgDQrjgIBUUCAvIChUUCArIEZQKeOBp+Wumue+qeOBleOCjOOCi+mBqeWQiOeOh++8iHByZWNpc2lvbu+8ieOBruWApOOBr+OAgeWGkumgreOBp+OCguekuuOBl+OBpuOBhOOBvuOBmeOBjGByIHByZWNpc2lvbmDjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlY2lzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmVjaXNpb27jga7kuK3ouqsNCmBgYA0K44CA44Gq44GK44CB6KiIYHIgVFBg5YCL44GuVFDjga7lhoXoqLPvvIjjganjga7nqK7jgYzkvZXlm57libLjgorlvZPjgabjgonjgozjgZ/jgYvvvInjga/jgIHkuIvoqJjjga7pgJrjgorjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc29ydCh0YWJsZShzcGVjaWVzW29ial0pLCBkZWNyZWFzaW5nID0gVCkgIyB0YWJsZShzcGVjaWVzW29ial0p44KS6ZmN6aCG44Gr44K944O844OIDQpgYGANCg0KIyMjIFczLjMuNiDjgb7jgajjgoHjgablrp/ooYwNCuOAgFczLjPjga7jgrnjgq/jg6rjg5fjg4jjgpLku6XkuIvjgavjgb7jgajjgoHjgb7jgZnjgILjgZ/jgaDjgZfjgIHlsZ7jg6zjg5njg6vjga7pganlkIjnjofjgajnqK7jg6zjg5njg6vjga7pganlkIjnjofjgpLljLrliKXjgZnjgovlv4XopoHjgYzjgYLjgovjga7jgafjgIHmnIDntYLnmoTjgarjgqrjg5bjgrjjgqfjgq/jg4jlkI3jga/lpInjgYjjgabjgYTjgb7jgZnjgILjgZPjgozjgpLlrp/ooYzjgZnjgovjgZ/jgoHjgavlv4XopoHjgao044Gk44Gu44Kq44OW44K444Kn44Kv44OI77yIYGdlbnVzX3RydXRoYCwgYGdlbnVzYCwgYHNwZWNpZXNfdHJ1dGhgLCBhbmQgYHNwZWNpZXNg77yJ44Gv44CBVzIuM+OCkuWun+ihjOOBmeOCjOOBsOW+l+OCieOCjOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQojIOWxnuODrOODmeODq+OBrumBqeWQiOeOhw0Kb2JqIDwtIGlzLmVsZW1lbnQoZ2VudXMsIGdlbnVzX3RydXRoKSAgICAgIyBnZW51c+S4reOBruWQhOimgee0oOOBjGdlbnVzX3RydXRo44Gr5ZCr44G+44KM44KL44GL5Yik5a6a44GX44Gf57WQ5p6c44KSb2Jq44Gr5qC857SNDQpUUCA8LSBzdW0ob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9iauS4reOBrlRSVUXjga7opoHntKDmlbDjgpJUUOOBq+agvOe0jQ0KRlAgPC0gbGVuZ3RoKG5hLm9taXQoZ2VudXMpKSAtIFRQICAgICAgICAgIyBnZW51c+OBrk5B44KS6Zmk44GP6KaB57Sg5pWwIC0gVFDjgpJGUOOBq+agvOe0jQ0KcHJlY2lzaW9uIDwtIFRQIC8gKFRQICsgRlApICAgICAgICAgICAgICAgIyDpganlkIjnjofjgpLoqIjnrpfjgZfjgZ/ntZDmnpzjgpJwcmVjaXNpb27jgavmoLzntI0NCiMg44Kq44OW44K444Kn44Kv44OI5ZCN44Gu5aSJ5pu0DQpUUF9nZW51c19kdXAgPC0gVFAgICAgICAgICAgICAgICAgICAgICAgICAjIFRQ44KSVFBfZ2VudXNfZHVw44Gr44Kz44OU44O8DQpGUF9nZW51c19kdXAgPC0gRlAgICAgICAgICAgICAgICAgICAgICAgICAjIEZQ44KSRlBfZ2VudXNfZHVw44Gr44Kz44OU44O8DQpwcmVjaXNpb25fZ2VudXNfZHVwIDwtIHByZWNpc2lvbiAgICAgICAgICAjIHByZWNpc2lvbuOCknByZWNpc2lvbl9nZW51c19kdXDjgavjgrPjg5Tjg7wNCg0KIyDnqK7jg6zjg5njg6vjga7pganlkIjnjocNCm9iaiA8LSBpcy5lbGVtZW50KHNwZWNpZXMsIHNwZWNpZXNfdHJ1dGgpICMgc3BlY2llc+S4reOBruWQhOimgee0oOOBjHNwZWNpZXNfdHJ1dGjjgavlkKvjgb7jgozjgovjgYvliKTlrprjgZfjgZ/ntZDmnpzjgpJvYmrjgavmoLzntI0NClRQIDwtIHN1bShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2Jq5Lit44GuVFJVReOBruimgee0oOaVsOOCklRQ44Gr5qC857SNDQpGUCA8LSBsZW5ndGgobmEub21pdChzcGVjaWVzKSkgLSBUUCAgICAgICAjIHNwZWNpZXPjga5OQeOCkumZpOOBj+imgee0oOaVsCAtIFRQ44KSRlDjgavmoLzntI0NCnByZWNpc2lvbiA8LSBUUCAvIChUUCArIEZQKSAgICAgICAgICAgICAgICMg6YGp5ZCI546H44KS6KiI566X44GX44Gf57WQ5p6c44KScHJlY2lzaW9u44Gr5qC857SNDQojIOOCquODluOCuOOCp+OCr+ODiOWQjeOBruWkieabtA0KVFBfc3BlY2llc19kdXAgPC0gVFAgICAgICAgICAgICAgICAgICAgICAgIyBUUOOCklRQX3NwZWNpZXNfZHVw44Gr44Kz44OU44O8DQpGUF9zcGVjaWVzX2R1cCA8LSBGUCAgICAgICAgICAgICAgICAgICAgICAjIEZQ44KSRlBfc3BlY2llc19kdXDjgavjgrPjg5Tjg7wNCnByZWNpc2lvbl9zcGVjaWVzX2R1cCA8LSBwcmVjaXNpb24gICAgICAgICMgcHJlY2lzaW9u44KScHJlY2lzaW9uX3NwZWNpZXNfZHVw44Gr44Kz44OU44O8DQpgYGANCg0KIyMjIFczLjMuNyBXMy4z44Gu44G+44Go44KBDQrjgIDjgZPjgZPjgafjga/jgIEqKumHjeikh+OBguOCiuOBruaAp+iDveipleS+oSoq44Go44GX44Gm44CB5bGe44Os44OZ44Or44Go56iu44Os44OZ44Or44Gu6YGp5ZCI546H44KS566X5Ye644GX44G+44GX44Gf44CCZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vvvIhbb3V0cHV0X0pTTEFCMjQudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0Ke+8ieOBp+OBr+OAgUFTVuOBrumFjeWIl+OBjOmBleOBo+OBpuOBhOOBpuOCguWQjOOBmOWxnuOChOeoruOBq+WJsuOCiuW9k+OBpuOCieOCjOOCi+OBk+OBqOOBjOOBguOCiuOBvuOBmeOAguOBneOCjOOCieOCkioq44Gd44Gu44G+44G+6YeN6KSH44GC44KK44Gn44Kr44Km44Oz44OI44GX44Gm5oCn6IO96KmV5L6hKirjgpLooYzjgaPjgabjgYTjgb7jgZnjgIINCg0KLSDlsZ7jg6zjg5njg6vvvIjph43opIfjgYLjgorvvIkNCiAgLSDkuojmuKzntZDmnpzjga7pmb3mgKfmlbDvvIhkYWRhMuWun+ihjOe1kOaenOOBqOOBl+OBpuW+l+OCieOCjOOBn+WxnuOBruaVsO+8ie+8mmByIGxlbmd0aChuYS5vbWl0KGdlbnVzKSlgDQogIC0g6Zm95oCn44Go5Yik5a6a44GV44KM44KL44G544GN5bGe44Gu44GG44Gh44CBKirmraPjgZfjgY/pmb3mgKcqKuOBqOWIpOWumuOBp+OBjeOBn+WxnuOBruaVsO+8iCoqVHJ1ZSBQb3NpdGl2ZSoqOyBUUO+8ie+8mmByIFRQX2dlbnVzX2R1cGANCiAgLSDpmbDmgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3lsZ7jga7jgYbjgaHjgIEqKumWk+mBleOBo+OBpumZveaApyoq44Go5Yik5a6a44GX44Gf5bGe44Gu5pWw77yIKipGYWxzZSBQb3NpdGl2ZSoqOyBGUO+8ie+8mmByIEZQX2dlbnVzX2R1cGAgKD0gYHIgbGVuZ3RoKG5hLm9taXQoZ2VudXMpKWAgLSBgciBUUF9nZW51c19kdXBgKQ0KICAtIOmBqeWQiOeOh++8iHByZWNpc2lvbu+8ie+8mlRQIC8gKFRQICsgRlApID0gYHIgVFBfZ2VudXNfZHVwYCAvIChgciBUUF9nZW51c19kdXBgICsgYHIgRlBfZ2VudXNfZHVwYCkgPSBgciBwcmVjaXNpb25fZ2VudXNfZHVwYA0KDQotIOeoruODrOODmeODq++8iOmHjeikh+OBguOCiu+8iQ0KICAtIOS6iOa4rOe1kOaenOOBrumZveaAp+aVsO+8iGRhZGEy5a6f6KGM57WQ5p6c44Go44GX44Gm5b6X44KJ44KM44Gf56iu44Gu5pWw77yJ77yaYHIgbGVuZ3RoKG5hLm9taXQoc3BlY2llcykpYA0KICAtIOmZveaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgSoq5q2j44GX44GP6Zm95oCnKirjgajliKTlrprjgafjgY3jgZ/nqK7jga7mlbDvvIgqKlRydWUgUG9zaXRpdmUqKjsgVFDvvInvvJpgciBUUF9zcGVjaWVzX2R1cGANCiAgLSDpmbDmgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3nqK7jga7jgYbjgaHjgIEqKumWk+mBleOBo+OBpumZveaApyoq44Go5Yik5a6a44GX44Gf56iu44Gu5pWw77yIKipGYWxzZSBQb3NpdGl2ZSoqOyBGUO+8ie+8mmByIEZQX3NwZWNpZXNfZHVwYCAoPSBgciBsZW5ndGgobmEub21pdChzcGVjaWVzKSlgIC0gYHIgVFBfc3BlY2llc19kdXBgKQ0KICAtIOmBqeWQiOeOh++8iHByZWNpc2lvbu+8ie+8mlRQIC8gKFRQICsgRlApID0gYHIgVFBfc3BlY2llc19kdXBgIC8gKGByIFRQX3NwZWNpZXNfZHVwYCArIGByIEZQX3NwZWNpZXNfZHVwYCkgPSBgciBwcmVjaXNpb25fc3BlY2llc19kdXBgDQoNCuOAgOavlOi8g+OBl+OChOOBmeOBhOOCiOOBhuOBq+OAgVczLjIuOeOBruOBvuOBqOOCgeaDheWgseOCguS7peS4i+OBq+WGjeaOsuOBl+OBvuOBmeOAgkZO44GoVE7jga7mg4XloLHjgYzlrZjlnKjjgZfjgarjgYTjgZ/jgoHlkIzjgZjjg5Xjgqnjg7zjg57jg4Pjg4jjgavjga/jgZfjgabjgYTjgb7jgZvjgpPjgYzjgIHph43opIfjgYLjgorjga5UUOOBjOeiuuOBi+OBq+mHjeikh+OBquOBl+OCiOOCiuOCguWkmuOBj+OBquOBo+OBpuOBiuOCiuWmpeW9k+OBoOOBqOWIpOaWreOBp+OBjeOBvuOBmeOAguOBvuOBn+OAgemHjeikh+OBguOCiuOBrumBqeWQiOeOh+OBr+OAgeWxnuODrOODmeODq++8iGByIHByZWNpc2lvbl9nZW51c19kdXBgID4gYHIgcHJlY2lzaW9uX2dlbnVzYO+8ieODu+eoruODrOODmeODq++8iGByIHByZWNpc2lvbl9zcGVjaWVzX2R1cGAgPiBgciBwcmVjaXNpb25fc3BlY2llc2DvvInjgajjgoLjgavph43opIfjgarjgZfjgojjgorjgoLpq5jjgY/jgarjgaPjgabjgYTjgovjgZPjgajjgYzliIbjgYvjgorjgb7jgZnjgIINCg0KLSDlsZ7jg6zjg5njg6vvvIjph43opIfjgarjgZfvvIkNCiAgLSDkuojmuKzntZDmnpzjga7pmb3mgKfmlbDvvIhkYWRhMuWun+ihjOe1kOaenOOBqOOBl+OBpuW+l+OCieOCjOOBn+ODpuODi+ODvOOCr+OBquWxnuOBruaVsO+8ie+8mmByIGxlbmd0aCh0YWJsZShnZW51cykpYA0KICAtIOecn+OBrumZveaAp+aVsO+8iOaXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeS4reOBruWxnuOBruaVsO+8ie+8mmByIGxlbmd0aChnZW51c190cnV0aClgDQogICAgLSDpmb3mgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3lsZ7jga7jgYbjgaHjgIEqKuato+OBl+OBj+mZveaApyoq44Go5Yik5a6a44Gn44GN44Gf5bGe44Gu5pWw77yIKipUcnVlIFBvc2l0aXZlKio7IFRQ77yJ77yaYHIgVFBfZ2VudXNgDQogICAgLSDpmb3mgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3lsZ7jga7jgYbjgaHjgIEqKumWk+mBleOBo+OBpumZsOaApyoq44Go5Yik5a6a44GX44Gf5bGe44Gu5pWw77yIKipGYWxzZSBOZWdhdGl2ZSoqOyBGTu+8ie+8mmByIEZOX2dlbnVzYA0KICAtIOecn+OBrumZsOaAp+aVsO+8iOS7iuWbnuino+aekOOBl+OBn+aXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeS7peWkluOBruWxnuOBruaVsO+8ie+8muS4jeaYju+8iOWkmuaVsO+8iQ0KICAgIC0g6Zmw5oCn44Go5Yik5a6a44GV44KM44KL44G544GN5bGe44Gu44GG44Gh44CBKirmraPjgZfjgY/pmbDmgKcqKuOBqOWIpOWumuOBp+OBjeOBn+WxnuOBruaVsO+8iCoqVHJ1ZSAgICAgTmVnYXRpdmUqKjsgVE7vvInvvJrkuI3mmI7vvIjlpJrmlbDvvIkNCiAgICAtIOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeWxnuOBruOBhuOBoeOAgSoq6ZaT6YGV44Gj44Gm6Zm95oCnKirjgajliKTlrprjgZfjgZ/lsZ7jga7mlbDvvIgqKkZhbHNlIFBvc2l0aXZlKio7IEZQ77yJ77yaYHIgRlBfZ2VudXNgICg9IGByIGxlbmd0aCh0YWJsZShnZW51cykpYCAtIGByIFRQX2dlbnVzYCkNCiAgLSDmhJ/luqbvvIhzZW5zaXRpdml0ee+8ie+8mlRQIC8gKFRQICsgRk4pID0gYHIgVFBfZ2VudXNgIC8gKGByIFRQX2dlbnVzYCArIGByIEZOX2dlbnVzYCkgPSBgciBzZW5zaXRpdml0eV9nZW51c2ANCiAgLSDpganlkIjnjofvvIhwcmVjaXNpb27vvInvvJpUUCAvIChUUCArIEZQKSA9IGByIFRQX2dlbnVzYCAvIChgciBUUF9nZW51c2AgKyBgciBGUF9nZW51c2ApID0gYHIgcHJlY2lzaW9uX2dlbnVzYA0KDQotIOeoruODrOODmeODq++8iOmHjeikh+OBquOBl++8iQ0KICAtIOS6iOa4rOe1kOaenOOBrumZveaAp+aVsO+8iGRhZGEy5a6f6KGM57WQ5p6c44Go44GX44Gm5b6X44KJ44KM44Gf44Om44OL44O844Kv44Gq56iu44Gu5pWw77yJ77yaYHIgbGVuZ3RoKHRhYmxlKHNwZWNpZXMpKWANCiAgLSDnnJ/jga7pmb3mgKfmlbDvvIjml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnkuK3jga7nqK7jga7mlbDvvInvvJpgciBsZW5ndGgoc3BlY2llc190cnV0aClgDQogICAgLSDpmb3mgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3nqK7jga7jgYbjgaHjgIEqKuato+OBl+OBj+mZveaApyoq44Go5Yik5a6a44Gn44GN44Gf56iu44Gu5pWw77yIKipUcnVlIFBvc2l0aXZlKio7IFRQ77yJ77yaYHIgVFBfc3BlY2llc2ANCiAgICAtIOmZveaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgSoq6ZaT6YGV44Gj44Gm6Zmw5oCnKirjgajliKTlrprjgZfjgZ/nqK7jga7mlbDvvIgqKkZhbHNlIE5lZ2F0aXZlKio7IEZO77yJ77yaYHIgRk5fc3BlY2llc2ANCiAgLSDnnJ/jga7pmbDmgKfmlbDvvIjku4rlm57op6PmnpDjgZfjgZ/ml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnku6XlpJbjga7nqK7jga7mlbDvvInvvJrkuI3mmI7vvIjlpJrmlbDvvIkNCiAgICAtIOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgSoq5q2j44GX44GP6Zmw5oCnKirjgajliKTlrprjgafjgY3jgZ/nqK7jga7mlbDvvIgqKlRydWUgTmVnYXRpdmUqKjsgVE7vvInvvJrkuI3mmI7vvIjlpJrmlbDvvIkNCiAgICAtIOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgSoq6ZaT6YGV44Gj44Gm6Zm95oCnKirjgajliKTlrprjgZfjgZ/nqK7jga7mlbDvvIgqKkZhbHNlIFBvc2l0aXZlKio7IEZQ77yJ77yaYHIgRlBfc3BlY2llc2AgKD0gYHIgbGVuZ3RoKHRhYmxlKHNwZWNpZXMpKWAgLSBgciBUUF9zcGVjaWVzYCkNCiAgLSDmhJ/luqbvvIhzZW5zaXRpdml0ee+8ie+8mlRQIC8gKFRQICsgRk4pID0gYHIgVFBfc3BlY2llc2AgLyAoYHIgVFBfc3BlY2llc2AgKyBgciBGTl9nZW51c2ApID0gYHIgc2Vuc2l0aXZpdHlfc3BlY2llc2ANCiAgLSDpganlkIjnjofvvIhwcmVjaXNpb27vvInvvJpUUCAvIChUUCArIEZQKSA9IGByIFRQX3NwZWNpZXNgIC8gKGByIFRQX3NwZWNpZXNgICsgYHIgRlBfc3BlY2llc2ApID0gYHIgcHJlY2lzaW9uX3NwZWNpZXNgDQoNCiMjIFczLjQg5oCn6IO96KmV5L6h77yI5Ye654++6aC75bqm5ZCr44KA77yJDQrjgIBXMy4y44Gv5ZCM44GY5bGe44G+44Gf44Gv56iu5Y2Y5L2N44Gn44CB44Gd44GX44GmVzMuM+OBr0FTVumFjeWIl+WNmOS9jeOBp+OAgeaXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeOBruOCguOBruOBqOS4gOiHtOOBmeOCi+OBi+OBqeOBhuOBi+OBruipleS+oeOCkuihjOOBhOOBvuOBl+OBn+OAgueJueOBq+mBqeWQiOeOh+OBr+OAgeWxnuODrOODmeODq+OAgeeoruODrOODmeODq+OAgemHjeikh+OBruacieeEoeOBq+OBi+OBi+OCj+OCieOBmuWFqOOBpjAuMuacqua6gOOBp+OBguOCiuOAgemaj+WIhuS9juOBhOWNsOixoeOCkuWPl+OBkeOBvuOBmeOAguOBk+OCjOOBr+OBk+OCjOOBp+ecn+Wun+OBp+OBr+OBguOCiuOBvuOBmeOBjOOAgeWun+mam+OBq+OBr0FTVumFjeWIl+OBlOOBqOOBq+WHuuePvumgu+W6puaDheWgseOBjOOBguOCiuOAgVczLjMuMeOChFczLjMuNeOBrmBvYmpg44OZ44Kv44OI44Or5Lit44GuVFJVReOBruimgee0oOOBjOWJjeWNiumDqOWIhuOBq+WBj+OBo+OBpuOBhOOBn+OBk+OBqOOBi+OCieOCguOCj+OBi+OCiuOBvuOBmeOBjOOAgeWHuuePvumgu+W6puOBjOmrmOOBhEFTVuOBr+OBneOCjOOBquOCiuOBq+aknOWHuuOBp+OBjeOBpuOBhOOBvuOBl+OBn+OAguOBk+OBk+OBp+OBr+OAgWRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5TUlLliJfjgavnm7jlvZPjgZnjgovoqIgxMuOCteODs+ODl+ODq+OBruWHuuePvumgu+W6puOBrue3j+WSjOOCkkFTVumFjeWIl+OBlOOBqOOBq+eul+WHuuOBl+OAgeWHuuePvumgu+W6puOCkuWQq+OCgeOBpuWxnuODrOODmeODq+OBiuOCiOOBs+eoruODrOODmeODq+OBrumBqeWQiOeOh+OCkueul+WHuuOBl+OBvuOBmeOAgg0KDQrjgIDjgZPjgZPjgafnlKjjgYTjgovlhaXlipvjg4fjg7zjgr/jga/kuIvoqJjjga7pgJrjgorjgafjgZnjgIJXMy4y44KEVzMuM+OBqOavlOOBueOCi+OBqOOAgWBkYXRhYOOCquODluOCuOOCp+OCr+ODiOOBjOWil+OBiOOBn+OBoOOBkeOBq+OBquOCiuOBvuOBmeOAguioiDXjgaTjga7jgqrjg5bjgrjjgqfjgq/jg4jjgpLnlKjjgYTjgb7jgZnjgYzjgIHjgYTjgZrjgozjgoJXMi4z44Gu44Kz44OU44Oa5a6f6KGM44Gn5b6X44KJ44KM44G+44GZ44CCDQoNCi0gYGRhdGFg77ya5pWw5YCk6KGM5YiXDQogIC0gQVNW6YWN5YiX44GU44Go44Gu5Ye654++6aC75bqm5oOF5aCx44Gn44GC44KK44CB5Ye654++6aC75bqm44Gu57eP5ZKM44Gn44K944O844OI44GV44KM44Gm44GE44KLDQogIC0gZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vvvIhbb3V0cHV0X0pTTEFCMjQudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0Ke+8ieOBrlNSUuWIl+OBruaDheWgsQ0KICAtIGBucm93KGRhdGEpYO+8muihjOaVsO+8iEFTVuOBrue3j+aVsO+8ieOBr2ByIG5yb3coZGF0YSlgDQogIC0gYG5jb2woZGF0YSlg77ya5YiX5pWw77yI44K144Oz44OX44Or5pWw77yJ44GvYHIgbmNvbChkYXRhKWANCg0KLSBgZ2VudXNg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirlsZ7jga7kuojmuKzntZDmnpwqKuOBq+ebuOW9kw0KICAtIGRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5HZW51c+WIl+OBruaDheWgsQ0KICAtIGBsZW5ndGgoZ2VudXMpYO+8muimgee0oOaVsO+8iEFTVuOBrue3j+aVsO+8ieOBr2ByIGxlbmd0aChnZW51cylgDQogIC0gYGxlbmd0aChuYS5vbWl0KGdlbnVzKSlg77yaIk5BIuOCkumZpOOBj+imgee0oOaVsO+8iOezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBn0FTVuaVsO+8ieOBr2ByIGxlbmd0aChuYS5vbWl0KGdlbnVzKSlgDQogIC0gYGxlbmd0aCh0YWJsZShnZW51cykpYO+8miJOQSLjgpLpmaTjgY/jg6bjg4vjg7zjgq/jgaropoHntKDmlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ/jg6bjg4vjg7zjgq/jgarlsZ7jga7mlbDvvInjga9gciBsZW5ndGgodGFibGUoZ2VudXMpKWANCg0KLSBgc3BlY2llc2DvvJrmloflrZfliJfjg5njgq/jg4jjg6sNCiAgLSAqKueoruOBruS6iOa4rOe1kOaenCoq44Gr55u45b2TDQogIC0gZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vvvIhbb3V0cHV0X0pTTEFCMjQudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0Ke+8ieOBrlNwZWNpZXPliJfjga7mg4XloLENCiAgLSBgbGVuZ3RoKHNwZWNpZXMpYO+8muimgee0oOaVsO+8iEFTVuOBrue3j+aVsO+8ieOBr2ByIGxlbmd0aChzcGVjaWVzKWANCiAgLSBgbGVuZ3RoKG5hLm9taXQoc3BlY2llcykpYO+8miJOQSLjgpLpmaTjgY/opoHntKDmlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ9BU1bmlbDvvInjga9gciBsZW5ndGgobmEub21pdChzcGVjaWVzKSlgDQogIC0gYGxlbmd0aCh0YWJsZShzcGVjaWVzKSlg77yaIk5BIuOCkumZpOOBj+ODpuODi+ODvOOCr+OBquimgee0oOaVsO+8iOezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBn+ODpuODi+ODvOOCr+OBqueoruOBruaVsO+8ieOBr2ByIGxlbmd0aCh0YWJsZShzcGVjaWVzKSlgDQoNCi0gYGdlbnVzX3RydXRoYO+8muaWh+Wtl+WIl+ODmeOCr+ODiOODqw0KICAtICoq5bGe44Gu5q2j6Kej5oOF5aCxKirjgavnm7jlvZMNCiAgLSDnrKwyM+WbnuOBruihqDHjgavnm7jlvZPjgZnjgovoj4zmoKrmg4XloLHjg5XjgqHjgqTjg6vvvIhbSlNMQUIyM190YWJsZTEudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0Ke+8ieOBrk9yZ2FuaXNt5YiX44Gu5oOF5aCx44CCMeeVquW3puWBtOOBruWNiuinkuOCueODmuODvOOCueaJi+WJjeOBvuOBp+OBruWNmOiqnuOAgg0KICAtIOacrOadpeaknOWHuuOBl+OBn+OBhOaXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeS4reOBruWxnuWQjeOBq+ebuOW9kw0KICAtIGBsZW5ndGgoZ2VudXNfdHJ1dGgpYO+8muimgee0oOaVsO+8iOODpuODi+ODvOOCr+OBquWxnuOBruaVsO+8ieOBr2ByIGxlbmd0aChnZW51c190cnV0aClgDQoNCi0gYHNwZWNpZXNfdHJ1dGhg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirnqK7jga7mraPop6Pmg4XloLEqKuOBq+ebuOW9kw0KICAtIOesrDIz5Zue44Gu6KGoMeOBq+ebuOW9k+OBmeOCi+iPjOagquaDheWgseODleOCoeOCpOODq++8iFtKU0xBQjIzX3RhYmxlMS50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQjIzX3RhYmxlMS50eHQp77yJ44GuT3JnYW5pc23liJfjga7mg4XloLHjgILmnIDliJ3jga7ljYrop5Ljgrnjg5rjg7zjgrnjgYvjgonjgrPjg7Pjg57miYvliY3jgb7jgafjga7ljZjoqp7jgIINCiAgLSBgbGVuZ3RoKHNwZWNpZXNfdHJ1dGgpYO+8muimgee0oOaVsO+8iOODpuODi+ODvOOCr+OBqueoruOBruaVsO+8ieOBr2ByIGxlbmd0aChzcGVjaWVzX3RydXRoKWANCg0KIyMjIFczLjQuMSBgcm93U3Vtc2DplqLmlbANCuOAgGByb3dTdW1zYOmWouaVsOOBr+OAgeaVsOWApOihjOWIl+OCkuWFpeWKm+OBqOOBl+OBpuOAgeihjOOBlOOBqOOBruWSjOOCkui/lOOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpmcmVxdWVuY3kgPC0gcm93U3VtcyhkYXRhKSAgICAgICAgICAgICAgICAjIGRhdGHjga7ooYzjgZTjgajjga7nt4/lkozjgpJmcmVxdWVuY3njgavmoLzntI0NCmBgYA0K44CA6KiI566X5omL6aCG55qE44Gr44CB5b6X44KJ44KM44KL57WQ5p6c44Gn44GC44KLYGZyZXF1ZW5jeWDjgqrjg5bjgrjjgqfjgq/jg4jjga/jgIHlhaXlipvooYzliJfjga7ooYzmlbDjgajlkIzjgZjmlbDjgaDjgZHjga7opoHntKDjgYvjgonjgarjgovmlbDlgKTjg5njgq/jg4jjg6vjgavjgarjgorjgb7jgZnjgILjgaTjgb7jgorjgIHjgZ3jga7opoHntKDmlbDjga9gciBsZW5ndGgoZnJlcXVlbmN5KWDjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KbGVuZ3RoKGZyZXF1ZW5jeSkgICAgICAgICAgICAgICAgICAgICAgICAgIyBmcmVxdWVuY3njga7opoHntKDmlbANCmBgYA0K44CAYGZyZXF1ZW5jeWDjgqrjg5bjgrjjgqfjgq/jg4jjga7mnIDliJ3jga4z44Gk44Gu6KaB57Sg77yIYG4gPSAzYO+8ieOBp+eiuuiqjeOBl+OBvuOBmeOAgmRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5TUlLliJfjgafmiYvoqIjnrpfjgZXjgozjgovjgajliIbjgYvjgorjgb7jgZnjgYzjgIHoqIjnrpfntZDmnpzjga/norrjgYvjgavkuIDoh7TjgZfjgabjgYTjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaGVhZChmcmVxdWVuY3ksIG4gPSAzKSAgICAgICAgICAgICAgICAgICAgIyBmcmVxdWVuY3nkuK3jga7mnIDliJ3jga4z44Gk44KS6KGo56S6DQpgYGANCuOAgOOBquOBiuOAgWByb3dTdW1zYOmWouaVsOOBr+OAgVczLjEuM+OBp+e0ueS7i+OBl+OBn2BhcHBseWDplqLmlbDjgpJgTUFSR0lOID0gMWDjgYrjgojjgbNgRlVOID0gc3VtYOOBp+Wun+ihjOOBmeOCi+OBk+OBqOOBqOWQjOe+qeOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpob2dlIDwtIGFwcGx5KFggPSBkYXRhLCBNQVJHSU4gPSAxLCBGVU4gPSBzdW0pIyBkYXRh44Gu5ZCE6KGM44Gr5a++44GX44Gm5ZKM44KS6KiI566X44GX44Gf57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0KaGVhZChob2dlLCBuID0gMykgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl5Lit44Gu5pyA5Yid44GuM+OBpOOCkuihqOekug0KYGBgDQoNCiMjIyBXMy40LjIgYGlzLm5hYOmWouaVsA0K44CAYGlzLm5hYOmWouaVsOOBr+OAgeODmeOCr+ODiOODq+OCkuWFpeWKm+OBqOOBl+OBpuOAgeimgee0oOOBjE5B44GL44Gp44GG44GL44KSVFJVRSBvciBGQUxTReOBruirlueQhuWApOODmeOCr+ODiOODq+OBqOOBl+OBpui/lOOBl+OBvuOBmeOAguOBk+OCjOOCkuWxnuOBruS6iOa4rOe1kOaenOOBp+OBguOCi2BnZW51c2Djgqrjg5bjgrjjgqfjgq/jg4jjgpLlhaXlipvjgajjgZfjgablrp/ooYzjgZnjgovjgajjgIHkuojmuKzntZDmnpzjgYxOQeOBqOOBquOBo+OBn++8iGRhZGEy44Gn57O757Wx5Ymy44KK5b2T44Gm44GM44Gn44GN44Gq44GL44Gj44Gf77yJQVNW44Gr55u45b2T44GZ44KL6KaB57Sg44KSVFJVReOAgeOBneOBhuOBp+OBquOBhOimgee0oOOCkkZBTFNF44Go44GX44Gf57WQ5p6c44GM6L+U44GV44KM44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCm9iaiA8LSBpcy5uYShnZW51cykgICAgICAgICAgICAgICAgICAgICAgICMgZ2VudXPjga7lkITopoHntKDjgYxOQeOBi+OBqeOBhuOBi+OBruWIpOWumue1kOaenOOCkm9iauOBq+agvOe0jQ0KYGBgDQrjgIDlvpPjgaPjgabjgIFgb2JqYOS4reOBrlRSVUXjga7opoHntKDmlbDjga9gZ2VudXNg5Lit44Gu57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44Gq44GL44Gj44GfQVNW5pWw44Gr5a++5b+c44GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnN1bShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2Jq5Lit44GuVFJVReOBruimgee0oOaVsA0KYGBgDQoNCiMjIyBXMy40LjMg6KuW55CG5ryU566X5a2QIQ0K44CAYG9iamDkuK3jga5GQUxTReOBruimgee0oOaVsOOBr+OAgWBnZW51c2DkuK3jga7ns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ9BU1bmlbDjgavlr77lv5zjgZfjgb7jgZnjgILjgZPjga7mg4XloLHjgYzmrLLjgZfjgYTloLTlkIjjga/jgIHoq5bnkIblgKTjg5njgq/jg4jjg6vjga5UUlVF44GoRkFMU0XjgpLlhaXjgozmm7/jgYjjgabjgoTjgozjgbDjgojjgYTjgafjgZnjgILjgZPjgozjgpLlrp/nj77jgZnjgovjgavjga/jgIHjgqrjg5bjgrjjgqfjgq/jg4jjga7lt6blgbTjgatgIWDjgpLjgaTjgZHjgabjgoTjgozjgbDjgojjgYTjgafjgZnjgILjgaTjgb7jgorjgIEqKuirlueQhuWApOODmeOCr+ODiOODq+OBrlRSVUXjgahGQUxTReOCkuS6pOaPm+OBl+OBn+OBhOWgtOWQiOOBr+OAgeirlueQhua8lOeul+WtkOOBp+OBguOCi2AhYOOCkuOBpOOBkeOCjOOBsOOCiOOBhCoq44Gn44GZ44CCYCFvYmpg44Gu5pmC54K544GnVFJVReOBqEZBTFNF44GM5YWl44KM5pu/44KP44Gj44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnN1bSghb2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2Jq5Lit44GuRkFMU0Xjga7opoHntKDmlbANCmBgYA0KDQojIyMgVzMuNC40IOirlueQhua8lOeul+WtkCYNCuOAgOirlueQhua8lOeul+WtkCbjga/jgIHopoHntKDmlbDjgYzlkIzjgZgy44Gk6KuW55CG5YCk44OZ44Kv44OI44Or44KS5YWl5Yqb44Go44GX44Gm44CB5Lih5pa544Go44KCVFJVReOBruimgee0oOOBruOBv+OCklRSVUXjgIHjgZ3jgozku6XlpJbjgpJGQUxTReOBqOOBl+OBpui/lOOBl+OBvuOBmeOAguOBk+OCjOOCkuWIqeeUqOOBmeOCjOOBsOOAgeS7peS4i+OBrjLjgaTjga7oq5bnkIblgKTjg5njgq/jg4jjg6vjgpLliKnnlKjjgZfjgabjgIHjgIzns7vntbHlibLjgorlvZPjgabjga/jgafjgY3jgZ/jgYzjgIHmnKzmnaXmpJzlh7rjgZfjgZ/jgYTml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnjgavjga/lkKvjgb7jgozjgarjgYvjgaPjgZ9BU1bjga7opoHntKDjgI3jga7jgb/jgpJUUlVF44Go44GX44Gf6KuW55CG5YCk44OZ44Kv44OI44OrYG9ial9GUGDjgpLkvZzmiJDjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIINCg0KLSBgb2JqX1Bg77yaZGFkYTLjgaflsZ7jg6zjg5njg6vjga7ns7vntbHlibLjgorlvZPjgabjgYzjgafjgY3jgZ/vvIhOQeOBp+OBr+OBquOBhO+8iUFTVuOCklRSVUXjgIHjgZ3jgozku6XlpJbjgpJGQUxTReOBqOOBl+OBn+irlueQhuWApOODmeOCr+ODiOODqw0KLSBgb2JqX1RQYO+8muOAjOWxnuODrOODmeODq+OBruezu+e1seWJsuOCiuW9k+OBpue1kOaenO+8iGBnZW51c2DvvInjgYzmnKzmnaXmpJzlh7rjgZfjgZ/jgYTml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnvvIhgZ2VudXNfdHJ1dGhg77yJ44Gr5ZCr44G+44KM44KL44GL5ZCm44GL44KS5Yik5a6a44GX44Gf6KuW55CG5YCk44OZ44Kv44OI44OrDQoNCuOAgGBvYmpfRlBg44Gv44CB44CM5bGe44Os44OZ44Or44Gu57O757Wx5Ymy44KK5b2T44Gm44GM44Gn44GN44Gf77yITkHjgafjga/jgarjgYTvvIlBU1bjga7jgYbjgaHjgIHmnKzmnaXmpJzlh7rjgZfjgZ/jgYTml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCkqKuOBp+OBr+OBquOBhCoq44KC44Gu44Gu5L2N572u5oOF5aCx44CN44Gr55u45b2T44GX44G+44GZ44CC44GT44Gu5oOF5aCx44KS5b6X44KL44Gr44Gv44CBYG9ial9QICYgb2JqX1RQYOOBp+OBr+OBquOBj2BvYmpfUCAmICFvYmpfVFBg44Go44Gb44Gt44Gw44Gq44KJ44Gq44GE54K544Gr5rOo5oSP44GM5b+F6KaB44Gn44GZ44CC44CMKiouLi7jgafjga/jgarjgYQqKuOAjeOBquOBruOBp2Ahb2JqX1RQYOOBqOOBm+OBreOBsOOBquOCieOBquOBhOOBruOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpvYmpfUCA8LSAhaXMubmEoZ2VudXMpICAgICAgICAgICAgICAgICAgICAjIGdlbnVz44Gu5ZCE6KaB57Sg44GMTkHjgafjgarjgYTjgYvjganjgYbjgYvjga7liKTlrprntZDmnpzjgpJvYmpfUOOBq+agvOe0jQ0Kb2JqX1RQIDwtIGlzLmVsZW1lbnQoZ2VudXMsIGdlbnVzX3RydXRoKSAgIyBnZW51c+S4reOBruWQhOimgee0oOOBjGdlbnVzX3RydXRo44Gr5ZCr44G+44KM44KL44GL44Gp44GG44GL44Gu5Yik5a6a57WQ5p6c44KSb2JqX1RQ44Gr5qC857SNDQpvYmpfRlAgPC0gb2JqX1AgJiAhb2JqX1RQICAgICAgICAgICAgICAgICAjIG9ial9Q44GoIW9ial9UUOOBruS4oeaWueOBp1RSVUXjga7opoHntKDjga7jgb/jgpJUUlVF44Go44GX44Gf57WQ5p6c44KSb2JqX0ZQ44Gr5qC857SNDQpgYGANCuOAgGBvYmpfUGDjga5UUlVF44Gu6KaB57Sg5pWw44GvYHIgc3VtKG9ial9QKWDjgafjgZnjgIJXMy4044Gu5YaS6aCt44Gu5oOF5aCx44GL44KJ44KC44GC44KL56iL5bqm5oOz5YOP44GM44Gk44GN44G+44GZ44GM44CBYHN1bShvYmpfUClg44GoYGxlbmd0aChuYS5vbWl0KGdlbnVzKSlg44Gv44CB5LqI5ris57WQ5p6c44Gu6Zm95oCn5pWw77yIZGFkYTLlrp/ooYzntZDmnpzjgajjgZfjgablvpfjgonjgozjgZ/lsZ7jga7mlbDvvInjgavnm7jlvZPjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc3VtKG9ial9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmpfUOS4reOBrlRSVUXjga7opoHntKDmlbANCmBgYA0K44CAYG9ial9UUGDjga5UUlVF44Gu6KaB57Sg5pWw44GvYHIgc3VtKG9ial9UUClg44Gn44GZ44CC44GT44KM44Gv44CBVzMuMy4344Gu44CM5bGe44Os44OZ44Or77yI6YeN6KSH44GC44KK77yJ44CN44Gu5Lit44Gu44CB44CM6Zm95oCn44Go5Yik5a6a44GV44KM44KL44G544GN5bGe44Gu44GG44Gh44CB5q2j44GX44GP6Zm95oCn44Go5Yik5a6a44Gn44GN44Gf5bGe44Gu5pWw77yIVHJ1ZSBQb3NpdGl2ZTsgVFDvvInjgI3jgavnm7jlvZPjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc3VtKG9ial9UUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmpfVFDkuK3jga5UUlVF44Gu6KaB57Sg5pWwDQpgYGANCuOAgGBvYmpfRlBg44GuVFJVReOBruimgee0oOaVsOOBr2ByIHN1bShvYmpfRlApYOOBp+OBmeOAguOBk+OCjOOBr+OAgVczLjMuN+OBruOAjOWxnuODrOODmeODq++8iOmHjeikh+OBguOCiu+8ieOAjeOBruS4reOBruOAgeOAjOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeWxnuOBruOBhuOBoeOAgemWk+mBleOBo+OBpumZveaAp+OBqOWIpOWumuOBl+OBn+WxnuOBruaVsO+8iEZhbHNlIFBvc2l0aXZlOyBGUO+8ieOAjeOBq+ebuOW9k+OBl+OBvuOBmeOAguOBk+OBruaVsOiHquS9k+OBr+OAgWBzdW0ob2JqX1ApIC0gc3VtKG9ial9UUClgID0gYHIgc3VtKG9ial9QKWAgLSBgciBzdW0ob2JqX1RQKWDjgYvjgonjgoLnsKHljZjjgavnrpflh7rjgafjgY3jgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc3VtKG9ial9GUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmpfRlDkuK3jga5UUlVF44Gu6KaB57Sg5pWwDQpgYGANCg0KIyMjIFczLjQuNSDpganlkIjnjofvvIjlsZ7jg6zjg5njg6vvvIkNCuOAgOWHuuePvumgu+W6puOCkuWKoOWRs+OBl+OBn+WxnuODrOODmeODq+OBrumBqeWQiOeOh+OBr+OAgeS7peS4i+OBruOCiOOBhuOBquaEn+OBmOOBp+eul+WHuuOBl+OBvuOBmeOAguacgOWIneOBrjTooYzjga/jgIHjgYrjgZXjgonjgYTjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZnJlcXVlbmN5IDwtIHJvd1N1bXMoZGF0YSkgICAgICAgICAgICAgICAgIyBkYXRh44Gu6KGM44GU44Go44Gu57eP5ZKM44KSZnJlcXVlbmN544Gr5qC857SNDQpvYmpfUCA8LSAhaXMubmEoZ2VudXMpICAgICAgICAgICAgICAgICAgICAjIGdlbnVz44Gu5ZCE6KaB57Sg44GMTkHjgafjgarjgYTjgYvjganjgYbjgYvjga7liKTlrprntZDmnpzjgpJvYmpfUOOBq+agvOe0jQ0Kb2JqX1RQIDwtIGlzLmVsZW1lbnQoZ2VudXMsIGdlbnVzX3RydXRoKSAgIyBnZW51c+S4reOBruWQhOimgee0oOOBjGdlbnVzX3RydXRo44Gr5ZCr44G+44KM44KL44GL44Gp44GG44GL44Gu5Yik5a6a57WQ5p6c44KSb2JqX1RQ44Gr5qC857SNDQpvYmpfRlAgPC0gb2JqX1AgJiAhb2JqX1RQICAgICAgICAgICAgICAgICAjIG9ial9Q44GoIW9ial9UUOOBruS4oeaWueOBp1RSVUXjga7opoHntKDjga7jgb/jgpJUUlVF44Go44GX44Gf57WQ5p6c44KSb2JqX0ZQ44Gr5qC857SNDQoNClRQIDwtIHN1bShmcmVxdWVuY3lbb2JqX1RQXSkgICAgICAgICAgICAgICMgb2JqX1RQ44GMVFJVReOBrmZyZXF1ZW5jeeOBrue3j+WSjOOCkuioiOeul+OBl+OBn+e1kOaenOOCklRQ44Gr5qC857SNDQpGUCA8LSBzdW0oZnJlcXVlbmN5W29ial9GUF0pICAgICAgICAgICAgICAjIG9ial9GUOOBjFRSVUXjga5mcmVxdWVuY3njga7nt4/lkozjgpLoqIjnrpfjgZfjgZ/ntZDmnpzjgpJGUOOBq+agvOe0jQ0KcHJlY2lzaW9uIDwtIFRQIC8gKFRQICsgRlApICAgICAgICAgICAgICAgIyDpganlkIjnjofjgpLoqIjnrpfjgZfjgZ/ntZDmnpzjgpJwcmVjaXNpb27jgavmoLzntI0NCnByZWNpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlY2lzaW9u44Gu5Lit6LqrDQpgYGANCuOAgOWHuuePvumgu+W6puaDheWgseOCkuWKoOWRs+OBl+OBn+WxnuODrOODmeODq+OBrumBqeWQiOeOh+OBr2ByIHByZWNpc2lvbmDjgajjgarjgorjgIFXMy4z44Gn6KGM44Gj44Gf44CM5Ye654++6aC75bqm5oOF5aCx44KS5Yqg5ZGz44GX44Gq44GE44CB6YeN6KSH44GC44KK5bGe44Os44OZ44Or44Gu6YGp5ZCI546H77yIYHIgcHJlY2lzaW9uX2dlbnVzX2R1cGDvvInjgI3jgajmr5TjgbnjgabpnZ7luLjjgavpq5jjgYTjgZPjgajjgYzliIbjgYvjgorjgb7jgZnjgILjgZPjga7nkIbnlLHjga/jgIHjgIzpmb3mgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3lsZ7jga7jgYbjgaHjgIHmraPjgZfjgY/pmb3mgKfjgajliKTlrprjgafjgY3jgZ/lsZ7jgI3jga7lh7rnj77poLvluqbjga7nt4/lkozvvIhgVFBg77yJ44GM44CB44CM6Zmw5oCn44Go5Yik5a6a44GV44KM44KL44G544GN5bGe44Gu44GG44Gh44CB6ZaT6YGV44Gj44Gm6Zm95oCn44Go5Yik5a6a44GX44Gf5bGe44CN44Gu5Ye654++6aC75bqm44Gu57eP5ZKM77yIYEZQYO+8ieOCiOOCiuOCguOBi+OBquOCiuWkmuOBhOOBn+OCgeOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpUUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRQ44Gu5Lit6LqrDQpGUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZQ44Gu5Lit6LqrDQpgYGANCuOAgFczLjMuN+OChFczLjQuNOOBp+OCguekuuOBl+OBn+OAjOmZveaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeWxnuOBruOBhuOBoeOAgeato+OBl+OBj+mZveaAp+OBqOWIpOWumuOBp+OBjeOBn+WxnuOAjeOBruaVsO+8iGBzdW0ob2JqX1RQKWDvvInjgajjgIHjgIzpmbDmgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3lsZ7jga7jgYbjgaHjgIHplpPpgZXjgaPjgabpmb3mgKfjgajliKTlrprjgZfjgZ/lsZ7jgI3jga7mlbDvvIhgc3VtKG9ial9GUCkgYO+8ieOBruWkp+Wwj+mWouS/guOBqOavlOi8g+OBl+OBpuOBhOOBn+OBoOOBkeOCjOOBsOOAgeWHuuePvumgu+W6puaDheWgseOBvuOBp+WKoOWRs+OBmeOCi+OBk+OBqOOBruaEj+WRs+OBjOOCiOOBj+OCj+OBi+OCi+OBqOaAneOBhOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpzdW0ob2JqX1RQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9ial9UUOS4reOBrlRSVUXjga7opoHntKDmlbANCnN1bShvYmpfRlApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2JqX0ZQ5Lit44GuVFJVReOBruimgee0oOaVsA0KYGBgDQoNCiMjIyBXMy40LjYg6YGp5ZCI546H77yI56iu44Os44OZ44Or77yJDQrjgIDlh7rnj77poLvluqbjgpLliqDlkbPjgZfjgZ/nqK7jg6zjg5njg6vjga7pganlkIjnjofjga/jgIHku6XkuIvjga7jgojjgYbjgarmhJ/jgZjjgafnrpflh7rjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZnJlcXVlbmN5IDwtIHJvd1N1bXMoZGF0YSkgICAgICAgICAgICAgICAgIyBkYXRh44Gu6KGM44GU44Go44Gu57eP5ZKM44KSZnJlcXVlbmN544Gr5qC857SNDQpvYmpfUCA8LSAhaXMubmEoc3BlY2llcykgICAgICAgICAgICAgICAgICAjIHNwZWNpZXPjga7lkITopoHntKDjgYxOQeOBp+OBquOBhOOBi+OBqeOBhuOBi+OBruWIpOWumue1kOaenOOCkm9ial9Q44Gr5qC857SNDQpvYmpfVFAgPC0gaXMuZWxlbWVudChzcGVjaWVzLCBzcGVjaWVzX3RydXRoKSAjIHNwZWNpZXPkuK3jga7lkITopoHntKDjgYxzcGVjaWVzX3RydXRo44Gr5ZCr44G+44KM44KL44GL44Gp44GG44GL44Gu5Yik5a6a57WQ5p6c44KSb2JqX1RQ44Gr5qC857SNDQpvYmpfRlAgPC0gb2JqX1AgJiAhb2JqX1RQICAgICAgICAgICAgICAgICAjIG9ial9Q44GoIW9ial9UUOOBruS4oeaWueOBp1RSVUXjga7opoHntKDjga7jgb/jgpJUUlVF44Go44GX44Gf57WQ5p6c44KSb2JqX0ZQ44Gr5qC857SNDQoNClRQIDwtIHN1bShmcmVxdWVuY3lbb2JqX1RQXSkgICAgICAgICAgICAgICMgb2JqX1RQ44GMVFJVReOBrmZyZXF1ZW5jeeOBrue3j+WSjOOCkuioiOeul+OBl+OBn+e1kOaenOOCklRQ44Gr5qC857SNDQpGUCA8LSBzdW0oZnJlcXVlbmN5W29ial9GUF0pICAgICAgICAgICAgICAjIG9ial9GUOOBjFRSVUXjga5mcmVxdWVuY3njga7nt4/lkozjgpLoqIjnrpfjgZfjgZ/ntZDmnpzjgpJGUOOBq+agvOe0jQ0KcHJlY2lzaW9uIDwtIFRQIC8gKFRQICsgRlApICAgICAgICAgICAgICAgIyDpganlkIjnjofjgpLoqIjnrpfjgZfjgZ/ntZDmnpzjgpJwcmVjaXNpb27jgavmoLzntI0NCnByZWNpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlY2lzaW9u44Gu5Lit6LqrDQpgYGANCuOAgOWHuuePvumgu+W6puaDheWgseOCkuWKoOWRs+OBl+OBn+eoruODrOODmeODq+OBrumBqeWQiOeOh+OBr2ByIHByZWNpc2lvbmDjgajjgarjgorjgIFXMy4z44Gn6KGM44Gj44Gf44CM5Ye654++6aC75bqm5oOF5aCx44KS5Yqg5ZGz44GX44Gq44GE44CB6YeN6KSH44GC44KK56iu44Os44OZ44Or44Gu6YGp5ZCI546H77yIYHIgcHJlY2lzaW9uX3NwZWNpZXNfZHVwYO+8ieOAjeOBqOavlOOBueOBpuWwkeOBl+mrmOOBhOeoi+W6puOBp+OAgeOBneOCjOOBu+OBqeWkieOCj+OCieOBquOBhOOBk+OBqOOBjOWIhuOBi+OCiuOBvuOBmeOAguOAjOmZveaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgeato+OBl+OBj+mZveaAp+OBqOWIpOWumuOBp+OBjeOBn+eoruOAjeOBruWHuuePvumgu+W6puOBrue3j+WSjO+8iGBUUGDvvInjgajjgIzpmbDmgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3lsZ7jga7jgYbjgaHjgIHplpPpgZXjgaPjgabpmb3mgKfjgajliKTlrprjgZfjgZ/nqK7jgI3jga7lh7rnj77poLvluqbjga7nt4/lkozvvIhgRlBg77yJ44Gv44CB5LiL6KiY44Gu6YCa44KK44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NClRQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVFDjga7kuK3ouqsNCkZQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRlDjga7kuK3ouqsNCmBgYA0K44CAVzMuMy4344Gn44KC56S644GX44Gf44CM6Zm95oCn44Go5Yik5a6a44GV44KM44KL44G544GN56iu44Gu44GG44Gh44CB5q2j44GX44GP6Zm95oCn44Go5Yik5a6a44Gn44GN44Gf56iu44CN44Gu5pWw77yIYHN1bShvYmpfVFApYO+8ieOBqOOAgeOAjOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeeoruOBruOBhuOBoeOAgemWk+mBleOBo+OBpumZveaAp+OBqOWIpOWumuOBl+OBn+eoruOAjeOBruaVsO+8iGBzdW0ob2JqX0ZQKSBg77yJ44Gv5Lul5LiL44Gu6YCa44KK44Gn44GX44Gf44CC56iu44Os44OZ44Or44Gu5aC05ZCI44Gv44CB5Ye654++6aC75bqm5oOF5aCx44G+44Gn5Yqg5ZGz44GX44Gm44KC6YGp5ZCI546H44Gu5YCk44Gv44Gd44KM44G744Gp5aSJ44KP44KJ44Gq44GE55CG55Sx44Gv44CB57O757Wx5Ymy44KK5b2T44Gm44GM44Gn44GN44Gf56iu44Gu57W25a++5pWw44GM5bCR44Gq44GE44Gf44KB44Go44GE44GI44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnN1bShvYmpfVFApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2JqX1RQ5Lit44GuVFJVReOBruimgee0oOaVsA0Kc3VtKG9ial9GUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmpfRlDkuK3jga5UUlVF44Gu6KaB57Sg5pWwDQpgYGANCg0KIyMjIFczLjQuNyDjgb7jgajjgoHjgablrp/ooYwNCuOAgFczLjTjga7jgrnjgq/jg6rjg5fjg4jjgpLku6XkuIvjgavjgb7jgajjgoHjgb7jgZnjgILjgZ/jgaDjgZfjgIFXMy4yLjjjgYrjgojjgbNXMy4zLjbjgaflvpfjgonjgozjgovjgqrjg5bjgrjjgqfjgq/jg4jjgajljLrliKXjgZnjgovlv4XopoHjgYzjgYLjgovjga7jgafjgIHmnIDntYLnmoTjgarjgqrjg5bjgrjjgqfjgq/jg4jlkI3jga/lpInjgYjjgabjgYTjgb7jgZnjgILjgZPjgozjgpLlrp/ooYzjgZnjgovjgZ/jgoHjgavlv4XopoHjgao144Gk44Gu44Kq44OW44K444Kn44Kv44OI77yIYGRhdGFgLCBgZ2VudXNfdHJ1dGhgLCBgZ2VudXNgLCBgc3BlY2llc190cnV0aGAsIGFuZCBgc3BlY2llc2DvvInjga/jgIFXMi4z44KS5a6f6KGM44GZ44KM44Gw5b6X44KJ44KM44G+44GZ44CCVzMuMy4244Go44OO44Oq44GM6Iul5bmy6YGV44GG54K544Go44GX44Gm44Gv44CB5bGe44Os44OZ44Or44O756iu44Os44OZ44Or44Gu6YGp5ZCI546H6KiI566X6YOo5YiG44Gu44K544Kv44Oq44OX44OI44KS57Wx5LiA44GZ44G544GP44CB5LiA5pemYGhvZ2Vg44GK44KI44GzYGhvZ2VfdHJ1dGhg44Gr44GX44Gm44GE44G+44GZ44CC5L2c5qWt55qE44Gr6Kqk5beu56+E5Zuy44Go44GE44GG6ICD44GI5pa544KC44GC44KL44GL44Go44Gv5oCd44GE44G+44GZ44GM44CB44GT44Gu44KI44GG44Gq56mN44G/6YeN44Gt44GM44Kq44OW44K444Kn44Kv44OI5ZCN5aSJ5pu044Of44K555m655Sf546H44KS5LiL44GS44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmZyZXF1ZW5jeSA8LSByb3dTdW1zKGRhdGEpICAgICAgICAgICAgICAgICMgZGF0YeOBruihjOOBlOOBqOOBrue3j+WSjOOCkmZyZXF1ZW5jeeOBq+agvOe0jQ0KIyDlsZ7jg6zjg5njg6vjga7pganlkIjnjocNCmhvZ2UgPC0gZ2VudXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2VudXPjgpJob2dl44Gr44Kz44OU44O8DQpob2dlX3RydXRoIDwtIGdlbnVzX3RydXRoICAgICAgICAgICAgICAgICAjIGdlbnVzX3RydXRo44KSaG9nZV90cnV0aOOBq+OCs+ODlOODvA0Kb2JqX1AgPC0gIWlzLm5hKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgIyBob2dl44Gu5ZCE6KaB57Sg44GMTkHjgafjgarjgYTjgYvjganjgYbjgYvjga7liKTlrprntZDmnpzjgpJvYmpfUOOBq+agvOe0jQ0Kb2JqX1RQIDwtIGlzLmVsZW1lbnQoaG9nZSwgaG9nZV90cnV0aCkgICAgIyBob2dl5Lit44Gu5ZCE6KaB57Sg44GMaG9nZV90cnV0aOOBq+WQq+OBvuOCjOOCi+OBi+OBqeOBhuOBi+OBruWIpOWumue1kOaenOOCkm9ial9UUOOBq+agvOe0jQ0Kb2JqX0ZQIDwtIG9ial9QICYgIW9ial9UUCAgICAgICAgICAgICAgICAgIyBvYmpfUOOBqCFvYmpfVFDjga7kuKHmlrnjgadUUlVF44Gu6KaB57Sg44Gu44G/44KSVFJVReOBqOOBl+OBn+e1kOaenOOCkm9ial9GUOOBq+agvOe0jQ0KVFAgPC0gc3VtKGZyZXF1ZW5jeVtvYmpfVFBdKSAgICAgICAgICAgICAgIyBvYmpfVFDjgYxUUlVF44GuZnJlcXVlbmN544Gu57eP5ZKM44KS6KiI566X44GX44Gf57WQ5p6c44KSVFDjgavmoLzntI0NCkZQIDwtIHN1bShmcmVxdWVuY3lbb2JqX0ZQXSkgICAgICAgICAgICAgICMgb2JqX0ZQ44GMVFJVReOBrmZyZXF1ZW5jeeOBrue3j+WSjOOCkuioiOeul+OBl+OBn+e1kOaenOOCkkZQ44Gr5qC857SNDQpwcmVjaXNpb24gPC0gVFAgLyAoVFAgKyBGUCkgICAgICAgICAgICAgICAjIOmBqeWQiOeOh+OCkuioiOeul+OBl+OBn+e1kOaenOOCknByZWNpc2lvbuOBq+agvOe0jQ0KIyDjgqrjg5bjgrjjgqfjgq/jg4jlkI3jga7lpInmm7QNClRQX2dlbnVzX2ZyZXEgPC0gVFAgICAgICAgICAgICAgICAgICAgICAgICMgVFDjgpJUUF9nZW51c19mcmVx44Gr44Kz44OU44O8DQpGUF9nZW51c19mcmVxIDwtIEZQICAgICAgICAgICAgICAgICAgICAgICAjIEZQ44KSRlBfZ2VudXNfZnJlceOBq+OCs+ODlOODvA0KcHJlY2lzaW9uX2dlbnVzX2ZyZXEgPC0gcHJlY2lzaW9uICAgICAgICAgIyBwcmVjaXNpb27jgpJwcmVjaXNpb25fZ2VudXNfZnJlceOBq+OCs+ODlOODvA0KDQojIOeoruODrOODmeODq+OBrumBqeWQiOeOhw0KaG9nZSA8LSBzcGVjaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWVz44KSaG9nZeOBq+OCs+ODlOODvA0KaG9nZV90cnV0aCA8LSBzcGVjaWVzX3RydXRoICAgICAgICAgICAgICAgIyBzcGVjaWVzX3RydXRo44KSaG9nZV90cnV0aOOBq+OCs+ODlOODvA0Kb2JqX1AgPC0gIWlzLm5hKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgIyBob2dl44Gu5ZCE6KaB57Sg44GMTkHjgafjgarjgYTjgYvjganjgYbjgYvjga7liKTlrprntZDmnpzjgpJvYmpfUOOBq+agvOe0jQ0Kb2JqX1RQIDwtIGlzLmVsZW1lbnQoaG9nZSwgaG9nZV90cnV0aCkgICAgIyBob2dl5Lit44Gu5ZCE6KaB57Sg44GMaG9nZV90cnV0aOOBq+WQq+OBvuOCjOOCi+OBi+OBqeOBhuOBi+OBruWIpOWumue1kOaenOOCkm9ial9UUOOBq+agvOe0jQ0Kb2JqX0ZQIDwtIG9ial9QICYgIW9ial9UUCAgICAgICAgICAgICAgICAgIyBvYmpfUOOBqCFvYmpfVFDjga7kuKHmlrnjgadUUlVF44Gu6KaB57Sg44Gu44G/44KSVFJVReOBqOOBl+OBn+e1kOaenOOCkm9ial9GUOOBq+agvOe0jQ0KVFAgPC0gc3VtKGZyZXF1ZW5jeVtvYmpfVFBdKSAgICAgICAgICAgICAgIyBvYmpfVFDjgYxUUlVF44GuZnJlcXVlbmN544Gu57eP5ZKM44KS6KiI566X44GX44Gf57WQ5p6c44KSVFDjgavmoLzntI0NCkZQIDwtIHN1bShmcmVxdWVuY3lbb2JqX0ZQXSkgICAgICAgICAgICAgICMgb2JqX0ZQ44GMVFJVReOBrmZyZXF1ZW5jeeOBrue3j+WSjOOCkuioiOeul+OBl+OBn+e1kOaenOOCkkZQ44Gr5qC857SNDQpwcmVjaXNpb24gPC0gVFAgLyAoVFAgKyBGUCkgICAgICAgICAgICAgICAjIOmBqeWQiOeOh+OCkuioiOeul+OBl+OBn+e1kOaenOOCknByZWNpc2lvbuOBq+agvOe0jQ0KIyDjgqrjg5bjgrjjgqfjgq/jg4jlkI3jga7lpInmm7QNClRQX3NwZWNpZXNfZnJlcSA8LSBUUCAgICAgICAgICAgICAgICAgICAgICMgVFDjgpJUUF9zcGVjaWVzX2ZyZXHjgavjgrPjg5Tjg7wNCkZQX3NwZWNpZXNfZnJlcSA8LSBGUCAgICAgICAgICAgICAgICAgICAgICMgRlDjgpJGUF9zcGVjaWVzX2ZyZXHjgavjgrPjg5Tjg7wNCnByZWNpc2lvbl9zcGVjaWVzX2ZyZXEgPC0gcHJlY2lzaW9uICAgICAgICMgcHJlY2lzaW9u44KScHJlY2lzaW9uX3NwZWNpZXNfZnJlceOBq+OCs+ODlOODvA0KYGBgDQoNCiMjIyBXMy40LjggVzMuNOOBruOBvuOBqOOCgQ0K44CA44GT44GT44Gn44Gv44CBKirlh7rnj77poLvluqbjgpLliqDlkbPjgZfjgZ/loLTlkIjjga7mgKfog73oqZXkvqEqKuOBqOOBl+OBpuOAgeWxnuODrOODmeODq+OBqOeoruODrOODmeODq+OBrumBqeWQiOeOh+OCkueul+WHuuOBl+OBvuOBl+OBn+OAgmRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjgafjga/jgIFBU1bjga7phY3liJfjgYzpgZXjgaPjgabjgYTjgabjgoLlkIzjgZjlsZ7jgoTnqK7jgavlibLjgorlvZPjgabjgonjgozjgovjgZPjgajjgYzjgYLjgorjgb7jgZnjgILjgZ3jgZfjgabjgIHlgIvjgIXjga5BU1bphY3liJfjga/lh7rnj77poLvluqbmg4XloLHjgpLmjIHjgaHjgb7jgZnjgILjgZPjgZPjgafooYzjgaPjgZ/jga7jga/jgIHlsZ7lkI3jgYzjgaTjgYTjgZ9BU1bphY3liJfjga7nt4/lh7rnj77poLvluqbvvIjlhajpmb3mgKfmlbAgPSBUUCArIEZQ77yJ44Gu44GG44Gh44CB6KiIMTnlsZ7vvIgyMueoru+8ieOBruaXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeeUseadpeOBrue3j+WHuuePvumgu+W6pu+8iD0gVFDvvInjgYzjganjga7nqIvluqblkKvjgb7jgozjgabjgYTjgovjga7jgYvvvIjjgaTjgb7jgorpganlkIjnjofvvInjgpLoqZXkvqHjgZfjgabjgYTjgb7jgZnjgIINCg0KLSDlsZ7jg6zjg5njg6sNCiAgLSDkuojmuKzntZDmnpzjga7pmb3mgKfmlbDvvIhkYWRhMuWun+ihjOe1kOaenOOBqOOBl+OBpuW+l+OCieOCjOOBn+WxnuOBrue3j+WHuuePvumgu+W6pu+8ie+8mmByIGZvcm1hdEMoVFBfZ2VudXNfZnJlcSArIEZQX2dlbnVzX2ZyZXEsIGZvcm1hdCA9ICJmZyIpYA0KICAtIOmZveaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeWxnuOBruOBhuOBoeOAgSoq5q2j44GX44GP6Zm95oCnKirjgajliKTlrprjgafjgY3jgZ/lsZ7jga7nt4/lh7rnj77poLvluqbvvIgqKlRydWUgUG9zaXRpdmUqKjsgVFDvvInvvJpgciBmb3JtYXRDKFRQX2dlbnVzX2ZyZXEsIGZvcm1hdCA9ICJmZyIpYA0KICAtIOmZsOaAp+OBqOWIpOWumuOBleOCjOOCi+OBueOBjeWxnuOBruOBhuOBoeOAgSoq6ZaT6YGV44Gj44Gm6Zm95oCnKirjgajliKTlrprjgZfjgZ/lsZ7jga7nt4/lh7rnj77poLvluqbvvIgqKkZhbHNlIFBvc2l0aXZlKio7IEZQ77yJ77yaYHIgZm9ybWF0QyhGUF9nZW51c19mcmVxLCBmb3JtYXQgPSAiZmciKWANCiAgLSDpganlkIjnjofvvIhwcmVjaXNpb27vvInvvJpUUCAvIChUUCArIEZQKSA9IGByIGZvcm1hdEMoVFBfZ2VudXNfZnJlcSwgZm9ybWF0ID0gImZnIilgIC8gKGByIGZvcm1hdEMoVFBfZ2VudXNfZnJlcSwgZm9ybWF0ID0gImZnIilgICsgYHIgZm9ybWF0QyhGUF9nZW51c19mcmVxLCBmb3JtYXQgPSAiZmciKWApID0gYHIgcHJlY2lzaW9uX2dlbnVzX2ZyZXFgDQoNCi0g56iu44Os44OZ44OrDQogIC0g5LqI5ris57WQ5p6c44Gu6Zm95oCn5pWw77yIZGFkYTLlrp/ooYzntZDmnpzjgajjgZfjgablvpfjgonjgozjgZ/nqK7jga7nt4/lh7rnj77poLvluqbvvInvvJpgciBmb3JtYXRDKFRQX3NwZWNpZXNfZnJlcSArIEZQX3NwZWNpZXNfZnJlcSwgZm9ybWF0ID0gImZnIilgDQogIC0g6Zm95oCn44Go5Yik5a6a44GV44KM44KL44G544GN56iu44Gu44GG44Gh44CBKirmraPjgZfjgY/pmb3mgKcqKuOBqOWIpOWumuOBp+OBjeOBn+eoruOBrue3j+WHuuePvumgu+W6pu+8iCoqVHJ1ZSBQb3NpdGl2ZSoqOyBUUO+8ie+8mmByIGZvcm1hdEMoVFBfc3BlY2llc19mcmVxLCBmb3JtYXQgPSAiZmciKWANCiAgLSDpmbDmgKfjgajliKTlrprjgZXjgozjgovjgbnjgY3nqK7jga7jgYbjgaHjgIEqKumWk+mBleOBo+OBpumZveaApyoq44Go5Yik5a6a44GX44Gf56iu44Gu57eP5Ye654++6aC75bqm77yIKipGYWxzZSBQb3NpdGl2ZSoqOyBGUO+8ie+8mmByIGZvcm1hdEMoRlBfc3BlY2llc19mcmVxLCBmb3JtYXQgPSAiZmciKWANCiAgLSDpganlkIjnjofvvIhwcmVjaXNpb27vvInvvJpUUCAvIChUUCArIEZQKSA9IGByIGZvcm1hdEMoVFBfc3BlY2llc19mcmVxLCBmb3JtYXQgPSAiZmciKWAgLyAoYHIgZm9ybWF0QyhUUF9zcGVjaWVzX2ZyZXEsIGZvcm1hdCA9ICJmZyIpYCArIGByIGZvcm1hdEMoRlBfc3BlY2llc19mcmVxLCBmb3JtYXQgPSAiZmciKWApID0gYHIgcHJlY2lzaW9uX3NwZWNpZXNfZnJlcWANCg0KIyMgVzMuNSDlsZ7jgZTjgajjga7lh7rnj77poLvluqYNCuOAgOOBk+OCjOOBvuOBp+OBruino+aekOOBp+OAgeioiDEy5YCL44Gu44K144Oz44OX44Or5YWo5L2T44Go44GX44Gm44CB6KiIMTnlsZ7jgYvjgonmp4vmiJDjgZXjgozjgovml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnkuK1gciBzdW0oaXMuZWxlbWVudChnZW51c190cnV0aCwgZ2VudXMpKWDlsZ7jgYxkYWRhMuWun+ihjOe1kOaenOOBqOOBl+OBpuaknOWHuuOBleOCjOOBpuOBhOOBvuOBme+8iFczLjIuOe+8ieOAguOBvuOBn+OAgeezu+e1seWJsuOCiuW9k+OBpuOBq+OCiOOBo+OBpmByIFRQX2dlbnVzX2R1cCArIEZQX2dlbnVzX2R1cGDlgIvjga5BU1bphY3liJfjgavlr77jgZfjgaZOQeS7peWkluOBruWxnuWQjeOBjOS7mOS4juOBleOCjOOAgeOBneOBruOBhuOBoWByIFRQX2dlbnVzX2R1cGDlgIvjgYzml6Lnn6Xlvq7nlJ/niannvqTpm4bnlLHmnaXjga5BU1bjgafjgYLjgovjgZPjgajjgYzliIbjgYvjgaPjgabjgYTjgb7jgZnvvIhXMy4zLjfvvInjgILlkIRBU1bphY3liJfjgYzjgoLjgaTlh7rnj77poLvluqbmg4XloLHjgpLliqDlkbPjgZnjgovjgajjgIHml6Lnn6Xlvq7nlJ/niannvqTpm4bnlLHmnaXjga5gciBUUF9nZW51c19kdXBg5YCL44GuQVNW44Gu57eP5Ye654++6aC75bqm77yIYHIgZm9ybWF0QyhUUF9nZW51c19mcmVxLCBmb3JtYXQgPSAiZmciKWDvvInjga/jgIHjgZ3jgozku6XlpJbjga5gciBGUF9nZW51c19kdXBg5YCL44GuQVNW44Gu57eP5Ye654++6aC75bqm77yIYHIgZm9ybWF0QyhGUF9nZW51c19mcmVxLCBmb3JtYXQgPSAiZmciKWDvvInjgojjgorjgoLlpKfjgY3jgarlgKTjgavjgarjgovjgZPjgajjgoLliIbjgYvjgaPjgabjgYTjgb7jgZnvvIhXMy40LjjvvInjgILjgZPjgZPjgafjga/jgIHoqIgxOeWxnuOBi+OCieani+aIkOOBleOCjOOCi+aXouefpeW+rueUn+eJqee+pOmbhltITS0yODBdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvQ2F0YWxvZy9vdGhlclByb2R1Y3RzL0hNLTI4MC5hc3B4KeS4reOBruWAi+OAheOBruWxnuOBrue3j+WHuuePvumgu+W6puOBruaDheWgseOCkuW+l+OBvuOBmeOAguOBvuOBn+OAgeioiDE55bGe5Lul5aSW44Gu5bGe44Gvb3RoZXJz44Go44GX44GmMeOBpOOBq+OBvuOBqOOCgeOBvuOBmeOAgg0KDQojIyMgVzMuNS4xIGByZXBg6Zai5pWwDQrjgIBgcmVwYOmWouaVsOOBr+OAgWB4YOOBp+aMh+WumuOBl+OBn+WApOOCkuOAgWB0aW1lc2DjgafmjIflrprjgZfjgZ/lm57mlbDliIbjgaDjgZHnlJ/miJDjgZfjgb7jgZnjgIJgeGDjgafmjIflrprjgZfjgZ9gaG9nZTFg44Gv5Luu5oOz44Gu77yIZGFkYTLjgafmpJzlh7rjgZXjgozjgZ/vvInlsZ7lkI3jgIFgdGltZXNg44Gn5oyH5a6a44GX44GfYGhvZ2UyYOOBr+S7ruaDs+OBruWHuuePvumgu+W6puOCkuihqOOBl+OBvuOBmeOAgiJCIuOCkjLjgYvmiYDjgavliIbjgZHjgaboqJjovInjgZfjgabjgYTjgovjga7jga/jgIHnlbDjgarjgotBU1bjgaflkIzjgZjlsZ7jgavlibLjgorlvZPjgabjgonjgozjgovjgoLjga7jgpLlv7XpoK3jgavjgYrjgYTjgabjgYTjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaG9nZTEgPC0gYygiQiIsICJEIiwgIkEiLCAiQiIpICAgICAgICAgICAgIyDku67mg7PlsZ7lkI3mg4XloLHjgpJob2dlMeOBq+agvOe0jQ0KaG9nZTIgPC0gYygyLCA0LCAzLCAxKSAgICAgICAgICAgICAgICAgICAgIyDku67mg7Plh7rnj77poLvluqbjgpJob2dlMuOBq+agvOe0jQ0KZnJlcSA8LSByZXAoeCA9IGhvZ2UxLCB0aW1lcyA9IGhvZ2UyKSAgICAgIyBob2dlMeOCkmhvZ2Uy44Gu5oyH5a6a5Zue5pWw5YiG55Sf5oiQ44GX44Gf57WQ5p6c44KSZnJlceOBq+agvOe0jQ0KZnJlcSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmcmVx44Gu5Lit6LqrDQpgYGANCuOAgGBmcmVxYOOCkuWFpeWKm+OBqOOBl+OBpmB0YWJsZWDplqLmlbDjgpLlrp/ooYzjgZnjgovjgajjgIHopoHntKDjga7nqK7poZ7jgZTjgajjga7lh7rnj77poLvluqbjgYzov5TjgZXjgozjgb7jgZnjgIIiQiLjga7lh7rnj77poLvluqbjgYzmhI/lm7PpgJrjgooz44Gr44Gq44Gj44Gm44GE44KL44GT44Go44GM44KP44GL44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnRhYmxlKGZyZXEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZnJlceS4reOBruimgee0oOOBrueorumhnuOBlOOBqOOBruWHuuePvumgu+W6pg0KYGBgDQoNCiMjIyBXMy41LjIgYGFwcGVuZGDplqLmlbANCuOAgGBhcHBlbmRg6Zai5pWw44Gv44CB44OZ44Kv44OI44Or44Gr6KaB57Sg44KS6L+95Yqg44GX44Gf44KK44CB44OZ44Kv44OI44Or5ZCM5aOr44KS6YCj57WQ44GZ44KL6Zqb44Gr5L2/44KP44KM44G+44GZ44CC44GT44KM44Gv44CB5Ye654++6aC75bqm44GMMOOBruWxnuOBrzDjgajjgYTjgYbntZDmnpzjgpLlvpfjgZ/jgYTloLTlkIjjgavliKnnlKjjgafjgY3jgovjg4bjgq/jg4vjg4Pjgq/jgafjgZnjgILkvovjgYjjgbDjgIFgaG9nZTNg44GM5Ye65Yqb57WQ5p6c44Gr5ZCr44KB44Gf44GE44CB6KiINOeorumhnuOBruWxnuWQjeaDheWgseOBi+OCieOBquOCi+aWh+Wtl+WIl+ODmeOCr+ODiOODq+OBoOOBqOOBl+OBvuOBmeOAgmBhcHBlbmRg6Zai5pWw44KS55So44GE44Gm44CB5a6f6Zqb44Gu5bGe44GU44Go44Gu5Ye654++6aC75bqm5oOF5aCx44Gr55u45b2T44GZ44KLYGZyZXFg44OZ44Kv44OI44Or44GoYGhvZ2UzYOODmeOCr+ODiOODq+OCkumAo+e1kOOBl+OBn+e1kOaenOOCkmBob2dlNGDjgajjgZfjgb7jgZnjgILjgZPjgozjgatgdGFibGVg6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB5b6X44KJ44KM44KL5Ye654++6aC75bqm5oOF5aCx44Gv44CB5pys5b2T44Gu5Ye654++6aC75bqm44KI44KK44KCMeWkmuOBhOe1kOaenOOBqOOBquOCi+OCguOBruOBruOAgeWun+mam+OBruWHuuePvumgu+W6puOBjDDjga4iQyLjgoIx6Laz44GX44Gf44GK44GL44GS44Gn57WQ5p6c44Gr5ZCr44G+44KM44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmhvZ2UzIDwtIGMoIkEiLCAiQiIsICJDIiwgIkQiKSAgICAgICAgICAgICMg5Ye65Yqb57WQ5p6c44Gr5ZCr44KB44Gf44GE5bGe5ZCN5oOF5aCx44KSaG9nZTPjgavmoLzntI0NCmhvZ2U0IDwtIGFwcGVuZChmcmVxLCBob2dlMykgICAgICAgICAgICAgICMgZnJlceOBqGhvZ2Uz44KS6YCj57WQ44GX44Gf57WQ5p6c44KSaG9nZTTjgavmoLzntI0NCnRhYmxlKGhvZ2U0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZTTkuK3jga7opoHntKDjga7nqK7poZ7jgZTjgajjga7lh7rnj77poLvluqYNCmBgYA0K44CA44GT44GT44G+44Gn44Gn44GN44KM44Gw44CB44GC44Go44Gv5Lul5LiL44Gu44KI44GG44GrYHRhYmxlYOmWouaVsOWun+ihjOe1kOaenOOBruWQhOimgee0oOOCkuWFqOOBpi0x44GX44Gm44KE44KM44Gw44CB5Ye654++6aC75bqm44GM5pys5b2T44GvMOOBruOCguOBruOCguWQq+OCgeOBpOOBpOOAgeacrOadpeOBruWHuuePvumgu+W6puOBqOOBl+OBpue1kOaenOOCkuW+l+OCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0YWJsZShob2dlNCkgLSAxICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2U05Lit44Gu6KaB57Sg44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqmDQpgYGANCuOAgOOBk+OCjOOBr+OAgeioiDEy5YCL44Gu44K144Oz44OX44Or44KS5ZCI44KP44Gb44Gf57WQ5p6c44Gn44KC6KiIMTnlsZ7kuK0xNeWxnuOBl+OBi2RhZGEy5a6f6KGM57WQ5p6c44Go44GX44Gm5qSc5Ye644Gn44GN44Gm44GE44Gq44GE44GT44Go44GL44KJ44CB44K144Oz44OX44Or44GU44Go44Gu57WQ5p6c44Gn5bGe44GU44Go44Gu5Ye654++6aC75bqm44KS6Kq/44G544Gf5aC05ZCI44Gr44CB5Ye654++6aC75bqm44GMMOOBruWxnuOCkuOBqeOBhuWPluOCiuaJseOBhuOBi+OBjOiqsumhjOOBq+OBquOCi+OBk+OBqOOCkuW/temgreOBq+OBiuOBhOOBpuOAgTHjgaTjga7op6PmsbrnrZbjgpLmj5DnpLrjgZfjgZ/jgoLjga7jgavjgarjgorjgb7jgZnjgIINCg0KIyMjIFczLjUuMyAxNeWxnuOBruOBv+OBruWHuuePvumgu+W6pg0K44CA5pys55Wq44Gr6L+R44GE6Kej5p6Q44Go44GX44Gm44CB44GT44GT44Gn44GvVzMuNS4x44Gr5a++5b+c44GZ44KL5a6f44OH44O844K/54mI44KS56S644GX44G+44GZ44CC5pyA5b6M44GuYHRhYmxlKGZyZXEpYOOBrue1kOaenOOBi+OCieOCguOCj+OBi+OCiuOBvuOBmeOBjOOAgeioiDE55bGe44GL44KJ44Gq44KL5pys5p2l5qSc5Ye644GX44Gf44GE5pei55+l5b6u55Sf54mp576k6ZuGW0hNLTI4MF0oaHR0cHM6Ly93d3cuYmVpcmVzb3VyY2VzLm9yZy9DYXRhbG9nL290aGVyUHJvZHVjdHMvSE0tMjgwLmFzcHgp44Gu44GG44Gh44CBZGFkYTLjgafmpJzlh7rjgafjgY3jgZ8xNeWxnuOBruOBv+OBruWHuuePvumgu+W6puaDheWgseOBjOW+l+OCieOCjOOCi+OChOOCiuaWueOBq+OBquOCiuOBvuOBmeOAguWun+ihjOOBq+W/heimgeOBqjPjgaTjga7jgqrjg5bjgrjjgqfjgq/jg4jvvIhgZGF0YWAsIGBnZW51c2AsIGFuZCBgZ2VudXNfdHJ1dGhg77yJ44Gv44CBVzIuM+OCkuWun+ihjOOBmeOCjOOBsOW+l+OCieOCjOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpmcmVxdWVuY3kgPC0gcm93U3VtcyhkYXRhKSAgICAgICAgICAgICAgICAjIGRhdGHjga7ooYzjgZTjgajjga7nt4/lkozjgpJmcmVxdWVuY3njgavmoLzntI0NCm9ial9UUCA8LSBpcy5lbGVtZW50KGdlbnVzLCBnZW51c190cnV0aCkgICMgZ2VudXPkuK3jga7lkITopoHntKDjgYxnZW51c190cnV0aOOBq+WQq+OBvuOCjOOCi+OBi+OBqeOBhuOBi+OBruWIpOWumue1kOaenOOCkm9ial9UUOOBq+agvOe0jQ0KaG9nZTEgPC0gZ2VudXNbb2JqX1RQXSAgICAgICAgICAgICAgICAgICAgIyBnZW51c1tvYmpfVFBd44KSaG9nZTHjgavjgrPjg5Tjg7wNCmhvZ2UyIDwtIGZyZXF1ZW5jeVtvYmpfVFBdICAgICAgICAgICAgICAgICMgZnJlcXVlbmN5W29ial9UUF3jgpJob2dlMuOBq+OCs+ODlOODvA0KZnJlcSA8LSByZXAoeCA9IGhvZ2UxLCB0aW1lcyA9IGhvZ2UyKSAgICAgIyBob2dlMeOCkmhvZ2Uy44Gu5oyH5a6a5Zue5pWw5YiG55Sf5oiQ44GX44Gf57WQ5p6c44KSZnJlceOBq+agvOe0jQ0KdGFibGUoZnJlcSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmcmVx5Lit44Gu6KaB57Sg44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqmDQpgYGANCuOAgOOBk+OCjOOBvuOBp+OBruW+qee/kuOBq+OBr+OBquOCiuOBvuOBmeOBjOOAgeS4u+OBquOCquODluOCuOOCp+OCr+ODiOOBq+OBpOOBhOOBpuS7peS4i+OBq+OBiuOBleOCieOBhOOBl+OBvuOBme+8mg0KDQotIGBkYXRhYO+8muaVsOWApOihjOWIlw0KICAtIEFTVumFjeWIl+OBlOOBqOOBruWHuuePvumgu+W6puaDheWgseOBp+OBguOCiuOAgeWHuuePvumgu+W6puOBrue3j+WSjOOBp+OCveODvOODiOOBleOCjOOBpuOBhOOCiw0KICAtIGRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5TUlLliJfjga7mg4XloLENCiAgLSBgbnJvdyhkYXRhKWDvvJrooYzmlbDvvIhBU1bjga7nt4/mlbDvvInjga9gciBucm93KGRhdGEpYA0KICAtIGBuY29sKGRhdGEpYO+8muWIl+aVsO+8iOOCteODs+ODl+ODq+aVsO+8ieOBr2ByIG5jb2woZGF0YSlgDQoNCi0gYGZyZXF1ZW5jeWDvvJrmlbDlgKTjg5njgq/jg4jjg6sNCiAgLSBXMy40LjHjgafjgoLnpLrjgZfjgZ9gcm93U3Vtc2DplqLmlbDjgpLnlKjjgYTjgabjgIFBU1bphY3liJfjgZTjgajjga7vvIjoqIgxMuOCteODs+ODl+ODq+OBru+8ieWHuuePvumgu+W6puOBrue3j+WSjA0KICAtIOimgee0oOaVsOOBr+ioiGByIGxlbmd0aChkYXRhKWDlgIvjga7vvIkNCg0KLSBgZ2VudXNg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirlsZ7jga7kuojmuKzntZDmnpwqKuOBq+ebuOW9kw0KICAtIGRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5HZW51c+WIl+OBruaDheWgsQ0KICAtIGBsZW5ndGgoZ2VudXMpYO+8muimgee0oOaVsO+8iEFTVuOBrue3j+aVsO+8ieOBr2ByIGxlbmd0aChnZW51cylgDQogIC0gYGxlbmd0aChuYS5vbWl0KGdlbnVzKSlg77yaIk5BIuOCkumZpOOBj+imgee0oOaVsO+8iOezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBn0FTVuaVsO+8ieOBr2ByIGxlbmd0aChuYS5vbWl0KGdlbnVzKSlgDQogIC0gYGxlbmd0aCh0YWJsZShnZW51cykpYO+8miJOQSLjgpLpmaTjgY/jg6bjg4vjg7zjgq/jgaropoHntKDmlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ/jg6bjg4vjg7zjgq/jgarlsZ7jga7mlbDvvInjga9gciBsZW5ndGgodGFibGUoZ2VudXMpKWANCg0KLSBgZ2VudXNfdHJ1dGhg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirlsZ7jga7mraPop6Pmg4XloLEqKuOBq+ebuOW9kw0KICAtIOesrDIz5Zue44Gu6KGoMeOBq+ebuOW9k+OBmeOCi+iPjOagquaDheWgseODleOCoeOCpOODq++8iFtKU0xBQjIzX3RhYmxlMS50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQjIzX3RhYmxlMS50eHQp77yJ44GuT3JnYW5pc23liJfjga7mg4XloLHjgIIx55Wq5bem5YG044Gu5Y2K6KeS44K544Oa44O844K55omL5YmN44G+44Gn44Gu5Y2Y6Kqe44CCDQogIC0g5pys5p2l5qSc5Ye644GX44Gf44GE5pei55+l5b6u55Sf54mp576k6ZuGW0hNLTI4MF0oaHR0cHM6Ly93d3cuYmVpcmVzb3VyY2VzLm9yZy9DYXRhbG9nL290aGVyUHJvZHVjdHMvSE0tMjgwLmFzcHgp5Lit44Gu5bGe5ZCN44Gr55u45b2TDQogIC0gYGxlbmd0aChnZW51c190cnV0aClg77ya6KaB57Sg5pWw77yI44Om44OL44O844Kv44Gq5bGe44Gu5pWw77yJ44GvYHIgbGVuZ3RoKGdlbnVzX3RydXRoKWANCiAgLSBXMy41LjLjga5gaG9nZTNg44Gr5a++5b+cDQoNCi0gYG9ial9UUGDvvJroq5bnkIblgKTjg5njgq/jg4jjg6sNCiAgLSBgZ2VudXNg5Lit44Gu6KaB57SgMeOBpDHjgaTjgavlr77jgZfjgabjgIHjgZ3jgozjgYxgZ2VudXNfdHJ1dGhg44Gr5ZCr44G+44KM44KL44GL44Gp44GG44GL44KSVFJVRSBvciBGQUxTReOBp+WIpOWumuOBl+OBn+e1kOaenA0KICAtIGBsZW5ndGgob2JqX1RQKWDvvJropoHntKDmlbDvvIhBU1bjga7nt4/mlbDvvInjga9gciBsZW5ndGgob2JqX1RQKWANCiAgLSBgc3VtKG9ial9UUClg77yaVFJVReOBruimgee0oOaVsO+8iOacrOadpeaknOWHuuOBl+OBn+OBhOaXouefpeW+rueUn+eJqee+pOmbhuOBq+WQq+OBvuOCjOOCi0FTVuaVsO+8ieOBr2ByIHN1bShvYmpfVFApYA0KDQotIGBnZW51c1tvYmpfVFBdYO+8muaWh+Wtl+WIl+ODmeOCr+ODiOODqw0KICAtIGBnZW51c2Djga7jgYbjgaHjgIFgb2JqX1RQYOOBjFRSVUXjga7opoHntKDjga7jgb/jgpLmir3lh7rjgZfjgZ/ntZDmnpwNCiAgLSBgbGVuZ3RoKGdlbnVzW29ial9UUF0pYO+8muimgee0oOaVsOOBr2ByIGxlbmd0aChnZW51c1tvYmpfVFBdKWANCiAgLSBXMy41LjHjga5gaG9nZTFg44Gr5a++5b+cDQoNCi0gYGZyZXF1ZW5jeVtvYmpfVFBdYO+8muaVsOWApOODmeOCr+ODiOODqw0KICAtIGBmcmVxdWVuY3lg44Gu44GG44Gh44CBYG9ial9UUGDjgYxUUlVF44Gu6KaB57Sg44Gu44G/44KS5oq95Ye644GX44Gf57WQ5p6cDQogIC0gYGxlbmd0aChmcmVxdWVuY3lbb2JqX1RQXSlg77ya6KaB57Sg5pWw44GvYHIgbGVuZ3RoKGZyZXF1ZW5jeVtvYmpfVFBdKWANCiAgLSBXMy41LjHjga5gaG9nZTJg44Gr5a++5b+cDQoNCiMjIyBXMy41LjQgMTnlsZ7jga7lh7rnj77poLvluqYNCuOAgOacrOeVquOBruino+aekOOBqOOBl+OBpuOAgeOBk+OBk+OBp+OBr1czLjUuMuOBq+WvvuW/nOOBmeOCi+Wun+ODh+ODvOOCv+eJiOOCkuekuuOBl+OBvuOBmeOAguWFiOOBu+OBqeOBrlczLjUuM+OBruOCueOCr+ODquODl+ODiOOBq+OAgeacgOW+jOOBrjLooYzliIbjgpLov73liqDjgZfjgZ/jgaDjgZHjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZnJlcXVlbmN5IDwtIHJvd1N1bXMoZGF0YSkgICAgICAgICAgICAgICAgIyBkYXRh44Gu6KGM44GU44Go44Gu57eP5ZKM44KSZnJlcXVlbmN544Gr5qC857SNDQpvYmpfVFAgPC0gaXMuZWxlbWVudChnZW51cywgZ2VudXNfdHJ1dGgpICAjIGdlbnVz5Lit44Gu5ZCE6KaB57Sg44GMZ2VudXNfdHJ1dGjjgavlkKvjgb7jgozjgovjgYvjganjgYbjgYvjga7liKTlrprntZDmnpzjgpJvYmpfVFDjgavmoLzntI0NCmhvZ2UxIDwtIGdlbnVzW29ial9UUF0gICAgICAgICAgICAgICAgICAgICMgZ2VudXNbb2JqX1RQXeOCkmhvZ2Ux44Gr44Kz44OU44O8DQpob2dlMiA8LSBmcmVxdWVuY3lbb2JqX1RQXSAgICAgICAgICAgICAgICAjIGZyZXF1ZW5jeVtvYmpfVFBd44KSaG9nZTLjgavjgrPjg5Tjg7wNCmZyZXEgPC0gcmVwKHggPSBob2dlMSwgdGltZXMgPSBob2dlMikgICAgICMgaG9nZTHjgpJob2dlMuOBruaMh+WumuWbnuaVsOWIhueUn+aIkOOBl+OBn+e1kOaenOOCkmZyZXHjgavmoLzntI0NCg0KaG9nZTQgPC0gYXBwZW5kKGZyZXEsIGdlbnVzX3RydXRoKSAgICAgICAgIyBmcmVx44GoZ2VudXNfdHJ1dGjjgpLpgKPntZDjgZfjgZ/ntZDmnpzjgpJob2dlNOOBq+agvOe0jQ0KdGFibGUoaG9nZTQpIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dlNOS4reOBruimgee0oOOBrueorumhnuOBlOOBqOOBruWHuuePvumgu+W6pi0xDQpgYGANCuOAgOS7peS4i+OBr+OAgeaXouefpeW+rueUn+eJqee+pOmbhueUseadpeOBruioiGByIFRQX2dlbnVzX2R1cGDphY3liJfjga7lh7rnj77poLvluqbjga7nt4/lkozjgYzjgIFXMy40LjjjgafopovjgYjjgabjgYTjgovlgKTvvIhgciBmb3JtYXRDKFRQX2dlbnVzX2ZyZXEsIGZvcm1hdCA9ICJmZyIpYO+8ieOBqOWQjOOBmOOBp+OBguOCi+OBk+OBqOOCkueiuuiqjeOBl+OBpuOBhOOCi+OBoOOBkeOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpzdW0odGFibGUoaG9nZTQpIC0gMSkgICAgICAgICAgICAgICAgICAgICAjIGhvZ2U05Lit44Gu6KaB57Sg44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqmLTENCmBgYA0KDQojIyMgVzMuNS41IG90aGVyc+OBrui/veWKoA0K44CAVzMuNeOBruWGkumgreOBp+i/sOOBueOBn+OBqOOBiuOCiuOAgeOBk+OBk+OBp+OBr+OAjOaXouefpeW+rueUn+eJqee+pOmbhueUseadpeOBrjE55bGe44Gu5Ye654++6aC75bqm44CN44Gu5pWw5YCk44OZ44Kv44OI44Or44Gr44CB44CM5pei55+l5b6u55Sf54mp576k6ZuG55Sx5p2l5Lul5aSW44GuYHIgRlBfZ2VudXNfZHVwYOWAi+OBrkFTVuOBrue3j+WHuuePvumgu+W6pu+8iGByIGZvcm1hdEMoRlBfZ2VudXNfZnJlcSwgZm9ybWF0ID0gImZnIilg77yJ44CN44KS44CBb3RoZXJz44Go44GX44Gm6L+95Yqg44GX44G+44GZ44CC44GT44Gu5YCk44Gv44CBVzMuNC4144GuYEZQYOOBqOWQjOOBmOOCguOBruOBq+OBquOCiuOBvuOBmeOAguW+k+OBo+OBpuOAgeOBk+OBk+OBp+ekuuOBmeOCueOCr+ODquODl+ODiOOBr+OAgeWFiOOBu+OBqeOBruOAjFczLjUuNOOBp+W+l+OBn+ioiDE55bGe5YiG44Gu5Ye654++6aC75bqm5oOF5aCx44KS5qC857SN44GX44Gf5pWw5YCk44OZ44Kv44OI44Or44CN44Gr5a++44GX44Gm44CBYGFwcGVuZGDplqLmlbDjgpLnlKjjgYTjgabjgIxXMy40LjXjga5gRlBg44Gr55u45b2T44GZ44KL5pWw5YCk44CN44KS6L+95Yqg44GZ44KL5YaF5a6544Gr44Gq44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCiMgVzMuNS40DQpmcmVxdWVuY3kgPC0gcm93U3VtcyhkYXRhKSAgICAgICAgICAgICAgICAjIGRhdGHjga7ooYzjgZTjgajjga7nt4/lkozjgpJmcmVxdWVuY3njgavmoLzntI0NCm9ial9UUCA8LSBpcy5lbGVtZW50KGdlbnVzLCBnZW51c190cnV0aCkgICMgZ2VudXPkuK3jga7lkITopoHntKDjgYxnZW51c190cnV0aOOBq+WQq+OBvuOCjOOCi+OBi+OBqeOBhuOBi+OBruWIpOWumue1kOaenOOCkm9ial9UUOOBq+agvOe0jQ0KaG9nZTEgPC0gZ2VudXNbb2JqX1RQXSAgICAgICAgICAgICAgICAgICAgIyBnZW51c1tvYmpfVFBd44KSaG9nZTHjgavjgrPjg5Tjg7wNCmhvZ2UyIDwtIGZyZXF1ZW5jeVtvYmpfVFBdICAgICAgICAgICAgICAgICMgZnJlcXVlbmN5W29ial9UUF3jgpJob2dlMuOBq+OCs+ODlOODvA0KZnJlcSA8LSByZXAoeCA9IGhvZ2UxLCB0aW1lcyA9IGhvZ2UyKSAgICAgIyBob2dlMeOCkmhvZ2Uy44Gu5oyH5a6a5Zue5pWw5YiG55Sf5oiQ44GX44Gf57WQ5p6c44KSZnJlceOBq+agvOe0jQ0KaG9nZTQgPC0gYXBwZW5kKGZyZXEsIGdlbnVzX3RydXRoKSAgICAgICAgIyBmcmVx44GoZ2VudXNfdHJ1dGjjgpLpgKPntZDjgZfjgZ/ntZDmnpzjgpJob2dlNOOBq+agvOe0jQ0KaG9nZTUgPC0gdGFibGUoaG9nZTQpIC0gMSAgICAgICAgICAgICAgICAgIyBob2dlNOS4reOBruimgee0oOOBrueorumhnuOBlOOBqOOBruWHuuePvumgu+W6pi0x44KSaG9nZTXjgavmoLzntI0NCg0KIyBXMy40LjXjga7kuIDpg6gNCm9ial9QIDwtICFpcy5uYShnZW51cykgICAgICAgICAgICAgICAgICAgICMgZ2VudXPjga7lkITopoHntKDjgYxOQeOBp+OBquOBhOOBi+OBqeOBhuOBi+OBruWIpOWumue1kOaenOOCkm9ial9Q44Gr5qC857SNDQpvYmpfRlAgPC0gb2JqX1AgJiAhb2JqX1RQICAgICAgICAgICAgICAgICAjIG9ial9Q44GoIW9ial9UUOOBruS4oeaWueOBp1RSVUXjga7opoHntKDjga7jgb/jgpJUUlVF44Go44GX44Gf57WQ5p6c44KSb2JqX0ZQ44Gr5qC857SNDQpvdGhlcnMgPC0gc3VtKGZyZXF1ZW5jeVtvYmpfRlBdKSAgICAgICAgICAjIG9ial9GUOOBjFRSVUXjga5mcmVxdWVuY3njga7nt4/lkozjgpLoqIjnrpfjgZfjgZ/ntZDmnpzjgpJvdGhlcnPjgavmoLzntI0NCm5hbWVzKG90aGVycykgPC0gIk90aGVycyIgICAgICAgICAgICAgICAgICMgb3RoZXJz44GrIk90aGVycyLjgpJuYW1lc+WxnuaAp+OBqOOBl+OBpuS7mOS4jg0KDQojIOmAo+e1kA0KaG9nZTYgPC0gYXBwZW5kKGhvZ2U1LCBvdGhlcnMpICAgICAgICAgICAgIyBob2dlNeOBqG90aGVyc+OCkumAo+e1kOOBl+OBn+e1kOaenOOCkmhvZ2U244Gr5qC857SNDQpob2dlNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2U244Gu5Lit6LqrDQpgYGANCuOAgOS7peS4i+OBr+OAgWRhZGEy5a6f6KGM57WQ5p6c44Go44GX44Gm5b6X44KJ44KM44Gf6KiIYHIgbGVuZ3RoKGdlbnVzKWDphY3liJfjga7jgYbjgaHjgIHns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ/vvIhOQeOBqOOBquOCieOBquOBi+OBo+OBn++8iWByIGxlbmd0aChuYS5vbWl0KGdlbnVzKSlg6YWN5YiX44Gu5Ye654++6aC75bqm44Gu57eP5ZKM44GM44CBVzMuNC4444Gn6KaL44GI44Gm44GE44KL5YCk77yIYHIgZm9ybWF0QyhUUF9nZW51c19mcmVxICsgRlBfZ2VudXNfZnJlcSwgZm9ybWF0ID0gImZnIilg77yJ44Go5ZCM44GY44GT44Go44KS56K66KqN44GX44Gm44GE44KL44Gg44GR44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnN1bShob2dlNikNCmBgYA0KDQojIyMgVzMuNS42IE5B44Gu5Ye654++6aC75bqm44KC5ZCr44KB44KLDQrjgIDjgZXjgY3jgbvjganjgb7jgafjga7ntZDmnpzjga/jgIFkYWRhMuWun+ihjOe1kOaenOOBqOOBl+OBpuW+l+OCieOCjOOBn+ioiGByIGxlbmd0aChnZW51cylg6YWN5YiX44Gu44GG44Gh44CB57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44Gf77yITkHjgajjgarjgonjgarjgYvjgaPjgZ/vvIlgciBsZW5ndGgobmEub21pdChnZW51cykpYOmFjeWIl+OBruOBv+OBruWHuuePvumgu+W6puOCkuOCq+OCpuODs+ODiOOBl+OBvuOBl+OBn+OAguOBk+OBk+OBp+OBr+OAgeezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBquOBi+OBo+OBn++8iE5B44Go44Gq44Gj44Gf77yJ44KC44Gu44KC5YWo44Gm5ZCr44KB44Gm5Ye654++6aC75bqm5oOF5aCx44KS5b6X44KL44KE44KK5pa544KS56S644GX44G+44GZ44CCVzMuNS4044Gr55u45b2T44GZ44KL6YOo5YiG44Gv5LiN5aSJ44Gn44CBVzMuNC4144GuYG9ial9GUGDjgpLlvpfjgovpg6jliIbjga7jgb/jgYznlbDjgarjgaPjgabjgYTjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KIyBXMy41LjQNCmZyZXF1ZW5jeSA8LSByb3dTdW1zKGRhdGEpICAgICAgICAgICAgICAgICMgZGF0YeOBruihjOOBlOOBqOOBrue3j+WSjOOCkmZyZXF1ZW5jeeOBq+agvOe0jQ0Kb2JqX1RQIDwtIGlzLmVsZW1lbnQoZ2VudXMsIGdlbnVzX3RydXRoKSAgIyBnZW51c+S4reOBruWQhOimgee0oOOBjGdlbnVzX3RydXRo44Gr5ZCr44G+44KM44KL44GL44Gp44GG44GL44Gu5Yik5a6a57WQ5p6c44KSb2JqX1RQ44Gr5qC857SNDQpob2dlMSA8LSBnZW51c1tvYmpfVFBdICAgICAgICAgICAgICAgICAgICAjIGdlbnVzW29ial9UUF3jgpJob2dlMeOBq+OCs+ODlOODvA0KaG9nZTIgPC0gZnJlcXVlbmN5W29ial9UUF0gICAgICAgICAgICAgICAgIyBmcmVxdWVuY3lbb2JqX1RQXeOCkmhvZ2Uy44Gr44Kz44OU44O8DQpmcmVxIDwtIHJlcCh4ID0gaG9nZTEsIHRpbWVzID0gaG9nZTIpICAgICAjIGhvZ2Ux44KSaG9nZTLjga7mjIflrprlm57mlbDliIbnlJ/miJDjgZfjgZ/ntZDmnpzjgpJmcmVx44Gr5qC857SNDQpob2dlNCA8LSBhcHBlbmQoZnJlcSwgZ2VudXNfdHJ1dGgpICAgICAgICAjIGZyZXHjgahnZW51c190cnV0aOOCkumAo+e1kOOBl+OBn+e1kOaenOOCkmhvZ2U044Gr5qC857SNDQpob2dlNSA8LSB0YWJsZShob2dlNCkgLSAxICAgICAgICAgICAgICAgICAjIGhvZ2U05Lit44Gu6KaB57Sg44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqmLTHjgpJob2dlNeOBq+agvOe0jQ0KDQojIFczLjQuNeOBruS4gOmDqA0Kb2JqX0ZQIDwtICFvYmpfVFAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmpfVFDjga5UUlVF44GoRkFMU0XjgpLlhaXjgozmm7/jgYjjgZ/ntZDmnpzjgpJvYmpfRlDjgavmoLzntI0NCm90aGVycyA8LSBzdW0oZnJlcXVlbmN5W29ial9GUF0pICAgICAgICAgICMgb2JqX0ZQ44GMVFJVReOBrmZyZXF1ZW5jeeOBrue3j+WSjOOCkuioiOeul+OBl+OBn+e1kOaenOOCkm90aGVyc+OBq+agvOe0jQ0KbmFtZXMob3RoZXJzKSA8LSAiT3RoZXJzIiAgICAgICAgICAgICAgICAgIyBvdGhlcnPjgasiT3RoZXJzIuOCkm5hbWVz5bGe5oCn44Go44GX44Gm5LuY5LiODQoNCiMg6YCj57WQDQpob2dlNiA8LSBhcHBlbmQoaG9nZTUsIG90aGVycykgICAgICAgICAgICAjIGhvZ2U144Gob3RoZXJz44KS6YCj57WQ44GX44Gf57WQ5p6c44KSaG9nZTbjgavmoLzntI0NCmhvZ2U2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZTbjga7kuK3ouqsNCmBgYA0KDQojIyBXMy42IOOCiOOCiumrmOW6puOBquiHquS9nOmWouaVsA0K44CAVzPjgafjga/jgIHjgrXjg7Pjg5fjg6vlhajkvZPjga7op6PmnpDjgpLooYzjgaPjgabjgYTjgb7jgZnjgIJXNOOBp+OBr+OCteODs+ODl+ODq+OBlOOBqOOBruino+aekOOCkuihjOOBhOOBvuOBmeOBjOOAgeioiDEy5YCL44GC44KL44K144Oz44OX44Or44GU44Go44GrVzMuNS4244Gu44KI44GG44Gq6Kej5p6Q44KS6YO95bqm5a6f6KGM44GZ44KL44Gu44Gv6Z2i5YCS44Gn44GZ44CC6Ieq5L2c6Zai5pWw44Gr44Gk44GE44Gm44GvVzMuMS4y44Gn44KC6Kej6Kqs44GX44Gm44GE44G+44GZ44GM44CB44GT44GT44Gn44GvVzMuNS4244Gu44K544Kv44Oq44OX44OI44Gr6YW35Ly844GX44Gf6Ieq5L2c6Zai5pWw44KS5L2c5oiQ44GX44G+44GZ44CCDQoNCiMjIyBXMy42LjEgYGdldF9XMy41LjZg6Zai5pWwDQrjgIBXMy41Ljblrp/ooYzmmYLjga7lhaXlipvjga/jgIEz44Gk44Gu44Kq44OW44K444Kn44Kv44OI77yIYGRhdGFgLCBgZ2VudXNgLCBhbmQgYGdlbnVzX3RydXRoYO+8ieOBp+OBl+OBn+OAguOBl+OBn+OBjOOBo+OBpuOAgeOBk+OBk+OBp+S9nOaIkOOBmeOCi+iHquS9nOmWouaVsGBnZXRfVzMuNS42YOOBruWFpeWKm+OCguOBk+OBrjPjgaTjgpLmjIflrprjgZnjgovjgojjgYbjgavoqK3oqIjjgZfjgabjgYTjgb7jgZnjgILjgZ3jgozjgYwx6KGM55uu44Gu6KiY6L+w5YaF5a6544Gr55u45b2T44GX44G+44GZ44CC44G+44Gf44CBVzMuNS4244Gu5Li744Gq5Ye65Yqb44GvYGhvZ2U2YOOBp+OBl+OBn+OBruOBp+OAgeiHquS9nOmWouaVsGBnZXRfVzMuNS42YOOCgmBob2dlNmDjga7kuK3ouqvjgpLov5TjgZnjgojjgYbjgavoqK3oqIjjgZfjgabjgYTjgb7jgZnjgILjgZ3jgozjgYzmnIDntYLooYzku5jov5Hjga5gcmV0dXJuKGhvZ2U2KWDjgavnm7jlvZPjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZ2V0X1czLjUuNiA8LSBmdW5jdGlvbihkYXRhLCBnZW51cywgZ2VudXNfdHJ1dGgpew0KICAjIFczLjUuNA0KICBmcmVxdWVuY3kgPC0gcm93U3VtcyhkYXRhKSAgICAgICAgICAgICAgIyBkYXRh44Gu6KGM44GU44Go44Gu57eP5ZKM44KSZnJlcXVlbmN544Gr5qC857SNDQogIG9ial9UUCA8LSBpcy5lbGVtZW50KGdlbnVzLCBnZW51c190cnV0aCkjIGdlbnVz5Lit44Gu5ZCE6KaB57Sg44GMZ2VudXNfdHJ1dGjjgavlkKvjgb7jgozjgovjgYvjganjgYbjgYvjga7liKTlrprntZDmnpzjgpJvYmpfVFDjgavmoLzntI0NCiAgaG9nZTEgPC0gZ2VudXNbb2JqX1RQXSAgICAgICAgICAgICAgICAgICMgZ2VudXNbb2JqX1RQXeOCkmhvZ2Ux44Gr44Kz44OU44O8DQogIGhvZ2UyIDwtIGZyZXF1ZW5jeVtvYmpfVFBdICAgICAgICAgICAgICAjIGZyZXF1ZW5jeVtvYmpfVFBd44KSaG9nZTLjgavjgrPjg5Tjg7wNCiAgZnJlcSA8LSByZXAoeCA9IGhvZ2UxLCB0aW1lcyA9IGhvZ2UyKSAgICMgaG9nZTHjgpJob2dlMuOBruaMh+WumuWbnuaVsOWIhueUn+aIkOOBl+OBn+e1kOaenOOCkmZyZXHjgavmoLzntI0NCiAgaG9nZTQgPC0gYXBwZW5kKGZyZXEsIGdlbnVzX3RydXRoKSAgICAgICMgZnJlceOBqGdlbnVzX3RydXRo44KS6YCj57WQ44GX44Gf57WQ5p6c44KSaG9nZTTjgavmoLzntI0NCiAgaG9nZTUgPC0gdGFibGUoaG9nZTQpIC0gMSAgICAgICAgICAgICAgICMgaG9nZTTkuK3jga7opoHntKDjga7nqK7poZ7jgZTjgajjga7lh7rnj77poLvluqYtMeOCkmhvZ2U144Gr5qC857SNDQogICMgVzMuNC41DQogIG9ial9GUCA8LSAhb2JqX1RQICAgICAgICAgICAgICAgICAgICAgICAjIG9ial9UUOOBrlRSVUXjgahGQUxTReOCkuWFpeOCjOabv+OBiOOBn+e1kOaenOOCkm9ial9GUOOBq+agvOe0jQ0KICBvdGhlcnMgPC0gc3VtKGZyZXF1ZW5jeVtvYmpfRlBdKSAgICAgICAgIyBvYmpfRlDjgYxUUlVF44GuZnJlcXVlbmN544Gu57eP5ZKM44KS6KiI566X44GX44Gf57WQ5p6c44KSb3RoZXJz44Gr5qC857SNDQogIG5hbWVzKG90aGVycykgPC0gIk90aGVycyIgICAgICAgICAgICAgICAjIG90aGVyc+OBqyJPdGhlcnMi44KSbmFtZXPlsZ7mgKfjgajjgZfjgabku5jkuI4NCiAgIyBDb25jYXRlbmF0ZQ0KICBob2dlNiA8LSBhcHBlbmQoaG9nZTUsIG90aGVycykgICAgICAgICAgIyBob2dlNeOBqG90aGVyc+OCkumAo+e1kOOBl+OBn+e1kOaenOOCkmhvZ2U244Gr5qC857SNDQogIHJldHVybihob2dlNikgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2U244Gu5Lit6Lqr44KS6Zai5pWw5a6f6KGM57WQ5p6c44Go44GX44Gm6L+U44GZDQp9DQpgYGANCuOAgOOBk+OBk+OBp+WFpeWKm+OBqOOBl+OBpuaDs+WumuOBl+OBpuOBhOOCizPjgaTjga7jgqrjg5bjgrjjgqfjgq/jg4jvvIhgZGF0YWAsIGBnZW51c2AsIGFuZCBgZ2VudXNfdHJ1dGhg77yJ44Gr44Gk44GE44Gm44CB5b6p57+S44KS5YW844Gt44Gm5Lul5LiL44Gn6Kej6Kqs44GX44Gm44GK44GN44G+44GZ44CCDQoNCi0gYGRhdGFg77ya5pWw5YCk6KGM5YiXDQogIC0gQVNW6YWN5YiX44GU44Go44Gu5Ye654++6aC75bqm5oOF5aCx44Gn44GC44KK44CB5Ye654++6aC75bqm44Gu57eP5ZKM44Gn44K944O844OI44GV44KM44Gm44GE44KLDQogIC0gZGFkYTLlrp/ooYzntZDmnpzjg5XjgqHjgqTjg6vvvIhbb3V0cHV0X0pTTEFCMjQudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjQudHh0Ke+8ieOBrlNSUuWIl+OBruaDheWgsQ0KICAtIGBucm93KGRhdGEpYO+8muihjOaVsO+8iEFTVuOBrue3j+aVsO+8ieOBr2ByIG5yb3coZGF0YSlgDQogIC0gYG5jb2woZGF0YSlg77ya5YiX5pWw77yI44K144Oz44OX44Or5pWw77yJ44GvYHIgbmNvbChkYXRhKWANCg0KLSBgZ2VudXNg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirlsZ7jga7kuojmuKzntZDmnpwqKuOBq+ebuOW9kw0KICAtIGRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5HZW51c+WIl+OBruaDheWgsQ0KICAtIGBsZW5ndGgoZ2VudXMpYO+8muimgee0oOaVsO+8iEFTVuOBrue3j+aVsO+8ieOBr2ByIGxlbmd0aChnZW51cylgDQogIC0gYGxlbmd0aChuYS5vbWl0KGdlbnVzKSlg77yaIk5BIuOCkumZpOOBj+imgee0oOaVsO+8iOezu+e1seWJsuOCiuW9k+OBpuOBp+OBjeOBn0FTVuaVsO+8ieOBr2ByIGxlbmd0aChuYS5vbWl0KGdlbnVzKSlgDQogIC0gYGxlbmd0aCh0YWJsZShnZW51cykpYO+8miJOQSLjgpLpmaTjgY/jg6bjg4vjg7zjgq/jgaropoHntKDmlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ/jg6bjg4vjg7zjgq/jgarlsZ7jga7mlbDvvInjga9gciBsZW5ndGgodGFibGUoZ2VudXMpKWANCg0KLSBgZ2VudXNfdHJ1dGhg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirlsZ7jga7mraPop6Pmg4XloLEqKuOBq+ebuOW9kw0KICAtIOesrDIz5Zue44Gu6KGoMeOBq+ebuOW9k+OBmeOCi+iPjOagquaDheWgseODleOCoeOCpOODq++8iFtKU0xBQjIzX3RhYmxlMS50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQjIzX3RhYmxlMS50eHQp77yJ44GuT3JnYW5pc23liJfjga7mg4XloLHjgIIx55Wq5bem5YG044Gu5Y2K6KeS44K544Oa44O844K55omL5YmN44G+44Gn44Gu5Y2Y6Kqe44CCDQogIC0g5pys5p2l5qSc5Ye644GX44Gf44GE5pei55+l5b6u55Sf54mp576k6ZuGW0hNLTI4MF0oaHR0cHM6Ly93d3cuYmVpcmVzb3VyY2VzLm9yZy9DYXRhbG9nL290aGVyUHJvZHVjdHMvSE0tMjgwLmFzcHgp5Lit44Gu5bGe5ZCN44Gr55u45b2TDQogIC0gYGxlbmd0aChnZW51c190cnV0aClg77ya6KaB57Sg5pWw77yI44Om44OL44O844Kv44Gq5bGe44Gu5pWw77yJ44GvYHIgbGVuZ3RoKGdlbnVzX3RydXRoKWANCg0KIyMjIFczLjYuMiBgZ2V0X1czLjUuNmDjga7lrp/ooYwNCuOAgGBnZXRfVzMuNS42YOmWouaVsOOBruWun+ihjOOBr+OAgeS7peS4i+OBruOCiOOBhuOBqumghueVquOBpzPjgaTjga7jgqrjg5bjgrjjgqfjgq/jg4jjgpLlhaXlipvjgajjgZfjgabkuI7jgYjjgozjgbDjgojjgYTjgafjgZnjgILjgZPjgZPjgafjga/jgIHlh7rlipvntZDmnpzjgpJgcmVzdWx0YOOCquODluOCuOOCp+OCr+ODiOOBq+S4gOaXpuS/neWtmOOBl+OBpuOBi+OCieS4rei6q+OCkueiuuiqjeOBl+OBpuOBhOOBvuOBmeOAguWHuuWKm+e1kOaenOOBr1czLjUuNuOBqOWQjOOBmOOBp+OBmeOBruOBp+OAgeeiuuOBi+OBq+OBk+OBrumWouaVsOOBjOOBhuOBvuOBj+apn+iDveOBl+OBpuOBhOOCi+OBk+OBqOOBjOWIhuOBi+OCi+OBqOaAneOBhOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpyZXN1bHQgPC0gZ2V0X1czLjUuNihkYXRhLCBnZW51cywgZ2VudXNfdHJ1dGgpICMg5bGe44Gu5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44GmcmVzdWx044Gr5qC857SNDQpyZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdOOBruS4rei6qw0KYGBgDQoNCiMjIyBXMy42LjMg56iu44GU44Go44Gu5Ye654++6aC75bqmDQrjgIBgZ2V0X1czLjUuNmDplqLmlbDjga/jgIHkuIDopovjgZnjgovjgajlsZ7jg6zjg5njg6vjga7mg4XloLHjgZfjgYvlj5fjgZHku5jjgZHjgarjgYTjgojjgYbjgarljbDosaHjgpLlj5fjgZHjgb7jgZnjgILjgZfjgYvjgZflrp/pmpvjgavjga/jgIHjg5Xjgqnjg7zjg57jg4Pjg4jjgYzlkIzjgZjjgIznqK7jga7kuojmuKzntZDmnpzjgavnm7jlvZPjgZnjgotgc3BlY2llc2DjgI3jgajjgIznqK7jga7mraPop6Pmg4XloLHjgavnm7jlvZPjgZnjgotgc3BlY2llc190cnV0aGDjgI3jgpLlhaXlipvjgajjgZfjgablrp/ooYzjgZnjgovjgZPjgajjgoLjgafjgY3jgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcmVzdWx0IDwtIGdldF9XMy41LjYoZGF0YSwgc3BlY2llcywgc3BlY2llc190cnV0aCkgIyDnqK7jga7lh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgaZyZXN1bHTjgavmoLzntI0NCnJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVzdWx044Gu5Lit6LqrDQpgYGANCuOAgOWHuuWKm+e1kOaenOOBruWHuuePvumgu+W6puaDheWgseOCkuOBvuOBqOOCgeOBn+aVsOWApOODmeOCr+ODiOODq+OBr+OAgeioiGByIGxlbmd0aChzcGVjaWVzX3RydXRoKWDlgIvjga7nqK7jgagx5YCL44Gub3RoZXJz44GL44KJ5qeL5oiQ44GV44KM44G+44GZ44CC44G+44Gf44CB44CM6Zm95oCn44Go5Yik5a6a44GV44KM44KL44G544GN56iu44Gu44GG44Gh44CB5q2j44GX44GP6Zm95oCn44Go5Yik5a6a44Gn44GN44Gf56iu44Gu5pWw77yIVHJ1ZSBQb3NpdGl2ZTsgVFDvvInjgI3jgYxgciBzdW0oVFBfc3BlY2llcylg44Gn44GC44KL44GT44Go44Gv5pei55+l44Gn44GZ77yIVzMuMi4244GK44KI44GzVzMuMi4577yJ44CC5a6f6Zqb44CBYHIgc29ydChzcGVjaWVzX3RydXRoW2lzLmVsZW1lbnQoc3BlY2llc190cnV0aCwgc3BlY2llcyldKWDjga5gciBzdW0oVFBfc3BlY2llcylg44Gk44GMMOOCiOOCiuWkp+OBjeOBhOWHuuePvumgu+W6puOCkuOCguOBpOOBk+OBqOOBjOeiuuiqjeOBp+OBjeOBvuOBmeOAgmBnZXRfVzMuNS42YOmWouaVsOOBjOWxnuOBruaDheWgseOBoOOBkeOBp+OBquOBj+eoruOBruaDheWgseOCguWFpeWKm+OBqOOBl+OBpuWPl+OBkeS7mOOBkeOAgeato+OBl+OBhOe1kOaenOOCkui/lOOBmeOBk+OBqOOBjOOBp+OBjeOCi+eQhueUseOBr+OAgVczLjYuMeOBp+Wumue+qeOBl+OBn+OBk+OBrumWouaVsOOBjOWGhemDqOeahOOBq+WIqeeUqOOBl+OBpuOBhOOCi+OAgeWFpeWKm+OBqOOBl+OBpuWPl+OBkeS7mOOBkeOCi+W8leaVsO+8iOOBsuOBjeOBmeOBhu+8ieOBruWQjeWJjeOBjOOAgeOBn+OBvuOBn+OBvuOCimBnZW51c2DjgoRgZ2VudXNfdHJ1dGhg44Go5bGe5ZCN44KS6YCj5oOz44GV44Gb44KL44KC44Gu44Gr44Gq44Gj44Gm44GE44KL44Gg44GR44Gg44GL44KJ44Gn44GZ44CC44Gq44GK44CB44GT44GT44Gn5byV5pWw44Gu5ZCN5YmN44Go44GE44Gj44Gm44GE44KL44Gu44Gv44CBVzMuNi4x44GuYGdldF9XMy42LjFg6Zai5pWw5a6a576p44Gu5YWI6aCt6KGM77yIYGdldF9XMy41LjYgPC0gZnVuY3Rpb24oZGF0YSwgZ2VudXMsIGdlbnVzX3RydXRoKXtg77yJ44Gn6KiY6LyJ44GX44Gm44GE44KLZGF0YSwgZ2VudXMsIGdlbnVzX3RydXRo44Gu44GT44Go44Gn44GZ44CCDQoNCiMjIyBXMy42LjQgYGdldF9XMy41LjZfMmDplqLmlbANCuOAgOOBk+OBk+OBp+OBr+OAgeOAjOW8leaVsOOBruWQjeWJjeOAjeOBjGdlbnVz44KEZ2VudXNfdHJ1dGjjga7jgojjgYbjgarlkI3liY3jgafjgYLjgovlv4XopoHjga/jgarjgYTjgajjgYTjgYbjgZPjgajjgpLnpLrjgZnjgbnjgY/jgIHlhYjpoK3ooYzvvIgx6KGM55uu77yJ44KScHJlZGljdGlvbuOBiuOCiOOBs3RydXRo44Gr5aSJ5pu044GX44Gm44GE44G+44GZ44CC44GT44KM44Gr5ZCI44KP44Gb44KL44Gf44KB44CB5Lul5LiL44GuM++9njjooYznm67jga5nZW51c+OBiuOCiOOBs2dlbnVzX3RydXRo44Gr44Gk44GE44Gm44KC44CB44Gd44KM44Ge44KMcHJlZGljdGlvbuOBiuOCiOOBs3RydXRo44Gr5aSJ5pu044GX44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmdldF9XMy41LjZfMiA8LSBmdW5jdGlvbihkYXRhLCBwcmVkaWN0aW9uLCB0cnV0aCl7DQogICMgVzMuNS40DQogIGZyZXF1ZW5jeSA8LSByb3dTdW1zKGRhdGEpICAgICAgICAgICAgICAjIGRhdGHjga7ooYzjgZTjgajjga7nt4/lkozjgpJmcmVxdWVuY3njgavmoLzntI0NCiAgb2JqX1RQIDwtIGlzLmVsZW1lbnQocHJlZGljdGlvbiwgdHJ1dGgpICMgcHJlZGljdGlvbuS4reOBruWQhOimgee0oOOBjHRydXRo44Gr5ZCr44G+44KM44KL44GL44Gp44GG44GL44Gu5Yik5a6a57WQ5p6c44KSb2JqX1RQ44Gr5qC857SNDQogIGhvZ2UxIDwtIHByZWRpY3Rpb25bb2JqX1RQXSAgICAgICAgICAgICAjIHByZWRpY3Rpb25bb2JqX1RQXeOCkmhvZ2Ux44Gr44Kz44OU44O8DQogIGhvZ2UyIDwtIGZyZXF1ZW5jeVtvYmpfVFBdICAgICAgICAgICAgICAjIGZyZXF1ZW5jeVtvYmpfVFBd44KSaG9nZTLjgavjgrPjg5Tjg7wNCiAgZnJlcSA8LSByZXAoeCA9IGhvZ2UxLCB0aW1lcyA9IGhvZ2UyKSAgICMgaG9nZTHjgpJob2dlMuOBruaMh+WumuWbnuaVsOWIhueUn+aIkOOBl+OBn+e1kOaenOOCkmZyZXHjgavmoLzntI0NCiAgaG9nZTQgPC0gYXBwZW5kKGZyZXEsIHRydXRoKSAgICAgICAgICAgICMgZnJlceOBqHRydXRo44KS6YCj57WQ44GX44Gf57WQ5p6c44KSaG9nZTTjgavmoLzntI0NCiAgaG9nZTUgPC0gdGFibGUoaG9nZTQpIC0gMSAgICAgICAgICAgICAgICMgaG9nZTTkuK3jga7opoHntKDjga7nqK7poZ7jgZTjgajjga7lh7rnj77poLvluqYtMeOCkmhvZ2U144Gr5qC857SNDQogICMgVzMuNC41DQogIG9ial9GUCA8LSAhb2JqX1RQICAgICAgICAgICAgICAgICAgICAgICAjIG9ial9UUOOBrlRSVUXjgahGQUxTReOCkuWFpeOCjOabv+OBiOOBn+e1kOaenOOCkm9ial9GUOOBq+agvOe0jQ0KICBvdGhlcnMgPC0gc3VtKGZyZXF1ZW5jeVtvYmpfRlBdKSAgICAgICAgIyBvYmpfRlDjgYxUUlVF44GuZnJlcXVlbmN544Gu57eP5ZKM44KS6KiI566X44GX44Gf57WQ5p6c44KSb3RoZXJz44Gr5qC857SNDQogIG5hbWVzKG90aGVycykgPC0gIk90aGVycyIgICAgICAgICAgICAgICAjIG90aGVyc+OBqyJPdGhlcnMi44KSbmFtZXPlsZ7mgKfjgajjgZfjgabku5jkuI4NCiAgIyBDb25jYXRlbmF0ZQ0KICBob2dlNiA8LSBhcHBlbmQoaG9nZTUsIG90aGVycykgICAgICAgICAgIyBob2dlNeOBqG90aGVyc+OCkumAo+e1kOOBl+OBn+e1kOaenOOCkmhvZ2U244Gr5qC857SNDQogIHJldHVybihob2dlNikgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2U244Gu5Lit6Lqr44KS6Zai5pWw5a6f6KGM57WQ5p6c44Go44GX44Gm6L+U44GZDQp9DQpgYGANCg0KIyMjIFczLjYuNSBgZ2V0X1czLjUuNl8yYOOBruWun+ihjA0K44CA5byV5pWw44Gu5ZCN5YmN44GMcHJlZGljdGlvbuOBiuOCiOOBs3RydXRo44Gr5aSJ5pu044GV44KM44Gm44GE44Gm44KC44CB5bGe44Gu5aC05ZCI44GvYGdlbnVzYOOBiuOCiOOBs2BnZW51c190cnV0aGDjgavjgIHjgZ3jgZfjgabnqK7jga7loLTlkIjjga9gc3BlY2llc2DjgYrjgojjgbNgc3BlY2llc190cnV0aGDjgpLlhaXlipvjgajjgZfjgabkuI7jgYjjgovjgajjgIHpganliIfjgavlh6bnkIbjgZXjgozjgovjgZPjgajjgpLnpLrjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZ2V0X1czLjUuNl8yKGRhdGEsIGdlbnVzLCBnZW51c190cnV0aCkgICAgIyDlsZ7jga7lh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpcNCmdldF9XMy41LjZfMihkYXRhLCBzcGVjaWVzLCBzcGVjaWVzX3RydXRoKSMg56iu44Gu5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6XDQpgYGANCuOAgOeiuuOBi+OBq+WxnuOBrue1kOaenOOBr1czLjYuMuOBqOOAgeOBneOBl+OBpueoruOBrue1kOaenOOBr1czLjYuM+OBqOWQjOOBmOOBp+OBguOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAgg0KDQojIyMgVzMuNi42IOWHuuWKm+WGheWuueOCkuWil+OChOOBmQ0K44CAYGdldF9XMy41LjZfMmDjgoRgZ2V0X1czLjUuNl8yYOmWouaVsOOBr+OAgTPnqK7poZ7jga7lhaXlipvmg4XloLHvvIjlh7rnj77poLvluqbmg4XloLHjgpLlkKvjgoDmlbDlgKTooYzliJfjgIFkYWRhMuS6iOa4rOe1kOaenOOBruaWh+Wtl+WIl+ODmeOCr+ODiOODq+OAgeaXouefpeW+rueUn+eJqee+pOmbhuaDheWgseOBi+OCieOBquOCi+aWh+Wtl+WIl+ODmeOCr+ODiOODq++8ieOCkuS4juOBiOOBpuOAgeaXouefpeW+rueUn+eJqee+pOmbhuS4reOBruWxnuOBvuOBn+OBr+eoruOBlOOBqO+8iOOBqOOBneOCjOS7peWkluOCkuOBvuOBqOOCgeOBn++8ieOBruWHuuePvumgu+W6puOCkmBob2dlNmDjgqrjg5bjgrjjgqfjgq/jg4jjgavjgb7jgajjgoHjgIHjgZ3jgozjgpLov5TjgZnlvbnlibLjgpLmjIHjgZ/jgZvjgZ/jgoLjga7jgafjgZfjgZ/jgILjgZfjgYvjgZfjgIFgaG9nZTZg44Gg44GR44Gn44Gv44Gq44GP44CBYG9ial9UUGDjga7jgojjgYbjgarkuojmuKzntZDmnpzjga7jganjga7opoHntKDjgYzml6Lnn6Xlvq7nlJ/niannvqTpm4bjgajlkIjoh7TjgZfjgabjgYTjgovjgYvjgajjgYTjgYboq5bnkIblgKTjg5njgq/jg4jjg6vmg4XloLHjgoLlkIzmmYLjgavlvpfjgZ/jgYTjg5Ljg4jjgoLjgYTjgovjgafjgZfjgofjgYbjgILjgZPjgZPjgafjga/jgIHlh7rlipvntZDmnpzjgajjgZfjgaZgaG9nZTZg44GoYG9ial9UUGDjga7opIfmlbDjga7mg4XloLHjgpLjg6rjgrnjg4jlvaLlvI/jgafov5TjgZlgZ2V0X1czLjUuNl8zYOmWouaVsOOCkuS9nOaIkOOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpnZXRfVzMuNS42XzMgPC0gZnVuY3Rpb24oZGF0YSwgcHJlZGljdGlvbiwgdHJ1dGgpew0KICAjIFczLjUuNA0KICBmcmVxdWVuY3kgPC0gcm93U3VtcyhkYXRhKSAgICAgICAgICAgICAgIyBkYXRh44Gu6KGM44GU44Go44Gu57eP5ZKM44KSZnJlcXVlbmN544Gr5qC857SNDQogIG9ial9UUCA8LSBpcy5lbGVtZW50KHByZWRpY3Rpb24sIHRydXRoKSAjIHByZWRpY3Rpb27kuK3jga7lkITopoHntKDjgYx0cnV0aOOBq+WQq+OBvuOCjOOCi+OBi+OBqeOBhuOBi+OBruWIpOWumue1kOaenOOCkm9ial9UUOOBq+agvOe0jQ0KICBob2dlMSA8LSBwcmVkaWN0aW9uW29ial9UUF0gICAgICAgICAgICAgIyBwcmVkaWN0aW9uW29ial9UUF3jgpJob2dlMeOBq+OCs+ODlOODvA0KICBob2dlMiA8LSBmcmVxdWVuY3lbb2JqX1RQXSAgICAgICAgICAgICAgIyBmcmVxdWVuY3lbb2JqX1RQXeOCkmhvZ2Uy44Gr44Kz44OU44O8DQogIGZyZXEgPC0gcmVwKHggPSBob2dlMSwgdGltZXMgPSBob2dlMikgICAjIGhvZ2Ux44KSaG9nZTLjga7mjIflrprlm57mlbDliIbnlJ/miJDjgZfjgZ/ntZDmnpzjgpJmcmVx44Gr5qC857SNDQogIGhvZ2U0IDwtIGFwcGVuZChmcmVxLCB0cnV0aCkgICAgICAgICAgICAjIGZyZXHjgah0cnV0aOOCkumAo+e1kOOBl+OBn+e1kOaenOOCkmhvZ2U044Gr5qC857SNDQogIGhvZ2U1IDwtIHRhYmxlKGhvZ2U0KSAtIDEgICAgICAgICAgICAgICAjIGhvZ2U05Lit44Gu6KaB57Sg44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqmLTHjgpJob2dlNeOBq+agvOe0jQ0KICAjIFczLjQuNQ0KICBvYmpfRlAgPC0gIW9ial9UUCAgICAgICAgICAgICAgICAgICAgICAgIyBvYmpfVFDjga5UUlVF44GoRkFMU0XjgpLlhaXjgozmm7/jgYjjgZ/ntZDmnpzjgpJvYmpfRlDjgavmoLzntI0NCiAgb3RoZXJzIDwtIHN1bShmcmVxdWVuY3lbb2JqX0ZQXSkgICAgICAgICMgb2JqX0ZQ44GMVFJVReOBrmZyZXF1ZW5jeeOBrue3j+WSjOOCkuioiOeul+OBl+OBn+e1kOaenOOCkm90aGVyc+OBq+agvOe0jQ0KICBuYW1lcyhvdGhlcnMpIDwtICJPdGhlcnMiICAgICAgICAgICAgICAgIyBvdGhlcnPjgasiT3RoZXJzIuOCkm5hbWVz5bGe5oCn44Go44GX44Gm5LuY5LiODQogICMgQ29uY2F0ZW5hdGUNCiAgaG9nZTYgPC0gYXBwZW5kKGhvZ2U1LCBvdGhlcnMpICAgICAgICAgICMgaG9nZTXjgahvdGhlcnPjgpLpgKPntZDjgZfjgZ/ntZDmnpzjgpJob2dlNuOBq+agvOe0jQ0KDQogICMgb3V0cHV0DQogIHJ0biA8LSBsaXN0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIOe1kOaenOOCkuODquOCueODiOW9ouW8j+OBp+i/lOOBmeOBn+OCgeOBrnJ0buOCkuS9nOaIkA0KICBydG4kZnJlcXVlIDwtIGhvZ2U2ICAgICAgICAgICAgICAgICAgICAgIyBob2dlNuOCkmZyZXF1ZeOBqOOBhOOBhuWQjeWJjeOBp+i/veWKoA0KICBydG4kVFBwb3NpIDwtIG9ial9UUCAgICAgICAgICAgICAgICAgICAgIyBvYmpfVFDjgpJUUHBvc2njgajjgYTjgYblkI3liY3jgafov73liqANCiAgcmV0dXJuKHJ0bikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcnRu44Gu5Lit6Lqr44KS6Zai5pWw5a6f6KGM57WQ5p6c44Go44GX44Gm6L+U44GZDQp9DQpgYGANCuOAgGBnZXRfVzMuNS42XzJg6Zai5pWw44Go44Gu6YGV44GE44Gv44CB5pyA5b6M44GuNeihjOWIhuOBruOBv+OBp+OBmeOAgmBob2dlNmDjgahgb2JqX1RQYOOBr+WQjOOBmOODmeOCr+ODiOODq+OBp+OBr+OBguOCiuOBvuOBmeOBjOOAgeimgee0oOaVsOOBr+eVsOOBquOCiuOBvuOBmeOAguOBneOCjOOChuOBiOOAgeOBk+OBk+OBp+OBr+imgee0oOaVsOOBjOeVsOOBquOCi+WgtOWQiOOBp+OCguaDheWgseOCkuagvOe0jeOBp+OBjeOCi+ODquOCueODiOW9ouW8j+OBq+OBl+OBpuOBhOOBvuOBmeOAgmBydG4gPC0gYGxpc3QoKWDjga/jgIHjgIxgbGlzdGDjgajjgYTjgYbplqLmlbDjgpLnlKjjgYTjgabkuK3ouqvjgYznqbrjga7jg6rjgrnjg4jlvaLlvI/jga7jgqrjg5bjgrjjgqfjgq/jg4jjgpLkvZzmiJDjgZfjgIHjgZ3jgozjgpJgcnRuYOOBqOOBhOOBhuWQjeWJjeOBp+S/neWtmOOBl+OBpuOBhOOCi+OBruOBoOOAguOAjeOBqOeQhuino+OBmeOCjOOBsOOCiOOBhOOBp+OBmeOAguS7pemZjeOBr+W+jOOBp+WPluOCiuWHuuOBl+OBn+OBhOaDheWgseOCkuOAgeOBqeOBruOCiOOBhuOBquWQjeWJjeOBp+agvOe0jeOBmeOCi+OBi+OCkuS9teOBm+OBpuaMh+WumuOBl+OBpuOAgemghuasoWBydG5g44Gr5qC857SN44GX44Gm44GE44GP44Gg44GR44Gn44GZ44CC44GT44GT44Gn44Gv44CBYGhvZ2U2YOOBruaDheWgseOCkmBmcmVxdWVg44Go44GE44GG5ZCN5YmN44Gn5qC857SN44GX44Gm44GE44G+44GZ44CC44G+44Gf44CBYG9ial9UUGDjga7mg4XloLHjgpJgVFBwb3NpYOOBqOOBhOOBhuWQjeWJjeOBp+agvOe0jeOBl+OBpuOBhOOBvuOBmeOAgmBydG5g44Go44GE44GG44Gu44Gv44CB44Oq44K/44O844Oz77yIcmV0dXJu77yJ44GZ44KL44KC44Gu44Go44GE44GG44Gu44KS5b+16aCt44Gr44GK44GE44Gm44GE44G+44GZ44CCVzMuNi4044Gn6Kej6Kqs44GX44Gf44GT44Go44Go6Zai6YCj44GX44G+44GZ44GM44CB6Zai5pWw5YaF6YOo44Gn55So44GE44Gm44GE44KL44Kq44OW44K444Kn44Kv44OI5ZCN44Gv5Z+65pys55qE44Gr44Gq44KT44Gn44KC44KI44GE44GE44Gu44Gn44CB5b+F44Ga44GX44KCYHJ0bmDjgafjgYLjgovlv4XopoHjga/jgYLjgorjgb7jgZvjgpPjgILkvYbjgZfjgIFgZnJlcXVlYOOChGBUUHBvc2lg44Gv6Zai5pWw5a6f6KGM5b6M44KC57aZ5om/44GV44KM44G+44GZ44Gu44Gn44GU5rOo5oSP44GP44Gg44GV44GE44CCDQoNCiMjIyBXMy42LjcgYGdldF9XMy41LjZfM2Djga7lrp/ooYwNCuOAgGBnZXRfVzMuNS42XzNg6Zai5pWw44Gu5a6f6KGM44Gv44CBYGdldF9XMy41LjZg44KEYGdldF9XMy41LjZfMmDjgajlkIzjgZjjgafjgZnjgILjgZPjgZPjgafjga/jgIHlsZ7jga7mg4XloLHvvIhgZ2VudXNg44GoYGdlbnVzX3RydXRoYO+8ieOCkuWFpeWKm+OBqOOBl+OBpuS4juOBiOOBpuWun+ihjOOBl+OAgee1kOaenOOCkmByZXNg44Go44GE44GG44Kq44OW44K444Kn44Kv44OI44Gr5qC857SN44GX44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnJlcyA8LSBnZXRfVzMuNS42XzMoZGF0YSwgZ2VudXMsIGdlbnVzX3RydXRoKSAjIOWxnuOBruWHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBpnJlc+OBq+agvOe0jQ0KcmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXPjga7kuK3ouqsNCmBgYA0K44CAYHJlc2Djga7lh7rlipvntZDmnpzjgpLnnLrjgoHjgovjgajjgIHmnIDliJ3jgatgaG9nZTZg44Gu5Lit6Lqr44Gr55u45b2T44GZ44KL44CM5pei55+l5b6u55Sf54mp576k6ZuG5Lit44Gu5bGe44Go44Gd44KM5Lul5aSW44KS44G+44Go44KB44Gf5Ye654++6aC75bqm44CN5oOF5aCx44GMYCRmcmVxdWVg44Go44GE44GG6YOo5YiG44Gr44CB44Gd44GX44GmYG9ial9UUGDjga7kuK3ouqvjgavnm7jlvZPjgZnjgovjgIzkuojmuKzntZDmnpzjga7jganjga7opoHntKDjgYzml6Lnn6Xlvq7nlJ/niannvqTpm4bjgajlkIjoh7TjgZfjgabjgYTjgovjgYvjgajjgYTjgYboq5bnkIblgKTjg5njgq/jg4jjg6vjgI3mg4XloLHjgYxgJFRQcG9zaWDjgajjgYTjgYbpg6jliIbjgavmoLzntI3jgZXjgozjgabjgYTjgovjgZPjgajjgYzliIbjgYvjgorjgb7jgZnjgILjgZPjgozjgpLnnLrjgoHjgozjgbDjgIHliY3ov7Djga7jgIzkvYbjgZfjgIFgZnJlcXVlYOOChGBUUHBvc2lg44Gv6Zai5pWw5a6f6KGM5b6M44KC57aZ5om/44GV44KM44G+44GZ44Gu44Gn44GU5rOo5oSP44GP44Gg44GV44GE44CC44CN44Gu5oSP5ZGz44GM44KI44GP44KP44GL44KL44Go5oCd44GE44G+44GZ44CCDQoNCiMjIyBXMy42LjggYHN0cmDplqLmlbANCuOAgGBzdHJg6Zai5pWw44Gv44CB5YWl5Yqb44Go44GX44Gm5LiO44GI44KJ44KM44Gf44Kq44OW44K444Kn44Kv44OI44Gu5qeL6YCg77yIc3RydWN0dXJl77yJ44KS6L+U44GX44G+44GZ44CC6YCa5bi444Gv44CB44GT44GT44Gu6KGo56S657WQ5p6c44KS6aC844KK44Gr44GX44Gm44CB44Gp44Gu44KI44GG44Gr44GX44Gm5qyy44GX44GE5oOF5aCx44KS5oq95Ye644GZ44KL44GL44KS5Yik5pat44GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnN0cihyZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVz44Gu5qeL6YCg44KS6KGo56S6DQpgYGANCuOAgOS+i+OBiOOBsOOAgWBmcmVxdWVg44Go44GE44GG6YOo5YiG44Gu5oOF5aCx44KS5b6X44Gf44GE5aC05ZCI44Gv44CBYHJlcyRmcmVxdWVg44Gu44KI44GG44GrYHJlc2DjgahgZnJlcXVlYOOBrumWk+OBq2AkYOOCkuaMn+OCk+OBoOOCiOOBhuOBquW9ouOBp+aMh+WumuOBl+OBvuOBmeOAguWHuuWKm+e1kOaenOOBr+OAgWBnZXRfVzMuNS42XzJg6Zai5pWw44Gu5a6f6KGM57WQ5p6c44Go5ZCM44GY44Gn44GC44KL44GT44Go44GM5YiG44GL44KK44G+44GZ77yIVzMuNi4177yJ44CC44G+44Gf44CBYGdldF9XMy41LjZfM2DplqLmlbDjga7plqLmlbDlkI3jga7nlLHmnaXjgafjgoLjgYLjgotXMy41Ljbjga7lh7rlipvntZDmnpzjgajjgoLlkIzjgZjjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcmVzJGZyZXF1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXMkZnJlcXVl44Gu5Lit6LqrDQpgYGANCuOAgOWQjOanmOOBq+OAgWBUUHBvc2lg44Go44GE44GG6YOo5YiG44Gu5oOF5aCx44KS5b6X44Gf44GE5aC05ZCI44Gv44CBYHJlcyRUUHBvc2lg44Gu44KI44GG44GrYHJlc2DjgahgVFBwb3NpYOOBrumWk+OBq2AkYOOCkuaMn+OCk+OBoOOCiOOBhuOBquW9ouOBp+aMh+WumuOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpyZXMkVFBwb3NpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcyRUUHBvc2njga7kuK3ouqsNCmBgYA0K44CA6KuW55CG5YCk44OZ44Kv44OI44Or44Gn44GC44KLYHJlcyRUUHBvc2lg5Lit44GuVFJVReOBruimgee0oOaVsOOBr+OAgWByIHN1bShyZXMkVFBwb3NpKWDjgafjgZnjgILjgZPjga7mlbDlgKTjga/jgIFXMy4zLjHjgafopovjgYjjgabjgYTjgotgVFBg44Gu6KaB57Sg5pWw44Gr55u45b2T44GX44G+44GZ44CC44Gk44G+44KK44CB44CM6Zm95oCn77yI5pei55+l5b6u55Sf54mp576k6ZuG77yJ44Go5Yik5a6a44GV44KM44KL44G544GN5bGe44Gu44GG44Gh44CB5q2j44GX44GP6Zm95oCn44Go5Yik5a6a44Gn44GN44Gf5bGe44Gu5pWw77yIVHJ1ZSBQb3NpdGl2ZTsgVFDvvInjgI3jgafjgZnjgILjgZPjga7jgojjgYbjgarmg4XloLHjgYzlvpfjgonjgozjgovjgoLjga7jgIHjgIzkuojmuKzntZDmnpzjga7jganjga7opoHntKDjgYzml6Lnn6Xlvq7nlJ/niannvqTpm4bjgajlkIjoh7TjgZfjgabjgYTjgovjgYvjgajjgYTjgYboq5bnkIblgKTjg5njgq/jg4jjg6vjgI3jgYxgcmVzJFRQcG9zaWDjgajjgZfjgabliKnnlKjlj6/og73jgaDjgYvjgonjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc3VtKHJlcyRUUHBvc2kpICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXMkVFBwb3Np5Lit44GuVFJVReOBruimgee0oOaVsA0KYGBgDQoNCiMjIyBXMy42LjkgYGdldF9XMy42YOmWouaVsA0K44CA5pyA5b6M44Gr44CB5pei55+l5b6u55Sf54mp576k6ZuG5Lit44Gu5bGe44G+44Gf44Gv56iu44KS44Gp44KM44Gg44GR44Gu56iu6aGe5qSc5Ye644Gn44GN44Gf44GL44Go44GE44GG5oSf5bqm77yIVzMuMi4y44KEVzMuMi4277yJ44CB44Gd44GX44Gm5LqI5ris57WQ5p6c44Gu44GG44Gh5pei55+l5b6u55Sf54mp576k6ZuG55Sx5p2l44Gu44KC44Gu44GM44Gp44KM44Gg44GR44Gu5Ymy5ZCI5ZCr44G+44KM44KL44GL44Go44GE44GG6YGp5ZCI546H77yIVzMuNC4144KEVzMuNC4277yJ44Gu5oOF5aCx44KC5Ye65Yqb57WQ5p6c44Go44GX44Gm6L+95Yqg44GX44G+44GZ44CC6Zai5pWw5ZCN44Gv44CBVzMuNuOBrumbhuWkp+aIkOOBqOOBhOOBhuaEj+WRs+OBp2BnZXRfVzMuNmDjgajjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZ2V0X1czLjYgPC0gZnVuY3Rpb24oZGF0YSwgcHJlZGljdGlvbiwgdHJ1dGgpew0KICAjIFczLjUuNA0KICBmcmVxdWVuY3kgPC0gcm93U3VtcyhkYXRhKSAgICAgICAgICAgICAgIyBkYXRh44Gu6KGM44GU44Go44Gu57eP5ZKM44KSZnJlcXVlbmN544Gr5qC857SNDQogIG9ial9UUCA8LSBpcy5lbGVtZW50KHByZWRpY3Rpb24sIHRydXRoKSAjIHByZWRpY3Rpb27kuK3jga7lkITopoHntKDjgYx0cnV0aOOBq+WQq+OBvuOCjOOCi+OBi+OBqeOBhuOBi+OBruWIpOWumue1kOaenOOCkm9ial9UUOOBq+agvOe0jQ0KICBob2dlMSA8LSBwcmVkaWN0aW9uW29ial9UUF0gICAgICAgICAgICAgIyBwcmVkaWN0aW9uW29ial9UUF3jgpJob2dlMeOBq+OCs+ODlOODvA0KICBob2dlMiA8LSBmcmVxdWVuY3lbb2JqX1RQXSAgICAgICAgICAgICAgIyBmcmVxdWVuY3lbb2JqX1RQXeOCkmhvZ2Uy44Gr44Kz44OU44O8DQogIGZyZXEgPC0gcmVwKHggPSBob2dlMSwgdGltZXMgPSBob2dlMikgICAjIGhvZ2Ux44KSaG9nZTLjga7mjIflrprlm57mlbDliIbnlJ/miJDjgZfjgZ/ntZDmnpzjgpJmcmVx44Gr5qC857SNDQogIGhvZ2U0IDwtIGFwcGVuZChmcmVxLCB0cnV0aCkgICAgICAgICAgICAjIGZyZXHjgah0cnV0aOOCkumAo+e1kOOBl+OBn+e1kOaenOOCkmhvZ2U044Gr5qC857SNDQogIGhvZ2U1IDwtIHRhYmxlKGhvZ2U0KSAtIDEgICAgICAgICAgICAgICAjIGhvZ2U05Lit44Gu6KaB57Sg44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqmLTHjgpJob2dlNeOBq+agvOe0jQ0KICAjIFczLjQuNQ0KICBvYmpfRlAgPC0gIW9ial9UUCAgICAgICAgICAgICAgICAgICAgICAgIyBvYmpfVFDjga5UUlVF44GoRkFMU0XjgpLlhaXjgozmm7/jgYjjgZ/ntZDmnpzjgpJvYmpfRlDjgavmoLzntI0NCiAgb3RoZXJzIDwtIHN1bShmcmVxdWVuY3lbb2JqX0ZQXSkgICAgICAgICMgb2JqX0ZQ44GMVFJVReOBrmZyZXF1ZW5jeeOBrue3j+WSjOOCkuioiOeul+OBl+OBn+e1kOaenOOCkm90aGVyc+OBq+agvOe0jQ0KICBuYW1lcyhvdGhlcnMpIDwtICJPdGhlcnMiICAgICAgICAgICAgICAgIyBvdGhlcnPjgasiT3RoZXJzIuOCkm5hbWVz5bGe5oCn44Go44GX44Gm5LuY5LiODQogICMgQ29uY2F0ZW5hdGUNCiAgaG9nZTYgPC0gYXBwZW5kKGhvZ2U1LCBvdGhlcnMpICAgICAgICAgICMgaG9nZTXjgahvdGhlcnPjgpLpgKPntZDjgZfjgZ/ntZDmnpzjgpJob2dlNuOBq+agvOe0jQ0KICANCiAgIyBzZW5zaXRpdml0eQ0KICBvYmogPC0gaXMuZWxlbWVudCh0cnV0aCwgcHJlZGljdGlvbikgICAgIyB0cnV0aOS4reOBruWQhOimgee0oOOBjHByZWRpY3Rpb27jgavlkKvjgb7jgozjgovjgYvjganjgYbjgYvjga7liKTlrprntZDmnpzjgpJvYmrjgavmoLzntI0NCiAgc2Vuc2kgPC0gc3VtKG9iaikvbGVuZ3RoKHRydXRoKSAgICAgICAgICMg5oSf5bqm44Gu6KiI566X57WQ5p6c44KSc2Vuc2njgavmoLzntI0NCiAgDQogICMgcHJlY2lzaW9u77yIRlDjgatOQeWQq+OCgO+8iQ0KICBUUCA8LSBzdW0oZnJlcXVlbmN5W29ial9UUF0pICAgICAgICAgICAgIyBvYmpfVFDjgYxUUlVF44GuZnJlcXVlbmN544Gu57eP5ZKM44KS6KiI566X44GX44Gf57WQ5p6c44KSVFDjgavmoLzntI0NCiAgRlAgPC0gb3RoZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3RoZXJz44KSRlDjgavjgrPjg5Tjg7wNCiAgcHJlY2kxIDwtIFRQIC8gKFRQICsgRlApICAgICAgICAgICAgICAgICMg6YGp5ZCI546H44KS6KiI566X44GX44Gf57WQ5p6c44KScHJlY2kx44Gr5qC857SNDQogIA0KICAjIHByZWNpc2lvbu+8iEZQ44GrTkHlkKvjgb7jgarjgYTvvIkNCiAgb2JqX1AgPC0gIWlzLm5hKHByZWRpY3Rpb24pICAgICAgICAgICAgICMgcHJlZGljdGlvbuOBruWQhOimgee0oOOBjE5B44Gn44Gq44GE44GL44Gp44GG44GL44Gu5Yik5a6a57WQ5p6c44KSb2JqX1DjgavmoLzntI0NCiAgb2JqX0ZQIDwtIG9ial9QICYgIW9ial9UUCAgICAgICAgICAgICAgICMgb2JqX1Djgaghb2JqX1RQ44Gu5Lih5pa544GnVFJVReOBruimgee0oOOBruOBv+OCklRSVUXjgajjgZfjgZ/ntZDmnpzjgpJvYmpfRlDjgavmoLzntI0NCiAgRlAgPC0gc3VtKGZyZXF1ZW5jeVtvYmpfRlBdKSAgICAgICAgICAgICMgb2JqX0ZQ44GMVFJVReOBrmZyZXF1ZW5jeeOBrue3j+WSjOOCkuioiOeul+OBl+OBn+e1kOaenOOCkkZQ44Gr5qC857SNDQogIHByZWNpMiA8LSBUUCAvIChUUCArIEZQKSAgICAgICAgICAgICAgICAjIOmBqeWQiOeOh+OCkuioiOeul+OBl+OBn+e1kOaenOOCknByZWNpMuOBq+agvOe0jQ0KICANCiAgIyBvdXRwdXQNCiAgcnRuIDwtIGxpc3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMg57WQ5p6c44KS44Oq44K544OI5b2i5byP44Gn6L+U44GZ44Gf44KB44GucnRu44KS5L2c5oiQDQogIHJ0biRmcmVxdWUgPC0gaG9nZTYgICAgICAgICAgICAgICAgICAgICAjIGhvZ2U244KSZnJlcXVl44Go44GE44GG5ZCN5YmN44Gn6L+95YqgDQogIHJ0biRUUHBvc2kgPC0gb2JqX1RQICAgICAgICAgICAgICAgICAgICAjIG9ial9UUOOCklRQcG9zaeOBqOOBhOOBhuWQjeWJjeOBp+i/veWKoA0KICBydG4kc2Vuc2l0aXZpdHkgPC0gc2Vuc2kgICAgICAgICAgICAgICAgIyBzZW5zaeOCknNlbnNpdml0aXR544Go44GE44GG5ZCN5YmN44Gn6L+95YqgDQogIHJ0biRwcmVjaXNpb25fd2l0aF9OQSA8LSBwcmVjaTEgICAgICAgICAjIHByZWNpMeOCknByZWNpc2lvbl93aXRoX05B44Go44GE44GG5ZCN5YmN44Gn6L+95YqgDQogIHJ0biRwcmVjaXNpb25fd2l0aG91dF9OQSA8LSBwcmVjaTIgICAgICAjIHByZWNpMuOCknByZWNpc2lvbl93aXRob3V0X05B44Go44GE44GG5ZCN5YmN44Gn6L+95YqgDQogIHJldHVybihydG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJ0buOBruS4rei6q+OCkumWouaVsOWun+ihjOe1kOaenOOBqOOBl+OBpui/lOOBmQ0KfQ0KYGBgDQrjgIBUUCAvIChUUCArIEZQKeOBp+Wumue+qeOBleOCjOOCi+mBqeWQiOeOh+OBr+OAgUZQ44KS44CMVFDku6XlpJbjga7lhajjgabjga5BU1bmlbDvvIhOQeOCguWQq+OCgeOCi++8ieOAjeOBruOCiOOBhuOBq05B44KS5ZCr44KB44KL5aC05ZCI44Go44CB44CMVFDku6XlpJbjga7lhajjgabjga5BU1bmlbDvvIjkvYbjgZfns7vntbHlibLjgorlvZPjgabjgafjgY3jgarjgYvjgaPjgZ9OQeOBr+WQq+OCgeOBquOBhO+8ieOAjeOBrjLjgaTjg5Hjgr/jg7zjg7PjgYzlj6/og73jgafjgZnjgILjgZ3jgozjgobjgYjjgIHjgZPjgZPjgafjga/liY3ogIXjgpJgcHJlY2kxYOOBqOOBl+OBpuioiOeul+OBl+OBpmBwcmVjaXNpb25fd2l0aF9OQWDjgaflh7rlipvntZDmnpzjgYvjgonlj5bjgorlh7rjgZvjgovjgojjgYbjgavjgIHjgZ3jgZfjgablvozogIXjgpJgcHJlY2kyYOOBqOOBl+OBpuioiOeul+OBl+OBpmBwcmVjaXNpb25fd2l0aG91dF9OQWDjgaflh7rlipvntZDmnpzjgYvjgonlj5bjgorlh7rjgZvjgovjgojjgYbjgavjgZfjgabjgYTjgb7jgZnjgIINCg0KIyMjIFczLjYuMTAgYGdldF9XMy42YOOBruWun+ihjA0K44CAYGdldF9XMy42YOmWouaVsOOCkuWun+ihjOOBl+OAgee1kOaenOOCkmByZXNg44Go44GE44GG44Kq44OW44K444Kn44Kv44OI44Gr5qC857SN44GX44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnJlcyA8LSBnZXRfVzMuNihkYXRhLCBnZW51cywgZ2VudXNfdHJ1dGgpICMg5bGe44Gu5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44GmcmVz44Gr5qC857SNDQpyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc+OBruS4rei6qw0KYGBgDQrjgIDmhJ/luqbjga7lgKTvvIg9IGByIHJlcyRzZW5zaXRpdml0eWDvvInjga/jgIFgcmVzJHNlbnNpdGl2aXR5YOOBp+aKveWHuuOBp+OBjeOBvuOBmeOAglczLjIuMuOBp+imi+OBiOOBpuOBhOOCi+OCguOBruOBqOWQjOOBmOOBp+OBguOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpyZXMkc2Vuc2l0aXZpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcyRzZW5zaXRpdml0eeOBruS4rei6qw0KYGBgDQrjgIBOQeeUseadpemFjeWIl+OBruWHuuePvumgu+W6puOCkuWQq+OCgeOBpueul+WHuuOBl+OBn+mBqeWQiOeOh+OBruWApO+8iD0gYHIgcmVzJHByZWNpc2lvbl93aXRoX05BYO+8ieOBr+OAgWByZXMkcHJlY2lzaW9uX3dpdGhfTkFg44Gn5oq95Ye644Gn44GN44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnJlcyRwcmVjaXNpb25fd2l0aF9OQSAgICAgICAgICAgICAgICAgICAgICMgcmVzJHByZWNpc2lvbl93aXRoX05B44Gu5Lit6LqrDQpgYGANCuOAgE5B55Sx5p2l6YWN5YiX44Gu5Ye654++6aC75bqm44KS5ZCr44KB44Ga44Gr566X5Ye644GX44Gf6YGp5ZCI546H44Gu5YCk77yIPSBgciByZXMkcHJlY2lzaW9uX3dpdGhvdXRfTkFg77yJ44Gv44CBYHJlcyRwcmVjaXNpb25fd2l0aG91dF9OQWDjgafmir3lh7rjgafjgY3jgb7jgZnjgIJgciByZXMkcHJlY2lzaW9uX3dpdGhfTkFg44GuYHJlcyRwcmVjaXNpb25fd2l0aF9OQWDjgojjgorjgoLlgKTjgYzlpKfjgY3jgYTjga7jga/jgIHoh7PmpbXlvZPnhLbjgafjgZnjgILnkIbnlLHjga/jgIFOQeeUseadpemFjeWIl+OBruWHuuePvumgu+W6puOCkuWQq+OCgeOBquOBkeOCjOOBsEZQ44Gu5pWw44GM5bCR44Gq44GP44Gq44KL44GT44Go44CB44Gd44GX44Gm6YGp5ZCI546H44GvVFAgLyAoVFAgKyBGUCnjgaflrprnvqnjgZXjgozjgovjgYvjgonjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcmVzJHByZWNpc2lvbl93aXRob3V0X05BICAgICAgICAgICAgICAgICAgIyByZXMkcHJlY2lzaW9uX3dpdGhvdXRfTkHjga7kuK3ouqsNCmBgYA0KDQojIyMgVzMuNi4xMSBgc291cmNlYOmWouaVsA0K44CAYHNvdXJjZWDplqLmlbDjga/jgIHlhaXlipvjgajjgZfjgabmjIflrprjgZfjgZ/jg5XjgqHjgqTjg6vjga7kuK3ouqvjgpLlrp/ooYzjgZfjgb7jgZnjgIJMaW51eOOBjOWIhuOBi+OCi+ODkuODiOWQkeOBkeOBruiqrOaYjuOBqOOBl+OBpuOBr+OAgeOCt+OCp+ODq+OCueOCr+ODquODl+ODiOOBruOCiOOBhuOBquOCguOBruOBq+OBquOCiuOBvuOBmeOAguOBlOWIqeebiuOBqOOBl+OBpuOBr+OAgeOBk+OCjOOBvuOBp2BnZXROb25uYU51bWDjgIFgZ2V0X1czLjUuNmDjgIFgZ2V0X1czLjUuNl8yYOOAgWBnZXRfVzMuNS42XzNg44CBYGdldF9XMy42YOOBqDXnqK7poZ7jga7oh6rkvZzplqLmlbDjgpLnpLrjgZfjgabjgY3jgb7jgZfjgZ/jgILjgZPjgozjgonjga7plqLmlbDjga/jgIHkuIDluqbjgrPjg7Pjgr3jg7zjg6vvvIhDb25zb2xl77yJ55S76Z2i5LiK44Gn5a6f6KGM44GX44Gm5a6a576p44GX44Gm44GK44GP44Go44CB44K944OV44OI44Km44Kn44Ki44KS6ZaJ44GY44Gq44GE6ZmQ44KK5L2/44GI44G+44GZ44CC44GX44GL44GXUuOCkuWGjei1t+WLleOBmeOCi+OBqOOAgemDveW6pumWouaVsOOCkuWGjeiqreOBv+i+vOOBv+OBm+OBreOBsOOBquOCiuOBvuOBm+OCk+OAguOBneOCjOOChuOBiOOAgeikh+aVsOOBruiHquS9nOmWouaVsOOCkuWumue+qeOBl+OBn+ODleOCoeOCpOODq++8iFtKU0xBQl9zb3VyY2UuUl0oaHR0cDovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUJfc291cmNlLlIp77yJ44KS5LqI44KB55So5oSP44GX44Gm44GK44GN44CB44Gd44KM44KS5pyA5Yid44Gr5LiA5bqm44Gr44G+44Go44KB44Gm6Kqt44G/6L6844KA44GT44Go44GM44KI44GP6KGM44KP44KM44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnNvdXJjZSgiaHR0cDovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUJfc291cmNlLlIiKSAjIOmWouaVsOOBruiqrei+vA0KYGBgDQrjgIDjgZPjga7jg5XjgqHjgqTjg6vjga7oqJjov7DlhoXlrrnjgpLopovjgabjgYTjgZ/jgaDjgZHjgozjgbDjgo/jgYvjgorjgb7jgZnjgYzjgIHplqLmlbDjgpLlrprnvqnjgZfjgabjgYTjgovjgaDjgZHjgarjga7jgafopovjgZ/nm67kuIrkvZXjgoLlpInljJbjga/jgYLjgorjgb7jgZvjgpPjgILjgqjjg6njg7zjgYzlh7rjgarjgZHjgozjgbDjgYbjgb7jgY/jgYTjgaPjgZ/jgajmgJ3jgaPjgabjgYTjgZ/jgaDjgYTjgabjgYvjgb7jgYTjgb7jgZvjgpPjgIINCg0KIyMjIFczLjYuMTIgYHNvdXJjZWDjga7jgZTliKnnm4oNCmBzb3VyY2Vg6Zai5pWw44KS55So44GE44Gf6Zai5pWw5a6a576p44OV44Kh44Kk44Or44Gu6Kqt6L6844Gu44GU5Yip55uK44KS5a6f5oSf44GZ44KLMeOBpOOBruaWueazleOBr+OAgeS7peS4i+OBrjPjgaTjga7miYvpoIbjgpLlrp/ooYzjgZfjgIEqKuato+OBl+OBjyAgDQrjgIxnZXRfVzMuNihkYXRhLCBnZW51cywgZ2VudXNfdHJ1dGgpIOOBp+OCqOODqeODvDrjgIDplqLmlbAgImdldF9XMy42IiDjgpLopovjgaTjgZHjgovjgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgI0gIA0K44Go44GE44GG44Ko44Op44O844Gr6YGt6YGH44GZ44KLKirjgZPjgajjgafjgZnjgIINCg0KMS4g54++5Zyo6LW35YuV5Lit44GuUlN0dWRpb+OCkuS4gOaXpue1guS6huOBl+OBpuWGjeW6pui1t+WLlQ0KMi4g5Lul5LiL44KS5a6f6KGM77yIVzIuM+OBqOWQjOOBmO+8iQ0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9VFJVRSwgZXZhbD1GQUxTRX0NCiMgVzIuMSBkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq+OBruOBu+OBhg0KaW5fZiA8LSAiaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCIgIyDoqq3jgb/ovrzjgb/jgZ/jgYTjg5XjgqHjgqTjg6vmg4XloLHjgpJpbl9m44Gr5qC857SNDQpob2dlIDwtIHJlYWQudGFibGUoaW5fZiwgaGVhZGVyPVRSVUUsIHJvdy5uYW1lcz0xLCBzZXA9Ilx0IikjIGluX2bjgpLjgIEx6KGM55uu44KS5YiX5ZCN44CBMeWIl+ebruOCkuihjOWQjeOBqOOBl+OBpuiqreOBv+i+vOOCk+OBoOe1kOaenOOCkmhvZ2XjgavmoLzntI0NCm9iaiA8LSBncmVwKHBhdHRlcm4gPSAiU1JSIiwgeCA9IGNvbG5hbWVzKGhvZ2UpKSAgIyBjb2xuYW1lcyhob2dlKeOBruS4reOBi+OCiSJTUlIi44Go44GE44GG5paH5a2X44KS5ZCr44KA6KaB57Sg55Wq5Y+344KS5oq95Ye644GX44Gf57WQ5p6c44KSb2Jq44Gr5qC857SNDQpkYXRhIDwtIGhvZ2VbLCBvYmpdICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XooYzliJfkuK3jga5vYmrjgafmjIflrprjgZfjgZ/liJfjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpJkYXRh44Gr5qC857SNDQpnZW51cyA8LSBob2dlJEdlbnVzICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XkuK3jga5HZW51c+WIl+OCkuaKveWHuuOBl+OBn+e1kOaenOOCkmdlbnVz44Gr5qC857SNDQpzcGVjaWVzIDwtIGhvZ2UkU3BlY2llcyAgICAgICAgICAgICAgICAgICAjIGhvZ2XkuK3jga5TcGVjaWVz5YiX44KS5oq95Ye644GX44Gf57WQ5p6c44KSc3BlY2llc+OBq+agvOe0jQ0KDQojIFcyLjIg6I+M5qCq5oOF5aCx44OV44Kh44Kk44Or44Gu44G744GGDQppbl9mIDwtICJodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0IiAjIOiqreOBv+i+vOOBv+OBn+OBhOODleOCoeOCpOODq+aDheWgseOCkmluX2bjgavmoLzntI0NCmhvZ2UgPC0gcmVhZC50YWJsZShpbl9mLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEsIHNlcD0iXHQiKSAjaW5fZuOCkuOAgTHooYznm67jgpLliJflkI3jgIEx5YiX55uu44KS6KGM5ZCN44Go44GX44Gm6Kqt44G/6L6844KT44Gg57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0Kb3JnYW5pc20gPC0gaG9nZSRPcmdhbmlzbSAgICAgICAgICAgICAgICAgIyBob2dl5Lit44GuT3JnYW5pc23liJfjgpLmir3lh7rjgZfjgZ/ntZDmnpzjgpJvcmdhbmlzbeOBq+agvOe0jQ0KaG9nZSA8LSBzdHJzcGxpdCh4ID0gb3JnYW5pc20sIHNwbGl0ID0gIiwiKSMgb3JnYW5pc23kuK3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLjgrPjg7Pjg57jgafliIblibLjgZfjgZ/ntZDmnpzjgpJob2dl44Gr5qC857SNDQpob2dlMiA8LSBzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGBbYCwgMSkgICAjIGhvZ2XkuK3jga7jg5njgq/jg4jjg6vlvaLlvI/jga7lkITopoHntKDjgYvjgonjgIEx55Wq55uu44Gu6KaB57Sg44Gu5oq95Ye657WQ5p6c44KSaG9nZTLjgavmoLzntI0NCmhvZ2UzIDwtIHN0cnNwbGl0KHggPSBob2dlMiwgc3BsaXQgPSAiICIpICMgaG9nZTLkuK3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLljYrop5Ljgrnjg5rjg7zjgrnjgafliIblibLjgZfjgZ/ntZDmnpzjgpJob2dlM+OBq+agvOe0jQ0KZ2VudXNfdHJ1dGggPC0gc2FwcGx5KFggPSBob2dlMywgRlVOID0gYFtgLCAxKSAgIyBob2dlM+S4reOBruODmeOCr+ODiOODq+W9ouW8j+OBruWQhOimgee0oOOBi+OCieOAgTHnlarnm67jga7opoHntKDjga7mir3lh7rntZDmnpzjgpJnZW51c190cnV0aOOBq+agvOe0jQ0Kc3BlY2llc190cnV0aCA8LSBzYXBwbHkoWCA9IGhvZ2UzLCBGVU4gPSBgW2AsIDIpIyBob2dlM+S4reOBruODmeOCr+ODiOODq+W9ouW8j+OBruWQhOimgee0oOOBi+OCieOAgTLnlarnm67jga7opoHntKDjga7mir3lh7rntZDmnpzjgpJzcGVjaWVzX3RydXRo44Gr5qC857SNDQpnZW51c190cnV0aCA8LSB1bmlxdWUoZ2VudXNfdHJ1dGgpICAgICAgICAjIGdlbnVzX3RydXRo5Lit44Gu44Om44OL44O844Kv44Gq6KaB57Sg44KSZ2VudXNfdHJ1dGjjgavmoLzntI0NCnNwZWNpZXNfdHJ1dGggPC0gdW5pcXVlKHNwZWNpZXNfdHJ1dGgpICAgICMgc3BlY2llc190cnV0aOS4reOBruODpuODi+ODvOOCr+OBquimgee0oOOCknNwZWNpZXNfdHJ1dGjjgavmoLzntI0NCmBgYA0KMy4g5Lul5LiL44KS5a6f6KGM77yIVzMuNi4xMOOBqOWfuuacrOeahOOBq+WQjOOBmO+8iQ0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIGV2YWw9RkFMU0V9DQpnZXRfVzMuNihkYXRhLCBnZW51cywgZ2VudXNfdHJ1dGgpICAgICAgICAjIOWxnuOBruWHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+lw0KYGBgDQrjgIDnhKHkuovjgIxnZXRfVzMuNihkYXRhLCBnZW51cywgZ2VudXNfdHJ1dGgpIOOBp+OCqOODqeODvDrjgIDplqLmlbAgImdldF9XMy42IiDjgpLopovjgaTjgZHjgovjgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgI3jgajjgYTjgYbjgqjjg6njg7zjgavpga3pgYfjgafjgY3jgZ/jgajmgJ3jgYTjgb7jgZnjgILjgZPjga7nirbmhYvjgafjgIHku6XkuIvjgpLlrp/ooYzjgZnjgozjgbBgc291cmNlYOmWouaVsOOBruOBlOWIqeebiuOCkuWun+aEn+OBp+OBjeOCi+OBqOaAneOBhOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpzb3VyY2UoImh0dHA6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCX3NvdXJjZS5SIikgIyDplqLmlbDjga7oqq3ovrwNCmdldF9XMy42KGRhdGEsIGdlbnVzLCBnZW51c190cnV0aCkgICAgICAgICMg5bGe44Gu5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6XDQpgYGANCg0KIyBXNCDjgrXjg7Pjg5fjg6vjgZTjgajjga7op6PmnpANCuOAgFczLjTku6XpmY3jgafjga/jgIFkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44GuU1JS5YiX44Gr55u45b2T44GZ44KL6KiIMTLjgrXjg7Pjg5fjg6vjga7lh7rnj77poLvluqbjga7nt4/lkozjgpJBU1bphY3liJfjgZTjgajjgavnrpflh7rjgZfjgIHlh7rnj77poLvluqbjgpLlkKvjgoHjgZ/mgKfog73oqZXkvqHjgpLooYzjgYTjgb7jgZfjgZ/jgILjgZPjgZPjgafjga/jgIHjgrXjg7Pjg5fjg6vjgZTjgajjgavlkIzmp5jjga7op6PmnpDjgpLooYzjgYTjgb7jgZnjgILjgZPjgZPjgafnlKjjgYTjgovlhaXlipvjg4fjg7zjgr/jga/kuIvoqJjjga7pgJrjgorjgafjgZnjgILoqIg144Gk44Gu44Kq44OW44K444Kn44Kv44OI44KS55So44GE44G+44GZ44GM44CB44GE44Ga44KM44KCVzIuM+OBruOCs+ODlOODmuWun+ihjOOBp+W+l+OCieOCjOOBvuOBmeOAgg0KDQotIGBkYXRhYO+8muaVsOWApOihjOWIlw0KICAtIEFTVumFjeWIl+OBlOOBqOOBruWHuuePvumgu+W6puaDheWgseOBp+OBguOCiuOAgeWHuuePvumgu+W6puOBrue3j+WSjOOBp+OCveODvOODiOOBleOCjOOBpuOBhOOCiw0KICAtIGRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5TUlLliJfjga7mg4XloLENCiAgLSBgbnJvdyhkYXRhKWDvvJrooYzmlbDvvIhBU1bjga7nt4/mlbDvvInjga9gciBucm93KGRhdGEpYA0KICAtIGBuY29sKGRhdGEpYO+8muWIl+aVsO+8iOOCteODs+ODl+ODq+aVsO+8ieOBr2ByIG5jb2woZGF0YSlgDQoNCi0gYGdlbnVzYO+8muaWh+Wtl+WIl+ODmeOCr+ODiOODqw0KICAtICoq5bGe44Gu5LqI5ris57WQ5p6cKirjgavnm7jlvZMNCiAgLSBkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq++8iFtvdXRwdXRfSlNMQUIyNC50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC50eHQp77yJ44GuR2VudXPliJfjga7mg4XloLENCiAgLSBgbGVuZ3RoKGdlbnVzKWDvvJropoHntKDmlbDvvIhBU1bjga7nt4/mlbDvvInjga9gciBsZW5ndGgoZ2VudXMpYA0KICAtIGBsZW5ndGgobmEub21pdChnZW51cykpYO+8miJOQSLjgpLpmaTjgY/opoHntKDmlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ9BU1bmlbDvvInjga9gciBsZW5ndGgobmEub21pdChnZW51cykpYA0KICAtIGBsZW5ndGgodGFibGUoZ2VudXMpKWDvvJoiTkEi44KS6Zmk44GP44Om44OL44O844Kv44Gq6KaB57Sg5pWw77yI57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44Gf44Om44OL44O844Kv44Gq5bGe44Gu5pWw77yJ44GvYHIgbGVuZ3RoKHRhYmxlKGdlbnVzKSlgDQoNCi0gYHNwZWNpZXNg77ya5paH5a2X5YiX44OZ44Kv44OI44OrDQogIC0gKirnqK7jga7kuojmuKzntZDmnpwqKuOBq+ebuOW9kw0KICAtIGRhZGEy5a6f6KGM57WQ5p6c44OV44Kh44Kk44Or77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjga5TcGVjaWVz5YiX44Gu5oOF5aCxDQogIC0gYGxlbmd0aChzcGVjaWVzKWDvvJropoHntKDmlbDvvIhBU1bjga7nt4/mlbDvvInjga9gciBsZW5ndGgoc3BlY2llcylgDQogIC0gYGxlbmd0aChuYS5vbWl0KHNwZWNpZXMpKWDvvJoiTkEi44KS6Zmk44GP6KaB57Sg5pWw77yI57O757Wx5Ymy44KK5b2T44Gm44Gn44GN44GfQVNW5pWw77yJ44GvYHIgbGVuZ3RoKG5hLm9taXQoc3BlY2llcykpYA0KICAtIGBsZW5ndGgodGFibGUoc3BlY2llcykpYO+8miJOQSLjgpLpmaTjgY/jg6bjg4vjg7zjgq/jgaropoHntKDmlbDvvIjns7vntbHlibLjgorlvZPjgabjgafjgY3jgZ/jg6bjg4vjg7zjgq/jgarnqK7jga7mlbDvvInjga9gciBsZW5ndGgodGFibGUoc3BlY2llcykpYA0KDQotIGBnZW51c190cnV0aGDvvJrmloflrZfliJfjg5njgq/jg4jjg6sNCiAgLSAqKuWxnuOBruato+ino+aDheWgsSoq44Gr55u45b2TDQogIC0g56ysMjPlm57jga7ooagx44Gr55u45b2T44GZ44KL6I+M5qCq5oOF5aCx44OV44Kh44Kk44Or77yIW0pTTEFCMjNfdGFibGUxLnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCMjNfdGFibGUxLnR4dCnvvInjga5PcmdhbmlzbeWIl+OBruaDheWgseOAgjHnlarlt6blgbTjga7ljYrop5Ljgrnjg5rjg7zjgrnmiYvliY3jgb7jgafjga7ljZjoqp7jgIINCiAgLSDmnKzmnaXmpJzlh7rjgZfjgZ/jgYTml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnkuK3jga7lsZ7lkI3jgavnm7jlvZMNCiAgLSBgbGVuZ3RoKGdlbnVzX3RydXRoKWDvvJropoHntKDmlbDvvIjjg6bjg4vjg7zjgq/jgarlsZ7jga7mlbDvvInjga9gciBsZW5ndGgoZ2VudXNfdHJ1dGgpYA0KDQotIGBzcGVjaWVzX3RydXRoYO+8muaWh+Wtl+WIl+ODmeOCr+ODiOODqw0KICAtICoq56iu44Gu5q2j6Kej5oOF5aCxKirjgavnm7jlvZMNCiAgLSDnrKwyM+WbnuOBruihqDHjgavnm7jlvZPjgZnjgovoj4zmoKrmg4XloLHjg5XjgqHjgqTjg6vvvIhbSlNMQUIyM190YWJsZTEudHh0XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0Ke+8ieOBrk9yZ2FuaXNt5YiX44Gu5oOF5aCx44CC5pyA5Yid44Gu5Y2K6KeS44K544Oa44O844K544GL44KJ44Kz44Oz44Oe5omL5YmN44G+44Gn44Gu5Y2Y6Kqe44CCDQogIC0gYGxlbmd0aChzcGVjaWVzX3RydXRoKWDvvJropoHntKDmlbDvvIjjg6bjg4vjg7zjgq/jgarnqK7jga7mlbDvvInjga9gciBsZW5ndGgoc3BlY2llc190cnV0aClgDQoNCuOAgFvnrKwyM+Wbnl0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9yX3NlcTIuaHRtbCNib29rX0pTTEFCXzIzKeOBruihqDLjgajlkIzjgZjjgoLjga7jgafjgZnjgYzjgIHnj77lnKjlj5bjgormibHjgaPjgabjgYTjgovoqIgxMuOCteODs+ODl+ODq+OBruamguimgeOCkuS7peS4i+OBq+ekuuOBl+OBpuOBiuOBjeOBvuOBmeOAguOBk+OCjOOBr+OAgVtTUlAxMjU3MjNdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUDEyNTcyMykgKFtIYWxsbWFpZXItV2Fja2VyIGV0IGFsLiwgU2NpIFJlcC4sIDIwMThdKGh0dHBzOi8vcHVibWVkLm5jYmkubmxtLm5paC5nb3YvMjk2NzQ2NDEvKSnjga7jgrXjg5bjgrvjg4Pjg4jjgafjgZnjgILjgZPjgZPjgafjgoTjgo3jgYbjgajjgZfjgabjgYTjgovjgZPjgajjga/jgIHjganjga5ETkHmir3lh7rjgq3jg4Pjg4jjgajkv53lrZjjg5Djg4Pjg5XjgqHjga7ntYTlkIjjgZvjgYzjgIHmnKzmnaXmpJzlh7rjgZfjgZ/jgYTml6Lnn6Xlvq7nlJ/niannvqTpm4ZbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnjgpLjganjgozjgaDjgZHjgYbjgb7jgY/jgqvjg5Djg7zjgZfjgabjgYTjgovjgYvvvJ/jgafjgZnjgIINCg0KfCDjgrXjg7Pjg5fjg6tJRCB8IEROQeaKveWHuuOCreODg+ODiCB8IOS/neWtmOODkOODg+ODleOCoSB8IOODquODvOODieaVsCB8DQp8Oi0tLTp8Oi0tLTp8Oi0tLTp8Oi0tLTp8DQp8IFtTUlI2MzI1ODEzXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODEzKSB8IFFNSU5JIHwgTmF0aXZlIHwgMjgyNTE3IHwNCnwgW1NSUjYzMjU4MTVdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MTUpIHwgUU1JTkkgfCBMeXNpc0J1ZmZlciB8IDI2NjI1OSB8DQp8IFtTUlI2MzI1ODE2XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODE2KSB8IFFNSU5JIHwgUk5BLWxhdGVyIHwgMzU5OTg0IHwNCnwgW1NSUjYzMjU4MTddKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MTcpIHwgUU1JTkkgfCBQQlMgfCAzMjU2NjAgfA0KfCBbU1JSNjMyNTgyOF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTgyOCkgfCBNT0JJTyB8IFJOQS1sYXRlciB8IDIwNjkzOSB8DQp8IFtTUlI2MzI1ODI5XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODI5KSB8IE1PQklPIHwgUEJTIHwgMjYxNzY3IHwNCnwgW1NSUjYzMjU4MzBdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MzApIHwgTU9CSU8gfCBOYXRpdmUgfCAyMzg2MjcgfA0KfCBbU1JSNjMyNTgzMV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTgzMSkgfCBNT0JJTyB8IEx5c2lzQnVmZmVyIHwgMjI1NTQ4IHwNCnwgW1NSUjYzMjU4NTldKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4NTkpIHwgR0VOSUFMIHwgTHlzaXNCdWZmZXIgfCAyOTAzODMgfA0KfCBbU1JSNjMyNTg2MF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MCkgfCBHRU5JQUwgfCBOYXRpdmUgfCAyNTM5MDggfA0KfCBbU1JSNjMyNTg2MV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MSkgfCBHRU5JQUwgfCBQQlMgfCAxMjA3ODkgfA0KfCBbU1JSNjMyNTg2Ml0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MikgfCBHRU5JQUwgfCBSTkEtbGF0ZXIgfCAyNTg3OTIgfA0KDQojIyBXNC4xIGBnZXRGcmVxUGVyU2FtcGxlYOmWouaVsA0K44CAYGdldEZyZXFQZXJTYW1wbGVg6Zai5pWw44Gv44CBVzMuNi4544Gn5a6a576p44GX44GfYGdldF9XMy42YOmWouaVsOOCkuODmeODvOOCueOBq+S9nOaIkOOBl+OBpuOBhOOBvuOBmeOAgmBnZXRfVzMuNmDplqLmlbDjga/mlbDlgKTooYzliJdgZGF0YWDjgpLlhaXlipvjgajjgZfjgablj5fjgZHku5jjgZHjgabjgIHlhoXpg6jnmoTjgavooYzjgZTjgajjga7nt4/lkozjgpJgcm93U3VtcyhkYXRhKWDjgafoqIjnrpfjgZfjgabjgYTjgb7jgZfjgZ/jgIJgZ2V0RnJlcVBlclNhbXBsZWDplqLmlbDjga/jgIHlhoXpg6jnmoTjgavooYzjgZTjgajjga7nt4/lkozjgpLoqIjnrpfjgZfjgarjgYTjgojjgYbjgavjgZfjgabjgYTjgb7jgZnjgILjgb7jgZ/jgIHmhJ/luqbjga7oqIjnrpfpg6jliIbjgafjgIHjgrXjg7Pjg5fjg6vjgavjgojjgaPjgabmpJzlh7rjgafjgY3jgabjgYTjgarjgYTvvIjlh7rnj77poLvluqbjgYww44Gu77yJQVNW6YWN5YiX44KC5a2Y5Zyo44GX44G+44GZ44Gu44Gn44CB5Ye654++6aC75bqm44GMMOOCiOOCiuWkp+OBjeOBhOOCguOBruOBq+mZkOWumuOBl+OBpuOBhOOBvuOBmeOAguOBk+OBrumWouaVsOOBr+OAgVczLjYuMTHjgafov7DjgbnjgZ9bSlNMQUJfc291cmNlLlJdKGh0dHA6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCX3NvdXJjZS5SKeOBruS4reOBp+OCguWumue+qeOBleOCjOOBpuOBhOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpnZXRGcmVxUGVyU2FtcGxlIDwtIGZ1bmN0aW9uKGRhdGEsIHByZWRpY3Rpb24sIHRydXRoKXsNCiAgIyBXMy41LjQNCiAgZnJlcXVlbmN5IDwtIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICMgZGF0YeOCkmZyZXF1ZW5jeeOBq+OCs+ODlOODvA0KICBvYmpfVFAgPC0gaXMuZWxlbWVudChwcmVkaWN0aW9uLCB0cnV0aCkgIyBwcmVkaWN0aW9u5Lit44Gu5ZCE6KaB57Sg44GMdHJ1dGjjgavlkKvjgb7jgozjgovjgYvjganjgYbjgYvjga7liKTlrprntZDmnpzjgpJvYmpfVFDjgavmoLzntI0NCiAgaG9nZTEgPC0gcHJlZGljdGlvbltvYmpfVFBdICAgICAgICAgICAgICMgcHJlZGljdGlvbltvYmpfVFBd44KSaG9nZTHjgavjgrPjg5Tjg7wNCiAgaG9nZTIgPC0gZnJlcXVlbmN5W29ial9UUF0gICAgICAgICAgICAgICMgZnJlcXVlbmN5W29ial9UUF3jgpJob2dlMuOBq+OCs+ODlOODvA0KICBmcmVxIDwtIHJlcCh4ID0gaG9nZTEsIHRpbWVzID0gaG9nZTIpICAgIyBob2dlMeOCkmhvZ2Uy44Gu5oyH5a6a5Zue5pWw5YiG55Sf5oiQ44GX44Gf57WQ5p6c44KSZnJlceOBq+agvOe0jQ0KICBob2dlNCA8LSBhcHBlbmQoZnJlcSwgdHJ1dGgpICAgICAgICAgICAgIyBmcmVx44GodHJ1dGjjgpLpgKPntZDjgZfjgZ/ntZDmnpzjgpJob2dlNOOBq+agvOe0jQ0KICBob2dlNSA8LSB0YWJsZShob2dlNCkgLSAxICAgICAgICAgICAgICAgIyBob2dlNOS4reOBruimgee0oOOBrueorumhnuOBlOOBqOOBruWHuuePvumgu+W6pi0x44KSaG9nZTXjgavmoLzntI0NCiAgIyBXMy40LjUNCiAgb2JqX0ZQIDwtICFvYmpfVFAgICAgICAgICAgICAgICAgICAgICAgICMgb2JqX1RQ44GuVFJVReOBqEZBTFNF44KS5YWl44KM5pu/44GI44Gf57WQ5p6c44KSb2JqX0ZQ44Gr5qC857SNDQogIG90aGVycyA8LSBzdW0oZnJlcXVlbmN5W29ial9GUF0pICAgICAgICAjIG9ial9GUOOBjFRSVUXjga5mcmVxdWVuY3njga7nt4/lkozjgpLoqIjnrpfjgZfjgZ/ntZDmnpzjgpJvdGhlcnPjgavmoLzntI0NCiAgbmFtZXMob3RoZXJzKSA8LSAiT3RoZXJzIiAgICAgICAgICAgICAgICMgb3RoZXJz44GrIk90aGVycyLjgpJuYW1lc+WxnuaAp+OBqOOBl+OBpuS7mOS4jg0KICAjIENvbmNhdGVuYXRlDQogIGhvZ2U2IDwtIGFwcGVuZChob2dlNSwgb3RoZXJzKSAgICAgICAgICAjIGhvZ2U144Gob3RoZXJz44KS6YCj57WQ44GX44Gf57WQ5p6c44KSaG9nZTbjgavmoLzntI0NCiAgDQogICMgc2Vuc2l0aXZpdHkNCiAgZmxhZyA8LSBmcmVxdWVuY3kgPiAwICAgICAgICAgICAgICAgICAgICMgZnJlcXVlbmN55Lit44Gu6KaB57Sg44GMMOOCiOOCiuOCguWkp+OBjeOBhOOCguOBruOCklRSVUXjgIHjgZ3jgozku6XlpJbjgpJGQUxTReOBqOOBl+OBn+e1kOaenOOCkmZsYWfjgavmoLzntI0NCiAgb2JqIDwtIGlzLmVsZW1lbnQodHJ1dGgsIHByZWRpY3Rpb25bZmxhZ10pICMgdHJ1dGjkuK3jga7lkITopoHntKDjgYxwcmVkaWN0aW9uICjkvYbjgZdmbGFn44GMVFJVReOBq+mZkOWuminjgavlkKvjgb7jgozjgovjgYvjganjgYbjgYvjga7liKTlrprntZDmnpzjgpJvYmrjgavmoLzntI0NCiAgc2Vuc2kgPC0gc3VtKG9iaikvbGVuZ3RoKHRydXRoKSAgICAgICAgICMg5oSf5bqm44Gu6KiI566X57WQ5p6c44KSc2Vuc2njgavmoLzntI0NCiAgDQogICMgcHJlY2lzaW9u77yIRlDjgatOQeWQq+OCgO+8iQ0KICBUUCA8LSBzdW0oZnJlcXVlbmN5W29ial9UUF0pICAgICAgICAgICAgIyBvYmpfVFDjgYxUUlVF44GuZnJlcXVlbmN544Gu57eP5ZKM44KS6KiI566X44GX44Gf57WQ5p6c44KSVFDjgavmoLzntI0NCiAgRlAgPC0gb3RoZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3RoZXJz44KSRlDjgavjgrPjg5Tjg7wNCiAgcHJlY2kxIDwtIFRQIC8gKFRQICsgRlApICAgICAgICAgICAgICAgICMg6YGp5ZCI546H44KS6KiI566X44GX44Gf57WQ5p6c44KScHJlY2kx44Gr5qC857SNDQogIA0KICAjIHByZWNpc2lvbu+8iEZQ44GrTkHlkKvjgb7jgarjgYTvvIkNCiAgb2JqX1AgPC0gIWlzLm5hKHByZWRpY3Rpb24pICAgICAgICAgICAgICMgcHJlZGljdGlvbuOBruWQhOimgee0oOOBjE5B44Gn44Gq44GE44GL44Gp44GG44GL44Gu5Yik5a6a57WQ5p6c44KSb2JqX1DjgavmoLzntI0NCiAgb2JqX0ZQIDwtIG9ial9QICYgIW9ial9UUCAgICAgICAgICAgICAgICMgb2JqX1Djgaghb2JqX1RQ44Gu5Lih5pa544GnVFJVReOBruimgee0oOOBruOBv+OCklRSVUXjgajjgZfjgZ/ntZDmnpzjgpJvYmpfRlDjgavmoLzntI0NCiAgRlAgPC0gc3VtKGZyZXF1ZW5jeVtvYmpfRlBdKSAgICAgICAgICAgICMgb2JqX0ZQ44GMVFJVReOBrmZyZXF1ZW5jeeOBrue3j+WSjOOCkuioiOeul+OBl+OBn+e1kOaenOOCkkZQ44Gr5qC857SNDQogIHByZWNpMiA8LSBUUCAvIChUUCArIEZQKSAgICAgICAgICAgICAgICAjIOmBqeWQiOeOh+OCkuioiOeul+OBl+OBn+e1kOaenOOCknByZWNpMuOBq+agvOe0jQ0KICANCiAgIyBvdXRwdXQNCiAgcnRuIDwtIGxpc3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMg57WQ5p6c44KS44Oq44K544OI5b2i5byP44Gn6L+U44GZ44Gf44KB44GucnRu44KS5L2c5oiQDQogIHJ0biRmcmVxdWUgPC0gaG9nZTYgICAgICAgICAgICAgICAgICAgICAjIGhvZ2U244KSZnJlcXVl44Go44GE44GG5ZCN5YmN44Gn6L+95YqgDQogIHJ0biRUUHBvc2kgPC0gb2JqX1RQICAgICAgICAgICAgICAgICAgICAjIG9ial9UUOOCklRQcG9zaeOBqOOBhOOBhuWQjeWJjeOBp+i/veWKoA0KICBydG4kc2Vuc2l0aXZpdHkgPC0gc2Vuc2kgICAgICAgICAgICAgICAgIyBzZW5zaeOCknNlbnNpdml0aXR544Go44GE44GG5ZCN5YmN44Gn6L+95YqgDQogIHJ0biRwcmVjaXNpb25fd2l0aF9OQSA8LSBwcmVjaTEgICAgICAgICAjIHByZWNpMeOCknByZWNpc2lvbl93aXRoX05B44Go44GE44GG5ZCN5YmN44Gn6L+95YqgDQogIHJ0biRwcmVjaXNpb25fd2l0aG91dF9OQSA8LSBwcmVjaTIgICAgICAjIHByZWNpMuOCknByZWNpc2lvbl93aXRob3V0X05B44Go44GE44GG5ZCN5YmN44Gn6L+95YqgDQogIHJldHVybihydG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJ0buOBruS4rei6q+OCkumWouaVsOWun+ihjOe1kOaenOOBqOOBl+OBpui/lOOBmQ0KfQ0KYGBgDQoNCiMjIFc0LjIg44G544Gf5pu444GN44Gn5a6f6KGMDQrjgIBgZ2V0RnJlcVBlclNhbXBsZWDplqLmlbDjga7mnIDliJ3jga7lvJXmlbDjgajjgZfjgabkuI7jgYjjgovmg4XloLHjga/jg5njgq/jg4jjg6vjgafjgZnjgILjgZPjgZPjgafjga/jgIHoqIgxMuOCteODs+ODl+ODq+OBi+OCieani+aIkOOBleOCjOOCi+aVsOWApOihjOWIl2BkYXRhYOOBhuOBoeOAgWAxYOWIl+ebruOBruaDheWgseOBruOBv+OCkuWFpeWKm+OBqOOBl+OBpuS4juOBiOOBpuOBhOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpqIDwtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIOino+aekOOBl+OBn+OBhOWIl+eVquWPt+aDheWgsQ0KcmVzdWx0IDwtIGdldEZyZXFQZXJTYW1wbGUoZGF0YVssIGpdLCBnZW51cywgZ2VudXNfdHJ1dGgpIyBq5YiX55uu44Gu5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44GmcmVzdWx044Gr5qC857SNDQpyZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdOOBruS4rei6qw0KYGBgDQrjgIDvvIjkuIroqJjjga7ntZDmnpzjgpLjgZ3jga7jgb7jgb7nnLrjgoHjgabjgoLjgojjgYTjga7jgafjgZnjgYzvvIlgcmVzdWx0JGZyZXF1ZWDjgafopovjgonjgozjgosx55Wq55uu44Gu44K144Oz44OX44Or44Gu44G/44Gu6aC75bqm5oOF5aCx44Gv44CBVzMuNi4xMOOBp+imi+OCieOCjOOCizEy44K144Oz44OX44Or44KS5ZCI44KP44Gb44Gf6aC75bqm5oOF5aCx44KI44KK44KC5piO44KJ44GL44Gr5bCR44Gq44GP5aal5b2T44Gg44Go5Yik5pat44Gn44GN44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnJlc3VsdCRmcmVxdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVzdWx0JGZyZXF1ZeOBruS4rei6qw0KYGBgDQrjgIDjgarjgYrjgIHjgZPjgozjga/ku6XkuIvjgajlrp/os6rnmoTjgavlkIzjgZjjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaiA8LSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyDop6PmnpDjgZfjgZ/jgYTliJfnlarlj7fmg4XloLENCmdldEZyZXFQZXJTYW1wbGUoZGF0YVssIGpdLCBnZW51cywgZ2VudXNfdHJ1dGgpJGZyZXF1ZSMgauWIl+ebruOBruWHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+lw0KYGBgDQrjgIDjgYvjgarjgorjg63jg7zjg4bjgq/jgarmhJ/jgZjjgafjgZnjgYzjgIHku6XkuIvjga7jgojjgYbjgavjgZnjgozjgbDmnIDliJ3jga4244K144Oz44OX44Or5YiG44Gu5bGe44GU44Go44Gu5Ye654++6aC75bqm5oOF5aCx44KS44G+44Go44KB44KL44GT44Go44GM44Gn44GN44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmZyZXF1ZTEgPC0gZ2V0RnJlcVBlclNhbXBsZShkYXRhWywgMV0sIGdlbnVzLCBnZW51c190cnV0aCkkZnJlcXVlIyAx5YiX55uu44Gu5Ye654++6aC75bqm5oOF5aCx44KS5Y+W5b6X44GX44GmZnJlcXVlMeOBq+agvOe0jQ0KZnJlcXVlMiA8LSBnZXRGcmVxUGVyU2FtcGxlKGRhdGFbLCAyXSwgZ2VudXMsIGdlbnVzX3RydXRoKSRmcmVxdWUjIDLliJfnm67jga7lh7rnj77poLvluqbmg4XloLHjgpLlj5blvpfjgZfjgaZmcmVxdWUy44Gr5qC857SNDQpmcmVxdWUzIDwtIGdldEZyZXFQZXJTYW1wbGUoZGF0YVssIDNdLCBnZW51cywgZ2VudXNfdHJ1dGgpJGZyZXF1ZSMgM+WIl+ebruOBruWHuuePvumgu+W6puaDheWgseOCkuWPluW+l+OBl+OBpmZyZXF1ZTPjgavmoLzntI0NCmZyZXF1ZTQgPC0gZ2V0RnJlcVBlclNhbXBsZShkYXRhWywgNF0sIGdlbnVzLCBnZW51c190cnV0aCkkZnJlcXVlIyA05YiX55uu44Gu5Ye654++6aC75bqm5oOF5aCx44KS5Y+W5b6X44GX44GmZnJlcXVlNOOBq+agvOe0jQ0KZnJlcXVlNSA8LSBnZXRGcmVxUGVyU2FtcGxlKGRhdGFbLCA1XSwgZ2VudXMsIGdlbnVzX3RydXRoKSRmcmVxdWUjIDXliJfnm67jga7lh7rnj77poLvluqbmg4XloLHjgpLlj5blvpfjgZfjgaZmcmVxdWU144Gr5qC857SNDQpmcmVxdWU2IDwtIGdldEZyZXFQZXJTYW1wbGUoZGF0YVssIDZdLCBnZW51cywgZ2VudXNfdHJ1dGgpJGZyZXF1ZSMgNuWIl+ebruOBruWHuuePvumgu+W6puaDheWgseOCkuWPluW+l+OBl+OBpmZyZXF1ZTbjgavmoLzntI0NCnJlc3VsdCA8LSBjYmluZChmcmVxdWUxLCBmcmVxdWUyLCBmcmVxdWUzLCMgNuOCteODs+ODl+ODq+WIhuOBrumgu+W6puaDheWgseOCkuWIl+aWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCknJlc3VsdOOBq+agvOe0jQ0KICAgICAgICAgICAgICAgIGZyZXF1ZTQsIGZyZXF1ZTUsIGZyZXF1ZTYpIyA244K144Oz44OX44Or5YiG44Gu6aC75bqm5oOF5aCx44KS5YiX5pa55ZCR44Gn57WQ5ZCI44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQpyZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdOOBruS4rei6qw0KYGBgDQoNCiMjIFc0LjMgYGFwcGx5YOmWouaVsOOBp+Wun+ihjA0K44CAYGFwcGx5YOmWouaVsOOBr+OAgeihjOWIl+OCkuWFpeWKm+OBqOOBl+OBpuOAgeihjOOBlOOBqOOChOWIl+OBlOOBqOOBq+S7u+aEj+OBruWHpueQhuOCkuihjOOBhuOBn+OCgeOBrumWouaVsOOBp+OBme+8iFczLjEuM++8ieOAguOBk+OBk+OBp+OBr+OAgWBhcHBseWDplqLmlbDjga7kuK3jgadgZ2V0RnJlcVBlclNhbXBsZWDplqLmlbDjgpLlrp/ooYzjgZnjgovkvovjgpLnpLrjgZfjgb7jgZnjgIJgciBucm93KGRhdGEpYOihjCAkXHRpbWVzJCBgciBuY29sKGRhdGEpYOWIl+OBi+OCieOBquOCi+aVsOWApOihjOWIl2BkYXRhYOOCkuWFpeWKm+OBqOOBl+OBpu+8iGBYID0gZGF0YWDvvInjgIHliJfjgZTjgajjgavvvIhgTUFSR0lOID0gMmDvvInjgIFgZ2V0RnJlcVBlclNhbXBsZWDplqLmlbDjgpLpgannlKjjgZnjgovvvIhgRlVOID0gZ2V0RnJlcVBlclNhbXBsZWDvvInjgIFgZ2V0RnJlcVBlclNhbXBsZWDplqLmlbDjgafkuI7jgYjjgarjgYTjgajjgYTjgZHjgarjgYTmrovjgorjga7lvJXmlbDjgpLoqJjovInvvIhgZ2VudXMsIGdlbnVzX3RydXRoYO+8ieOBqOOBhOOBhuabuOOBjeaWueOBq+OBl+OBpuOBhOOBvuOBmeOAgmBnZXRGcmVxUGVyU2FtcGxlYOmWouaVsOiHquS9k+OBr+OAgeioiDPjgaTjga7lvJXmlbDjgpLlhaXlipvjgajjgZfjgabkuI7jgYjjgb7jgZnvvIhXNC4y77yJ44CCMeeVquebruOBruW8leaVsOOBr2BkYXRhYOOAgTLnlarnm67jga7lvJXmlbDjga9gZ2VudXNg44CB44Gd44GX44GmM+eVquebruOBruW8leaVsOOBr2BnZW51c190cnV0aGDjgpLkuI7jgYjjgabplqLmlbDjgpLlrp/ooYzjgZfjgZ/jgYTjga7jgafjgIHjgZPjga7jgojjgYbjgarmm7jjgY3mlrnjgavjgarjgaPjgabjgYTjgb7jgZnjgILmqKrplbfjgavjgarjgorjgZnjgY7jgovjga7jgafjgIEz6KGM44Gr5YiG44GR44Gm6KiY6LyJ44GX44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnJlc3VsdCA8LSBhcHBseShYID0gZGF0YSwgTUFSR0lOID0gMiwgICAgICMgZGF0YeOBruWIl+OBlOOBqOOBq+WHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBn+e1kOaenOOCknJlc3VsdOOBq+agvOe0jQ0KICAgICAgICAgICAgICAgIEZVTiA9IGdldEZyZXFQZXJTYW1wbGUsICAgIyBkYXRh44Gu5YiX44GU44Go44Gr5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQogICAgICAgICAgICAgICAgZ2VudXMsIGdlbnVzX3RydXRoKSAgICAgICAjIGRhdGHjga7liJfjgZTjgajjgavlh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgZ/ntZDmnpzjgpJyZXN1bHTjgavmoLzntI0NCmBgYA0K44CAYHN0cmDplqLmlbDjga/jgIHlhaXlipvjgajjgZfjgabkuI7jgYjjgonjgozjgZ/jgqrjg5bjgrjjgqfjgq/jg4jjga7mp4vpgKDvvIhzdHJ1Y3R1cmXvvInjgpLov5TjgZfjgb7jgZnvvIhXMy42LjjvvInjgIJgZ2V0RnJlcVBlclNhbXBsZWDplqLmlbDjga/jgIHjgrXjg7Pjg5fjg6vjgZTjgajjgatgZnJlcXVlYCwgYFRQcG9zaWAsIGBzZW5zaXRpdml0eWAsIGBwcmVjaXNpb25fd2l0aF9OQWAsIGFuZCBgcHJlY2lzaW9uX3dpdGhvdXRfTkFg44Gu6KiINeeorumhnuOBrue1kOaenOOCkuODquOCueODiOW9ouW8j+OBp+i/lOOBl+OBvuOBme+8iFc0LjHvvInjgILku6XkuIvjgafopovjgYjjgabjgYTjgotgcmVzdWx0YOOCquODluOCuOOCp+OCr+ODiOOBr+OAgeioiDEy44K144Oz44OX44Or5YiG44Gu57WQ5p6c44GM44Oq44K544OI5b2i5byP44Gn44G+44Go44KB44KJ44KM44Gf5b2i44Gr44Gq44Gj44Gm44GE44KL44GT44Go44GM77yI5YWo5L2T55qE44Gq6KaL44Gf55uu44GL44KJ77yJ44KP44GL44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnN0cihyZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVzdWx044Gu5qeL6YCg44KS6KGo56S6DQpgYGANCg0KIyMgVzQuNCDmg4XloLHmir3lh7rvvIjlsZ7jg6zjg5njg6vvvIkNCuOAgOOBk+OBk+OBp+OBr+OAgVc0LjPjgaflvpfjgZ/jg6rjgrnjg4jlvaLlvI/jga5gcmVzdWx0YOOCquODluOCuOOCp+OCr+ODiOOCkuWFpeWKm+OBqOOBl+OBpuOAgeOCteODs+ODl+ODq+OBlOOBqOOBruWHuuePvumgu+W6puOCkuOBvuOBqOOCgeOBpuaVsOWApOihjOWIl+OBqOOBl+OBpuW+l+OBn+OCiuOAgeaEn+W6puOChOmBqeWQiOeOh+OCkuOBvuOBqOOCgeOBpuaVsOWApOihjOWIl+OBruS4i+mDqOOBq+i/veWKoOOBmeOCi+OBquOBqeOBruS9nOalreOCkuihjOOBhOOBvuOBmeOAgg0KDQojIyMgVzQuNC4xIOWHuuePvumgu+W6puaDheWgseOBruaKveWHug0K44CA44GT44GT44Gn44Gv44CBYHJlc3VsdGDjgqrjg5bjgrjjgqfjgq/jg4jjga7kuK3jgYvjgonjgIHjgrXjg7Pjg5fjg6vjgZTjgajjga7ntZDmnpzjga5gMWDnlarnm67jga7opoHntKDjgafjgYLjgotgZnJlcXVlYOaDheWgseOCkuaKveWHuuOBl+OBpuOAgeioiDEy44K144Oz44OX44Or5YiG44Gu5bGe44GU44Go44Gu5Ye654++6aC75bqm44KS5pWw5YCk6KGM5YiX44Go44GX44Gm5b6X44KL5L2c5qWt44KS6KGM44GE44G+44GZ44CC5YWl5Yqb44Gn44GC44KLYHJlc3VsdGDjgYzjg6rjgrnjg4jlvaLlvI/jgafjgZnjga7jgafjgIHjgZPjgZPjgafjga9gc2FwcGx5YOmWouaVsOOCkueUqOOBhOOBpuOAgeODquOCueODiOW9ouW8j+OBruOCquODluOCuOOCp+OCr+ODiOOBq+WvvuOBl+OBpumAkOasoeeahOOBquWHpueQhuOCkuihjOOBhOOBvuOBmeOAguWFt+S9k+eahOOBq+OBr+OAgVcyLjIuNOOBqOWQjOOBmOOCiOOBhuOBquWHpueQhuOCkuihjOOBhuOBueOBj+OAgeOCquODluOCuOOCp+OCr+ODiOS4reOBruaMh+WumuOBl+OBn+S9jee9ruOBruaDheWgseOCkuaKveWHuuOBmeOCi2BbYOOBqOOBhOOBhumWouaVsOOCkuWun+ihjOOBl+OAgWAxYOOBqOOBhOOBhuaDheWgseOCkuOCquODl+OCt+ODp+ODs+OBqOOBl+OBpuS4juOBiOOBpuOBhOOBvuOBmeOAgmBzYXBwbHlg6Zai5pWw5a6f6KGM57WQ5p6c44Gn44GC44KLYGhvZ2Vg44Kq44OW44K444Kn44Kv44OI44Gu5qeL6YCg44KSYHN0cmDplqLmlbDjgafooajnpLrjgZXjgZvjgZ/ntZDmnpzvvIhgc3RyKGhvZ2UpYO+8ieOCiOOCiuOAgeaVsOWApOihjOWIl+W9ouW8j+OBp+OBr+OBquOBj+ODquOCueODiOW9ouW8j+OBp+OBr+OBguOCi+OCguOBruOBruOAgeOAjOOCteODs+ODl+ODq+OBlOOBqOOBrue1kOaenOOBrmAxYOeVquebruOBruimgee0oOOBp+OBguOCi2BmcmVxdWVg5oOF5aCx44CN44Gu44G/44Gu5oq95Ye644Gn44GN44Gm44GE44KL44Gj44G944GE44GT44Go44GM44KP44GL44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmhvZ2UgPC0gc2FwcGx5KFggPSByZXN1bHQsIEZVTiA9IGBbYCwgMSkgICMgcmVzdWx05Lit44Gu5ZCE6KaB57Sg44GL44KJ44CBMeeVquebruOBruimgee0oOOBruaKveWHuue1kOaenOOCkmhvZ2XjgavmoLzntI0NCnN0cihob2dlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeOBruani+mAoOOCkuihqOekug0KYGBgDQrjgIDjg6rjgrnjg4jlvaLlvI/jgavjgarjgaPjgabjgYTjgotgaG9nZWDkuK3jga7lkITopoHntKDjga9gZnJlcXVlYOaDheWgseOBq+OBquOCiuOBvuOBmeOAguOBpOOBvuOCiuOAgWBob2dlYOS4reOBruOAjOWQhOimgee0oOOAjeOBr+OAgeOAjOOCteODs+ODl+ODq+OBlOOBqOOBrjIw5YCL44Gu6KaB57Sg44GL44KJ44Gq44KL5pWw5YCk44OZ44Kv44OI44Or44CN44Gn44GZ44CC44GX44Gf44GM44Gj44Gm44CB44CM44Oq44K544OI5b2i5byP44Gr44Gq44Gj44Gm44GE44KLYGhvZ2Vg5Lit44Gu5ZCE6KaB57Sg44CN44KSYGNiaW5kYOmWouaVsOOCkueUqOOBhOOBpuWIl+aWueWQkeOBp+e1kOWQiOOBl+OBpuOChOOCjOOBsOOAgeW+l+OCieOCjOOCi+e1kOaenO+8iOOBpOOBvuOCimBmcmVxX21hdGDvvInjga/mlbDlgKTooYzliJfjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZnJlcV9tYXQgPC0gc2FwcGx5KFggPSBob2dlLCBGVU4gPSBjYmluZCkgIyBob2dl5Lit44Gu5ZCE6KaB57Sg44KS5YiX5pa55ZCR44Gn57WQ5ZCI44GX44Gf57WQ5p6c44KSZnJlcV9tYXTjgavmoLzntI0NCnN0cihmcmVxX21hdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZnJlcV9tYXTjga7mp4vpgKDjgpLooajnpLoNCmBgYA0K44CAYHN0cihmcmVxX21hdClg5a6f6KGM57WQ5p6c44Gu5pyA5Yid44Gu44G744GG44Gn6KaL44GI44Gm44GE44KL44CMbnVtIFsxOjIwLCAxOjEyXeOAjeOCiOOCiuOAgTIw6KGMICRcdGltZXMkIDEy5YiX44Gu5pWw5YCk6KGM5YiX44Gn44GC44KL44GT44Go44GM44Gq44KT44Go44Gq44GP44KP44GL44KL44Go5oCd44GE44G+44GZ44CCYHN0cmDplqLmlbDjga/jg6rjgrnjg4jlvaLlvI/jgarjganmr5TovIPnmoTopIfpm5Hjgarjgqrjg5bjgrjjgqfjgq/jg4jjga7lhajkvZPlg4/jgpLmiormj6HjgZnjgovpmpvjgavjga/kvr/liKnjgafjgZnjgYzjgIHmlbDlgKTooYzliJfjga7jgojjgYbjgarnsKHljZjjgarjgqrjg5bjgrjjgqfjgq/jg4jjga7jgajjgY3jgavjga/jgYvjgYjjgaPjgabjgo/jgYvjgorjgaXjgonjgYTjgYvjgoLjgZfjgozjgb7jgZvjgpPjgIJgZnJlcV9tYXRg44Gu5aC05ZCI44Gv44CBYGRpbShmcmVxX21hdClg44KEYGhlYWQoZnJlcV9tYXQpYOOBqOOBi+OBp+Wkp+OBvuOBi+OBq+aKiuaPoeOBmeOCi+OBu+OBhuOBjOOCj+OBi+OCiuOChOOBmeOBhOOBi+OCguOBl+OCjOOBvuOBm+OCk+OAguacgOWIneOBrjbliJfliIbjgavjgaTjgYTjgabjga/jgIFXNC4y44Gu5pyA5b6M44Gu44G744GG44Gn6KaL44GI44Gm44GE44KL5pWw5YCk6KGM5YiX44Go5LiA6Ie044GX44Gm44GE44KL44GT44Go44GM44KP44GL44KK44G+44GZ44CCVzQuMuOBr+eEoemnhOOBqOaAneOCj+OCjOOBn+OBi+OBn+OCguOBhOOCieOBo+OBl+OCg+OCi+OBi+OCguOBl+OCjOOBvuOBm+OCk+OBjOOAgeOBk+OBruOCiOOBhuOBquetlOOBiOWQiOOCj+OBm+OBqOOBl+OBpuS9v+OBiOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpkaW0oZnJlcV9tYXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZyZXFfbWF044Gu6KGM5pWw44Go5YiX5pWwDQpoZWFkKGZyZXFfbWF0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZyZXFfbWF05Lit44Gu5Lit44Gu5pyA5Yid44GuNuOBpOOCkuihqOekug0KYGBgDQoNCiMjIyBXNC40LjIgYHJvd25hbWVzYOmWouaVsA0K44CA5YmN6L+w44Gu6KGo56S657WQ5p6c44GL44KJ44KC44KP44GL44KK44G+44GZ44GM44CBYGZyZXFfbWF0YOOBq+OBr+WIl+WQjeaDheWgseOBr+WQq+OBvuOCjOOBpuOBhOOBvuOBmeOBjOOAgeihjOWQjeaDheWgseOBr+WQq+OBvuOCjOOBpuOBhOOBvuOBm+OCk+OAguOBk+OBruOCiOOBhuOBquWgtOWQiOOBq+OAgWByb3duYW1lc2DplqLmlbDjgpLnlKjjgYTjgabooYzliJfjgavooYzlkI3jgpLku5jkuI7jgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgILooYzlkI3jgajjgZfjgabku5jkuI7jgZnjgovjga7jga/ln7rmnKznmoTjgavlsZ7lkI3mg4XloLHjgavjgarjgorjgb7jgZnjgILjgZXjgY3jgbvjgalXNC40LjHjga7mnIDliJ3jga7jgbvjgYbjgaflvpfjgZ9gaG9nZWDjgqrjg5bjgrjjgqfjgq/jg4jjgpLjgojjgY/jgb/jgovjgajjgIHlsZ7lkI3mg4XloLHjgYzmoLzntI3jgZXjgozjgabjgYTjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaG9nZSA8LSBzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCAxKSAgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgonjgIEx55Wq55uu44Gu6KaB57Sg44Gu5oq95Ye657WQ5p6c44KSaG9nZeOBq+agvOe0jQ0Kc3RyKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl44Gu5qeL6YCg44KS6KGo56S6DQpgYGANCuOAgOWFt+S9k+eahOOBq+OBr+OAgeOAjGBob2dlYOOCquODluOCuOOCp+OCr+ODiOOBq+WQq+OBvuOCjOOCi+OAgeioiDEy44K144Oz44OX44Or5Lit44Gu44Gp44Gu6KaB57Sg77yI44K144Oz44OX44Or77yJ44Gr44KC5bGe5ZCN5oOF5aCx44GM5ZCr44G+44KM44Gm44GE44KL44CN44GT44Go44GM44KP44GL44KK44G+44GZ44CC5L6L44GI44Gw44Oq44K544OI5b2i5byP44GuYDFg55Wq55uu44Gu6KaB57Sg44KS5oq95Ye644GX44Gf44GE5aC05ZCI44Gv44CB5Lul5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmhvZ2VbWzFdXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeS4reOBrjHnlarnm67jga7opoHntKANCmBgYA0K44CA44GT44KM44GubmFtZXPlsZ7mgKfmg4XloLHjgYzjgIFgZnJlcV9tYXRg44Gr5YiX5ZCN44Go44GX44Gm5LiO44GI44Gf44GE5oOF5aCx44Gr44Gq44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCm5hbWVzKGhvZ2VbWzFdXSkgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeS4reOBrjHnlarnm67jga7opoHntKDjga5uYW1lc+WxnuaApw0KYGBgDQrjgIDmrovjgorjga/jgIFgZnJlcV9tYXRg44Gu6KGM5ZCN5oOF5aCx44Go44GX44GmYG5hbWVzKGhvZ2VbWzFdXSlg44KS5Luj5YWl44GZ44KL44Gg44GR44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnJvd25hbWVzKGZyZXFfbWF0KSA8LSBuYW1lcyhob2dlW1sxXV0pICAgICMgbmFtZXMoaG9nZVtbMV1dKeOCkmZyZXFfbWF044Gu6KGM5ZCN5oOF5aCx44Go44GZ44KLDQpgYGANCuOAgOW/teOBruOBn+OCgeeiuuiqjeOBl+OBpuOBhOOCi+OBoOOBkeOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpmcmVxX21hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZyZXFfbWF044Gu5Lit6LqrDQpgYGANCuOAgOacrOizqueahOOBqumDqOWIhuOBp+OBr+OBguOCiuOBvuOBm+OCk+OBp+OBl+OBn+OBjOOAgeawl+OBq+OBquOCi+OBqOOBmuOBo+OBqOawl+OBq+OBquOCiue2muOBkeOCi+mDqOWIhuOBp+OBmeOBl+OAgeOAguOBvuOBn+OAgeacgOW+jOOBruacgOW+jOOBp+iHquWLleeahOOBq+e1kOaenOOCkuOBvuOBqOOCgeOBpuihqOOBqOOBl+OBpuS9nOaIkOOBl+OBn+OBhOWgtOWQiOOBquOBqeOBq+OAgeW+jOOBp+iLpuWKtOOBmeOCi+OBk+OBqOOBq+OBquOCi+WgtOWQiOOCguOBguOCiuOBvuOBmeOAguWun+mam+OAgVc144Gu5L2c5oiQ6YCU5Lit44GnYGZyZXFfbWF0YOS4reOBq+ihjOWQjeaDheWgseOBjOWtmOWcqOOBl+OBquOBhOOBk+OBqOOBq+awl+OBpeOBjeOAgeacgOW+jOOBruacgOW+jOOBp+OBp+OBk+OBrumgheebruOCkui/veWKoOOBmeOCi+e+veebruOBq+mBreOBo+OBpuOBhOOBvuOBmeOAgg0KDQojIyMgVzQuNC4zIOaEn+W6puaDheWgseOBruaKveWHug0K44CA44GT44GT44Gn44Gv44CBYHJlc3VsdGDjgqrjg5bjgrjjgqfjgq/jg4jjga7kuK3jgYvjgonjgIHjgrXjg7Pjg5fjg6vjgZTjgajjga7ntZDmnpzjga5gM2Dnlarnm67jga7opoHntKDjgafjgYLjgotgc2Vuc2l0aXZpdHlg5oOF5aCx44KS5oq95Ye644GX44Gm44CB6KiIMTLjgrXjg7Pjg5fjg6vliIbjga7lsZ7jgZTjgajjga7mhJ/luqbmg4XloLHjga7jgb/jgpLlvpfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaG9nZSA8LSBzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCAzKSAgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgokz55Wq55uu44Gu6KaB57Sg44Gu5oq95Ye657WQ5p6c44KSaG9nZeOBq+agvOe0jQ0Kc3RyKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl44Gu5qeL6YCg44KS6KGo56S6DQpgYGANCuOAgOWHuuWKm+e1kOaenOOBp+OBguOCi2Bob2dlYOOCquODluOCuOOCp+OCr+ODiOOBr+OAgTEy5YCL44Gu6KaB57Sg44GL44KJ44Gq44KL44Oq44K544OI5b2i5byP44Gn44GC44KL44GT44Go44GM44KP44GL44KK44G+44GZ44CCMeOBpDHjgaTjga7opoHntKDjga/jgrnjgqvjg6njg7zvvIgx44Gk44Gu5pWw5a2X77yJ44Gn44CB44GZ44G544GmMC43ODnjgafjgYLjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgILjgb7jgZ/jgIFXNC40LjHjga5gaGVhZChmcmVxX21hdClg5a6f6KGM57WQ5p6c44Gn6KaL44GI44Gm44GE44KLM+ihjOebruOBqDbooYznm67jgasw44GM5Lim44KT44Gn44GE44KL54q25rOB44KS6LiP44G+44GI44CB44CM44GK44Gd44KJ44GP5YWo44Gm44Gu44K144Oz44OX44Or44GM5ZCM44GY5bGe44KS5qSc5Ye644Gn44GN44Gm44GE44Gq44GE44Gu44Gg44KN44GG44CC44Gd44Gu44GG44Gh44GuMuOBpOOBr+OAgTPooYznm67jgag26KGM55uu44Gu5bGe44CCMTUvMTkgPSAwLjc4OTQ3Mzfjgarjga7jgafjgIHmpJzlh7rjgafjgY3jgabjgYTjgarjgYTjga7jga805bGe44CC44CN44Gu44KI44GG44Gr6Kej6YeI44GX44G+44GZ44CC6KGo56S657WQ5p6c44Gu5YiG6YeP44KC44Gf44GL44GM55+l44KM44Gm44GE44KL44Gu44Gn44CB5Lul5LiL44GrYGhvZ2Vg5a6f6KGM57WQ5p6c44KC56S644GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmhvZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeOBruS4rei6qw0KYGBgDQrjgIBb56ysMjTlm57jga5XMS42LjVdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQjI0Lmh0bWwjVzE2NV91bmxpc3QlRTklOTYlQTIlRTYlOTUlQjAlRTMlODIlODIlRTQlQkQlQjUlRTclOTQlQTgp44Gn44KC5Yip55So44GX44G+44GX44Gf44GM44CB5LiK6KiYYGhvZ2Vg44Gu44KI44GG44Gq5oSf44GY44Gn6KaL44GI44Gm44GE44KL44Oq44K544OI5b2i5byP44Gu44KC44Gu44Gv44CB44Oq44K544OI5b2i5byP44KS6Kej6Zmk44GZ44KLYHVubGlzdGDplqLmlbDjgpLlrp/ooYzjgZfjgabjgoTjgozjgbDjgIHjg5njgq/jg4jjg6vlvaLlvI/jgavlpInmm7TjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdW5saXN0KGhvZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl44KS44OZ44Kv44OI44Or5b2i5byP44Gr5aSJ5pu0DQpgYGANCuOAgOOBk+OBk+OBvuOBp+OBruS4gOmAo+OBruS9nOalreOBr+OAgeS7peS4i+OBruOCiOOBhuOBquaEn+OBmOOBp+OBvuOBqOOCgeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpzZW5zaXRpdml0eSA8LSB1bmxpc3Qoc2FwcGx5KFggPSByZXN1bHQsIEZVTiA9IGBbYCwgMykpICMgcmVzdWx05Lit44Gu5ZCE6KaB57Sg44GL44KJM+eVquebruOBruimgee0oOOBruOBv+aKveWHuuOBl+OBn+e1kOaenOOCkuODmeOCr+ODiOODq+W9ouW8j+OBq+OBl+OBpnNlbnNpdGl2aXR544Gr5qC857SNDQpzZW5zaXRpdml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlbnNpdGl2aXR544Gu5Lit6LqrDQpgYGANCg0KIyMjIFc0LjQuNCDpganlkIjnjofmg4XloLHjga7mir3lh7oNCuOAgOOBk+OBk+OBp+OBr+OAgWByZXN1bHRg44Kq44OW44K444Kn44Kv44OI44Gu5Lit44GL44KJ44CB44K144Oz44OX44Or44GU44Go44Gu57WQ5p6c44GuYDRg55Wq55uu44Gu6KaB57Sg44Gn44GC44KLYHByZWNpc2lvbl93aXRoX05BYOaDheWgseOAgeOBiuOCiOOBs2A1YOeVquebruOBruimgee0oOOBp+OBguOCi2BwcmVjaXNpb25fd2l0aG91dF9OQWDmg4XloLHjgpLmir3lh7rjgZfjgb7jgZnvvIhXMy42LjnvvInjgIJUUCAvIChUUCArIEZQKeOBp+Wumue+qeOBleOCjOOCi+mBqeWQiOeOh+OBr+OAgUZQ44KS44CMVFDku6XlpJbjga7lhajjgabjga5BU1bmlbDvvIhOQeOCguWQq+OCgeOCi++8ieOAjeOBruOCiOOBhuOBq05B44KS5ZCr44KB44KL5aC05ZCI44GM5YmN6ICF77yIYHByZWNpc2lvbl93aXRoX05BYO+8ieOAgeWQq+OCgeOBquOBhOWgtOWQiOOBjOW+jOiAhe+8iGBwcmVjaXNpb25fd2l0aG91dF9OQWDvvInjga7mg4XloLHjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlY2lzaW9uX3dpdGhfTkEgPC0gdW5saXN0KHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDQpKSAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCiTTnlarnm67jga7opoHntKDjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpLjg5njgq/jg4jjg6vlvaLlvI/jgavjgZfjgaZwcmVjaXNpb25fd2l0aF9OQeOBq+agvOe0jQ0KcHJlY2lzaW9uX3dpdGhvdXRfTkEgPC0gdW5saXN0KHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDUpKSAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCiTXnlarnm67jga7opoHntKDjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpLjg5njgq/jg4jjg6vlvaLlvI/jgavjgZfjgaZwcmVjaXNpb25fd2l0aG91dF9OQeOBq+agvOe0jQ0KYGBgDQrjgIBgcHJlY2lzaW9uX3dpdGhfTkFg44Gu5Lit6Lqr44KS5b+144Gu44Gf44KB56S644GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnByZWNpc2lvbl93aXRoX05BICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlY2lzaW9uX3dpdGhfTkHjga7kuK3ouqsNCmBgYA0K44CAYHByZWNpc2lvbl93aXRob3V0X05BYOOBruS4rei6q+OCkuW/teOBruOBn+OCgeekuuOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpwcmVjaXNpb25fd2l0aG91dF9OQSAgICAgICAgICAgICAgICAgICAgICAjIHByZWNpc2lvbl93aXRob3V0X05B44Gu5Lit6LqrDQpgYGANCg0KIyMjIFc0LjQuNSDjgb7jgajjgoHjgablrp/ooYwNCuOAgFc0LjPjgahXNC4044Gu44K544Kv44Oq44OX44OI44KS5Lul5LiL44Gr44G+44Go44KB44G+44GZ44CC44GT44KM44KS5a6f6KGM44GZ44KL44Gf44KB44Gr5b+F6KaB44GqM+OBpOOBruOCquODluOCuOOCp+OCr+ODiO+8iGBkYXRhYCwgYGdlbnVzX3RydXRoYCwgYW5kIGBnZW51c2DvvInjga/jgIFXMi4z44KS5a6f6KGM44GZ44KM44Gw5b6X44KJ44KM44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnNvdXJjZSgiaHR0cDovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUJfc291cmNlLlIiKSAjIOmWouaVsOOBruiqrei+vA0KcmVzdWx0IDwtIGFwcGx5KFggPSBkYXRhLCBNQVJHSU4gPSAyLCAgICAgIyBkYXRh44Gu5YiX44GU44Go44Gr5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQogICAgICAgICAgICAgICAgRlVOID0gZ2V0RnJlcVBlclNhbXBsZSwgICAjIGRhdGHjga7liJfjgZTjgajjgavlh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgZ/ntZDmnpzjgpJyZXN1bHTjgavmoLzntI0NCiAgICAgICAgICAgICAgICBnZW51cywgZ2VudXNfdHJ1dGgpICAgICAgICMgZGF0YeOBruWIl+OBlOOBqOOBq+WHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBn+e1kOaenOOCknJlc3VsdOOBq+agvOe0jQ0KaG9nZSA8LSBzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCAxKSAgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgonjgIEx55Wq55uu44Gu6KaB57Sg44Gu5oq95Ye657WQ5p6c44KSaG9nZeOBq+agvOe0jQ0KZnJlcV9tYXQgPC0gc2FwcGx5KFggPSBob2dlLCBGVU4gPSBjYmluZCkgIyBob2dl5Lit44Gu5ZCE6KaB57Sg44KS5YiX5pa55ZCR44Gn57WQ5ZCI44GX44Gf57WQ5p6c44KSZnJlcV9tYXTjgavmoLzntI0NCnJvd25hbWVzKGZyZXFfbWF0KSA8LSBuYW1lcyhob2dlW1sxXV0pICAgICMgbmFtZXMoaG9nZVtbMV1dKeOCkmZyZXFfbWF044Gu6KGM5ZCN5oOF5aCx44Go44GZ44KLDQpzZW5zaXRpdml0eSA8LSB1bmxpc3Qoc2FwcGx5KFggPSByZXN1bHQsIEZVTiA9IGBbYCwgMykpICMgcmVzdWx05Lit44Gu5ZCE6KaB57Sg44GL44KJM+eVquebruOBruimgee0oOOBruOBv+aKveWHuuOBl+OBn+e1kOaenOOCkuODmeOCr+ODiOODq+W9ouW8j+OBq+OBl+OBpnNlbnNpdGl2aXR544Gr5qC857SNDQpwcmVjaXNpb25fd2l0aF9OQSA8LSB1bmxpc3Qoc2FwcGx5KFggPSByZXN1bHQsIEZVTiA9IGBbYCwgNCkpICMgcmVzdWx05Lit44Gu5ZCE6KaB57Sg44GL44KJNOeVquebruOBruimgee0oOOBruOBv+aKveWHuuOBl+OBn+e1kOaenOOCkuODmeOCr+ODiOODq+W9ouW8j+OBq+OBl+OBpnByZWNpc2lvbl93aXRoX05B44Gr5qC857SNDQpwcmVjaXNpb25fd2l0aG91dF9OQSA8LSB1bmxpc3Qoc2FwcGx5KFggPSByZXN1bHQsIEZVTiA9IGBbYCwgNSkpICMgcmVzdWx05Lit44Gu5ZCE6KaB57Sg44GL44KJNeeVquebruOBruimgee0oOOBruOBv+aKveWHuuOBl+OBn+e1kOaenOOCkuODmeOCr+ODiOODq+W9ouW8j+OBq+OBl+OBpnByZWNpc2lvbl93aXRob3V0X05B44Gr5qC857SNDQpgYGANCuOAgOS7peS4i+OBrjTjgaTjga7jgqrjg5bjgrjjgqfjgq/jg4jjgYzkuLvjgarntZDmnpzjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFfQ0KZnJlcV9tYXQNCnNlbnNpdGl2aXR5DQpwcmVjaXNpb25fd2l0aF9OQQ0KcHJlY2lzaW9uX3dpdGhvdXRfTkENCmBgYA0KDQojIyBXNC41IOaDheWgseaKveWHuu+8iOeoruODrOODmeODq++8iQ0K44CAVzQuNOOBr+WxnuODrOODmeODq+OBruOCguOBruOBp+OBl+OBn+OBjOOAgeeoruODrOODmeODq+OBq+OBpOOBhOOBpuOCglc0LjQuNeOBruWGkumgremDqOWIhuOCkuWkieabtOOBmeOCi+OBoOOBkeOBp+ewoeWNmOOBq+e1kOaenOOBjOW+l+OCieOCjOOBvuOBmeOAguOBk+OCjOOCkuWun+ihjOOBmeOCi+OBn+OCgeOBq+W/heimgeOBqjPjgaTjga7jgqrjg5bjgrjjgqfjgq/jg4jvvIhgZGF0YWAsIGBzcGVjaWVzX3RydXRoYCwgYW5kIGBzcGVjaWVzYO+8ieOBr+OAgVcyLjPjgpLlrp/ooYzjgZnjgozjgbDlvpfjgonjgozjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc291cmNlKCJodHRwOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQl9zb3VyY2UuUiIpICMg6Zai5pWw44Gu6Kqt6L68DQpyZXN1bHQgPC0gYXBwbHkoWCA9IGRhdGEsIE1BUkdJTiA9IDIsICAgICAjIGRhdGHjga7liJfjgZTjgajjgavlh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgZ/ntZDmnpzjgpJyZXN1bHTjgavmoLzntI0NCiAgICAgICAgICAgICAgICBGVU4gPSBnZXRGcmVxUGVyU2FtcGxlLCAgICMgZGF0YeOBruWIl+OBlOOBqOOBq+WHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBn+e1kOaenOOCknJlc3VsdOOBq+agvOe0jQ0KICAgICAgICAgICAgICAgIHNwZWNpZXMsIHNwZWNpZXNfdHJ1dGgpICAgIyBkYXRh44Gu5YiX44GU44Go44Gr5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQpob2dlIDwtIHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDEpICAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCieOAgTHnlarnm67jga7opoHntKDjga7mir3lh7rntZDmnpzjgpJob2dl44Gr5qC857SNDQpmcmVxX21hdCA8LSBzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGNiaW5kKSAjIGhvZ2XkuK3jga7lkITopoHntKDjgpLliJfmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJmcmVxX21hdOOBq+agvOe0jQ0Kcm93bmFtZXMoZnJlcV9tYXQpIDwtIG5hbWVzKGhvZ2VbWzFdXSkgICAgIyBuYW1lcyhob2dlW1sxXV0p44KSZnJlcV9tYXTjga7ooYzlkI3mg4XloLHjgajjgZnjgosNCnNlbnNpdGl2aXR5IDwtIHVubGlzdChzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCAzKSkgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgokz55Wq55uu44Gu6KaB57Sg44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KS44OZ44Kv44OI44Or5b2i5byP44Gr44GX44Gmc2Vuc2l0aXZpdHnjgavmoLzntI0NCnByZWNpc2lvbl93aXRoX05BIDwtIHVubGlzdChzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCA0KSkgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgok055Wq55uu44Gu6KaB57Sg44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KS44OZ44Kv44OI44Or5b2i5byP44Gr44GX44GmcHJlY2lzaW9uX3dpdGhfTkHjgavmoLzntI0NCnByZWNpc2lvbl93aXRob3V0X05BIDwtIHVubGlzdChzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCA1KSkgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgok155Wq55uu44Gu6KaB57Sg44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KS44OZ44Kv44OI44Or5b2i5byP44Gr44GX44GmcHJlY2lzaW9uX3dpdGhvDQpgYGANCuOAgOeoruODrOODmeODq+OBruWHuuePvumgu+W6puOBruaVsOWApOihjOWIl+OBr+S7peS4i+OBruOCiOOBhuOBquaEn+OBmOOBq+OBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpmcmVxX21hdA0KYGBgDQrjgIDnqK7jg6zjg5njg6vjga7mhJ/luqbjga/ku6XkuIvjga7jgojjgYbjgarmhJ/jgZjjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc2Vuc2l0aXZpdHkNCmBgYA0K44CA56iu44Os44OZ44Or44Gu6YGp5ZCI546H77yITkHjgpLlkKvjgoHjgZ/loLTlkIjvvInjga/ku6XkuIvjga7jgojjgYbjgarmhJ/jgZjjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlY2lzaW9uX3dpdGhfTkENCmBgYA0K44CA56iu44Os44OZ44Or44Gu6YGp5ZCI546H77yITkHjgpLlkKvjgoHjgarjgYTloLTlkIjvvInjga/ku6XkuIvjga7jgojjgYbjgarmhJ/jgZjjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlY2lzaW9uX3dpdGhvdXRfTkENCmBgYA0KDQojIFc1IOWPluW+l+aDheWgseOBruaVtOW9og0K44CA44GT44GT44Gn44Gv44CB5Y+W5b6X44GX44Gf5Ye654++6aC75bqm44O75oSf5bqm44O76YGp5ZCI546H44Gu5oOF5aCx44KS44G+44Go44KB44KL5L2c5qWt44KS56S644GX44G+44GZ44CC5a6f6KGM44Gr5b+F6KaB44GqNeOBpOOBruOCquODluOCuOOCp+OCr+ODiO+8iGBkYXRhYCwgYGdlbnVzX3RydXRoYCwgYGdlbnVzYCwgYHNwZWNpZXNfdHJ1dGhgLCBhbmQgYHNwZWNpZXNg77yJ44GvVzIuM+OCkuWun+ihjOOBmeOCjOOBsOW+l+OCieOCjOOBvuOBmeOBjOOAgeS7peS4i+OBq+OCguWGjeaOsuOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9VFJVRSwgZXZhbD1GQUxTRX0NCiMgVzIuMSBkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq+OBruOBu+OBhg0KaW5fZiA8LSAiaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCIgIyDoqq3jgb/ovrzjgb/jgZ/jgYTjg5XjgqHjgqTjg6vmg4XloLHjgpJpbl9m44Gr5qC857SNDQpob2dlIDwtIHJlYWQudGFibGUoaW5fZiwgaGVhZGVyPVRSVUUsIHJvdy5uYW1lcz0xLCBzZXA9Ilx0IikjIGluX2bjgpLjgIEx6KGM55uu44KS5YiX5ZCN44CBMeWIl+ebruOCkuihjOWQjeOBqOOBl+OBpuiqreOBv+i+vOOCk+OBoOe1kOaenOOCkmhvZ2XjgavmoLzntI0NCm9iaiA8LSBncmVwKHBhdHRlcm4gPSAiU1JSIiwgeCA9IGNvbG5hbWVzKGhvZ2UpKSAgIyBjb2xuYW1lcyhob2dlKeOBruS4reOBi+OCiSJTUlIi44Go44GE44GG5paH5a2X44KS5ZCr44KA6KaB57Sg55Wq5Y+344KS5oq95Ye644GX44Gf57WQ5p6c44KSb2Jq44Gr5qC857SNDQpkYXRhIDwtIGhvZ2VbLCBvYmpdICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XooYzliJfkuK3jga5vYmrjgafmjIflrprjgZfjgZ/liJfjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpJkYXRh44Gr5qC857SNDQpnZW51cyA8LSBob2dlJEdlbnVzICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XkuK3jga5HZW51c+WIl+OCkuaKveWHuuOBl+OBn+e1kOaenOOCkmdlbnVz44Gr5qC857SNDQpzcGVjaWVzIDwtIGhvZ2UkU3BlY2llcyAgICAgICAgICAgICAgICAgICAjIGhvZ2XkuK3jga5TcGVjaWVz5YiX44KS5oq95Ye644GX44Gf57WQ5p6c44KSc3BlY2llc+OBq+agvOe0jQ0KDQojIFcyLjIg6I+M5qCq5oOF5aCx44OV44Kh44Kk44Or44Gu44G744GGDQppbl9mIDwtICJodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTEudHh0IiAjIOiqreOBv+i+vOOBv+OBn+OBhOODleOCoeOCpOODq+aDheWgseOCkmluX2bjgavmoLzntI0NCmhvZ2UgPC0gcmVhZC50YWJsZShpbl9mLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEsIHNlcD0iXHQiKSAjaW5fZuOCkuOAgTHooYznm67jgpLliJflkI3jgIEx5YiX55uu44KS6KGM5ZCN44Go44GX44Gm6Kqt44G/6L6844KT44Gg57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0Kb3JnYW5pc20gPC0gaG9nZSRPcmdhbmlzbSAgICAgICAgICAgICAgICAgIyBob2dl5Lit44GuT3JnYW5pc23liJfjgpLmir3lh7rjgZfjgZ/ntZDmnpzjgpJvcmdhbmlzbeOBq+agvOe0jQ0KaG9nZSA8LSBzdHJzcGxpdCh4ID0gb3JnYW5pc20sIHNwbGl0ID0gIiwiKSMgb3JnYW5pc23kuK3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLjgrPjg7Pjg57jgafliIblibLjgZfjgZ/ntZDmnpzjgpJob2dl44Gr5qC857SNDQpob2dlMiA8LSBzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGBbYCwgMSkgICAjIGhvZ2XkuK3jga7jg5njgq/jg4jjg6vlvaLlvI/jga7lkITopoHntKDjgYvjgonjgIEx55Wq55uu44Gu6KaB57Sg44Gu5oq95Ye657WQ5p6c44KSaG9nZTLjgavmoLzntI0NCmhvZ2UzIDwtIHN0cnNwbGl0KHggPSBob2dlMiwgc3BsaXQgPSAiICIpICMgaG9nZTLkuK3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLljYrop5Ljgrnjg5rjg7zjgrnjgafliIblibLjgZfjgZ/ntZDmnpzjgpJob2dlM+OBq+agvOe0jQ0KZ2VudXNfdHJ1dGggPC0gc2FwcGx5KFggPSBob2dlMywgRlVOID0gYFtgLCAxKSAgIyBob2dlM+S4reOBruODmeOCr+ODiOODq+W9ouW8j+OBruWQhOimgee0oOOBi+OCieOAgTHnlarnm67jga7opoHntKDjga7mir3lh7rntZDmnpzjgpJnZW51c190cnV0aOOBq+agvOe0jQ0Kc3BlY2llc190cnV0aCA8LSBzYXBwbHkoWCA9IGhvZ2UzLCBGVU4gPSBgW2AsIDIpIyBob2dlM+S4reOBruODmeOCr+ODiOODq+W9ouW8j+OBruWQhOimgee0oOOBi+OCieOAgTLnlarnm67jga7opoHntKDjga7mir3lh7rntZDmnpzjgpJzcGVjaWVzX3RydXRo44Gr5qC857SNDQpnZW51c190cnV0aCA8LSB1bmlxdWUoZ2VudXNfdHJ1dGgpICAgICAgICAjIGdlbnVzX3RydXRo5Lit44Gu44Om44OL44O844Kv44Gq6KaB57Sg44KSZ2VudXNfdHJ1dGjjgavmoLzntI0NCnNwZWNpZXNfdHJ1dGggPC0gdW5pcXVlKHNwZWNpZXNfdHJ1dGgpICAgICMgc3BlY2llc190cnV0aOS4reOBruODpuODi+ODvOOCr+OBquimgee0oOOCknNwZWNpZXNfdHJ1dGjjgavmoLzntI0NCmBgYA0KDQojIyBXNS4xIOaKveWHuue1kOaenOOBruOBvuOBqOOCge+8iOWxnuODrOODmeODq++8iQ0K44CA44GT44GT44Gn44Gv44CB5bGe44Os44OZ44Or44Gu5oq95Ye657WQ5p6c44Gu44G+44Go44KB44KS6KGM44GE44G+44GZ44CCDQoNCiMjIyBXNS4xLjEg5oOF5aCx5oq95Ye677yI44K144Oz44OX44Or44GU44Go77yJDQrjgIBXNC40LjXjgpLlho3lrp/ooYzjgZfjgIHjgrXjg7Pjg5fjg6vjgZTjgajjga7lsZ7jg6zjg5njg6vjga7lh7rnj77poLvluqbjgIHmhJ/luqbjgIHpganlkIjnjofjga7jgqrjg5bjgrjjgqfjgq/jg4jjgpLlvpfjgabjgYrjgY3jgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc291cmNlKCJodHRwOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQl9zb3VyY2UuUiIpICMg6Zai5pWw44Gu6Kqt6L68DQpyZXN1bHQgPC0gYXBwbHkoWCA9IGRhdGEsIE1BUkdJTiA9IDIsICAgICAjIGRhdGHjga7liJfjgZTjgajjgavlh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgZ/ntZDmnpzjgpJyZXN1bHTjgavmoLzntI0NCiAgICAgICAgICAgICAgICBGVU4gPSBnZXRGcmVxUGVyU2FtcGxlLCAgICMgZGF0YeOBruWIl+OBlOOBqOOBq+WHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBn+e1kOaenOOCknJlc3VsdOOBq+agvOe0jQ0KICAgICAgICAgICAgICAgIGdlbnVzLCBnZW51c190cnV0aCkgICAgICAgIyBkYXRh44Gu5YiX44GU44Go44Gr5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQpob2dlIDwtIHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDEpICAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCieOAgTHnlarnm67jga7opoHntKDjga7mir3lh7rntZDmnpzjgpJob2dl44Gr5qC857SNDQpmcmVxX21hdCA8LSBzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGNiaW5kKSAjIGhvZ2XkuK3jga7lkITopoHntKDjgpLliJfmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJmcmVxX21hdOOBq+agvOe0jQ0Kcm93bmFtZXMoZnJlcV9tYXQpIDwtIG5hbWVzKGhvZ2VbWzFdXSkgICAgIyBuYW1lcyhob2dlW1sxXV0p44KSZnJlcV9tYXTjga7ooYzlkI3mg4XloLHjgajjgZnjgosNCnNlbnNpdGl2aXR5IDwtIHVubGlzdChzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCAzKSkgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgokz55Wq55uu44Gu6KaB57Sg44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KS44OZ44Kv44OI44Or5b2i5byP44Gr44GX44Gmc2Vuc2l0aXZpdHnjgavmoLzntI0NCnByZWNpc2lvbl93aXRoX05BIDwtIHVubGlzdChzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCA0KSkgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgok055Wq55uu44Gu6KaB57Sg44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KS44OZ44Kv44OI44Or5b2i5byP44Gr44GX44GmcHJlY2lzaW9uX3dpdGhfTkHjgavmoLzntI0NCnByZWNpc2lvbl93aXRob3V0X05BIDwtIHVubGlzdChzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCA1KSkgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgok155Wq55uu44Gu6KaB57Sg44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KS44OZ44Kv44OI44Or5b2i5byP44Gr44GX44GmcHJlY2lzaW9uX3dpdGhvdXRfTkHjgavmoLzntI0NCmBgYA0KDQojIyMgVzUuMS4yIOaVtOW9ouacrOeVqu+8iOOCteODs+ODl+ODq+OBlOOBqO+8iQ0K44CA44GT44GT44Gn44Gv44CB5Ye654++6aC75bqm44CB5oSf5bqm44CB6YGp5ZCI546H44Gu57WQ5p6c44KS44CB6KGM5pa55ZCR44Gn57WQ5ZCI44GV44Gb44G+44GZ44CCYHJiaW5kYOmWouaVsA0K44Gv44CB5ZCM44GY6KaB57Sg5pWw44Gu6KSH5pWw44Gu44OZ44Kv44OI44Or44Gq44Gp44KS6KGM77yIcm9377yJ5pa55ZCR44Gn57WQ5ZCI77yIYmluZO+8ieOBleOBm+OBn+OBhOWgtOWQiOOBq+WIqeeUqOOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpyZXN1bHRfcGVycyA8LSByYmluZChmcmVxX21hdCwgICAgICAgICAgICAjIOihjOaWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCknJlc3VsdF9wZXJz44Gr5qC857SNDQogICAgICAgICAgICAgICAgICAgICBzZW5zaXRpdml0eSwgICAgICAgICAjIOihjOaWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCknJlc3VsdF9wZXJz44Gr5qC857SNDQogICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb25fd2l0aF9OQSwgICAjIOihjOaWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCknJlc3VsdF9wZXJz44Gr5qC857SNDQogICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb25fd2l0aG91dF9OQSkjIOihjOaWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCknJlc3VsdF9wZXJz44Gr5qC857SNDQpgYGANCuOAgOW+l+OCieOCjOOCi+OCquODluOCuOOCp+OCr+ODiOOBr+S7peS4i+OBruOCiOOBhuOBquaEn+OBmOOBq+OBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpzdHIocmVzdWx0X3BlcnMpICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdF9wZXJz44Gu5qeL6YCg44KS6KGo56S6DQpkaW0ocmVzdWx0X3BlcnMpICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdF9wZXJz44Gu6KGM5pWw44Go5YiX5pWwDQpgYGANCuOAgGByZXN1bHRfcGVyc2Djga/jgIFgciBucm93KHJlc3VsdF9wZXJzKWDooYwgJFx0aW1lcyQgYHIgbmNvbChyZXN1bHRfcGVycylg5YiX44GL44KJ44Gq44KL44GT44Go44GM44KP44GL44KK44G+44GZ44CCYHIgbnJvdyhmcmVxX21hdClg6KGMICRcdGltZXMkIGByIG5jb2woZnJlcV9tYXQpYOWIl+OBi+OCieOBquOCi+ihjOWIl2BmcmVxX21hdGDjga7kuIvpg6jjgavjgIHliJfmlbDjgajlkIzjgZjopoHntKDjgYvjgonjgarjgosz44Gk44Gu44OZ44Kv44OI44Or5oOF5aCx44KS44Gd44KM44Ge44KM57WQ5ZCI44GX44Gm5b6X44KJ44KM44Gf44KC44Gu44Gq44Gu44Gn5aal5b2T44Gn44GZ44Gt44CCDQoNCiMjIyBXNS4xLjMg5oyH5pWw6KGo6KiY44KS5Zue6YG/DQrjgIDjgb7jgZrjgIFgcmVzdWx0X3BlcnNg44Gu5Lit6Lqr44KS56S644GX44G+44GZ44CC5oyH5pWw6KGo6KiY44Gn6Iul5bmy6KaL44Gl44KJ44GE44GL44KC44GX44KM44G+44Gb44KT44GM44CB5pWw5YCk6Ieq5L2T44Gv5aal5b2T44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnJlc3VsdF9wZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVzdWx0X3BlcnPjga7kuK3ouqvjgpLooajnpLoNCmBgYA0K44CA5oyH5pWw6KGo6KiY44Gr44Gq44KL5Y6f5Zug44Gv44CB5pyA5Yid44GuMjDooYzliIbjgavnm7jlvZPjgZnjgovlh7rnj77poLvluqbvvIhgZnJlcV9tYXRg77yJ44Gu44G744GG44Gv772eNuahgeOBruaVtOaVsOOBp+OBguOCi+S4gOaWueOAgeaui+OCiuOBrjPooYzliIbjga7mhJ/luqbjgoTpganlkIjnjofjga7jgbvjgYbjga8x5pyq5rqA44Gu5a6f5pWw44Gg44GL44KJ44Gn44GZ44CC44Gk44G+44KK44CB5YWo5L2T44Go44GX44Gm6KGo56S65qGB5pWw44GM5aSn44GN44GP44Gq44Gj44Gm44GX44G+44GG44Gf44KB44Gn44GZ44CC5oyH5pWw6KGo6KiY44KS5Zue6YG/44GX44Gf44GE5aC05ZCI44Gv44CB5Lul5LiL44Gr56S644GZ44KI44GG44GrYG9wdGlvbnMoc2NpcGVuPTEwMClg44Go44GE44GG44Kz44Oe44Oz44OJ44KS5pyA5Yid44Gr5a6f6KGM44GX44Gm44GK44GR44Gw44KI44GE44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCm9wdGlvbnMoc2NpcGVuPTEwMCkgICAgICAgICAgICAgICAgICAgICAgICMg5oyH5pWw6KGo6KiY44KS5Zue6YG/DQpyZXN1bHRfcGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdF9wZXJz44Gu5Lit6Lqr44KS6KGo56S6DQpgYGANCuOAgOOBk+OBk+OBvuOBp+OBp+OCteODs+ODl+ODq+OBlOOBqOOBrue1kOaenOOBruOBvuOBqOOCgeOBjOWujOS6huOBq+OBquOCiuOBvuOBmeOAgg0KDQojIyMgVzUuMS40IOaDheWgseaKveWHuu+8iOOCteODs+ODl+ODq+WFqOS9k++8iQ0K44CA5qyh44Gr44CBVzMuNi4xMOOCkuWGjeWun+ihjOOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpyZXMgPC0gZ2V0X1czLjYoZGF0YSwgZ2VudXMsIGdlbnVzX3RydXRoKSAjIOWxnuOBruWHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBpnJlc+OBq+agvOe0jQ0KcmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXPjga7kuK3ouqsNCmBgYA0K44CAYHJlc2Djgqrjg5bjgrjjgqfjgq/jg4jjgavjga/jgIHjgrXjg7Pjg5fjg6vlhajkvZPjga7lsZ7jg6zjg5njg6vjga7lh7rnj77poLvluqbjgIHmhJ/luqbjgIHpganlkIjnjofjga7mg4XloLHjgYzlkKvjgb7jgozjgabjgYTjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgILjgZPjgozjgpJgY2DplqLmlbDjgpLnlKjjgYTjgaZXNS4xLjLjgajlkIzmp5jjga7jg47jg6rjgafku6XkuIvjga7jgojjgYbjgavpgKPntZDjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kb3ZlcmFsbCA8LSBjKHJlcyRmcmVxdWUsICAgICAgICAgICAgICAgICAgIyDjg5njgq/jg4jjg6vjgajjgZfjgabpgKPntZDjgZfjgZ/ntZDmnpzjgpJvdmVyYWxs44Gr5qC857SNDQogICAgICAgICAgICAgcmVzJHNlbnNpdGl2aXR5LCAgICAgICAgICAgICAjIOODmeOCr+ODiOODq+OBqOOBl+OBpumAo+e1kOOBl+OBn+e1kOaenOOCkm92ZXJhbGzjgavmoLzntI0NCiAgICAgICAgICAgICByZXMkcHJlY2lzaW9uX3dpdGhfTkEsICAgICAgICMg44OZ44Kv44OI44Or44Go44GX44Gm6YCj57WQ44GX44Gf57WQ5p6c44KSb3ZlcmFsbOOBq+agvOe0jQ0KICAgICAgICAgICAgIHJlcyRwcmVjaXNpb25fd2l0aG91dF9OQSkgICAgIyDjg5njgq/jg4jjg6vjgajjgZfjgabpgKPntZDjgZfjgZ/ntZDmnpzjgpJvdmVyYWxs44Gr5qC857SNDQpvdmVyYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG92ZXJhbGzjga7kuK3ouqsNCmBgYA0K44CAYG92ZXJhbGxg44Gu6KaB57Sg5pWw44Gv44CB44K144Oz44OX44Or44GU44Go44Gu44G+44Go44KB5oOF5aCx44Gn44GC44KLYHJlc3VsdF9wZXJzYOOBruihjOaVsOOBqOWQjOOBmOOBq+OBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpsZW5ndGgob3ZlcmFsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG92ZXJhbGzjga7opoHntKDmlbANCmRpbShyZXN1bHRfcGVycykgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVzdWx0X3BlcnPjga7ooYzmlbDjgajliJfmlbANCmBgYA0KDQojIyMgVzUuMS41IOWFqOS9k+OBruaVtOW9og0K44CA44K144Oz44OX44Or5YWo5L2T44Gu57WQ5p6c44Gn44GC44KLYHJlc2DjgYvjgonjgIHlh7rnj77poLvluqbjgIHmhJ/luqbjgIHpganlkIjnjofjga7mg4XloLHjga7jgb/jgpLmir3lh7rjgZfjgaYx44Gk44Gu44OZ44Kv44OI44Or44Go44GX44Gm44G+44Go44KB44G+44GZ44CC44Gd44GX44Gm44Gd44Gu44OZ44Kv44OI44Or44KS44K144Oz44OX44Or44GU44Go44Gu57WQ5p6c44Gu44G+44Go44KB44Gn44GC44KLYHJlc3VsdF9wZXJzYOOBruWPs+WBtOOBq+WIl+aWueWQkeOBp+mAo+e1kOOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpyZXN1bHRfYWxsIDwtIGNiaW5kKHJlc3VsdF9wZXJzLCBvdmVyYWxsKSAjIHJlc3VsdF9wZXJz44Gob3ZlcmFsbOOCkuWIl+aWueWQkeOBp+mAo+e1kOOBl+OBpnJlc3VsdF9hbGzjgavmoLzntI0NCmBgYA0KDQojIyMgVzUuMS42IOODleOCoeOCpOODq+WHuuWKmw0K44CA44OV44Kh44Kk44Or5Ye65Yqb44GX44G+44GZ44CCW+esrDI05Zue44GuVzQuNC4zXShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyNC5odG1sI1c0NDNfY2JpbmQlRTMlODElQTh3cml0ZXRhYmxlJUU5JTk2JUEyJUU2JTk1JUIwKeOBqOWQjOanmOOBruODhuOCr+ODi+ODg+OCr+OCkueUqOOBhOOBpuOBhOOBvuOBmeOAguW/teOBruOBn+OCgeOAgeOBk+OBk+OBp+OCguOCv+ODluWMuuWIh+OCiuODhuOCreOCueODiOODleOCoeOCpOODq+eJiO+8iFtvdXRwdXRfSlNMQUIyNV9nZW51cy50eHRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNV9nZW51cy50eHQp77yJ44GoeGxzeOeJiO+8iFtvdXRwdXRfSlNMQUIyNV9nZW51cy54bHN4XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjVfZ2VudXMueGxzeCnvvInjgpLjg4Djgqbjg7Pjg63jg7zjg4njgafjgY3jgovjgojjgYbjgavjgZfjgabjgYrjgY3jgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdG1wIDwtIGNiaW5kKHJvd25hbWVzKHJlc3VsdF9hbGwpLCByZXN1bHRfYWxsKSMgcmVzdWx0X2FsbOOBruihjOWQjeOBqOOAgXJlc3VsdF9hbGzjgpLliJfmlrnlkJHjgafpgKPntZDjgZfjgaZ0bXDjgavmoLzntI0NCndyaXRlLnRhYmxlKHggPSB0bXAsIGZpbGUgPSAib3V0cHV0X0pTTEFCMjVfZ2VudXMudHh0Iiwgc2VwID0gIlx0Iiwgcm93Lm5hbWVzID0gRikjIHRtcOOBruS4rei6q+OCkuaMh+WumuOBl+OBn+ODleOCoeOCpOODq+WQjeOBp+OCv+ODluWMuuWIh+OCiuODhuOCreOCueODiOODleOCoeOCpOODq+OBqOOBl+OBpuOAgeihjOWQjeOCkuOBpOOBkeOBmuOBq+S/neWtmA0KYGBgDQoNCiMjIyBXNS4xLjcg44G+44Go44KB44Gm5a6f6KGMDQrjgIBXNS4x44Gu44K544Kv44Oq44OX44OI44KS5Lul5LiL44Gr44G+44Go44KB44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnNvdXJjZSgiaHR0cDovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUJfc291cmNlLlIiKSAjIOmWouaVsOOBruiqrei+vA0KIyDjgrXjg7Pjg5fjg6vjgZTjgagNCnJlc3VsdCA8LSBhcHBseShYID0gZGF0YSwgTUFSR0lOID0gMiwgICAgICMgZGF0YeOBruWIl+OBlOOBqOOBq+WHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBn+e1kOaenOOCknJlc3VsdOOBq+agvOe0jQ0KICAgICAgICAgICAgICAgIEZVTiA9IGdldEZyZXFQZXJTYW1wbGUsICAgIyBkYXRh44Gu5YiX44GU44Go44Gr5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQogICAgICAgICAgICAgICAgZ2VudXMsIGdlbnVzX3RydXRoKSAgICAgICAjIGRhdGHjga7liJfjgZTjgajjgavlh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgZ/ntZDmnpzjgpJyZXN1bHTjgavmoLzntI0NCmhvZ2UgPC0gc2FwcGx5KFggPSByZXN1bHQsIEZVTiA9IGBbYCwgMSkgICMgcmVzdWx05Lit44Gu5ZCE6KaB57Sg44GL44KJ44CBMeeVquebruOBruimgee0oOOBruaKveWHuue1kOaenOOCkmhvZ2XjgavmoLzntI0NCmZyZXFfbWF0IDwtIHNhcHBseShYID0gaG9nZSwgRlVOID0gY2JpbmQpICMgaG9nZeS4reOBruWQhOimgee0oOOCkuWIl+aWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCkmZyZXFfbWF044Gr5qC857SNDQpyb3duYW1lcyhmcmVxX21hdCkgPC0gbmFtZXMoaG9nZVtbMV1dKSAgICAjIG5hbWVzKGhvZ2VbWzFdXSnjgpJmcmVxX21hdOOBruihjOWQjeaDheWgseOBqOOBmeOCiw0Kc2Vuc2l0aXZpdHkgPC0gdW5saXN0KHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDMpKSAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCiTPnlarnm67jga7opoHntKDjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpLjg5njgq/jg4jjg6vlvaLlvI/jgavjgZfjgaZzZW5zaXRpdml0eeOBq+agvOe0jQ0KcHJlY2lzaW9uX3dpdGhfTkEgPC0gdW5saXN0KHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDQpKSAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCiTTnlarnm67jga7opoHntKDjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpLjg5njgq/jg4jjg6vlvaLlvI/jgavjgZfjgaZwcmVjaXNpb25fd2l0aF9OQeOBq+agvOe0jQ0KcHJlY2lzaW9uX3dpdGhvdXRfTkEgPC0gdW5saXN0KHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDUpKSAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCiTXnlarnm67jga7opoHntKDjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpLjg5njgq/jg4jjg6vlvaLlvI/jgavjgZfjgaZwcmVjaXNpb25fd2l0aG91dF9OQeOBq+agvOe0jQ0KcmVzdWx0X3BlcnMgPC0gcmJpbmQoZnJlcV9tYXQsICAgICAgICAgICAgIyDooYzmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJyZXN1bHRfcGVyc+OBq+agvOe0jQ0KICAgICAgICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHksICAgICAgICAgIyDooYzmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJyZXN1bHRfcGVyc+OBq+agvOe0jQ0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uX3dpdGhfTkEsICAgIyDooYzmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJyZXN1bHRfcGVyc+OBq+agvOe0jQ0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uX3dpdGhvdXRfTkEpIyDooYzmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJyZXN1bHRfcGVyc+OBq+agvOe0jQ0KDQojIOOCteODs+ODl+ODq+WFqOS9kw0KcmVzIDwtIGdldF9XMy42KGRhdGEsIGdlbnVzLCBnZW51c190cnV0aCkgIyDlsZ7jga7lh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgaZyZXPjgavmoLzntI0NCm92ZXJhbGwgPC0gYyhyZXMkZnJlcXVlLCAgICAgICAgICAgICAgICAgICMg44OZ44Kv44OI44Or44Go44GX44Gm6YCj57WQ44GX44Gf57WQ5p6c44KSb3ZlcmFsbOOBq+agvOe0jQ0KICAgICAgICAgICAgIHJlcyRzZW5zaXRpdml0eSwgICAgICAgICAgICAgIyDjg5njgq/jg4jjg6vjgajjgZfjgabpgKPntZDjgZfjgZ/ntZDmnpzjgpJvdmVyYWxs44Gr5qC857SNDQogICAgICAgICAgICAgcmVzJHByZWNpc2lvbl93aXRoX05BLCAgICAgICAjIOODmeOCr+ODiOODq+OBqOOBl+OBpumAo+e1kOOBl+OBn+e1kOaenOOCkm92ZXJhbGzjgavmoLzntI0NCiAgICAgICAgICAgICByZXMkcHJlY2lzaW9uX3dpdGhvdXRfTkEpICAgICMg44OZ44Kv44OI44Or44Go44GX44Gm6YCj57WQ44GX44Gf57WQ5p6c44KSb3ZlcmFsbOOBq+agvOe0jQ0KDQojIOODleOCoeOCpOODq+WHuuWKmw0KcmVzdWx0X2FsbCA8LSBjYmluZChyZXN1bHRfcGVycywgb3ZlcmFsbCkgIyByZXN1bHRfcGVyc+OBqG92ZXJhbGzjgpLliJfmlrnlkJHjgafpgKPntZDjgZfjgaZyZXN1bHRfYWxs44Gr5qC857SNDQp0bXAgPC0gY2JpbmQocm93bmFtZXMocmVzdWx0X2FsbCksIHJlc3VsdF9hbGwpIyByZXN1bHRfYWxs44Gu6KGM5ZCN44Go44CBcmVzdWx0X2FsbOOCkuWIl+aWueWQkeOBp+mAo+e1kOOBl+OBpnRtcOOBq+agvOe0jQ0Kd3JpdGUudGFibGUoeCA9IHRtcCwgZmlsZSA9ICJvdXRwdXRfSlNMQUIyNV9nZW51cy50eHQiLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBGKSMgdG1w44Gu5Lit6Lqr44KS5oyH5a6a44GX44Gf44OV44Kh44Kk44Or5ZCN44Gn44K/44OW5Yy65YiH44KK44OG44Kt44K544OI44OV44Kh44Kk44Or44Go44GX44Gm44CB6KGM5ZCN44KS44Gk44GR44Ga44Gr5L+d5a2YDQpgYGANCuOAgOS4iuiomOOBruOCueOCr+ODquODl+ODiOOBr+OAgVc1LjHjgafkvb/jgaPjgabjgY3jgZ/jgoLjga7jgpLjgZ3jga7jgb7jgb7jg5rjgr/jg5rjgr/osrzjgorku5jjgZHjgabjgYTjgaPjgZ/jgaDjgZHjgafjgZnjgYzjgIHjgZPjga7lvozjgavooYzjgYbnqK7jg6zjg5njg6vjga7op6PmnpDjgpLmhI/orZjjgZfjgabjgIHlpInmm7Tlj6/og73mgKfjga7jgYLjgovjgqrjg5bjgrjjgqfjgq/jg4jlkI3jgpLmnIDliJ3jga7jgbvjgYbjgavpm4bntITjgZXjgZvjgZ/jgoLjga7jgoLku6XkuIvjgavnpLrjgZfjgabjgYrjgY3jgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc291cmNlKCJodHRwOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQl9zb3VyY2UuUiIpICMg6Zai5pWw44Gu6Kqt6L68DQojIOODkeODqeODoeODvOOCvw0KcHJlZGljdGlvbiA8LSBnZW51cyAgICAgICAgICAgICAgICAgICAgICAgIyBkYWRhMuWun+ihjOe1kOaenOOBruOCquODluOCuOOCp+OCr+ODiOOCknByZWRpY3Rpb27jgavjgrPjg5Tjg7wNCnRydXRoIDwtIGdlbnVzX3RydXRoICAgICAgICAgICAgICAgICAgICAgICMg5q2j6Kej5oOF5aCx44KSdHJ1dGjjgavjgrPjg5Tjg7wNCm91dF9mIDwtICJvdXRwdXRfSlNMQUIyNV9nZW51cy50eHQiICAgICAgICMg5Ye65Yqb44OV44Kh44Kk44Or5ZCN44KSb3V0X2bjgavjgrPjg5Tjg7wNCg0KIyDjgrXjg7Pjg5fjg6vjgZTjgagNCnJlc3VsdCA8LSBhcHBseShYID0gZGF0YSwgTUFSR0lOID0gMiwgICAgICMgZGF0YeOBruWIl+OBlOOBqOOBq+WHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBn+e1kOaenOOCknJlc3VsdOOBq+agvOe0jQ0KICAgICAgICAgICAgICAgIEZVTiA9IGdldEZyZXFQZXJTYW1wbGUsICAgIyBkYXRh44Gu5YiX44GU44Go44Gr5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQogICAgICAgICAgICAgICAgcHJlZGljdGlvbiwgdHJ1dGgpICAgICAgICAjIGRhdGHjga7liJfjgZTjgajjgavlh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgZ/ntZDmnpzjgpJyZXN1bHTjgavmoLzntI0NCmhvZ2UgPC0gc2FwcGx5KFggPSByZXN1bHQsIEZVTiA9IGBbYCwgMSkgICMgcmVzdWx05Lit44Gu5ZCE6KaB57Sg44GL44KJ44CBMeeVquebruOBruimgee0oOOBruaKveWHuue1kOaenOOCkmhvZ2XjgavmoLzntI0NCmZyZXFfbWF0IDwtIHNhcHBseShYID0gaG9nZSwgRlVOID0gY2JpbmQpICMgaG9nZeS4reOBruWQhOimgee0oOOCkuWIl+aWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCkmZyZXFfbWF044Gr5qC857SNDQpyb3duYW1lcyhmcmVxX21hdCkgPC0gbmFtZXMoaG9nZVtbMV1dKSAgICAjIG5hbWVzKGhvZ2VbWzFdXSnjgpJmcmVxX21hdOOBruihjOWQjeaDheWgseOBqOOBmeOCiw0Kc2Vuc2l0aXZpdHkgPC0gdW5saXN0KHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDMpKSAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCiTPnlarnm67jga7opoHntKDjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpLjg5njgq/jg4jjg6vlvaLlvI/jgavjgZfjgaZzZW5zaXRpdml0eeOBq+agvOe0jQ0KcHJlY2lzaW9uX3dpdGhfTkEgPC0gdW5saXN0KHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDQpKSAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCiTTnlarnm67jga7opoHntKDjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpLjg5njgq/jg4jjg6vlvaLlvI/jgavjgZfjgaZwcmVjaXNpb25fd2l0aF9OQeOBq+agvOe0jQ0KcHJlY2lzaW9uX3dpdGhvdXRfTkEgPC0gdW5saXN0KHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDUpKSAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCiTXnlarnm67jga7opoHntKDjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpLjg5njgq/jg4jjg6vlvaLlvI/jgavjgZfjgaZwcmVjaXNpb25fd2l0aG91dF9OQeOBq+agvOe0jQ0KcmVzdWx0X3BlcnMgPC0gcmJpbmQoZnJlcV9tYXQsICAgICAgICAgICAgIyDooYzmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJyZXN1bHRfcGVyc+OBq+agvOe0jQ0KICAgICAgICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHksICAgICAgICAgIyDooYzmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJyZXN1bHRfcGVyc+OBq+agvOe0jQ0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uX3dpdGhfTkEsICAgIyDooYzmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJyZXN1bHRfcGVyc+OBq+agvOe0jQ0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uX3dpdGhvdXRfTkEpIyDooYzmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJyZXN1bHRfcGVyc+OBq+agvOe0jQ0KDQojIOOCteODs+ODl+ODq+WFqOS9kw0KcmVzIDwtIGdldF9XMy42KGRhdGEsIHByZWRpY3Rpb24sIHRydXRoKSAgIyDlh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgaZyZXPjgavmoLzntI0NCm92ZXJhbGwgPC0gYyhyZXMkZnJlcXVlLCAgICAgICAgICAgICAgICAgICMg44OZ44Kv44OI44Or44Go44GX44Gm6YCj57WQ44GX44Gf57WQ5p6c44KSb3ZlcmFsbOOBq+agvOe0jQ0KICAgICAgICAgICAgIHJlcyRzZW5zaXRpdml0eSwgICAgICAgICAgICAgIyDjg5njgq/jg4jjg6vjgajjgZfjgabpgKPntZDjgZfjgZ/ntZDmnpzjgpJvdmVyYWxs44Gr5qC857SNDQogICAgICAgICAgICAgcmVzJHByZWNpc2lvbl93aXRoX05BLCAgICAgICAjIOODmeOCr+ODiOODq+OBqOOBl+OBpumAo+e1kOOBl+OBn+e1kOaenOOCkm92ZXJhbGzjgavmoLzntI0NCiAgICAgICAgICAgICByZXMkcHJlY2lzaW9uX3dpdGhvdXRfTkEpICAgICMg44OZ44Kv44OI44Or44Go44GX44Gm6YCj57WQ44GX44Gf57WQ5p6c44KSb3ZlcmFsbOOBq+agvOe0jQ0KDQojIOODleOCoeOCpOODq+WHuuWKmw0KcmVzdWx0X2FsbCA8LSBjYmluZChyZXN1bHRfcGVycywgb3ZlcmFsbCkgIyByZXN1bHRfcGVyc+OBqG92ZXJhbGzjgpLliJfmlrnlkJHjgafpgKPntZDjgZfjgaZyZXN1bHRfYWxs44Gr5qC857SNDQp0bXAgPC0gY2JpbmQocm93bmFtZXMocmVzdWx0X2FsbCksIHJlc3VsdF9hbGwpIyByZXN1bHRfYWxs44Gu6KGM5ZCN44Go44CBcmVzdWx0X2FsbOOCkuWIl+aWueWQkeOBp+mAo+e1kOOBl+OBpnRtcOOBq+agvOe0jQ0Kd3JpdGUudGFibGUoeCA9IHRtcCwgZmlsZSA9IG91dF9mLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBGKSMgdG1w44Gu5Lit6Lqr44KS5oyH5a6a44GX44Gf44OV44Kh44Kk44Or5ZCN44Gn44K/44OW5Yy65YiH44KK44OG44Kt44K544OI44OV44Kh44Kk44Or44Go44GX44Gm44CB6KGM5ZCN44KS44Gk44GR44Ga44Gr5L+d5a2YDQpgYGANCg0KIyMgVzUuMiDmir3lh7rntZDmnpzjga7jgb7jgajjgoHvvIjnqK7jg6zjg5njg6vvvIkNCuOAgFc1LjEuN+OBruOCueOCr+ODquODl+ODiOOBruacgOWIneOBruOBu+OBhuOCkuWwkeOBl+WkieabtOOBmeOCi+OBoOOBkeOBp+OAgeeoruODrOODmeODq+OBrue1kOaenOOCguewoeWNmOOBq+W+l+OCieOCjOOBvuOBmeOAguW/teOBruOBn+OCgeOAgeOBk+OBk+OBp+OCguOCv+ODluWMuuWIh+OCiuODhuOCreOCueODiOODleOCoeOCpOODq+eJiO+8iFtvdXRwdXRfSlNMQUIyNV9zcGVjaWVzLnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI1X3NwZWNpZXMudHh0Ke+8ieOBqHhsc3jniYjvvIhbb3V0cHV0X0pTTEFCMjVfc3BlY2llcy54bHN4XShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svb3V0cHV0X0pTTEFCMjVfc3BlY2llcy54bHN4Ke+8ieOCkuODgOOCpuODs+ODreODvOODieOBp+OBjeOCi+OCiOOBhuOBq+OBl+OBpuOBiuOBjeOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpzb3VyY2UoImh0dHA6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCX3NvdXJjZS5SIikgIyDplqLmlbDjga7oqq3ovrwNCiMg44OR44Op44Oh44O844K/DQpwcmVkaWN0aW9uIDwtIHNwZWNpZXMgICAgICAgICAgICAgICAgICAgICAjIGRhZGEy5a6f6KGM57WQ5p6c44Gu44Kq44OW44K444Kn44Kv44OI44KScHJlZGljdGlvbuOBq+OCs+ODlOODvA0KdHJ1dGggPC0gc3BlY2llc190cnV0aCAgICAgICAgICAgICAgICAgICAgIyDmraPop6Pmg4XloLHjgpJ0cnV0aOOBq+OCs+ODlOODvA0Kb3V0X2YgPC0gIm91dHB1dF9KU0xBQjI1X3NwZWNpZXMudHh0IiAgICAgIyDlh7rlipvjg5XjgqHjgqTjg6vlkI3jgpJvdXRfZuOBq+OCs+ODlOODvA0KDQojIOOCteODs+ODl+ODq+OBlOOBqA0KcmVzdWx0IDwtIGFwcGx5KFggPSBkYXRhLCBNQVJHSU4gPSAyLCAgICAgIyBkYXRh44Gu5YiX44GU44Go44Gr5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQogICAgICAgICAgICAgICAgRlVOID0gZ2V0RnJlcVBlclNhbXBsZSwgICAjIGRhdGHjga7liJfjgZTjgajjgavlh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgZ/ntZDmnpzjgpJyZXN1bHTjgavmoLzntI0NCiAgICAgICAgICAgICAgICBwcmVkaWN0aW9uLCB0cnV0aCkgICAgICAgICMgZGF0YeOBruWIl+OBlOOBqOOBq+WHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBn+e1kOaenOOCknJlc3VsdOOBq+agvOe0jQ0KaG9nZSA8LSBzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCAxKSAgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgonjgIEx55Wq55uu44Gu6KaB57Sg44Gu5oq95Ye657WQ5p6c44KSaG9nZeOBq+agvOe0jQ0KZnJlcV9tYXQgPC0gc2FwcGx5KFggPSBob2dlLCBGVU4gPSBjYmluZCkgIyBob2dl5Lit44Gu5ZCE6KaB57Sg44KS5YiX5pa55ZCR44Gn57WQ5ZCI44GX44Gf57WQ5p6c44KSZnJlcV9tYXTjgavmoLzntI0NCnJvd25hbWVzKGZyZXFfbWF0KSA8LSBuYW1lcyhob2dlW1sxXV0pICAgICMgbmFtZXMoaG9nZVtbMV1dKeOCkmZyZXFfbWF044Gu6KGM5ZCN5oOF5aCx44Go44GZ44KLDQpzZW5zaXRpdml0eSA8LSB1bmxpc3Qoc2FwcGx5KFggPSByZXN1bHQsIEZVTiA9IGBbYCwgMykpICMgcmVzdWx05Lit44Gu5ZCE6KaB57Sg44GL44KJM+eVquebruOBruimgee0oOOBruOBv+aKveWHuuOBl+OBn+e1kOaenOOCkuODmeOCr+ODiOODq+W9ouW8j+OBq+OBl+OBpnNlbnNpdGl2aXR544Gr5qC857SNDQpwcmVjaXNpb25fd2l0aF9OQSA8LSB1bmxpc3Qoc2FwcGx5KFggPSByZXN1bHQsIEZVTiA9IGBbYCwgNCkpICMgcmVzdWx05Lit44Gu5ZCE6KaB57Sg44GL44KJNOeVquebruOBruimgee0oOOBruOBv+aKveWHuuOBl+OBn+e1kOaenOOCkuODmeOCr+ODiOODq+W9ouW8j+OBq+OBl+OBpnByZWNpc2lvbl93aXRoX05B44Gr5qC857SNDQpwcmVjaXNpb25fd2l0aG91dF9OQSA8LSB1bmxpc3Qoc2FwcGx5KFggPSByZXN1bHQsIEZVTiA9IGBbYCwgNSkpICMgcmVzdWx05Lit44Gu5ZCE6KaB57Sg44GL44KJNeeVquebruOBruimgee0oOOBruOBv+aKveWHuuOBl+OBn+e1kOaenOOCkuODmeOCr+ODiOODq+W9ouW8j+OBq+OBl+OBpnByZWNpc2lvbl93aXRob3V0X05B44Gr5qC857SNDQpyZXN1bHRfcGVycyA8LSByYmluZChmcmVxX21hdCwgICAgICAgICAgICAjIOihjOaWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCknJlc3VsdF9wZXJz44Gr5qC857SNDQogICAgICAgICAgICAgICAgICAgICBzZW5zaXRpdml0eSwgICAgICAgICAjIOihjOaWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCknJlc3VsdF9wZXJz44Gr5qC857SNDQogICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb25fd2l0aF9OQSwgICAjIOihjOaWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCknJlc3VsdF9wZXJz44Gr5qC857SNDQogICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb25fd2l0aG91dF9OQSkjIOihjOaWueWQkeOBp+e1kOWQiOOBl+OBn+e1kOaenOOCknJlc3VsdF9wZXJz44Gr5qC857SNDQoNCiMg44K144Oz44OX44Or5YWo5L2TDQpyZXMgPC0gZ2V0X1czLjYoZGF0YSwgcHJlZGljdGlvbiwgdHJ1dGgpICAjIOWHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBpnJlc+OBq+agvOe0jQ0Kb3ZlcmFsbCA8LSBjKHJlcyRmcmVxdWUsICAgICAgICAgICAgICAgICAgIyDjg5njgq/jg4jjg6vjgajjgZfjgabpgKPntZDjgZfjgZ/ntZDmnpzjgpJvdmVyYWxs44Gr5qC857SNDQogICAgICAgICAgICAgcmVzJHNlbnNpdGl2aXR5LCAgICAgICAgICAgICAjIOODmeOCr+ODiOODq+OBqOOBl+OBpumAo+e1kOOBl+OBn+e1kOaenOOCkm92ZXJhbGzjgavmoLzntI0NCiAgICAgICAgICAgICByZXMkcHJlY2lzaW9uX3dpdGhfTkEsICAgICAgICMg44OZ44Kv44OI44Or44Go44GX44Gm6YCj57WQ44GX44Gf57WQ5p6c44KSb3ZlcmFsbOOBq+agvOe0jQ0KICAgICAgICAgICAgIHJlcyRwcmVjaXNpb25fd2l0aG91dF9OQSkgICAgIyDjg5njgq/jg4jjg6vjgajjgZfjgabpgKPntZDjgZfjgZ/ntZDmnpzjgpJvdmVyYWxs44Gr5qC857SNDQoNCiMg44OV44Kh44Kk44Or5Ye65YqbDQpyZXN1bHRfYWxsIDwtIGNiaW5kKHJlc3VsdF9wZXJzLCBvdmVyYWxsKSAjIHJlc3VsdF9wZXJz44Gob3ZlcmFsbOOCkuWIl+aWueWQkeOBp+mAo+e1kOOBl+OBpnJlc3VsdF9hbGzjgavmoLzntI0NCnRtcCA8LSBjYmluZChyb3duYW1lcyhyZXN1bHRfYWxsKSwgcmVzdWx0X2FsbCkjIHJlc3VsdF9hbGzjga7ooYzlkI3jgajjgIFyZXN1bHRfYWxs44KS5YiX5pa55ZCR44Gn6YCj57WQ44GX44GmdG1w44Gr5qC857SNDQp3cml0ZS50YWJsZSh4ID0gdG1wLCBmaWxlID0gb3V0X2YsIHNlcCA9ICJcdCIsIHJvdy5uYW1lcyA9IEYpIyB0bXDjga7kuK3ouqvjgpLmjIflrprjgZfjgZ/jg5XjgqHjgqTjg6vlkI3jgafjgr/jg5bljLrliIfjgorjg4bjgq3jgrnjg4jjg5XjgqHjgqTjg6vjgajjgZfjgabjgIHooYzlkI3jgpLjgaTjgZHjgZrjgavkv53lrZgNCmBgYA0KDQojIFc2IOato+OBl+OBhOeoruWQjeOBp+WGjeino+aekA0K44CA6I+M5qCq5oOF5aCx44OV44Kh44Kk44Or5Lit44Gu44K544Oa44Or44Of44K544KS5L+u5q2j44GX44Gf44GG44GI44GnVzXjgpLjgoTjgornm7TjgZfjgb7jgZnjgILlhbfkvZPnmoTjgavjga/jgIFtZW5pbmdpdGlkZXPjgpJtZW5pbmdpdGlkaXPjgavkv67mraPjgZfjgZ9bSlNMQUIyM190YWJsZTFfY29ycmVjdGVkLnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL0pTTEFCMjNfdGFibGUxX2NvcnJlY3RlZC50eHQp44KS5YWl5Yqb44OV44Kh44Kk44Or44Go44GX44Gm5a6f6KGM44GX44G+44GZ44CCVzIuM+OBp+W+l+OCieOCjOOCi+OCquODluOCuOOCp+OCr+ODiOOBqOOBrumBleOBhOOBr+OAgWBzcGVjaWVzX3RydXRoYOOBruOBv+OBq+OBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9VFJVRX0NCiMgVzIuMSBkYWRhMuWun+ihjOe1kOaenOODleOCoeOCpOODq+OBruOBu+OBhg0KaW5fZiA8LSAiaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCIgIyDoqq3jgb/ovrzjgb/jgZ/jgYTjg5XjgqHjgqTjg6vmg4XloLHjgpJpbl9m44Gr5qC857SNDQpob2dlIDwtIHJlYWQudGFibGUoaW5fZiwgaGVhZGVyPVRSVUUsIHJvdy5uYW1lcz0xLCBzZXA9Ilx0IikjIGluX2bjgpLjgIEx6KGM55uu44KS5YiX5ZCN44CBMeWIl+ebruOCkuihjOWQjeOBqOOBl+OBpuiqreOBv+i+vOOCk+OBoOe1kOaenOOCkmhvZ2XjgavmoLzntI0NCm9iaiA8LSBncmVwKHBhdHRlcm4gPSAiU1JSIiwgeCA9IGNvbG5hbWVzKGhvZ2UpKSAgIyBjb2xuYW1lcyhob2dlKeOBruS4reOBi+OCiSJTUlIi44Go44GE44GG5paH5a2X44KS5ZCr44KA6KaB57Sg55Wq5Y+344KS5oq95Ye644GX44Gf57WQ5p6c44KSb2Jq44Gr5qC857SNDQpkYXRhIDwtIGhvZ2VbLCBvYmpdICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XooYzliJfkuK3jga5vYmrjgafmjIflrprjgZfjgZ/liJfjga7jgb/mir3lh7rjgZfjgZ/ntZDmnpzjgpJkYXRh44Gr5qC857SNDQpnZW51cyA8LSBob2dlJEdlbnVzICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XkuK3jga5HZW51c+WIl+OCkuaKveWHuuOBl+OBn+e1kOaenOOCkmdlbnVz44Gr5qC857SNDQpzcGVjaWVzIDwtIGhvZ2UkU3BlY2llcyAgICAgICAgICAgICAgICAgICAjIGhvZ2XkuK3jga5TcGVjaWVz5YiX44KS5oq95Ye644GX44Gf57WQ5p6c44KSc3BlY2llc+OBq+agvOe0jQ0KDQojIFcyLjIg6I+M5qCq5oOF5aCx44OV44Kh44Kk44Or44Gu44G744GGDQppbl9mIDwtICJodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUIyM190YWJsZTFfY29ycmVjdGVkLnR4dCIgIyDoqq3jgb/ovrzjgb/jgZ/jgYTjg5XjgqHjgqTjg6vmg4XloLHjgpJpbl9m44Gr5qC857SNDQpob2dlIDwtIHJlYWQudGFibGUoaW5fZiwgaGVhZGVyPVRSVUUsIHJvdy5uYW1lcz0xLCBzZXA9Ilx0IikgI2luX2bjgpLjgIEx6KGM55uu44KS5YiX5ZCN44CBMeWIl+ebruOCkuihjOWQjeOBqOOBl+OBpuiqreOBv+i+vOOCk+OBoOe1kOaenOOCkmhvZ2XjgavmoLzntI0NCm9yZ2FuaXNtIDwtIGhvZ2UkT3JnYW5pc20gICAgICAgICAgICAgICAgICMgaG9nZeS4reOBrk9yZ2FuaXNt5YiX44KS5oq95Ye644GX44Gf57WQ5p6c44KSb3JnYW5pc23jgavmoLzntI0NCmhvZ2UgPC0gc3Ryc3BsaXQoeCA9IG9yZ2FuaXNtLCBzcGxpdCA9ICIsIikjIG9yZ2FuaXNt5Lit44Gu5paH5a2X5YiX44OZ44Kv44OI44Or44KS44Kz44Oz44Oe44Gn5YiG5Ymy44GX44Gf57WQ5p6c44KSaG9nZeOBq+agvOe0jQ0KaG9nZTIgPC0gc2FwcGx5KFggPSBob2dlLCBGVU4gPSBgW2AsIDEpICAgIyBob2dl5Lit44Gu44OZ44Kv44OI44Or5b2i5byP44Gu5ZCE6KaB57Sg44GL44KJ44CBMeeVquebruOBruimgee0oOOBruaKveWHuue1kOaenOOCkmhvZ2Uy44Gr5qC857SNDQpob2dlMyA8LSBzdHJzcGxpdCh4ID0gaG9nZTIsIHNwbGl0ID0gIiAiKSAjIGhvZ2Uy5Lit44Gu5paH5a2X5YiX44OZ44Kv44OI44Or44KS5Y2K6KeS44K544Oa44O844K544Gn5YiG5Ymy44GX44Gf57WQ5p6c44KSaG9nZTPjgavmoLzntI0NCmdlbnVzX3RydXRoIDwtIHNhcHBseShYID0gaG9nZTMsIEZVTiA9IGBbYCwgMSkgICMgaG9nZTPkuK3jga7jg5njgq/jg4jjg6vlvaLlvI/jga7lkITopoHntKDjgYvjgonjgIEx55Wq55uu44Gu6KaB57Sg44Gu5oq95Ye657WQ5p6c44KSZ2VudXNfdHJ1dGjjgavmoLzntI0NCnNwZWNpZXNfdHJ1dGggPC0gc2FwcGx5KFggPSBob2dlMywgRlVOID0gYFtgLCAyKSMgaG9nZTPkuK3jga7jg5njgq/jg4jjg6vlvaLlvI/jga7lkITopoHntKDjgYvjgonjgIEy55Wq55uu44Gu6KaB57Sg44Gu5oq95Ye657WQ5p6c44KSc3BlY2llc190cnV0aOOBq+agvOe0jQ0KZ2VudXNfdHJ1dGggPC0gdW5pcXVlKGdlbnVzX3RydXRoKSAgICAgICAgIyBnZW51c190cnV0aOS4reOBruODpuODi+ODvOOCr+OBquimgee0oOOCkmdlbnVzX3RydXRo44Gr5qC857SNDQpzcGVjaWVzX3RydXRoIDwtIHVuaXF1ZShzcGVjaWVzX3RydXRoKSAgICAjIHNwZWNpZXNfdHJ1dGjkuK3jga7jg6bjg4vjg7zjgq/jgaropoHntKDjgpJzcGVjaWVzX3RydXRo44Gr5qC857SNDQpgYGANCuOAgOasoeOBq+OAgVc1LjLjgavnm7jlvZPjgZnjgovlhoXlrrnjgpLlho3luqblrp/ooYzjgZfjgb7jgZnjgIJXNS4y44Go44Gu6YGV44GE44Gv44CB5Ye65Yqb44OV44Kh44Kk44Or5ZCN44Gu44G/44Gn44GZ44CC5b+144Gu44Gf44KB44CB44GT44GT44Gn44KC44K/44OW5Yy65YiH44KK44OG44Kt44K544OI44OV44Kh44Kk44Or54mI77yIW291dHB1dF9KU0xBQjI1X3NwZWNpZXNfY29ycmVjdGVkLnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI1X3NwZWNpZXNfY29ycmVjdGVkLnR4dCnvvInjgah4bHN454mI77yIW291dHB1dF9KU0xBQjI1X3NwZWNpZXNfY29ycmVjdGVkLnhsc3hdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNV9zcGVjaWVzX2NvcnJlY3RlZC54bHN4Ke+8ieOCkuODgOOCpuODs+ODreODvOODieOBp+OBjeOCi+OCiOOBhuOBq+OBl+OBpuOBiuOBjeOBvuOBmQ0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9VFJVRX0NCnNvdXJjZSgiaHR0cDovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL2Jvb2svSlNMQUJfc291cmNlLlIiKSAjIOmWouaVsOOBruiqrei+vA0KIyDjg5Hjg6njg6Hjg7zjgr8NCnByZWRpY3Rpb24gPC0gc3BlY2llcyAgICAgICAgICAgICAgICAgICAgICMgZGFkYTLlrp/ooYzntZDmnpzjga7jgqrjg5bjgrjjgqfjgq/jg4jjgpJwcmVkaWN0aW9u44Gr44Kz44OU44O8DQp0cnV0aCA8LSBzcGVjaWVzX3RydXRoICAgICAgICAgICAgICAgICAgICAjIOato+ino+aDheWgseOCknRydXRo44Gr44Kz44OU44O8DQpvdXRfZiA8LSAib3V0cHV0X0pTTEFCMjVfc3BlY2llc19jb3JyZWN0ZWQudHh0IiAjIOWHuuWKm+ODleOCoeOCpOODq+WQjeOCkm91dF9m44Gr44Kz44OU44O8DQoNCiMg44K144Oz44OX44Or44GU44GoDQpyZXN1bHQgPC0gYXBwbHkoWCA9IGRhdGEsIE1BUkdJTiA9IDIsICAgICAjIGRhdGHjga7liJfjgZTjgajjgavlh7rnj77poLvluqbjga7jgb7jgajjgoHmg4XloLHjgpLlj5blvpfjgZfjgZ/ntZDmnpzjgpJyZXN1bHTjgavmoLzntI0NCiAgICAgICAgICAgICAgICBGVU4gPSBnZXRGcmVxUGVyU2FtcGxlLCAgICMgZGF0YeOBruWIl+OBlOOBqOOBq+WHuuePvumgu+W6puOBruOBvuOBqOOCgeaDheWgseOCkuWPluW+l+OBl+OBn+e1kOaenOOCknJlc3VsdOOBq+agvOe0jQ0KICAgICAgICAgICAgICAgIHByZWRpY3Rpb24sIHRydXRoKSAgICAgICAgIyBkYXRh44Gu5YiX44GU44Go44Gr5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44Gf57WQ5p6c44KScmVzdWx044Gr5qC857SNDQpob2dlIDwtIHNhcHBseShYID0gcmVzdWx0LCBGVU4gPSBgW2AsIDEpICAjIHJlc3VsdOS4reOBruWQhOimgee0oOOBi+OCieOAgTHnlarnm67jga7opoHntKDjga7mir3lh7rntZDmnpzjgpJob2dl44Gr5qC857SNDQpmcmVxX21hdCA8LSBzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGNiaW5kKSAjIGhvZ2XkuK3jga7lkITopoHntKDjgpLliJfmlrnlkJHjgafntZDlkIjjgZfjgZ/ntZDmnpzjgpJmcmVxX21hdOOBq+agvOe0jQ0Kcm93bmFtZXMoZnJlcV9tYXQpIDwtIG5hbWVzKGhvZ2VbWzFdXSkgICAgIyBuYW1lcyhob2dlW1sxXV0p44KSZnJlcV9tYXTjga7ooYzlkI3mg4XloLHjgajjgZnjgosNCnNlbnNpdGl2aXR5IDwtIHVubGlzdChzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCAzKSkgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgokz55Wq55uu44Gu6KaB57Sg44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KS44OZ44Kv44OI44Or5b2i5byP44Gr44GX44Gmc2Vuc2l0aXZpdHnjgavmoLzntI0NCnByZWNpc2lvbl93aXRoX05BIDwtIHVubGlzdChzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCA0KSkgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgok055Wq55uu44Gu6KaB57Sg44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KS44OZ44Kv44OI44Or5b2i5byP44Gr44GX44GmcHJlY2lzaW9uX3dpdGhfTkHjgavmoLzntI0NCnByZWNpc2lvbl93aXRob3V0X05BIDwtIHVubGlzdChzYXBwbHkoWCA9IHJlc3VsdCwgRlVOID0gYFtgLCA1KSkgIyByZXN1bHTkuK3jga7lkITopoHntKDjgYvjgok155Wq55uu44Gu6KaB57Sg44Gu44G/5oq95Ye644GX44Gf57WQ5p6c44KS44OZ44Kv44OI44Or5b2i5byP44Gr44GX44GmcHJlY2lzaW9uX3dpdGhvdXRfTkHjgavmoLzntI0NCnJlc3VsdF9wZXJzIDwtIHJiaW5kKGZyZXFfbWF0LCAgICAgICAgICAgICMg6KGM5pa55ZCR44Gn57WQ5ZCI44GX44Gf57WQ5p6c44KScmVzdWx0X3BlcnPjgavmoLzntI0NCiAgICAgICAgICAgICAgICAgICAgIHNlbnNpdGl2aXR5LCAgICAgICAgICMg6KGM5pa55ZCR44Gn57WQ5ZCI44GX44Gf57WQ5p6c44KScmVzdWx0X3BlcnPjgavmoLzntI0NCiAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbl93aXRoX05BLCAgICMg6KGM5pa55ZCR44Gn57WQ5ZCI44GX44Gf57WQ5p6c44KScmVzdWx0X3BlcnPjgavmoLzntI0NCiAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbl93aXRob3V0X05BKSMg6KGM5pa55ZCR44Gn57WQ5ZCI44GX44Gf57WQ5p6c44KScmVzdWx0X3BlcnPjgavmoLzntI0NCg0KIyDjgrXjg7Pjg5fjg6vlhajkvZMNCnJlcyA8LSBnZXRfVzMuNihkYXRhLCBwcmVkaWN0aW9uLCB0cnV0aCkgICMg5Ye654++6aC75bqm44Gu44G+44Go44KB5oOF5aCx44KS5Y+W5b6X44GX44GmcmVz44Gr5qC857SNDQpvdmVyYWxsIDwtIGMocmVzJGZyZXF1ZSwgICAgICAgICAgICAgICAgICAjIOODmeOCr+ODiOODq+OBqOOBl+OBpumAo+e1kOOBl+OBn+e1kOaenOOCkm92ZXJhbGzjgavmoLzntI0NCiAgICAgICAgICAgICByZXMkc2Vuc2l0aXZpdHksICAgICAgICAgICAgICMg44OZ44Kv44OI44Or44Go44GX44Gm6YCj57WQ44GX44Gf57WQ5p6c44KSb3ZlcmFsbOOBq+agvOe0jQ0KICAgICAgICAgICAgIHJlcyRwcmVjaXNpb25fd2l0aF9OQSwgICAgICAgIyDjg5njgq/jg4jjg6vjgajjgZfjgabpgKPntZDjgZfjgZ/ntZDmnpzjgpJvdmVyYWxs44Gr5qC857SNDQogICAgICAgICAgICAgcmVzJHByZWNpc2lvbl93aXRob3V0X05BKSAgICAjIOODmeOCr+ODiOODq+OBqOOBl+OBpumAo+e1kOOBl+OBn+e1kOaenOOCkm92ZXJhbGzjgavmoLzntI0NCg0KIyDjg5XjgqHjgqTjg6vlh7rlipsNCnJlc3VsdF9hbGwgPC0gY2JpbmQocmVzdWx0X3BlcnMsIG92ZXJhbGwpICMgcmVzdWx0X3BlcnPjgahvdmVyYWxs44KS5YiX5pa55ZCR44Gn6YCj57WQ44GX44GmcmVzdWx0X2FsbOOBq+agvOe0jQ0KdG1wIDwtIGNiaW5kKHJvd25hbWVzKHJlc3VsdF9hbGwpLCByZXN1bHRfYWxsKSMgcmVzdWx0X2FsbOOBruihjOWQjeOBqOOAgXJlc3VsdF9hbGzjgpLliJfmlrnlkJHjgafpgKPntZDjgZfjgaZ0bXDjgavmoLzntI0NCndyaXRlLnRhYmxlKHggPSB0bXAsIGZpbGUgPSBvdXRfZiwgc2VwID0gIlx0Iiwgcm93Lm5hbWVzID0gRikjIHRtcOOBruS4rei6q+OCkuaMh+WumuOBl+OBn+ODleOCoeOCpOODq+WQjeOBp+OCv+ODluWMuuWIh+OCiuODhuOCreOCueODiOODleOCoeOCpOODq+OBqOOBl+OBpuOAgeihjOWQjeOCkuOBpOOBkeOBmuOBq+S/neWtmA0KYGBg