はじめに

サンプル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 クオリティコントロール

W1.1 事前準備

 第23回のW6.2と基本的に同じスクリプトです。fnFsfnRsがQC前のファイルの相対パス情報、filtFsfiltRsがQC後のファイルの相対パス情報になります。

basho <- "."                              # 相対パスなので、現在の作業ディレクトリを"."で表現
# Forward側
fnFs <- list.files(pattern = "_1.fastq", path = basho, full.names = TRUE)
hoge <- strsplit(x = basename(fnFs), split = "_")# basename(fnFs)の文字列を"_"で分割
sampleID <- sapply(X = hoge, FUN = `[`, 1)# hogeの1番目の要素のみを抽出
filtFs <- file.path(basho, "processed", paste0(sampleID, "_F_filt.fastq"))# ファイルパス情報を作成
names(filtFs) <- sampleID                 # sampleIDをfiltFsベクトルの要素名にする
# Reverse側
fnRs <- list.files(pattern = "_2.fastq", path = basho, full.names = TRUE)
hoge <- strsplit(x = basename(fnRs), split = "_")# basename(fnRs)の文字列を"_"で分割
sampleID <- sapply(X = hoge, FUN = `[`, 1)# hogeの1番目の要素のみを抽出
filtRs <- file.path(basho, "processed", paste0(sampleID, "_R_filt.fastq"))# ファイルパス情報を作成
names(filtRs) <- sampleID                 # sampleIDをfiltRsベクトルの要素名にする

W1.2 plotQualityProfile関数

 plotQualityProfile関数は、fastqファイルを入力として、リード中の塩基ポジションごとのクオリティスコアのプロットを出力します(約10分)。

W1.2.1 QC前のForward側

 まずはfnFsオブジェクトの中身を表示させています。これは、QC前のForward側のfastqファイルの相対パス情報になります。plotQualityProfile関数の入力として、fnFsオブジェクトがそのまま利用されていることがわかります。入出力の関係からも明らかですが、入力は文字列ベクトルですので、ベクトルの要素数がファイル数に相当します。これが図1と同じものになります。

fnFs                                      # fnFsの中身を確認
##  [1] "./SRR6325813_1.fastq" "./SRR6325815_1.fastq" "./SRR6325816_1.fastq"
##  [4] "./SRR6325817_1.fastq" "./SRR6325828_1.fastq" "./SRR6325829_1.fastq"
##  [7] "./SRR6325830_1.fastq" "./SRR6325831_1.fastq" "./SRR6325859_1.fastq"
## [10] "./SRR6325860_1.fastq" "./SRR6325861_1.fastq" "./SRR6325862_1.fastq"
plotQualityProfile(fnFs)                  # fnFsのクオリティスコアのプロット

 入力が12個のファイル名情報ですので、出力として12個のプロットが得られます。各プロットの横軸はリード中の塩基のポジション(5’端が左、3’端が右)、縦軸はクオリティスコアです。連載第4回でも解説していますが、高ければ高いほどよいと解釈します。

W1.2.2 QC前のReverse側

 次に、fnRsオブジェクトの中身を表示させています。これは、QC前のReverse側のfastqファイルの相対パス情報になります。plotQualityProfile関数の入力として、fnRsオブジェクトをそのまま与えています。

fnRs                                      # fnRsの中身を確認
##  [1] "./SRR6325813_2.fastq" "./SRR6325815_2.fastq" "./SRR6325816_2.fastq"
##  [4] "./SRR6325817_2.fastq" "./SRR6325828_2.fastq" "./SRR6325829_2.fastq"
##  [7] "./SRR6325830_2.fastq" "./SRR6325831_2.fastq" "./SRR6325859_2.fastq"
## [10] "./SRR6325860_2.fastq" "./SRR6325861_2.fastq" "./SRR6325862_2.fastq"
plotQualityProfile(fnRs)                  # fnRsクオリティスコアのプロット

W1.3 filterAndTrim関数

 filterAndTrim関数は、リードのfastqファイルを入力として、クオリティの低い領域のトリム、Nを含むリードのフィルタリング、サンプル中に含まれるPhiXというポジティブコントロールサンプル由来リードのフィルタリングなどを実行します(約5分)。主な出力結果であるQC後のリードファイルはfiltFsfiltRsですが、QC前後のリード数の情報は、outオブジェクトに保存されます。なお、実行中に「Multithreading has been DISABLED, as forking is not supported on .Platform$OS.type ‘windows’」のようなメッセージが出ても、並列計算ができないだけで計算自体は動いているので問題ありません。

out <- filterAndTrim(                     # filterandTrim関数を実行し、結果をoutオブジェクトに格納
  fwd = fnFs,                             # QC前のForward(F)側のファイル名
  filt = filtFs,                          # QC後のForward(F)側のファイル名
  rev = fnRs,                             # QC前のReverse(R)側のファイル名
  filt.rev =filtRs,                       # QC後のReverse(R)側のファイル名
  maxN = c(0, 0),                         # リードに含まれるNの許容数はF側R側ともに0
  maxEE = c(2, 5),                        # リード中のエラー率の和の閾値はF側が2、R側が5
  truncLen = c(225, 160),                 # F側は225、R側は160 bpになるまで右側をトリム
  trimLeft = 20,                          # リードの左側を20 bpトリム
  rm.phix = TRUE,                         # PhiX配列由来のリードを除去
  compress = FALSE,                       # 結果を圧縮ファイルにしない
  multithread = TRUE                      # マルチスレッドで計算を高速化する
)

この関数で与えている情報を以下にまとめます:

  • fwd = fnFs
    QC前のファイルの相対パス情報(Forward側)を指定する部分です。オプション名のfwdは、forwardの略だと解釈します。
  • filt = filtFs
    QC後のファイルの相対パス情報(Forward側)を指定する部分です。オプション名のfiltは、フィルタリング(filtering)後のファイル名情報を指定せよという意味だと解釈します。
  • rev = fnRs
    QC前のファイルの相対パス情報(Reverse側)を指定する部分です。オプション名の`rev``は、reverseの略だと解釈します。
  • filt.rev = filtRs
    QC後のファイルの相対パス情報(Reverse側)を指定する部分です。オプション名のfilt.revは、フィルタリング(filtering)後のreverse側ファイル名情報を指定せよという意味だと解釈します。
  • maxN = c(0, 0)
    リードに含まれるNの許容数を指定する部分です。c(0, 0)は、0という要素が2つある数値ベクトルを意味し、F側R側ともにNを含むリードを1つも許容しないという意味です。要素が2つになっているのは、Forward側とReverse側の2種類のファイルを入力として与えているためです。例えば、もしc(1, 3)なら、Forward側は、塩基配列中にNが全く含まれないリードだけでなく、1個含むリードまで許容する(2個以上Nを含むリードを捨てる)ことを意味します。また、Reverse側は、0~3個Nを含むリードまで許容することを意味します。
  • maxEE = c(2, 5)
    リード中のエラー率の和の閾値を指定する部分です。c(2, 5)は、2つの要素からなる数値ベクトル(1番目の要素が2、2番目の要素が5)を意味し、F側が2、R側が5という意味です。この場合はリード長が250 bpありますが、塩基ごとにクオリティスコア(つまりエラー率)の情報が付与されています。それを全部足していったエラー率の合計が2未満のリードのみ残す(それ以上のリードは捨てる)のがForward側、5未満のリードのみ残す(それ以上のリードは捨てる)のがReverse側だと解釈すればよいです(参考論文はEdgar and Flyvbjerg, 2015)。閾値が2というのは、2/250 = 0.008ということになるので、塩基当たりの平均で0.8%のエラー率まで許容するのがForward側、5/250 = 2%のエラー率まで許容するのがReverse側なのだと理解します。Reverse側の値が大きいのは、こちらのほうが全体的にクオリティスコアが低いためです。
  • truncLen = c(225, 160)
    Forward側は225 bp、Reverse側は160 bpになるまで右側(3’末端)をトリム せよという指令です。このオプションは、Forward側とReverse側でトリムしたい長さが異なる場合に利用します。補足として、もしForward側Reverse側関係なく223 bpになるまで右側(3’末端)をトリムしたいだけであれば、このオプションは丸々削除し、以下のtrimLeftと同じノリで、trimRight = 27とすればよいです(リード長は250 bpなので、250 - 223 = 27)。なお、 truncLen = c(225, 160)の場合はReverse側は250 - 160 = 90 bpだけ右側をトリムさせることに相当します。基本的にtrimRightと共存させないことをおススメします。もしtrimRightを90 bp以下の数値を指定すると(例:trimRight = 27)それは何の影響も与えない一方で、90より大きい数値を指定すると全リードが除去されてしまいますのでご注意ください(なぜそうなるかという理由云々というよりはそういう仕様だということです)。
  • trimLeft = 25
    これはそのまんまなのですが、リードの左側(5’端)を25 bp分トリムせよという指令です。これは、Forward側Reverse側関係なくクオリティスコア分布のx軸の左側の25 bp分(つまり1~25番目の塩基)は、50~150塩基付近に比べて相対的にスコアが低く見えるからです。別に25じゃなくて20でも30とかでもよいのですが、なんとなく25 bpかなという感じです。
  • rm.phix = TRUE
    PhiXというIlluminaのコントロールライブラリ由来のリード配列を除去せよという指令です。PhiXは配列既知のバクテリオファージ(スモールゲノム)です。サンプル由来リードではありませんし同定が簡単ですので、このオプションは無条件でTRUEが基本です。
  • compress = FALSE
    出力結果を圧縮ファイルにはしないという指令です。これはTRUEにしても特に問題はないと思います。
  • multithread = TRUE
    複数のCPUを使って計算せよという指令です。他の計算も同時進行で走らせていて、そちらが遅くなるのはいやな場合はFALSEでもよいです。特にCPU数を把握していないユーザは、とりあえずTRUEのままでやってみて差し支えありません。

W1.4 QC後のスコア分布を確認

 plotQualityProfile関数は、fastqファイルを入力として、リード中の塩基ポジションごとのクオリティスコアのプロットを出力します(約10分)。

W1.4.1 QC後のForward側

 まず、filtFsオブジェクトの中身を表示させています。これは、QC後のForward側のfastqファイルの相対パス情報になります。plotQualityProfile関数の入力として、filtFsオブジェクトをそのまま与えています。

filtFs                                    # filtFsの中身を確認
##                            SRR6325813                            SRR6325815 
## "./processed/SRR6325813_F_filt.fastq" "./processed/SRR6325815_F_filt.fastq" 
##                            SRR6325816                            SRR6325817 
## "./processed/SRR6325816_F_filt.fastq" "./processed/SRR6325817_F_filt.fastq" 
##                            SRR6325828                            SRR6325829 
## "./processed/SRR6325828_F_filt.fastq" "./processed/SRR6325829_F_filt.fastq" 
##                            SRR6325830                            SRR6325831 
## "./processed/SRR6325830_F_filt.fastq" "./processed/SRR6325831_F_filt.fastq" 
##                            SRR6325859                            SRR6325860 
## "./processed/SRR6325859_F_filt.fastq" "./processed/SRR6325860_F_filt.fastq" 
##                            SRR6325861                            SRR6325862 
## "./processed/SRR6325861_F_filt.fastq" "./processed/SRR6325862_F_filt.fastq"
plotQualityProfile(filtFs)                # filtFsクオリティスコアのプロット

W1.4.2 QC後のReverse側

 次に、まずfiltRsオブジェクトの中身を表示させています。これは、QC後のReverse側のfastqファイルの相対パス情報になります。plotQualityProfile関数の入力として、filtRsオブジェクトをそのまま与えています。

filtRs                                    # filtRsの中身を確認
##                            SRR6325813                            SRR6325815 
## "./processed/SRR6325813_R_filt.fastq" "./processed/SRR6325815_R_filt.fastq" 
##                            SRR6325816                            SRR6325817 
## "./processed/SRR6325816_R_filt.fastq" "./processed/SRR6325817_R_filt.fastq" 
##                            SRR6325828                            SRR6325829 
## "./processed/SRR6325828_R_filt.fastq" "./processed/SRR6325829_R_filt.fastq" 
##                            SRR6325830                            SRR6325831 
## "./processed/SRR6325830_R_filt.fastq" "./processed/SRR6325831_R_filt.fastq" 
##                            SRR6325859                            SRR6325860 
## "./processed/SRR6325859_R_filt.fastq" "./processed/SRR6325860_R_filt.fastq" 
##                            SRR6325861                            SRR6325862 
## "./processed/SRR6325861_R_filt.fastq" "./processed/SRR6325862_R_filt.fastq"
plotQualityProfile(filtRs)                # filtRsのクオリティスコアのプロット

W1.5 QC前後のリード数を確認

 W1.3で得たfilterAndTrim関数の実行結果が格納されたoutオブジェクトを用いて、QC前後でリード数がどのように変わったかを確認します。ここで得たものが、表1のリード数情報になります。

W1.5.1 基本形

 outの中身を表示させているだけです。reads.in列がQC前、reads.out列がQC後のリード数です。

out                                       # outの中身を確認
##                    reads.in reads.out
## SRR6325813_1.fastq   282517    274412
## SRR6325815_1.fastq   266259    259243
## SRR6325816_1.fastq   359984    346364
## SRR6325817_1.fastq   325660    312068
## SRR6325828_1.fastq   206939    196357
## SRR6325829_1.fastq   261767    247957
## SRR6325830_1.fastq   238627    229740
## SRR6325831_1.fastq   225548    218387
## SRR6325859_1.fastq   290383    282994
## SRR6325860_1.fastq   253908    247186
## SRR6325861_1.fastq   120789    115542
## SRR6325862_1.fastq   258792    248696

W1.5.2 割合の情報を追加

 先ほどの結果より、outの行列は1列目がQC前、2列目がQC後のリード数であることはすぐにわかります。ここではまず、2列目/1列目として残ったリードの割合をratioというオブジェクトにまず格納しています。次に、元々2列の情報からなるout行列の右側に、先ほど得たratioオブジェクトをcbind関数を用いて列方向で結合して出力しています。ここで得たものが、表1bの割合の情報になります。

ratio <- out[,2]/out[,1]                  # outの2列目/1列目を計算し、ratioに格納
cbind(out, ratio)                         # outの右側にratioの情報を列方向で連結
##                    reads.in reads.out     ratio
## SRR6325813_1.fastq   282517    274412 0.9713115
## SRR6325815_1.fastq   266259    259243 0.9736497
## SRR6325816_1.fastq   359984    346364 0.9621650
## SRR6325817_1.fastq   325660    312068 0.9582632
## SRR6325828_1.fastq   206939    196357 0.9488642
## SRR6325829_1.fastq   261767    247957 0.9472432
## SRR6325830_1.fastq   238627    229740 0.9627578
## SRR6325831_1.fastq   225548    218387 0.9682507
## SRR6325859_1.fastq   290383    282994 0.9745543
## SRR6325860_1.fastq   253908    247186 0.9735258
## SRR6325861_1.fastq   120789    115542 0.9565606
## SRR6325862_1.fastq   258792    248696 0.9609880

 トリムやフィルタリングで残ったリードの割合の最大値と最小値は、それぞれ以下の通りです:

  • 最大値とそのサンプル名:0.9745543、SRR6325859_1.fastq
  • 最小値とそのサンプル名:0.9472432、SRR6325829_1.fastq

W1.6 ユニーク配列の数

ユニーク配列(unique sequences)とは、長さはもちろんのこと、同一ポジションの塩基が完全に一致する配列のことです。ここでは、dada2パッケージが提供するgetUniques関数を用いてユニーク配列の数をカウントする例を示します。ここで得たものが、表1のユニーク配列の情報になります。

W1.6.1 基本的な考え方

 いきなり250 bpの長いリードで結果を示しても理解しづらいので、ここではまず第23回の図2bの左下に見えている7本のリード配列をサンプルデータとして用います。そして、実質的にgetUniques関数と同じ挙動を示すtable関数を用いて感覚をつかみます。

hoge <- c("ACCGAGGAGGTCGGCGCCTC",         # 第23回の図2bの左下の7配列をhogeに格納
          "ACGGAGGAGGTCGGCGCCTC",         # 第23回の図2bの左下の7配列をhogeに格納
          "ACGGAGGACGTCGGCGCCTA",         # 第23回の図2bの左下の7配列をhogeに格納
          "ACGGAGGAGGTCGGCGCCTC",         # 第23回の図2bの左下の7配列をhogeに格納
          "ACGGAGGAGGTCGGCGCCTC",         # 第23回の図2bの左下の7配列をhogeに格納
          "ATGGAGGAGGTCGGCGCCTC",         # 第23回の図2bの左下の7配列をhogeに格納
          "ACGGATGAGGTCGGCGACTC")         # 第23回の図2bの左下の7配列をhogeに格納
table(hoge)                               # hogeベクトル中の要素の種類ごとの出現頻度を確認
## hoge
## ACCGAGGAGGTCGGCGCCTC ACGGAGGACGTCGGCGCCTA ACGGAGGAGGTCGGCGCCTC 
##                    1                    1                    3 
## ACGGATGAGGTCGGCGACTC ATGGAGGAGGTCGGCGCCTC 
##                    1                    1

 hogeは文字列ベクトルであり、計7つのリード塩基配列が格納されていることがわかります。つまり、リード数は7です。そして、よく眺めると、2, 4, 5番目のリードのみが同一であり、それ以外はどこかのポジションの塩基が異なっていることがわかります。つまり、ユニーク配列の数は5です。この事実を認識したうえでtable(hoge)実行結果を眺めると、table関数の挙動がよくわかると思います。つまり、table関数にベクトルを入力として与えると、ユニークな要素を同定するとともに、要素ごとの出現頻度を返してくれるのです。

 この場合のtable(hoge)実行結果の要素数がユニークな配列数となりますので、ベクトルの要素数を調べるlength関数を引き続いて実行す れば、「ユニークな配列数は5個」という結果が得られるのです。

length(table(hoge))                       # ベクトル中のユニークな要素数を返す
## [1] 5

 同様に、table(hoge)実行結果として得られる出現頻度情報をsum関数を用いて足すと、元のリード数情報(つまり7個)が得られます。

sum(table(hoge))                          # 出現頻度の総和(つまりリード数)を計算
## [1] 7

 なお、table(hoge)実行結果は、デフォルトでは要素(この場合は塩基配列)をアルファベット順にソートした状態で返されます。出現頻度を降順(多 \(\rightarrow\) 少)にした状態にするには、以下のようにsort関数をdecreasing = Tというオプションつきで引き続いて実行すればよいです。decreasing = Tはソート結果を降順(多 \(\rightarrow\) 少)にせよというオプションです。  

sort(table(hoge), decreasing = T)         # ベクトル中の要素ごとの出現頻度を降順で返す
## hoge
## ACGGAGGAGGTCGGCGCCTC ACCGAGGAGGTCGGCGCCTC ACGGAGGACGTCGGCGCCTA 
##                    3                    1                    1 
## ACGGATGAGGTCGGCGACTC ATGGAGGAGGTCGGCGCCTC 
##                    1                    1

 このあと解説するgetUniques関数は、上記スクリプトのような塩基配列ごとの出現頻度をデフォルトで降順(多 \(\rightarrow\) 少)の状態で返してくれます。

W1.6.2 getUniques関数

 次に、getUniques関数の利用例を示します。この関数は、fastqファイルを読み込んで、ユニーク配列ごとの出現頻度を降順(多 \(\rightarrow\) 少)で返してくれます。ここではまず、「QC前のForward側のfastqファイル群の名前」情報を格納したfnFsオブジェクトの1番目の要素(つまり”./SRR6325813_1.fastq”)のみを入力として与えて、getUniques関数実行結果として得られるユニーク配列ごとの出現頻度情報に、さらにsum関数を実行しています。つまり、getUniques関数を利用してリード数情報を得ようとしています。

hoge <- fnFs[1]                           # fnFsの1番目の要素をhogeに格納
hoge                                      # 中身を確認
## [1] "./SRR6325813_1.fastq"
sum(getUniques(hoge))                     # リード数情報
## [1] 282517

 得られた結果(つまり282517個)は、確かに第23回の表2で示されているリード数と一致しています。次に、出現頻度の多い上位3つをhead関数を用いて示します。1つ1つのリードが250 bp(250文字)あるので見づらいかと思いますが、1番多いのは60791個、2番目に多いのは36760個と解釈します。

head(getUniques(hoge), n = 3)             # hoge中のユニーク配列の最初の3つ(塩基配列と出現頻度)を確認
## TACGTAGGGTGCGAGCGTTAATCGGAATTACTGGGCGTAAAGCGGGCGCAGACGGTTACTTAAGCAGGATGTGAAATCCCCGGGCTCAACCCGGGAACTGCGTTCTGAACTGGGTGACTCGAGTGTGTCAGAGGGAGGTAGAATTCCACGTGTAGCAGTGAAATGCGTAGAGATGTGGAGGAATACCGATGGCGAAGGCAGCCTCCTGGGACAACACTGACGTTCATGCCCGAAAGCGTGGGTAGCAAACA 
##                                                                                                                                                                                                                                                       60791 
## TACGAAGGGTGCAAGCGTTAATCGGAATTACTGGGCGTAAAGCGCGCGTAGGTGGTTCAGCAAGTTGGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCCAAAACTACTGAGCTAGAGTACGGTAGAGGGTGGTGGAATTTCCTGTGTAGCGGTGAAATGCGTAGATATAGGAAGGAACACCAGTGGCGAAGGCGACCACCTGGACTGATACTGACACTGAGGTGCGAAAGCGTGGGGAGCAAACA 
##                                                                                                                                                                                                                                                       36760 
## TACGTAGGTGGCAAGCGTTATCCGGAATTATTGGGCGTAAAGCGCGCGCAGGTGGTTTCTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGGAGACTTGAGTGCAGAAGAGGAAAGTGGAATTCCATGTGTAGCGGTGAAATGCGTAGAGATATGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGTCTGTAACTGACACTGAGGCGCGAAAGCGTGGGGAGCAAACA 
##                                                                                                                                                                                                                                                       25789

 次に、出現頻度の少ない上位3つをtail関数を用いて示します。予想通りですが、3つとも1個だと解釈します。

tail(getUniques(hoge), n = 3)             # hoge中のユニーク配列の最後の3つ(塩基配列と出現頻度)を確認
## TTCGTAGGTGGCAAGCGTTGTCCGGATTTATTGGGCGTAAAGCGCGCGCAGGCGGTCTTTTAAGTCTGATGTGGAAGCCCCCGGCTTAACCGGGGAGGGTCATTGGAAACTGGAAGACTGGAGTGCAGAAGAGGAGAGTGGAATTCCACGTGTAGCGGTGAAATGCGTAGATATGTGGAGGAACACCAGTGGCGAAGGCGACTCTCTGGTCTGTAACTGACGCTGAGGCGCGAGAGCGTGGGGAGCAAACA 
##                                                                                                                                                                                                                                                           1 
## TTCGTAGGTGGCAAGCGTTGTCCGGCTTTATTTGGCGTAAAGCGAGCGCAGGCGGTTTCTTAAGTCTGATGTGAAAGCCCCCGGCTCAACCGGGGAGGGTCATTGGAAACTGGGAGACTTGAGTGCAGAAGAGGAGAGTGGAATTCCATGTGTAGCGGTGAAATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGGCTCTCTGGTCTGTAACTGACGCTGAGGCTCGAAAGCGTGGGGAGCAAACA 
##                                                                                                                                                                                                                                                           1 
## TTCGTAGGTGGCAAGCGTTGTCCGGTTTTATTTGGCGTAAAGCGCGCGCAGGCGGTCTTTTAAGTCTGATGTGAAAGCCCCCGGCTTAACCGGGGAGGGTCATTGGAAACTGGAAGACTGGAGTGCAGAAGAGGAGAGTGGAATTCCACGTGTAGCGGTGAAATGCGTAGATATGTGGAGGAACACCAGTGGCGAAGGCGACTCTCTGGTCTGTAACTGACGCTGAGGCGCGAAAGCGTGGGGAGCAAACA 
##                                                                                                                                                                                                                                                           1

 ユニーク配列の数は、以下のようにlength関数を用いて得ることができます。

length(getUniques(hoge))                  # ユニークな配列数
## [1] 47712

 このサンプル(./SRR6325813_1.fastq)のリード数は282517個ですので、ユニーク配列1本あたり282517 / 47712 = 5.9212986個の同一塩基配列のリードが存在すると解釈できます。

sum(getUniques(hoge)) / length(getUniques(hoge)) # ユニークな配列1本あたりの出現頻度を計算
## [1] 5.921299

W1.6.3 自作のgetUniNum関数

 様々な書き方(定義の仕方)がありますが、例えば以下のようにすれば、ファイル中のユニーク配列の数を得るgetUniNumという名前の関数を定義することができます。この関数の実体は、getUniques関数実行に引き続いてlength関数を実行することです。なお、xは入力として与える情報に相当します。

getUniNum <- function(x) length(getUniques(x))   # ユニーク配列数を得るための関数を定義

 一度定義してしまえば、あとは通常の関数と同様の利用法ができます。

hoge <- fnFs[1]                           # fastqファイル名をhogeに格納
getUniNum(hoge)                           # ユニーク配列数を確認
## [1] 47712

 getUniNum関数は、1つのfastqファイルの入力しか想定していません。そのため、下記のように「QC前のForward側のfastqファイル群の名前」情報を格納したfnFsオブジェクトをそのまま入力として与えるとエラーが出ます。エラーが出ることが分かっている状態でエラーメッセージを眺めると、確かに「…Unrecognized format…」などと書かれている意味がなんとなく分かると思います。

fnFs                                      # 中身を確認
##  [1] "./SRR6325813_1.fastq" "./SRR6325815_1.fastq" "./SRR6325816_1.fastq"
##  [4] "./SRR6325817_1.fastq" "./SRR6325828_1.fastq" "./SRR6325829_1.fastq"
##  [7] "./SRR6325830_1.fastq" "./SRR6325831_1.fastq" "./SRR6325859_1.fastq"
## [10] "./SRR6325860_1.fastq" "./SRR6325861_1.fastq" "./SRR6325862_1.fastq"
getUniNum(fnFs)                           # ユニーク配列数を確認
## Error in getUniques(x): Unrecognized format: Requires named integer vector, fastq filename, dada-class, derep-class, sequence matrix, or a data.frame with $sequence and $abundance columns.

W1.6.4 lapply関数を利用

 12個のfastqファイルそれぞれのリード数を一度に実行する1つのやり方は、lapply関数の利用です。これは、fnFsの要素ごとにgetUniNum関数を実行してくれます。実行結果は[[1]]のようなリスト形式で返されますが、表示されているユニーク配列数は正しいです。

lapply(fnFs, getUniNum)                   # fnFs中のサンプルごとのユニーク配列数をリスト形式で確認
## [[1]]
## [1] 47712
## 
## [[2]]
## [1] 44341
## 
## [[3]]
## [1] 61184
## 
## [[4]]
## [1] 60466
## 
## [[5]]
## [1] 40611
## 
## [[6]]
## [1] 50769
## 
## [[7]]
## [1] 41645
## 
## [[8]]
## [1] 37710
## 
## [[9]]
## [1] 49343
## 
## [[10]]
## [1] 43452
## 
## [[11]]
## [1] 24214
## 
## [[12]]
## [1] 44494

W1.6.5 unlist関数も併用

 結果をリスト形式ではなくベクトル形式で得たい場合は、以下で示すようにunlist関数を追加で実行すればよいです。

unlist(lapply(fnFs, getUniNum))           # fnFs中のサンプルごとのユニーク配列数をベクトル形式で確認
##  [1] 47712 44341 61184 60466 40611 50769 41645 37710 49343 43452 24214 44494

W1.6.6 sapply関数を利用

 以下で示すようにsapply関数を利用してもかまいません。このあたりは好みですので、多様なやり方を知り、見慣れない関数や出力結果に狼狽しないことのみが重要です。

sapply(fnFs, getUniNum)                   # fnFs中のサンプルごとのユニーク配列数を確認
## ./SRR6325813_1.fastq ./SRR6325815_1.fastq ./SRR6325816_1.fastq 
##                47712                44341                61184 
## ./SRR6325817_1.fastq ./SRR6325828_1.fastq ./SRR6325829_1.fastq 
##                60466                40611                50769 
## ./SRR6325830_1.fastq ./SRR6325831_1.fastq ./SRR6325859_1.fastq 
##                41645                37710                49343 
## ./SRR6325860_1.fastq ./SRR6325861_1.fastq ./SRR6325862_1.fastq 
##                43452                24214                44494

W1.6.7 QC前のForward側

 実質的に直前の項と同じ内容ですが、sapply実行結果をuniseq_fnFsに格納しています。これが「表1、(a)QC前、ユニーク配列の数、Forward」の基礎情報です。

uniseq_fnFs <- sapply(fnFs, getUniNum)    # fnFs中のサンプルごとのユニーク配列数をuniseq_fnFsに格納
uniseq_fnFs                               # 中身を確認
## ./SRR6325813_1.fastq ./SRR6325815_1.fastq ./SRR6325816_1.fastq 
##                47712                44341                61184 
## ./SRR6325817_1.fastq ./SRR6325828_1.fastq ./SRR6325829_1.fastq 
##                60466                40611                50769 
## ./SRR6325830_1.fastq ./SRR6325831_1.fastq ./SRR6325859_1.fastq 
##                41645                37710                49343 
## ./SRR6325860_1.fastq ./SRR6325861_1.fastq ./SRR6325862_1.fastq 
##                43452                24214                44494

W1.6.8 QC前のReverse側

 「表1、(a)QC前、ユニーク配列の数、Reverse」の基礎情報です。

uniseq_fnRs <- sapply(fnRs, getUniNum)    # fnRs中のサンプルごとのユニーク配列数をuniseq_fnRsに格納
uniseq_fnRs                               # 中身を確認
## ./SRR6325813_2.fastq ./SRR6325815_2.fastq ./SRR6325816_2.fastq 
##                97726                90228               115402 
## ./SRR6325817_2.fastq ./SRR6325828_2.fastq ./SRR6325829_2.fastq 
##               110355                65478                81542 
## ./SRR6325830_2.fastq ./SRR6325831_2.fastq ./SRR6325859_2.fastq 
##                75736                70284               107800 
## ./SRR6325860_2.fastq ./SRR6325861_2.fastq ./SRR6325862_2.fastq 
##                95390                45201                89439

W1.6.9 QC後のForward側

 「表1、(b)QC後、ユニーク配列の数、Forward」の基礎情報です。

uniseq_filtFs <- sapply(filtFs, getUniNum)# filtFs中のサンプルごとのユニーク配列数をuniseq_filtFsに格納
uniseq_filtFs                             # 中身を確認
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##      26947      25669      31854      31377      20033      23878      21710 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##      20537      28213      24314      12800      22918

W1.6.10 QC後のReverse側

 「表1、(b)QC後、ユニーク配列の数、Reverse」の基礎情報です。

uniseq_filtRs <- sapply(filtRs, getUniNum)# filtRs中のサンプルごとのユニーク配列数をuniseq_filtRsに格納
uniseq_filtRs                             # 中身を確認
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##      34499      33033      36310      34583      18587      20516      23508 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##      23016      39027      33721      14794      28879

W2 ノイズ除去

 dada2の主要部分は、ノイズ除去と重複除去(denoising and dereplication)の2つのステップから構成されます。ここでは、その最初のステップを行います。シークエンサには癖があり、例えば「本当はAという塩基なのに間違ってTを出力しがち」とかがあります。このとき、「AからTへの置換(A to T)」というのを、この業界では「A2T」のようにtoを2に置き換えて表現する場合が多いです(特にLinuxの変換系のプログラム名でそのような傾向があります)。このような組み合わせは、理論上\(4^2 = 16\)通りあります(A2A, A2C, A2G, A2T, C2A, …, T2G, T2T)。また、塩基ごとに付与されているクオリティスコア\(q\)が低いほどシークエンスエラーが起こりやすい(エラー率\(p\)が高い)のですが、この\(p\)\(q\)の関係は以下の数式で表現されます: \[ q = - 10 \times \log_{10} (p) \]

W2.1 learnErrors関数

 learnErrors関数は、リードファイルを入力として、Forward側とReverse側独立にエラーモデルの推定を行います。通常はQC後のfastqファイルが入力になりますので、例えばForward側の場合は、それらのファイルの相対パス情報であるfiltFsを与えます。flsはただのオプション名です。ここでは、得られたエラーモデル情報をForward側はerrFsに、そしてReverse側はerrRsオブジェクトに格納しています。

errFs <- learnErrors(fls = filtFs, multithread = TRUE) # filtFsの一部を用いたエラーモデル推定
## 109399275 total bases in 533655 reads from 2 samples will be used for learning the error rates.
errRs <- learnErrors(fls = filtRs, multithread = TRUE) # filtRsの一部を用いたエラーモデル推定
## 123202660 total bases in 880019 reads from 3 samples will be used for learning the error rates.

W2.2 plotErrors関数

 plotErrors関数は、learnErrors関数の実行結果を入力として、16通りの塩基置換の種類ごとにクオリティスコアとエラー頻度(推定エラーモデルを含む)の関係をプロットした結果を出力します。

W2.2.1 Forward側

 Forward側のlearnErrors関数の実行結果であるerrFsを入力としてプロットしています。nominalQ = TRUEは、赤線をつけよという指令です。これが図2と同じものになります。

plotErrors(errFs, nominalQ = TRUE)        # errFsの中身(エラー頻度やエラーモデル推定結果)をプロット

W2.2.2 Reverse側

 Reverse側のlearnErrors関数の実行結果であるerrRsを入力としてプロットしています。

plotErrors(errRs, nominalQ = TRUE)        # errRsの中身(エラー頻度やエラーモデル推定結果)をプロット

W2.3 dada関数

 dada関数は、前処理が終わったリードファイル(Forward側の場合はfiltFs)と先ほど得たエラーモデル情報(Forward側の場合はerrFs)を入力として、denoisingを実行します。

dadaFs <- dada(derep = filtFs, err = errFs, multithread = TRUE) # filtFsとerrFsを入力としてエラー補正を実行
## Sample 1 - 274412 reads in 26947 unique sequences.
## Sample 2 - 259243 reads in 25669 unique sequences.
## Sample 3 - 346364 reads in 31854 unique sequences.
## Sample 4 - 312068 reads in 31377 unique sequences.
## Sample 5 - 196357 reads in 20033 unique sequences.
## Sample 6 - 247957 reads in 23878 unique sequences.
## Sample 7 - 229740 reads in 21710 unique sequences.
## Sample 8 - 218387 reads in 20537 unique sequences.
## Sample 9 - 282994 reads in 28213 unique sequences.
## Sample 10 - 247186 reads in 24314 unique sequences.
## Sample 11 - 115542 reads in 12800 unique sequences.
## Sample 12 - 248696 reads in 22918 unique sequences.
dadaRs <- dada(derep = filtRs, err = errRs, multithread = TRUE) # filtRsとerrRsを入力としてエラー補正を実行
## Sample 1 - 274412 reads in 34499 unique sequences.
## Sample 2 - 259243 reads in 33033 unique sequences.
## Sample 3 - 346364 reads in 36310 unique sequences.
## Sample 4 - 312068 reads in 34583 unique sequences.
## Sample 5 - 196357 reads in 18587 unique sequences.
## Sample 6 - 247957 reads in 20516 unique sequences.
## Sample 7 - 229740 reads in 23508 unique sequences.
## Sample 8 - 218387 reads in 23016 unique sequences.
## Sample 9 - 282994 reads in 39027 unique sequences.
## Sample 10 - 247186 reads in 33721 unique sequences.
## Sample 11 - 115542 reads in 14794 unique sequences.
## Sample 12 - 248696 reads in 28879 unique sequences.

W2.4 結果の確認

 head関数は、行列の場合は最初の6行分、ベクトルやリストの場合は、最初の6つ分の要素を出力します。つまりデフォルトはn = 6です。ここではn = 2オプションをつけて先ほどのdada関数実行結果(dadaFsおよびdadaRs)の中身を最初の2サンプル分に限定して確認しています。

head(dadaFs, n = 2)                       # dadaFs中の最初の2つを確認
## $SRR6325813
## dada-class: object describing DADA2 denoising results
## 270 sequence variants were inferred from 26947 input unique sequences.
## Key parameters: OMEGA_A = 1e-40, OMEGA_C = 1e-40, BAND_SIZE = 16
## 
## $SRR6325815
## dada-class: object describing DADA2 denoising results
## 328 sequence variants were inferred from 25669 input unique sequences.
## Key parameters: OMEGA_A = 1e-40, OMEGA_C = 1e-40, BAND_SIZE = 16
head(dadaRs, n = 2)                       # dadaRs中の最初の2つを確認
## $SRR6325813
## dada-class: object describing DADA2 denoising results
## 190 sequence variants were inferred from 34499 input unique sequences.
## Key parameters: OMEGA_A = 1e-40, OMEGA_C = 1e-40, BAND_SIZE = 16
## 
## $SRR6325815
## dada-class: object describing DADA2 denoising results
## 224 sequence variants were inferred from 33033 input unique sequences.
## Key parameters: OMEGA_A = 1e-40, OMEGA_C = 1e-40, BAND_SIZE = 16

W2.5 ユニーク配列数を確認

 W1.6.3で定義した自作関数getUniNumをここで改めて再定義して、dada関数実行後にユニーク配列の数がどれだけ減っているかを確認します。ここの数値が表2のユニーク配列数の基礎情報となります。

getUniNum <- function(x) length(getUniques(x))# ユニーク配列数を得るための関数を定義
sapply(dadaFs, getUniNum)                 # dadaFs中のサンプルごとのユニーク配列数を確認
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##        270        328        369        317        205        225        198 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##        185        404        298         83        155
sapply(dadaRs, getUniNum)                 # dadaRs中のサンプルごとのユニーク配列数を確認
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##        190        224        273        239        159        171        141 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##        131        262        192         56        109

W2.6 リード数を確認

 W1.6.3の自作関数getUniNumはユニーク配列数を得るためのものでしたが、length関数部分をsum関数に置き換えることで、リード数を得るための関数に書き替えることができます。ここでは、それをgetReadNumという自作関数として定義しています。ここの数値が表2のリード数の基礎情報となります。

getReadNum <- function(x) sum(getUniques(x))# リード数を得るための関数を定義
sapply(dadaFs, getReadNum)                # dadaFs中のサンプルごとのリード数を確認
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##     273973     258614     345867     311660     196147     247769     229465 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##     218210     282429     246714     115462     248439
sapply(dadaRs, getReadNum)                # dadaRs中のサンプルごとのリード数を確認
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##     272894     257784     344679     310610     195695     247249     228684 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##     217404     281362     245839     115080     247742

W2.7 ユニーク配列の出現頻度

 第23回の図2でも示されているように、dada2は出現頻度の少ないユニーク配列を解析の過程で除去します。それを確かめるべく、dada関数実行結果(dadaFsdadaRs)に対して、ユニーク配列ごとの出現頻度の主に下位を確認します。以前行ったW1.6.2のスクリプトを参考にしています。

W2.7.1 出現頻度の上位

 まずは1番目のサンプル(サンプルID:SRR6325813)に対して、上位4つを眺めます。1つ1つのリードが長いので見づらいかと思いますが、1番多いのは82848個、2番目に多いのは52232個と解釈します。

head(getUniques(dadaFs[[1]]), n = 4)      # dadaFs中の1番目の要素に対して、ユニーク配列の最初の4つ(塩基配列と出現頻度)を確認
## ATCGGAATTACTGGGCGTAAAGCGGGCGCAGACGGTTACTTAAGCAGGATGTGAAATCCCCGGGCTCAACCCGGGAACTGCGTTCTGAACTGGGTGACTCGAGTGTGTCAGAGGGAGGTAGAATTCCACGTGTAGCAGTGAAATGCGTAGAGATGTGGAGGAATACCGATGGCGAAGGCAGCCTCCTGGGACAACACTGACGTTC 
##                                                                                                                                                                                                         82848 
## ATCGGAATTACTGGGCGTAAAGCGCGCGTAGGTGGTTCAGCAAGTTGGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCCAAAACTACTGAGCTAGAGTACGGTAGAGGGTGGTGGAATTTCCTGTGTAGCGGTGAAATGCGTAGATATAGGAAGGAACACCAGTGGCGAAGGCGACCACCTGGACTGATACTGACACTG 
##                                                                                                                                                                                                         52232 
## ATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTGGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTC 
##                                                                                                                                                                                                         38747 
## TCCGGAATTATTGGGCGTAAAGCGCGCGCAGGTGGTTTCTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGGAGACTTGAGTGCAGAAGAGGAAAGTGGAATTCCATGTGTAGCGGTGAAATGCGTAGAGATATGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGTCTGTAACTGACACTG 
##                                                                                                                                                                                                         35026

W2.7.2 出現頻度の下位

 次に、下位4つを確認します。さきほどのhead関数の結果から、getUniques関数実行結果は出現頻度でソートされているものだと思っていましたが、そうはなっていないことがわかります。

tail(getUniques(dadaFs[[1]]), n = 4)      # dadaFs中の1番目の要素に対して、ユニーク配列の最後の4つ(塩基配列と出現頻度)を確認
## TCCGGATTTATTGGGTTTAAAGGGTGCGTAGGTTGTTCGGTAAGTCAGCGGTGAAACCTGAGCGCTCAACGTTCAGCCTGCCGTTGAAACTGCCGGGCTTGAGTTCAGCGGCGGCAGGCGGAATTCGTGGTGTAGCGGTGAAATGCATAGATATAGGAAGGAACACCAGTGGCGAAGGCGACCACCTGGACTGATACTGACACTG 
##                                                                                                                                                                                                             4 
## TCCGGATTTATTGGGCGTAAAGCGAGCGCAGGCGGTTTCTTAAGTCTGATGTGAAAGCCCCCGGCTCAACCGGGGAGGGTCATTGGAAACTGGGAGACTTGAGTGCAGAAGAGGAGAGTGGAATTCCATGTGTAGCGGTGAAATGCGCAGAGATATGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGTCTGTAACTGACGCTG 
##                                                                                                                                                                                                            13 
## TCCGGAATTATTGGGCGTAAAGCGCGCGTAGGCGGTTTTTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGAAAACTTGAGTGCAGAAGAGGAAAGTGGAATTCCATGTGTAGCGGTGAAATGCGTAGATATAGGAAGGAACACCAGTGGCGAAGGCGACCACCTGGACTGATACTGACACTG 
##                                                                                                                                                                                                             8 
## ATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTCTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGGAGACTTGAGTGCAGAAGAGGAAAGTGGAATTCCATGTGTAGCGGTGAAATGCGTAGAGATATGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGTCTGTAACTGACACTG 
##                                                                                                                                                                                                            15

 このような場合は、例えばW1.6.1などを参考にして、自分で降順(多 \(\rightarrow\) 少)にソートしてから、改めてtail関数を実行するなどして対処します。W1.6.2の時点では、このサンプル(dadaFs[[1]])は出現頻度が1回のものが存在しましたが、dada関数実行後はなくなっていることがわかります。

hoge <- sort(getUniques(dadaFs[[1]]), decreasing = T) # dadaFs中の1番目の要素に対して、ユニーク配列の出現頻度が多い順にソートした結果をhogeに格納
tail(hoge, n = 4)                         # hoge中の最後の4つのを確認
## ATCGGAATTACTGGGCGTAAAGCGCGCGTAGGTGGTTCAGCAAGTTGGATGTGAAAGCCTTCGGCTCAACCGGAGAATTGCATCAGAAACTGTTGAACTTGAGTGCAGAAGAGGAGAGTGGAACTCCATGTGTAGCGGTGGAATGCGTAGATATATGGAAGAACACCAGTGGCGAAGGCGACTTTCTGGTCTGTAACTGACACTG 
##                                                                                                                                                                                                             2 
## ATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCTGGTGGAGCGGTGGAATGCGCAGATATCAGGAGGAACACCAGTGGCGAAGGCGGTTCTCTGGGCCTTTCCTGACGCTG 
##                                                                                                                                                                                                             2 
## TCCGGATTTATTGGGCGTAAAGCGAGCGCAGACGGTTATTTAAGTCTGAAGTGAAAGCCCTCAGCTCAACTGAGGAATTGCTTTGGAAACTGGATGACTTGAGTGCAGTAGAGGAAAGTGGAACTCCATGTGTAGCGGTGAAATGCGTAGAGATATGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGTCTGTAACTGACACTG 
##                                                                                                                                                                                                             2 
## TTCGGATTCACTGGGCGTAAAGGGTGCGTAGGCGGTCGGGTAAGTCTGACGTGAAATCTCCGGGCCTAACCCGGAAACTGCGTCGGATACTATCCGGCTAGAGGATTGGAAGGGAGACTGGAATACTTGGTGTAGCAGTGAAATGCGTAGATATCAAGTGGAACACCAGTGGCGAAGGCGAGTCTCTGGACAATTCCTGACGCTG 
##                                                                                                                                                                                                             2

 ここで知りたいことは、主に出現頻度が最小のものが1ではなくなっているかどうかです。それゆえ、例えば以下のような感じで、min関数を用いて出現頻度の最小値のみを得るためのgetMinNum関数を自作します。W1.6.3、W2.5、およびW2.6を参考にしています。

getMinNum <- function(x) min(getUniques(x))# 出現頻度の最小値を得るための関数を定義

 あとは、W2.5やW2.6と同じようにしてdada関数実行結果(dadaFsdadaRs)を入力として実行すればよいです。Forward側Reverse側含め全サンプルで2になっていることから、確かにdada2は出現頻度が2以上あるリードのみに限定していることがわかります。

sapply(dadaFs, getMinNum)                 # dadaFs中のサンプルごとのリード数の最小値を取得
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##          2          2          2          2          2          2          2 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##          2          2          2          2          2
sapply(dadaRs, getMinNum)                 # dadaRs中のサンプルごとのリード数の最小値を取得
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##          2          2          2          2          2          2          2 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##          2          2          2          2          2

W3 重複除去

 ここではまず、mergePairs関数を用いてForwardとReverseのオーバーラップ領域のマージ(重複領域の除去)を行います。この作業はサンプルごとに行われるため、得られたユニーク配列(ASV)の一部はサンプル間で重複します。そのため、makeSequenceTable関数を用いて解析対象の計12サンプル全体でASVの重複除去を行います。これは、和集合を得るイメージになります。

W3.1 mergePairs関数

 mergePairs関数は、dada関数実行結果の2つのオブジェクト(dadaFsdadaRs)、およびfilterAndTrim関数実行結果の2つのオブジェクト(filtFsfiltRs)を入力として、ペア―ドエンドリードのマージを実行します。ここではデフォルトのオプションを明示していますが、Forward側とReverse側で12塩基以上のオーバーラップがあり(minOverlap = 12)、かつオーバーラップ領域のミスマッチがない(maxMismatch = 0)という条件でマージが実行されます。

mergers <- mergePairs(                    # ペア―ドエンドのマージを実行し、結果をmergersに格納
  dadaF = dadaFs,                         # エラー補正後のForward側はdadaFs
  derepF = filtFs,                        # QC後のForward側はfiltFs
  dadaR = dadaRs,                         # エラー補正後のReverse側はdadaRs
  derepR = filtRs,                        # QC後のReverse側はfiltRs
  minOverlap = 12,                        # オーバーラップの閾値は12塩基以上
  maxMismatch = 0,                        # オーバーラップ領域の許容ミスマッチ数は0
  verbose = TRUE                          # 結果を冗長に表示する(要は画面にも出力せよという指令)
)
## 268804 paired-reads (in 236 unique pairings) successfully merged out of 272596 (in 905 pairings) input.
## 253588 paired-reads (in 282 unique pairings) successfully merged out of 257333 (in 1053 pairings) input.
## 341395 paired-reads (in 299 unique pairings) successfully merged out of 344403 (in 772 pairings) input.
## 306377 paired-reads (in 249 unique pairings) successfully merged out of 310392 (in 708 pairings) input.
## 194243 paired-reads (in 182 unique pairings) successfully merged out of 195517 (in 486 pairings) input.
## 245046 paired-reads (in 206 unique pairings) successfully merged out of 247099 (in 542 pairings) input.
## 226534 paired-reads (in 168 unique pairings) successfully merged out of 228465 (in 594 pairings) input.
## 215157 paired-reads (in 171 unique pairings) successfully merged out of 217291 (in 651 pairings) input.
## 276081 paired-reads (in 371 unique pairings) successfully merged out of 280943 (in 1466 pairings) input.
## 241843 paired-reads (in 273 unique pairings) successfully merged out of 245487 (in 1030 pairings) input.
## 114574 paired-reads (in 72 unique pairings) successfully merged out of 115021 (in 190 pairings) input.
## 244352 paired-reads (in 136 unique pairings) successfully merged out of 247530 (in 464 pairings) input.

W3.2 サンプルごとの結果

 ここでは、mergePairs関数実行結果として得られたmergersオブジェクトの中身を確認します。mergers[[1]]が1番目のサンプルの結果、mergers[[2]]が2番目のサンプルの結果、…、mergers[[12]]が12番目のサンプルの結果になります。

W3.2.1 結果の概要を確認

 1番目のサンプル(SRR6325813)のForwardとReverseをマージした結果について、head関数で最初の6配列分の結果を示します。前半部分で見えているのは、マージ後の塩基配列(コンティグ)です。後半部分で行列っぽく見えているのは、abundance列がコンティグの出現頻度、forward列がdadaFsオブジェクト中の配列のインデックス(何番目の配列かという情報)、reverse列がdadaRsオブジェクト中の配列のインデックス、nmatch列が一致塩基数です。

head(mergers[[1]])                        # mergers中の1番目の要素(サンプル)について、最初の6つを確認
##                                                                                                                                                                                                                sequence
## 1 ATCGGAATTACTGGGCGTAAAGCGGGCGCAGACGGTTACTTAAGCAGGATGTGAAATCCCCGGGCTCAACCCGGGAACTGCGTTCTGAACTGGGTGACTCGAGTGTGTCAGAGGGAGGTAGAATTCCACGTGTAGCAGTGAAATGCGTAGAGATGTGGAGGAATACCGATGGCGAAGGCAGCCTCCTGGGACAACACTGACGTTCATGCCCGA
## 2 ATCGGAATTACTGGGCGTAAAGCGCGCGTAGGTGGTTCAGCAAGTTGGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCCAAAACTACTGAGCTAGAGTACGGTAGAGGGTGGTGGAATTTCCTGTGTAGCGGTGAAATGCGTAGATATAGGAAGGAACACCAGTGGCGAAGGCGACCACCTGGACTGATACTGACACTGAGGTGCGA
## 3 ATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTGGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAGGTGCGA
## 4 TCCGGAATTATTGGGCGTAAAGCGCGCGCAGGTGGTTTCTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGGAGACTTGAGTGCAGAAGAGGAAAGTGGAATTCCATGTGTAGCGGTGAAATGCGTAGAGATATGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGTCTGTAACTGACACTGAGGCGCGA
## 5 TCCGGATTTATTGGGTTTAAAGGGTGCGTAGGTTGTTCGGTAAGTCAGCGGTGAAACCTGAGCGCTCAACGTTCAGCCTGCCGTTGAAACTGCCGGGCTTGAGTTCAGCGGCGGCAGGCGGAATTCGTGGTGTAGCGGTGAAATGCATAGATATCACGAGGAACTCCGATTGCGAAGGCAGCTTGCCATACTGCGACTGACACTGAAGCACGA
## 6 ATCGGATTTACTGGGCGTAAAGCGTGCGTAGGCGGCTTATTAAGTCGGATGTGAAATCCCCGAGCTTAACTTGGGAATTGCATTCGATACTGGTGAGCTAGAGTATGGGAGAGGATGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTGGAGGAATACCGATGGCGAAGGCAGCCATCTGGCCTAATACTGACGCTGAGGTACGA
##   abundance forward reverse nmatch nmismatch nindel prefer accept
## 1     81414       1       1    132         0      0      1   TRUE
## 2     51794       2       2    132         0      0      1   TRUE
## 3     38101       3       3    132         0      0      1   TRUE
## 4     34709       4       4    132         0      0      1   TRUE
## 5     13645       5       6    132         0      0      1   TRUE
## 6     10653       6       5    132         0      0      1   TRUE

W3.2.2 手作業でマージ

 どのようなマージが実際に行われているのかを確認すべく、上記の結果でabundanceが13645個の5番目の配列を例として示します。まず、入力配列のForward側はdadaFsオブジェクト中の5番目の配列、Reverse側はdadaRsオブジェクト中の6番目の配列だと解釈します。つまり、以下の2つがマージ前の配列です。

dadaFs[[1]]$sequence[5]                   # dadaFs中の1番目のサンプル中の5番目の塩基配列を確認
## [1] "TCCGGATTTATTGGGTTTAAAGGGTGCGTAGGTTGTTCGGTAAGTCAGCGGTGAAACCTGAGCGCTCAACGTTCAGCCTGCCGTTGAAACTGCCGGGCTTGAGTTCAGCGGCGGCAGGCGGAATTCGTGGTGTAGCGGTGAAATGCATAGATATCACGAGGAACTCCGATTGCGAAGGCAGCTTGCCATACTGCGACTGACACTG"
dadaRs[[1]]$sequence[6]                   # dadaRs中の1番目のサンプル中の6番目の塩基配列を確認
## [1] "TCGTGCTTCAGTGTCAGTCGCAGTATGGCAAGCTGCCTTCGCAATCGGAGTTCCTCGTGATATCTATGCATTTCACCGCTACACCACGAATTCCGCCTGCCGCCGCTGAACTCAAGCCCGGCAGTTTCAACGGCAGGCTG"

 これらの配列長は、W1.3でも指定していますが、Forward側が205 bp、Reverse側が140 bpです。W3.2のnmatch列の5番目を眺めると、オーバーラップ(一致)塩基数が132個だということが分かります。このことから、ペア―ドエンドのマージによって、205 bpあるForward側のリードの右側に、Reverse側の5’端の(140 - 132) = 8 bp分だけ追加されたのだろうと解釈します。

nchar(dadaFs[[1]]$sequence[5])            # dadaFs中の1番目のサンプル中の5番目の塩基配列の文字数(配列長)を確認
## [1] 205
nchar(dadaRs[[1]]$sequence[6])            # dadaRs中の1番目のサンプル中の6番目の塩基配列の文字数(配列長)を確認
## [1] 140

 ただし、実際にマージされるのは、Reverse側の配列の逆相補鎖(reverse complement)の3’端側の8 bp分だという点に注意が必要です。rc関数を利用すれば、逆相補鎖を得ることができます。

rc(dadaRs[[1]]$sequence[6])               # dadaRs中の1番目のサンプル中の6番目の塩基配列の逆相補鎖を確認
## [1] "CAGCCTGCCGTTGAAACTGCCGGGCTTGAGTTCAGCGGCGGCAGGCGGAATTCGTGGTGTAGCGGTGAAATGCATAGATATCACGAGGAACTCCGATTGCGAAGGCAGCTTGCCATACTGCGACTGACACTGAAGCACGA"

W3.2.3 リード数を確認

 W2.6で自作したリード数を得るための関数getReadNumをここで改めて定義し、W3.1で得たmergePairs関数実行結果であるmergersオブジェクトを入力として実行します。ここの数値が表3のリード数の基礎情報となります。

getReadNum <- function(x) sum(getUniques(x))# リード数を得るための関数を定義
sapply(mergers, getReadNum)               # mergers中のサンプルごとのリード数を確認
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##     268804     253588     341395     306377     194243     245046     226534 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##     215157     276081     241843     114574     244352

W3.2.4 ユニーク配列数を確認

 W2.5で自作したリード数を得るための関数getUniNumをここで改めて定義し、W3.1で得たmergePairs関数実行結果であるmergersオブジェクトを入力として実行します。ここの数値が表3のユニーク配列数の基礎情報となります。

getUniNum <- function(x) length(getUniques(x))# ユニーク配列数を得るための関数を定義
sapply(mergers, getUniNum)                    # サンプルごとのユニーク配列数
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##        236        282        299        249        182        206        168 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##        171        371        273         72        136

W3.3 サンプル全体の結果

 さきほど得たユニーク配列の数は、サンプルごとに得たものです。それゆえ、計12サンプル全体でみると、まだ重複が含まれます。ここでは、サンプルごとではなく、サンプル全体でのユニーク配列数の情報を得ることを目的とします。

W3.3.1 getSequences関数

 getSequences関数は、入力オブジェクトから、(塩基)配列をベクトルとして抽出した結果を返します。W3.2.1で概要を確認しましたが、W3.1で得たmergersオブジェクトには、計12サンプルのペア―ドエンドのマージ後のユニーク配列だけでなく、その出現頻度など様々な情報が格納されています。それゆえ、まずはmergersオブジェクト内の塩基配列情報のみをgetSequences関数を用いて抽出し、その結果をhogeオブジェクトに格納します。

hoge <- sapply(mergers, getSequences)     # mergers中のサンプルごとの塩基配列をhogeに格納

W3.3.2 class関数

 得られたhogeオブジェクトは、サンプルごとに切り分けられたリスト形式のオブジェクトであることが、それを確認するためのclass関数実行結果からわかります。つまり、表示結果が”list”になっていれば、それはリスト形式のオブジェクトだということです。

class(hoge)                               # hogeオブジェクトのクラスを確認
## [1] "list"

W3.3.3 unlistis.vector関数

 W1.6.5でも使いましたが、リスト形式をベクトル形式に変換したい場合には、unlist関数を利用します。得られたhoge2オブジェクトがベクトルか否かをTRUE or FALSEで返すis.vector関数実行結果からも、確かにベクトル形式に変換できていることがわかります。

hoge2 <- unlist(hoge)                     # リスト形式をベクトル形式に変換
is.vector(hoge2)                          # ベクトルか否かを表示
## [1] TRUE

W3.3.4 sapplyと自作関数

 hoge2ベクトルの要素数は、W3.2.3で得たサンプルごとのユニーク配列数の総和と一致するはずです。ここでは確かにそうであることを確認しているだけです。

length(hoge2)                             # hoge2ベクトルの要素数を確認
## [1] 2645
sum(sapply(mergers, getUniNum))           # mergers中のサンプルごとのユニーク配列数の総和(つまり総リード数)を確認
## [1] 2645

W3.3.5 ユニーク配列の和集合

 サンプル全体のユニーク配列数は、以下のようにunique関数を実行した上で、length関数を実行すればよいです。この1085という数字は、ユニーク配列の和集合(union)ともいえます。

length(unique(hoge2))                     # hoge2ベクトル中のユニークな要素数を確認
## [1] 1085

 上記のやり方以外に、table関数を用いてユニーク配列ごとの出現頻度を調べると、table関数実行結果の要素数が「サンプル全体のユニーク配列数」に相当することを利用することもできます。

length(table(hoge2))                      # hoge2ベクトル中のユニークな要素数を確認
## [1] 1085

W3.3.6 ユニーク配列の積集合

 ほぼ余談ですが、ユニーク配列の和集合(union)が分かると、計12サンプル全てに存在するユニーク配列の数(積集合;intersection)も知りたくなると思います。ここではユニーク配列ごとの出現頻度を調べるtable関数実行結果から、出現頻度が12回(サンプル数の合計が12個だからです)のもののみを抽出するやり方で示します。実行結果は26個です。

sum(table(hoge2) == 12)                   # hoge2ベクトル中の出現頻度が12回のユニーク配列数を確認
## [1] 26

W3.3.7 スクリプトを一まとめ

 ユニーク配列の和集合(1085個)と積集合(26個)を得るためのスクリプトをひとまとめにしたのが以下になります。この一連の流れを理解しておくと、関数が無数に入れ子になっていても、ステップバイステップで理解していけばいいのだと安心できると思います。(本当は最終行の12という数値も汎用性の高いものにするとよいのですが、ここでは見た目の分かりやすいさを優先しています。)

hoge <- sapply(mergers, getSequences)     # mergers中のサンプルごとの塩基配列をhogeに格納
hoge2 <- unlist(hoge)                     # hogeをベクトル形式に変換してhoge2に格納
length(unique(hoge2))                     # hoge2ベクトル中のユニークな要素数(ユニーク配列の和集合)を確認
## [1] 1085
sum(table(hoge2) == 12)                   # hoge2ベクトル中の出現頻度が12回のユニーク配列数(ユニーク配列の積集合)を確認
## [1] 26

W3.4 makeSequenceTable関数

 makeSequenceTable関数は、mergePairs関数実行結果を入力として、解析サンプル中のユニーク配列の和集合を得るとともに、どのサンプルにどのユニーク配列がいくつ存在するかという行列を結果として返します。行数はサンプル数、列数はサンプル全体でのユニーク配列の数になります。

W3.4.1 まずは実行

 先ほど得たmergePairs関数実行結果であるmergersオブジェクトを入力として実行し、結果をseqtabオブジェクトに格納するところまで行います。

seqtab <- makeSequenceTable(mergers)      # mergers中のユニーク配列の和集合情報を取得し、サンプルごとのユニーク配列の出現頻度をseqtabに格納

W3.4.2 結果の概要を確認

 結果は行列ですので、まずはdim関数で行数と列数を表示させます。行数は12、列数は1085であることがわかります。このことから、今回解析する計12サンプル全体としては、1085個のユニークな配列が存在するのだと解釈します。W3.3.5と同じ結果が得られていることがわかります。

dim(seqtab)                               # seqtabの行数と列数を確認
## [1]   12 1085

W3.4.3 rowSumssum関数

 rowSums関数は、数値行列を入力として、行(row)ごとの和(sum)を返します。得られる結果はW3.2.3と同じです。同じノリで行列全体の総和をsum関数で計算すると、サンプル全体の総リード数が得られます。得られる結果(2927994個)は表2bのマージ後のリード数の総和と一致します。

rowSums(seqtab)                           # seqtabの行ごと(サンプルごと)の和を確認
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##     268804     253588     341395     306377     194243     245046     226534 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##     215157     276081     241843     114574     244352
sum(seqtab)                               # seqtab中の総配列数を確認
## [1] 2927994

W3.4.4 getSequences関数

 getSequences関数は、入力オブジェクトから、(塩基)配列をベクトルとして抽出した結果を返します(W3.3.1)。1085個のユニークな塩基配列を得たい場合は、seqtabオブジェクトを入力としてgetSequences関数を実行します。直後のlength(hoge)実行結果から、確かにhogeの中身はr ncol(seqtab)`個の要素からなるベクトルだということがわかります。

hoge <- getSequences(seqtab)              # seqtab中の塩基配列をhogeに格納
length(hoge)                              # hoge中の要素数を確認
## [1] 1085

W3.4.5 nchar関数

 nchar関数は、文字列ベクトルを入力として、要素ごとの文字数を返します(W3.2.2)。したがって、この場合のhoge2オブジェクトの要素数は、入力である文字列ベクトルの要素数と同じ(1085)になります。head関数で最初の6つ分の中身を眺めると、図3で得た213 bpというコンティグ長と酷似した結果ばかり表示されていることがわかります。

hoge2 <- nchar(hoge)                      # hoge中の要素ごとの文字数をhoge2に格納
length(hoge2)                             # hoge2中の要素数を確認
## [1] 1085
head(hoge2)                               # hoge2中の最初の6つを確認
## [1] 213 213 213 213 213 213

W3.4.6 table関数

 実質的に先ほどまでの結果にtable関数を実行しているだけです。table関数は、入力ベクトル中の要素の種類ごとの出現頻度を返します。したがって、この結果は、1085個のユニークな塩基配列の長さ分布情報を得ていることと同義です。

hoge <- getSequences(seqtab)              # seqtab中の塩基配列をhogeに格納
hoge2 <- nchar(hoge)                      # hoge中の要素ごとの文字数をhoge2に格納
table(hoge2)                              # hoge2ベクトル中の要素の種類ごとに出現頻度をカウント
## hoge2
## 205 212 213 214 215 217 227 231 
##   6  44 987  42   2   2   1   1

W3.4.7 一気に書く

 一気に書くとこんな感じです。

table(nchar(getSequences(seqtab)))        # seqtab中の塩基配列ごとの文字数をカウントし、その文字数の種類ごとの出現頻度を表示
## 
## 205 212 213 214 215 217 227 231 
##   6  44 987  42   2   2   1   1

 W3.3.7に似せて、以下のような書き方でも構いません。

hoge <- sapply(mergers, getSequences)     # mergers中のサンプルごとの塩基配列をhogeに格納
hoge2 <- unlist(hoge)                     # hogeをベクトル形式に変換してhoge2に格納
hoge3 <- nchar(unique(hoge2))             # hoge2中のユニークな要素ごとの文字数をhoge3に格納
table(hoge3)                              # hoge3ベクトル中の要素の種類ごとの出現頻度を確認
## hoge3
## 205 212 213 214 215 217 227 231 
##   6  44 987  42   2   2   1   1

W3.5 removeBimeraDenovo関数

 dada2パッケージのメインであるdada関数は、エラー補正のみを行いキメラ配列の除去は行ってくれません。つまり、まだキメラ配列を含んでいます。removeBimeraDenovo関数は、makeSequenceTable関数の実行結果であるseqtabオブジェクトを入力として実行し、PCRキメラを除去した結果を返します。

W3.5.1 まずは実行

 さきほど得たmakeSequenceTable関数の実行結果であるseqtabオブジェクトを入力として、PCRキメラを除去した結果をseqtab.nochimオブジェクトに格納するところまで行います。

seqtab.nochim <- removeBimeraDenovo(seqtab,              # seqtab中のキメラ配列除去した結果をseqtab.nochimに格納
                                    method = "consensus",# seqtab中のキメラ配列除去した結果をseqtab.nochimに格納
                                    multithread = TRUE,  # seqtab中のキメラ配列除去した結果をseqtab.nochimに格納
                                    verbose = TRUE)      # seqtab中のキメラ配列除去した結果をseqtab.nochimに格納

W3.5.2 結果の概要を確認

 結果は行列ですので、まずはdim関数で行数と列数を表示させます。行数は12、列数は580であることがわかります。このことから、今回解析する計12サンプル全体としては、580個のユニークな配列が存在するのだと解釈します。

dim(seqtab.nochim)                        # seqtab.nochimの行数と列数を確認
## [1]  12 580

W3.5.3 rowSumssum関数

 rowSums関数は、数値行列を入力として、行(row)ごとの和(sum)を返します。得られる結果はサンプルごとのリード数になります。これが同じノリで行列全体の総和をsum関数で計算すると、サンプル全体の総リード数が得られます。表2bのペア―ドエンドのマージ後のリード数からほとんど減っていないこともよくわかります。

rowSums(seqtab.nochim)                    # seqtab.nochimの行ごとの総和(除去後のサンプルごとのリード数)を表示
## SRR6325813 SRR6325815 SRR6325816 SRR6325817 SRR6325828 SRR6325829 SRR6325830 
##     258952     242714     336540     302984     191864     241745     223312 
## SRR6325831 SRR6325859 SRR6325860 SRR6325861 SRR6325862 
##     209875     253659     227111     114053     241966
sum(seqtab.nochim)                        # seqtab.nochim中の全要素の総和(除去後の総リード数)を表示  
## [1] 2844775
sum(seqtab)                               # seqtab中の全要素の総和(除去前の総リード数)を表示
## [1] 2927994
sum(seqtab.nochim)/sum(seqtab)            # 除去後の総リード数/除去前の総リード数の割合
## [1] 0.9715782

W3.5.4 配列長分布と出現頻度

 得られた計580個の配列長分布と出現頻度情報を得ます。これはW3.4.7と同じ書き方です。キメラ配列除去前と酷似した傾向であることがわかります。

table(nchar(getSequences(seqtab.nochim))) # seqtab.nochim中の塩基配列ごとの文字数をカウントし、その文字数の種類ごとの出現頻度を表示
## 
## 205 212 213 214 215 217 227 231 
##   6  34 495  39   2   2   1   1

W3.6 図4のスクリプト

 コンパクトにまとめるとこんな感じで書けます。

mergers <- mergePairs(dadaF = dadaFs, derepF = filtFs,# ペア―ドエンドのマージを実行し、結果をmergersに格納
                      dadaR = dadaRs, derepR = filtRs)# ペア―ドエンドのマージを実行し、結果をmergersに格納

seqtab <- makeSequenceTable(mergers)      # mergers中のユニーク配列の和集合情報を取得し、サンプルごとのユニーク配列の出現頻度をseqtabに格納
dim(seqtab)                               # seqtabの行数と列数を確認
sum(seqtab)                               # seqtab中の総配列数を確認
table(nchar(getSequences(seqtab)))        # seqtab中の塩基配列ごとの文字数をカウントし、その文字数の種類ごとの出現頻度を表示

seqtab.nochim <- removeBimeraDenovo(seqtab, method = "consensus")# seqtab中のキメラ配列除去した結果をseqtab.nochimに格納
dim(seqtab.nochim)                        # seqtab.nochimの行数と列数を確認
sum(seqtab.nochim)                        # seqtab.nochim中の全要素の総和(除去後の総リード数)を表示
table(nchar(getSequences(seqtab.nochim))) # seqtab.nochim中の塩基配列ごとの文字数をカウントし、その文字数の種類ごとの出現頻度を表示

W4 系統割り当て

 最後のステップでは、まず、系統推定のためのデータベースに相当するリファレンス配列セットを取得します。次に、assignTaxonomy関数を用いて属(genus)の推定を行います。最後にaddSpecies関数を用いて種(species)の推定を行います。

W4.1 リファレンス配列取得

 本稿は、DADA2 Pipeline Tutorial (1.16)の流れに沿って説明しています。この中のAssign taxonomyという部分で、既知の16S rRNAのリファレンス配列を取得するためのページとしてhttps://benjjneb.github.io/dada2/training.htmlへのリンクが示されています。リンク先で見られるSilva 138.1 prokaryotic SSU taxonomic training data formatted for DADA2というページから取得可能な以下の2つのファイルを利用します。

W4.2 assignTaxonomy関数

 assignTaxonomy関数は、系統推定したい塩基配列の文字列ベクトルと属レベルまでの情報を含むリファレンス配列ファイルを入力として、系統推定結果を返します。

W4.2.1 まずは実行

 属レベルの系統推定を行います。入力のクエリ(問い合わせ配列)側は、W3.5.1でキメラ配列除去まで終わった後のseqtab.nochimオブジェクトです。入力のデータベース側は、“./silva_nr99_v138.1_train_set.fa.gz”のようにして与えています。これは、作業ディレクトリ(デスクトップのdatasetフォルダ)直下にある、silva_nr99_v138.1_train_set.fa.gzというファイルだという意味です。ダウンロードしたファイルを2行目のように指定してもよいですが、(1番左側に#を入れてコメントアウトしているので機能はしませんが…)1行目で示すように、オリジナルのURLを直接指定することもできます。

#fastafile1 <- "https://zenodo.org/records/4587955/files/silva_nr99_v138.1_train_set.fa.gz"
fastafile1 <- "./silva_nr99_v138.1_train_set.fa.gz" # リファレンス配列のパス情報をfastafile1に格納
taxa <- assignTaxonomy(seqs = seqtab.nochim, # seqtab.nochimをクエリ配列、fastafile1をリファレンス配列として系統割り当てを実行し、結果をtaxaに格納
                       refFasta = fastafile1)# seqtab.nochimをクエリ配列、fastafile1をリファレンス配列として系統割り当てを実行し、結果をtaxaに格納

W4.2.2 結果の概要を確認

 結果は行列ですので、まずはdim関数で行数と列数を表示させます。行数は580、列数は6であることがわかります。次は、colnames関数でtaxa行列の列名を表示させています。この結果を眺めて、生物の階級を「界(Kingdom)・門(Phylum)・綱(Class)・目(Order)・科(Family)・属(Genus)・種(Species)」と表すと、属までに6つの階級が存在するからこのようになっているのだと納得できます。

dim(taxa)                                 # taxaの行数と列数を表示
## [1] 580   6
colnames(taxa)                            # taxaの列名を表示
## [1] "Kingdom" "Phylum"  "Class"   "Order"   "Family"  "Genus"

W4.3 addSpecies関数

 addSpecies関数は、さきほどの属レベルの系統推定結果であるtaxaオブジェクト、および種レベルの系統推定用のリファレンス配列ファイル(silva_species_assignment_v138.1.fa.gz)を入力として与えて、種レベルの系統推定結果情報を足したものを返します。

W4.3.1 まずは実行

 以下のような感じで実行します。W4.2.1と同様、(1番左側に#を入れてコメントアウトしているので機能はしませんが…)1行目で示すように、オリジナルのURLを直接指定することもできます。

# fastafile2 <- "https://zenodo.org/records/4587955/files/silva_species_assignment_v138.1.fa.gz"
fastafile2 <- "./silva_species_assignment_v138.1.fa.gz" # リファレンス配列のパス情報をfastafile12に格納
taxa2 <- addSpecies(taxtab = taxa,        # taxaをクエリ配列、fastafile2をリファレンス配列として系統割り当てを実行し、結果をtaxa2に格納
                    refFasta = fastafile2)# taxaをクエリ配列、fastafile2をリファレンス配列として系統割り当てを実行し、結果をtaxa2に格納

W4.3.2 結果の概要を確認

 結果は行列ですので、まずはdim関数で行数と列数を表示させます。行数は580、列数は7であることがわかります。次は、colnames関数でtaxa2行列の列名を表示させています。生物の階級である「界(Kingdom)・門(Phylum)・綱(Class)・目(Order)・科(Family)・属(Genus)・種(Species)」の種の結果が足されていることが分かります。

dim(taxa2)                                # taxa2の行数と列数を表示
## [1] 580   7
colnames(taxa2)                           # taxa2の列名を表示
## [1] "Kingdom" "Phylum"  "Class"   "Order"   "Family"  "Genus"   "Species"

W4.4 ファイル出力

 ここでは、W3.5.1で得たseqtab.nochimオブジェクトとW4.3.1で得たtaxa2オブジェクトの内容をうまく連結して、タブ区切りテキストファイルとして保存する作業を行います。

W4.4.1 行列の転置

 seqtab.nochimの行数と列数はそれぞれ12と580です。その一方で連結対象であるtaxa2の行数と列数は、それぞれ580と7です。従って、うまく連結すべく、seqtab.nochim行列のほうをt関数を用いて転置して、同一行が同一のASVの情報になるようにできるかどうか確認しています。

dim(seqtab.nochim)                        # seqtab.nochimの行数と列数を表示
## [1]  12 580
dim(taxa2)                                # taxa2の行数と列数を表示
## [1] 580   7
dim(t(seqtab.nochim))                     # seqtab.nochim行列を転置して、行数と列数を表示
## [1] 580  12

W4.4.2 ASV配列情報の取得

 ここでは、最終的にt(seqtab.nochim)taxa2を列方向で連結させるのですが、ちょっと小細工をしてASVの塩基配列情報のみを文字列ベクトルとして得た結果をASVというオブジェクトとして得ようとしています。ここでは、taxa2オブジェクトの行名情報をASVに格納するほうを有効化していますが、#でコメントアウトしているseqtab.nochimオブジェクトの列名情報をASVに格納するのでも構いません。そのあとは、ASVベクトルの要素数をlength関数で確認したり、最初の3つの要素(つまりASVの塩基配列情報)を表示して確認しているだけです。

#ASV <- colnames(seqtab.nochim)           # seqtab.nochimの列名をASVに格納(するのでもよい)
ASV <- rownames(taxa2)                    # taxa2の行名をASVに格納
length(ASV)                               # ASVの要素数を確認
## [1] 580
head(ASV, n = 3)                          # ASV中の最初の6つを表示
## [1] "ATCGGAATTACTGGGCGTAAAGCGGGCGCAGACGGTTACTTAAGCAGGATGTGAAATCCCCGGGCTCAACCCGGGAACTGCGTTCTGAACTGGGTGACTCGAGTGTGTCAGAGGGAGGTAGAATTCCACGTGTAGCAGTGAAATGCGTAGAGATGTGGAGGAATACCGATGGCGAAGGCAGCCTCCTGGGACAACACTGACGTTCATGCCCGA"
## [2] "TCCGGATTTATTGGGCGTAAAGCGAGCGCAGGCGGTTTCTTAAGTCTGATGTGAAAGCCCCCGGCTCAACCGGGGAGGGTCATTGGAAACTGGGAGACTTGAGTGCAGAAGAGGAGAGTGGAATTCCATGTGTAGCGGTGAAATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGGCTCTCTGGTCTGTAACTGACGCTGAGGCTCGA"
## [3] "ATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTGGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAGGTGCGA"

W4.4.3 cbindwrite.table関数

 cbind関数を用いてファイル出力させたい情報を列方向で連結し、それをwrite.table関数でファイルに保存しています。図5は、得られたファイルをExcelで開いてスクリーンショットをとったものになります。念のため、ここでもタブ区切りテキストファイル版(output_JSLAB24.txt)とxlsx版(output_JSLAB24.xlsx)をダウンロードできるようにしておきます。

tmp <- cbind(ASV, t(seqtab.nochim), taxa2)# ASV、seqtab.nochim行列の転置、taxa2を列方向で連結してtmpに格納
dim(tmp)                                  # tmpの行数を列数を表示
## [1] 580  20
write.table(x = tmp, file = "output_JSLAB24.txt", sep = "\t", row.names = F)# tmpの中身を指定したファイル名でタブ区切りテキストファイルとして、行名をつけずに保存

W4.4.4 identical関数

 さきほどのcbindの部分でt(seqtab.nochim)taxa2が本当に同一のASV配列になっているか不安な方は、seqtab.nochim行列の列名情報であるcolnames(seqtab.nochim)taxa2の行名情報が順番も含めて同一であるかを以下のコマンドで確認しておくとよいです。identical関数は、TRUEなら同じ、FALSEなら違っていると解釈します。先ほどのW4.4.3でいきなりcbind関数で列同士を連結している印象をもったかもしれませんが、実際には行名部分の一部が同じであることを目視確認したり、以下で示すようにidentical関数などを用いてTRUEという結果を得てからにしたり、あるいはもっと高度な方法で連結させます。

identical(colnames(seqtab.nochim), rownames(taxa2))# seqtab.nochimの列名とtaxa2の行名の2つのベクトルが同一かどうかを確認
## [1] TRUE

 いきなり上記のやつだと挙動がよくわからないかもしれませんので、念のため以下に簡単な例を示しておきます。hoge2hoge3の比較時のみFALSEになっていることがわかります。

hoge1 <- c("G", "H", "U")                 # 3つの要素からなる文字列ベクトルを作成してhoge1に格納
hoge2 <- c("G", "H", "U", "K")            # 4つの要素からなる文字列ベクトルを作成してhoge2に格納
hoge3 <- c("G", "H", "U", "K")            # 4つの要素からなる文字列ベクトルを作成してhoge3に格納
hoge4 <- c("H", "U", "G")                 # 3つの要素からなる文字列ベクトルを作成してhoge4に格納
identical(hoge1, hoge2)                   # hoge1とhoge2の2つのベクトルが同一かどうかを確認
## [1] FALSE
identical(hoge1, hoge3)                   # hoge1とhoge3の2つのベクトルが同一かどうかを確認
## [1] FALSE
identical(hoge1, hoge4)                   # hoge1とhoge4の2つのベクトルが同一かどうかを確認
## [1] FALSE
identical(hoge2, hoge3)                   # hoge2とhoge3の2つのベクトルが同一かどうかを確認
## [1] TRUE
identical(hoge2, hoge4)                   # hoge2とhoge4の2つのベクトルが同一かどうかを確認
## [1] FALSE
identical(hoge3, hoge4)                   # hoge3とhoge4の2つのベクトルが同一かどうかを確認
## [1] FALSE

おわりに

W5.1 参考にしたページ

W5.2 解析環境の確認

 packageVersion関数は、個別のインストール済みパッケージのバージョン情報を知りたい場合に利用します。今回動作確認したdada2のバージョンは1.30.0だということがわかります。

packageVersion("dada2")                   # dada2のバージョンを表示
## [1] '1.30.0'

 もっと広い意味での解析環境情報を知りたい場合は、sessionInfo()の出力結果に基づいて記載します。このPCの場合は、R本体のバージョンが4.3.2であることや、OSがWindows 11であることなどがわかります。

sessionInfo()                             # 解析環境を表示
## R version 4.3.2 (2023-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 11 x64 (build 22631)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=Japanese_Japan.utf8  LC_CTYPE=Japanese_Japan.utf8   
## [3] LC_MONETARY=Japanese_Japan.utf8 LC_NUMERIC=C                   
## [5] LC_TIME=Japanese_Japan.utf8    
## 
## time zone: Asia/Tokyo
## tzcode source: internal
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
## [1] Biostrings_2.70.1   GenomeInfoDb_1.38.5 XVector_0.42.0     
## [4] IRanges_2.36.0      S4Vectors_0.40.2    BiocGenerics_0.48.1
## [7] dada2_1.30.0        Rcpp_1.0.12        
## 
## loaded via a namespace (and not attached):
##  [1] SummarizedExperiment_1.32.0 gtable_0.3.4               
##  [3] hwriter_1.3.2.1             xfun_0.41                  
##  [5] bslib_0.6.1                 ggplot2_3.4.4              
##  [7] latticeExtra_0.6-30         Biobase_2.62.0             
##  [9] lattice_0.21-9              vctrs_0.6.5                
## [11] tools_4.3.2                 bitops_1.0-7               
## [13] generics_0.1.3              parallel_4.3.2             
## [15] tibble_3.2.1                klippy_0.0.0.9500          
## [17] fansi_1.0.6                 highr_0.10                 
## [19] pkgconfig_2.0.3             Matrix_1.6-1.1             
## [21] RColorBrewer_1.1-3          RcppParallel_5.1.8         
## [23] assertthat_0.2.1            lifecycle_1.0.4            
## [25] GenomeInfoDbData_1.2.11     farver_2.1.1               
## [27] stringr_1.5.1               deldir_2.0-4               
## [29] compiler_4.3.2              Rsamtools_2.18.0           
## [31] munsell_0.5.0               codetools_0.2-19           
## [33] snow_0.4-4                  htmltools_0.5.7            
## [35] sass_0.4.8                  RCurl_1.98-1.14            
## [37] yaml_2.3.8                  pillar_1.9.0               
## [39] crayon_1.5.2                jquerylib_0.1.4            
## [41] BiocParallel_1.36.0         cachem_1.0.8               
## [43] DelayedArray_0.28.0         ShortRead_1.60.0           
## [45] abind_1.4-5                 tidyselect_1.2.0           
## [47] digest_0.6.34               stringi_1.8.3              
## [49] reshape2_1.4.4              dplyr_1.1.4                
## [51] labeling_0.4.3              fastmap_1.1.1              
## [53] grid_4.3.2                  colorspace_2.1-0           
## [55] cli_3.6.2                   SparseArray_1.2.3          
## [57] magrittr_2.0.3              S4Arrays_1.2.0             
## [59] utf8_1.2.4                  withr_3.0.0                
## [61] scales_1.3.0                rmarkdown_2.25             
## [63] jpeg_0.1-10                 matrixStats_1.2.0          
## [65] interp_1.1-6                png_0.1-8                  
## [67] evaluate_0.23               knitr_1.45                 
## [69] GenomicRanges_1.54.1        rlang_1.1.3                
## [71] glue_1.7.0                  jsonlite_1.8.8             
## [73] plyr_1.8.9                  R6_2.5.1                   
## [75] MatrixGenerics_1.14.0       GenomicAlignments_1.38.2   
## [77] zlibbioc_1.48.0
LS0tDQp0aXRsZTogIlvnrKwyNOWbnl0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9yX3NlcTIuaHRtbCNib29rX0pTTEFCXzI0KeOBruOCpuOCp+ODluizh+aWmSINCmRhdGU6ICfmnIDntYLmm7TmlrA6IGByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkvJW0vJWQiKWAnDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KYGBge3Iga2xpcHB5LCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQprbGlwcHk6OmtsaXBweSgpDQpgYGANCg0KIyDjga/jgZjjgoHjgasNCiAgLSBb5Lmz6YW46I+MTkdT6YCj6LyJ56ysMjLlm57jga5QREZdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvSlNMQUJfMjJfa2Fkb3RhLnBkZikNCiAgLSBbZGFkYTJdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9kYWRhMi5odG1sKe+8mltDYWxsYWhhbiBldCBhbC4sIE5hdCBNZXRob2RzLCAyMDE2XShodHRwczovL3B1Ym1lZC5uY2JpLm5sbS5uaWguZ292LzI3MjE0MDQ3LykgICANCi0gW1NSUDEyNTcyM10oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JQMTI1NzIzKSAoW0hhbGxtYWllci1XYWNrZXIgZXQgYWwuLCBTY2kgUmVwLiwgMjAxOF0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yOTY3NDY0MS8pKSAgDQrku4rlm57nlKjjgYTjgovjg6rjg7zjg4njg4fjg7zjgr/jgafjgZnjgILjgqrjg6rjgrjjg4rjg6vjga/oqIg2NOOCteODs+ODl+ODq+WIhuOBruODh+ODvOOCv+OCkuWPluW+l+OBl+OBpuOBhOOBvuOBmeOBjOOAgeS7peS4i+OBrjEy44K144Oz44OX44Or5YiG44Gu44OH44O844K/44Gu44G/6Kej5p6Q44GX44G+44GZ44CCICANCg0KfCDjgrXjg7Pjg5fjg6tJRCB8IEROQeaKveWHuuOCreODg+ODiCB8IOS/neWtmOODkOODg+ODleOCoSB8IOODquODvOODieaVsCB8DQp8Oi0tLTp8Oi0tLTp8Oi0tLTp8Oi0tLTp8DQp8IFtTUlI2MzI1ODEzXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODEzKSB8IFFNSU5JIHwgTmF0aXZlIHwgMjgyNTE3IHwNCnwgW1NSUjYzMjU4MTVdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MTUpIHwgUU1JTkkgfCBMeXNpc0J1ZmZlciB8IDI2NjI1OSB8DQp8IFtTUlI2MzI1ODE2XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODE2KSB8IFFNSU5JIHwgUk5BLWxhdGVyIHwgMzU5OTg0IHwNCnwgW1NSUjYzMjU4MTddKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MTcpIHwgUU1JTkkgfCBQQlMgfCAzMjU2NjAgfA0KfCBbU1JSNjMyNTgyOF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTgyOCkgfCBNT0JJTyB8IFJOQS1sYXRlciB8IDIwNjkzOSB8DQp8IFtTUlI2MzI1ODI5XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODI5KSB8IE1PQklPIHwgUEJTIHwgMjYxNzY3IHwNCnwgW1NSUjYzMjU4MzBdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MzApIHwgTU9CSU8gfCBOYXRpdmUgfCAyMzg2MjcgfA0KfCBbU1JSNjMyNTgzMV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTgzMSkgfCBNT0JJTyB8IEx5c2lzQnVmZmVyIHwgMjI1NTQ4IHwNCnwgW1NSUjYzMjU4NTldKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4NTkpIHwgR0VOSUFMIHwgTHlzaXNCdWZmZXIgfCAyOTAzODMgfA0KfCBbU1JSNjMyNTg2MF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MCkgfCBHRU5JQUwgfCBOYXRpdmUgfCAyNTM5MDggfA0KfCBbU1JSNjMyNTg2MV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MSkgfCBHRU5JQUwgfCBQQlMgfCAxMjA3ODkgfA0KfCBbU1JSNjMyNTg2Ml0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MikgfCBHRU5JQUwgfCBSTkEtbGF0ZXIgfCAyNTg3OTIgfA0KDQojIFcxIOOCr+OCquODquODhuOCo+OCs+ODs+ODiOODreODvOODqw0KIyMgVzEuMSDkuovliY3mupblgpkNCuOAgOesrDIz5Zue44GuVzYuMuOBqOWfuuacrOeahOOBq+WQjOOBmOOCueOCr+ODquODl+ODiOOBp+OBmeOAgmBmbkZzYOOBqGBmblJzYOOBjFFD5YmN44Gu44OV44Kh44Kk44Or44Gu55u45a++44OR44K55oOF5aCx44CBYGZpbHRGc2DjgahgZmlsdFJzYOOBjFFD5b6M44Gu44OV44Kh44Kk44Or44Gu55u45a++44OR44K55oOF5aCx44Gr44Gq44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1UUlVFfQ0KYmFzaG8gPC0gIi4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyDnm7jlr77jg5Hjgrnjgarjga7jgafjgIHnj77lnKjjga7kvZzmpa3jg4fjgqPjg6zjgq/jg4jjg6rjgpIiLiLjgafooajnj74NCiMgRm9yd2FyZOWBtA0KZm5GcyA8LSBsaXN0LmZpbGVzKHBhdHRlcm4gPSAiXzEuZmFzdHEiLCBwYXRoID0gYmFzaG8sIGZ1bGwubmFtZXMgPSBUUlVFKQ0KaG9nZSA8LSBzdHJzcGxpdCh4ID0gYmFzZW5hbWUoZm5GcyksIHNwbGl0ID0gIl8iKSMgYmFzZW5hbWUoZm5Gcynjga7mloflrZfliJfjgpIiXyLjgafliIblibINCnNhbXBsZUlEIDwtIHNhcHBseShYID0gaG9nZSwgRlVOID0gYFtgLCAxKSMgaG9nZeOBrjHnlarnm67jga7opoHntKDjga7jgb/jgpLmir3lh7oNCmZpbHRGcyA8LSBmaWxlLnBhdGgoYmFzaG8sICJwcm9jZXNzZWQiLCBwYXN0ZTAoc2FtcGxlSUQsICJfRl9maWx0LmZhc3RxIikpIyDjg5XjgqHjgqTjg6vjg5Hjgrnmg4XloLHjgpLkvZzmiJANCm5hbWVzKGZpbHRGcykgPC0gc2FtcGxlSUQgICAgICAgICAgICAgICAgICMgc2FtcGxlSUTjgpJmaWx0RnPjg5njgq/jg4jjg6vjga7opoHntKDlkI3jgavjgZnjgosNCiMgUmV2ZXJzZeWBtA0KZm5ScyA8LSBsaXN0LmZpbGVzKHBhdHRlcm4gPSAiXzIuZmFzdHEiLCBwYXRoID0gYmFzaG8sIGZ1bGwubmFtZXMgPSBUUlVFKQ0KaG9nZSA8LSBzdHJzcGxpdCh4ID0gYmFzZW5hbWUoZm5ScyksIHNwbGl0ID0gIl8iKSMgYmFzZW5hbWUoZm5Scynjga7mloflrZfliJfjgpIiXyLjgafliIblibINCnNhbXBsZUlEIDwtIHNhcHBseShYID0gaG9nZSwgRlVOID0gYFtgLCAxKSMgaG9nZeOBrjHnlarnm67jga7opoHntKDjga7jgb/jgpLmir3lh7oNCmZpbHRScyA8LSBmaWxlLnBhdGgoYmFzaG8sICJwcm9jZXNzZWQiLCBwYXN0ZTAoc2FtcGxlSUQsICJfUl9maWx0LmZhc3RxIikpIyDjg5XjgqHjgqTjg6vjg5Hjgrnmg4XloLHjgpLkvZzmiJANCm5hbWVzKGZpbHRScykgPC0gc2FtcGxlSUQgICAgICAgICAgICAgICAgICMgc2FtcGxlSUTjgpJmaWx0UnPjg5njgq/jg4jjg6vjga7opoHntKDlkI3jgavjgZnjgosNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoZGFkYTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGFkYTLjg5Hjg4PjgrHjg7zjgrjjga7jg63jg7zjg4kNCmxpYnJhcnkoQmlvc3RyaW5ncykgICAgICAgICAgICAgICAgICAgICAgICMgQmlvc3RyaW5nc+ODkeODg+OCseODvOOCuOOBruODreODvOODiQ0KYGBgDQoNCi0gW+S5s+mFuOiPjE5HU+mAo+i8ieesrDTlm57jga5QREZdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvSlNMQUJfNF9rYWRvdGEucGRmKQ0KICANCiMjIFcxLjIgYHBsb3RRdWFsaXR5UHJvZmlsZWDplqLmlbANCuOAgGBwbG90UXVhbGl0eVByb2ZpbGVg6Zai5pWw44Gv44CBZmFzdHHjg5XjgqHjgqTjg6vjgpLlhaXlipvjgajjgZfjgabjgIHjg6rjg7zjg4nkuK3jga7loanln7rjg53jgrjjgrfjg6fjg7PjgZTjgajjga7jgq/jgqrjg6rjg4bjgqPjgrnjgrPjgqLjga7jg5fjg63jg4Pjg4jjgpLlh7rlipvjgZfjgb7jgZnvvIjntIQxMOWIhu+8ieOAgiAgDQoNCiMjIyBXMS4yLjEgUUPliY3jga5Gb3J3YXJk5YG0DQrjgIDjgb7jgZrjga9gZm5Gc2Djgqrjg5bjgrjjgqfjgq/jg4jjga7kuK3ouqvjgpLooajnpLrjgZXjgZvjgabjgYTjgb7jgZnjgILjgZPjgozjga/jgIFRQ+WJjeOBrkZvcndhcmTlgbTjga5mYXN0ceODleOCoeOCpOODq+OBruebuOWvvuODkeOCueaDheWgseOBq+OBquOCiuOBvuOBmeOAgmBwbG90UXVhbGl0eVByb2ZpbGVg6Zai5pWw44Gu5YWl5Yqb44Go44GX44Gm44CBYGZuRnNg44Kq44OW44K444Kn44Kv44OI44GM44Gd44Gu44G+44G+5Yip55So44GV44KM44Gm44GE44KL44GT44Go44GM44KP44GL44KK44G+44GZ44CC5YWl5Ye65Yqb44Gu6Zai5L+C44GL44KJ44KC5piO44KJ44GL44Gn44GZ44GM44CB5YWl5Yqb44Gv5paH5a2X5YiX44OZ44Kv44OI44Or44Gn44GZ44Gu44Gn44CB44OZ44Kv44OI44Or44Gu6KaB57Sg5pWw44GM44OV44Kh44Kk44Or5pWw44Gr55u45b2T44GX44G+44GZ44CC44GT44KM44GM5ZuzMeOBqOWQjOOBmOOCguOBruOBq+OBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIGZpZy5kaW0gPSBjKDgsIDcpfQ0KZm5GcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmbkZz44Gu5Lit6Lqr44KS56K66KqNDQpwbG90UXVhbGl0eVByb2ZpbGUoZm5GcykgICAgICAgICAgICAgICAgICAjIGZuRnPjga7jgq/jgqrjg6rjg4bjgqPjgrnjgrPjgqLjga7jg5fjg63jg4Pjg4gNCmBgYA0KDQrjgIDlhaXlipvjgYwxMuWAi+OBruODleOCoeOCpOODq+WQjeaDheWgseOBp+OBmeOBruOBp+OAgeWHuuWKm+OBqOOBl+OBpjEy5YCL44Gu44OX44Ot44OD44OI44GM5b6X44KJ44KM44G+44GZ44CC5ZCE44OX44Ot44OD44OI44Gu5qiq6Lu444Gv44Oq44O844OJ5Lit44Gu5aGp5Z+644Gu44Od44K444K344On44Oz77yINSfnq6/jgYzlt6bjgIEzJ+err+OBjOWPs++8ieOAgee4pui7uOOBr+OCr+OCquODquODhuOCo+OCueOCs+OCouOBp+OBmeOAglvpgKPovInnrKw05ZueXShodHRwczovL3d3dy5pdS5hLnUtdG9reW8uYWMuanAva2Fkb3RhL3Jfc2VxMi5odG1sI2Jvb2tfSlNMQUJfNCnjgafjgoLop6PoqqzjgZfjgabjgYTjgb7jgZnjgYzjgIHpq5jjgZHjgozjgbDpq5jjgYTjgbvjganjgojjgYTjgajop6Pph4jjgZfjgb7jgZnjgIINCg0KIyMjIFcxLjIuMiBRQ+WJjeOBrlJldmVyc2XlgbQNCuOAgOasoeOBq+OAgWBmblJzYOOCquODluOCuOOCp+OCr+ODiOOBruS4rei6q+OCkuihqOekuuOBleOBm+OBpuOBhOOBvuOBmeOAguOBk+OCjOOBr+OAgVFD5YmN44GuUmV2ZXJzZeWBtOOBrmZhc3Rx44OV44Kh44Kk44Or44Gu55u45a++44OR44K55oOF5aCx44Gr44Gq44KK44G+44GZ44CCYHBsb3RRdWFsaXR5UHJvZmlsZWDplqLmlbDjga7lhaXlipvjgajjgZfjgabjgIFgZm5Sc2Djgqrjg5bjgrjjgqfjgq/jg4jjgpLjgZ3jga7jgb7jgb7kuI7jgYjjgabjgYTjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBmaWcuZGltID0gYyg4LCA3KX0NCmZuUnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm5Sc+OBruS4rei6q+OCkueiuuiqjQ0KcGxvdFF1YWxpdHlQcm9maWxlKGZuUnMpICAgICAgICAgICAgICAgICAgIyBmblJz44Kv44Kq44Oq44OG44Kj44K544Kz44Ki44Gu44OX44Ot44OD44OIDQpgYGANCg0KIyMgVzEuMyBgZmlsdGVyQW5kVHJpbWDplqLmlbANCuOAgGBmaWx0ZXJBbmRUcmltYOmWouaVsOOBr+OAgeODquODvOODieOBrmZhc3Rx44OV44Kh44Kk44Or44KS5YWl5Yqb44Go44GX44Gm44CB44Kv44Kq44Oq44OG44Kj44Gu5L2O44GE6aCY5Z+f44Gu44OI44Oq44Og44CBTuOCkuWQq+OCgOODquODvOODieOBruODleOCo+ODq+OCv+ODquODs+OCsOOAgeOCteODs+ODl+ODq+S4reOBq+WQq+OBvuOCjOOCi1BoaVjjgajjgYTjgYbjg53jgrjjg4bjgqPjg5bjgrPjg7Pjg4jjg63jg7zjg6vjgrXjg7Pjg5fjg6vnlLHmnaXjg6rjg7zjg4njga7jg5XjgqPjg6vjgr/jg6rjg7PjgrDjgarjganjgpLlrp/ooYzjgZfjgb7jgZnvvIjntIQ15YiG77yJ44CC5Li744Gq5Ye65Yqb57WQ5p6c44Gn44GC44KLUUPlvozjga7jg6rjg7zjg4njg5XjgqHjgqTjg6vjga9gZmlsdEZzYOOBqGBmaWx0UnNg44Gn44GZ44GM44CBUUPliY3lvozjga7jg6rjg7zjg4nmlbDjga7mg4XloLHjga/jgIFgb3V0YOOCquODluOCuOOCp+OCr+ODiOOBq+S/neWtmOOBleOCjOOBvuOBmeOAguOBquOBiuOAgeWun+ihjOS4reOBq+OAjE11bHRpdGhyZWFkaW5nIGhhcyBiZWVuIERJU0FCTEVELCBhcyBmb3JraW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gLlBsYXRmb3JtJE9TLnR5cGUgJ3dpbmRvd3Mn44CN44Gu44KI44GG44Gq44Oh44OD44K744O844K444GM5Ye644Gm44KC44CB5Lim5YiX6KiI566X44GM44Gn44GN44Gq44GE44Gg44GR44Gn6KiI566X6Ieq5L2T44Gv5YuV44GE44Gm44GE44KL44Gu44Gn5ZWP6aGM44GC44KK44G+44Gb44KT44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCm91dCA8LSBmaWx0ZXJBbmRUcmltKCAgICAgICAgICAgICAgICAgICAgICMgZmlsdGVyYW5kVHJpbemWouaVsOOCkuWun+ihjOOBl+OAgee1kOaenOOCkm91dOOCquODluOCuOOCp+OCr+ODiOOBq+agvOe0jQ0KICBmd2QgPSBmbkZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBRQ+WJjeOBrkZvcndhcmQoRinlgbTjga7jg5XjgqHjgqTjg6vlkI0NCiAgZmlsdCA9IGZpbHRGcywgICAgICAgICAgICAgICAgICAgICAgICAgICMgUUPlvozjga5Gb3J3YXJkKEYp5YG044Gu44OV44Kh44Kk44Or5ZCNDQogIHJldiA9IGZuUnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFFD5YmN44GuUmV2ZXJzZShSKeWBtOOBruODleOCoeOCpOODq+WQjQ0KICBmaWx0LnJldiA9ZmlsdFJzLCAgICAgICAgICAgICAgICAgICAgICAgIyBRQ+W+jOOBrlJldmVyc2UoUinlgbTjga7jg5XjgqHjgqTjg6vlkI0NCiAgbWF4TiA9IGMoMCwgMCksICAgICAgICAgICAgICAgICAgICAgICAgICMg44Oq44O844OJ44Gr5ZCr44G+44KM44KLTuOBruioseWuueaVsOOBr0blgbRS5YG044Go44KC44GrMA0KICBtYXhFRSA9IGMoMiwgNSksICAgICAgICAgICAgICAgICAgICAgICAgIyDjg6rjg7zjg4nkuK3jga7jgqjjg6njg7znjofjga7lkozjga7plr7lgKTjga9G5YG044GMMuOAgVLlgbTjgYw1DQogIHRydW5jTGVuID0gYygyMjUsIDE2MCksICAgICAgICAgICAgICAgICAjIEblgbTjga8yMjXjgIFS5YG044GvMTYwIGJw44Gr44Gq44KL44G+44Gn5Y+z5YG044KS44OI44Oq44OgDQogIHRyaW1MZWZ0ID0gMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAjIOODquODvOODieOBruW3puWBtOOCkjIwIGJw44OI44Oq44OgDQogIHJtLnBoaXggPSBUUlVFLCAgICAgICAgICAgICAgICAgICAgICAgICAjIFBoaVjphY3liJfnlLHmnaXjga7jg6rjg7zjg4njgpLpmaTljrsNCiAgY29tcHJlc3MgPSBGQUxTRSwgICAgICAgICAgICAgICAgICAgICAgICMg57WQ5p6c44KS5Zyn57iu44OV44Kh44Kk44Or44Gr44GX44Gq44GEDQogIG11bHRpdGhyZWFkID0gVFJVRSAgICAgICAgICAgICAgICAgICAgICAjIOODnuODq+ODgeOCueODrOODg+ODieOBp+ioiOeul+OCkumrmOmAn+WMluOBmeOCiw0KKQ0KYGBgDQoNCuOBk+OBrumWouaVsOOBp+S4juOBiOOBpuOBhOOCi+aDheWgseOCkuS7peS4i+OBq+OBvuOBqOOCgeOBvuOBme+8mg0KDQotIGBmd2QgPSBmbkZzYCAgDQpRQ+WJjeOBruODleOCoeOCpOODq+OBruebuOWvvuODkeOCueaDheWgse+8iEZvcndhcmTlgbTvvInjgpLmjIflrprjgZnjgovpg6jliIbjgafjgZnjgILjgqrjg5fjgrfjg6fjg7PlkI3jga5gZndkYOOBr+OAgWZvcndhcmTjga7nlaXjgaDjgajop6Pph4jjgZfjgb7jgZnjgIIgIA0KLSBgZmlsdCA9IGZpbHRGc2AgIA0KUUPlvozjga7jg5XjgqHjgqTjg6vjga7nm7jlr77jg5Hjgrnmg4XloLHvvIhGb3J3YXJk5YG077yJ44KS5oyH5a6a44GZ44KL6YOo5YiG44Gn44GZ44CC44Kq44OX44K344On44Oz5ZCN44GuYGZpbHRg44Gv44CB44OV44Kj44Or44K/44Oq44Oz44Kw77yIZmlsdGVyaW5n77yJ5b6M44Gu44OV44Kh44Kk44Or5ZCN5oOF5aCx44KS5oyH5a6a44Gb44KI44Go44GE44GG5oSP5ZGz44Gg44Go6Kej6YeI44GX44G+44GZ44CCICANCi0gYHJldiA9IGZuUnNgICANClFD5YmN44Gu44OV44Kh44Kk44Or44Gu55u45a++44OR44K55oOF5aCx77yIUmV2ZXJzZeWBtO+8ieOCkuaMh+WumuOBmeOCi+mDqOWIhuOBp+OBmeOAguOCquODl+OCt+ODp+ODs+WQjeOBrmByZXZgYOOBr+OAgXJldmVyc2Xjga7nlaXjgaDjgajop6Pph4jjgZfjgb7jgZnjgIIgIA0KLSBgZmlsdC5yZXYgPSBmaWx0UnNgICANClFD5b6M44Gu44OV44Kh44Kk44Or44Gu55u45a++44OR44K55oOF5aCx77yIUmV2ZXJzZeWBtO+8ieOCkuaMh+WumuOBmeOCi+mDqOWIhuOBp+OBmeOAguOCquODl+OCt+ODp+ODs+WQjeOBrmBmaWx0LnJldmDjga/jgIHjg5XjgqPjg6vjgr/jg6rjg7PjgrDvvIhmaWx0ZXJpbmfvvInlvozjga5yZXZlcnNl5YG044OV44Kh44Kk44Or5ZCN5oOF5aCx44KS5oyH5a6a44Gb44KI44Go44GE44GG5oSP5ZGz44Gg44Go6Kej6YeI44GX44G+44GZ44CCICANCi0gYG1heE4gPSBjKDAsIDApYCAgDQrjg6rjg7zjg4njgavlkKvjgb7jgozjgotO44Gu6Kix5a655pWw44KS5oyH5a6a44GZ44KL6YOo5YiG44Gn44GZ44CCYGMoMCwgMClg44Gv44CBMOOBqOOBhOOBhuimgee0oOOBjDLjgaTjgYLjgovmlbDlgKTjg5njgq/jg4jjg6vjgpLmhI/lkbPjgZfjgIFG5YG0UuWBtOOBqOOCguOBq07jgpLlkKvjgoDjg6rjg7zjg4njgpIx44Gk44KC6Kix5a6544GX44Gq44GE44Go44GE44GG5oSP5ZGz44Gn44GZ44CC6KaB57Sg44GMMuOBpOOBq+OBquOBo+OBpuOBhOOCi+OBruOBr+OAgUZvcndhcmTlgbTjgahSZXZlcnNl5YG044GuMueorumhnuOBruODleOCoeOCpOODq+OCkuWFpeWKm+OBqOOBl+OBpuS4juOBiOOBpuOBhOOCi+OBn+OCgeOBp+OBmeOAguS+i+OBiOOBsOOAgeOCguOBl2BjKDEsIDMpYOOBquOCieOAgUZvcndhcmTlgbTjga/jgIHloanln7rphY3liJfkuK3jgatO44GM5YWo44GP5ZCr44G+44KM44Gq44GE44Oq44O844OJ44Gg44GR44Gn44Gq44GP44CBMeWAi+WQq+OCgOODquODvOODieOBvuOBp+ioseWuueOBmeOCi++8iDLlgIvku6XkuIpO44KS5ZCr44KA44Oq44O844OJ44KS5o2o44Gm44KL77yJ44GT44Go44KS5oSP5ZGz44GX44G+44GZ44CC44G+44Gf44CBUmV2ZXJzZeWBtOOBr+OAgTDvvZ4z5YCLTuOCkuWQq+OCgOODquODvOODieOBvuOBp+ioseWuueOBmeOCi+OBk+OBqOOCkuaEj+WRs+OBl+OBvuOBmeOAgiAgDQotIGBtYXhFRSA9IGMoMiwgNSlgICANCuODquODvOODieS4reOBruOCqOODqeODvOeOh+OBruWSjOOBrumWvuWApOOCkuaMh+WumuOBmeOCi+mDqOWIhuOBp+OBmeOAgmBjKDIsIDUpYOOBr+OAgTLjgaTjga7opoHntKDjgYvjgonjgarjgovmlbDlgKTjg5njgq/jg4jjg6vvvIgx55Wq55uu44Gu6KaB57Sg44GMMuOAgTLnlarnm67jga7opoHntKDjgYw177yJ44KS5oSP5ZGz44GX44CBRuWBtOOBjDLjgIFS5YG044GMNeOBqOOBhOOBhuaEj+WRs+OBp+OBmeOAguOBk+OBruWgtOWQiOOBr+ODquODvOODiemVt+OBjDI1MCBicOOBguOCiuOBvuOBmeOBjOOAgeWhqeWfuuOBlOOBqOOBq+OCr+OCquODquODhuOCo+OCueOCs+OCou+8iOOBpOOBvuOCiuOCqOODqeODvOeOh++8ieOBruaDheWgseOBjOS7mOS4juOBleOCjOOBpuOBhOOBvuOBmeOAguOBneOCjOOCkuWFqOmDqOi2s+OBl+OBpuOBhOOBo+OBn+OCqOODqeODvOeOh+OBruWQiOioiOOBjDLmnKrmuoDjga7jg6rjg7zjg4njga7jgb/mrovjgZnvvIjjgZ3jgozku6XkuIrjga7jg6rjg7zjg4njga/mjajjgabjgovvvInjga7jgYxGb3J3YXJk5YG044CBNeacqua6gOOBruODquODvOODieOBruOBv+aui+OBme+8iOOBneOCjOS7peS4iuOBruODquODvOODieOBr+aNqOOBpuOCi++8ieOBruOBjFJldmVyc2XlgbTjgaDjgajop6Pph4jjgZnjgozjgbDjgojjgYTjgafjgZnvvIjlj4LogIPoq5bmlofjga9bRWRnYXIgYW5kIEZseXZiamVyZywgMjAxNV0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yNjEzOTYzNy8p77yJ44CC6Za+5YCk44GMMuOBqOOBhOOBhuOBruOBr+OAgTIvMjUwID0gMC4wMDjjgajjgYTjgYbjgZPjgajjgavjgarjgovjga7jgafjgIHloanln7rlvZPjgZ/jgorjga7lubPlnYfjgacwLjgl44Gu44Ko44Op44O8546H44G+44Gn6Kix5a6544GZ44KL44Gu44GMRm9yd2FyZOWBtOOAgTUvMjUwID0gMiXjga7jgqjjg6njg7znjofjgb7jgafoqLHlrrnjgZnjgovjga7jgYxSZXZlcnNl5YG044Gq44Gu44Gg44Go55CG6Kej44GX44G+44GZ44CCUmV2ZXJzZeWBtOOBruWApOOBjOWkp+OBjeOBhOOBruOBr+OAgeOBk+OBoeOCieOBruOBu+OBhuOBjOWFqOS9k+eahOOBq+OCr+OCquODquODhuOCo+OCueOCs+OCouOBjOS9juOBhOOBn+OCgeOBp+OBmeOAgiAgDQotIGB0cnVuY0xlbiA9IGMoMjI1LCAxNjApYCAgDQpGb3J3YXJk5YG044GvMjI1IGJw44CBUmV2ZXJzZeWBtOOBrzE2MCBicOOBq+OBquOCi+OBvuOBp+WPs+WBtO+8iDMn5pyr56uv77yJ44KS44OI44Oq44OgICDjgZvjgojjgajjgYTjgYbmjIfku6TjgafjgZnjgILjgZPjga7jgqrjg5fjgrfjg6fjg7Pjga/jgIFGb3J3YXJk5YG044GoUmV2ZXJzZeWBtOOBp+ODiOODquODoOOBl+OBn+OBhOmVt+OBleOBjOeVsOOBquOCi+WgtOWQiOOBq+WIqeeUqOOBl+OBvuOBmeOAguijnOi2s+OBqOOBl+OBpuOAgeOCguOBl0ZvcndhcmTlgbRSZXZlcnNl5YG06Zai5L+C44Gq44GPMjIzIGJw44Gr44Gq44KL44G+44Gn5Y+z5YG077yIMyfmnKvnq6/vvInjgpLjg4jjg6rjg6DjgZfjgZ/jgYTjgaDjgZHjgafjgYLjgozjgbDjgIHjgZPjga7jgqrjg5fjgrfjg6fjg7Pjga/kuLjjgIXliYrpmaTjgZfjgIHku6XkuIvjga5gdHJpbUxlZnRg44Go5ZCM44GY44OO44Oq44Gn44CBYHRyaW1SaWdodCA9IDI3YOOBqOOBmeOCjOOBsOOCiOOBhOOBp+OBme+8iOODquODvOODiemVt+OBrzI1MCBicOOBquOBruOBp+OAgTI1MCAtIDIyMyA9IDI377yJ44CC44Gq44GK44CBIGB0cnVuY0xlbiA9IGMoMjI1LCAxNjApYOOBruWgtOWQiOOBr1JldmVyc2XlgbTjga8yNTAgLSAxNjAgPSA5MCBicOOBoOOBkeWPs+WBtOOCkuODiOODquODoOOBleOBm+OCi+OBk+OBqOOBq+ebuOW9k+OBl+OBvuOBmeOAguWfuuacrOeahOOBq2B0cmltUmlnaHRg44Go5YWx5a2Y44GV44Gb44Gq44GE44GT44Go44KS44GK44K544K544Oh44GX44G+44GZ44CC44KC44GXYHRyaW1SaWdodGDjgpI5MCBicOS7peS4i+OBruaVsOWApOOCkuaMh+WumuOBmeOCi+OBqO+8iOS+i++8mmB0cmltUmlnaHQgPSAyN2DvvInjgZ3jgozjga/kvZXjga7lvbHpn7/jgoLkuI7jgYjjgarjgYTkuIDmlrnjgafjgIE5MOOCiOOCiuWkp+OBjeOBhOaVsOWApOOCkuaMh+WumuOBmeOCi+OBqOWFqOODquODvOODieOBjOmZpOWOu+OBleOCjOOBpuOBl+OBvuOBhOOBvuOBmeOBruOBp+OBlOazqOaEj+OBj+OBoOOBleOBhO+8iOOBquOBnOOBneOBhuOBquOCi+OBi+OBqOOBhOOBhueQhueUseS6keOAheOBqOOBhOOBhuOCiOOCiuOBr+OBneOBhuOBhOOBhuS7leanmOOBoOOBqOOBhOOBhuOBk+OBqOOBp+OBme+8ieOAgg0KLSBgdHJpbUxlZnQgPSAyNWAgIA0K44GT44KM44Gv44Gd44Gu44G+44KT44G+44Gq44Gu44Gn44GZ44GM44CB44Oq44O844OJ44Gu5bem5YG077yINSfnq6/vvInjgpIyNSBicOWIhuODiOODquODoOOBm+OCiOOBqOOBhOOBhuaMh+S7pOOBp+OBmeOAguOBk+OCjOOBr+OAgUZvcndhcmTlgbRSZXZlcnNl5YG06Zai5L+C44Gq44GP44Kv44Kq44Oq44OG44Kj44K544Kz44Ki5YiG5biD44GueOi7uOOBruW3puWBtOOBrjI1IGJw5YiG77yI44Gk44G+44KKMe+9njI155Wq55uu44Gu5aGp5Z+677yJ44Gv44CBNTDvvZ4xNTDloanln7rku5jov5Hjgavmr5Tjgbnjgabnm7jlr77nmoTjgavjgrnjgrPjgqLjgYzkvY7jgY/opovjgYjjgovjgYvjgonjgafjgZnjgILliKXjgasyNeOBmOOCg+OBquOBj+OBpjIw44Gn44KCMzDjgajjgYvjgafjgoLjgojjgYTjga7jgafjgZnjgYzjgIHjgarjgpPjgajjgarjgY8yNSBicOOBi+OBquOBqOOBhOOBhuaEn+OBmOOBp+OBmeOAgiAgDQotIGBybS5waGl4ID0gVFJVRWAgIA0KUGhpWOOBqOOBhOOBhklsbHVtaW5h44Gu44Kz44Oz44OI44Ot44O844Or44Op44Kk44OW44Op44Oq55Sx5p2l44Gu44Oq44O844OJ6YWN5YiX44KS6Zmk5Y6744Gb44KI44Go44GE44GG5oyH5Luk44Gn44GZ44CCUGhpWOOBr+mFjeWIl+aXouefpeOBruODkOOCr+ODhuODquOCquODleOCoeODvOOCuO+8iOOCueODouODvOODq+OCsuODjuODoO+8ieOBp+OBmeOAguOCteODs+ODl+ODq+eUseadpeODquODvOODieOBp+OBr+OBguOCiuOBvuOBm+OCk+OBl+WQjOWumuOBjOewoeWNmOOBp+OBmeOBruOBp+OAgeOBk+OBruOCquODl+OCt+ODp+ODs+OBr+eEoeadoeS7tuOBp1RSVUXjgYzln7rmnKzjgafjgZnjgIINCi0gYGNvbXByZXNzID0gRkFMU0VgICANCuWHuuWKm+e1kOaenOOCkuWcp+e4ruODleOCoeOCpOODq+OBq+OBr+OBl+OBquOBhOOBqOOBhOOBhuaMh+S7pOOBp+OBmeOAguOBk+OCjOOBr1RSVUXjgavjgZfjgabjgoLnibnjgavllY/poYzjga/jgarjgYTjgajmgJ3jgYTjgb7jgZnjgIINCi0gYG11bHRpdGhyZWFkID0gVFJVRWAgIA0K6KSH5pWw44GuQ1BV44KS5L2/44Gj44Gm6KiI566X44Gb44KI44Go44GE44GG5oyH5Luk44Gn44GZ44CC5LuW44Gu6KiI566X44KC5ZCM5pmC6YCy6KGM44Gn6LWw44KJ44Gb44Gm44GE44Gm44CB44Gd44Gh44KJ44GM6YGF44GP44Gq44KL44Gu44Gv44GE44KE44Gq5aC05ZCI44GvRkFMU0XjgafjgoLjgojjgYTjgafjgZnjgILnibnjgatDUFXmlbDjgpLmiormj6HjgZfjgabjgYTjgarjgYTjg6bjg7zjgrbjga/jgIHjgajjgorjgYLjgYjjgZpUUlVF44Gu44G+44G+44Gn44KE44Gj44Gm44G/44Gm5beu44GX5pSv44GI44GC44KK44G+44Gb44KT44CCDQoNCiMjIFcxLjQgUUPlvozjga7jgrnjgrPjgqLliIbluIPjgpLnorroqo0NCuOAgGBwbG90UXVhbGl0eVByb2ZpbGVg6Zai5pWw44Gv44CBZmFzdHHjg5XjgqHjgqTjg6vjgpLlhaXlipvjgajjgZfjgabjgIHjg6rjg7zjg4nkuK3jga7loanln7rjg53jgrjjgrfjg6fjg7PjgZTjgajjga7jgq/jgqrjg6rjg4bjgqPjgrnjgrPjgqLjga7jg5fjg63jg4Pjg4jjgpLlh7rlipvjgZfjgb7jgZnvvIjntIQxMOWIhu+8ieOAgiAgDQoNCiMjIyBXMS40LjEgUUPlvozjga5Gb3J3YXJk5YG0DQrjgIDjgb7jgZrjgIFgZmlsdEZzYOOCquODluOCuOOCp+OCr+ODiOOBruS4rei6q+OCkuihqOekuuOBleOBm+OBpuOBhOOBvuOBmeOAguOBk+OCjOOBr+OAgVFD5b6M44GuRm9yd2FyZOWBtOOBrmZhc3Rx44OV44Kh44Kk44Or44Gu55u45a++44OR44K55oOF5aCx44Gr44Gq44KK44G+44GZ44CCYHBsb3RRdWFsaXR5UHJvZmlsZWDplqLmlbDjga7lhaXlipvjgajjgZfjgabjgIFgZmlsdEZzYOOCquODluOCuOOCp+OCr+ODiOOCkuOBneOBruOBvuOBvuS4juOBiOOBpuOBhOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIGZpZy5kaW0gPSBjKDgsIDcpfQ0KZmlsdEZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaWx0RnPjga7kuK3ouqvjgpLnorroqo0NCnBsb3RRdWFsaXR5UHJvZmlsZShmaWx0RnMpICAgICAgICAgICAgICAgICMgZmlsdEZz44Kv44Kq44Oq44OG44Kj44K544Kz44Ki44Gu44OX44Ot44OD44OIDQpgYGANCg0KIyMjIFcxLjQuMiBRQ+W+jOOBrlJldmVyc2XlgbQNCuOAgOasoeOBq+OAgeOBvuOBmmBmaWx0UnNg44Kq44OW44K444Kn44Kv44OI44Gu5Lit6Lqr44KS6KGo56S644GV44Gb44Gm44GE44G+44GZ44CC44GT44KM44Gv44CBUUPlvozjga5SZXZlcnNl5YG044GuZmFzdHHjg5XjgqHjgqTjg6vjga7nm7jlr77jg5Hjgrnmg4XloLHjgavjgarjgorjgb7jgZnjgIJgcGxvdFF1YWxpdHlQcm9maWxlYOmWouaVsOOBruWFpeWKm+OBqOOBl+OBpuOAgWBmaWx0UnNg44Kq44OW44K444Kn44Kv44OI44KS44Gd44Gu44G+44G+5LiO44GI44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgZmlnLmRpbSA9IGMoOCwgNyl9DQpmaWx0UnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpbHRSc+OBruS4rei6q+OCkueiuuiqjQ0KcGxvdFF1YWxpdHlQcm9maWxlKGZpbHRScykgICAgICAgICAgICAgICAgIyBmaWx0UnPjga7jgq/jgqrjg6rjg4bjgqPjgrnjgrPjgqLjga7jg5fjg63jg4Pjg4gNCmBgYA0KDQojIyBXMS41IFFD5YmN5b6M44Gu44Oq44O844OJ5pWw44KS56K66KqNDQrjgIBXMS4z44Gn5b6X44GfYGZpbHRlckFuZFRyaW1g6Zai5pWw44Gu5a6f6KGM57WQ5p6c44GM5qC857SN44GV44KM44GfYG91dGDjgqrjg5bjgrjjgqfjgq/jg4jjgpLnlKjjgYTjgabjgIFRQ+WJjeW+jOOBp+ODquODvOODieaVsOOBjOOBqeOBruOCiOOBhuOBq+WkieOCj+OBo+OBn+OBi+OCkueiuuiqjeOBl+OBvuOBmeOAguOBk+OBk+OBp+W+l+OBn+OCguOBruOBjOOAgeihqDHjga7jg6rjg7zjg4nmlbDmg4XloLHjgavjgarjgorjgb7jgZnjgIINCg0KIyMjIFcxLjUuMSDln7rmnKzlvaINCuOAgGBvdXRg44Gu5Lit6Lqr44KS6KGo56S644GV44Gb44Gm44GE44KL44Gg44GR44Gn44GZ44CCcmVhZHMuaW7liJfjgYxRQ+WJjeOAgXJlYWRzLm91dOWIl+OBjFFD5b6M44Gu44Oq44O844OJ5pWw44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCm91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3V044Gu5Lit6Lqr44KS56K66KqNDQpgYGANCg0KIyMjIFcxLjUuMiDlibLlkIjjga7mg4XloLHjgpLov73liqANCuOAgOWFiOOBu+OBqeOBrue1kOaenOOCiOOCiuOAgWBvdXRg44Gu6KGM5YiX44GvMeWIl+ebruOBjFFD5YmN44CBMuWIl+ebruOBjFFD5b6M44Gu44Oq44O844OJ5pWw44Gn44GC44KL44GT44Go44Gv44GZ44GQ44Gr44KP44GL44KK44G+44GZ44CC44GT44GT44Gn44Gv44G+44Ga44CBMuWIl+ebri8x5YiX55uu44Go44GX44Gm5q6L44Gj44Gf44Oq44O844OJ44Gu5Ymy5ZCI44KSYHJhdGlvYOOBqOOBhOOBhuOCquODluOCuOOCp+OCr+ODiOOBq+OBvuOBmuagvOe0jeOBl+OBpuOBhOOBvuOBmeOAguasoeOBq+OAgeWFg+OAhTLliJfjga7mg4XloLHjgYvjgonjgarjgotgb3V0YOihjOWIl+OBruWPs+WBtOOBq+OAgeWFiOOBu+OBqeW+l+OBn2ByYXRpb2Djgqrjg5bjgrjjgqfjgq/jg4jjgpJgY2JpbmRg6Zai5pWw44KS55So44GE44Gm5YiX5pa55ZCR44Gn57WQ5ZCI44GX44Gm5Ye65Yqb44GX44Gm44GE44G+44GZ44CC44GT44GT44Gn5b6X44Gf44KC44Gu44GM44CB6KGoMWLjga7libLlkIjjga7mg4XloLHjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcmF0aW8gPC0gb3V0WywyXS9vdXRbLDFdICAgICAgICAgICAgICAgICAgIyBvdXTjga4y5YiX55uuLzHliJfnm67jgpLoqIjnrpfjgZfjgIFyYXRpb+OBq+agvOe0jQ0KY2JpbmQob3V0LCByYXRpbykgICAgICAgICAgICAgICAgICAgICAgICAgIyBvdXTjga7lj7PlgbTjgatyYXRpb+OBruaDheWgseOCkuWIl+aWueWQkeOBp+mAo+e1kA0KYGBgDQrjgIDjg4jjg6rjg6DjgoTjg5XjgqPjg6vjgr/jg6rjg7PjgrDjgafmrovjgaPjgZ/jg6rjg7zjg4njga7libLlkIjjga7mnIDlpKflgKTjgajmnIDlsI/lgKTjga/jgIHjgZ3jgozjgZ7jgozku6XkuIvjga7pgJrjgorjgafjgZnvvJoNCg0KLSDmnIDlpKflgKTjgajjgZ3jga7jgrXjg7Pjg5fjg6vlkI3vvJpgciBtYXgocmF0aW8pYOOAgWByIHJvd25hbWVzKG91dClbd2hpY2gubWF4KHJhdGlvKV1gICANCi0g5pyA5bCP5YCk44Go44Gd44Gu44K144Oz44OX44Or5ZCN77yaYHIgbWluKHJhdGlvKWDjgIFgciByb3duYW1lcyhvdXQpW3doaWNoLm1pbihyYXRpbyldYCAgDQoNCiMjIFcxLjYg44Om44OL44O844Kv6YWN5YiX44Gu5pWwDQog44Om44OL44O844Kv6YWN5YiX77yIdW5pcXVlIHNlcXVlbmNlc++8ieOBqOOBr+OAgemVt+OBleOBr+OCguOBoeOCjeOCk+OBruOBk+OBqOOAgeWQjOS4gOODneOCuOOCt+ODp+ODs+OBruWhqeWfuuOBjOWujOWFqOOBq+S4gOiHtOOBmeOCi+mFjeWIl+OBruOBk+OBqOOBp+OBmeOAguOBk+OBk+OBp+OBr+OAgVtkYWRhMl0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL3JlbGVhc2UvYmlvYy9odG1sL2RhZGEyLmh0bWwp44OR44OD44Kx44O844K444GM5o+Q5L6b44GZ44KLYGdldFVuaXF1ZXNg6Zai5pWw44KS55So44GE44Gm44Om44OL44O844Kv6YWN5YiX44Gu5pWw44KS44Kr44Km44Oz44OI44GZ44KL5L6L44KS56S644GX44G+44GZ44CC44GT44GT44Gn5b6X44Gf44KC44Gu44GM44CB6KGoMeOBruODpuODi+ODvOOCr+mFjeWIl+OBruaDheWgseOBq+OBquOCiuOBvuOBmeOAgg0KIA0KIyMjIFcxLjYuMSDln7rmnKznmoTjgarogIPjgYjmlrkNCuOAgOOBhOOBjeOBquOCijI1MCBicOOBrumVt+OBhOODquODvOODieOBp+e1kOaenOOCkuekuuOBl+OBpuOCgueQhuino+OBl+OBpeOCieOBhOOBruOBp+OAgeOBk+OBk+OBp+OBr+OBvuOBmuesrDIz5Zue44Gu5ZuzMmLjga7lt6bkuIvjgavopovjgYjjgabjgYTjgos35pys44Gu44Oq44O844OJ6YWN5YiX44KS44K144Oz44OX44Or44OH44O844K/44Go44GX44Gm55So44GE44G+44GZ44CC44Gd44GX44Gm44CB5a6f6LOq55qE44GrYGdldFVuaXF1ZXNg6Zai5pWw44Go5ZCM44GY5oyZ5YuV44KS56S644GZYHRhYmxlYOmWouaVsOOCkueUqOOBhOOBpuaEn+immuOCkuOBpOOBi+OBv+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpob2dlIDwtIGMoIkFDQ0dBR0dBR0dUQ0dHQ0dDQ1RDIiwgICAgICAgICAjIOesrDIz5Zue44Gu5ZuzMmLjga7lt6bkuIvjga436YWN5YiX44KSaG9nZeOBq+agvOe0jQ0KICAgICAgICAgICJBQ0dHQUdHQUdHVENHR0NHQ0NUQyIsICAgICAgICAgIyDnrKwyM+WbnuOBruWbszJi44Gu5bem5LiL44GuN+mFjeWIl+OCkmhvZ2XjgavmoLzntI0NCiAgICAgICAgICAiQUNHR0FHR0FDR1RDR0dDR0NDVEEiLCAgICAgICAgICMg56ysMjPlm57jga7lm7MyYuOBruW3puS4i+OBrjfphY3liJfjgpJob2dl44Gr5qC857SNDQogICAgICAgICAgIkFDR0dBR0dBR0dUQ0dHQ0dDQ1RDIiwgICAgICAgICAjIOesrDIz5Zue44Gu5ZuzMmLjga7lt6bkuIvjga436YWN5YiX44KSaG9nZeOBq+agvOe0jQ0KICAgICAgICAgICJBQ0dHQUdHQUdHVENHR0NHQ0NUQyIsICAgICAgICAgIyDnrKwyM+WbnuOBruWbszJi44Gu5bem5LiL44GuN+mFjeWIl+OCkmhvZ2XjgavmoLzntI0NCiAgICAgICAgICAiQVRHR0FHR0FHR1RDR0dDR0NDVEMiLCAgICAgICAgICMg56ysMjPlm57jga7lm7MyYuOBruW3puS4i+OBrjfphY3liJfjgpJob2dl44Gr5qC857SNDQogICAgICAgICAgIkFDR0dBVEdBR0dUQ0dHQ0dBQ1RDIikgICAgICAgICAjIOesrDIz5Zue44Gu5ZuzMmLjga7lt6bkuIvjga436YWN5YiX44KSaG9nZeOBq+agvOe0jQ0KdGFibGUoaG9nZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl44OZ44Kv44OI44Or5Lit44Gu6KaB57Sg44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqm44KS56K66KqNDQpgYGANCuOAgGBob2dlYOOBr+aWh+Wtl+WIl+ODmeOCr+ODiOODq+OBp+OBguOCiuOAgeioiGByIGxlbmd0aChob2dlKWDjgaTjga7jg6rjg7zjg4nloanln7rphY3liJfjgYzmoLzntI3jgZXjgozjgabjgYTjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgILjgaTjgb7jgorjgIHjg6rjg7zjg4nmlbDjga9gciBsZW5ndGgoaG9nZSlg44Gn44GZ44CC44Gd44GX44Gm44CB44KI44GP55y644KB44KL44Go44CBMiwgNCwgNeeVquebruOBruODquODvOODieOBruOBv+OBjOWQjOS4gOOBp+OBguOCiuOAgeOBneOCjOS7peWkluOBr+OBqeOBk+OBi+OBruODneOCuOOCt+ODp+ODs+OBruWhqeWfuuOBjOeVsOOBquOBo+OBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAguOBpOOBvuOCiuOAgeODpuODi+ODvOOCr+mFjeWIl+OBruaVsOOBr2ByIGxlbmd0aCh0YWJsZShob2dlKSlg44Gn44GZ44CC44GT44Gu5LqL5a6f44KS6KqN6K2Y44GX44Gf44GG44GI44GnYHRhYmxlKGhvZ2UpYOWun+ihjOe1kOaenOOCkuecuuOCgeOCi+OBqOOAgWB0YWJsZWDplqLmlbDjga7mjJnli5XjgYzjgojjgY/jgo/jgYvjgovjgajmgJ3jgYTjgb7jgZnjgILjgaTjgb7jgorjgIFgdGFibGVg6Zai5pWw44Gr44OZ44Kv44OI44Or44KS5YWl5Yqb44Go44GX44Gm5LiO44GI44KL44Go44CB44Om44OL44O844Kv44Gq6KaB57Sg44KS5ZCM5a6a44GZ44KL44Go44Go44KC44Gr44CB6KaB57Sg44GU44Go44Gu5Ye654++6aC75bqm44KS6L+U44GX44Gm44GP44KM44KL44Gu44Gn44GZ44CCDQoNCuOAgOOBk+OBruWgtOWQiOOBrmB0YWJsZShob2dlKWDlrp/ooYzntZDmnpzjga7opoHntKDmlbDjgYzjg6bjg4vjg7zjgq/jgarphY3liJfmlbDjgajjgarjgorjgb7jgZnjga7jgafjgIHjg5njgq/jg4jjg6vjga7opoHntKDmlbDjgpLoqr/jgbnjgotgbGVuZ3RoYOmWouaVsOOCkuW8leOBjee2muOBhOOBpuWun+ihjOOBmQ0K44KM44Gw44CB44CM44Om44OL44O844Kv44Gq6YWN5YiX5pWw44GvYHIgbGVuZ3RoKHRhYmxlKGhvZ2UpKWDlgIvjgI3jgajjgYTjgYbntZDmnpzjgYzlvpfjgonjgozjgovjga7jgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KbGVuZ3RoKHRhYmxlKGhvZ2UpKSAgICAgICAgICAgICAgICAgICAgICAgIyDjg5njgq/jg4jjg6vkuK3jga7jg6bjg4vjg7zjgq/jgaropoHntKDmlbDjgpLov5TjgZkNCmBgYA0KDQrjgIDlkIzmp5jjgavjgIFgdGFibGUoaG9nZSlg5a6f6KGM57WQ5p6c44Go44GX44Gm5b6X44KJ44KM44KL5Ye654++6aC75bqm5oOF5aCx44KSYHN1bWDplqLmlbDjgpLnlKjjgYTjgabotrPjgZnjgajjgIHlhYPjga7jg6rjg7zjg4nmlbDmg4XloLHvvIjjgaTjgb7jgopgciBzdW0odGFibGUoaG9nZSkpYOWAi++8ieOBjOW+l+OCieOCjOOBvuOBmeOAgg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnN1bSh0YWJsZShob2dlKSkgICAgICAgICAgICAgICAgICAgICAgICAgICMg5Ye654++6aC75bqm44Gu57eP5ZKM77yI44Gk44G+44KK44Oq44O844OJ5pWw77yJ44KS6KiI566XDQpgYGANCg0K44CA44Gq44GK44CBYHRhYmxlKGhvZ2UpYOWun+ihjOe1kOaenOOBr+OAgeODh+ODleOCqeODq+ODiOOBp+OBr+imgee0oO+8iOOBk+OBruWgtOWQiOOBr+WhqeWfuumFjeWIl++8ieOCkuOCouODq+ODleOCoeODmeODg+ODiOmghuOBq+OCveODvOODiOOBl+OBn+eKtuaFi+OBp+i/lOOBleOCjOOBvuOBmeOAguWHuuePvumgu+W6puOCkumZjemghu+8iOWkmiAkXHJpZ2h0YXJyb3ckIOWwke+8ieOBq+OBl+OBn+eKtuaFi+OBq+OBmeOCi+OBq+OBr+OAgeS7peS4i+OBruOCiOOBhuOBq2Bzb3J0YOmWouaVsOOCkmBkZWNyZWFzaW5nID0gVGDjgajjgYTjgYbjgqrjg5fjgrfjg6fjg7PjgaTjgY3jgaflvJXjgY3ntprjgYTjgablrp/ooYzjgZnjgozjgbDjgojjgYTjgafjgZnjgIJgZGVjcmVhc2luZyA9IFRg44Gv44K944O844OI57WQ5p6c44KS6ZmN6aCG77yI5aSaICRccmlnaHRhcnJvdyQg5bCR77yJ44Gr44Gb44KI44Go44GE44GG44Kq44OX44K344On44Oz44Gn44GZ44CCDQrjgIANCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc29ydCh0YWJsZShob2dlKSwgZGVjcmVhc2luZyA9IFQpICAgICAgICAgIyDjg5njgq/jg4jjg6vkuK3jga7opoHntKDjgZTjgajjga7lh7rnj77poLvluqbjgpLpmY3poIbjgafov5TjgZkNCmBgYA0KDQrjgIDjgZPjga7jgYLjgajop6PoqqzjgZnjgotgZ2V0VW5pcXVlc2DplqLmlbDjga/jgIHkuIroqJjjgrnjgq/jg6rjg5fjg4jjga7jgojjgYbjgarloanln7rphY3liJfjgZTjgajjga7lh7rnj77poLvluqbjgpLjg4fjg5Xjgqnjg6vjg4jjgafpmY3poIbvvIjlpJogJFxyaWdodGFycm93JCDlsJHvvInjga7nirbmhYvjgafov5TjgZfjgabjgY/jgozjgb7jgZnjgIINCg0KIyMjIFcxLjYuMiBgZ2V0VW5pcXVlc2DplqLmlbANCuOAgOasoeOBq+OAgWBnZXRVbmlxdWVzYOmWouaVsOOBruWIqeeUqOS+i+OCkuekuuOBl+OBvuOBmeOAguOBk+OBrumWouaVsOOBr+OAgWZhc3Rx44OV44Kh44Kk44Or44KS6Kqt44G/6L6844KT44Gn44CB44Om44OL44O844Kv6YWN5YiX44GU44Go44Gu5Ye654++6aC75bqm44KS6ZmN6aCG77yI5aSaICRccmlnaHRhcnJvdyQg5bCR77yJ44Gn6L+U44GX44Gm44GP44KM44G+44GZ44CC44GT44GT44Gn44Gv44G+44Ga44CB44CMUUPliY3jga5Gb3J3YXJk5YG044GuZmFzdHHjg5XjgqHjgqTjg6vnvqTjga7lkI3liY3jgI3mg4XloLHjgpLmoLzntI3jgZfjgZ9gZm5Gc2Djgqrjg5bjgrjjgqfjgq/jg4jjga4x55Wq55uu44Gu6KaB57Sg77yI44Gk44G+44KKIi4vU1JSNjMyNTgxM18xLmZhc3RxIu+8ieOBruOBv+OCkuWFpeWKm+OBqOOBl+OBpuS4juOBiOOBpuOAgWBnZXRVbmlxdWVzYOmWouaVsOWun+ihjOe1kOaenOOBqOOBl+OBpuW+l+OCieOCjOOCi+ODpuODi+ODvOOCr+mFjeWIl+OBlOOBqOOBruWHuuePvumgu+W6puaDheWgseOBq+OAgeOBleOCieOBq2BzdW1g6Zai5pWw44KS5a6f6KGM44GX44Gm44GE44G+44GZ44CC44Gk44G+44KK44CBYGdldFVuaXF1ZXNg6Zai5pWw44KS5Yip55So44GX44Gm44Oq44O844OJ5pWw5oOF5aCx44KS5b6X44KI44GG44Go44GX44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmhvZ2UgPC0gZm5Gc1sxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm5Gc+OBrjHnlarnm67jga7opoHntKDjgpJob2dl44Gr5qC857SNDQpob2dlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIOS4rei6q+OCkueiuuiqjQ0Kc3VtKGdldFVuaXF1ZXMoaG9nZSkpICAgICAgICAgICAgICAgICAgICAgIyDjg6rjg7zjg4nmlbDmg4XloLENCmBgYA0K44CA5b6X44KJ44KM44Gf57WQ5p6c77yI44Gk44G+44KKYHIgc3VtKGdldFVuaXF1ZXMoaG9nZSkpYOWAi++8ieOBr+OAgeeiuuOBi+OBq+esrDIz5Zue44Gu6KGoMuOBp+ekuuOBleOCjOOBpuOBhOOCi+ODquODvOODieaVsOOBqOS4gOiHtOOBl+OBpuOBhOOBvuOBmeOAguasoeOBq+OAgeWHuuePvumgu+W6puOBruWkmuOBhOS4iuS9jTPjgaTjgpJgaGVhZGDplqLmlbDjgpLnlKjjgYTjgabnpLrjgZfjgb7jgZnjgIIx44GkMeOBpOOBruODquODvOODieOBjDI1MCBicO+8iDI1MOaWh+Wtl++8ieOBguOCi+OBruOBp+imi+OBpeOCieOBhOOBi+OBqOaAneOBhOOBvuOBmeOBjOOAgTHnlarlpJrjgYTjga7jga9gciBnZXRVbmlxdWVzKGhvZ2UpWzFdYOWAi+OAgTLnlarnm67jgavlpJrjgYTjga7jga9gciBnZXRVbmlxdWVzKGhvZ2UpWzJdYOWAi+OBqOino+mHiOOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpoZWFkKGdldFVuaXF1ZXMoaG9nZSksIG4gPSAzKSAgICAgICAgICAgICAjIGhvZ2XkuK3jga7jg6bjg4vjg7zjgq/phY3liJfjga7mnIDliJ3jga4z44Gk77yI5aGp5Z+66YWN5YiX44Go5Ye654++6aC75bqm77yJ44KS56K66KqNDQpgYGANCg0K44CA5qyh44Gr44CB5Ye654++6aC75bqm44Gu5bCR44Gq44GE5LiK5L2NM+OBpOOCkmB0YWlsYOmWouaVsOOCkueUqOOBhOOBpuekuuOBl+OBvuOBmeOAguS6iOaDs+mAmuOCiuOBp+OBmeOBjOOAgTPjgaTjgajjgoIx5YCL44Gg44Go6Kej6YeI44GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnRhaWwoZ2V0VW5pcXVlcyhob2dlKSwgbiA9IDMpICAgICAgICAgICAgICMgaG9nZeS4reOBruODpuODi+ODvOOCr+mFjeWIl+OBruacgOW+jOOBrjPjgaTvvIjloanln7rphY3liJfjgajlh7rnj77poLvluqbvvInjgpLnorroqo0NCmBgYA0KDQrjgIAqKuODpuODi+ODvOOCr+mFjeWIl+OBruaVsOOBr+OAgeS7peS4i+OBruOCiOOBhuOBq2BsZW5ndGhg6Zai5pWw44KS55So44GE44Gm5b6X44KL44GT44Go44GM44Gn44GN44G+44GZ44CCKioNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KbGVuZ3RoKGdldFVuaXF1ZXMoaG9nZSkpICAgICAgICAgICAgICAgICAgIyDjg6bjg4vjg7zjgq/jgarphY3liJfmlbANCmBgYA0KDQrjgIDjgZPjga7jgrXjg7Pjg5fjg6vvvIhgciBob2dlYO+8ieOBruODquODvOODieaVsOOBr2ByIHN1bShnZXRVbmlxdWVzKGhvZ2UpKWDlgIvjgafjgZnjga7jgafjgIHjg6bjg4vjg7zjgq/phY3liJcx5pys44GC44Gf44KKYHIgc3VtKGdldFVuaXF1ZXMoaG9nZSkpYCBcLyBgciBsZW5ndGgoZ2V0VW5pcXVlcyhob2dlKSlgID0gYHIgc3VtKGdldFVuaXF1ZXMoaG9nZSkpL2xlbmd0aChnZXRVbmlxdWVzKGhvZ2UpKWDlgIvjga7lkIzkuIDloanln7rphY3liJfjga7jg6rjg7zjg4njgYzlrZjlnKjjgZnjgovjgajop6Pph4jjgafjgY3jgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc3VtKGdldFVuaXF1ZXMoaG9nZSkpIC8gbGVuZ3RoKGdldFVuaXF1ZXMoaG9nZSkpICMg44Om44OL44O844Kv44Gq6YWN5YiXMeacrOOBguOBn+OCiuOBruWHuuePvumgu+W6puOCkuioiOeulw0KYGBgDQoNCiMjIyBXMS42LjMg6Ieq5L2c44GuYGdldFVuaU51bWDplqLmlbANCuOAgOanmOOAheOBquabuOOBjeaWue+8iOWumue+qeOBruS7leaWue+8ieOBjOOBguOCiuOBvuOBmeOBjOOAgeS+i+OBiOOBsOS7peS4i+OBruOCiOOBhuOBq+OBmeOCjOOBsOOAgeODleOCoeOCpOODq+S4reOBruODpuODi+ODvOOCr+mFjeWIl+OBruaVsOOCkuW+l+OCi2BnZXRVbmlOdW1g44Go44GE44GG5ZCN5YmN44Gu6Zai5pWw44KS5a6a576p44GZ44KL44GT44Go44GM44Gn44GN44G+44GZ44CC44GT44Gu6Zai5pWw44Gu5a6f5L2T44Gv44CBYGdldFVuaXF1ZXNg6Zai5pWw5a6f6KGM44Gr5byV44GN57aa44GE44GmYGxlbmd0aGDplqLmlbDjgpLlrp/ooYzjgZnjgovjgZPjgajjgafjgZnjgILjgarjgYrjgIFgeGDjga/lhaXlipvjgajjgZfjgabkuI7jgYjjgovmg4XloLHjgavnm7jlvZPjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZ2V0VW5pTnVtIDwtIGZ1bmN0aW9uKHgpIGxlbmd0aChnZXRVbmlxdWVzKHgpKSAgICMg44Om44OL44O844Kv6YWN5YiX5pWw44KS5b6X44KL44Gf44KB44Gu6Zai5pWw44KS5a6a576pDQpgYGANCg0K44CA5LiA5bqm5a6a576p44GX44Gm44GX44G+44GI44Gw44CB44GC44Go44Gv6YCa5bi444Gu6Zai5pWw44Go5ZCM5qeY44Gu5Yip55So5rOV44GM44Gn44GN44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmhvZ2UgPC0gZm5Gc1sxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFzdHHjg5XjgqHjgqTjg6vlkI3jgpJob2dl44Gr5qC857SNDQpnZXRVbmlOdW0oaG9nZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIOODpuODi+ODvOOCr+mFjeWIl+aVsOOCkueiuuiqjQ0KYGBgDQoNCuOAgGBnZXRVbmlOdW1g6Zai5pWw44Gv44CBMeOBpOOBrmZhc3Rx44OV44Kh44Kk44Or44Gu5YWl5Yqb44GX44GL5oOz5a6a44GX44Gm44GE44G+44Gb44KT44CC44Gd44Gu44Gf44KB44CB5LiL6KiY44Gu44KI44GG44Gr44CMUUPliY3jga5Gb3J3YXJk5YG044GuZmFzdHHjg5XjgqHjgqTjg6vnvqTjga7lkI3liY3jgI3mg4XloLHjgpLmoLzntI3jgZfjgZ9gZm5Gc2Djgqrjg5bjgrjjgqfjgq/jg4jjgpLjgZ3jga7jgb7jgb7lhaXlipvjgajjgZfjgabkuI7jgYjjgovjgajjgqjjg6njg7zjgYzlh7rjgb7jgZnjgILjgqjjg6njg7zjgYzlh7rjgovjgZPjgajjgYzliIbjgYvjgaPjgabjgYTjgovnirbmhYvjgafjgqjjg6njg7zjg6Hjg4Pjgrvjg7zjgrjjgpLnnLrjgoHjgovjgajjgIHnorrjgYvjgavjgIwuLi5VbnJlY29nbml6ZWQgZm9ybWF0Li4u44CN44Gq44Gp44Go5pu444GL44KM44Gm44GE44KL5oSP5ZGz44GM44Gq44KT44Go44Gq44GP5YiG44GL44KL44Go5oCd44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmZuRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMg5Lit6Lqr44KS56K66KqNDQpnZXRVbmlOdW0oZm5GcykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIOODpuODi+ODvOOCr+mFjeWIl+aVsOOCkueiuuiqjQ0KYGBgDQoNCiMjIyBXMS42LjQgYGxhcHBseWDplqLmlbDjgpLliKnnlKgNCuOAgDEy5YCL44GuZmFzdHHjg5XjgqHjgqTjg6vjgZ3jgozjgZ7jgozjga7jg6rjg7zjg4nmlbDjgpLkuIDluqbjgavlrp/ooYzjgZnjgosx44Gk44Gu44KE44KK5pa544Gv44CBYGxhcHBseWDplqLmlbDjga7liKnnlKjjgafjgZnjgILjgZPjgozjga/jgIFgZm5Gc2Djga7opoHntKDjgZTjgajjgatgZ2V0VW5pTnVtYOmWouaVsOOCkuWun+ihjOOBl+OBpuOBj+OCjOOBvuOBmeOAguWun+ihjOe1kOaenOOBr1tbMV1d44Gu44KI44GG44GqKirjg6rjgrnjg4jlvaLlvI8qKuOBp+i/lOOBleOCjOOBvuOBmeOBjOOAgeihqOekuuOBleOCjOOBpuOBhOOCi+ODpuODi+ODvOOCr+mFjeWIl+aVsOOBr+ato+OBl+OBhOOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpsYXBwbHkoZm5GcywgZ2V0VW5pTnVtKSAgICAgICAgICAgICAgICAgICAjIGZuRnPkuK3jga7jgrXjg7Pjg5fjg6vjgZTjgajjga7jg6bjg4vjg7zjgq/phY3liJfmlbDjgpLjg6rjgrnjg4jlvaLlvI/jgafnorroqo0NCmBgYA0KDQojIyMgVzEuNi41IGB1bmxpc3Rg6Zai5pWw44KC5L2155SoDQrjgIDntZDmnpzjgpLjg6rjgrnjg4jlvaLlvI/jgafjga/jgarjgY/jg5njgq/jg4jjg6vlvaLlvI/jgaflvpfjgZ/jgYTloLTlkIjjga/jgIHku6XkuIvjgafnpLrjgZnjgojjgYbjgatgdW5saXN0YOmWouaVsOOCkui/veWKoOOBp+Wun+ihjOOBmeOCjOOBsOOCiOOBhOOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp1bmxpc3QobGFwcGx5KGZuRnMsIGdldFVuaU51bSkpICAgICAgICAgICAjIGZuRnPkuK3jga7jgrXjg7Pjg5fjg6vjgZTjgajjga7jg6bjg4vjg7zjgq/phY3liJfmlbDjgpLjg5njgq/jg4jjg6vlvaLlvI/jgafnorroqo0NCmBgYA0KDQojIyMgVzEuNi42IGBzYXBwbHlg6Zai5pWw44KS5Yip55SoDQrjgIDku6XkuIvjgafnpLrjgZnjgojjgYbjgatgc2FwcGx5YOmWouaVsOOCkuWIqeeUqOOBl+OBpuOCguOBi+OBvuOBhOOBvuOBm+OCk+OAguOBk+OBruOBguOBn+OCiuOBr+WlveOBv+OBp+OBmeOBruOBp+OAgSoq5aSa5qeY44Gq44KE44KK5pa544KS55+l44KK44CB6KaL5oWj44KM44Gq44GE6Zai5pWw44KE5Ye65Yqb57WQ5p6c44Gr54u854u944GX44Gq44GE44GT44Go44Gu44G/44GM6YeN6KaBKirjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc2FwcGx5KGZuRnMsIGdldFVuaU51bSkgICAgICAgICAgICAgICAgICAgIyBmbkZz5Lit44Gu44K144Oz44OX44Or44GU44Go44Gu44Om44OL44O844Kv6YWN5YiX5pWw44KS56K66KqNDQpgYGANCg0KIyMjIFcxLjYuNyBRQ+WJjeOBrkZvcndhcmTlgbQNCuOAgOWun+izqueahOOBq+ebtOWJjeOBrumgheOBqOWQjOOBmOWGheWuueOBp+OBmeOBjOOAgWBzYXBwbHlg5a6f6KGM57WQ5p6c44KSYHVuaXNlcV9mbkZzYOOBq+agvOe0jeOBl+OBpuOBhOOBvuOBmeOAguOBk+OCjOOBjOOAjOihqDHjgIEoYSlRQ+WJjeOAgeODpuODi+ODvOOCr+mFjeWIl+OBruaVsOOAgUZvcndhcmTjgI3jga7ln7rnpI7mg4XloLHjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdW5pc2VxX2ZuRnMgPC0gc2FwcGx5KGZuRnMsIGdldFVuaU51bSkgICAgIyBmbkZz5Lit44Gu44K144Oz44OX44Or44GU44Go44Gu44Om44OL44O844Kv6YWN5YiX5pWw44KSdW5pc2VxX2ZuRnPjgavmoLzntI0NCnVuaXNlcV9mbkZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMg5Lit6Lqr44KS56K66KqNDQpgYGANCg0KIyMjIFcxLjYuOCBRQ+WJjeOBrlJldmVyc2XlgbQNCuOAgOOAjOihqDHjgIEoYSlRQ+WJjeOAgeODpuODi+ODvOOCr+mFjeWIl+OBruaVsOOAgVJldmVyc2XjgI3jga7ln7rnpI7mg4XloLHjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdW5pc2VxX2ZuUnMgPC0gc2FwcGx5KGZuUnMsIGdldFVuaU51bSkgICAgIyBmblJz5Lit44Gu44K144Oz44OX44Or44GU44Go44Gu44Om44OL44O844Kv6YWN5YiX5pWw44KSdW5pc2VxX2ZuUnPjgavmoLzntI0NCnVuaXNlcV9mblJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMg5Lit6Lqr44KS56K66KqNDQpgYGANCg0KIyMjIFcxLjYuOSBRQ+W+jOOBrkZvcndhcmTlgbQNCuOAgOOAjOihqDHjgIEoYilRQ+W+jOOAgeODpuODi+ODvOOCr+mFjeWIl+OBruaVsOOAgUZvcndhcmTjgI3jga7ln7rnpI7mg4XloLHjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdW5pc2VxX2ZpbHRGcyA8LSBzYXBwbHkoZmlsdEZzLCBnZXRVbmlOdW0pIyBmaWx0RnPkuK3jga7jgrXjg7Pjg5fjg6vjgZTjgajjga7jg6bjg4vjg7zjgq/phY3liJfmlbDjgpJ1bmlzZXFfZmlsdEZz44Gr5qC857SNDQp1bmlzZXFfZmlsdEZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIOS4rei6q+OCkueiuuiqjQ0KYGBgDQoNCiMjIyBXMS42LjEwIFFD5b6M44GuUmV2ZXJzZeWBtA0K44CA44CM6KGoMeOAgShiKVFD5b6M44CB44Om44OL44O844Kv6YWN5YiX44Gu5pWw44CBUmV2ZXJzZeOAjeOBruWfuuekjuaDheWgseOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp1bmlzZXFfZmlsdFJzIDwtIHNhcHBseShmaWx0UnMsIGdldFVuaU51bSkjIGZpbHRSc+S4reOBruOCteODs+ODl+ODq+OBlOOBqOOBruODpuODi+ODvOOCr+mFjeWIl+aVsOOCknVuaXNlcV9maWx0UnPjgavmoLzntI0NCnVuaXNlcV9maWx0UnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMg5Lit6Lqr44KS56K66KqNDQpgYGANCg0KIyBXMiDjg47jgqTjgrrpmaTljrsNCuOAgFtkYWRhMl0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL3JlbGVhc2UvYmlvYy9odG1sL2RhZGEyLmh0bWwp44Gu5Li76KaB6YOo5YiG44Gv44CB44OO44Kk44K66Zmk5Y6744Go6YeN6KSH6Zmk5Y6777yIZGVub2lzaW5nIGFuZCBkZXJlcGxpY2F0aW9u77yJ44GuMuOBpOOBruOCueODhuODg+ODl+OBi+OCieani+aIkOOBleOCjOOBvuOBmeOAguOBk+OBk+OBp+OBr+OAgeOBneOBruacgOWIneOBruOCueODhuODg+ODl+OCkuihjOOBhOOBvuOBmeOAguOCt+ODvOOCr+OCqOODs+OCteOBq+OBr+eZluOBjOOBguOCiuOAgeS+i+OBiOOBsOOAjOacrOW9k+OBr0HjgajjgYTjgYbloanln7rjgarjga7jgavplpPpgZXjgaPjgaZU44KS5Ye65Yqb44GX44GM44Gh44CN44Go44GL44GM44GC44KK44G+44GZ44CC44GT44Gu44Go44GN44CB44CMQeOBi+OCiVTjgbjjga7nva7mj5vvvIhBIHRvIFTvvInjgI3jgajjgYTjgYbjga7jgpLjgIHjgZPjga7mpa3nlYzjgafjga/jgIxBMlTjgI3jga7jgojjgYbjgat0b+OCkjLjgavnva7jgY3mj5vjgYjjgabooajnj77jgZnjgovloLTlkIjjgYzlpJrjgYTjgafjgZnvvIjnibnjgatMaW51eOOBruWkieaPm+ezu+OBruODl+ODreOCsOODqeODoOWQjeOBp+OBneOBruOCiOOBhuOBquWCvuWQkeOBjOOBguOCiuOBvuOBme+8ieOAguOBk+OBruOCiOOBhuOBque1hOOBv+WQiOOCj+OBm+OBr+OAgeeQhuirluS4iiQ0XjIgPSAxNiTpgJrjgorjgYLjgorjgb7jgZnvvIhBMkEsIEEyQywgQTJHLCBBMlQsIEMyQSwgLi4uLCBUMkcsIFQyVO+8ieOAguOBvuOBn+OAgeWhqeWfuuOBlOOBqOOBq+S7mOS4juOBleOCjOOBpuOBhOOCi+OCr+OCquODquODhuOCo+OCueOCs+OCoiRxJOOBjOS9juOBhOOBu+OBqeOCt+ODvOOCr+OCqOODs+OCueOCqOODqeODvOOBjOi1t+OBk+OCiuOChOOBmeOBhO+8iOOCqOODqeODvOeOhyRwJOOBjOmrmOOBhO+8ieOBruOBp+OBmeOBjOOAgeOBk+OBriRwJOOBqCRxJOOBrumWouS/guOBr+S7peS4i+OBruaVsOW8j+OBp+ihqOePvuOBleOCjOOBvuOBme+8mg0KJCQNCnEgPSAtIDEwIFx0aW1lcyBcbG9nX3sxMH0gKHApDQokJA0KDQojIyBXMi4xIGBsZWFybkVycm9yc2DplqLmlbANCuOAgGBsZWFybkVycm9yc2DplqLmlbDjga/jgIHjg6rjg7zjg4njg5XjgqHjgqTjg6vjgpLlhaXlipvjgajjgZfjgabjgIFGb3J3YXJk5YG044GoUmV2ZXJzZeWBtOeLrOeri+OBq+OCqOODqeODvOODouODh+ODq+OBruaOqOWumuOCkuihjOOBhOOBvuOBmeOAgumAmuW4uOOBr1FD5b6M44GuZmFzdHHjg5XjgqHjgqTjg6vjgYzlhaXlipvjgavjgarjgorjgb7jgZnjga7jgafjgIHkvovjgYjjgbBGb3J3YXJk5YG044Gu5aC05ZCI44Gv44CB44Gd44KM44KJ44Gu44OV44Kh44Kk44Or44Gu55u45a++44OR44K55oOF5aCx44Gn44GC44KLYGZpbHRGc2DjgpLkuI7jgYjjgb7jgZnjgIJgZmxzYOOBr+OBn+OBoOOBruOCquODl+OCt+ODp+ODs+WQjeOBp+OBmeOAguOBk+OBk+OBp+OBr+OAgeW+l+OCieOCjOOBn+OCqOODqeODvOODouODh+ODq+aDheWgseOCkkZvcndhcmTlgbTjga9gZXJyRnNg44Gr44CB44Gd44GX44GmUmV2ZXJzZeWBtOOBr2BlcnJSc2Djgqrjg5bjgrjjgqfjgq/jg4jjgavmoLzntI3jgZfjgabjgYTjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZXJyRnMgPC0gbGVhcm5FcnJvcnMoZmxzID0gZmlsdEZzLCBtdWx0aXRocmVhZCA9IFRSVUUpICMgZmlsdEZz44Gu5LiA6YOo44KS55So44GE44Gf44Ko44Op44O844Oi44OH44Or5o6o5a6aDQplcnJScyA8LSBsZWFybkVycm9ycyhmbHMgPSBmaWx0UnMsIG11bHRpdGhyZWFkID0gVFJVRSkgIyBmaWx0UnPjga7kuIDpg6jjgpLnlKjjgYTjgZ/jgqjjg6njg7zjg6Ljg4fjg6vmjqjlrpoNCmBgYA0KDQojIyBXMi4yIGBwbG90RXJyb3JzYOmWouaVsA0K44CAYHBsb3RFcnJvcnNg6Zai5pWw44Gv44CBYGxlYXJuRXJyb3JzYOmWouaVsOOBruWun+ihjOe1kOaenOOCkuWFpeWKm+OBqOOBl+OBpuOAgTE26YCa44KK44Gu5aGp5Z+6572u5o+b44Gu56iu6aGe44GU44Go44Gr44Kv44Kq44Oq44OG44Kj44K544Kz44Ki44Go44Ko44Op44O86aC75bqm77yI5o6o5a6a44Ko44Op44O844Oi44OH44Or44KS5ZCr44KA77yJ44Gu6Zai5L+C44KS44OX44Ot44OD44OI44GX44Gf57WQ5p6c44KS5Ye65Yqb44GX44G+44GZ44CCDQoNCiMjIyBXMi4yLjEgRm9yd2FyZOWBtA0K44CARm9yd2FyZOWBtOOBrmBsZWFybkVycm9yc2DplqLmlbDjga7lrp/ooYzntZDmnpzjgafjgYLjgotgZXJyRnNg44KS5YWl5Yqb44Go44GX44Gm44OX44Ot44OD44OI44GX44Gm44GE44G+44GZ44CCYG5vbWluYWxRID0gVFJVRWDjga/jgIHotaTnt5rjgpLjgaTjgZHjgojjgajjgYTjgYbmjIfku6TjgafjgZnjgILjgZPjgozjgYzlm7My44Go5ZCM44GY44KC44Gu44Gr44Gq44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgZmlnLmRpbSA9IGMoOCwgNyl9DQpwbG90RXJyb3JzKGVyckZzLCBub21pbmFsUSA9IFRSVUUpICAgICAgICAjIGVyckZz44Gu5Lit6Lqr77yI44Ko44Op44O86aC75bqm44KE44Ko44Op44O844Oi44OH44Or5o6o5a6a57WQ5p6c77yJ44KS44OX44Ot44OD44OIDQpgYGANCg0KIyMjIFcyLjIuMiBSZXZlcnNl5YG0DQrjgIBSZXZlcnNl5YG044GuYGxlYXJuRXJyb3JzYOmWouaVsOOBruWun+ihjOe1kOaenOOBp+OBguOCi2BlcnJSc2DjgpLlhaXlipvjgajjgZfjgabjg5fjg63jg4Pjg4jjgZfjgabjgYTjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBmaWcuZGltID0gYyg4LCA3KX0NCnBsb3RFcnJvcnMoZXJyUnMsIG5vbWluYWxRID0gVFJVRSkgICAgICAgICMgZXJyUnPjga7kuK3ouqvvvIjjgqjjg6njg7zpoLvluqbjgoTjgqjjg6njg7zjg6Ljg4fjg6vmjqjlrprntZDmnpzvvInjgpLjg5fjg63jg4Pjg4gNCmBgYA0KDQojIyBXMi4zIGBkYWRhYOmWouaVsA0K44CAYGRhZGFg6Zai5pWw44Gv44CB5YmN5Yem55CG44GM57WC44KP44Gj44Gf44Oq44O844OJ44OV44Kh44Kk44Or77yIRm9yd2FyZOWBtOOBruWgtOWQiOOBr2BmaWx0RnNg77yJ44Go5YWI44G744Gp5b6X44Gf44Ko44Op44O844Oi44OH44Or5oOF5aCx77yIRm9yd2FyZOWBtOOBruWgtOWQiOOBr2BlcnJGc2DvvInjgpLlhaXlipvjgajjgZfjgabjgIFkZW5vaXNpbmfjgpLlrp/ooYzjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZGFkYUZzIDwtIGRhZGEoZGVyZXAgPSBmaWx0RnMsIGVyciA9IGVyckZzLCBtdWx0aXRocmVhZCA9IFRSVUUpICMgZmlsdEZz44GoZXJyRnPjgpLlhaXlipvjgajjgZfjgabjgqjjg6njg7zoo5zmraPjgpLlrp/ooYwNCmRhZGFScyA8LSBkYWRhKGRlcmVwID0gZmlsdFJzLCBlcnIgPSBlcnJScywgbXVsdGl0aHJlYWQgPSBUUlVFKSAjIGZpbHRSc+OBqGVyclJz44KS5YWl5Yqb44Go44GX44Gm44Ko44Op44O86KOc5q2j44KS5a6f6KGMDQpgYGANCg0KIyMgVzIuNCDntZDmnpzjga7norroqo0NCuOAgGBoZWFkYOmWouaVsOOBr+OAgeihjOWIl+OBruWgtOWQiOOBr+acgOWIneOBrjbooYzliIbjgIHjg5njgq/jg4jjg6vjgoTjg6rjgrnjg4jjga7loLTlkIjjga/jgIHmnIDliJ3jga4244Gk5YiG44Gu6KaB57Sg44KS5Ye65Yqb44GX44G+44GZ44CC44Gk44G+44KK44OH44OV44Kp44Or44OI44GvYG4gPSA2YOOBp+OBmeOAguOBk+OBk+OBp+OBr2BuID0gMmDjgqrjg5fjgrfjg6fjg7PjgpLjgaTjgZHjgablhYjjgbvjganjga5gZGFkYWDplqLmlbDlrp/ooYzntZDmnpzvvIhgZGFkYUZzYOOBiuOCiOOBs2BkYWRhUnNg77yJ44Gu5Lit6Lqr44KS5pyA5Yid44GuMuOCteODs+ODl+ODq+WIhuOBq+mZkOWumuOBl+OBpueiuuiqjeOBl+OBpuOBhOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpoZWFkKGRhZGFGcywgbiA9IDIpICAgICAgICAgICAgICAgICAgICAgICAjIGRhZGFGc+S4reOBruacgOWIneOBrjLjgaTjgpLnorroqo0NCmhlYWQoZGFkYVJzLCBuID0gMikgICAgICAgICAgICAgICAgICAgICAgICMgZGFkYVJz5Lit44Gu5pyA5Yid44GuMuOBpOOCkueiuuiqjQ0KYGBgDQoNCiMjIFcyLjUg44Om44OL44O844Kv6YWN5YiX5pWw44KS56K66KqNDQrjgIBXMS42LjPjgaflrprnvqnjgZfjgZ/oh6rkvZzplqLmlbBgZ2V0VW5pTnVtYOOCkuOBk+OBk+OBp+aUueOCgeOBpuWGjeWumue+qeOBl+OBpuOAgWBkYWRhYOmWouaVsOWun+ihjOW+jOOBq+ODpuODi+ODvOOCr+mFjeWIl+OBruaVsOOBjOOBqeOCjOOBoOOBkea4m+OBo+OBpuOBhOOCi+OBi+OCkueiuuiqjeOBl+OBvuOBmeOAguOBk+OBk+OBruaVsOWApOOBjOihqDLjga7jg6bjg4vjg7zjgq/phY3liJfmlbDjga7ln7rnpI7mg4XloLHjgajjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZ2V0VW5pTnVtIDwtIGZ1bmN0aW9uKHgpIGxlbmd0aChnZXRVbmlxdWVzKHgpKSMg44Om44OL44O844Kv6YWN5YiX5pWw44KS5b6X44KL44Gf44KB44Gu6Zai5pWw44KS5a6a576pDQpzYXBwbHkoZGFkYUZzLCBnZXRVbmlOdW0pICAgICAgICAgICAgICAgICAjIGRhZGFGc+S4reOBruOCteODs+ODl+ODq+OBlOOBqOOBruODpuODi+ODvOOCr+mFjeWIl+aVsOOCkueiuuiqjQ0Kc2FwcGx5KGRhZGFScywgZ2V0VW5pTnVtKSAgICAgICAgICAgICAgICAgIyBkYWRhUnPkuK3jga7jgrXjg7Pjg5fjg6vjgZTjgajjga7jg6bjg4vjg7zjgq/phY3liJfmlbDjgpLnorroqo0NCmBgYA0KDQojIyBXMi42IOODquODvOODieaVsOOCkueiuuiqjQ0K44CAVzEuNi4z44Gu6Ieq5L2c6Zai5pWwYGdldFVuaU51bWDjga/jg6bjg4vjg7zjgq/phY3liJfmlbDjgpLlvpfjgovjgZ/jgoHjga7jgoLjga7jgafjgZfjgZ/jgYzjgIFgbGVuZ3RoYOmWouaVsOmDqOWIhuOCkmBzdW1g6Zai5pWw44Gr572u44GN5o+b44GI44KL44GT44Go44Gn44CB44Oq44O844OJ5pWw44KS5b6X44KL44Gf44KB44Gu6Zai5pWw44Gr5pu444GN5pu/44GI44KL44GT44Go44GM44Gn44GN44G+44GZ44CC44GT44GT44Gn44Gv44CB44Gd44KM44KSYGdldFJlYWROdW1g44Go44GE44GG6Ieq5L2c6Zai5pWw44Go44GX44Gm5a6a576p44GX44Gm44GE44G+44GZ44CC44GT44GT44Gu5pWw5YCk44GM6KGoMuOBruODquODvOODieaVsOOBruWfuuekjuaDheWgseOBqOOBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpnZXRSZWFkTnVtIDwtIGZ1bmN0aW9uKHgpIHN1bShnZXRVbmlxdWVzKHgpKSMg44Oq44O844OJ5pWw44KS5b6X44KL44Gf44KB44Gu6Zai5pWw44KS5a6a576pDQpzYXBwbHkoZGFkYUZzLCBnZXRSZWFkTnVtKSAgICAgICAgICAgICAgICAjIGRhZGFGc+S4reOBruOCteODs+ODl+ODq+OBlOOBqOOBruODquODvOODieaVsOOCkueiuuiqjQ0Kc2FwcGx5KGRhZGFScywgZ2V0UmVhZE51bSkgICAgICAgICAgICAgICAgIyBkYWRhUnPkuK3jga7jgrXjg7Pjg5fjg6vjgZTjgajjga7jg6rjg7zjg4nmlbDjgpLnorroqo0NCmBgYA0KDQojIyBXMi43IOODpuODi+ODvOOCr+mFjeWIl+OBruWHuuePvumgu+W6pg0K44CA56ysMjPlm57jga7lm7My44Gn44KC56S644GV44KM44Gm44GE44KL44KI44GG44Gr44CBZGFkYTLjga/lh7rnj77poLvluqbjga7lsJHjgarjgYTjg6bjg4vjg7zjgq/phY3liJfjgpLop6PmnpDjga7pgY7nqIvjgafpmaTljrvjgZfjgb7jgZnjgILjgZ3jgozjgpLnorrjgYvjgoHjgovjgbnjgY/jgIFgZGFkYWDplqLmlbDlrp/ooYzntZDmnpzvvIhgZGFkYUZzYOOBqGBkYWRhUnNg77yJ44Gr5a++44GX44Gm44CB44Om44OL44O844Kv6YWN5YiX44GU44Go44Gu5Ye654++6aC75bqm44Gu5Li744Gr5LiL5L2N44KS56K66KqN44GX44G+44GZ44CC5Lul5YmN6KGM44Gj44GfVzEuNi4y44Gu44K544Kv44Oq44OX44OI44KS5Y+C6ICD44Gr44GX44Gm44GE44G+44GZ44CCDQoNCiMjIyBXMi43LjEg5Ye654++6aC75bqm44Gu5LiK5L2NDQrjgIDjgb7jgZrjga8x55Wq55uu44Gu44K144Oz44OX44Or77yI44K144Oz44OX44OrSUTvvJpTUlI2MzI1ODEz77yJ44Gr5a++44GX44Gm44CB5LiK5L2NNOOBpOOCkuecuuOCgeOBvuOBmeOAgjHjgaQx44Gk44Gu44Oq44O844OJ44GM6ZW344GE44Gu44Gn6KaL44Gl44KJ44GE44GL44Go5oCd44GE44G+44GZ44GM44CBMeeVquWkmuOBhOOBruOBr2ByIGdldFVuaXF1ZXMoZGFkYUZzW1sxXV0pWzFdYOWAi+OAgTLnlarnm67jgavlpJrjgYTjga7jga9gciBnZXRVbmlxdWVzKGRhZGFGc1tbMV1dKVsyXWDlgIvjgajop6Pph4jjgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaGVhZChnZXRVbmlxdWVzKGRhZGFGc1tbMV1dKSwgbiA9IDQpICAgICAgIyBkYWRhRnPkuK3jga4x55Wq55uu44Gu6KaB57Sg44Gr5a++44GX44Gm44CB44Om44OL44O844Kv6YWN5YiX44Gu5pyA5Yid44GuNOOBpO+8iOWhqeWfuumFjeWIl+OBqOWHuuePvumgu+W6pu+8ieOCkueiuuiqjQ0KYGBgDQoNCiMjIyBXMi43LjIg5Ye654++6aC75bqm44Gu5LiL5L2NDQrjgIDmrKHjgavjgIHkuIvkvY0044Gk44KS56K66KqN44GX44G+44GZ44CC44GV44GN44G744Gp44GuYGhlYWRg6Zai5pWw44Gu57WQ5p6c44GL44KJ44CBYGdldFVuaXF1ZXNg6Zai5pWw5a6f6KGM57WQ5p6c44Gv5Ye654++6aC75bqm44Gn44K944O844OI44GV44KM44Gm44GE44KL44KC44Gu44Gg44Go5oCd44Gj44Gm44GE44G+44GX44Gf44GM44CB44Gd44GG44Gv44Gq44Gj44Gm44GE44Gq44GE44GT44Go44GM44KP44GL44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnRhaWwoZ2V0VW5pcXVlcyhkYWRhRnNbWzFdXSksIG4gPSA0KSAgICAgICMgZGFkYUZz5Lit44GuMeeVquebruOBruimgee0oOOBq+WvvuOBl+OBpuOAgeODpuODi+ODvOOCr+mFjeWIl+OBruacgOW+jOOBrjTjgaTvvIjloanln7rphY3liJfjgajlh7rnj77poLvluqbvvInjgpLnorroqo0NCmBgYA0KDQrjgIDjgZPjga7jgojjgYbjgarloLTlkIjjga/jgIHkvovjgYjjgbBXMS42LjHjgarjganjgpLlj4LogIPjgavjgZfjgabjgIHoh6rliIbjgafpmY3poIbvvIjlpJogJFxyaWdodGFycm93JCDlsJHvvInjgavjgr3jg7zjg4jjgZfjgabjgYvjgonjgIHmlLnjgoHjgaZgdGFpbGDplqLmlbDjgpLlrp/ooYzjgZnjgovjgarjganjgZfjgablr77lh6bjgZfjgb7jgZnjgIJXMS42LjLjga7mmYLngrnjgafjga/jgIHjgZPjga7jgrXjg7Pjg5fjg6vvvIhgZGFkYUZzW1sxXV1g77yJ44Gv5Ye654++6aC75bqm44GMMeWbnuOBruOCguOBruOBjOWtmOWcqOOBl+OBvuOBl+OBn+OBjOOAgWBkYWRhYOmWouaVsOWun+ihjOW+jOOBr+OBquOBj+OBquOBo+OBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpob2dlIDwtIHNvcnQoZ2V0VW5pcXVlcyhkYWRhRnNbWzFdXSksIGRlY3JlYXNpbmcgPSBUKSAjIGRhZGFGc+S4reOBrjHnlarnm67jga7opoHntKDjgavlr77jgZfjgabjgIHjg6bjg4vjg7zjgq/phY3liJfjga7lh7rnj77poLvluqbjgYzlpJrjgYTpoIbjgavjgr3jg7zjg4jjgZfjgZ/ntZDmnpzjgpJob2dl44Gr5qC857SNDQp0YWlsKGhvZ2UsIG4gPSA0KSAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XkuK3jga7mnIDlvozjga4044Gk44Gu44KS56K66KqNDQpgYGANCg0K44CA44GT44GT44Gn55+l44KK44Gf44GE44GT44Go44Gv44CB5Li744Gr5Ye654++6aC75bqm44GM5pyA5bCP44Gu44KC44Gu44GMMeOBp+OBr+OBquOBj+OBquOBo+OBpuOBhOOCi+OBi+OBqeOBhuOBi+OBp+OBmeOAguOBneOCjOOChuOBiOOAgeS+i+OBiOOBsOS7peS4i+OBruOCiOOBhuOBquaEn+OBmOOBp+OAgWBtaW5g6Zai5pWw44KS55So44GE44Gm5Ye654++6aC75bqm44Gu5pyA5bCP5YCk44Gu44G/44KS5b6X44KL44Gf44KB44GuYGdldE1pbk51bWDplqLmlbDjgpLoh6rkvZzjgZfjgb7jgZnjgIJXMS42LjPjgIFXMi4144CB44GK44KI44GzVzIuNuOCkuWPguiAg+OBq+OBl+OBpuOBhOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpnZXRNaW5OdW0gPC0gZnVuY3Rpb24oeCkgbWluKGdldFVuaXF1ZXMoeCkpIyDlh7rnj77poLvluqbjga7mnIDlsI/lgKTjgpLlvpfjgovjgZ/jgoHjga7plqLmlbDjgpLlrprnvqkNCmBgYA0KDQrjgIDjgYLjgajjga/jgIFXMi4144KEVzIuNuOBqOWQjOOBmOOCiOOBhuOBq+OBl+OBpmBkYWRhYOmWouaVsOWun+ihjOe1kOaenO+8iGBkYWRhRnNg44GoYGRhZGFSc2DvvInjgpLlhaXlipvjgajjgZfjgablrp/ooYzjgZnjgozjgbDjgojjgYTjgafjgZnjgIJGb3J3YXJk5YG0UmV2ZXJzZeWBtOWQq+OCgeWFqOOCteODs+ODl+ODq+OBpzLjgavjgarjgaPjgabjgYTjgovjgZPjgajjgYvjgonjgIHnorrjgYvjgatkYWRhMuOBr+WHuuePvumgu+W6puOBjDLku6XkuIrjgYLjgovjg6rjg7zjg4njga7jgb/jgavpmZDlrprjgZfjgabjgYTjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc2FwcGx5KGRhZGFGcywgZ2V0TWluTnVtKSAgICAgICAgICAgICAgICAgIyBkYWRhRnPkuK3jga7jgrXjg7Pjg5fjg6vjgZTjgajjga7jg6rjg7zjg4nmlbDjga7mnIDlsI/lgKTjgpLlj5blvpcNCnNhcHBseShkYWRhUnMsIGdldE1pbk51bSkgICAgICAgICAgICAgICAgICMgZGFkYVJz5Lit44Gu44K144Oz44OX44Or44GU44Go44Gu44Oq44O844OJ5pWw44Gu5pyA5bCP5YCk44KS5Y+W5b6XDQpgYGANCg0KIyBXMyDph43opIfpmaTljrsNCuOAgOOBk+OBk+OBp+OBr+OBvuOBmuOAgWBtZXJnZVBhaXJzYOmWouaVsOOCkueUqOOBhOOBpkZvcndhcmTjgahSZXZlcnNl44Gu44Kq44O844OQ44O844Op44OD44OX6aCY5Z+f44Gu44Oe44O844K477yI6YeN6KSH6aCY5Z+f44Gu6Zmk5Y6777yJ44KS6KGM44GE44G+44GZ44CC44GT44Gu5L2c5qWt44Gv44K144Oz44OX44Or44GU44Go44Gr6KGM44KP44KM44KL44Gf44KB44CB5b6X44KJ44KM44Gf44Om44OL44O844Kv6YWN5YiX77yIQVNW77yJ44Gu5LiA6YOo44Gv44K144Oz44OX44Or6ZaT44Gn6YeN6KSH44GX44G+44GZ44CC44Gd44Gu44Gf44KB44CBYG1ha2VTZXF1ZW5jZVRhYmxlYOmWouaVsOOCkueUqOOBhOOBpuino+aekOWvvuixoeOBruioiDEy44K144Oz44OX44Or5YWo5L2T44GnQVNW44Gu6YeN6KSH6Zmk5Y6744KS6KGM44GE44G+44GZ44CC44GT44KM44Gv44CB5ZKM6ZuG5ZCI44KS5b6X44KL44Kk44Oh44O844K444Gr44Gq44KK44G+44GZ44CCDQoNCiMjIFczLjEgYG1lcmdlUGFpcnNg6Zai5pWwDQrjgIBgbWVyZ2VQYWlyc2DplqLmlbDjga/jgIFgZGFkYWDplqLmlbDlrp/ooYzntZDmnpzjga4y44Gk44Gu44Kq44OW44K444Kn44Kv44OI77yIYGRhZGFGc2DjgahgZGFkYVJzYO+8ieOAgeOBiuOCiOOBs2BmaWx0ZXJBbmRUcmltYOmWouaVsOWun+ihjOe1kOaenOOBrjLjgaTjga7jgqrjg5bjgrjjgqfjgq/jg4jvvIhgZmlsdEZzYOOBqGBmaWx0UnNg77yJ44KS5YWl5Yqb44Go44GX44Gm44CB44Oa44Ki4oCV44OJ44Ko44Oz44OJ44Oq44O844OJ44Gu44Oe44O844K444KS5a6f6KGM44GX44G+44GZ44CC44GT44GT44Gn44Gv44OH44OV44Kp44Or44OI44Gu44Kq44OX44K344On44Oz44KS5piO56S644GX44Gm44GE44G+44GZ44GM44CBRm9yd2FyZOWBtOOBqFJldmVyc2XlgbTjgacxMuWhqeWfuuS7peS4iuOBruOCquODvOODkOODvOODqeODg+ODl+OBjOOBguOCiu+8iGBtaW5PdmVybGFwID0gMTJg77yJ44CB44GL44Gk44Kq44O844OQ44O844Op44OD44OX6aCY5Z+f44Gu44Of44K544Oe44OD44OB44GM44Gq44GE77yIYG1heE1pc21hdGNoID0gMGDvvInjgajjgYTjgYbmnaHku7bjgafjg57jg7zjgrjjgYzlrp/ooYzjgZXjgozjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPVRSVUUsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQptZXJnZXJzIDwtIG1lcmdlUGFpcnMoICAgICAgICAgICAgICAgICAgICAjIOODmuOCouKAleODieOCqOODs+ODieOBruODnuODvOOCuOOCkuWun+ihjOOBl+OAgee1kOaenOOCkm1lcmdlcnPjgavmoLzntI0NCiAgZGFkYUYgPSBkYWRhRnMsICAgICAgICAgICAgICAgICAgICAgICAgICMg44Ko44Op44O86KOc5q2j5b6M44GuRm9yd2FyZOWBtOOBr2RhZGFGcw0KICBkZXJlcEYgPSBmaWx0RnMsICAgICAgICAgICAgICAgICAgICAgICAgIyBRQ+W+jOOBrkZvcndhcmTlgbTjga9maWx0RnMNCiAgZGFkYVIgPSBkYWRhUnMsICAgICAgICAgICAgICAgICAgICAgICAgICMg44Ko44Op44O86KOc5q2j5b6M44GuUmV2ZXJzZeWBtOOBr2RhZGFScw0KICBkZXJlcFIgPSBmaWx0UnMsICAgICAgICAgICAgICAgICAgICAgICAgIyBRQ+W+jOOBrlJldmVyc2XlgbTjga9maWx0UnMNCiAgbWluT3ZlcmxhcCA9IDEyLCAgICAgICAgICAgICAgICAgICAgICAgICMg44Kq44O844OQ44O844Op44OD44OX44Gu6Za+5YCk44GvMTLloanln7rku6XkuIoNCiAgbWF4TWlzbWF0Y2ggPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICMg44Kq44O844OQ44O844Op44OD44OX6aCY5Z+f44Gu6Kix5a6544Of44K544Oe44OD44OB5pWw44GvMA0KICB2ZXJib3NlID0gVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIyDntZDmnpzjgpLlhpfplbfjgavooajnpLrjgZnjgovvvIjopoHjga/nlLvpnaLjgavjgoLlh7rlipvjgZvjgojjgajjgYTjgYbmjIfku6TvvIkNCikNCmBgYA0KDQojIyBXMy4yIOOCteODs+ODl+ODq+OBlOOBqOOBrue1kOaenA0K44CA44GT44GT44Gn44Gv44CBYG1lcmdlUGFpcnNg6Zai5pWw5a6f6KGM57WQ5p6c44Go44GX44Gm5b6X44KJ44KM44GfYG1lcmdlcnNg44Kq44OW44K444Kn44Kv44OI44Gu5Lit6Lqr44KS56K66KqN44GX44G+44GZ44CCYG1lcmdlcnNbWzFdXWDjgYwx55Wq55uu44Gu44K144Oz44OX44Or44Gu57WQ5p6c44CBYG1lcmdlcnNbWzJdXWDjgYwy55Wq55uu44Gu44K144Oz44OX44Or44Gu57WQ5p6c44CBLi4u44CBYG1lcmdlcnNbWzEyXV1g44GMMTLnlarnm67jga7jgrXjg7Pjg5fjg6vjga7ntZDmnpzjgavjgarjgorjgb7jgZnjgIINCg0KIyMjIFczLjIuMSDntZDmnpzjga7mpoLopoHjgpLnorroqo0NCuOAgDHnlarnm67jga7jgrXjg7Pjg5fjg6vvvIhTUlI2MzI1ODEz77yJ44GuRm9yd2FyZOOBqFJldmVyc2XjgpLjg57jg7zjgrjjgZfjgZ/ntZDmnpzjgavjgaTjgYTjgabjgIFgaGVhZGDplqLmlbDjgafmnIDliJ3jga426YWN5YiX5YiG44Gu57WQ5p6c44KS56S644GX44G+44GZ44CC5YmN5Y2K6YOo5YiG44Gn6KaL44GI44Gm44GE44KL44Gu44Gv44CB44Oe44O844K45b6M44Gu5aGp5Z+66YWN5YiX77yI44Kz44Oz44OG44Kj44Kw77yJ44Gn44GZ44CC5b6M5Y2K6YOo5YiG44Gn6KGM5YiX44Gj44G944GP6KaL44GI44Gm44GE44KL44Gu44Gv44CBYWJ1bmRhbmNl5YiX44GM44Kz44Oz44OG44Kj44Kw44Gu5Ye654++6aC75bqm44CBZm9yd2FyZOWIl+OBjGBkYWRhRnNg44Kq44OW44K444Kn44Kv44OI5Lit44Gu6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K577yI5L2V55Wq55uu44Gu6YWN5YiX44GL44Go44GE44GG5oOF5aCx77yJ44CBcmV2ZXJzZeWIl+OBjGBkYWRhUnNg44Kq44OW44K444Kn44Kv44OI5Lit44Gu6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K544CBbm1hdGNo5YiX44GM5LiA6Ie05aGp5Z+65pWw44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmhlYWQobWVyZ2Vyc1tbMV1dKSAgICAgICAgICAgICAgICAgICAgICAgICMgbWVyZ2Vyc+S4reOBrjHnlarnm67jga7opoHntKAo44K144Oz44OX44OrKeOBq+OBpOOBhOOBpuOAgeacgOWIneOBrjbjgaTjgpLnorroqo0NCmBgYA0KDQojIyMgVzMuMi4yIOaJi+S9nOalreOBp+ODnuODvOOCuA0K44CA44Gp44Gu44KI44GG44Gq44Oe44O844K444GM5a6f6Zqb44Gr6KGM44KP44KM44Gm44GE44KL44Gu44GL44KS56K66KqN44GZ44G544GP44CB5LiK6KiY44Gu57WQ5p6c44GnYWJ1bmRhbmNl44GMYHIgbWVyZ2Vyc1tbMV1dJGFidW5kYW5jZVs1XWDlgIvjga4155Wq55uu44Gu6YWN5YiX44KS5L6L44Go44GX44Gm56S644GX44G+44GZ44CC44G+44Ga44CB5YWl5Yqb6YWN5YiX44GuRm9yd2FyZOWBtOOBr2BkYWRhRnNg44Kq44OW44K444Kn44Kv44OI5Lit44GuYHIgbWVyZ2Vyc1tbMV1dJGZvcndhcmRbNV1g55Wq55uu44Gu6YWN5YiX44CBUmV2ZXJzZeWBtOOBr2BkYWRhUnNg44Kq44OW44K444Kn44Kv44OI5Lit44GuYHIgbWVyZ2Vyc1tbMV1dJHJldmVyc2VbNV1g55Wq55uu44Gu6YWN5YiX44Gg44Go6Kej6YeI44GX44G+44GZ44CC44Gk44G+44KK44CB5Lul5LiL44GuMuOBpOOBjOODnuODvOOCuOWJjeOBrumFjeWIl+OBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpkYWRhRnNbWzFdXSRzZXF1ZW5jZVs1XSAgICAgICAgICAgICAgICAgICAjIGRhZGFGc+S4reOBrjHnlarnm67jga7jgrXjg7Pjg5fjg6vkuK3jga4155Wq55uu44Gu5aGp5Z+66YWN5YiX44KS56K66KqNDQpkYWRhUnNbWzFdXSRzZXF1ZW5jZVs2XSAgICAgICAgICAgICAgICAgICAjIGRhZGFSc+S4reOBrjHnlarnm67jga7jgrXjg7Pjg5fjg6vkuK3jga4255Wq55uu44Gu5aGp5Z+66YWN5YiX44KS56K66KqNDQpgYGANCg0K44CA44GT44KM44KJ44Gu6YWN5YiX6ZW344Gv44CBVzEuM+OBp+OCguaMh+WumuOBl+OBpuOBhOOBvuOBmeOBjOOAgUZvcndhcmTlgbTjgYxgciBuY2hhcihkYWRhRnNbWzFdXSRzZXF1ZW5jZVs1XSlgIGJw44CBUmV2ZXJzZeWBtOOBjGByIG5jaGFyKGRhZGFSc1tbMV1dJHNlcXVlbmNlWzZdKWAgYnDjgafjgZnjgIJXMy4y44Gubm1hdGNo5YiX44GuNeeVquebruOCkuecuuOCgeOCi+OBqOOAgeOCquODvOODkOODvOODqeODg+ODl++8iOS4gOiHtO+8ieWhqeWfuuaVsOOBjGByIG1lcmdlcnNbWzFdXSRubWF0Y2hbNV1g5YCL44Gg44Go44GE44GG44GT44Go44GM5YiG44GL44KK44G+44GZ44CC44GT44Gu44GT44Go44GL44KJ44CB44Oa44Ki4oCV44OJ44Ko44Oz44OJ44Gu44Oe44O844K444Gr44KI44Gj44Gm44CBYHIgbmNoYXIoZGFkYUZzW1sxXV0kc2VxdWVuY2VbNV0pYCBicOOBguOCi0ZvcndhcmTlgbTjga7jg6rjg7zjg4njga7lj7PlgbTjgavjgIFSZXZlcnNl5YG044GuNSfnq6/jga4oYHIgbmNoYXIoZGFkYVJzW1sxXV0kc2VxdWVuY2VbNl0pYCAtIGByIG1lcmdlcnNbWzFdXSRubWF0Y2hbNV1gKSA9IGByIG5jaGFyKGRhZGFSc1tbMV1dJHNlcXVlbmNlWzZdKSAtIG1lcmdlcnNbWzFdXSRubWF0Y2hbNV1gIGJw5YiG44Gg44GR6L+95Yqg44GV44KM44Gf44Gu44Gg44KN44GG44Go6Kej6YeI44GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCm5jaGFyKGRhZGFGc1tbMV1dJHNlcXVlbmNlWzVdKSAgICAgICAgICAgICMgZGFkYUZz5Lit44GuMeeVquebruOBruOCteODs+ODl+ODq+S4reOBrjXnlarnm67jga7loanln7rphY3liJfjga7mloflrZfmlbAo6YWN5YiX6ZW3KeOCkueiuuiqjQ0KbmNoYXIoZGFkYVJzW1sxXV0kc2VxdWVuY2VbNl0pICAgICAgICAgICAgIyBkYWRhUnPkuK3jga4x55Wq55uu44Gu44K144Oz44OX44Or5Lit44GuNueVquebruOBruWhqeWfuumFjeWIl+OBruaWh+Wtl+aVsCjphY3liJfplbcp44KS56K66KqNDQpgYGANCg0K44CA44Gf44Gg44GX44CB5a6f6Zqb44Gr44Oe44O844K444GV44KM44KL44Gu44Gv44CBUmV2ZXJzZeWBtOOBrumFjeWIl+OBrumAhuebuOijnOmOlu+8iHJldmVyc2UgY29tcGxlbWVudO+8ieOBrjMn56uv5YG044GuYHIgbmNoYXIoZGFkYVJzW1sxXV0kc2VxdWVuY2VbNl0pIC0gbWVyZ2Vyc1tbMV1dJG5tYXRjaFs1XWAgYnDliIbjgaDjgajjgYTjgYbngrnjgavms6jmhI/jgYzlv4XopoHjgafjgZnjgIJgcmNg6Zai5pWw44KS5Yip55So44GZ44KM44Gw44CB6YCG55u46KOc6Y6W44KS5b6X44KL44GT44Go44GM44Gn44GN44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnJjKGRhZGFSc1tbMV1dJHNlcXVlbmNlWzZdKSAgICAgICAgICAgICAgICMgZGFkYVJz5Lit44GuMeeVquebruOBruOCteODs+ODl+ODq+S4reOBrjbnlarnm67jga7loanln7rphY3liJfjga7pgIbnm7joo5zpjpbjgpLnorroqo0NCmBgYA0KDQojIyMgVzMuMi4zIOODquODvOODieaVsOOCkueiuuiqjQ0K44CAVzIuNuOBp+iHquS9nOOBl+OBn+ODquODvOODieaVsOOCkuW+l+OCi+OBn+OCgeOBrumWouaVsGBnZXRSZWFkTnVtYOOCkuOBk+OBk+OBp+aUueOCgeOBpuWumue+qeOBl+OAgVczLjHjgaflvpfjgZ9gbWVyZ2VQYWlyc2DplqLmlbDlrp/ooYzntZDmnpzjgafjgYLjgotgbWVyZ2Vyc2Djgqrjg5bjgrjjgqfjgq/jg4jjgpLlhaXlipvjgajjgZfjgablrp/ooYzjgZfjgb7jgZnjgILjgZPjgZPjga7mlbDlgKTjgYzooagz44Gu44Oq44O844OJ5pWw44Gu5Z+656SO5oOF5aCx44Go44Gq44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmdldFJlYWROdW0gPC0gZnVuY3Rpb24oeCkgc3VtKGdldFVuaXF1ZXMoeCkpIyDjg6rjg7zjg4nmlbDjgpLlvpfjgovjgZ/jgoHjga7plqLmlbDjgpLlrprnvqkNCnNhcHBseShtZXJnZXJzLCBnZXRSZWFkTnVtKSAgICAgICAgICAgICAgICMgbWVyZ2Vyc+S4reOBruOCteODs+ODl+ODq+OBlOOBqOOBruODquODvOODieaVsOOCkueiuuiqjQ0KYGBgDQoNCiMjIyBXMy4yLjQg44Om44OL44O844Kv6YWN5YiX5pWw44KS56K66KqNDQrjgIBXMi4144Gn6Ieq5L2c44GX44Gf44Oq44O844OJ5pWw44KS5b6X44KL44Gf44KB44Gu6Zai5pWwYGdldFVuaU51bWDjgpLjgZPjgZPjgafmlLnjgoHjgablrprnvqnjgZfjgIFXMy4x44Gn5b6X44GfYG1lcmdlUGFpcnNg6Zai5pWw5a6f6KGM57WQ5p6c44Gn44GC44KLYG1lcmdlcnNg44Kq44OW44K444Kn44Kv44OI44KS5YWl5Yqb44Go44GX44Gm5a6f6KGM44GX44G+44GZ44CC44GT44GT44Gu5pWw5YCk44GM6KGoM+OBruODpuODi+ODvOOCr+mFjeWIl+aVsOOBruWfuuekjuaDheWgseOBqOOBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpnZXRVbmlOdW0gPC0gZnVuY3Rpb24oeCkgbGVuZ3RoKGdldFVuaXF1ZXMoeCkpIyDjg6bjg4vjg7zjgq/phY3liJfmlbDjgpLlvpfjgovjgZ/jgoHjga7plqLmlbDjgpLlrprnvqkNCnNhcHBseShtZXJnZXJzLCBnZXRVbmlOdW0pICAgICAgICAgICAgICAgICAgICAjIOOCteODs+ODl+ODq+OBlOOBqOOBruODpuODi+ODvOOCr+mFjeWIl+aVsA0KYGBgDQoNCg0KIyMgVzMuMyDjgrXjg7Pjg5fjg6vlhajkvZPjga7ntZDmnpwNCuOAgOOBleOBjeOBu+OBqeW+l+OBn+ODpuODi+ODvOOCr+mFjeWIl+OBruaVsOOBr+OAgeOCteODs+ODl+ODq+OBlOOBqOOBq+W+l+OBn+OCguOBruOBp+OBmeOAguOBneOCjOOChuOBiOOAgeioiDEy44K144Oz44OX44Or5YWo5L2T44Gn44G/44KL44Go44CB44G+44Gg6YeN6KSH44GM5ZCr44G+44KM44G+44GZ44CC44GT44GT44Gn44Gv44CB44K144Oz44OX44Or44GU44Go44Gn44Gv44Gq44GP44CB44K144Oz44OX44Or5YWo5L2T44Gn44Gu44Om44OL44O844Kv6YWN5YiX5pWw44Gu5oOF5aCx44KS5b6X44KL44GT44Go44KS55uu55qE44Go44GX44G+44GZ44CCDQoNCiMjIyBXMy4zLjEgYGdldFNlcXVlbmNlc2DplqLmlbANCuOAgGBnZXRTZXF1ZW5jZXNg6Zai5pWw44Gv44CB5YWl5Yqb44Kq44OW44K444Kn44Kv44OI44GL44KJ44CB77yI5aGp5Z+677yJ6YWN5YiX44KS44OZ44Kv44OI44Or44Go44GX44Gm5oq95Ye644GX44Gf57WQ5p6c44KS6L+U44GX44G+44GZ44CCVzMuMi4x44Gn5qaC6KaB44KS56K66KqN44GX44G+44GX44Gf44GM44CBVzMuMeOBp+W+l+OBn2BtZXJnZXJzYOOCquODluOCuOOCp+OCr+ODiOOBq+OBr+OAgeioiDEy44K144Oz44OX44Or44Gu44Oa44Ki4oCV44OJ44Ko44Oz44OJ44Gu44Oe44O844K45b6M44Gu44Om44OL44O844Kv6YWN5YiX44Gg44GR44Gn44Gq44GP44CB44Gd44Gu5Ye654++6aC75bqm44Gq44Gp5qeY44CF44Gq5oOF5aCx44GM5qC857SN44GV44KM44Gm44GE44G+44GZ44CC44Gd44KM44KG44GI44CB44G+44Ga44GvYG1lcmdlcnNg44Kq44OW44K444Kn44Kv44OI5YaF44Gu5aGp5Z+66YWN5YiX5oOF5aCx44Gu44G/44KSYGdldFNlcXVlbmNlc2DplqLmlbDjgpLnlKjjgYTjgabmir3lh7rjgZfjgIHjgZ3jga7ntZDmnpzjgpJgaG9nZWDjgqrjg5bjgrjjgqfjgq/jg4jjgavmoLzntI3jgZfjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaG9nZSA8LSBzYXBwbHkobWVyZ2VycywgZ2V0U2VxdWVuY2VzKSAgICAgIyBtZXJnZXJz5Lit44Gu44K144Oz44OX44Or44GU44Go44Gu5aGp5Z+66YWN5YiX44KSaG9nZeOBq+agvOe0jQ0KYGBgDQoNCiMjIyBXMy4zLjIgYGNsYXNzYOmWouaVsA0K44CA5b6X44KJ44KM44GfYGhvZ2Vg44Kq44OW44K444Kn44Kv44OI44Gv44CB44K144Oz44OX44Or44GU44Go44Gr5YiH44KK5YiG44GR44KJ44KM44Gf44Oq44K544OI5b2i5byP44Gu44Kq44OW44K444Kn44Kv44OI44Gn44GC44KL44GT44Go44GM44CB44Gd44KM44KS56K66KqN44GZ44KL44Gf44KB44GuYGNsYXNzYOmWouaVsOWun+ihjOe1kOaenOOBi+OCieOCj+OBi+OCiuOBvuOBmeOAguOBpOOBvuOCiuOAgeihqOekuue1kOaenOOBjCJsaXN0IuOBq+OBquOBo+OBpuOBhOOCjOOBsOOAgeOBneOCjOOBr+ODquOCueODiOW9ouW8j+OBruOCquODluOCuOOCp+OCr+ODiOOBoOOBqOOBhOOBhuOBk+OBqOOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjbGFzcyhob2dlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2Xjgqrjg5bjgrjjgqfjgq/jg4jjga7jgq/jg6njgrnjgpLnorroqo0NCmBgYA0KDQojIyMgVzMuMy4zIGB1bmxpc3Rg44GoYGlzLnZlY3RvcmDplqLmlbANCuOAgFcxLjYuNeOBp+OCguS9v+OBhOOBvuOBl+OBn+OBjOOAgeODquOCueODiOW9ouW8j+OCkuODmeOCr+ODiOODq+W9ouW8j+OBq+WkieaPm+OBl+OBn+OBhOWgtOWQiOOBq+OBr+OAgWB1bmxpc3Rg6Zai5pWw44KS5Yip55So44GX44G+44GZ44CC5b6X44KJ44KM44GfYGhvZ2UyYOOCquODluOCuOOCp+OCr+ODiOOBjOODmeOCr+ODiOODq+OBi+WQpuOBi+OCklRSVUUgb3IgRkFMU0Xjgafov5TjgZlgaXMudmVjdG9yYOmWouaVsOWun+ihjOe1kOaenOOBi+OCieOCguOAgeeiuuOBi+OBq+ODmeOCr+ODiOODq+W9ouW8j+OBq+WkieaPm+OBp+OBjeOBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpob2dlMiA8LSB1bmxpc3QoaG9nZSkgICAgICAgICAgICAgICAgICAgICAjIOODquOCueODiOW9ouW8j+OCkuODmeOCr+ODiOODq+W9ouW8j+OBq+WkieaPmw0KaXMudmVjdG9yKGhvZ2UyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyDjg5njgq/jg4jjg6vjgYvlkKbjgYvjgpLooajnpLoNCmBgYA0KDQojIyMgVzMuMy40IGBzYXBwbHlg44Go6Ieq5L2c6Zai5pWwDQrjgIBgaG9nZTJg44OZ44Kv44OI44Or44Gu6KaB57Sg5pWw44Gv44CBVzMuMi4z44Gn5b6X44Gf44K144Oz44OX44Or44GU44Go44Gu44Om44OL44O844Kv6YWN5YiX5pWw44Gu57eP5ZKM44Go5LiA6Ie044GZ44KL44Gv44Ga44Gn44GZ44CC44GT44GT44Gn44Gv56K644GL44Gr44Gd44GG44Gn44GC44KL44GT44Go44KS56K66KqN44GX44Gm44GE44KL44Gg44GR44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmxlbmd0aChob2dlMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaG9nZTLjg5njgq/jg4jjg6vjga7opoHntKDmlbDjgpLnorroqo0NCnN1bShzYXBwbHkobWVyZ2VycywgZ2V0VW5pTnVtKSkgICAgICAgICAgICMgbWVyZ2Vyc+S4reOBruOCteODs+ODl+ODq+OBlOOBqOOBruODpuODi+ODvOOCr+mFjeWIl+aVsOOBrue3j+WSjCjjgaTjgb7jgornt4/jg6rjg7zjg4nmlbAp44KS56K66KqNDQpgYGANCg0KIyMjIFczLjMuNSDjg6bjg4vjg7zjgq/phY3liJfjga7lkozpm4blkIgNCuOAgOOCteODs+ODl+ODq+WFqOS9k+OBruODpuODi+ODvOOCr+mFjeWIl+aVsOOBr+OAgeS7peS4i+OBruOCiOOBhuOBq2B1bmlxdWVg6Zai5pWw44KS5a6f6KGM44GX44Gf5LiK44Gn44CBYGxlbmd0aGDplqLmlbDjgpLlrp/ooYzjgZnjgozjgbDjgojjgYTjgafjgZnjgILjgZPjga5gciBsZW5ndGgodW5pcXVlKGhvZ2UyKSlg44Go44GE44GG5pWw5a2X44Gv44CB44Om44OL44O844Kv6YWN5YiX44Gu5ZKM6ZuG5ZCI77yIdW5pb27vvInjgajjgoLjgYTjgYjjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KbGVuZ3RoKHVuaXF1ZShob2dlMikpICAgICAgICAgICAgICAgICAgICAgIyBob2dlMuODmeOCr+ODiOODq+S4reOBruODpuODi+ODvOOCr+OBquimgee0oOaVsOOCkueiuuiqjQ0KYGBgDQoNCuOAgOS4iuiomOOBruOChOOCiuaWueS7peWkluOBq+OAgWB0YWJsZWDplqLmlbDjgpLnlKjjgYTjgabjg6bjg4vjg7zjgq/phY3liJfjgZTjgajjga7lh7rnj77poLvluqbjgpLoqr/jgbnjgovjgajjgIFgdGFibGVg6Zai5pWw5a6f6KGM57WQ5p6c44Gu6KaB57Sg5pWw44GM44CM44K144Oz44OX44Or5YWo5L2T44Gu44Om44OL44O844Kv6YWN5YiX5pWw44CN44Gr55u45b2T44GZ44KL44GT44Go44KS5Yip55So44GZ44KL44GT44Go44KC44Gn44GN44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmxlbmd0aCh0YWJsZShob2dlMikpICAgICAgICAgICAgICAgICAgICAgICMgaG9nZTLjg5njgq/jg4jjg6vkuK3jga7jg6bjg4vjg7zjgq/jgaropoHntKDmlbDjgpLnorroqo0NCmBgYA0KDQojIyMgVzMuMy42IOODpuODi+ODvOOCr+mFjeWIl+OBruepjembhuWQiA0K44CA44G744G85L2Z6KuH44Gn44GZ44GM44CB44Om44OL44O844Kv6YWN5YiX44Gu5ZKM6ZuG5ZCI77yIdW5pb27vvInjgYzliIbjgYvjgovjgajjgIHoqIgxMuOCteODs+ODl+ODq+WFqOOBpuOBq+WtmOWcqOOBmeOCi+ODpuODi+ODvOOCr+mFjeWIl+OBruaVsO+8iOepjembhuWQiO+8m2ludGVyc2VjdGlvbu+8ieOCguefpeOCiuOBn+OBj+OBquOCi+OBqOaAneOBhOOBvuOBmeOAguOBk+OBk+OBp+OBr+ODpuODi+ODvOOCr+mFjeWIl+OBlOOBqOOBruWHuuePvumgu+W6puOCkuiqv+OBueOCi2B0YWJsZWDplqLmlbDlrp/ooYzntZDmnpzjgYvjgonjgIHlh7rnj77poLvluqbjgYwxMuWbnu+8iOOCteODs+ODl+ODq+aVsOOBruWQiOioiOOBjDEy5YCL44Gg44GL44KJ44Gn44GZ77yJ44Gu44KC44Gu44Gu44G/44KS5oq95Ye644GZ44KL44KE44KK5pa544Gn56S644GX44G+44GZ44CC5a6f6KGM57WQ5p6c44GvYHIgc3VtKHRhYmxlKGhvZ2UyKSA9PSAxMilg5YCL44Gn44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnN1bSh0YWJsZShob2dlMikgPT0gMTIpICAgICAgICAgICAgICAgICAgICMgaG9nZTLjg5njgq/jg4jjg6vkuK3jga7lh7rnj77poLvluqbjgYwxMuWbnuOBruODpuODi+ODvOOCr+mFjeWIl+aVsOOCkueiuuiqjQ0KYGBgDQoNCiMjIyBXMy4zLjcg44K544Kv44Oq44OX44OI44KS5LiA44G+44Go44KBDQrjgIDjg6bjg4vjg7zjgq/phY3liJfjga7lkozpm4blkIjvvIhgciBsZW5ndGgodW5pcXVlKGhvZ2UyKSlg5YCL77yJ44Go56mN6ZuG5ZCI77yIYHIgc3VtKHRhYmxlKGhvZ2UyKSA9PSAxMilg5YCL77yJ44KS5b6X44KL44Gf44KB44Gu44K544Kv44Oq44OX44OI44KS44Gy44Go44G+44Go44KB44Gr44GX44Gf44Gu44GM5Lul5LiL44Gr44Gq44KK44G+44GZ44CC44GT44Gu5LiA6YCj44Gu5rWB44KM44KS55CG6Kej44GX44Gm44GK44GP44Go44CB6Zai5pWw44GM54Sh5pWw44Gr5YWl44KM5a2Q44Gr44Gq44Gj44Gm44GE44Gm44KC44CB44K544OG44OD44OX44OQ44Kk44K544OG44OD44OX44Gn55CG6Kej44GX44Gm44GE44GR44Gw44GE44GE44Gu44Gg44Go5a6J5b+D44Gn44GN44KL44Go5oCd44GE44G+44GZ44CC77yI5pys5b2T44Gv5pyA57WC6KGM44GuMTLjgajjgYTjgYbmlbDlgKTjgoLmsY7nlKjmgKfjga7pq5jjgYTjgoLjga7jgavjgZnjgovjgajjgojjgYTjga7jgafjgZnjgYzjgIHjgZPjgZPjgafjga/opovjgZ/nm67jga7liIbjgYvjgorjgoTjgZnjgYTjgZXjgpLlhKrlhYjjgZfjgabjgYTjgb7jgZnjgILvvIkNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaG9nZSA8LSBzYXBwbHkobWVyZ2VycywgZ2V0U2VxdWVuY2VzKSAgICAgIyBtZXJnZXJz5Lit44Gu44K144Oz44OX44Or44GU44Go44Gu5aGp5Z+66YWN5YiX44KSaG9nZeOBq+agvOe0jQ0KaG9nZTIgPC0gdW5saXN0KGhvZ2UpICAgICAgICAgICAgICAgICAgICAgIyBob2dl44KS44OZ44Kv44OI44Or5b2i5byP44Gr5aSJ5o+b44GX44GmaG9nZTLjgavmoLzntI0NCmxlbmd0aCh1bmlxdWUoaG9nZTIpKSAgICAgICAgICAgICAgICAgICAgICMgaG9nZTLjg5njgq/jg4jjg6vkuK3jga7jg6bjg4vjg7zjgq/jgaropoHntKDmlbAo44Om44OL44O844Kv6YWN5YiX44Gu5ZKM6ZuG5ZCIKeOCkueiuuiqjQ0Kc3VtKHRhYmxlKGhvZ2UyKSA9PSAxMikgICAgICAgICAgICAgICAgICAgIyBob2dlMuODmeOCr+ODiOODq+S4reOBruWHuuePvumgu+W6puOBjDEy5Zue44Gu44Om44OL44O844Kv6YWN5YiX5pWwKOODpuODi+ODvOOCr+mFjeWIl+OBruepjembhuWQiCnjgpLnorroqo0NCmBgYA0KDQojIyBXMy40IGBtYWtlU2VxdWVuY2VUYWJsZWDplqLmlbANCuOAgGBtYWtlU2VxdWVuY2VUYWJsZWDplqLmlbDjga/jgIFgbWVyZ2VQYWlyc2DplqLmlbDlrp/ooYzntZDmnpzjgpLlhaXlipvjgajjgZfjgabjgIHop6PmnpDjgrXjg7Pjg5fjg6vkuK3jga7jg6bjg4vjg7zjgq/phY3liJfjga7lkozpm4blkIjjgpLlvpfjgovjgajjgajjgoLjgavjgIHjganjga7jgrXjg7Pjg5fjg6vjgavjganjga7jg6bjg4vjg7zjgq/phY3liJfjgYzjgYTjgY/jgaTlrZjlnKjjgZnjgovjgYvjgajjgYTjgYbooYzliJfjgpLntZDmnpzjgajjgZfjgabov5TjgZfjgb7jgZnjgILooYzmlbDjga/jgrXjg7Pjg5fjg6vmlbDjgIHliJfmlbDjga/jgrXjg7Pjg5fjg6vlhajkvZPjgafjga7jg6bjg4vjg7zjgq/phY3liJfjga7mlbDjgavjgarjgorjgb7jgZnjgIINCg0KIyMjIFczLjQuMSDjgb7jgZrjga/lrp/ooYwNCuOAgOWFiOOBu+OBqeW+l+OBn2BtZXJnZVBhaXJzYOmWouaVsOWun+ihjOe1kOaenOOBp+OBguOCi2BtZXJnZXJzYOOCquODluOCuOOCp+OCr+ODiOOCkuWFpeWKm+OBqOOBl+OBpuWun+ihjOOBl+OAgee1kOaenOOCkmBzZXF0YWJg44Kq44OW44K444Kn44Kv44OI44Gr5qC857SN44GZ44KL44Go44GT44KN44G+44Gn6KGM44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnNlcXRhYiA8LSBtYWtlU2VxdWVuY2VUYWJsZShtZXJnZXJzKSAgICAgICMgbWVyZ2Vyc+S4reOBruODpuODi+ODvOOCr+mFjeWIl+OBruWSjOmbhuWQiOaDheWgseOCkuWPluW+l+OBl+OAgeOCteODs+ODl+ODq+OBlOOBqOOBruODpuODi+ODvOOCr+mFjeWIl+OBruWHuuePvumgu+W6puOCknNlcXRhYuOBq+agvOe0jQ0KYGBgDQoNCiMjIyBXMy40LjIg57WQ5p6c44Gu5qaC6KaB44KS56K66KqNDQrjgIDntZDmnpzjga/ooYzliJfjgafjgZnjga7jgafjgIHjgb7jgZrjga9gZGltYOmWouaVsOOBp+ihjOaVsOOBqOWIl+aVsOOCkuihqOekuuOBleOBm+OBvuOBmeOAguihjOaVsOOBr2ByIG5yb3coc2VxdGFiKWDjgIHliJfmlbDjga9gciBuY29sKHNlcXRhYilg44Gn44GC44KL44GT44Go44GM44KP44GL44KK44G+44GZ44CC44GT44Gu44GT44Go44GL44KJ44CB5LuK5Zue6Kej5p6Q44GZ44KL6KiIYHIgbnJvdyhzZXF0YWIpYOOCteODs+ODl+ODq+WFqOS9k+OBqOOBl+OBpuOBr+OAgWByIG5jb2woc2VxdGFiKWDlgIvjga7jg6bjg4vjg7zjgq/jgarphY3liJfjgYzlrZjlnKjjgZnjgovjga7jgaDjgajop6Pph4jjgZfjgb7jgZnjgIJXMy4zLjXjgajlkIzjgZjntZDmnpzjgYzlvpfjgonjgozjgabjgYTjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZGltKHNlcXRhYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZXF0YWLjga7ooYzmlbDjgajliJfmlbDjgpLnorroqo0NCmBgYA0KDQojIyMgVzMuNC4zIGByb3dTdW1zYOOBqGBzdW1g6Zai5pWwDQrjgIBgcm93U3Vtc2DplqLmlbDjga/jgIHmlbDlgKTooYzliJfjgpLlhaXlipvjgajjgZfjgabjgIHooYzvvIhyb3fvvInjgZTjgajjga7lkozvvIhzdW3vvInjgpLov5TjgZfjgb7jgZnjgILlvpfjgonjgozjgovntZDmnpzjga9XMy4yLjPjgajlkIzjgZjjgafjgZnjgILlkIzjgZjjg47jg6rjgafooYzliJflhajkvZPjga7nt4/lkozjgpJgc3VtYOmWouaVsOOBp+ioiOeul+OBmeOCi+OBqOOAgeOCteODs+ODl+ODq+WFqOS9k+OBrue3j+ODquODvOODieaVsOOBjOW+l+OCieOCjOOBvuOBmeOAguW+l+OCieOCjOOCi+e1kOaenO+8iGByIHN1bShzZXF0YWIpYOWAi++8ieOBr+ihqDJi44Gu44Oe44O844K45b6M44Gu44Oq44O844OJ5pWw44Gu57eP5ZKM44Go5LiA6Ie044GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnJvd1N1bXMoc2VxdGFiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2VxdGFi44Gu6KGM44GU44GoKOOCteODs+ODl+ODq+OBlOOBqCnjga7lkozjgpLnorroqo0NCnN1bShzZXF0YWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2VxdGFi5Lit44Gu57eP6YWN5YiX5pWw44KS56K66KqNDQpgYGANCg0KIyMjIFczLjQuNCBgZ2V0U2VxdWVuY2VzYOmWouaVsA0K44CAYGdldFNlcXVlbmNlc2DplqLmlbDjga/jgIHlhaXlipvjgqrjg5bjgrjjgqfjgq/jg4jjgYvjgonjgIHvvIjloanln7rvvInphY3liJfjgpLjg5njgq/jg4jjg6vjgajjgZfjgabmir3lh7rjgZfjgZ/ntZDmnpzjgpLov5TjgZfjgb7jgZnvvIhXMy4zLjHvvInjgIJgciBuY29sKHNlcXRhYilg5YCL44Gu44Om44OL44O844Kv44Gq5aGp5Z+66YWN5YiX44KS5b6X44Gf44GE5aC05ZCI44Gv44CBYHNlcXRhYmDjgqrjg5bjgrjjgqfjgq/jg4jjgpLlhaXlipvjgajjgZfjgaZgZ2V0U2VxdWVuY2VzYOmWouaVsOOCkuWun+ihjOOBl+OBvuOBmeOAguebtOW+jOOBrmBsZW5ndGgoaG9nZSlg5a6f6KGM57WQ5p6c44GL44KJ44CB56K644GL44GrYGhvZ2Vg44Gu5Lit6Lqr44GvciBuY29sKHNlcXRhYilg5YCL44Gu6KaB57Sg44GL44KJ44Gq44KL44OZ44Kv44OI44Or44Gg44Go44GE44GG44GT44Go44GM44KP44GL44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmhvZ2UgPC0gZ2V0U2VxdWVuY2VzKHNlcXRhYikgICAgICAgICAgICAgICMgc2VxdGFi5Lit44Gu5aGp5Z+66YWN5YiX44KSaG9nZeOBq+agvOe0jQ0KbGVuZ3RoKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dl5Lit44Gu6KaB57Sg5pWw44KS56K66KqNDQpgYGANCg0KIyMjIFczLjQuNSBgbmNoYXJg6Zai5pWwDQrjgIBgbmNoYXJg6Zai5pWw44Gv44CB5paH5a2X5YiX44OZ44Kv44OI44Or44KS5YWl5Yqb44Go44GX44Gm44CB6KaB57Sg44GU44Go44Gu5paH5a2X5pWw44KS6L+U44GX44G+44GZ77yIVzMuMi4y77yJ44CC44GX44Gf44GM44Gj44Gm44CB44GT44Gu5aC05ZCI44GuYGhvZ2UyYOOCquODluOCuOOCp+OCr+ODiOOBruimgee0oOaVsOOBr+OAgeWFpeWKm+OBp+OBguOCi+aWh+Wtl+WIl+ODmeOCr+ODiOODq+OBruimgee0oOaVsOOBqOWQjOOBmO+8iGByIGxlbmd0aChob2dlKWDvvInjgavjgarjgorjgb7jgZnjgIJgaGVhZGDplqLmlbDjgafmnIDliJ3jga4244Gk5YiG44Gu5Lit6Lqr44KS55y644KB44KL44Go44CB5ZuzM+OBp+W+l+OBnzIxMyBicOOBqOOBhOOBhuOCs+ODs+ODhuOCo+OCsOmVt+OBqOmFt+S8vOOBl+OBn+e1kOaenOOBsOOBi+OCiuihqOekuuOBleOCjOOBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpob2dlMiA8LSBuY2hhcihob2dlKSAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XkuK3jga7opoHntKDjgZTjgajjga7mloflrZfmlbDjgpJob2dlMuOBq+agvOe0jQ0KbGVuZ3RoKGhvZ2UyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dlMuS4reOBruimgee0oOaVsOOCkueiuuiqjQ0KaGVhZChob2dlMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBob2dlMuS4reOBruacgOWIneOBrjbjgaTjgpLnorroqo0NCmBgYA0KDQojIyMgVzMuNC42IGB0YWJsZWDplqLmlbANCuOAgOWun+izqueahOOBq+WFiOOBu+OBqeOBvuOBp+OBrue1kOaenOOBq2B0YWJsZWDplqLmlbDjgpLlrp/ooYzjgZfjgabjgYTjgovjgaDjgZHjgafjgZnjgIJgdGFibGVg6Zai5pWw44Gv44CB5YWl5Yqb44OZ44Kv44OI44Or5Lit44Gu6KaB57Sg44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqm44KS6L+U44GX44G+44GZ44CC44GX44Gf44GM44Gj44Gm44CB44GT44Gu57WQ5p6c44Gv44CBYHIgbmNvbChzZXF0YWIpYOWAi+OBruODpuODi+ODvOOCr+OBquWhqeWfuumFjeWIl+OBrumVt+OBleWIhuW4g+aDheWgseOCkuW+l+OBpuOBhOOCi+OBk+OBqOOBqOWQjOe+qeOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpob2dlIDwtIGdldFNlcXVlbmNlcyhzZXF0YWIpICAgICAgICAgICAgICAjIHNlcXRhYuS4reOBruWhqeWfuumFjeWIl+OCkmhvZ2XjgavmoLzntI0NCmhvZ2UyIDwtIG5jaGFyKGhvZ2UpICAgICAgICAgICAgICAgICAgICAgICMgaG9nZeS4reOBruimgee0oOOBlOOBqOOBruaWh+Wtl+aVsOOCkmhvZ2Uy44Gr5qC857SNDQp0YWJsZShob2dlMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2Uy44OZ44Kv44OI44Or5Lit44Gu6KaB57Sg44Gu56iu6aGe44GU44Go44Gr5Ye654++6aC75bqm44KS44Kr44Km44Oz44OIDQpgYGANCg0KIyMjIFczLjQuNyDkuIDmsJfjgavmm7jjgY8NCuOAgOS4gOawl+OBq+abuOOBj+OBqOOBk+OCk+OBquaEn+OBmOOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0YWJsZShuY2hhcihnZXRTZXF1ZW5jZXMoc2VxdGFiKSkpICAgICAgICAjIHNlcXRhYuS4reOBruWhqeWfuumFjeWIl+OBlOOBqOOBruaWh+Wtl+aVsOOCkuOCq+OCpuODs+ODiOOBl+OAgeOBneOBruaWh+Wtl+aVsOOBrueorumhnuOBlOOBqOOBruWHuuePvumgu+W6puOCkuihqOekug0KYGBgDQoNCuOAgFczLjMuN+OBq+S8vOOBm+OBpuOAgeS7peS4i+OBruOCiOOBhuOBquabuOOBjeaWueOBp+OCguani+OBhOOBvuOBm+OCk+OAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpob2dlIDwtIHNhcHBseShtZXJnZXJzLCBnZXRTZXF1ZW5jZXMpICAgICAjIG1lcmdlcnPkuK3jga7jgrXjg7Pjg5fjg6vjgZTjgajjga7loanln7rphY3liJfjgpJob2dl44Gr5qC857SNDQpob2dlMiA8LSB1bmxpc3QoaG9nZSkgICAgICAgICAgICAgICAgICAgICAjIGhvZ2XjgpLjg5njgq/jg4jjg6vlvaLlvI/jgavlpInmj5vjgZfjgaZob2dlMuOBq+agvOe0jQ0KaG9nZTMgPC0gbmNoYXIodW5pcXVlKGhvZ2UyKSkgICAgICAgICAgICAgIyBob2dlMuS4reOBruODpuODi+ODvOOCr+OBquimgee0oOOBlOOBqOOBruaWh+Wtl+aVsOOCkmhvZ2Uz44Gr5qC857SNDQp0YWJsZShob2dlMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhvZ2Uz44OZ44Kv44OI44Or5Lit44Gu6KaB57Sg44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqm44KS56K66KqNDQpgYGANCg0KIyMgVzMuNSBgcmVtb3ZlQmltZXJhRGVub3ZvYOmWouaVsA0K44CAW2RhZGEyXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvZGFkYTIuaHRtbCnjg5Hjg4PjgrHjg7zjgrjjga7jg6HjgqTjg7PjgafjgYLjgotkYWRh6Zai5pWw44Gv44CB44Ko44Op44O86KOc5q2j44Gu44G/44KS6KGM44GE44Kt44Oh44Op6YWN5YiX44Gu6Zmk5Y6744Gv6KGM44Gj44Gm44GP44KM44G+44Gb44KT44CC44Gk44G+44KK44CB44G+44Gg44Kt44Oh44Op6YWN5YiX44KS5ZCr44KT44Gn44GE44G+44GZ44CCYHJlbW92ZUJpbWVyYURlbm92b2DplqLmlbDjga/jgIFgbWFrZVNlcXVlbmNlVGFibGVg6Zai5pWw44Gu5a6f6KGM57WQ5p6c44Gn44GC44KLYHNlcXRhYmDjgqrjg5bjgrjjgqfjgq/jg4jjgpLlhaXlipvjgajjgZfjgablrp/ooYzjgZfjgIFQQ1Ljgq3jg6Hjg6njgpLpmaTljrvjgZfjgZ/ntZDmnpzjgpLov5TjgZfjgb7jgZnjgIINCg0KIyMjIFczLjUuMSDjgb7jgZrjga/lrp/ooYwNCuOAgOOBleOBjeOBu+OBqeW+l+OBn2BtYWtlU2VxdWVuY2VUYWJsZWDplqLmlbDjga7lrp/ooYzntZDmnpzjgafjgYLjgotgc2VxdGFiYOOCquODluOCuOOCp+OCr+ODiOOCkuWFpeWKm+OBqOOBl+OBpuOAgVBDUuOCreODoeODqeOCkumZpOWOu+OBl+OBn+e1kOaenOOCkmBzZXF0YWIubm9jaGltYOOCquODluOCuOOCp+OCr+ODiOOBq+agvOe0jeOBmeOCi+OBqOOBk+OCjeOBvuOBp+ihjOOBhOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpzZXF0YWIubm9jaGltIDwtIHJlbW92ZUJpbWVyYURlbm92byhzZXF0YWIsICAgICAgICAgICAgICAjIHNlcXRhYuS4reOBruOCreODoeODqemFjeWIl+mZpOWOu+OBl+OBn+e1kOaenOOCknNlcXRhYi5ub2NoaW3jgavmoLzntI0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJjb25zZW5zdXMiLCMgc2VxdGFi5Lit44Gu44Kt44Oh44Op6YWN5YiX6Zmk5Y6744GX44Gf57WQ5p6c44KSc2VxdGFiLm5vY2hpbeOBq+agvOe0jQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGl0aHJlYWQgPSBUUlVFLCAgIyBzZXF0YWLkuK3jga7jgq3jg6Hjg6nphY3liJfpmaTljrvjgZfjgZ/ntZDmnpzjgpJzZXF0YWIubm9jaGlt44Gr5qC857SNDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkgICAgICAjIHNlcXRhYuS4reOBruOCreODoeODqemFjeWIl+mZpOWOu+OBl+OBn+e1kOaenOOCknNlcXRhYi5ub2NoaW3jgavmoLzntI0NCmBgYA0KDQojIyMgVzMuNS4yIOe1kOaenOOBruamguimgeOCkueiuuiqjQ0K44CA57WQ5p6c44Gv6KGM5YiX44Gn44GZ44Gu44Gn44CB44G+44Ga44GvYGRpbWDplqLmlbDjgafooYzmlbDjgajliJfmlbDjgpLooajnpLrjgZXjgZvjgb7jgZnjgILooYzmlbDjga9gciBucm93KHNlcXRhYi5ub2NoaW0pYOOAgeWIl+aVsOOBr2ByIG5jb2woc2VxdGFiLm5vY2hpbSlg44Gn44GC44KL44GT44Go44GM44KP44GL44KK44G+44GZ44CC44GT44Gu44GT44Go44GL44KJ44CB5LuK5Zue6Kej5p6Q44GZ44KL6KiIYHIgbnJvdyhzZXF0YWIubm9jaGltKWDjgrXjg7Pjg5fjg6vlhajkvZPjgajjgZfjgabjga/jgIFgciBuY29sKHNlcXRhYi5ub2NoaW0pYOWAi+OBruODpuODi+ODvOOCr+OBqumFjeWIl+OBjOWtmOWcqOOBmeOCi+OBruOBoOOBqOino+mHiOOBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpkaW0oc2VxdGFiLm5vY2hpbSkgICAgICAgICAgICAgICAgICAgICAgICAjIHNlcXRhYi5ub2NoaW3jga7ooYzmlbDjgajliJfmlbDjgpLnorroqo0NCmBgYA0KDQojIyMgVzMuNS4zIGByb3dTdW1zYOOBqGBzdW1g6Zai5pWwDQrjgIBgcm93U3Vtc2DplqLmlbDjga/jgIHmlbDlgKTooYzliJfjgpLlhaXlipvjgajjgZfjgabjgIHooYzvvIhyb3fvvInjgZTjgajjga7lkozvvIhzdW3vvInjgpLov5TjgZfjgb7jgZnjgILlvpfjgonjgozjgovntZDmnpzjga/jgrXjg7Pjg5fjg6vjgZTjgajjga7jg6rjg7zjg4nmlbDjgavjgarjgorjgb7jgZnjgILjgZPjgozjgYzlkIzjgZjjg47jg6rjgafooYzliJflhajkvZPjga7nt4/lkozjgpJgc3VtYOmWouaVsOOBp+ioiOeul+OBmeOCi+OBqOOAgeOCteODs+ODl+ODq+WFqOS9k+OBrue3j+ODquODvOODieaVsOOBjOW+l+OCieOCjOOBvuOBmeOAguihqDJi44Gu44Oa44Ki4oCV44OJ44Ko44Oz44OJ44Gu44Oe44O844K45b6M44Gu44Oq44O844OJ5pWw44GL44KJ44G744Go44KT44Gp5rib44Gj44Gm44GE44Gq44GE44GT44Go44KC44KI44GP44KP44GL44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnJvd1N1bXMoc2VxdGFiLm5vY2hpbSkgICAgICAgICAgICAgICAgICAgICMgc2VxdGFiLm5vY2hpbeOBruihjOOBlOOBqOOBrue3j+WSjCjpmaTljrvlvozjga7jgrXjg7Pjg5fjg6vjgZTjgajjga7jg6rjg7zjg4nmlbAp44KS6KGo56S6DQpzdW0oc2VxdGFiLm5vY2hpbSkgICAgICAgICAgICAgICAgICAgICAgICAjIHNlcXRhYi5ub2NoaW3kuK3jga7lhajopoHntKDjga7nt4/lkowo6Zmk5Y675b6M44Gu57eP44Oq44O844OJ5pWwKeOCkuihqOekuiAgDQpzdW0oc2VxdGFiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlcXRhYuS4reOBruWFqOimgee0oOOBrue3j+WSjCjpmaTljrvliY3jga7nt4/jg6rjg7zjg4nmlbAp44KS6KGo56S6DQpzdW0oc2VxdGFiLm5vY2hpbSkvc3VtKHNlcXRhYikgICAgICAgICAgICAjIOmZpOWOu+W+jOOBrue3j+ODquODvOODieaVsC/pmaTljrvliY3jga7nt4/jg6rjg7zjg4nmlbDjga7libLlkIgNCmBgYA0KDQojIyMgVzMuNS40IOmFjeWIl+mVt+WIhuW4g+OBqOWHuuePvumgu+W6pg0K44CA5b6X44KJ44KM44Gf6KiIYHIgbmNvbChzZXF0YWIubm9jaGltKWDlgIvjga7phY3liJfplbfliIbluIPjgajlh7rnj77poLvluqbmg4XloLHjgpLlvpfjgb7jgZnjgILjgZPjgozjga9XMy40LjfjgajlkIzjgZjmm7jjgY3mlrnjgafjgZnjgILjgq3jg6Hjg6nphY3liJfpmaTljrvliY3jgajphbfkvLzjgZfjgZ/lgr7lkJHjgafjgYLjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGUobmNoYXIoZ2V0U2VxdWVuY2VzKHNlcXRhYi5ub2NoaW0pKSkgIyBzZXF0YWIubm9jaGlt5Lit44Gu5aGp5Z+66YWN5YiX44GU44Go44Gu5paH5a2X5pWw44KS44Kr44Km44Oz44OI44GX44CB44Gd44Gu5paH5a2X5pWw44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqm44KS6KGo56S6DQpgYGANCg0KIyMgVzMuNiDlm7M044Gu44K544Kv44Oq44OX44OIDQrjgIDjgrPjg7Pjg5Hjgq/jg4jjgavjgb7jgajjgoHjgovjgajjgZPjgpPjgarmhJ/jgZjjgafmm7jjgZHjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFfQ0KbWVyZ2VycyA8LSBtZXJnZVBhaXJzKGRhZGFGID0gZGFkYUZzLCBkZXJlcEYgPSBmaWx0RnMsIyDjg5rjgqLigJXjg4njgqjjg7Pjg4njga7jg57jg7zjgrjjgpLlrp/ooYzjgZfjgIHntZDmnpzjgpJtZXJnZXJz44Gr5qC857SNDQogICAgICAgICAgICAgICAgICAgICAgZGFkYVIgPSBkYWRhUnMsIGRlcmVwUiA9IGZpbHRScykjIOODmuOCouKAleODieOCqOODs+ODieOBruODnuODvOOCuOOCkuWun+ihjOOBl+OAgee1kOaenOOCkm1lcmdlcnPjgavmoLzntI0NCg0Kc2VxdGFiIDwtIG1ha2VTZXF1ZW5jZVRhYmxlKG1lcmdlcnMpICAgICAgIyBtZXJnZXJz5Lit44Gu44Om44OL44O844Kv6YWN5YiX44Gu5ZKM6ZuG5ZCI5oOF5aCx44KS5Y+W5b6X44GX44CB44K144Oz44OX44Or44GU44Go44Gu44Om44OL44O844Kv6YWN5YiX44Gu5Ye654++6aC75bqm44KSc2VxdGFi44Gr5qC857SNDQpkaW0oc2VxdGFiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlcXRhYuOBruihjOaVsOOBqOWIl+aVsOOCkueiuuiqjQ0Kc3VtKHNlcXRhYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZXF0YWLkuK3jga7nt4/phY3liJfmlbDjgpLnorroqo0NCnRhYmxlKG5jaGFyKGdldFNlcXVlbmNlcyhzZXF0YWIpKSkgICAgICAgICMgc2VxdGFi5Lit44Gu5aGp5Z+66YWN5YiX44GU44Go44Gu5paH5a2X5pWw44KS44Kr44Km44Oz44OI44GX44CB44Gd44Gu5paH5a2X5pWw44Gu56iu6aGe44GU44Go44Gu5Ye654++6aC75bqm44KS6KGo56S6DQoNCnNlcXRhYi5ub2NoaW0gPC0gcmVtb3ZlQmltZXJhRGVub3ZvKHNlcXRhYiwgbWV0aG9kID0gImNvbnNlbnN1cyIpIyBzZXF0YWLkuK3jga7jgq3jg6Hjg6nphY3liJfpmaTljrvjgZfjgZ/ntZDmnpzjgpJzZXF0YWIubm9jaGlt44Gr5qC857SNDQpkaW0oc2VxdGFiLm5vY2hpbSkgICAgICAgICAgICAgICAgICAgICAgICAjIHNlcXRhYi5ub2NoaW3jga7ooYzmlbDjgajliJfmlbDjgpLnorroqo0NCnN1bShzZXF0YWIubm9jaGltKSAgICAgICAgICAgICAgICAgICAgICAgICMgc2VxdGFiLm5vY2hpbeS4reOBruWFqOimgee0oOOBrue3j+WSjCjpmaTljrvlvozjga7nt4/jg6rjg7zjg4nmlbAp44KS6KGo56S6DQp0YWJsZShuY2hhcihnZXRTZXF1ZW5jZXMoc2VxdGFiLm5vY2hpbSkpKSAjIHNlcXRhYi5ub2NoaW3kuK3jga7loanln7rphY3liJfjgZTjgajjga7mloflrZfmlbDjgpLjgqvjgqbjg7Pjg4jjgZfjgIHjgZ3jga7mloflrZfmlbDjga7nqK7poZ7jgZTjgajjga7lh7rnj77poLvluqbjgpLooajnpLoNCmBgYA0KDQojIFc0IOezu+e1seWJsuOCiuW9k+OBpg0K44CA5pyA5b6M44Gu44K544OG44OD44OX44Gn44Gv44CB44G+44Ga44CB57O757Wx5o6o5a6a44Gu44Gf44KB44Gu44OH44O844K/44OZ44O844K544Gr55u45b2T44GZ44KL44Oq44OV44Kh44Os44Oz44K56YWN5YiX44K744OD44OI44KS5Y+W5b6X44GX44G+44GZ44CC5qyh44Gr44CBYGFzc2lnblRheG9ub215YOmWouaVsOOCkueUqOOBhOOBpuWxnu+8iGdlbnVz77yJ44Gu5o6o5a6a44KS6KGM44GE44G+44GZ44CC5pyA5b6M44GrYGFkZFNwZWNpZXNg6Zai5pWw44KS55So44GE44Gm56iu77yIc3BlY2llc++8ieOBruaOqOWumuOCkuihjOOBhOOBvuOBmeOAgg0KDQojIyBXNC4xIOODquODleOCoeODrOODs+OCuemFjeWIl+WPluW+lw0K44CA5pys56i/44Gv44CBW0RBREEyIFBpcGVsaW5lIFR1dG9yaWFsICgxLjE2KV0oaHR0cHM6Ly9iZW5qam5lYi5naXRodWIuaW8vZGFkYTIvdHV0b3JpYWwuaHRtbCnjga7mtYHjgozjgavmsr/jgaPjgaboqqzmmI7jgZfjgabjgYTjgb7jgZnjgILjgZPjga7kuK3jga5Bc3NpZ24gdGF4b25vbXnjgajjgYTjgYbpg6jliIbjgafjgIHml6Lnn6Xjga4xNlMgclJOQeOBruODquODleOCoeODrOODs+OCuemFjeWIl+OCkuWPluW+l+OBmeOCi+OBn+OCgeOBruODmuODvOOCuOOBqOOBl+OBpltodHRwczovL2JlbmpqbmViLmdpdGh1Yi5pby9kYWRhMi90cmFpbmluZy5odG1sXShodHRwczovL2JlbmpqbmViLmdpdGh1Yi5pby9kYWRhMi90cmFpbmluZy5odG1sKeOBuOOBruODquODs+OCr+OBjOekuuOBleOCjOOBpuOBhOOBvuOBmeOAguODquODs+OCr+WFiOOBp+imi+OCieOCjOOCi1tTaWx2YSAxMzguMSBwcm9rYXJ5b3RpYyBTU1UgdGF4b25vbWljIHRyYWluaW5nIGRhdGEgZm9ybWF0dGVkIGZvciBEQURBMl0oaHR0cHM6Ly9kb2kub3JnLzEwLjUyODEvemVub2RvLjQ1ODc5NTQp44Go44GE44GG44Oa44O844K444GL44KJ5Y+W5b6X5Y+v6IO944Gq5Lul5LiL44GuMuOBpOOBruODleOCoeOCpOODq+OCkuWIqeeUqOOBl+OBvuOBmeOAgg0KDQotIOWxnuODrOODmeODq+OBruezu+e1seaOqOWumueUqO+8mltzaWx2YV9ucjk5X3YxMzguMV90cmFpbl9zZXQuZmEuZ3pdKGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzQ1ODc5NTUvZmlsZXMvc2lsdmFfbnI5OV92MTM4LjFfdHJhaW5fc2V0LmZhLmd6KQ0KLSDnqK7jg6zjg5njg6vjga7ns7vntbHmjqjlrprnlKjvvJpbc2lsdmFfc3BlY2llc19hc3NpZ25tZW50X3YxMzguMS5mYS5nel0oaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvNDU4Nzk1NS9maWxlcy9zaWx2YV9zcGVjaWVzX2Fzc2lnbm1lbnRfdjEzOC4xLmZhLmd6KQ0KDQojIyBXNC4yIGBhc3NpZ25UYXhvbm9teWDplqLmlbANCuOAgGBhc3NpZ25UYXhvbm9teWDplqLmlbDjga/jgIHns7vntbHmjqjlrprjgZfjgZ/jgYTloanln7rphY3liJfjga7mloflrZfliJfjg5njgq/jg4jjg6vjgajlsZ7jg6zjg5njg6vjgb7jgafjga7mg4XloLHjgpLlkKvjgoDjg6rjg5XjgqHjg6zjg7PjgrnphY3liJfjg5XjgqHjgqTjg6vjgpLlhaXlipvjgajjgZfjgabjgIHns7vntbHmjqjlrprntZDmnpzjgpLov5TjgZfjgb7jgZnjgIINCg0KIyMjIFc0LjIuMSDjgb7jgZrjga/lrp/ooYwNCuOAgOWxnuODrOODmeODq+OBruezu+e1seaOqOWumuOCkuihjOOBhOOBvuOBmeOAguWFpeWKm+OBruOCr+OCqOODqu+8iOWVj+OBhOWQiOOCj+OBm+mFjeWIl++8ieWBtOOBr+OAgVczLjUuMeOBp+OCreODoeODqemFjeWIl+mZpOWOu+OBvuOBp+e1guOCj+OBo+OBn+W+jOOBrmBzZXF0YWIubm9jaGltYOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAguWFpeWKm+OBruODh+ODvOOCv+ODmeODvOOCueWBtOOBr+OAgSIuL3NpbHZhX25yOTlfdjEzOC4xX3RyYWluX3NldC5mYS5neiLjga7jgojjgYbjgavjgZfjgabkuI7jgYjjgabjgYTjgb7jgZnjgILjgZPjgozjga/jgIHkvZzmpa3jg4fjgqPjg6zjgq/jg4jjg6rvvIjjg4fjgrnjgq/jg4jjg4Pjg5fjga5kYXRhc2V044OV44Kp44Or44OA77yJ55u05LiL44Gr44GC44KL44CBc2lsdmFfbnI5OV92MTM4LjFfdHJhaW5fc2V0LmZhLmd644Go44GE44GG44OV44Kh44Kk44Or44Gg44Go44GE44GG5oSP5ZGz44Gn44GZ44CC44OA44Km44Oz44Ot44O844OJ44GX44Gf44OV44Kh44Kk44Or44KSMuihjOebruOBruOCiOOBhuOBq+aMh+WumuOBl+OBpuOCguOCiOOBhOOBp+OBmeOBjOOAge+8iDHnlarlt6blgbTjgasj44KS5YWl44KM44Gm44Kz44Oh44Oz44OI44Ki44Km44OI44GX44Gm44GE44KL44Gu44Gn5qmf6IO944Gv44GX44G+44Gb44KT44GMLi4u77yJMeihjOebruOBp+ekuuOBmeOCiOOBhuOBq+OAgeOCquODquOCuOODiuODq+OBrlVSTOOCkuebtOaOpeaMh+WumuOBmeOCi+OBk+OBqOOCguOBp+OBjeOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQojZmFzdGFmaWxlMSA8LSAiaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvNDU4Nzk1NS9maWxlcy9zaWx2YV9ucjk5X3YxMzguMV90cmFpbl9zZXQuZmEuZ3oiDQpmYXN0YWZpbGUxIDwtICIuL3NpbHZhX25yOTlfdjEzOC4xX3RyYWluX3NldC5mYS5neiIgIyDjg6rjg5XjgqHjg6zjg7PjgrnphY3liJfjga7jg5Hjgrnmg4XloLHjgpJmYXN0YWZpbGUx44Gr5qC857SNDQp0YXhhIDwtIGFzc2lnblRheG9ub215KHNlcXMgPSBzZXF0YWIubm9jaGltLCAjIHNlcXRhYi5ub2NoaW3jgpLjgq/jgqjjg6rphY3liJfjgIFmYXN0YWZpbGUx44KS44Oq44OV44Kh44Os44Oz44K56YWN5YiX44Go44GX44Gm57O757Wx5Ymy44KK5b2T44Gm44KS5a6f6KGM44GX44CB57WQ5p6c44KSdGF4YeOBq+agvOe0jQ0KICAgICAgICAgICAgICAgICAgICAgICByZWZGYXN0YSA9IGZhc3RhZmlsZTEpIyBzZXF0YWIubm9jaGlt44KS44Kv44Ko44Oq6YWN5YiX44CBZmFzdGFmaWxlMeOCkuODquODleOCoeODrOODs+OCuemFjeWIl+OBqOOBl+OBpuezu+e1seWJsuOCiuW9k+OBpuOCkuWun+ihjOOBl+OAgee1kOaenOOCknRheGHjgavmoLzntI0NCmBgYA0KDQojIyMgVzQuMi4yIOe1kOaenOOBruamguimgeOCkueiuuiqjQ0K44CA57WQ5p6c44Gv6KGM5YiX44Gn44GZ44Gu44Gn44CB44G+44Ga44GvYGRpbWDplqLmlbDjgafooYzmlbDjgajliJfmlbDjgpLooajnpLrjgZXjgZvjgb7jgZnjgILooYzmlbDjga9gciBucm93KHRheGEpYOOAgeWIl+aVsOOBr2ByIG5jb2wodGF4YSlg44Gn44GC44KL44GT44Go44GM44KP44GL44KK44G+44GZ44CC5qyh44Gv44CBYGNvbG5hbWVzYOmWouaVsOOBp2B0YXhhYOihjOWIl+OBruWIl+WQjeOCkuihqOekuuOBleOBm+OBpuOBhOOBvuOBmeOAguOBk+OBrue1kOaenOOCkuecuuOCgeOBpuOAgeeUn+eJqeOBrumajue0muOCkuOAjOeVjO+8iEtpbmdkb23vvInjg7vploDvvIhQaHlsdW3vvInjg7vntrHvvIhDbGFzc++8ieODu+ebru+8iE9yZGVy77yJ44O756eR77yIRmFtaWx577yJ44O75bGe77yIR2VudXPvvInjg7vnqK7vvIhTcGVjaWVz77yJ44CN44Go6KGo44GZ44Go44CB5bGe44G+44Gn44GrNuOBpOOBrumajue0muOBjOWtmOWcqOOBmeOCi+OBi+OCieOBk+OBruOCiOOBhuOBq+OBquOBo+OBpuOBhOOCi+OBruOBoOOBqOe0jeW+l+OBp+OBjeOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpkaW0odGF4YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRheGHjga7ooYzmlbDjgajliJfmlbDjgpLooajnpLoNCmNvbG5hbWVzKHRheGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGF4YeOBruWIl+WQjeOCkuihqOekug0KYGBgDQoNCiMjIFc0LjMgYGFkZFNwZWNpZXNg6Zai5pWwDQrjgIBgYWRkU3BlY2llc2DplqLmlbDjga/jgIHjgZXjgY3jgbvjganjga7lsZ7jg6zjg5njg6vjga7ns7vntbHmjqjlrprntZDmnpzjgafjgYLjgotgdGF4YWDjgqrjg5bjgrjjgqfjgq/jg4jjgIHjgYrjgojjgbPnqK7jg6zjg5njg6vjga7ns7vntbHmjqjlrprnlKjjga7jg6rjg5XjgqHjg6zjg7PjgrnphY3liJfjg5XjgqHjgqTjg6vvvIhbc2lsdmFfc3BlY2llc19hc3NpZ25tZW50X3YxMzguMS5mYS5nel0oaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvNDU4Nzk1NS9maWxlcy9zaWx2YV9zcGVjaWVzX2Fzc2lnbm1lbnRfdjEzOC4xLmZhLmd6Ke+8ieOCkuWFpeWKm+OBqOOBl+OBpuS4juOBiOOBpuOAgeeoruODrOODmeODq+OBruezu+e1seaOqOWumue1kOaenOaDheWgseOCkui2s+OBl+OBn+OCguOBruOCkui/lOOBl+OBvuOBmeOAgg0KDQojIyMgVzQuMy4xIOOBvuOBmuOBr+Wun+ihjA0K44CA5Lul5LiL44Gu44KI44GG44Gq5oSf44GY44Gn5a6f6KGM44GX44G+44GZ44CCVzQuMi4x44Go5ZCM5qeY44CB77yIMeeVquW3puWBtOOBqyPjgpLlhaXjgozjgabjgrPjg6Hjg7Pjg4jjgqLjgqbjg4jjgZfjgabjgYTjgovjga7jgafmqZ/og73jga/jgZfjgb7jgZvjgpPjgYzigKbvvIkx6KGM55uu44Gn56S644GZ44KI44GG44Gr44CB44Kq44Oq44K444OK44Or44GuVVJM44KS55u05o6l5oyH5a6a44GZ44KL44GT44Go44KC44Gn44GN44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCiMgZmFzdGFmaWxlMiA8LSAiaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvNDU4Nzk1NS9maWxlcy9zaWx2YV9zcGVjaWVzX2Fzc2lnbm1lbnRfdjEzOC4xLmZhLmd6Ig0KZmFzdGFmaWxlMiA8LSAiLi9zaWx2YV9zcGVjaWVzX2Fzc2lnbm1lbnRfdjEzOC4xLmZhLmd6IiAjIOODquODleOCoeODrOODs+OCuemFjeWIl+OBruODkeOCueaDheWgseOCkmZhc3RhZmlsZTEy44Gr5qC857SNDQp0YXhhMiA8LSBhZGRTcGVjaWVzKHRheHRhYiA9IHRheGEsICAgICAgICAjIHRheGHjgpLjgq/jgqjjg6rphY3liJfjgIFmYXN0YWZpbGUy44KS44Oq44OV44Kh44Os44Oz44K56YWN5YiX44Go44GX44Gm57O757Wx5Ymy44KK5b2T44Gm44KS5a6f6KGM44GX44CB57WQ5p6c44KSdGF4YTLjgavmoLzntI0NCiAgICAgICAgICAgICAgICAgICAgcmVmRmFzdGEgPSBmYXN0YWZpbGUyKSMgdGF4YeOCkuOCr+OCqOODqumFjeWIl+OAgWZhc3RhZmlsZTLjgpLjg6rjg5XjgqHjg6zjg7PjgrnphY3liJfjgajjgZfjgabns7vntbHlibLjgorlvZPjgabjgpLlrp/ooYzjgZfjgIHntZDmnpzjgpJ0YXhhMuOBq+agvOe0jQ0KYGBgDQoNCiMjIyBXNC4zLjIg57WQ5p6c44Gu5qaC6KaB44KS56K66KqNDQrjgIDntZDmnpzjga/ooYzliJfjgafjgZnjga7jgafjgIHjgb7jgZrjga9gZGltYOmWouaVsOOBp+ihjOaVsOOBqOWIl+aVsOOCkuihqOekuuOBleOBm+OBvuOBmeOAguihjOaVsOOBr2ByIG5yb3codGF4YTIpYOOAgeWIl+aVsOOBr2ByIG5jb2wodGF4YTIpYOOBp+OBguOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAguasoeOBr+OAgWBjb2xuYW1lc2DplqLmlbDjgadgdGF4YTJg6KGM5YiX44Gu5YiX5ZCN44KS6KGo56S644GV44Gb44Gm44GE44G+44GZ44CC55Sf54mp44Gu6ZqO57Sa44Gn44GC44KL44CM55WM77yIS2luZ2Rvbe+8ieODu+mWgO+8iFBoeWx1be+8ieODu+e2se+8iENsYXNz77yJ44O755uu77yIT3JkZXLvvInjg7vnp5HvvIhGYW1pbHnvvInjg7vlsZ7vvIhHZW51c++8ieODu+eoru+8iFNwZWNpZXPvvInjgI3jga7nqK7jga7ntZDmnpzjgYzotrPjgZXjgozjgabjgYTjgovjgZPjgajjgYzliIbjgYvjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZGltKHRheGEyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0YXhhMuOBruihjOaVsOOBqOWIl+aVsOOCkuihqOekug0KY29sbmFtZXModGF4YTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0YXhhMuOBruWIl+WQjeOCkuihqOekug0KYGBgDQoNCiMjIFc0LjQg44OV44Kh44Kk44Or5Ye65YqbDQrjgIDjgZPjgZPjgafjga/jgIFXMy41LjHjgaflvpfjgZ9gc2VxdGFiLm5vY2hpbWDjgqrjg5bjgrjjgqfjgq/jg4jjgahXNC4zLjHjgaflvpfjgZ9gdGF4YTJg44Kq44OW44K444Kn44Kv44OI44Gu5YaF5a6544KS44GG44G+44GP6YCj57WQ44GX44Gm44CB44K/44OW5Yy65YiH44KK44OG44Kt44K544OI44OV44Kh44Kk44Or44Go44GX44Gm5L+d5a2Y44GZ44KL5L2c5qWt44KS6KGM44GE44G+44GZ44CCDQoNCiMjIyBXNC40LjEg6KGM5YiX44Gu6Lui572uDQrjgIBgc2VxdGFiLm5vY2hpbWDjga7ooYzmlbDjgajliJfmlbDjga/jgZ3jgozjgZ7jgoxgciBucm93KHNlcXRhYi5ub2NoaW0pYOOBqGByIG5jb2woc2VxdGFiLm5vY2hpbSlg44Gn44GZ44CC44Gd44Gu5LiA5pa544Gn6YCj57WQ5a++6LGh44Gn44GC44KLYHRheGEyYOOBruihjOaVsOOBqOWIl+aVsOOBr+OAgeOBneOCjOOBnuOCjGByIG5yb3codGF4YTIpYOOBqGByIG5jb2wodGF4YTIpYOOBp+OBmeOAguW+k+OBo+OBpuOAgeOBhuOBvuOBj+mAo+e1kOOBmeOBueOBj+OAgWBzZXF0YWIubm9jaGltYOihjOWIl+OBruOBu+OBhuOCkmB0YOmWouaVsOOCkueUqOOBhOOBpui7oue9ruOBl+OBpuOAgeWQjOS4gOihjOOBjOWQjOS4gOOBrkFTVuOBruaDheWgseOBq+OBquOCi+OCiOOBhuOBq+OBp+OBjeOCi+OBi+OBqeOBhuOBi+eiuuiqjeOBl+OBpuOBhOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpkaW0oc2VxdGFiLm5vY2hpbSkgICAgICAgICAgICAgICAgICAgICAgICAjIHNlcXRhYi5ub2NoaW3jga7ooYzmlbDjgajliJfmlbDjgpLooajnpLoNCmRpbSh0YXhhMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGF4YTLjga7ooYzmlbDjgajliJfmlbDjgpLooajnpLoNCmRpbSh0KHNlcXRhYi5ub2NoaW0pKSAgICAgICAgICAgICAgICAgICAgICMgc2VxdGFiLm5vY2hpbeihjOWIl+OCkui7oue9ruOBl+OBpuOAgeihjOaVsOOBqOWIl+aVsOOCkuihqOekug0KYGBgDQoNCiMjIyBXNC40LjIgQVNW6YWN5YiX5oOF5aCx44Gu5Y+W5b6XDQrjgIDjgZPjgZPjgafjga/jgIHmnIDntYLnmoTjgatgdChzZXF0YWIubm9jaGltKWDjgahgdGF4YTJg44KS5YiX5pa55ZCR44Gn6YCj57WQ44GV44Gb44KL44Gu44Gn44GZ44GM44CB44Gh44KH44Gj44Go5bCP57Sw5bel44KS44GX44GmQVNW44Gu5aGp5Z+66YWN5YiX5oOF5aCx44Gu44G/44KS5paH5a2X5YiX44OZ44Kv44OI44Or44Go44GX44Gm5b6X44Gf57WQ5p6c44KSYEFTVmDjgajjgYTjgYbjgqrjg5bjgrjjgqfjgq/jg4jjgajjgZfjgablvpfjgojjgYbjgajjgZfjgabjgYTjgb7jgZnjgILjgZPjgZPjgafjga/jgIFgdGF4YTJg44Kq44OW44K444Kn44Kv44OI44Gu6KGM5ZCN5oOF5aCx44KSYEFTVmDjgavmoLzntI3jgZnjgovjgbvjgYbjgpLmnInlirnljJbjgZfjgabjgYTjgb7jgZnjgYzjgIEj44Gn44Kz44Oh44Oz44OI44Ki44Km44OI44GX44Gm44GE44KLYHNlcXRhYi5ub2NoaW1g44Kq44OW44K444Kn44Kv44OI44Gu5YiX5ZCN5oOF5aCx44KSYEFTVmDjgavmoLzntI3jgZnjgovjga7jgafjgoLmp4vjgYTjgb7jgZvjgpPjgILjgZ3jga7jgYLjgajjga/jgIFgQVNWYOODmeOCr+ODiOODq+OBruimgee0oOaVsOOCkmBsZW5ndGhg6Zai5pWw44Gn56K66KqN44GX44Gf44KK44CB5pyA5Yid44GuM+OBpOOBruimgee0oO+8iOOBpOOBvuOCikFTVuOBruWhqeWfuumFjeWIl+aDheWgse+8ieOCkuihqOekuuOBl+OBpueiuuiqjeOBl+OBpuOBhOOCi+OBoOOBkeOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQojQVNWIDwtIGNvbG5hbWVzKHNlcXRhYi5ub2NoaW0pICAgICAgICAgICAjIHNlcXRhYi5ub2NoaW3jga7liJflkI3jgpJBU1bjgavmoLzntI0o44GZ44KL44Gu44Gn44KC44KI44GEKQ0KQVNWIDwtIHJvd25hbWVzKHRheGEyKSAgICAgICAgICAgICAgICAgICAgIyB0YXhhMuOBruihjOWQjeOCkkFTVuOBq+agvOe0jQ0KbGVuZ3RoKEFTVikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBU1bjga7opoHntKDmlbDjgpLnorroqo0NCmhlYWQoQVNWLCBuID0gMykgICAgICAgICAgICAgICAgICAgICAgICAgICMgQVNW5Lit44Gu5pyA5Yid44GuNuOBpOOCkuihqOekug0KYGBgDQoNCiMjIyBXNC40LjMgYGNiaW5kYOOBqGB3cml0ZS50YWJsZWDplqLmlbANCuOAgGBjYmluZGDplqLmlbDjgpLnlKjjgYTjgabjg5XjgqHjgqTjg6vlh7rlipvjgZXjgZvjgZ/jgYTmg4XloLHjgpLliJfmlrnlkJHjgafpgKPntZDjgZfjgIHjgZ3jgozjgpJgd3JpdGUudGFibGVg6Zai5pWw44Gn44OV44Kh44Kk44Or44Gr5L+d5a2Y44GX44Gm44GE44G+44GZ44CC5ZuzNeOBr+OAgeW+l+OCieOCjOOBn+ODleOCoeOCpOODq+OCkkV4Y2Vs44Gn6ZaL44GE44Gm44K544Kv44Oq44O844Oz44K344On44OD44OI44KS44Go44Gj44Gf44KC44Gu44Gr44Gq44KK44G+44GZ44CC5b+144Gu44Gf44KB44CB44GT44GT44Gn44KC44K/44OW5Yy65YiH44KK44OG44Kt44K544OI44OV44Kh44Kk44Or54mI77yIW291dHB1dF9KU0xBQjI0LnR4dF0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9ib29rL291dHB1dF9KU0xBQjI0LnR4dCnvvInjgah4bHN454mI77yIW291dHB1dF9KU0xBQjI0Lnhsc3hdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9vdXRwdXRfSlNMQUIyNC54bHN4Ke+8ieOCkuODgOOCpuODs+ODreODvOODieOBp+OBjeOCi+OCiOOBhuOBq+OBl+OBpuOBiuOBjeOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0bXAgPC0gY2JpbmQoQVNWLCB0KHNlcXRhYi5ub2NoaW0pLCB0YXhhMikjIEFTVuOAgXNlcXRhYi5ub2NoaW3ooYzliJfjga7ou6Lnva7jgIF0YXhhMuOCkuWIl+aWueWQkeOBp+mAo+e1kOOBl+OBpnRtcOOBq+agvOe0jQ0KZGltKHRtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0bXDjga7ooYzmlbDjgpLliJfmlbDjgpLooajnpLoNCndyaXRlLnRhYmxlKHggPSB0bXAsIGZpbGUgPSAib3V0cHV0X0pTTEFCMjQudHh0Iiwgc2VwID0gIlx0Iiwgcm93Lm5hbWVzID0gRikjIHRtcOOBruS4rei6q+OCkuaMh+WumuOBl+OBn+ODleOCoeOCpOODq+WQjeOBp+OCv+ODluWMuuWIh+OCiuODhuOCreOCueODiOODleOCoeOCpOODq+OBqOOBl+OBpuOAgeihjOWQjeOCkuOBpOOBkeOBmuOBq+S/neWtmA0KYGBgDQoNCiMjIyBXNC40LjQgYGlkZW50aWNhbGDplqLmlbANCuOAgOOBleOBjeOBu+OBqeOBrmBjYmluZGDjga7pg6jliIbjgadgdChzZXF0YWIubm9jaGltKWDjgahgdGF4YTJg44GM5pys5b2T44Gr5ZCM5LiA44GuQVNW6YWN5YiX44Gr44Gq44Gj44Gm44GE44KL44GL5LiN5a6J44Gq5pa544Gv44CBYHNlcXRhYi5ub2NoaW1g6KGM5YiX44Gu5YiX5ZCN5oOF5aCx44Gn44GC44KLYGNvbG5hbWVzKHNlcXRhYi5ub2NoaW0pYOOBqGB0YXhhMmDjga7ooYzlkI3mg4XloLHjgYzpoIbnlarjgoLlkKvjgoHjgablkIzkuIDjgafjgYLjgovjgYvjgpLku6XkuIvjga7jgrPjg57jg7Pjg4njgafnorroqo3jgZfjgabjgYrjgY/jgajjgojjgYTjgafjgZnjgIJgaWRlbnRpY2FsYOmWouaVsOOBr+OAgVRSVUXjgarjgonlkIzjgZjjgIFGQUxTReOBquOCiemBleOBo+OBpuOBhOOCi+OBqOino+mHiOOBl+OBvuOBmeOAguWFiOOBu+OBqeOBrlc0LjQuM+OBp+OBhOOBjeOBquOCimBjYmluZGDplqLmlbDjgafliJflkIzlo6vjgpLpgKPntZDjgZfjgabjgYTjgovljbDosaHjgpLjgoLjgaPjgZ/jgYvjgoLjgZfjgozjgb7jgZvjgpPjgYzjgIHlrp/pmpvjgavjga/ooYzlkI3pg6jliIbjga7kuIDpg6jjgYzlkIzjgZjjgafjgYLjgovjgZPjgajjgpLnm67oppbnorroqo3jgZfjgZ/jgorjgIHku6XkuIvjgafnpLrjgZnjgojjgYbjgatgaWRlbnRpY2FsYOmWouaVsOOBquOBqeOCkueUqOOBhOOBplRSVUXjgajjgYTjgYbntZDmnpzjgpLlvpfjgabjgYvjgonjgavjgZfjgZ/jgorjgIHjgYLjgovjgYTjga/jgoLjgaPjgajpq5jluqbjgarmlrnms5XjgafpgKPntZDjgZXjgZvjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaWRlbnRpY2FsKGNvbG5hbWVzKHNlcXRhYi5ub2NoaW0pLCByb3duYW1lcyh0YXhhMikpIyBzZXF0YWIubm9jaGlt44Gu5YiX5ZCN44GodGF4YTLjga7ooYzlkI3jga4y44Gk44Gu44OZ44Kv44OI44Or44GM5ZCM5LiA44GL44Gp44GG44GL44KS56K66KqNDQpgYGANCg0K44CA44GE44GN44Gq44KK5LiK6KiY44Gu44KE44Gk44Gg44Go5oyZ5YuV44GM44KI44GP44KP44GL44KJ44Gq44GE44GL44KC44GX44KM44G+44Gb44KT44Gu44Gn44CB5b+144Gu44Gf44KB5Lul5LiL44Gr57Ch5Y2Y44Gq5L6L44KS56S644GX44Gm44GK44GN44G+44GZ44CCYGhvZ2UyYOOBqGBob2dlM2Djga7mr5TovIPmmYLjga7jgb9gciBpZGVudGljYWwoaG9nZTIsIGhvZ2UzKWDjgavjgarjgaPjgabjgYTjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KaG9nZTEgPC0gYygiRyIsICJIIiwgIlUiKSAgICAgICAgICAgICAgICAgIyAz44Gk44Gu6KaB57Sg44GL44KJ44Gq44KL5paH5a2X5YiX44OZ44Kv44OI44Or44KS5L2c5oiQ44GX44GmaG9nZTHjgavmoLzntI0NCmhvZ2UyIDwtIGMoIkciLCAiSCIsICJVIiwgIksiKSAgICAgICAgICAgICMgNOOBpOOBruimgee0oOOBi+OCieOBquOCi+aWh+Wtl+WIl+ODmeOCr+ODiOODq+OCkuS9nOaIkOOBl+OBpmhvZ2Uy44Gr5qC857SNDQpob2dlMyA8LSBjKCJHIiwgIkgiLCAiVSIsICJLIikgICAgICAgICAgICAjIDTjgaTjga7opoHntKDjgYvjgonjgarjgovmloflrZfliJfjg5njgq/jg4jjg6vjgpLkvZzmiJDjgZfjgaZob2dlM+OBq+agvOe0jQ0KaG9nZTQgPC0gYygiSCIsICJVIiwgIkciKSAgICAgICAgICAgICAgICAgIyAz44Gk44Gu6KaB57Sg44GL44KJ44Gq44KL5paH5a2X5YiX44OZ44Kv44OI44Or44KS5L2c5oiQ44GX44GmaG9nZTTjgavmoLzntI0NCmlkZW50aWNhbChob2dlMSwgaG9nZTIpICAgICAgICAgICAgICAgICAgICMgaG9nZTHjgahob2dlMuOBrjLjgaTjga7jg5njgq/jg4jjg6vjgYzlkIzkuIDjgYvjganjgYbjgYvjgpLnorroqo0NCmlkZW50aWNhbChob2dlMSwgaG9nZTMpICAgICAgICAgICAgICAgICAgICMgaG9nZTHjgahob2dlM+OBrjLjgaTjga7jg5njgq/jg4jjg6vjgYzlkIzkuIDjgYvjganjgYbjgYvjgpLnorroqo0NCmlkZW50aWNhbChob2dlMSwgaG9nZTQpICAgICAgICAgICAgICAgICAgICMgaG9nZTHjgahob2dlNOOBrjLjgaTjga7jg5njgq/jg4jjg6vjgYzlkIzkuIDjgYvjganjgYbjgYvjgpLnorroqo0NCmlkZW50aWNhbChob2dlMiwgaG9nZTMpICAgICAgICAgICAgICAgICAgICMgaG9nZTLjgahob2dlM+OBrjLjgaTjga7jg5njgq/jg4jjg6vjgYzlkIzkuIDjgYvjganjgYbjgYvjgpLnorroqo0NCmlkZW50aWNhbChob2dlMiwgaG9nZTQpICAgICAgICAgICAgICAgICAgICMgaG9nZTLjgahob2dlNOOBrjLjgaTjga7jg5njgq/jg4jjg6vjgYzlkIzkuIDjgYvjganjgYbjgYvjgpLnorroqo0NCmlkZW50aWNhbChob2dlMywgaG9nZTQpICAgICAgICAgICAgICAgICAgICMgaG9nZTPjgahob2dlNOOBrjLjgaTjga7jg5njgq/jg4jjg6vjgYzlkIzkuIDjgYvjganjgYbjgYvjgpLnorroqo0NCmBgYA0KDQojIOOBiuOCj+OCiuOBqw0KDQojIyBXNS4xIOWPguiAg+OBq+OBl+OBn+ODmuODvOOCuA0KLSBbREFEQTIgUGlwZWxpbmUgVHV0b3JpYWwgKDEuMTYpXShodHRwczovL2JlbmpqbmViLmdpdGh1Yi5pby9kYWRhMi90dXRvcmlhbC5odG1sKQ0KLSBbZGFkYTJdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9kYWRhMi8p44GuW0ludHJvZHVjdGlvbiB0byBkYWRhMl0oaHR0cHM6Ly93d3cuYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvdmlnbmV0dGVzL2RhZGEyL2luc3QvZG9jL2RhZGEyLWludHJvLmh0bWwp44Oa44O844K4DQoNCiMjIFc1LjIg6Kej5p6Q55Kw5aKD44Gu56K66KqNDQrjgIBgcGFja2FnZVZlcnNpb25g6Zai5pWw44Gv44CB5YCL5Yil44Gu44Kk44Oz44K544OI44O844Or5riI44G/44OR44OD44Kx44O844K444Gu44OQ44O844K444On44Oz5oOF5aCx44KS55+l44KK44Gf44GE5aC05ZCI44Gr5Yip55So44GX44G+44GZ44CC5LuK5Zue5YuV5L2c56K66KqN44GX44GfZGFkYTLjga7jg5Djg7zjgrjjg6fjg7Pjga9gciBwYWNrYWdlVmVyc2lvbigiZGFkYTIiKWDjgaDjgajjgYTjgYbjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcGFja2FnZVZlcnNpb24oImRhZGEyIikgICAgICAgICAgICAgICAgICAgIyBkYWRhMuOBruODkOODvOOCuOODp+ODs+OCkuihqOekug0KYGBgDQoNCuOAgOOCguOBo+OBqOW6g+OBhOaEj+WRs+OBp+OBruino+aekOeSsOWig+aDheWgseOCkuefpeOCiuOBn+OBhOWgtOWQiOOBr+OAgWBzZXNzaW9uSW5mbygpYOOBruWHuuWKm+e1kOaenOOBq+WfuuOBpeOBhOOBpuiomOi8ieOBl+OBvuOBmeOAguOBk+OBrlBD44Gu5aC05ZCI44Gv44CBUuacrOS9k+OBruODkOODvOOCuOODp+ODs+OBjDQuMy4y44Gn44GC44KL44GT44Go44KE44CBT1PjgYxXaW5kb3dzIDEx44Gn44GC44KL44GT44Go44Gq44Gp44GM44KP44GL44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCnNlc3Npb25JbmZvKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMg6Kej5p6Q55Kw5aKD44KS6KGo56S6DQpgYGA=