Mercurial > repos > metexplore > met4j
changeset 11:40c15b7467f1 draft default tip
planemo upload for repository https://forgemia.inra.fr/metexplore/met4j-galaxy commit 61dbdbae896d18b519a470e056cb8b4f98394518
line wrap: on
line diff
--- a/build/tools/BipartiteDistanceMatrix/BipartiteDistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/BipartiteDistanceMatrix/BipartiteDistanceMatrix.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_BipartiteDistanceMatrix" name="BipartiteDistanceMatrix" version="2.0.0"> +<tool id="met4j_BipartiteDistanceMatrix" name="BipartiteDistanceMatrix" version="2.0.1"> <description>Create a compound to reactions distance matrix.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.BipartiteDistanceMatrix -i "$inputPath" #if str($sideCompoundFile) != 'None':
--- a/build/tools/ChemSimilarityWeighting/ChemSimilarityWeighting.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/ChemSimilarityWeighting/ChemSimilarityWeighting.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ChemSimilarityWeighting" name="ChemSimilarityWeighting" version="2.0.0"> +<tool id="met4j_ChemSimilarityWeighting" name="ChemSimilarityWeighting" version="2.0.1"> <description>Provides tabulated compound graph edge list, with one column with reactant pair's chemical similarity.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ChemSimilarityWeighting#if str($type): -f "$type" @@ -68,7 +68,7 @@ <help><![CDATA[Provides tabulated compound graph edge list, with one column with reactant pair's chemical similarity.Chemical similarity has been proposed as edge weight for finding meaningful paths in metabolic networks, using shortest (lightest) path search.]]></help> <citations> <citation type="doi">10.1093/bioinformatics/btg217</citation> + <citation type="doi">10.1093/bioinformatics/btu760</citation> <citation type="doi">10.1093/bioinformatics/bti116</citation> - <citation type="doi">10.1093/bioinformatics/btu760</citation> </citations> </tool>
--- a/build/tools/ChokePoint/ChokePoint.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/ChokePoint/ChokePoint.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ChokePoint" name="ChokePoint" version="2.0.0"> +<tool id="met4j_ChokePoint" name="ChokePoint" version="2.0.1"> <description>Compute the Choke points of a metabolic network.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ChokePoint -i "$inputPath" -o "$outputPath" @@ -18,15 +18,25 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="695"/> + <has_n_columns n="3"/> + <has_line_matching expression="R_ADEtex.*adenine_transport_via_diffusion__extracellular_to_periplasm_.*M_ade_e <==> M_ade_p" n="1"/> + <has_line_matching expression="R_AGDC_r.*R_AGDC_r.*M_acgam6p_c \+ M_h2o_c --> M_ac_c \+ M_gam6p_c" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Compute the Choke points of a metabolic network.
--- a/build/tools/CreateMetaNetwork/CreateMetaNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/CreateMetaNetwork/CreateMetaNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_CreateMetaNetwork" name="CreateMetaNetwork" version="2.0.0"> +<tool id="met4j_CreateMetaNetwork" name="CreateMetaNetwork" version="2.0.1"> <description>Create a Meta-Network from two sub-networks in SBML format.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh reconstruction.CreateMetaNetwork -n1 "$sbml1FilePath" -n2 "$sbml2FilePath" @@ -60,18 +60,31 @@ </outputs> <tests> <test> + <param name="sbml1FilePath" value="Human-GEM_pathways.xml"/> + <param name="sbml2FilePath" value="ECOL.xml"/> + <param name="external1" value="s"/> + <param name="external2" value="e"/> + <param name="n1prefix" value="hsa"/> + <param name="n2prefix" value="eco"/> + <param name="mergingCriterion" value="by_metanetx"/> + <output ftype="sbml" name="outputPath"> + <assert_contents> + <has_text text="</sbml>"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a Meta-Network from two sub-networks in SBML format.
--- a/build/tools/DegreeWeighting/DegreeWeighting.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/DegreeWeighting/DegreeWeighting.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_DegreeWeighting" name="DegreeWeighting" version="2.0.0"> +<tool id="met4j_DegreeWeighting" name="DegreeWeighting" version="2.0.1"> <description>Provides tabulated compound graph edge list, with one column with target's degree.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.DegreeWeighting#if str($pow): -pow "$pow"
--- a/build/tools/DistanceMatrix/DistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/DistanceMatrix/DistanceMatrix.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_DistanceMatrix" name="DistanceMatrix" version="2.0.0"> +<tool id="met4j_DistanceMatrix" name="DistanceMatrix" version="2.0.1"> <description>Create a compound to compound distance matrix.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.DistanceMatrix -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -34,30 +34,54 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="9"/> + <has_line_matching expression="id,A,A_ext,B,C,D,D_ext,E,E_ext" n="1"/> + <has_line_matching expression="B,1.0,Infinity,0.0,2.0,1.0,2.0,Infinity,Infinity" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="sideCompoundFile" value="sides.txt"/> + <param name="degree" value="true"/> + <param name="undirected" value="true"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="8"/> + <has_line_matching expression="id,A,B,C,D,D_ext,E,E_ext" n="1"/> + <has_line_matching expression="A,0.0,4.0,4.0,20.0,21.0,24.0,25.0" n="1"/> + <has_line_matching expression="B,4.0,0.0,8.0,16.0,17.0,20.0,21.0" n="1"/> + <has_line_matching expression="C,4.0,8.0,0.0,16.0,17.0,20.0,21.0" n="1"/> + <has_line_matching expression="D,8.0,4.0,4.0,0.0,1.0,4.0,5.0" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a compound to compound distance matrix.
--- a/build/tools/ExtractAnnotations/ExtractAnnotations.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/ExtractAnnotations/ExtractAnnotations.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractAnnotations" name="ExtractAnnotations" version="2.0.0"> +<tool id="met4j_ExtractAnnotations" name="ExtractAnnotations" version="2.0.1"> <description>Extract databases' references from SBML annotations or notes.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.ExtractAnnotations -i "$inputPath" -export "$export" @@ -34,40 +34,73 @@ </outputs> <tests> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="export" value="METABOLITE"/> + <param name="db" value="metanetx.chemical"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="146"/> + <has_n_columns n="2"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="export" value="METABOLITE"/> + <param name="db" value="metanetx.chemical"/> + <param name="skip" value="true"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="145"/> + <has_n_columns n="2"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="export" value="METABOLITE"/> + <param name="db" value="metanetx.chemical"/> + <param name="skip" value="true"/> + <param name="uniq" value="true"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="111"/> + <has_n_columns n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Extract databases' references from SBML annotations or notes. The references are exported as a tabulated file with one column with the SBML compound, reaction or gene identifiers, and one column with the corresponding database identifier.The name of the targeted database need to be provided under the same form than the one used in the notes field or the identifiers.org uri.]]></help>
--- a/build/tools/ExtractPathways/ExtractPathways.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/ExtractPathways/ExtractPathways.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractPathways" name="ExtractPathways" version="2.0.0"> +<tool id="met4j_ExtractPathways" name="ExtractPathways" version="2.0.1"> <description>Extract pathway(s) from a SBML file and create a sub-network SBML file</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.ExtractPathways -i "$inputPath" -p "$pathwayId" @@ -24,15 +24,25 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="pathwayId" value="Citric_Acid_Cycle+Folate_Metabolism+toto"/> + <output ftype="sbml" name="outputPath"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*<reaction.*" n="17"/> + <has_line_matching expression=".*groups:id=.*" n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Extract pathway(s) from a SBML file and create a sub-network SBML file]]></help>
--- a/build/tools/ExtractSubBipNetwork/ExtractSubBipNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/ExtractSubBipNetwork/ExtractSubBipNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubBipNetwork" name="ExtractSubBipNetwork" version="2.0.0"> +<tool id="met4j_ExtractSubBipNetwork" name="ExtractSubBipNetwork" version="2.0.1"> <description>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds and/or reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubBipNetwork -i "$inputPath" -s "$sourcePath" @@ -54,17 +54,29 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="sourcePath" value="seeds.txt"/> + <param name="targetPath" value="targets.txt"/> + <param name="sideCompoundFile" value="sc.txt"/> + <param name="format" value="gml"/> + <output ftype="txt" name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="5"/> + <has_line_matching expression=".*edge.*" n="4"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds and/or reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.
--- a/build/tools/ExtractSubNetwork/ExtractSubNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/ExtractSubNetwork/ExtractSubNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubNetwork" name="ExtractSubNetwork" version="2.0.0"> +<tool id="met4j_ExtractSubNetwork" name="ExtractSubNetwork" version="2.0.1"> <description>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds of interests ids, one per row.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubNetwork -i "$inputPath" -s "$sourcePath" @@ -56,29 +56,41 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="sourcePath" value="seeds.txt"/> + <param name="targetPath" value="targets.txt"/> + <param name="format" value="gml"/> + <output ftype="txt" name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="3"/> + <has_line_matching expression=".*edge.*" n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds of interests ids, one per row. The subnetwork corresponds to the part of the network that connects compounds from the first list to compounds from the second list. Sources and targets list can have elements in common. The connecting part can be defined as the union of shortest or k-shortest paths between sources and targets, or the Steiner tree connecting them. The relevance of considered path can be increased by weighting the edges using degree squared, chemical similarity (require InChI or SMILES annotations) or any provided weighting. + See previous works on subnetwork extraction for parameters recommendations.]]></help> <citations> + <citation type="doi">10.1093/nar/gki437</citation> + <citation type="doi">10.1093/bioinformatics/btg217</citation> <citation type="doi">10.1093/bib/bbv115</citation> <citation type="doi">10.1016/j.biosystems.2011.05.004</citation> + <citation type="doi">10.1093/bioinformatics/bti116</citation> <citation type="doi">10.1016/j.jmb.2005.09.079</citation> <citation type="doi">10.1093/bioinformatics/btu760</citation> - <citation type="doi">10.1093/nar/gki437</citation> - <citation type="doi">10.1093/bioinformatics/bti116</citation> - <citation type="doi">10.1093/bioinformatics/btg217</citation> </citations> </tool>
--- a/build/tools/ExtractSubReactionNetwork/ExtractSubReactionNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/ExtractSubReactionNetwork/ExtractSubReactionNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubReactionNetwork" name="ExtractSubReactionNetwork" version="2.0.0"> +<tool id="met4j_ExtractSubReactionNetwork" name="ExtractSubReactionNetwork" version="2.0.1"> <description>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubReactionNetwork -i "$inputPath" -s "$sourcePath" @@ -54,17 +54,29 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="sourcePath" value="seeds.txt"/> + <param name="targetPath" value="targets.txt"/> + <param name="sideCompoundFile" value="sides.txt"/> + <param name="format" value="gml"/> + <output ftype="txt" name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="3"/> + <has_line_matching expression=".*edge.*" n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a subnetwork from a metabolic network in SBML format, and two files containing lists of reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.
--- a/build/tools/FbcToNotes/FbcToNotes.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/FbcToNotes/FbcToNotes.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_FbcToNotes" name="FbcToNotes" version="2.0.0"> +<tool id="met4j_FbcToNotes" name="FbcToNotes" version="2.0.1"> <description>Convert FBC package annotations to sbml html notes</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.FbcToNotes -i "$inputPath" -o "$outputPath" @@ -18,13 +18,21 @@ </outputs> <tests> <test> + <param name="inputPath" value="ECOL.xml"/> + <output ftype="sbml" name="outputPath"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*GENE_ASSOCIATION: b2312.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Convert FBC package annotations to sbml html notes (see https://www.degruyter.com/document/doi/10.1515/jib-2017-0082/html)]]></help>
--- a/build/tools/GetBiggModelProteome/GetBiggModelProteome.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/GetBiggModelProteome/GetBiggModelProteome.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetBiggModelProteome" name="GetBiggModelProteome" version="2.0.0"> +<tool id="met4j_GetBiggModelProteome" name="GetBiggModelProteome" version="2.0.1"> <description>Get proteome in fasta format of a model present in the BIGG database</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh bigg.GetBiggModelProteome -m "$modelId" -o "$outputFile" @@ -22,12 +22,19 @@ </outputs> <tests> <test maxseconds="120"> + <param name="modelId" value="e_coli_core"/> + <output ftype="fasta" name="outputFile"> + <assert_contents> + <has_line_matching expression=".*name=.*" n="136"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Get proteome in fasta format of a model present in the BIGG database]]></help>
--- a/build/tools/GetEntities/GetEntities.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/GetEntities/GetEntities.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetEntities" name="GetEntities" version="2.0.0"> +<tool id="met4j_GetEntities" name="GetEntities" version="2.0.1"> <description>Parse a SBML file to return a list of entities composing the network: metabolites, reactions, genes and others.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetEntities -i "$sbml" $printMetabolites @@ -30,29 +30,52 @@ </outputs> <tests> <test> + <param name="sbml" value="Human-GEM_pathways.xml"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_text_matching expression="GENE" n="86"/> + <has_text_matching expression="METABOLITE" n="111"/> + <has_text_matching expression="REACTION" n="75"/> + <has_text_matching expression="PATHWAY" n="3"/> + <has_text_matching expression="COMPARTMENT" n="5"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="Human-GEM_pathways.xml"/> + <param name="printReactions" value="true"/> + <param name="printMetabolites" value="true"/> + <param name="printGenes" value="true"/> + <param name="printCompartments" value="true"/> + <param name="noTypeCol" value="true"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_n_lines n="277"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Parse a SBML file to return a list of entities composing the network: metabolites, reactions, genes and others.The output file is a tabulated file with two columns, one with entity identifiers, and one with the entity type. If no entity type is selected, all of them are returned by default. Only identifiers are written, attributes can be extracted from dedicated apps or from the Sbml2Tab app.]]></help>
--- a/build/tools/GetGenesFromReactions/GetGenesFromReactions.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/GetGenesFromReactions/GetGenesFromReactions.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetGenesFromReactions" name="GetGenesFromReactions" version="2.0.0"> +<tool id="met4j_GetGenesFromReactions" name="GetGenesFromReactions" version="2.0.1"> <description>Get gene lists from a list of reactions and a SBML file.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetGenesFromReactions -i "$sbml" -r "$reactionFile" @@ -34,15 +34,25 @@ </outputs> <tests> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="reactionFile" value="XF_network_R_Seed.tab"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_n_lines n="2"/> + <has_line_matching expression="R_GLUN.*XFCFBP8418_026750" n="1"/> + <has_line_matching expression="R_ACGS.*XFCFBP8418_025260" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Get associated gene list from a list of reactions and a SBML file. Parse SBML GPR annotations and output a tab-separated file with one row per gene, associated reaction identifiers from input file in first column, gene identifiers in second column.]]></help>
--- a/build/tools/GetMetaboliteAttributes/GetMetaboliteAttributes.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/GetMetaboliteAttributes/GetMetaboliteAttributes.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetMetaboliteAttributes" name="GetMetaboliteAttributes" version="2.0.0"> +<tool id="met4j_GetMetaboliteAttributes" name="GetMetaboliteAttributes" version="2.0.1"> <description>Create a tabulated file with metabolite attributes from a SBML file</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetMetaboliteAttributes -i "$sbml" -o "$outputFile" @@ -18,15 +18,25 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_n_lines n="9"/> + <has_n_columns n="6"/> + <has_line_matching expression=".*1S/C2H6O/c1-2-3/h3H,2H2,1H3.*" n="1"/> + <has_line_matching expression=".*C.*NC.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a tabulated file with metabolite attributes from a SBML file]]></help>
--- a/build/tools/GetReactantsFromReactions/GetReactantsFromReactions.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/GetReactantsFromReactions/GetReactantsFromReactions.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetReactantsFromReactions" name="GetReactantsFromReactions" version="2.0.0"> +<tool id="met4j_GetReactantsFromReactions" name="GetReactantsFromReactions" version="2.0.1"> <description>Get reactant lists from a list of reactions and a SBML file.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetReactantsFromReactions -i "$sbml" -r "$reactionFile" @@ -38,36 +38,65 @@ </outputs> <tests> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="reactionFile" value="XF_network_R_Seed.tab"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_text_matching expression="R_GLUN" n="4"/> + <has_text_matching expression="R_ACGS" n="5"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="reactionFile" value="XF_network_R_Seed.tab"/> + <param name="printSubstrates" value="true"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_text_matching expression="R_GLUN" n="2"/> + <has_text_matching expression="R_ACGS" n="5"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="reactionFile" value="XF_network_R_Seed.tab"/> + <param name="printProducts" value="true"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_text_matching expression="R_GLUN" n="2"/> + <has_text_matching expression="R_ACGS" n="5"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Get reactant lists from a list of reactions and a Sbml file. Output a tab-separated file with one row per reactant, reaction identifiers in first column, reactant identifiers in second column. It can provides substrates, products, or both (by default). In the case of reversible reactions, all reactants are considered as both substrates and products]]></help>
--- a/build/tools/Kegg2Sbml/Kegg2Sbml.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/Kegg2Sbml/Kegg2Sbml.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Kegg2Sbml" name="Kegg2Sbml" version="2.0.0"> +<tool id="met4j_Kegg2Sbml" name="Kegg2Sbml" version="2.0.1"> <description>Build a SBML file from KEGG organism-specific pathways. Uses Kegg API.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Kegg2Sbml#if str($org): -org "$org"
--- a/build/tools/LoadPoint/LoadPoint.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/LoadPoint/LoadPoint.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_LoadPoint" name="LoadPoint" version="2.0.0"> +<tool id="met4j_LoadPoint" name="LoadPoint" version="2.0.1"> <description>Compute the Load points of a metabolic network. Load points constitute an indicator of lethality and can help identifying drug targets.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.LoadPoint -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -30,13 +30,21 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_columns n="3"/> + <has_n_lines n="8"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Compute the Load points of a metabolic network. Load points constitute an indicator of lethality and can help identifying drug targets.
--- a/build/tools/MetaboRank/MetaboRank.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/MetaboRank/MetaboRank.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_MetaboRank" name="MetaboRank" version="2.0.0"> +<tool id="met4j_MetaboRank" name="MetaboRank" version="2.0.1"> <description>Compute the MetaboRank, a custom personalized PageRank for metabolic network.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.MetaboRank -i "$sbmlFilePath" -s "$seedsFilePath" @@ -44,15 +44,25 @@ </outputs> <tests> <test> + <param name="sbmlFilePath" value="XF_network.sbml"/> + <param name="seedsFilePath" value="XF_network_C_Seed.tab"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <output name="output"> + <assert_contents> + <has_n_lines n="1100"/> + <has_n_columns n="11"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Compute the MetaboRank, a custom personalized PageRank for metabolic network.
--- a/build/tools/NameMatcher/NameMatcher.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/NameMatcher/NameMatcher.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_NameMatcher" name="NameMatcher" version="2.0.0"> +<tool id="met4j_NameMatcher" name="NameMatcher" version="2.0.1"> <description>This tool runs edit-distance based fuzzy matching to perform near-similar name matching between a metabolic model and a list of chemical names in a dataset. A harmonization processing is performed on chemical names with substitutions of common patterns among synonyms, in order to create aliases on which classical fuzzy matching can be run efficiently.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh mapping.NameMatcher#if str($n): -nMatch "$n" @@ -60,6 +60,7 @@ </outputs> <tests/> <help><![CDATA[Metabolic models and Metabolomics Data often refer compounds only by using their common names, which vary greatly according to the source, thus impeding interoperability between models, databases and experimental data. This requires a tedious step of manual mapping. Fuzzy matching is a range of methods which can potentially helps fasten this process, by allowing the search for near-similar names. Fuzzy matching is primarily designed for common language search engines and is frequently based on edit distance, i.e. the number of edits to transform a character string into another, effectively managing typo, case and special character variations, and allowing auto-completion. However, edit-distance based search fall short when mapping chemical names: As an example, alpha-D-Glucose et Glucose would require more edits than between Fructose and Glucose. + This tool runs edit-distance based fuzzy matching to perform near-similar name matching between a metabolic model and a list of chemical names in a dataset. A harmonization processing is performed on chemical names with substitutions of common patterns among synonyms, in order to create aliases on which classical fuzzy matching can be run efficiently.]]></help> <citations/> </tool>
--- a/build/tools/NetworkSummary/NetworkSummary.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/NetworkSummary/NetworkSummary.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_NetworkSummary" name="NetworkSummary" version="2.0.0"> +<tool id="met4j_NetworkSummary" name="NetworkSummary" version="2.0.1"> <description>Create a report summarizing several graph measures characterising the structure of a metabolic network.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.NetworkSummary -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -26,12 +26,19 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <output name="outputPath"> + <assert_contents> + <has_n_lines min="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a report summarizing several graph measures characterising the structure of a metabolic network.
--- a/build/tools/ORApathwayEnrichment/ORApathwayEnrichment.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/ORApathwayEnrichment/ORApathwayEnrichment.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ORApathwayEnrichment" name="ORApathwayEnrichment" version="2.0.0"> +<tool id="met4j_ORApathwayEnrichment" name="ORApathwayEnrichment" version="2.0.1"> <description>Perform Over Representation Analysis for Pathway Enrichment, using one-tailed exact Fisher Test.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh mapping.ORApathwayEnrichment#if str($th) != 'nan': -th "$th" @@ -32,39 +32,62 @@ </outputs> <tests> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="input" value="XF_network_C_NOI.txt"/> + <output name="outputFile"> + <assert_contents> + <has_n_columns n="3"/> + <has_n_lines n="3"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="input" value="XF_network_C_NOI.txt"/> + <param name="corr" value="HolmBonferroni"/> + <param name="th" value="0.005"/> + <output name="outputFile"> + <assert_contents> + <has_n_columns n="3"/> + <has_n_lines n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Perform Over Representation Analysis for Pathway Enrichment, using one-tailed exact Fisher Test. The fisher exact test computes the probability p to randomly get the given set of values. This version computes the probability to get at least the given overlap between the given set and the given modality : Sum the hypergeometric probability with increasing target/query intersection cardinality. + The hypergeometric probability is computed from the following contingency table entries. (values in cells correspond to the marginal totals of each intersection groups) Query !Query Target a b !Target c d + The probability of obtaining the set of value is computed as following: p = ((a+b)!(c+d)!(a+c)!(b+d)!)/(a!b!c!d!(a+b+c+d)!) + The obtained p-value is then adjusted for multiple testing using one of the following methods: - Bonferroni: adjusted p-value = p*n - Benjamini-Hochberg: adjusted p-value = p*n/k
--- a/build/tools/PrecursorNetwork/PrecursorNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/PrecursorNetwork/PrecursorNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_PrecursorNetwork" name="PrecursorNetwork" version="2.0.0"> +<tool id="met4j_PrecursorNetwork" name="PrecursorNetwork" version="2.0.1"> <description>Perform a network expansion from a set of compound targets to create a precursor network.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.PrecursorNetwork -i "$sbmlFilePath" -t "$targetsFilePath" @@ -38,15 +38,25 @@ </outputs> <tests> <test> + <param name="sbmlFilePath" value="toy_model.xml"/> + <param name="targetsFilePath" value="targets.txt"/> + <param name="format" value="gml"/> + <output ftype="txt" name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="13"/> + <has_line_matching expression=".*edge.*" n="15"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Perform a network expansion from a set of compound targets to create a precursor network.
--- a/build/tools/ReactionDistanceMatrix/ReactionDistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/ReactionDistanceMatrix/ReactionDistanceMatrix.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ReactionDistanceMatrix" name="ReactionDistanceMatrix" version="2.0.0"> +<tool id="met4j_ReactionDistanceMatrix" name="ReactionDistanceMatrix" version="2.0.1"> <description>Create a reaction to reaction distance matrix.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ReactionDistanceMatrix -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -38,91 +38,172 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="8"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5,reac6,reac7" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0,Infinity,Infinity" n="1"/> + <has_line_matching expression="reac2,Infinity,0.0,1.0,1.0,2.0,Infinity,Infinity" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="undirected" value="true"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="8"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5,reac6,reac7" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0,5.0,4.0" n="1"/> + <has_line_matching expression="reac2,1.0,0.0,1.0,1.0,2.0,4.0,3.0" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="undirected" value="true"/> + <param name="sideCompoundFile" value="sides.txt"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="8"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5,reac6,reac7" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0,5.0,4.0" n="1"/> + <has_line_matching expression="reac2,1.0,0.0,1.0,2.0,3.0,5.0,4.0" n="1"/> + <has_line_matching expression="reac3,1.0,1.0,0.0,1.0,2.0,4.0,3.0" n="1"/> + <has_line_matching expression="reac4,2.0,2.0,1.0,0.0,1.0,3.0,2.0" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="undirected" value="true"/> + <param name="rExclude" value="rexclude.txt"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="6"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0" n="1"/> + <has_line_matching expression="reac2,1.0,0.0,1.0,1.0,2.0" n="1"/> + <has_line_matching expression="reac3,1.0,1.0,0.0,1.0,2.0" n="1"/> + <has_line_matching expression="reac4,2.0,1.0,1.0,0.0,1.0" n="1"/> + <has_line_matching expression="reac5,3.0,2.0,2.0,1.0,0.0" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="undirected" value="true"/> + <param name="sideCompoundFile" value="sides.txt"/> + <param name="rExclude" value="rexclude.txt"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="6"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0" n="1"/> + <has_line_matching expression="reac2,1.0,0.0,1.0,2.0,3.0" n="1"/> + <has_line_matching expression="reac3,1.0,1.0,0.0,1.0,2.0" n="1"/> + <has_line_matching expression="reac4,2.0,2.0,1.0,0.0,1.0" n="1"/> + <has_line_matching expression="reac5,3.0,3.0,2.0,1.0,0.0" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="sideCompoundFile" value="sides.txt"/> + <param name="rExclude" value="rexclude.txt"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="6"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0" n="1"/> + <has_line_matching expression="reac2,Infinity,0.0,1.0,2.0,3.0" n="1"/> + <has_line_matching expression="reac3,Infinity,Infinity,0.0,1.0,2.0" n="1"/> + <has_line_matching expression="reac4,Infinity,Infinity,Infinity,0.0,1.0" n="1"/> + <has_line_matching expression="reac5,Infinity,Infinity,Infinity,Infinity,0.0" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a reaction to reaction distance matrix.
--- a/build/tools/Sbml2CarbonSkeletonNet/Sbml2CarbonSkeletonNet.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/Sbml2CarbonSkeletonNet/Sbml2CarbonSkeletonNet.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2CarbonSkeletonNet" name="Sbml2CarbonSkeletonNet" version="2.0.0"> +<tool id="met4j_Sbml2CarbonSkeletonNet" name="Sbml2CarbonSkeletonNet" version="2.0.1"> <description>Create a carbon skeleton graph representation of a SBML file content, using GSAM atom-mapping file (see https://forgemia.inra.fr/metexplore/gsam)</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2CarbonSkeletonNet -i "$inputPath" -g "$inputAAM" @@ -46,90 +46,168 @@ </outputs> <tests> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2602"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="keepSingleCarbon" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2629"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="mergeComp" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2406"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="mergeEdges" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2071"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="removeIsolated" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2490"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="undirected" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="3214"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="format" value="matrix"/> + <output name="output"> + <assert_contents> + <has_n_lines n="112"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions2.tab"/> + <param name="fromIndexes" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2611"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Metabolic networks used for quantitative analysis often contain links that are irrelevant for graph-based structural analysis. For example, inclusion of side compounds or modelling artifacts such as 'biomass' nodes. Focusing on links between compounds that share parts of their carbon skeleton allows to avoid many transitions involving side compounds, and removes entities without defined chemical structure. This app produces a Carbon Skeleton Network relevant for graph-based analysis of metabolism, in GML or matrix format, from a SBML and an GSAM atom mapping file. GSAM (see https://forgemia.inra.fr/metexplore/gsam) performs atom mapping at genome-scale level using the Reaction Decoder Tool (https://github.com/asad/ReactionDecoder) and allows to compute the number of conserved atoms of a given type between reactants.This app also enables Markov-chain based analysis of metabolic networks by computing reaction-normalized transition probabilities on the Carbon Skeleton Network.]]></help>
--- a/build/tools/Sbml2CompoundGraph/Sbml2CompoundGraph.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/Sbml2CompoundGraph/Sbml2CompoundGraph.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2CompoundGraph" name="Sbml2CompoundGraph" version="2.0.0"> +<tool id="met4j_Sbml2CompoundGraph" name="Sbml2CompoundGraph" version="2.0.1"> <description>Advanced creation of a compound graph representation of a SBML file content</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2CompoundGraph -i "$inputPath" #if str($inputSide) != 'None': @@ -54,31 +54,56 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="1101"/> + <has_line_matching expression=".*edge.*" n="5581"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <param name="undirected" value="true"/> + <param name="computeWeight" value="true"/> + <param name="removeIsolated" value="true"/> + <param name="degree" value="true"/> + <param name="mergingStrat" value="by_id"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="793"/> + <has_line_matching expression=".*edge.*" n="9372"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Metabolic networks used for quantitative analysis often contain links that are irrelevant for graph-based structural analysis. For example, inclusion of side compounds or modelling artifacts such as 'biomass' nodes.
--- a/build/tools/Sbml2Graph/Sbml2Graph.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/Sbml2Graph/Sbml2Graph.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2Graph" name="Sbml2Graph" version="2.0.0"> +<tool id="met4j_Sbml2Graph" name="Sbml2Graph" version="2.0.1"> <description>Create a graph representation of a SBML file content, and export it in graph file format.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2Graph -i "$inputPath" $bipartite @@ -34,38 +34,69 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="8"/> + <has_line_matching expression=".*edge.*" n="9"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="bipartite" value="true"/> + <param name="compound" value="false"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="15"/> + <has_line_matching expression=".*edge.*" n="17"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="reaction" value="true"/> + <param name="compound" value="false"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="7"/> + <has_line_matching expression=".*edge.*" n="8"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a graph representation of a SBML file content, and export it in graph file format.
--- a/build/tools/Sbml2PathwayNet/Sbml2PathwayNet.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/Sbml2PathwayNet/Sbml2PathwayNet.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2PathwayNet" name="Sbml2PathwayNet" version="2.0.0"> +<tool id="met4j_Sbml2PathwayNet" name="Sbml2PathwayNet" version="2.0.1"> <description>Creation of a Pathway Network representation of a SBML file content</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2PathwayNet -i "$inputPath" #if str($inputSide) != 'None':
--- a/build/tools/Sbml2Tab/Sbml2Tab.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/Sbml2Tab/Sbml2Tab.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2Tab" name="Sbml2Tab" version="2.0.0"> +<tool id="met4j_Sbml2Tab" name="Sbml2Tab" version="2.0.1"> <description>Create a tabulated file listing reaction attributes from a SBML file</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2Tab#if str($i): -irr "$i" @@ -34,28 +34,50 @@ </outputs> <tests> <test> + <param name="in" value="toy_model.xml"/> + <output ftype="tsv" name="out"> + <assert_contents> + <has_n_lines n="8"/> + <has_n_columns n="9"/> + <has_text text="2.0 E[c] --> D[c]"/> + <has_text text="A[c] <==> B[c]"/> + </assert_contents> + </output> + </test> <test> + <param name="in" value="toy_model.xml"/> + <param name="i" value="->"/> + <param name="r" value="="/> + <output ftype="tsv" name="out"> + <assert_contents> + <has_n_lines n="8"/> + <has_n_columns n="9"/> + <has_text text="2.0 E[c] -> D[c]"/> + <has_text text="A[c] = B[c]"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a tabulated file listing reaction attributes from a SBML file]]></help>
--- a/build/tools/SbmlCheckBalance/SbmlCheckBalance.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SbmlCheckBalance/SbmlCheckBalance.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SbmlCheckBalance" name="SbmlCheckBalance" version="2.0.0"> +<tool id="met4j_SbmlCheckBalance" name="SbmlCheckBalance" version="2.0.1"> <description>Check balance of all the reactions in a SBML.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh reconstruction.SbmlCheckBalance -i "$sbml" -out "$out"
--- a/build/tools/SbmlWizard/SbmlWizard.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SbmlWizard/SbmlWizard.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SbmlWizard" name="SbmlWizard" version="2.0.0"> +<tool id="met4j_SbmlWizard" name="SbmlWizard" version="2.0.1"> <description>General SBML model processing</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.SbmlWizard -i "$inputPath" #if str($inputSide) != 'None': @@ -56,30 +56,54 @@ </outputs> <tests> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="removeIsolated" value="true"/> + <param name="removeNoFlux" value="true"/> + <param name="mergingStrat" value="by_id"/> + <param name="removeDuplicated" value="true"/> + <param name="exchangeCompToRemove" value="s"/> + <output ftype="sbml" name="outputPath"> + <assert_contents> + <has_text text="</sbml>"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="removeIsolated" value="true"/> + <param name="removeNoFlux" value="true"/> + <param name="removeDuplicated" value="true"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <param name="inputReactions" value="XF_network_R_Seed.tab"/> + <output ftype="sbml" name="outputPath"> + <assert_contents> + <has_text text="</sbml>"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[General SBML model processing including compound removal (such as side compounds or isolated compounds), reaction removal (ex. blocked or exchange reaction), and compartment merging]]></help>
--- a/build/tools/ScopeNetwork/ScopeNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/ScopeNetwork/ScopeNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ScopeNetwork" name="ScopeNetwork" version="2.0.0"> +<tool id="met4j_ScopeNetwork" name="ScopeNetwork" version="2.0.1"> <description>Perform a network expansion from a set of compound seeds to create a scope network</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ScopeNetwork -i "$sbmlFilePath" -s "$seedsFilePath" @@ -42,16 +42,27 @@ </outputs> <tests> <test> + <param name="sbmlFilePath" value="toy_model.xml"/> + <param name="seedsFilePath" value="seeds.txt"/> + <param name="sideCompoundFile" value="sides.txt"/> + <param name="format" value="gml"/> + <output ftype="txt" name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="9"/> + <has_line_matching expression=".*edge.*" n="11"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Perform a network expansion from a set of compound seeds to create a scope network
--- a/build/tools/SeedsAndTargets/SeedsAndTargets.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SeedsAndTargets/SeedsAndTargets.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SeedsAndTargets" name="SeedsAndTargets" version="2.0.0"> +<tool id="met4j_SeedsAndTargets" name="SeedsAndTargets" version="2.0.1"> <description>Identify exogenously acquired compounds, exogenously available producible compounds and/or dead ends metabolites from metabolic network topology</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.SeedsAndTargets -i "$inputPath" #if str($inputSide) != 'None': @@ -44,41 +44,75 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="source" value="true"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_columns n="1"/> + <has_n_lines n="109"/> + <has_line_matching expression="M_\S+_\w" n="109"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="sink" value="true"/> + <param name="useInternal" value="true"/> + <param name="comp" value="e"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_columns n="1"/> + <has_n_lines n="5"/> + <has_line_matching expression="^M_\S+_\w" n="5"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="sink" value="true"/> + <param name="useBorensteinAlg" value="true"/> + <param name="comp" value="e"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_columns n="1"/> + <has_n_lines n="26"/> + <has_line_matching expression="^M_\S+_\w" n="26"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Identify exogenously acquired compounds, exogenously available producible compounds and/or dead ends metabolites from metabolic network topology
--- a/build/tools/SetCharges/SetCharges.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SetCharges/SetCharges.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetCharges" name="SetCharges" version="2.0.0"> +<tool id="met4j_SetCharges" name="SetCharges" version="2.0.1"> <description>Set charge to metabolites in a SBML file from a tabulated file containing the metabolite ids and the charges</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetCharges#if str($colcharge) != 'nan': -cc "$colcharge" @@ -50,63 +50,117 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="charges.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:charge=.2.*" n="1"/> + <has_line_matching expression=".*fbc:charge=.-3.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="chargesWithComment.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:charge=.2.*" n="1" negate="true"/> + <has_line_matching expression=".*fbc:charge=.-3.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="charges.tsv"/> + <param name="nSkip" value="1"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:charge=.2.*" n="1" negate="true"/> + <has_line_matching expression=".*fbc:charge=.-3.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="charges.tsv"/> + <param name="ci" value="2"/> + <param name="cc" value="3"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:charge=.2.*" n="1"/> + <has_line_matching expression=".*fbc:charge=.-3.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="chargesXF.tsv"/> + <param name="p" value="true"/> + <param name="s" value="true"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:charge=.-1000.*" n="3"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Set charge to metabolites in a SBML file from a tabulated file containing the metabolite ids and the charges
--- a/build/tools/SetChemicalFormulas/SetChemicalFormulas.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SetChemicalFormulas/SetChemicalFormulas.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetChemicalFormulas" name="SetChemicalFormulas" version="2.0.0"> +<tool id="met4j_SetChemicalFormulas" name="SetChemicalFormulas" version="2.0.1"> <description>Set Formula to network metabolites from a tabulated file containing the metabolite ids and the formulas</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetChemicalFormulas#if str($colformula) != 'nan': -cf "$colformula" @@ -50,19 +50,32 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="formula.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*CH6O6.*" n="2"/> + <has_line_matching expression=".*CH12O4.*" n="2"/> + </assert_contents> + </output> + </test> <test expect_failure="true"> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="formulaBad.tsv"/> + </test> </tests> <help><![CDATA[Set Formula to network metabolites from a tabulated file containing the metabolite ids and the formulas
--- a/build/tools/SetEcNumbers/SetEcNumbers.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SetEcNumbers/SetEcNumbers.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetEcNumbers" name="SetEcNumbers" version="2.0.0"> +<tool id="met4j_SetEcNumbers" name="SetEcNumbers" version="2.0.1"> <description>Set EC numbers to reactions in a SBML file from a tabulated file containing the reaction ids and the EC numbers</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetEcNumbers#if str($colec) != 'nan': -cec "$colec" @@ -48,19 +48,32 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="ec.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*1.1.1.1.*" n="2"/> + <has_line_matching expression=".*1.2.3.4.*" n="2"/> + </assert_contents> + </output> + </test> <test expect_failure="true"> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="ecBad.tsv"/> + </test> </tests> <help><![CDATA[Set EC numbers to reactions in a SBML file from a tabulated file containing the reaction ids and the EC numbers
--- a/build/tools/SetGprs/SetGprs.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SetGprs/SetGprs.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetGprs" name="SetGprs" version="2.0.0"> +<tool id="met4j_SetGprs" name="SetGprs" version="2.0.1"> <description>Create a new SBML file from an original sbml file and a tabulated file containing reaction ids and Gene association written in a cobra way</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetGprs#if str($colgpr) != 'nan': -cgpr "$colgpr" @@ -48,22 +48,39 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="gpr.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:id=.G1.*" n="1"/> + <has_line_matching expression=".*fbc:id=.G2.*" n="1"/> + <has_line_matching expression=".*fbc:id=.G3.*" n="1"/> + <has_line_matching expression=".*fbc:id=.G4.*" n="1"/> + <has_line_matching expression=".*fbc:geneProductRef fbc:geneProduct=.G1.*" n="1"/> + <has_line_matching expression=".*fbc:geneProductRef fbc:geneProduct=.G2.*" n="1"/> + <has_line_matching expression=".*fbc:geneProductRef fbc:geneProduct=.G3.*" n="1"/> + <has_line_matching expression=".*fbc:geneProductRef fbc:geneProduct=.G4.*" n="1"/> + <has_line_matching expression=".*fbc:and.*" n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a new SBML file from an original sbml file and a tabulated file containing reaction ids and Gene association written in a cobra way
--- a/build/tools/SetIds/SetIds.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SetIds/SetIds.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetIds" name="SetIds" version="2.0.0"> +<tool id="met4j_SetIds" name="SetIds" version="2.0.1"> <description>Set new ids to network objects in a SBML file from a tabulated file containing the old ids and the new ids</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetIds#if str($colname) != 'nan': -cnew "$colname" @@ -62,63 +62,117 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="idMetabolites.tsv"/> + <param name="o" value="METABOLITE"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*id=.metaboliteA.*" n="1"/> + <has_line_matching expression=".*id=.metaboliteB.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="idReactions.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*id=.reaction1.*" n="1"/> + <has_line_matching expression=".*id=.reaction2.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="idPathways.tsv"/> + <param name="o" value="PATHWAY"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*groups:id=.CEB.*" n="1"/> + <has_line_matching expression=".*groups:id=.NSP.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="idGenes.tsv"/> + <param name="o" value="GENE"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:id=.G1.*" n="1"/> + <has_line_matching expression=".*fbc:id=.G2.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="idCompartments.tsv"/> + <param name="o" value="COMPARTMENT"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*id=.cytosol.*" n="1"/> + <has_line_matching expression=".*id=.extra.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Set new ids to network objects in a SBML file from a tabulated file containing the old ids and the new ids
--- a/build/tools/SetNames/SetNames.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SetNames/SetNames.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetNames" name="SetNames" version="2.0.0"> +<tool id="met4j_SetNames" name="SetNames" version="2.0.1"> <description>Set names to network objects in a SBML file from a tabulated file containing the object ids and the names</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetNames#if str($colname) != 'nan': -cname "$colname" @@ -62,51 +62,94 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="namesMetabolites.tsv"/> + <param name="o" value="METABOLITE"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*metaboliteA.*" n="1"/> + <has_line_matching expression=".*metaboliteB.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="namesReactions.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*reaction1.*" n="1"/> + <has_line_matching expression=".*reaction2.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="namesPathways.tsv"/> + <param name="o" value="PATHWAY"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*groups:name=.CEB.*" n="1"/> + <has_line_matching expression=".*groups:name=.NSP.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="namesGenes.tsv"/> + <param name="o" value="GENE"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:name=.G1.*" n="1"/> + <has_line_matching expression=".*fbc:name=.G2.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Set names to network objects in a SBML file from a tabulated file containing the object ids and the names
--- a/build/tools/SetPathways/SetPathways.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SetPathways/SetPathways.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetPathways" name="SetPathways" version="2.0.0"> +<tool id="met4j_SetPathways" name="SetPathways" version="2.0.1"> <description>Set pathway to reactions in a network from a tabulated file containing the reaction ids and the pathways</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetPathways#if str($colp) != 'nan': -cp "$colp" @@ -56,31 +56,56 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="pathways.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*groups:id=.*" n="3"/> + <has_line_matching expression=".*groups:id=.p1.*" n="1"/> + <has_line_matching expression=".*groups:id=.p2.*" n="1"/> + <has_line_matching expression=".*groups:id=.p3.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="pathwaysOtherSep.tsv"/> + <param name="sep" value=" + "/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*groups:id=.*" n="3"/> + <has_line_matching expression=".*groups:id=.p1.*" n="1"/> + <has_line_matching expression=".*groups:id=.p2.*" n="1"/> + <has_line_matching expression=".*groups:id=.p3.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Set pathway to reactions in a network from a tabulated file containing the reaction ids and the pathways
--- a/build/tools/SetReferences/SetReferences.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SetReferences/SetReferences.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetReferences" name="SetReferences" version="2.0.0"> +<tool id="met4j_SetReferences" name="SetReferences" version="2.0.1"> <description>Add references to network objects in a SBML file from a tabulated file containing the metabolite ids and the references</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetReferences#if str($colRef) != 'nan': -cr "$colRef" @@ -68,17 +68,29 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="refs.tsv"/> + <param name="ref" value="InChi"/> + <param name="o" value="METABOLITE"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*C2H6O.*" n="3"/> + <has_line_matching expression=".*C6H8O6.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Add references to network objects in a SBML file from a tabulated file containing the metabolite ids and the references
--- a/build/tools/SideCompoundsScan/SideCompoundsScan.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/SideCompoundsScan/SideCompoundsScan.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SideCompoundsScan" name="SideCompoundsScan" version="2.0.0"> +<tool id="met4j_SideCompoundsScan" name="SideCompoundsScan" version="2.0.1"> <description>Scan a network to identify side compounds.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.SideCompoundsScan -i "$inputPath" $sideOnly @@ -50,23 +50,40 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="1108"/> + <has_n_columns n="4"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="noReportValue" value="true"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="6"/> + <has_n_columns n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Scan a network to identify side compounds.
--- a/build/tools/Tab2Sbml/Tab2Sbml.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/Tab2Sbml/Tab2Sbml.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Tab2Sbml" name="Tab2Sbml" version="2.0.0"> +<tool id="met4j_Tab2Sbml" name="Tab2Sbml" version="2.0.1"> <description>Create a Sbml File from a tabulated file that contains the reaction ids and the formulas</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Tab2Sbml#if str($colid) != 'nan': -ci "$colid" @@ -76,63 +76,117 @@ </outputs> <tests> <test> + <param name="in" value="toy_model.tsv"/> + <output ftype="sbml" name="sbml"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*reaction .*" n="7"/> + <has_line_matching expression=".*species .*" n="8"/> + </assert_contents> + </output> + </test> <test> + <param name="in" value="toy_model_otherColumns.tsv"/> + <param name="colid" value="2"/> + <param name="colformula" value="3"/> + <output ftype="sbml" name="sbml"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*reaction .*" n="7"/> + <has_line_matching expression=".*species .*" n="8"/> + </assert_contents> + </output> + </test> <test> + <param name="in" value="toy_model_otherSigns.tsv"/> + <param name="i" value="->"/> + <param name="r" value="="/> + <output ftype="sbml" name="sbml"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*reaction .*" n="7"/> + <has_line_matching expression=".*species .*" n="8"/> + </assert_contents> + </output> + </test> <test> + <param name="in" value="toy_model.tsv"/> + <param name="rp" value="true"/> + <param name="mp" value="true"/> + <param name="e" value="_e"/> + <param name="createCompartment" value="true"/> + <output ftype="sbml" name="sbml"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*boundaryCondition=.true.*" n="3"/> + <has_line_matching expression=".*id=.M_A_ext_e.*" n="1"/> + <has_line_matching expression=".*id=.R_reac2.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="in" value="toy_model.tsv"/> + <param name="id" value="myModel"/> + <output ftype="sbml" name="sbml"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*myModel.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a Sbml File from a tabulated file that contains the reaction ids and the formulas]]></help>
--- a/build/tools/TopologicalPathwayAnalysis/TopologicalPathwayAnalysis.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/build/tools/TopologicalPathwayAnalysis/TopologicalPathwayAnalysis.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_TopologicalPathwayAnalysis" name="TopologicalPathwayAnalysis" version="2.0.0"> +<tool id="met4j_TopologicalPathwayAnalysis" name="TopologicalPathwayAnalysis" version="2.0.1"> <description>Run a Topological Pathway Analysis (TPA) to identify key pathways based on topological properties of its constituting compounds.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.TopologicalPathwayAnalysis -i "$inputPath" #if str($inputSide) != 'None': @@ -42,30 +42,54 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="dataPath" value="XF_network_C_NOI.txt"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <output name="outputPath"> + <assert_contents> + <has_n_columns n="3"/> + <has_n_lines n="3"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="dataPath" value="XF_network_C_NOI.txt"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <param name="undirected" value="true"/> + <param name="removeIsolated" value="true"/> + <param name="out" value="true"/> + <param name="mergingStrat" value="by_id"/> + <output name="outputPath"> + <assert_contents> + <has_n_columns n="3"/> + <has_n_lines n="3"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Run a Topological Pathway Analysis (TPA) to identify key pathways based on topological properties of its constituting compounds.
--- a/tests.html Mon Feb 03 15:59:46 2025 +0000 +++ b/tests.html Thu Feb 13 15:08:22 2025 +0000 @@ -285,7 +285,7 @@ var md = window.markdownit({ html: true, }); - target.innerHTML = md.render(atob('IyMgVGVzdCBTdW1tYXJ5Cgo8ZGl2IGNsYXNzPSJwcm9ncmVzcyI+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzIiBzdHlsZT0id2lkdGg6IDEwMC4wJSIgYXJpYS12YWx1ZW5vdz0iODQiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9Ijg0IiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgdGl0bGU9Ijg0IFBhc3NlZCI+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci13YXJuaW5nIiBzdHlsZT0id2lkdGg6IDAuMCUiIGFyaWEtdmFsdWVub3c9IjAiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9Ijg0IiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgdGl0bGU9IjAgU2tpcHBlZCI+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1kYW5nZXIiIHN0eWxlPSJ3aWR0aDogMC4wJSIgYXJpYS12YWx1ZW5vdz0iMCIgYXJpYS12YWx1ZW1pbj0iMCIgYXJpYS12YWx1ZW1heD0iODQiIHRpdGxlPSIwIEZhaWxlZCBvciBFcnJvcmVkIj4KICA8L2Rpdj4KPC9kaXY+Cgp8IFRlc3QgU3RhdGUgfCBDb3VudCB8CnwgLS0tLS0tLS0tLSB8IC0tLS0tIHwKfCBUb3RhbCAgICAgIHwgODQgfAp8IFBhc3NlZCAgICAgfCA4NCB8CnwgRXJyb3IgICAgICB8IDAgfAp8IEZhaWx1cmUgICAgfCAwIHwKfCBTa2lwcGVkICAgIHwgMCB8CgoKPGRldGFpbHMgPjxzdW1tYXJ5PlBhc3NlZCBUZXN0czwvc3VtbWFyeT4KCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfQ2hva2VQb2ludCAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLkNob2tlUG9pbnQgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvOS85LzUvZGF0YXNldF85OTUyNWEzMi04YTBmLTQ3MDgtYmM2Mi1kMjE0MGU2OTMwZjIuZGF0IiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIvb3V0cHV0cy9kYXRhc2V0XzhlMjc1NzVjLWZjNzUtNDY1ZC1iZDIzLTlhMDlmOWM1MjM4OS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBuZXR3b3JrLi4uCiAgICAgIENvbXB1dGluZyBjaG9rZSBwb2ludHMuLi4KICAgICAgRXhwb3J0IHJlc3VsdHMuLi4KICAgICAgZG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9DcmVhdGVNZXRhTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggcmVjb25zdHJ1Y3Rpb24uQ3JlYXRlTWV0YU5ldHdvcmsgLW4xICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2MvYy82L2RhdGFzZXRfY2M2ZDE4ZjYtMjc5YS00ZmQ5LWI1N2QtNGNmYzZhMWVmNzRjLmRhdCIgLW4yICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzUvNC9kL2RhdGFzZXRfNTRkOTJiZTctMWVmZi00MjUxLTkzOTAtMmRmOGNkOTc1MDFlLmRhdCIgLW4xZXggInMiIC1uMmV4ICJlIiAtbjFweCAiaHNhIiAtbjJweCAiZWNvIiAgIC1tYyAiYnlfbWV0YW5ldHgiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNS9vdXRwdXRzL2RhdGFzZXRfOTYzYjc0NjctMmFiYS00OTQxLWIxNjEtYTA3ZTFhYzg1NjdlLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgaU1MMTUxNQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBpTUwxNTE1CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfY2EzM2FjYjVfYzgwY180ZmJlXzk2MjJfNTcyN2M1MDFhODIxCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBJbXBvcnRpbmcgbmV0d29yayAxLi4uIERvbmUuCiAgICAgIEltcG9ydGluZyBuZXR3b3JrIDIuLi4gRG9uZS4KICAgICAgQ3JlYXRpbmcgbWV0YS1uZXR3b3JrLi4uIERvbmUuCiAgICAgIEV4cG9ydGluZyBNZXRhTmV0d29yay4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZXh0ZXJuYWwxIHwgYCAicyIgYCB8CiAgICAgICB8IGV4dGVybmFsMiB8IGAgImUiIGAgfAogICAgICAgfCBuMXByZWZpeCB8IGAgImhzYSIgYCB8CiAgICAgICB8IG4ycHJlZml4IHwgYCAiZWNvIiBgIHwKICAgICAgIHwga2VlcENvbXBhcnRtZW50IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZmlyc3RJc01ldGEgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnaW5nQ3JpdGVyaW9uIHwgYCAiYnlfbWV0YW5ldHgiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRGlzdGFuY2VNYXRyaXggKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5EaXN0YW5jZU1hdHJpeCAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9kLzcvMC9kYXRhc2V0X2Q3MDg0M2NkLTQyMmItNDY0Zi1iNGJiLTZjNjY4YWIxY2RlZi5kYXQiICAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC83L291dHB1dHMvZGF0YXNldF85OTU1ZjdhNC0xNmJmLTRjYjQtOTA2MC01MDJhOThjZjAxNTcuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHNlZWRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCBkZWdyZWUgfCBgIGZhbHNlIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0Rpc3RhbmNlTWF0cml4IChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMC9lL2MvZGF0YXNldF8wZWMzOTM0NC0xZTAwLTQzNWUtOGJiMy01OWYzZjk4NWJjMmYuZGF0IiAtc2MgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYS9hLzYvZGF0YXNldF9hYTZmMDAxZi1hZTMyLTQzNDktOTU3YS1mYTkwMzJiNzc3ZjIuZGF0IiAtZHcgLXUgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMC9vdXRwdXRzL2RhdGFzZXRfMzU2N2MxOWMtNWUyOC00Y2MxLWE3ZDktZmRkN2UyYzM0M2EwLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlbW92aW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDEgc2lkZSBjb21wb3VuZHMgaWdub3JlZCBkdXJpbmcgZ3JhcGggYnVpbGQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBzZWVkRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCB0cnVlIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdEFubm90YXRpb25zIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkV4dHJhY3RBbm5vdGF0aW9ucyAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy84L2YvMy9kYXRhc2V0XzhmMzBlNmMwLTdkYmYtNDU4Ni1iMzRmLTZhNjVkOWEyNzU1MC5kYXQiIC1leHBvcnQgIk1FVEFCT0xJVEUiIC1kYiAibWV0YW5ldHguY2hlbWljYWwiICAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMi9vdXRwdXRzL2RhdGFzZXRfZmM5YjA2YzQtNWEzZC00YTRhLWIwYmYtZjliMzY4NWQ3YjE1LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgYW5ub3RhdGlvbnMgZm91bmQgZm9yIDExMC8xMTEgbWV0YWJvbGl0ZXMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGV4cG9ydCB8IGAgIk1FVEFCT0xJVEUiIGAgfAogICAgICAgfCBkYiB8IGAgIm1ldGFuZXR4LmNoZW1pY2FsIiBgIHwKICAgICAgIHwgdW5pcSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHNraXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdEFubm90YXRpb25zIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkV4dHJhY3RBbm5vdGF0aW9ucyAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9mLzMvYi9kYXRhc2V0X2YzYmVmZjRlLTYzMzktNDBhMy05ZGQ1LTVjMjc2MTM5MGRiZS5kYXQiIC1leHBvcnQgIk1FVEFCT0xJVEUiIC1kYiAibWV0YW5ldHguY2hlbWljYWwiICAtc2tpcCAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE0L291dHB1dHMvZGF0YXNldF9kOTdjY2RjYi03N2U1LTQxYzUtOWUwMi1iY2NiN2RhZGE4Y2QuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBhbm5vdGF0aW9ucyBmb3VuZCBmb3IgMTEwLzExMSBtZXRhYm9saXRlcwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZXhwb3J0IHwgYCAiTUVUQUJPTElURSIgYCB8CiAgICAgICB8IGRiIHwgYCAibWV0YW5ldHguY2hlbWljYWwiIGAgfAogICAgICAgfCB1bmlxIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgc2tpcCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0V4dHJhY3RBbm5vdGF0aW9ucyAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5FeHRyYWN0QW5ub3RhdGlvbnMgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNC9iL2UvZGF0YXNldF80YmVkMDM0NS1lN2VkLTQ4ZjQtYTFlMi0zOWQ0YTEzNTE3MTkuZGF0IiAtZXhwb3J0ICJNRVRBQk9MSVRFIiAtZGIgIm1ldGFuZXR4LmNoZW1pY2FsIiAtdW5pcSAtc2tpcCAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE2L291dHB1dHMvZGF0YXNldF9kNDhlZjQwNy03MjhiLTQwN2UtOWFkMi04ZDA1Yzg2ZTU0ZmEuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBhbm5vdGF0aW9ucyBmb3VuZCBmb3IgMTEwLzExMSBtZXRhYm9saXRlcwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZXhwb3J0IHwgYCAiTUVUQUJPTElURSIgYCB8CiAgICAgICB8IGRiIHwgYCAibWV0YW5ldHguY2hlbWljYWwiIGAgfAogICAgICAgfCB1bmlxIHwgYCB0cnVlIGAgfAogICAgICAgfCBza2lwIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdFBhdGh3YXlzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkV4dHJhY3RQYXRod2F5cyAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy84LzAvMS9kYXRhc2V0XzgwMTNjMDE2LTVhZmMtNGUxMC05MWRhLWRjNTNhODQxZjE1Ni5kYXQiIC1wICJDaXRyaWNfQWNpZF9DeWNsZStGb2xhdGVfTWV0YWJvbGlzbSt0b3RvIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE4L291dHB1dHMvZGF0YXNldF83MDc5NjliNi05NTMwLTQzOTQtOTljMi0zYzg2YzM4MzkwNTYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBYZm0xMTU4CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgbmV0d29yayBleHBvcnRlZC4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgTnVtYmVyIG9mIHJlYWN0aW9ucyBpbiBvcmlnaW5hbCBuZXR3b3JrOiAxMTU4CiAgICAgIE51bWJlciBvZiBzcGVjaWVzIGluIG9yaWdpbmFsIG5ldHdvcms6IDExMDcKICAgICAgTnVtYmVyIG9mIGdlbmVzIGluIG9yaWdpbmFsIG5ldHdvcms6IDU3MQogICAgICBOdW1iZXIgb2YgcmVhY3Rpb25zIGluIHBhdGh3YXkgQ2l0cmljX0FjaWRfQ3ljbGUgKENpdHJpY19BY2lkX0N5Y2xlKTogMTEKICAgICAgTnVtYmVyIG9mIHNwZWNpZXMgaW4gcGF0aHdheSBDaXRyaWNfQWNpZF9DeWNsZSAoQ2l0cmljX0FjaWRfQ3ljbGUpOiAyNgogICAgICBOdW1iZXIgb2YgZ2VuZXMgaW4gcGF0aHdheSBDaXRyaWNfQWNpZF9DeWNsZSAoQ2l0cmljX0FjaWRfQ3ljbGUpOiAxOAogICAgICBOdW1iZXIgb2YgcmVhY3Rpb25zIGluIHBhdGh3YXkgRm9sYXRlX01ldGFib2xpc20gKEZvbGF0ZV9NZXRhYm9saXNtKTogNgogICAgICBOdW1iZXIgb2Ygc3BlY2llcyBpbiBwYXRod2F5IEZvbGF0ZV9NZXRhYm9saXNtIChGb2xhdGVfTWV0YWJvbGlzbSk6IDE2CiAgICAgIE51bWJlciBvZiBnZW5lcyBpbiBwYXRod2F5IEZvbGF0ZV9NZXRhYm9saXNtIChGb2xhdGVfTWV0YWJvbGlzbSk6IDgKICAgICAgRXJyb3I6IFBhdGh3YXkgdG90byBub3QgZm91bmQgaW4gbmV0d29yaywgcGxlYXNlIGNoZWNrIHNibWwgZmlsZS4KICAgICAgTnVtYmVyIG9mIHJlYWN0aW9ucyBpbiBuZXR3b3JrOiAxNwogICAgICBOdW1iZXIgb2Ygc3BlY2llcyBpbiBuZXR3b3JrOiAzNQogICAgICBOdW1iZXIgb2YgZ2VuZXMgaW4gbmV0d29yazogMjUKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHBhdGh3YXlJZCB8IGAgIkNpdHJpY19BY2lkX0N5Y2xlK0ZvbGF0ZV9NZXRhYm9saXNtK3RvdG8iIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdFN1YkJpcE5ldHdvcmsgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5FeHRyYWN0U3ViQmlwTmV0d29yayAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9iL2MvZS9kYXRhc2V0X2JjZTFiYWEzLWMyMzAtNGM1ZS1iNGI3LTI4NDNiYzdlNjRmNC5kYXQiIC1zICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzcvMS9jL2RhdGFzZXRfNzFjZDZiOTYtNTE5Yy00NjI5LWE3N2EtYmRhYTNiOGNhZDY2LmRhdCIgLXQgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMS83L2QvZGF0YXNldF8xN2RjNWE2Ni01ZGMyLTQwMjQtOGZhOC0zNDIzNzdjODg4YzAuZGF0IiAgLXNjICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2MvNS8xL2RhdGFzZXRfYzUxNDFlNzYtOTE3NC00NDZhLWI5YjItYzkyZjJmMTMwYTBiLmRhdCIgLWsgIjEiICAtZiAiZ21sIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIzL291dHB1dHMvZGF0YXNldF9hMDg0NTMzYi1mNGU3LTRhMjgtYjIyYy0xNmE2NGMxZjQyYWYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgcmVhZGluZyBTQk1MLi4uCiAgICAgIGltcG9ydGluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBleHRyYWN0aW5nIHNvdXJjZXMgYW5kIHRhcmdldHMKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgYmxrZFJlYWN0aW9uRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgayB8IGAgIjEiIGAgfAogICAgICAgfCBzdCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9FeHRyYWN0U3ViTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLkV4dHJhY3RTdWJOZXR3b3JrIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzUvNC9lL2RhdGFzZXRfNTRlODU1ZDMtYjc0OC00ZGI2LWFkN2EtYTQxZjIwYWZjMGM4LmRhdCIgLXMgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvOS8yLzQvZGF0YXNldF85MjQ0MTQ2ZC0xOWM1LTQ5MTQtYjdhZC00YTI4YzQ5NmNhY2EuZGF0IiAtdCAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy82LzIvNS9kYXRhc2V0XzYyNWNlOWQ2LTQ1NDItNDc3Yi05YTQ0LTIyZjhiNzRkOGViYi5kYXQiICAgIC1rICIxIiAgLWYgImdtbCIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yNy9vdXRwdXRzL2RhdGFzZXRfZGQyN2E0ZDMtNTE3My00YWNlLThiNGYtZWMyYjIwYzcxZjZmLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgIGV4dHJhY3Rpbmcgc291cmNlcyBhbmQgdGFyZ2V0cwoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBHTUwgY3JlYXRlZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHdlaWdodEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGNoZW1pY2FsU2ltIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGsgfCBgICIxIiBgIHwKICAgICAgIHwgc3QgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdFN1YlJlYWN0aW9uTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLkV4dHJhY3RTdWJSZWFjdGlvbk5ldHdvcmsgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNS84L2MvZGF0YXNldF81OGNlNjQ2Zi1lODU1LTRhYWItODA2Zi02ZWViYTJjNjA2MjAuZGF0IiAtcyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8yLzAvMy9kYXRhc2V0XzIwMzI4ZmVmLTU5ODMtNGM3My1iNmJjLTY3MzJjNDg4NmRlYy5kYXQiICAtdCAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy84L2EvYy9kYXRhc2V0XzhhYzYxNDk2LWRiODctNDZmMS1hNDJiLTIwYmQwYjQ0YzA0Ni5kYXQiIC1zYyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9lL2IvZi9kYXRhc2V0X2ViZmQ3NDNlLTNhOGUtNDRjZi1hZTY2LTQ5OTAxZDUyN2Q3Mi5kYXQiIC1rICIxIiAgLWYgImdtbCIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8zMi9vdXRwdXRzL2RhdGFzZXRfZjMxZGZkMDMtN2JjNS00NWM1LTljOTAtNDhkNjU3NjE1NTNjLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVsZW1lbnQgLy8gQ29weXJpZ2h0IDIwMjUgbGNvdHRyZXQgbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBub3QgZm91bmQgaW4gbmV0d29yawogICAgICBFbGVtZW50IC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyBub3QgZm91bmQgaW4gbmV0d29yawogICAgICBFbGVtZW50IC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBub3QgZm91bmQgaW4gbmV0d29yawogICAgICBFbGVtZW50IC8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgLy8gbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIDE0IHNpZGUgY29tcG91bmRzIG5vdCBmb3VuZCBpbiBuZXR3b3JrLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICByZWFkaW5nIFNCTUwuLi4KICAgICAgUmVhZCBmaWxlIGNvbnRhaW5pbmcgc2lkZSBjb21wb3VuZHMuLi4KICAgICAgZXh0cmFjdGluZyBzb3VyY2VzIGFuZCB0YXJnZXRzCiAgICAgIEdNTCBjcmVhdGVkLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCBrIHwgYCAiMSIgYCB8CiAgICAgICB8IHN0IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZm9ybWF0IHwgYCAiZ21sIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0ZiY1RvTm90ZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuRmJjVG9Ob3RlcyAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8zL2UvMi9kYXRhc2V0XzNlMjU5ZjA3LTUyOGItNDBjNy05ZjU0LWE4NzdkOTEyMjM4Yy5kYXQiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMzQvb3V0cHV0cy9kYXRhc2V0XzczM2VlMDIyLTk4NGQtNDQxMy1hZGYwLTRjZmMyOTBhNDliMi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgaU1MMTUxNQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBpTUwxNTE1CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBpTUwxNTE1CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaGFzUHJvcGVydHksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBoYXNQcm9wZXJ0eSwgc2V0IHRvIEhBU19QUk9QRVJUWQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0dldEJpZ2dNb2RlbFByb3Rlb21lIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBiaWdnLkdldEJpZ2dNb2RlbFByb3Rlb21lIC1tICJlX2NvbGlfY29yZSIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8zNS9vdXRwdXRzL2RhdGFzZXRfMWQ2NDllOWYtNDZhYi00YTBmLWE5MWMtODExN2NhMjM1ZjBkLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IG1vZGVsSWQgfCBgICJlX2NvbGlfY29yZSIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgImRhdGEiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0RW50aXRpZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuR2V0RW50aXRpZXMgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvOC8xL2QvZGF0YXNldF84MWQ5M2JhZC03ZTQ4LTRiMjYtYTdkZi0yYWQwNGY5M2I4YTQuZGF0IiAgICAgICAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzM3L291dHB1dHMvZGF0YXNldF9lNTM1ODI2Ny00MmNhLTQ3NTktYjg4Mi0yYTMyNjAyYWUyY2MuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHByaW50TWV0YWJvbGl0ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBwcmludFJlYWN0aW9ucyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHByaW50Q29tcGFydG1lbnRzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcHJpbnRQYXRod2F5cyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHByaW50R2VuZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBub1R5cGVDb2wgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0RW50aXRpZXMgKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuR2V0RW50aXRpZXMgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNi9iL2EvZGF0YXNldF82YmFiMTg0YS01Y2NlLTRlZmUtYWJlNy0yMzRiNjlhMmM3N2UuZGF0IiAtbSAtciAtYyAgLWcgLW50IC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMzkvb3V0cHV0cy9kYXRhc2V0X2YyOTViMjQ0LTZkMTctNDIwZi1hNTM5LTk1NWJiZTVkZGRlZC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgcHJpbnRNZXRhYm9saXRlcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcHJpbnRSZWFjdGlvbnMgfCBgIHRydWUgYCB8CiAgICAgICB8IHByaW50Q29tcGFydG1lbnRzIHwgYCB0cnVlIGAgfAogICAgICAgfCBwcmludFBhdGh3YXlzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcHJpbnRHZW5lcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbm9UeXBlQ29sIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0R2VuZXNGcm9tUmVhY3Rpb25zIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkdldEdlbmVzRnJvbVJlYWN0aW9ucyAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9iLzYvNS9kYXRhc2V0X2I2NTgwZjc1LTFiY2ItNDFiMS05NDMyLTVmNjFlOGJjNGY3NS5kYXQiIC1yICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzcvYS9kL2RhdGFzZXRfN2FkZjgxYzItZTVmNC00ZjY0LWI4NjItYmQ1ZDk4ZWY0NTg3LmRhdCIgLXNlcCAiCSIgIC1jb2wgIjEiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNDIvb3V0cHV0cy9kYXRhc2V0XzI1MWJmODkzLTVlN2EtNDM3NS1iODAyLWFmOTYwYTE4NDdjZi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgcmVhY3Rpb25zIG1hcHBlZAogICAgICAwIHJlYWN0aW9ucyBub3QgZm91bmQgaW4gbW9kZWwKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNlcCB8IGAgIlx0IiBgIHwKICAgICAgIHwgaGFzSGVhZGVyIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgaSB8IGAgIjEiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0TWV0YWJvbGl0ZUF0dHJpYnV0ZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuR2V0TWV0YWJvbGl0ZUF0dHJpYnV0ZXMgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvZS8zL2UvZGF0YXNldF9lM2UxMWJlYy1lNzU3LTQ1YmQtYjRjMC0wMmE3N2I3NTEyYWYuZGF0IiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzQ0L291dHB1dHMvZGF0YXNldF80MGRiZGM0Ny1lODViLTRmNzQtYjQ1NS01MTE1NzM2YjFhNjkuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0UmVhY3RhbnRzRnJvbVJlYWN0aW9ucyAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5HZXRSZWFjdGFudHNGcm9tUmVhY3Rpb25zIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2EvNy8xL2RhdGFzZXRfYTcxYmE0MGItYTlkNS00N2Q2LTliN2MtZDc0MTAwNmIyMGNiLmRhdCIgLXIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvZi9lL2QvZGF0YXNldF9mZWQ4YzY1Yi02ZTBhLTQ5ODItYjdhNC0yNjg5NzJjYTVjMTAuZGF0IiAtc2VwICIJIiAgLWNvbCAiMSIgICAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzQ3L291dHB1dHMvZGF0YXNldF9lNzE2MTUwOC1iMjM1LTRlOTMtYWVjNC1jOGIyNzFhNzBhOWQuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIHJlYWN0aW9ucyBtYXBwZWQKICAgICAgMCByZWFjdGlvbnMgbm90IGZvdW5kIGluIG1vZGVsCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBzZXAgfCBgICJcdCIgYCB8CiAgICAgICB8IGhhc0hlYWRlciB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGkgfCBgICIxIiBgIHwKICAgICAgIHwgcHJpbnRTdWJzdHJhdGVzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcHJpbnRQcm9kdWN0cyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9HZXRSZWFjdGFudHNGcm9tUmVhY3Rpb25zIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkdldFJlYWN0YW50c0Zyb21SZWFjdGlvbnMgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMy84LzAvZGF0YXNldF8zODA2YzQ2MS0yMzUzLTRjMTEtYjY4Ny04ZjA0ZDU1MGE5YjEuZGF0IiAtciAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8zL2QvYS9kYXRhc2V0XzNkYWRmOGE5LTk2OTEtNGQ5ZS05MDc3LWQ3ZTY0N2RlOTRlOC5kYXQiIC1zZXAgIgkiICAtY29sICIxIiAtcyAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC81MC9vdXRwdXRzL2RhdGFzZXRfNGUzMmQ3ZDctNDE4MS00YjBlLWJjZDQtMTdhNzE0YjEyNGVjLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMiByZWFjdGlvbnMgbWFwcGVkCiAgICAgIDAgcmVhY3Rpb25zIG5vdCBmb3VuZCBpbiBtb2RlbAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgc2VwIHwgYCAiXHQiIGAgfAogICAgICAgfCBoYXNIZWFkZXIgfCBgIGZhbHNlIGAgfAogICAgICAgfCBpIHwgYCAiMSIgYCB8CiAgICAgICB8IHByaW50U3Vic3RyYXRlcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcHJpbnRQcm9kdWN0cyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9HZXRSZWFjdGFudHNGcm9tUmVhY3Rpb25zIChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkdldFJlYWN0YW50c0Zyb21SZWFjdGlvbnMgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMi9mLzcvZGF0YXNldF8yZjc1MjUxNy1iZmJkLTRmMmYtOWUwMC1mZjA4YjM4YjlhYWMuZGF0IiAtciAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8zLzEvZC9kYXRhc2V0XzMxZDdhNWY0LWU2ZmMtNGZhZS04MTE2LWMwNjA4NWQzMTdjYi5kYXQiIC1zZXAgIgkiICAtY29sICIxIiAgLXAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC81My9vdXRwdXRzL2RhdGFzZXRfNzU4YzYyM2YtYmJhYi00YWIzLWEyNDgtYjZjYjcxMDhjMjk1LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMiByZWFjdGlvbnMgbWFwcGVkCiAgICAgIDAgcmVhY3Rpb25zIG5vdCBmb3VuZCBpbiBtb2RlbAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgc2VwIHwgYCAiXHQiIGAgfAogICAgICAgfCBoYXNIZWFkZXIgfCBgIGZhbHNlIGAgfAogICAgICAgfCBpIHwgYCAiMSIgYCB8CiAgICAgICB8IHByaW50U3Vic3RyYXRlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHByaW50UHJvZHVjdHMgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9Mb2FkUG9pbnQgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5Mb2FkUG9pbnQgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvZC9lL2EvZGF0YXNldF9kZWEzMjc1OC02MjI4LTQ2YjAtODk4Zi1lYTRkNzQzMmQwOTUuZGF0IiAtayAiMSIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC81NS9vdXRwdXRzL2RhdGFzZXRfMGNiZjM0MzItZGVkNS00MzljLWE3NjYtMmUwMTBmODlhZjJhLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBuZXR3b3JrLi4uCiAgICAgIENvbXB1dGluZyBsb2FkIHBvaW50cy4uLgogICAgICBFeHBvcnQgcmVzdWx0cy4uLgogICAgICBkb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgc2lkZUNvbXBvdW5kRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgayB8IGAgIjEiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfTWV0YWJvUmFuayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLk1ldGFib1JhbmsgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvZi81LzYvZGF0YXNldF9mNTY1OWQ1MC1mMTVmLTQxZWYtYTc0Ny1hYWRmOGE2YWIyNDIuZGF0IiAtcyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy84LzIvYS9kYXRhc2V0XzgyYTI0ODVhLWUzYTYtNDE2Ni1iNzczLTcxMmQ4ZThkZjM2MC5kYXQiIC1zYyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8xL2YvNi9kYXRhc2V0XzFmNjRjY2VlLWMwZTQtNDM3NC04MjVhLWQ1NzcwNDNjNTE0NC5kYXQiIC1tYXggIjE1MDAwIiAtdCAiMC4wMDEiIC1kICIwLjg1IiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzU5L291dHB1dHMvZGF0YXNldF9iYmEwYzEwMC1lNWVlLTRlZmYtYTBjYi1hOTBjY2M4M2QzYWYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICAyIGlzb2xhdGVkIG5vZGVzIHJlbW92ZWQgCiAgICAgIHRyYW5zaXRpb24gcHJvYmFiaWxpdGllcyBjb21wdXRlZAogICAgICB0cmFuc2l0aW9uIHByb2JhYmlsaXRpZXMgY29tcHV0ZWQgKHJldmVyc2UgZ3JhcGgpCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBjb21wb3VuZCBncmFwaCBjcmVhdGVkLgogICAgICByZW1vdmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICA2IGNvbXBvdW5kcyByZW1vdmVkLgogICAgICB3ZWlnaHRzIGNvbXB1dGVkLgogICAgICByZXZlcnNlIGdyYXBoIGNyZWF0ZWQuCiAgICAgIHNlZWRzIGZpbGUgaW1wb3J0ZWQKICAgICAgMyBzZWVkcwogICAgICBnbG9iYWwgcGFnZVJhbmsgY29tcHV0ZWQKICAgICAgZ2xvYmFsIGNoZWlSYW5rIGNvbXB1dGVkCiAgICAgIHBhZ2VSYW5rIGNvbXB1dGVkCiAgICAgIGNoZWlSYW5rIGNvbXB1dGVkCiAgICAgIGRvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBlZGdlV2VpZ2h0c0ZpbGVQYXRocyB8IGAgTm9uZSBgIHwKICAgICAgIHwgbWF4TmJPZkl0ZXIgfCBgICIxNTAwMCIgYCB8CiAgICAgICB8IHRvbGVyYW5jZSB8IGAgIjAuMDAxIiBgIHwKICAgICAgIHwgZGFtcGluZ0ZhY3RvciB8IGAgIjAuODUiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfTmV0d29ya1N1bW1hcnkgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5OZXR3b3JrU3VtbWFyeSAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy85LzgvNC9kYXRhc2V0Xzk4NGFlZDdiLWYxMWEtNDhiYy05Yzk4LTgxMzcyNDExZTMwNi5kYXQiICAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC82MS9vdXRwdXRzL2RhdGFzZXRfMTc0MDUwNDAtMTk5Yy00ZGUwLTllZmUtMDM0MzlhYmQ3OTg0LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBncmFwaC4uLgogICAgICBwZXJmb3JtIGJhc2ljIGFuYWx5c2lzLi4uCiAgICAgIGV4dHJhY3QgY29ubmVjdGVkIGNvbXBvbmVudC4uLgogICAgICBDb21wdXRlIGRlbnNpdHkuLi4KICAgICAgQ29tcHV0ZSBsb2NhbCBjbHVzdGVyaW5nIGNvZWZmaWNpZW50cy4uLgogICAgICBDb21wdXRlIGRlZ3JlZSBzdGF0aXN0aWNzLi4uCiAgICAgIENvbXB1dGUgZGlzdGFuY2VzLi4uCiAgICAgIENvbXB1dGUgZGlzdGFuY2VzIHN0YXRpc3RpY3MuLi4KICAgICAgQ29tcHV0ZSBjZW50cmFsaXR5Li4uCiAgICAgIAlDbG9zZW5lc3MgZG9uZS4KICAgICAgRG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHNraXBkaXN0IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZGlyZWN0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfT1JBcGF0aHdheUVucmljaG1lbnQgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG1hcHBpbmcuT1JBcGF0aHdheUVucmljaG1lbnQgLXRoICIwLjAiIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzEvNy9kL2RhdGFzZXRfMTdkYjZhZGItMTBmYi00NDJhLTkwYmItYjJhZGYzNjU4NDZiLmRhdCIgLWQgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvOC80LzQvZGF0YXNldF84NDQwNTVmNy00YjgzLTQ5MDQtOGZlMi02ZmY4MGY0YWY5MmMuZGF0IiAtYyAiQmVuamFtaW5pSG9jaGJlcmciIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNjQvb3V0cHV0cy9kYXRhc2V0X2FiYjc4NzRlLTNkNjEtNDMyNy05ZjdkLTA5MTljY2QwMzhmZS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCiAgICAgIEltcG9ydCBkYXRhLi4uCiAgICAgIDMgY29tcG91bmRzIGltcG9ydGVkLgogICAgICAgRG9uZS4KICAgICAgUGVyZm9ybSBQYXRod2F5IEVucmljaG1lbnQuLi4gRG9uZS4KICAgICAgRXhwb3J0IHJlc3VsdHMuLi4KICAgICAgZG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHRoIHwgYCAiMC4wIiBgIHwKICAgICAgIHwgY29yciB8IGAgIkJlbmphbWluaUhvY2hiZXJnIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX09SQXBhdGh3YXlFbnJpY2htZW50IChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBtYXBwaW5nLk9SQXBhdGh3YXlFbnJpY2htZW50IC10aCAiMC4wMDUiIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzYvYS84L2RhdGFzZXRfNmE4MGI5ZWYtNGI2Yi00Njg5LTk3NTItNWNlNzE4MDE3OGU1LmRhdCIgLWQgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvZi9kL2MvZGF0YXNldF9mZGNiM2E0Zi0xZmY1LTQyYmEtYjUxZC1hMjViMzQ5ZWM3NGIuZGF0IiAtYyAiSG9sbUJvbmZlcnJvbmkiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNjcvb3V0cHV0cy9kYXRhc2V0XzRjMTkzN2FjLWZlMWQtNGFjMy05M2ViLWU1NDZlMzdhNjVkNi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCiAgICAgIEltcG9ydCBkYXRhLi4uCiAgICAgIDMgY29tcG91bmRzIGltcG9ydGVkLgogICAgICAgRG9uZS4KICAgICAgUGVyZm9ybSBQYXRod2F5IEVucmljaG1lbnQuLi4gRG9uZS4KICAgICAgU2VsZWN0IHNpZ25pZmljYW50IHBhdGh3YXlzLi4uCiAgICAgIAkyIHNpZ25pZmljYW50IHBhdGh3YXlzIGZvdW5kLgogICAgICAgRG9uZS4KICAgICAgRXhwb3J0IHJlc3VsdHMuLi4KICAgICAgZG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHRoIHwgYCAiMC4wMDUiIGAgfAogICAgICAgfCBjb3JyIHwgYCAiSG9sbUJvbmZlcnJvbmkiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUHJlY3Vyc29yTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlByZWN1cnNvck5ldHdvcmsgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYS8wLzQvZGF0YXNldF9hMDQ5MzdmNi1jNGYxLTQyZWYtYjM4OS1lMWFiZTZjNzc0YWEuZGF0IiAtdCAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy80LzIvMi9kYXRhc2V0XzQyMjBkZTBhLWY4MjEtNGFhZi04NWZhLTEzOGE0OTA3OWNmOC5kYXQiIC1mICJnbWwiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNzAvb3V0cHV0cy9kYXRhc2V0X2NmNzI4NTBkLTU5YzMtNDY3Yi1iY2FkLTM4ZTE4MDg4MTk3NC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBHTUwgY3JlYXRlZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHJlYWN0aW9uVG9JZ25vcmVGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlJlYWN0aW9uRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMC84LzYvZGF0YXNldF8wODY5Nzk0Zi0yZWE4LTRjOTYtOTBiMS1mYmU4YmZlYTgwYzMuZGF0IiAgIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNzIvb3V0cHV0cy9kYXRhc2V0XzI1ZGQ5N2FiLTFhNTItNDcwYi1iYjQ1LTNkNmE1NjlmNzI5Ny5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1JlYWN0aW9uRGlzdGFuY2VNYXRyaXggKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5SZWFjdGlvbkRpc3RhbmNlTWF0cml4IC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzYvZS9iL2RhdGFzZXRfNmViNjVhYzEtODQzMi00ZTIyLWI3Y2MtOGQ5OGRhYjZmYTU5LmRhdCIgIC11IC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNzQvb3V0cHV0cy9kYXRhc2V0XzZiNTIxZjE5LTg4ZDItNDNhMi04MGI3LTE4NDgzNDVmMzk3ZS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlJlYWN0aW9uRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMy84L2YvZGF0YXNldF8zOGZhNWQ0YS0wZTEwLTQ2NjUtOTc5My1mY2E1NmM2ODZmYTYuZGF0IiAtc2MgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYy8wL2EvZGF0YXNldF9jMGFkYWYwOS0wYmQ2LTRiYTQtOTI3Ni00YTJjYTY1MGY5MDguZGF0IiAgLXUgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC83Ny9vdXRwdXRzL2RhdGFzZXRfNGM1NmVhYTMtMWYzZC00YTI4LThiMTAtZTEzYTM2NjVhMTM2LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICAxIHNpZGUgY29tcG91bmRzIHRvIGlnbm9yZSBkdXJpbmcgZ3JhcGggYnVpbGQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAoVGVzdCAjIDQpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlJlYWN0aW9uRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMC8xLzIvZGF0YXNldF8wMTJlMTUwYy1iNjVjLTRlNTQtYjlkNC0zMDdhZWEyMGJlNzMuZGF0IiAgLXJlICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzgvNS83L2RhdGFzZXRfODU3ZmRhZjItNjA3NS00NTJiLWI3YjctNjI3MzBjMGQyYzY2LmRhdCIgLXUgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC84MC9vdXRwdXRzL2RhdGFzZXRfNWJjYjhkYTctMDNiZS00YzY0LTk2MTAtZTU1YzAyOGVjMDI2LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLgogICAgICByZW1vdmluZyByZWFjdGlvbnMgdG8gZXhjbHVkZS4uLgogICAgICAxIHJlYWN0aW9ucyBpZ25vcmVkIGR1cmluZyBncmFwaCBidWlsZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJ4bkZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHdlaWdodEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9SZWFjdGlvbkRpc3RhbmNlTWF0cml4IChUZXN0ICMgNSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9hL2MvZC9kYXRhc2V0X2FjZDIxODNhLTZhZmEtNDA3MS1iMTQ2LTlmMzg5MGJlMzNkYy5kYXQiIC1zYyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy80L2UvOC9kYXRhc2V0XzRlODgwZmJkLTBmZGEtNDAyNy04M2M3LWUwZWY5YzZmZjgyMC5kYXQiICAtcmUgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMy9mLzkvZGF0YXNldF8zZjk4YjM1Yi1jODY3LTRjNzItOGExNy1kOGIxZjViMWNkMTYuZGF0IiAtdSAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzg0L291dHB1dHMvZGF0YXNldF8zMzEwZWY5NS0xMjA0LTRlOGEtODUwNS04ODI4YjBlNjRlMmUuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDEgc2lkZSBjb21wb3VuZHMgdG8gaWdub3JlIGR1cmluZyBncmFwaCBidWlsZAogICAgICByZW1vdmluZyByZWFjdGlvbnMgdG8gZXhjbHVkZS4uLgogICAgICAxIHJlYWN0aW9ucyBpZ25vcmVkIGR1cmluZyBncmFwaCBidWlsZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJ4bkZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHdlaWdodEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9SZWFjdGlvbkRpc3RhbmNlTWF0cml4IChUZXN0ICMgNik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy81LzIvMC9kYXRhc2V0XzUyMDZhNjVjLWJmOGYtNGY0Zi04ZWI0LWRmMjAwNWQ4MTA4ZC5kYXQiIC1zYyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy80L2EvNC9kYXRhc2V0XzRhNDdkM2MyLTY0NmUtNDUwNS04ODgzLTAwZWQwYzU0YzZkZi5kYXQiICAtcmUgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMS8wL2QvZGF0YXNldF8xMGQzNDcxYi0zMWE2LTRlMTYtYTFmNS0yNTFhM2YwMTlmN2QuZGF0IiAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC84OC9vdXRwdXRzL2RhdGFzZXRfODlkOTBiMzQtOTNjMC00MGM0LTk0OGQtYzJhMzIwNTE4ZjNjLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICAxIHNpZGUgY29tcG91bmRzIHRvIGlnbm9yZSBkdXJpbmcgZ3JhcGggYnVpbGQKICAgICAgcmVtb3ZpbmcgcmVhY3Rpb25zIHRvIGV4Y2x1ZGUuLi4KICAgICAgMSByZWFjdGlvbnMgaWdub3JlZCBkdXJpbmcgZ3JhcGggYnVpbGQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBkZWdyZWUgfCBgIGZhbHNlIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NibWwyQ2FyYm9uU2tlbGV0b25OZXQgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8wL2IvNi9kYXRhc2V0XzBiNjY4MGMzLWIyN2ItNDgzMy05ZDcyLTU1MGUyMmUwMjlmZC5kYXQiIC1nICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzQvNS83L2RhdGFzZXRfNDU3OTEzZDMtNTYxYy00ZTNkLThmYjctYmI5NjIzMGQ5MmY4LmRhdCIgICAgICAgLWYgImdtbCIgICAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzkxL291dHB1dHMvZGF0YXNldF83YjFjZDI2Yy0zNTNlLTQ4ZTAtOWVjMS1iNzM4ZDk2MzljNjAuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIDExMSBub2RlcyBhbmQgMjAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgIEV4cG9ydGluZy4uLkdNTCBjcmVhdGVkLgogICAgICAgRG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGtlZXBTaW5nbGVDYXJib24gfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnZUNvbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnZUVkZ2VzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcmVtb3ZlSXNvbGF0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY29tcHV0ZVdlaWdodCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IG1haW4gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmcm9tSW5kZXhlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNhcmJvblNrZWxldG9uTmV0IChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ2FyYm9uU2tlbGV0b25OZXQgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNS9mL2IvZGF0YXNldF81ZmI2NThiZi02ODAyLTRlOTUtYmE5Yy02ZGJkOTU0NDk1ZjAuZGF0IiAtZyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8xLzAvNi9kYXRhc2V0XzEwNjgyM2Y5LWUwYzAtNGQwNi1iNmE3LWQ0MTcyMzFiYzVjZC5kYXQiIC1rcyAgICAgIC1mICJnbWwiICAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC85NC9vdXRwdXRzL2RhdGFzZXRfNTg3MDA3NGYtNjNmMi00YmNlLWFkYjItODExMDE4M2IzNTZiLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgMCBlZGdlcyBpbiBmaWxlIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGgKICAgICAgMjA1IHdlaWdodHMgc2V0IGFtb25nIDUwMiBlZGdlcyBpbiBncmFwaAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi43NSByZWFjdGlvbnMgYW5kIDExMSBtZXRhYm9saXRlcyByZWFkLgogICAgICAgRG9uZS4KICAgICAgQnVpbGRpbmcgTmV0d29yay4uLjExMSBub2RlcyBhbmQgNTAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgICBEb25lLgogICAgICBQcm9jZXNzaW5nIGF0b20gbWFwcGluZ3MuLi5Eb25lLgogICAgICAxMTEgbm9kZXMgYW5kIDIwNSBlZGdlcyBjcmVhdGVkLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBrZWVwU2luZ2xlQ2FyYm9uIHwgYCB0cnVlIGAgfAogICAgICAgfCBtZXJnZUNvbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnZUVkZ2VzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcmVtb3ZlSXNvbGF0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY29tcHV0ZVdlaWdodCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IG1haW4gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmcm9tSW5kZXhlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNhcmJvblNrZWxldG9uTmV0IChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ2FyYm9uU2tlbGV0b25OZXQgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMS9kLzYvZGF0YXNldF8xZDYzYTkyNC02ODA2LTRlM2YtOTk1YS1lNTk0OTU1MWY0NDAuZGF0IiAtZyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy83LzMvMi9kYXRhc2V0XzczMmVhYWRjLTVkNjItNGVkMi05MWU0LTc0NjAxNjczZGJkZC5kYXQiICAtbWMgICAgIC1mICJnbWwiICAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC85Ny9vdXRwdXRzL2RhdGFzZXRfMjUxOGIzYWYtODA5Mi00NGViLWExZTUtNTRlZmY5NWU4OGM3LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgMCBlZGdlcyBpbiBmaWxlIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGgKICAgICAgMjA1IHdlaWdodHMgc2V0IGFtb25nIDUwMiBlZGdlcyBpbiBncmFwaAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi43NSByZWFjdGlvbnMgYW5kIDExMSBtZXRhYm9saXRlcyByZWFkLgogICAgICAgRG9uZS4KICAgICAgQnVpbGRpbmcgTmV0d29yay4uLjExMSBub2RlcyBhbmQgNTAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgICBEb25lLgogICAgICBQcm9jZXNzaW5nIGF0b20gbWFwcGluZ3MuLi5Eb25lLgogICAgICBNZXJnaW5nIGNvbXBhcnRtZW50cy4uLiBEb25lLgogICAgICBTa2lwIGNvbXBvdW5kcyB3aXRoIGxlc3MgdGhhbiB0d28gY2FyYm9ucyBkZXRlY3RlZC4uLgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIDgzIG5vZGVzIGFuZCAyMDIgZWRnZXMgY3JlYXRlZC4KICAgICAgRXhwb3J0aW5nLi4uR01MIGNyZWF0ZWQuCiAgICAgICBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAoVGVzdCAjIDQpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkNhcmJvblNrZWxldG9uTmV0IC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2UvNC82L2RhdGFzZXRfZTQ2OTgxMGQtMjgzMy00NzJjLTkwOTYtZmFjZGY5MzMyYTUxLmRhdCIgLWcgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvZS9kLzEvZGF0YXNldF9lZDEyOTI0Mi1iNjg1LTQyZjYtOWRlYS0xMmNlODhlOTcwM2EuZGF0IiAgIC1tZSAgICAtZiAiZ21sIiAgIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTAwL291dHB1dHMvZGF0YXNldF83ZGU1OTY4OC02NzA2LTQ4MTQtYTBiOC1lYzYxZGFiZDQ1ZTcuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIE1lcmdpbmcgZWRnZXMuLi4gRG9uZS4KICAgICAgMTExIG5vZGVzIGFuZCAxNDMgZWRnZXMgY3JlYXRlZC4KICAgICAgRXhwb3J0aW5nLi4uR01MIGNyZWF0ZWQuCiAgICAgICBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIHRydWUgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAoVGVzdCAjIDUpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkNhcmJvblNrZWxldG9uTmV0IC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2MvYi84L2RhdGFzZXRfY2I4MzU2YzQtOTBiYi00N2EzLWJjYTYtNjBlM2M0YzkzMDQzLmRhdCIgLWcgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMy81LzgvZGF0YXNldF8zNTgyOTY4Yi03NDBlLTQ4OTQtOWNkMC1jYmE2NzNmNjYxZDIuZGF0IiAgICAtcmkgICAtZiAiZ21sIiAgIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTAzL291dHB1dHMvZGF0YXNldF81NDVhZTljMy04ZWIwLTQ2ODctYTQ5Ni02MTcxNGZkNjlkMzkuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCiAgICAgIDE2IGlzb2xhdGVkIG5vZGVzIHJlbW92ZWQgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIFJlbW92ZSBpc29sYXRlZCBub2Rlcy4uLgogICAgICAJcmVtb3ZpbmcgQ08yCiAgICAgIAlyZW1vdmluZyBIMk8KICAgICAgCXJlbW92aW5nIGZydWN0b3NlLTMtcGhvc3BoYXRlCiAgICAgIAlyZW1vdmluZyAzLWtldG8tYmV0YS1ELWdhbGFjdG9zZQogICAgICAJcmVtb3ZpbmcgZ2FsYWN0b3NlCiAgICAgIAlyZW1vdmluZyBIMk8KICAgICAgCXJlbW92aW5nIEgrCiAgICAgIAlyZW1vdmluZyBIMk8KICAgICAgCXJlbW92aW5nIEgyTwogICAgICAJcmVtb3ZpbmcgSCsKICAgICAgCXJlbW92aW5nIEgrCiAgICAgIAlyZW1vdmluZyBQUGkKICAgICAgCXJlbW92aW5nIGZydWN0b3NlCiAgICAgIAlyZW1vdmluZyBDTzIKICAgICAgCXJlbW92aW5nIFBpCiAgICAgIAlyZW1vdmluZyBIKwogICAgICAgRG9uZS4KICAgICAgOTUgbm9kZXMgYW5kIDIwMiBlZGdlcyBjcmVhdGVkLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBrZWVwU2luZ2xlQ2FyYm9uIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VDb21wIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY29tcHV0ZVdlaWdodCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IG1haW4gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmcm9tSW5kZXhlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNhcmJvblNrZWxldG9uTmV0IChUZXN0ICMgNik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ2FyYm9uU2tlbGV0b25OZXQgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYS9jLzYvZGF0YXNldF9hYzZiOTc0ZC0zYmVmLTQzMmYtOTA1Ny02MTdkOGY2NjQ3Y2QuZGF0IiAtZyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy82L2EvYi9kYXRhc2V0XzZhYmNkMGViLWJjN2QtNDE2ZC1iMjA0LWU3ZGEwZGViNzI2NC5kYXQiICAgICAtdW4gIC1mICJnbWwiICAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMDYvb3V0cHV0cy9kYXRhc2V0X2RlZWQ2MDQwLTZiMTQtNGM2NS05MWE2LTY1MTExMmRiNmVhZC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIDAgZWRnZXMgaW4gZmlsZSBub3QgZm91bmQgaW4gdGhlIGdyYXBoCiAgICAgIDIwNSB3ZWlnaHRzIHNldCBhbW9uZyA1MDIgZWRnZXMgaW4gZ3JhcGgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uNzUgcmVhY3Rpb25zIGFuZCAxMTEgbWV0YWJvbGl0ZXMgcmVhZC4KICAgICAgIERvbmUuCiAgICAgIEJ1aWxkaW5nIE5ldHdvcmsuLi4xMTEgbm9kZXMgYW5kIDUwMiBlZGdlcyBjcmVhdGVkLgogICAgICAgRG9uZS4KICAgICAgUHJvY2Vzc2luZyBhdG9tIG1hcHBpbmdzLi4uRG9uZS4KICAgICAgQ3JlYXRlIFVuZGlyZWN0ZWQuLi4gRG9uZS4KICAgICAgU2tpcCBjb21wb3VuZHMgd2l0aCBsZXNzIHRoYW4gdHdvIGNhcmJvbnMgZGV0ZWN0ZWQuLi4KICAgICAgCWRpc2Nvbm5lY3RpbmcgQ08yCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAgRG9uZS4KICAgICAgMTExIG5vZGVzIGFuZCAyNzAgZWRnZXMgY3JlYXRlZC4KICAgICAgRXhwb3J0aW5nLi4uR01MIGNyZWF0ZWQuCiAgICAgICBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAoVGVzdCAjIDcpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkNhcmJvblNrZWxldG9uTmV0IC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzgvOS9lL2RhdGFzZXRfODllYzBiNzAtYjRhYi00MTQ2LTg5ZjAtOWIwNGU1ZTBjYzM1LmRhdCIgLWcgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMS82L2UvZGF0YXNldF8xNmU2MmM5Ny1jMGUxLTRhMDctODE3Zi1hMDNkZjMxZjZmMjYuZGF0IiAgICAgICAtZiAibWF0cml4IiAgIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTA5L291dHB1dHMvZGF0YXNldF9hZDMyYjY2Zi0xZjQxLTQ2MDUtODFjMS1mZDgxOTIxOGJmYTYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIDExMSBub2RlcyBhbmQgMjAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgIEV4cG9ydGluZy4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjb21wdXRlV2VpZ2h0IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZm9ybWF0IHwgYCAibWF0cml4IiBgIHwKICAgICAgIHwgbWFpbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZyb21JbmRleGVzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NibWwyQ2FyYm9uU2tlbGV0b25OZXQgKFRlc3QgIyA4KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9mL2YvYy9kYXRhc2V0X2ZmYzNjNTA0LTc1MjktNDhmMi05N2I2LTc2ZWExOTUzMDg5ZS5kYXQiIC1nICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2YvYi81L2RhdGFzZXRfZmI1OWUxZTMtMmU0OC00NGY3LThkYzctZDExODhjMjA1YTk5LmRhdCIgICAgICAgLWYgImdtbCIgIC1maSAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzExMi9vdXRwdXRzL2RhdGFzZXRfOWRlNDMxZWItNzUxOC00Y2E4LWE5NGQtMWQxYTY0MDRiZGIwLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgMCBlZGdlcyBpbiBmaWxlIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGgKICAgICAgMjA2IHdlaWdodHMgc2V0IGFtb25nIDUwMiBlZGdlcyBpbiBncmFwaAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi43NSByZWFjdGlvbnMgYW5kIDExMSBtZXRhYm9saXRlcyByZWFkLgogICAgICAgRG9uZS4KICAgICAgQnVpbGRpbmcgTmV0d29yay4uLjExMSBub2RlcyBhbmQgNTAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgICBEb25lLgogICAgICBQcm9jZXNzaW5nIGF0b20gbWFwcGluZ3MuLi5Eb25lLgogICAgICBTa2lwIGNvbXBvdW5kcyB3aXRoIGxlc3MgdGhhbiB0d28gY2FyYm9ucyBkZXRlY3RlZC4uLgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgCWRpc2Nvbm5lY3RpbmcgQ08yCiAgICAgICBEb25lLgogICAgICAxMTEgbm9kZXMgYW5kIDIwMyBlZGdlcyBjcmVhdGVkLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBrZWVwU2luZ2xlQ2FyYm9uIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VDb21wIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNvbXBvdW5kR3JhcGggKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJDb21wb3VuZEdyYXBoIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2MvNy83L2RhdGFzZXRfYzc3ZWVlNWEtNWEwYS00ZTdhLThmMmMtZjBiNjdiMWFlZTRiLmRhdCIgLXNjICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzYvZi81L2RhdGFzZXRfNmY1NTM2MTQtNTAzZS00ZGI5LWEyMDktZTU1NzEyNGY1MjI3LmRhdCIgLW1jICJubyIgICAgICAtZiAiZ21sIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzExNS9vdXRwdXRzL2RhdGFzZXRfNzBmYmQ5MzgtMDQ3MS00MWRjLTk2NjctZDhjM2I5YjZiNjE0LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCiAgICAgIEJ1aWxkaW5nIE5ldHdvcmsuLi4gRG9uZS4KICAgICAgcmVtb3Zpbmcgc2lkZSBjb21wb3VuZHMuLi4KICAgICAgUmVhZCBmaWxlIGNvbnRhaW5pbmcgc2lkZSBjb21wb3VuZHMuLi4KICAgICAgNiBjb21wb3VuZHMgcmVtb3ZlZC4KICAgICAgIERvbmUuCiAgICAgIEV4cG9ydGluZy4uLkdNTCBjcmVhdGVkLgogICAgICAgRG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IG1lcmdpbmdTdHJhdCB8IGAgIm5vIiBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDb21wb3VuZEdyYXBoIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ29tcG91bmRHcmFwaCAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8wLzMvNC9kYXRhc2V0XzAzNDA2NWU4LTRmOGQtNDA4ZS05MGY3LTc1NDg5MWI4MjdiMy5kYXQiIC1zYyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy83L2MvMS9kYXRhc2V0XzdjMTJmZGE4LTZkNzMtNGE3My05ZDM4LTJlY2E3MTA4NDU3ZS5kYXQiIC1tYyAiYnlfaWQiICAtcmkgLWR3IC11biAtdHAgLWYgImdtbCIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMTgvb3V0cHV0cy9kYXRhc2V0X2IxYzFkMzAwLTRjYzgtNDkwOS05MmU3LTg4YjU1MjRhMmFlYy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIDEyIGlzb2xhdGVkIG5vZGVzIHJlbW92ZWQgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLiBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uIERvbmUuCiAgICAgIHJlbW92aW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDYgY29tcG91bmRzIHJlbW92ZWQuCiAgICAgICBEb25lLgogICAgICBDcmVhdGUgVW5kaXJlY3RlZC4uLiBEb25lLgogICAgICBTZXR0aW5nIGVkZ2Ugd2VpZ2h0cyAodGFyZ2V0IGRlZ3JlZSkuLi4KICAgICAgIERvbmUuCiAgICAgIE1lcmdpbmcgY29tcGFydG1lbnRzLi4uIERvbmUuCiAgICAgIFJlbW92ZSBpc29sYXRlZCBub2Rlcy4uLgogICAgICAJcmVtb3ZpbmcgTV9zX2MKICAgICAgCXJlbW92aW5nIERfR2x5Y2VyYWxkZWh5ZGUKICAgICAgCXJlbW92aW5nIHNuX0dseWNlcm9fM19waG9zcGhvZXRoYW5vbGFtaW5lCiAgICAgIAlyZW1vdmluZyBzbl9HbHljZXJvXzNfcGhvc3Bob2Nob2xpbmUKICAgICAgCXJlbW92aW5nIHNuX0dseWNlcm9fM19waG9zcGhvXzFfaW5vc2l0b2wKICAgICAgCXJlbW92aW5nIFAxX1A0X0Jpc181X19hZGVub3N5bF9fdGV0cmFwaG9zcGhhdGUKICAgICAgCXJlbW92aW5nIE1fY3lzX0RfYwogICAgICAJcmVtb3ZpbmcgTV9tZXRfRF9jCiAgICAgIAlyZW1vdmluZyBtZXRoYW5lc3VsZm9uYXRlCiAgICAgIAlyZW1vdmluZyBQMV9QNV9CaXNfNV9fYWRlbm9zeWxfX3BlbnRhcGhvc3BoYXRlCiAgICAgIAlyZW1vdmluZyBHbHljZXJvcGhvc3Bob2dseWNlcm9sCiAgICAgIAlyZW1vdmluZyBHbHljZXJvcGhvc3Bob3NlcmluZQogICAgICAgRG9uZS4KICAgICAgQ29tcHV0ZSB0cmFuc2l0aW9uIG1hdHJpeC4uLiBEb25lLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBtZXJnaW5nU3RyYXQgfCBgICJieV9pZCIgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCB0cnVlIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjb21wdXRlV2VpZ2h0IHwgYCB0cnVlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJHcmFwaCAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkdyYXBoIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzUvMS8xL2RhdGFzZXRfNTExMjc3NTgtYWMyNS00MGM2LWJlOTItZDIxNmY3NzQxZGIzLmRhdCIgIC1jICAtZiAiZ21sIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyMC9vdXRwdXRzL2RhdGFzZXRfOWZiYmE4MmMtODNiNS00YWMzLWJhNTgtMWQ2Y2QzMDJiMDg0LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBiaXBhcnRpdGUgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjb21wb3VuZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcmVhY3Rpb24gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJHcmFwaCAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkdyYXBoIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzAvYy84L2RhdGFzZXRfMGM4MjU1YmUtZWFhYi00NGU3LTk4MDItY2NjOWJlNDAzNTc5LmRhdCIgLWIgICAtZiAiZ21sIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyMi9vdXRwdXRzL2RhdGFzZXRfNDg0MTQ1OWUtMmExYy00YTk1LWI2YTQtYTA0M2YzNjUwZjNlLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBiaXBhcnRpdGUgfCBgIHRydWUgYCB8CiAgICAgICB8IGNvbXBvdW5kIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcmVhY3Rpb24gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJHcmFwaCAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkdyYXBoIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzcvMi8xL2RhdGFzZXRfNzIxZGY5ZjQtMDM5ZC00NjFkLTk3NDYtOTc3NDE4MjgyNWI1LmRhdCIgICAtciAtZiAiZ21sIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyNC9vdXRwdXRzL2RhdGFzZXRfNTU3ODUxYWMtYWI0Zi00YzdlLWE1MjAtMTk2YjUwNzFkOTI1LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBiaXBhcnRpdGUgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjb21wb3VuZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlYWN0aW9uIHwgYCB0cnVlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJUYWIgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJUYWIgLWlyciAiLS0+IiAtcmV2ICI8PT0+IiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy80L2YvNy9kYXRhc2V0XzRmNzdkYjE2LTAyYzQtNGI0NS05MzA5LTcxNzg5OWI5ZTVhMi5kYXQiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTI2L291dHB1dHMvZGF0YXNldF81MWExZWQwMy0yNjUwLTQ3MTItYjQyZS1hZmE5ZTc1ZDMyMGMuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGkgfCBgICItLT4iIGAgfAogICAgICAgfCByIHwgYCAiPD09PiIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMlRhYiAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMlRhYiAtaXJyICItPiIgLXJldiAiPSIgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYS82L2MvZGF0YXNldF9hNmM5ZTg5Ni0xZjZiLTQ3YjItOTcxYy1iMjUzYTQwNWQ4MTMuZGF0IiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyOC9vdXRwdXRzL2RhdGFzZXRfNWM4OTdjZTUtNWE3Zi00Yzc3LWE4NjEtNDI2MWM3NWNhYjE0LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBpIHwgYCAiLT4iIGAgfAogICAgICAgfCByIHwgYCAiPSIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sV2l6YXJkIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWxXaXphcmQgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYy9iL2IvZGF0YXNldF9jYmJjYmZlNi00ZjRiLTRkMzUtOWRlYy0yZGFhZDA5ZTk3YTUuZGF0IiAtcmljIC1yMCAtbWMgImJ5X2lkIiAtcmRyIC1yRVggInMiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTMwL291dHB1dHMvZGF0YXNldF9kZTU5ZmNlNS0yYWZkLTRhYjYtODU3Yi1jNGUyZDI2ZmEyOWEuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfNDg4ZmU1M2NfMTNkNF80ZWE2X2E3YzdfNmNhODRmODZjZmU1CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLiBEb25lLgoKCiAgICAgIAljb21wYXJ0bWVudHM6CTUKICAgICAgCW1ldGFib2xpdGVzOgkxMTEKICAgICAgCXJlYWN0aW9uczoJNzUKICAgICAgCWVuenltZXM6CTg1CiAgICAgIAlnZW5lczoJODYKICAgICAgCXByb3RlaW46CTg2CiAgICAgIAlwYXRod2F5OgkzCgoKICAgICAgcmVtb3ZpbmcgcmVhY3Rpb24gd2l0aCBudWxsIGZsdXggYm91bmRzLi4uCiAgICAgIDAgImNsb3NlZCIgcmVhY3Rpb25zIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBleHRlcm5hbCBjb21wYXJ0bWVudC4uLgogICAgICAxMyBleHRlcm5hbCBzcGVjaWVzIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBpc29sYXRlZCBjb21wb3VuZHMuLi4KICAgICAgMCBpc29sYXRlZCBjb21wb3VuZHMgcmVtb3ZlZCBmcm9tIG5ldHdvcmsuCiAgICAgIE1lcmdpbmcgY29tcGFydG1lbnRzLi4uIERvbmUuCiAgICAgIHJlbW92aW5nIGR1cGxpY2F0ZWQgcmVhY3Rpb25zLi4uCiAgICAgIDEgZHVwbGljYXRlZCByZWFjdGlvbnMgcmVtb3ZlZCBmcm9tIG5ldHdvcmsuCgoKICAgICAgCWNvbXBhcnRtZW50czoJMQogICAgICAJbWV0YWJvbGl0ZXM6CTQ5CiAgICAgIAlyZWFjdGlvbnM6CTM0CiAgICAgIAllbnp5bWVzOgk4NQogICAgICAJZ2VuZXM6CTg2CiAgICAgIAlwcm90ZWluOgk4NgogICAgICAJcGF0aHdheToJMwoKCiAgICAgIEV4cG9ydGluZy4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgaW5wdXRTaWRlIHwgYCBOb25lIGAgfAogICAgICAgfCB0b0tlZXBDIHwgYCBOb25lIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgaW5wdXRSZWFjdGlvbnMgfCBgIE5vbmUgYCB8CiAgICAgICB8IHRvS2VlcFIgfCBgIE5vbmUgYCB8CiAgICAgICB8IHJlbW92ZU5vRmx1eCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAiYnlfaWQiIGAgfAogICAgICAgfCByZW1vdmVEdXBsaWNhdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBleGNoYW5nZUNvbXBUb1JlbW92ZSB8IGAgInMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbFdpemFyZCAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sV2l6YXJkIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2MvOS9jL2RhdGFzZXRfYzljMmFjYTQtM2NiNC00ODE2LThkYzItMTgzY2M0OGJkMDBmLmRhdCIgLXJjICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzIvOC9hL2RhdGFzZXRfMjhhOTBmMTAtN2Y3YS00MDhlLTllYTUtNzMzZTFkZGFjYTk5LmRhdCIgLXJpYyAtcnIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYy9iL2YvZGF0YXNldF9jYmY4NGU2Ny0yODAyLTRkYTEtYjQzOC1jYjUzMTgxYzliYzcuZGF0IiAtcjAgLW1jICJubyIgLXJkciAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEzNC9vdXRwdXRzL2RhdGFzZXRfMzI1YWZhYzYtMTY0Yy00Yzk2LWJmZDYtMWQ3NjAyNTgzNzc2LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIFhmbTExNTgKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4gRG9uZS4KCgogICAgICAJY29tcGFydG1lbnRzOgkzCiAgICAgIAltZXRhYm9saXRlczoJMTEwNwogICAgICAJcmVhY3Rpb25zOgkxMTU4CiAgICAgIAllbnp5bWVzOgk1MTQKICAgICAgCWdlbmVzOgk1NzIKICAgICAgCXByb3RlaW46CTU3MgogICAgICAJcGF0aHdheToJNDgKCgogICAgICByZW1vdmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICA2IHNpZGUgY29tcG91bmRzIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBzaWRlIHJlYWN0aW9uLi4uCiAgICAgIDIgaXJyZWxldmFudCByZWFjdGlvbnMgcmVtb3ZlZCBmcm9tIG5ldHdvcmsuCiAgICAgIHJlbW92aW5nIHJlYWN0aW9uIHdpdGggbnVsbCBmbHV4IGJvdW5kcy4uLgogICAgICAwICJjbG9zZWQiIHJlYWN0aW9ucyByZW1vdmVkIGZyb20gbmV0d29yay4KICAgICAgcmVtb3ZpbmcgaXNvbGF0ZWQgY29tcG91bmRzLi4uCiAgICAgIDAgaXNvbGF0ZWQgY29tcG91bmRzIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBkdXBsaWNhdGVkIHJlYWN0aW9ucy4uLgogICAgICAwIGR1cGxpY2F0ZWQgcmVhY3Rpb25zIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgoKCiAgICAgIAljb21wYXJ0bWVudHM6CTMKICAgICAgCW1ldGFib2xpdGVzOgkxMTAxCiAgICAgIAlyZWFjdGlvbnM6CTExNTIKICAgICAgCWVuenltZXM6CTUxNAogICAgICAJZ2VuZXM6CTU3MgogICAgICAJcHJvdGVpbjoJNTcyCiAgICAgIAlwYXRod2F5Ogk0OAoKCiAgICAgIEV4cG9ydGluZy4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgdG9LZWVwQyB8IGAgTm9uZSBgIHwKICAgICAgIHwgcmVtb3ZlSXNvbGF0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IHRvS2VlcFIgfCBgIE5vbmUgYCB8CiAgICAgICB8IHJlbW92ZU5vRmx1eCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAibm8iIGAgfAogICAgICAgfCByZW1vdmVEdXBsaWNhdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBleGNoYW5nZUNvbXBUb1JlbW92ZSB8IGAgIiIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TY29wZU5ldHdvcmsgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TY29wZU5ldHdvcmsgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNC82LzYvZGF0YXNldF80NjYzNjIzOC1iYWFjLTQ1NDUtYTY5MS03YzRhNWUzOWY4MmIuZGF0IiAtcyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy80L2EvZi9kYXRhc2V0XzRhZjFhZTBmLTYwYjEtNDczMC05ZTkyLWFkZTExYjUzODgzYi5kYXQiIC1zYyAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9mLzQvNC9kYXRhc2V0X2Y0NGJjNjhjLWFiZTQtNDA4MC04MGNiLWFiN2RjYWIyNWE0Ny5kYXQiICAgLWYgImdtbCIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMzgvb3V0cHV0cy9kYXRhc2V0X2E2NzY0OGZkLWFlNjItNGEzZC1iNmE3LWFjYWQzNGYxODkyMi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICByZWFkaW5nIFNCTUwuLi4KICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBpbmNsdWRlU2lkZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZWFjdGlvblRvSWdub3JlRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdHJhY2UgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2VlZHNBbmRUYXJnZXRzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuU2VlZHNBbmRUYXJnZXRzIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2YvZi81L2RhdGFzZXRfZmY1MzQ3YjAtNzEwYi00Yjc1LThkMmYtZjUxOTU5MGM1NzRiLmRhdCIgLXMgICAgICAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNDAvb3V0cHV0cy9kYXRhc2V0X2ZmYmE2ZTIwLWE1MGEtNDk3My05YmNlLTgxMjlhMGU4MTczOS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBncmFwaC4uLgogICAgICBkb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgaW5wdXRTaWRlIHwgYCBOb25lIGAgfAogICAgICAgfCBjb21wIHwgYCAiIiBgIHwKICAgICAgIHwgc291cmNlIHwgYCB0cnVlIGAgfAogICAgICAgfCBzaW5rIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm90c291cmNlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm90c2luayB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGtlZXBJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVzZUJvcmVuc3RlaW5BbGcgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1c2VJbnRlcm5hbCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZWVkc0FuZFRhcmdldHMgKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TZWVkc0FuZFRhcmdldHMgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMi9kLzkvZGF0YXNldF8yZDk5M2VhOC1lOGMxLTRiMjctYjdmMi05MTU2MzUwOTJjZDAuZGF0IiAtYyAiZSIgIC10ICAgICAtaW4gLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNDIvb3V0cHV0cy9kYXRhc2V0X2Y1MTFlM2E0LTU0YzItNDM3NC1hYzYxLTU2NTJkY2ZiZDQzYi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBncmFwaC4uLgogICAgICBkb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgaW5wdXRTaWRlIHwgYCBOb25lIGAgfAogICAgICAgfCBjb21wIHwgYCAiZSIgYCB8CiAgICAgICB8IHNvdXJjZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHNpbmsgfCBgIHRydWUgYCB8CiAgICAgICB8IG5vdHNvdXJjZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5vdHNpbmsgfCBgIGZhbHNlIGAgfAogICAgICAgfCBrZWVwSXNvbGF0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1c2VCb3JlbnN0ZWluQWxnIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdXNlSW50ZXJuYWwgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZWVkc0FuZFRhcmdldHMgKFRlc3QgIyAzKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TZWVkc0FuZFRhcmdldHMgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvZi8wLzUvZGF0YXNldF9mMDUyN2EzZi1iMGFmLTRiYmUtOTFmZS1kZWRmMDJkNzMzOTAuZGF0IiAtYyAiZSIgIC10ICAgIC1CICAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE0NC9vdXRwdXRzL2RhdGFzZXRfODM2YzU3ZGEtOTE2Yi00YzViLTkzMDktNTYwODU1NWFmY2JmLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgcmVhZGluZyBTQk1MLi4uCiAgICAgIENyZWF0aW5nIGdyYXBoLi4uCiAgICAgIGRvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBpbnB1dFNpZGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGNvbXAgfCBgICJlIiBgIHwKICAgICAgIHwgc291cmNlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgc2luayB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbm90c291cmNlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm90c2luayB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGtlZXBJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVzZUJvcmVuc3RlaW5BbGcgfCBgIHRydWUgYCB8CiAgICAgICB8IHVzZUludGVybmFsIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldENoYXJnZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0Q2hhcmdlcyAtY2MgIjIiIC1jaSAiMSIgICAtbiAiMCIgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMS85L2UvZGF0YXNldF8xOWU5NTgwZS01Yjk5LTQwNGUtYjU3YS1lZjlkMWRiNjI3MjguZGF0IiAtdGFiICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzcvYi9kL2RhdGFzZXRfN2JkNjhiNTgtMGQ5ZC00YmEwLTg1ZTYtNTI2OTI0MzA0MjNkLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTQ3L291dHB1dHMvZGF0YXNldF9kY2Y5ZGEwZC1hZWFlLTQ1MDctOTY5MS0wN2JkODA1MmE4MGUuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF80YzY3ZDlhYV9mZTQwXzQxNTVfYmRkMl8yODhhMzRlYzUxZTEKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGF0dHJpYnV0aW9ucwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sY2hhcmdlIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hhcmdlcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGFyZ2VzIC1jYyAiMiIgLWNpICIxIiAgIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9hLzUvMy9kYXRhc2V0X2E1MzhiMzMwLTNmN2ItNDliMC1hY2MzLTM3ZTdjMTYxMzRjZC5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvZi8yLzQvZGF0YXNldF9mMjRlYzIwYS0zOTNlLTQ3MDgtYmNmZi1hMGM5ZmIyMDFiNWIuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNTAvb3V0cHV0cy9kYXRhc2V0Xzc1YzMwYjVlLWRlZDMtNGY2Yy05M2UyLTJmYTU3YjEyYmQzYy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzhhMjdmMzVmX2UxYzJfNGEzOV85YTRhXzhjZDY0NzQ1YmI2ZQogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDEgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xjaGFyZ2UgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRDaGFyZ2VzIChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldENoYXJnZXMgLWNjICIyIiAtY2kgIjEiICAgLW4gIjEiIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzIvZC8xL2RhdGFzZXRfMmQxNDNjY2ItODcyZi00M2UyLWE1YWUtZDMzN2IwNjVhMzU0LmRhdCIgLXRhYiAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8zL2UvMC9kYXRhc2V0XzNlMDdiNDdjLWI4ZTItNDg2ZC1hYmYyLTgwY2I5YWQyMmMzOC5kYXQiIC1jICIjIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE1My9vdXRwdXRzL2RhdGFzZXRfYWJlMzdhYmEtNjVhNy00ZDQ3LTg1MTItNzU0MGZiYTJiNzg1LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfOTVlZjIwY2JfNWU0ZF80NjFjX2FjNTZfYjdkYWE4MGY2N2M5CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMSBhdHRyaWJ1dGlvbnMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGNoYXJnZSB8IGAgIjIiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMSIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldENoYXJnZXMgKFRlc3QgIyA0KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0Q2hhcmdlcyAtY2MgIjIiIC1jaSAiMSIgICAtbiAiMCIgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYy82LzEvZGF0YXNldF9jNjEyMWJlNS1hYzMyLTRiNzMtYTk2NC1iNThiMjkzMDYwYTEuZGF0IiAtdGFiICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzMvZC8xL2RhdGFzZXRfM2QxYzQ2MWYtMTE5Yy00NzAzLTk1MDctMmQ0YmZkN2ZmMmMzLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTU2L291dHB1dHMvZGF0YXNldF9hNTk2YWRkNi1hZTU0LTQ0NzQtYWE3ZC01NGJjODcyMTVhODAuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF82OGZkNTVhYV81YzBiXzQ3M2NfOWRlZV9jN2FiMTJhNDYwN2YKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGF0dHJpYnV0aW9ucwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sY2hhcmdlIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hhcmdlcyAoVGVzdCAjIDUpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGFyZ2VzIC1jYyAiMiIgLWNpICIxIiAtcCAtcyAtbiAiMCIgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNC9kL2QvZGF0YXNldF80ZGQ2Nzc4YS02NjEyLTRmMGEtODlmZS1hYTAwYzUyNTY5YjEuZGF0IiAtdGFiICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2QvYS84L2RhdGFzZXRfZGE4YTJkZWYtOGIwZi00YTcxLTljOWQtMzVkOGM4YjBjMDIxLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTU5L291dHB1dHMvZGF0YXNldF8yZjU5MmExYS05YzJlLTQ0MzctOGQ1ZC03ZDk2YzVmNzEzNjAuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDMgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xjaGFyZ2UgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hlbWljYWxGb3JtdWxhcyAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGVtaWNhbEZvcm11bGFzIC1jZiAiMiIgLWNpICIxIiAgIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9kL2IvMS9kYXRhc2V0X2RiMWY1NmI4LWE1ODItNDNhNi05N2U4LTc3MjQwNzk5NWFiMi5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNi9kLzEvZGF0YXNldF82ZDE5OGJkZS04NzcwLTQ0ZTItYjlkNi05NWQxNGYwNDBiMjMuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNjIvb3V0cHV0cy9kYXRhc2V0XzY0MDk1YWM0LWRiMzItNGMwOC05YTYxLWYxYTkzY2FhNWVhZC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzc3MGVkZjZmX2FjNjlfNDgyMF85NTJlXzlhMGY3M2RhMDFlOQogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hlbWljYWxGb3JtdWxhcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGVtaWNhbEZvcm11bGFzIC1jZiAiMiIgLWNpICIxIiAgIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9jLzcvYy9kYXRhc2V0X2M3Y2RlM2Q1LTRlMTctNGVhYS1hZGM5LTI0M2QwYmI0NWZhZC5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMy8wLzkvZGF0YXNldF8zMDk1OThhOC0zYjhhLTRjNTEtODE1ZC1iNWM5MWFiNDAxNTYuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNjUvb3V0cHV0cy9kYXRhc2V0XzBkMWUzYmI4LWU0MjgtNGUzOC1hN2U1LTkwZWUwNzc5OTFjMy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMQogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICAqKioqKioqKgogICAgICBbV2FybmluZ11BdHRyaWJ1dGUgIjEyQ0g0TyIgbm90IHdlbGwgZm9ybWF0dGVkCiAgICAgICoqKioqKioqCiAgICAgIEVycm9yIHdoaWxlIHNldHRpbmcgZm9ybXVsYXMKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGZvcm11bGEgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRFY051bWJlcnMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0RWNOdW1iZXJzIC1jZWMgIjIiIC1jaSAiMSIgIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8zL2YvNC9kYXRhc2V0XzNmNDkwMzNkLWM2YzctNGUyYy1iOGZiLTEwYzRhNjA4NGFlYS5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNy8zL2IvZGF0YXNldF83M2I0N2IwNi0yMWM0LTQ4ZmQtYjE1Ny05ZjcwNjEwMjBjMzIuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNjgvb3V0cHV0cy9kYXRhc2V0XzE5MzA1N2Q0LTFjZmMtNGJlZi05OTg4LTZhODA2Y2VhOTIzMi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2YwYzAyYmE1XzYyZGVfNDZhZl84NmE0X2QxNTdkY2ZjMWVhYwogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgcmVhY3Rpb25zIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sZWMgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldEVjTnVtYmVycyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRFY051bWJlcnMgLWNlYyAiMiIgLWNpICIxIiAgLW4gIjAiIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzUvOS8zL2RhdGFzZXRfNTkzOTFjYmMtMWI3YS00NGQyLTk3NDQtMWEzZTc1NTYyOGE2LmRhdCIgLXRhYiAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy82L2UvNC9kYXRhc2V0XzZlNDU4OWE3LWY3ZWMtNDE1Ni04NTBjLTkxNWU1ZTkyYzA2My5kYXQiIC1jICIjIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE3MS9vdXRwdXRzL2RhdGFzZXRfZmYyMjZkODQtOGNjZC00NGFlLTg3NjEtNGNiZDQ3MGVhOGU3LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAxCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgICoqKioqKioqCiAgICAgIFtXYXJuaW5nXUF0dHJpYnV0ZSAiMS4yLjMuNC41IiBub3Qgd2VsbCBmb3JtYXR0ZWQKICAgICAgKioqKioqKioKICAgICAgRXJyb3IgaW4gc2V0dGluZyBFQ3MKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGVjIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRHcHJzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldEdwcnMgLWNncHIgIjIiIC1jaSAiMSIgIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8zLzQvZS9kYXRhc2V0XzM0ZWQ2ZmJiLTExNTktNDhiMC04ZmEzLWM0OWQ2Y2Q1ZmJjMS5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNi9jL2EvZGF0YXNldF82Y2E5OTY1OC1iNzkzLTRmOTctYWViMi1hODNkZDM2ZjU4ZjUuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNzQvb3V0cHV0cy9kYXRhc2V0X2ExZjViZjAyLTM5ZTMtNDBkYy05MWJjLWZmODI4ZjY4ODRhNS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzg5MzYxNzMyXzYxZmJfNDEwOF9hYjk0X2NlYmE4ZGUyYzZjZAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZ2VuZSBhc3NvY2lhdGlvbnMgY3JlYXRlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sZ3ByIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRJZHMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0SWRzIC1jbmV3ICIyIiAtY2kgIjEiICAgLXQgIk1FVEFCT0xJVEUiIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9kLzUvNy9kYXRhc2V0X2Q1N2VhMjUxLWE2ODUtNGNjYi1iZDJmLTU3Nzk3ZTUxNjZlYi5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYS8yL2EvZGF0YXNldF9hMmFjNGFlZi05ZmYwLTQwZTgtODFiMC03NTVlZTM1ZmQzZGYuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNzcvb3V0cHV0cy9kYXRhc2V0XzllZTNhOTA4LWFmZWQtNGRjNC1iYzkzLWMwOGQyM2RhMWJiYS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2UyMTUwMzBkXzQwZjVfNGZmZF9iNTUxX2RmYzhiOTE3NTM5MwogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZW50aXRpZXMgcHJvY2Vzc2VkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIk1FVEFCT0xJVEUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRJZHMgKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0SWRzIC1jbmV3ICIyIiAtY2kgIjEiICAgLXQgIlJFQUNUSU9OIiAtbiAiMCIgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMC83L2EvZGF0YXNldF8wN2E0OTBkOC1iZjA3LTQzZTktOGNhOC02ODM4NGVkYzQ2NmYuZGF0IiAtdGFiICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzUvNS84L2RhdGFzZXRfNTU4ZTNiY2ItMDliYy00YzczLWFkNDItOWRlYjlkZTEwNzdiLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTgwL291dHB1dHMvZGF0YXNldF84NDBlZDU0NS0yNTE1LTQ2MjgtYWIzOC0xZjQ4NzlkYzIwZWYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF9mNzI4MzFmNV8zNDcyXzQwMTZfYTM1N19hZTI1YWY4MjMxMGEKICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGVudGl0aWVzIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sbmFtZSB8IGAgIjIiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG8gfCBgICJSRUFDVElPTiIgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldElkcyAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRJZHMgLWNuZXcgIjIiIC1jaSAiMSIgICAtdCAiUEFUSFdBWSIgLW4gIjAiIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2MvZi85L2RhdGFzZXRfY2Y5MWIyYzQtZTJhYi00ZmEwLWIzY2UtNDE5YWE5YzlmZDM0LmRhdCIgLXRhYiAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy82L2MvNi9kYXRhc2V0XzZjNjcxYWFjLTYwOGItNDVmOC05MWIwLWFhMWNjZDQyNzBiMS5kYXQiIC1jICIjIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE4My9vdXRwdXRzL2RhdGFzZXRfNjFiMmJkYzUtMWE5Yy00YWZhLWE5M2YtYzc3MGJmOGI0Y2VlLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIFhmbTExNTgKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGVudGl0aWVzIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sbmFtZSB8IGAgIjIiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG8gfCBgICJQQVRIV0FZIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0SWRzIChUZXN0ICMgNCk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldElkcyAtY25ldyAiMiIgLWNpICIxIiAgIC10ICJHRU5FIiAtbiAiMCIgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYy82LzQvZGF0YXNldF9jNjRlZTg4NC1lZTYyLTRkNDItYTg4Ny05OTdiNmM2MzExOTYuZGF0IiAtdGFiICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2YvMy9hL2RhdGFzZXRfZjNhNWZiOWMtZDBkYy00NzdlLTljOTYtNTVkYWRkYjY2NmNlLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTg2L291dHB1dHMvZGF0YXNldF80Y2Y1NmUxMy03YWIxLTQzNjEtYWIzZi0wMGU1YTMzNGUxZDEuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgQ2hlbWljYWwgZm9ybXVsYSBub3QgaW4gZ29vZCBmb3JtYXQgKEM0MS41NTQwNjE4Mzc1NDAwNzVINzEuNzg1NTM1Mzc5NDg5NjROOS44NTM4MjQwMDg4NDAxNU8xNC45MzgyNDQwMTczODk5MzRQMC44ODExMjAwMjU4MDAwMTU2UjEuMjc2NzU2NDc4MzE4OTNFLTE1TW43LjM0OTE5RS00TW83LjM3Njg1RS02Q2wwLjAwNTUzMjYzOUswLjIwNzQ3Mzk1MUNvMi42NzQxMUUtNUN1Ny41MzM2MUUtNFMwLjI0NzAwOTE1Njc4MDAwMDAyWm4zLjYyMzg4RS00TWcwLjAwOTIyMTA2NE5pMy40MzAyNEUtNENhMC4wMDU1MzI2MzlGZTAuMDE3MzQ2NTE1Mzk5OTk5OTk4KSBmb3IgTV9CSU9NQVNTX1hGX2MKICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZW50aXRpZXMgcHJvY2Vzc2VkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIkdFTkUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRJZHMgKFRlc3QgIyA1KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0SWRzIC1jbmV3ICIyIiAtY2kgIjEiICAgLXQgIkNPTVBBUlRNRU5UIiAtbiAiMCIgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvZC82L2EvZGF0YXNldF9kNmE4YzYzNi0xZTUyLTRmMjctOGQzZS02NTBkNzRmNDc0MDguZGF0IiAtdGFiICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzAvZi9kL2RhdGFzZXRfMGZkMDVjNjAtZjJlOC00MGIwLWIyMDUtOWUyNDUxZDUxZGUyLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTg5L291dHB1dHMvZGF0YXNldF83MzY4MjRmNS01NmU0LTQ2MzktYTFhMi1hYjRlNWVkZGRhYzguZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZW50aXRpZXMgcHJvY2Vzc2VkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIkNPTVBBUlRNRU5UIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0TmFtZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0TmFtZXMgLWNuYW1lICIyIiAtY2kgIjEiICAgLXQgIk1FVEFCT0xJVEUiIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8xLzUvNi9kYXRhc2V0XzE1NjBiM2JiLWJmYzItNDg3MC1iZGI1LTFlN2IyODk3ZWFkYy5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvOC81LzcvZGF0YXNldF84NTdmYzQyNy04YThlLTQwZDQtOWZlZS05MjNkNzljNTI0OWMuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xOTIvb3V0cHV0cy9kYXRhc2V0XzIyZjQxYWFmLWI1NWYtNDIxNC05ZDFiLWNmNmY3OGNlZDNlZi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2I0MmM1NzNiXzk1YmRfNDNlZF85NjFmXzI0NTNlNjZmZTgzMwogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIk1FVEFCT0xJVEUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXROYW1lcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXROYW1lcyAtY25hbWUgIjIiIC1jaSAiMSIgICAtdCAiUkVBQ1RJT04iIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy84LzEvNi9kYXRhc2V0XzgxNjAzNGQzLTkyOTEtNDc4ZC1hMmY4LWY3MDZkZWI5YTdjMS5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvOC85L2QvZGF0YXNldF84OWQ0YzM0MC01ZmEwLTRkNGItOWQwYi01YWUyYTQ2NWMwMzMuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xOTUvb3V0cHV0cy9kYXRhc2V0X2ZkZmQ4MWZjLWI5OGUtNGE5MC04MzMxLTc2YjQxNTNmNjRiYy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzMwNmM1ZjAyX2I5ZTRfNGE1MF9hMDIyXzQxOWZiNTg2YzIzZgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIlJFQUNUSU9OIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0TmFtZXMgKFRlc3QgIyAzKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0TmFtZXMgLWNuYW1lICIyIiAtY2kgIjEiICAgLXQgIlBBVEhXQVkiIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy80LzAvNi9kYXRhc2V0XzQwNjUwYTIzLWE0YWItNDhlZS1hNjQwLWU2NmZhZWQ3NGJlNS5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMC9jL2QvZGF0YXNldF8wY2QxMjRjMS1kY2M3LTQ2OTQtYmNkYy0zZjk1MTMwMTQ3NTcuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xOTgvb3V0cHV0cy9kYXRhc2V0XzBjNDNjMDZjLTQwMjYtNGNkNi05MTUwLTg1ZGMzYzJkN2NhNi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBYZm0xMTU4CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBDaGVtaWNhbCBmb3JtdWxhIG5vdCBpbiBnb29kIGZvcm1hdCAoQzQxLjU1NDA2MTgzNzU0MDA3NUg3MS43ODU1MzUzNzk0ODk2NE45Ljg1MzgyNDAwODg0MDE1TzE0LjkzODI0NDAxNzM4OTkzNFAwLjg4MTEyMDAyNTgwMDAxNTZSMS4yNzY3NTY0NzgzMTg5M0UtMTVNbjcuMzQ5MTlFLTRNbzcuMzc2ODVFLTZDbDAuMDA1NTMyNjM5SzAuMjA3NDczOTUxQ28yLjY3NDExRS01Q3U3LjUzMzYxRS00UzAuMjQ3MDA5MTU2NzgwMDAwMDJabjMuNjIzODhFLTRNZzAuMDA5MjIxMDY0TmkzLjQzMDI0RS00Q2EwLjAwNTUzMjYzOUZlMC4wMTczNDY1MTUzOTk5OTk5OTgpIGZvciBNX0JJT01BU1NfWEZfYwogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMiBhdHRyaWJ1dGlvbnMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbG5hbWUgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBvIHwgYCAiUEFUSFdBWSIgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldE5hbWVzIChUZXN0ICMgNCk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldE5hbWVzIC1jbmFtZSAiMiIgLWNpICIxIiAgIC10ICJHRU5FIiAtbiAiMCIgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNy9jL2IvZGF0YXNldF83Y2IyNjA5Yy0zYjVkLTQ5ODAtYjI5NS1lNTEwZWVjNjdiYjguZGF0IiAtdGFiICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzgvZi9iL2RhdGFzZXRfOGZiNTIzNzktYTU5Ny00N2Y4LWJhZDItNjY0ZjcwNmQzOGM0LmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjAxL291dHB1dHMvZGF0YXNldF83NjQ2ZjRmNC1lYzJlLTQ0ZDMtYjdjNi00MTI4N2JhNDQ4NDUuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgQ2hlbWljYWwgZm9ybXVsYSBub3QgaW4gZ29vZCBmb3JtYXQgKEM0MS41NTQwNjE4Mzc1NDAwNzVINzEuNzg1NTM1Mzc5NDg5NjROOS44NTM4MjQwMDg4NDAxNU8xNC45MzgyNDQwMTczODk5MzRQMC44ODExMjAwMjU4MDAwMTU2UjEuMjc2NzU2NDc4MzE4OTNFLTE1TW43LjM0OTE5RS00TW83LjM3Njg1RS02Q2wwLjAwNTUzMjYzOUswLjIwNzQ3Mzk1MUNvMi42NzQxMUUtNUN1Ny41MzM2MUUtNFMwLjI0NzAwOTE1Njc4MDAwMDAyWm4zLjYyMzg4RS00TWcwLjAwOTIyMTA2NE5pMy40MzAyNEUtNENhMC4wMDU1MzI2MzlGZTAuMDE3MzQ2NTE1Mzk5OTk5OTk4KSBmb3IgTV9CSU9NQVNTX1hGX2MKICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIkdFTkUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRQYXRod2F5cyAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRQYXRod2F5cyAtY3AgIjIiIC1zZXAgInwiIC1jaSAiMSIgIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy85LzYvMy9kYXRhc2V0Xzk2M2Y3ZDU3LTYzOTItNDMxMS05M2ZiLWNjZGZhNmI2MTA3Ny5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvZi9hL2IvZGF0YXNldF9mYWI2MGI5Ni00OTc3LTRjMTctODZhNC0wZTY4NzliYWYxM2EuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMDQvb3V0cHV0cy9kYXRhc2V0XzIyZmI1YTg5LTUwNzQtNDhmNC1hMmNlLTdkZDRiNmU3ZTg2MS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzRmMmVjYzcyX2QzNDJfNDE0N185OThjXzQ0NWRhZGRmNWVmNAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDMgcmVhY3Rpb25zIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29scCB8IGAgIjIiIGAgfAogICAgICAgfCBzZXAgfCBgICJ8IiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldFBhdGh3YXlzIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldFBhdGh3YXlzIC1jcCAiMiIgLXNlcCAiICsgIiAtY2kgIjEiICAtbiAiMCIgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYS8yLzIvZGF0YXNldF9hMjI3NmUzNy03N2RmLTQ5M2EtODlhYS1kNzkxZWM4OGUzNDIuZGF0IiAtdGFiICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzMvYS9iL2RhdGFzZXRfM2FiMjNkOGItZDZjNi00Mzg1LWJmZmEtNDlkY2Y0ODE3N2E2LmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjA3L291dHB1dHMvZGF0YXNldF8zMDBkNGFmNS02ZmZmLTQ5ZjAtOTg1Ny1kZjhkM2Y3ZmI4NzYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF8zYTk5NGQ2Zl9jY2E2XzRlZmRfYWE3ZV9lYzBiOWMxY2UxNmIKICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAzIHJlYWN0aW9ucyBwcm9jZXNzZWQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbHAgfCBgICIyIiBgIHwKICAgICAgIHwgc2VwIHwgYCAiICsgIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldFJlZmVyZW5jZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0UmVmZXJlbmNlcyAtY3IgIjIiIC1yZWYgIkluQ2hpIiAtY2kgIjEiICAgLXQgIk1FVEFCT0xJVEUiIC1uICIwIiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy9kLzUvYi9kYXRhc2V0X2Q1YjAzNjU4LThiMWYtNGQ5ZC04ZTFlLWZkYzUyMmM0MGRhOC5kYXQiIC10YWIgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNi85LzkvZGF0YXNldF82OTlhMmZiYy1kMzUxLTQ2MzktODBkMy0xNTE1Y2YzMGI0ZDcuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMTAvb3V0cHV0cy9kYXRhc2V0XzNhMzQ4YTM3LTM4NmQtNDQ4My04ODIzLWJhYTgxM2IzNWRkOC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2JjZjc2NzUyXzFjYjFfNDU0NV84YzY2X2JmNjk0N2Q2M2ZiOQogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xSZWYgfCBgICIyIiBgIHwKICAgICAgIHwgcmVmIHwgYCAiSW5DaGkiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG8gfCBgICJNRVRBQk9MSVRFIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2lkZUNvbXBvdW5kc1NjYW4gKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TaWRlQ29tcG91bmRzU2NhbiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy81LzUvNS9kYXRhc2V0XzU1NTBiNjFiLWI3NmYtNGYyYi1hZjk1LWFiN2ZiZGEyZDExMi5kYXQiICAgLWQgIjQwMCIgICAtbSAibm8iIC1vICIvdG1wL3RtcG1neWtlcmFsL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjEyL291dHB1dHMvZGF0YXNldF81YjViNDc2Yy03ODY1LTRkZDEtYjU2Ni03YjA0OTc5YTE3MTMuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICByZWFkaW5nIFNCTUwuLi4KICAgICAgQ3JlYXRpbmcgbmV0d29yay4uLgogICAgICBTY2FuaW5nLi4uCiAgICAgIGRvbmUKICAgICAgZm91bmQgNiBzaWRlIGNvbXBvdW5kIGFtb25nIDExMDcgY29tcG91bmRzCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBzaWRlT25seSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5vUmVwb3J0VmFsdWUgfCBgIGZhbHNlIGAgfAogICAgICAgfCBkZWdyZWUgfCBgICI0MDAiIGAgfAogICAgICAgfCBkZWdyZWVQcmVjZW50aWxlIHwgYCAibmFuIiBgIHwKICAgICAgIHwgZmxhZ0lub3JnYW5pYyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZsYWdOb0Zvcm11bGEgfCBgIGZhbHNlIGAgfAogICAgICAgfCBwYXJhbGxlbEVkZ2UgfCBgICJuYW4iIGAgfAogICAgICAgfCBtZXJnaW5nU3RyYXQgfCBgICJubyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TaWRlQ29tcG91bmRzU2NhbiAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlNpZGVDb21wb3VuZHNTY2FuIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzEvMS84L2RhdGFzZXRfMTE4ZDI2ODktN2NhYy00YmIzLTkxNWYtOGY2NmNhZWVlMzA2LmRhdCIgIC1pZCAtZCAiNDAwIiAgIC1tICJubyIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMTQvb3V0cHV0cy9kYXRhc2V0XzEwNDg1OTE2LWZiYTYtNDg2YS1iYjYyLTVhZDljZWVjMGQ2Ni5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBuZXR3b3JrLi4uCiAgICAgIFNjYW5pbmcuLi4KICAgICAgZG9uZQogICAgICBmb3VuZCA2IHNpZGUgY29tcG91bmQgYW1vbmcgMTEwNyBjb21wb3VuZHMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVPbmx5IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm9SZXBvcnRWYWx1ZSB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCAiNDAwIiBgIHwKICAgICAgIHwgZGVncmVlUHJlY2VudGlsZSB8IGAgIm5hbiIgYCB8CiAgICAgICB8IGZsYWdJbm9yZ2FuaWMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmbGFnTm9Gb3JtdWxhIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcGFyYWxsZWxFZGdlIHwgYCAibmFuIiBgIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAibm8iIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfVGFiMlNibWwgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuVGFiMlNibWwgLWNpICIxIiAtY2YgIjIiICAgLWUgIl9iIiAtaXJyICItLT4iIC1yZXYgIjw9PT4iIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzQvNi85L2RhdGFzZXRfNDY5NThhNDItYmZmNS00MDI5LWE5ZmMtZmM0YmJkMDUzMDM1LmRhdCIgLWlkICJOQSIgIC1kY3B0ICJjIiAtbiAiMCIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMTYvb3V0cHV0cy9kYXRhc2V0XzUwOTIxZWY3LTQ0OWEtNDUzZi04YmNkLTUzMTg3YWI5NDdiMC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2Q0YTVmMTQ0X2Y4NmFfNGY0N185OWQzXzE1MTIyMDIxM2IyMAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFRoZSBpbnB1dCBmaWxlIGxvb2tzIGdvb2QgYW5kIGNvbnRhaW5zIDcgcmVhY3Rpb25zCiAgICAgIDcgcmVhY3Rpb25zLCA4IG1ldGFib2xpdGVzIGFuZCAyIGNvbXBhcnRtZW50cyBjcmVhdGVkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IHJwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBlIHwgYCAiX2IiIGAgfAogICAgICAgfCBpIHwgYCAiLS0+IiBgIHwKICAgICAgIHwgciB8IGAgIjw9PT4iIGAgfAogICAgICAgfCBpZCB8IGAgIk5BIiBgIHwKICAgICAgIHwgY3JlYXRlQ29tcGFydG1lbnQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBkZWZhdWx0Q29tcGFydG1lbnQgfCBgICJjIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtZ3lrZXJhbC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAidGFidWxhciIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9UYWIyU2JtbCAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5UYWIyU2JtbCAtY2kgIjIiIC1jZiAiMyIgICAtZSAiX2IiIC1pcnIgIi0tPiIgLXJldiAiPD09PiIgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMC9iLzYvZGF0YXNldF8wYjYwYWZiZC01ZTVlLTQzMzgtYmJlOC0wYzYwYzg1ZmE3NjUuZGF0IiAtaWQgIk5BIiAgLWRjcHQgImMiIC1uICIwIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIxOC9vdXRwdXRzL2RhdGFzZXRfNzlhNGRmNmUtOTFiZC00ZmViLThkMWUtZjNiZjE0ODYzYmI3LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfMDIxZWIzNDZfNzUxOV80ZTMwX2I3OTRfNjc5ZDE1ZGY1NjRhCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgVGhlIGlucHV0IGZpbGUgbG9va3MgZ29vZCBhbmQgY29udGFpbnMgNyByZWFjdGlvbnMKICAgICAgNyByZWFjdGlvbnMsIDggbWV0YWJvbGl0ZXMgYW5kIDIgY29tcGFydG1lbnRzIGNyZWF0ZWQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGlkIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGZvcm11bGEgfCBgICIzIiBgIHwKICAgICAgIHwgcnAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGUgfCBgICJfYiIgYCB8CiAgICAgICB8IGkgfCBgICItLT4iIGAgfAogICAgICAgfCByIHwgYCAiPD09PiIgYCB8CiAgICAgICB8IGlkIHwgYCAiTkEiIGAgfAogICAgICAgfCBjcmVhdGVDb21wYXJ0bWVudCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RhYjJTYm1sIChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlRhYjJTYm1sIC1jaSAiMSIgLWNmICIyIiAgIC1lICJfYiIgLWlyciAiLT4iIC1yZXYgIj0iIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzL2QvMi81L2RhdGFzZXRfZDI1NThiYzctODAwZC00MjA4LWFlMzAtMzRhM2I5ODMyM2ZmLmRhdCIgLWlkICJOQSIgIC1kY3B0ICJjIiAtbiAiMCIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMjAvb3V0cHV0cy9kYXRhc2V0XzViNzJkNTY3LTc5ZTQtNGQ5OC04OGZlLTZmODlhYmFiZWU0Yy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2M2MGJlYjJiXzQ3ZjZfNDAyZV84OWQzX2UzODBjZjAxNjUzOQogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFRoZSBpbnB1dCBmaWxlIGxvb2tzIGdvb2QgYW5kIGNvbnRhaW5zIDcgcmVhY3Rpb25zCiAgICAgIDcgcmVhY3Rpb25zLCA4IG1ldGFib2xpdGVzIGFuZCAyIGNvbXBhcnRtZW50cyBjcmVhdGVkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IHJwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBlIHwgYCAiX2IiIGAgfAogICAgICAgfCBpIHwgYCAiLT4iIGAgfAogICAgICAgfCByIHwgYCAiPSIgYCB8CiAgICAgICB8IGlkIHwgYCAiTkEiIGAgfAogICAgICAgfCBjcmVhdGVDb21wYXJ0bWVudCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RhYjJTYm1sIChUZXN0ICMgNCk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlRhYjJTYm1sIC1jaSAiMSIgLWNmICIyIiAtcnAgLW1wIC1lICJfZSIgLWlyciAiLS0+IiAtcmV2ICI8PT0+IiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8wLzYvNS9kYXRhc2V0XzA2NTJmZTBhLWFjYzItNGI0ZC1hNjkwLTdhZmI3NTNhNGJhYy5kYXQiIC1pZCAiTkEiIC1jcHQgLWRjcHQgImMiIC1uICIwIiAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIyMi9vdXRwdXRzL2RhdGFzZXRfNDBkYjVlNGItNzRlNS00NWFjLWFlYzEtY2Y5Y2E2Yjk2MmI1LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfNWUwM2Y2MDhfMGFiOF80NGRmXzhmNThfZjQ1OGE1MjkzY2M2CiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgVGhlIGlucHV0IGZpbGUgbG9va3MgZ29vZCBhbmQgY29udGFpbnMgNyByZWFjdGlvbnMKICAgICAgNyByZWFjdGlvbnMsIDggbWV0YWJvbGl0ZXMgYW5kIDIgY29tcGFydG1lbnRzIGNyZWF0ZWQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IGNvbGZvcm11bGEgfCBgICIyIiBgIHwKICAgICAgIHwgcnAgfCBgIHRydWUgYCB8CiAgICAgICB8IG1wIHwgYCB0cnVlIGAgfAogICAgICAgfCBlIHwgYCAiX2UiIGAgfAogICAgICAgfCBpIHwgYCAiLS0+IiBgIHwKICAgICAgIHwgciB8IGAgIjw9PT4iIGAgfAogICAgICAgfCBpZCB8IGAgIk5BIiBgIHwKICAgICAgIHwgY3JlYXRlQ29tcGFydG1lbnQgfCBgIHRydWUgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RhYjJTYm1sIChUZXN0ICMgNSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlRhYjJTYm1sIC1jaSAiMSIgLWNmICIyIiAgIC1lICJfYiIgLWlyciAiLS0+IiAtcmV2ICI8PT0+IiAtaSAiL3RtcC90bXBtZ3lrZXJhbC9maWxlcy8wL2IvMC9kYXRhc2V0XzBiMDEwZjg5LTQwNWEtNGNjMC04MGQ3LWEyZGNmZDZiMjg1My5kYXQiIC1pZCAibXlNb2RlbCIgIC1kY3B0ICJjIiAtbiAiMCIgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMjQvb3V0cHV0cy9kYXRhc2V0XzA2ZjEzZTYyLTlhMDItNDJmZS04MjEzLWNmYmQxNjY2OWIzMi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgbXlNb2RlbAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFRoZSBpbnB1dCBmaWxlIGxvb2tzIGdvb2QgYW5kIGNvbnRhaW5zIDcgcmVhY3Rpb25zCiAgICAgIDcgcmVhY3Rpb25zLCA4IG1ldGFib2xpdGVzIGFuZCAyIGNvbXBhcnRtZW50cyBjcmVhdGVkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IHJwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBlIHwgYCAiX2IiIGAgfAogICAgICAgfCBpIHwgYCAiLS0+IiBgIHwKICAgICAgIHwgciB8IGAgIjw9PT4iIGAgfAogICAgICAgfCBpZCB8IGAgIm15TW9kZWwiIGAgfAogICAgICAgfCBjcmVhdGVDb21wYXJ0bWVudCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RvcG9sb2dpY2FsUGF0aHdheUFuYWx5c2lzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuVG9wb2xvZ2ljYWxQYXRod2F5QW5hbHlzaXMgLWkgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvYS85L2YvZGF0YXNldF9hOWZlYjMxMC02YTczLTQ2MmQtYTMxZi00NjVlZjdjZDE3MDAuZGF0IiAtc2MgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvMy8zL2MvZGF0YXNldF8zM2M0NGE5Yy04YWFlLTQ4NWEtYWQ2Ni0yZjMwZDc0MDQ5MmYuZGF0IiAtbWMgIm5vIiAgIC1ub2kgIi90bXAvdG1wbWd5a2VyYWwvZmlsZXMvNS85LzQvZGF0YXNldF81OTRkNTdmOS01ODQ4LTQ5MWEtOGI5Ni04NTJjMjc5MmMwZTMuZGF0IiAgLW8gIi90bXAvdG1wbWd5a2VyYWwvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMjgvb3V0cHV0cy9kYXRhc2V0X2ExOGUxMGJkLTFkNDQtNGNlOC1iNzcxLWY5NjE4ZmY1YWVlMS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCgoKICAgICAgQnVpbGRpbmcgZ3JhcGguLi5SZW1vdmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICA2IGNvbXBvdW5kcyByZW1vdmVkLgogICAgICAgTmV0d29yayBzdWNjZXNzZnVsbHkgY3JlYXRlZC4KCgogICAgICBJbXBvcnRpbmcgbm9kZXMgb2YgaW50ZXJlc3QKICAgICAgRG9uZS4KICAgICAgQ29tcHV0aW5nIFBhdGh3YXkgdG9wb2xvZ3kgQW5hbHlzaXMuLi4gKG1heSB0YWtlIGEgd2hpbGUpCiAgICAgIERvbmUuCiAgICAgIEV4cG9ydGluZy4uLkRvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBtZXJnaW5nU3RyYXQgfCBgICJubyIgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG91dCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbWd5a2VyYWwvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9Ub3BvbG9naWNhbFBhdGh3YXlBbmFseXNpcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlRvcG9sb2dpY2FsUGF0aHdheUFuYWx5c2lzIC1pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzgvMi8xL2RhdGFzZXRfODIxNzMxMDItYWE5OS00ZTYwLTk3NGMtMGI4ZmZkZDllMDdkLmRhdCIgLXNjICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzIvOC9iL2RhdGFzZXRfMjhiZWQ4MTktZjE2MC00MDA0LWJjOTktNmYwNjI4MWVjYjgwLmRhdCIgLW1jICJieV9pZCIgLXJpIC11biAtbm9pICIvdG1wL3RtcG1neWtlcmFsL2ZpbGVzLzIvMy8yL2RhdGFzZXRfMjMyOTNmN2UtMTE1NC00ODJlLWI2YjYtNTRhMDBjMDM0NzVlLmRhdCIgLW91dCAtbyAiL3RtcC90bXBtZ3lrZXJhbC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIzMi9vdXRwdXRzL2RhdGFzZXRfZDQ3M2E0ZmMtNDlkZC00ZjFjLWEzMTEtYjJjN2EwN2Q5MmU0LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICAxMiBpc29sYXRlZCBub2RlcyByZW1vdmVkIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4gRG9uZS4KCgogICAgICBCdWlsZGluZyBncmFwaC4uLlJlbW92aW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDYgY29tcG91bmRzIHJlbW92ZWQuCiAgICAgIENyZWF0ZSBVbmRpcmVjdGVkLi4uIERvbmUuCiAgICAgIE1lcmdpbmcgY29tcGFydG1lbnRzLi4uIERvbmUuCiAgICAgIFJlbW92ZSBpc29sYXRlZCBub2Rlcy4uLgogICAgICAJcmVtb3Zpbmcgc25fR2x5Y2Vyb18zX3Bob3NwaG9jaG9saW5lCiAgICAgIAlyZW1vdmluZyBzbl9HbHljZXJvXzNfcGhvc3Bob2V0aGFub2xhbWluZQogICAgICAJcmVtb3ZpbmcgUDFfUDRfQmlzXzVfX2FkZW5vc3lsX190ZXRyYXBob3NwaGF0ZQogICAgICAJcmVtb3ZpbmcgbWV0aGFuZXN1bGZvbmF0ZQogICAgICAJcmVtb3ZpbmcgTV9tZXRfRF9jCiAgICAgIAlyZW1vdmluZyBHbHljZXJvcGhvc3Bob3NlcmluZQogICAgICAJcmVtb3ZpbmcgRF9HbHljZXJhbGRlaHlkZQogICAgICAJcmVtb3ZpbmcgR2x5Y2Vyb3Bob3NwaG9nbHljZXJvbAogICAgICAJcmVtb3Zpbmcgc25fR2x5Y2Vyb18zX3Bob3NwaG9fMV9pbm9zaXRvbAogICAgICAJcmVtb3ZpbmcgUDFfUDVfQmlzXzVfX2FkZW5vc3lsX19wZW50YXBob3NwaGF0ZQogICAgICAJcmVtb3ZpbmcgTV9zX2MKICAgICAgCXJlbW92aW5nIE1fY3lzX0RfYwogICAgICAgRG9uZS4KICAgICAgIE5ldHdvcmsgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuCgoKICAgICAgSW1wb3J0aW5nIG5vZGVzIG9mIGludGVyZXN0CiAgICAgIERvbmUuCiAgICAgIENvbXB1dGluZyBQYXRod2F5IHRvcG9sb2d5IEFuYWx5c2lzLi4uIChtYXkgdGFrZSBhIHdoaWxlKQogICAgICBEb25lLgogICAgICBFeHBvcnRpbmcuLi5Eb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAiYnlfaWQiIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgb3V0IHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG1neWtlcmFsL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCjwvZGV0YWlscz4K')); + target.innerHTML = md.render(atob('IyMgVGVzdCBTdW1tYXJ5Cgo8ZGl2IGNsYXNzPSJwcm9ncmVzcyI+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzIiBzdHlsZT0id2lkdGg6IDEwMC4wJSIgYXJpYS12YWx1ZW5vdz0iODQiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9Ijg0IiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgdGl0bGU9Ijg0IFBhc3NlZCI+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci13YXJuaW5nIiBzdHlsZT0id2lkdGg6IDAuMCUiIGFyaWEtdmFsdWVub3c9IjAiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9Ijg0IiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgdGl0bGU9IjAgU2tpcHBlZCI+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1kYW5nZXIiIHN0eWxlPSJ3aWR0aDogMC4wJSIgYXJpYS12YWx1ZW5vdz0iMCIgYXJpYS12YWx1ZW1pbj0iMCIgYXJpYS12YWx1ZW1heD0iODQiIHRpdGxlPSIwIEZhaWxlZCBvciBFcnJvcmVkIj4KICA8L2Rpdj4KPC9kaXY+Cgp8IFRlc3QgU3RhdGUgfCBDb3VudCB8CnwgLS0tLS0tLS0tLSB8IC0tLS0tIHwKfCBUb3RhbCAgICAgIHwgODQgfAp8IFBhc3NlZCAgICAgfCA4NCB8CnwgRXJyb3IgICAgICB8IDAgfAp8IEZhaWx1cmUgICAgfCAwIHwKfCBTa2lwcGVkICAgIHwgMCB8CgoKPGRldGFpbHMgPjxzdW1tYXJ5PlBhc3NlZCBUZXN0czwvc3VtbWFyeT4KCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfQ2hva2VQb2ludCAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLkNob2tlUG9pbnQgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNi82L2UvZGF0YXNldF82NmU1MjY3ZC1hODIyLTQzNmYtYTc4Mi1mMjYyMDk1N2JlZWUuZGF0IiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIvb3V0cHV0cy9kYXRhc2V0XzMzYjg3YWIyLTFlNTgtNGU2NS1iYzZlLTc3YzUwMzEzY2M3OC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBuZXR3b3JrLi4uCiAgICAgIENvbXB1dGluZyBjaG9rZSBwb2ludHMuLi4KICAgICAgRXhwb3J0IHJlc3VsdHMuLi4KICAgICAgZG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9DcmVhdGVNZXRhTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggcmVjb25zdHJ1Y3Rpb24uQ3JlYXRlTWV0YU5ldHdvcmsgLW4xICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2IvNC84L2RhdGFzZXRfYjQ4NDgzOGUtZGU3Zi00MjFhLWFhZDUtNzM2OWE5NmI5MDgyLmRhdCIgLW4yICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzIvNi81L2RhdGFzZXRfMjY1MTUxMDQtN2YyNS00YjM0LWIxMDItMWFkMzljY2IyZDUwLmRhdCIgLW4xZXggInMiIC1uMmV4ICJlIiAtbjFweCAiaHNhIiAtbjJweCAiZWNvIiAgIC1tYyAiYnlfbWV0YW5ldHgiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNS9vdXRwdXRzL2RhdGFzZXRfOTVlMGI4YzMtOTg4NS00NzNkLWJjM2QtZTE5NzJlODhiMDM3LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgaU1MMTUxNQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBpTUwxNTE1CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfZDRmZTQyODJfYjgwMl80ZWNlXzlmNmVfM2JiMDJiMjE3YzM0CiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBJbXBvcnRpbmcgbmV0d29yayAxLi4uIERvbmUuCiAgICAgIEltcG9ydGluZyBuZXR3b3JrIDIuLi4gRG9uZS4KICAgICAgQ3JlYXRpbmcgbWV0YS1uZXR3b3JrLi4uIERvbmUuCiAgICAgIEV4cG9ydGluZyBNZXRhTmV0d29yay4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZXh0ZXJuYWwxIHwgYCAicyIgYCB8CiAgICAgICB8IGV4dGVybmFsMiB8IGAgImUiIGAgfAogICAgICAgfCBuMXByZWZpeCB8IGAgImhzYSIgYCB8CiAgICAgICB8IG4ycHJlZml4IHwgYCAiZWNvIiBgIHwKICAgICAgIHwga2VlcENvbXBhcnRtZW50IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZmlyc3RJc01ldGEgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnaW5nQ3JpdGVyaW9uIHwgYCAiYnlfbWV0YW5ldHgiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRGlzdGFuY2VNYXRyaXggKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5EaXN0YW5jZU1hdHJpeCAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8yLzkvZi9kYXRhc2V0XzI5ZmQwNzRiLWY2YmUtNDc0Mi05NmZjLTVkZDE4N2Y1NTQwZC5kYXQiICAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC83L291dHB1dHMvZGF0YXNldF84M2U2ZWU1YS0yY2FkLTQyODAtOWI0MC1hOTdhM2Q2OGQyOWIuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHNlZWRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCBkZWdyZWUgfCBgIGZhbHNlIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0Rpc3RhbmNlTWF0cml4IChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYS8yLzMvZGF0YXNldF9hMjM2ZjA4YS1lNmMzLTQ5NDQtOTFmZS1jZDJiOGNkNWM1ZTUuZGF0IiAtc2MgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNy84LzIvZGF0YXNldF83ODIwODYzNi0xNzM3LTRjMGYtOTlmMC1mYmEzMWFlZTdlMTEuZGF0IiAtZHcgLXUgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMC9vdXRwdXRzL2RhdGFzZXRfMDAzMWZiMTgtN2RmZS00N2M4LWI4NjEtMDYyNDk5ODJlNzNhLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlbW92aW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDEgc2lkZSBjb21wb3VuZHMgaWdub3JlZCBkdXJpbmcgZ3JhcGggYnVpbGQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBzZWVkRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCB0cnVlIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdEFubm90YXRpb25zIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkV4dHJhY3RBbm5vdGF0aW9ucyAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8wLzMvOS9kYXRhc2V0XzAzOTBiYThlLWI5MmUtNDlkNS04YzE2LWZhMmU2YWI5YzZmMi5kYXQiIC1leHBvcnQgIk1FVEFCT0xJVEUiIC1kYiAibWV0YW5ldHguY2hlbWljYWwiICAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMi9vdXRwdXRzL2RhdGFzZXRfNWYyYWNjNjctYTdjNi00NDI4LWE3YTEtYjEzMDRlYTlmZDQxLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgYW5ub3RhdGlvbnMgZm91bmQgZm9yIDExMC8xMTEgbWV0YWJvbGl0ZXMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGV4cG9ydCB8IGAgIk1FVEFCT0xJVEUiIGAgfAogICAgICAgfCBkYiB8IGAgIm1ldGFuZXR4LmNoZW1pY2FsIiBgIHwKICAgICAgIHwgdW5pcSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHNraXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdEFubm90YXRpb25zIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkV4dHJhY3RBbm5vdGF0aW9ucyAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy81L2QvMy9kYXRhc2V0XzVkMzk2NzEwLTIzZWYtNDE2Yy04NjJiLTg1NzI4MDVlMmMzOS5kYXQiIC1leHBvcnQgIk1FVEFCT0xJVEUiIC1kYiAibWV0YW5ldHguY2hlbWljYWwiICAtc2tpcCAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE0L291dHB1dHMvZGF0YXNldF81MDEzNzVmZC1lMTM0LTRkZWYtYmM2Zi05NDc0NmFmNmY5ZjkuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBhbm5vdGF0aW9ucyBmb3VuZCBmb3IgMTEwLzExMSBtZXRhYm9saXRlcwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZXhwb3J0IHwgYCAiTUVUQUJPTElURSIgYCB8CiAgICAgICB8IGRiIHwgYCAibWV0YW5ldHguY2hlbWljYWwiIGAgfAogICAgICAgfCB1bmlxIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgc2tpcCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0V4dHJhY3RBbm5vdGF0aW9ucyAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5FeHRyYWN0QW5ub3RhdGlvbnMgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMi85LzEvZGF0YXNldF8yOTE5MWUyNC1kYTc0LTQ1NDEtYjBkMy1hM2ZjNzJkMzU4MjAuZGF0IiAtZXhwb3J0ICJNRVRBQk9MSVRFIiAtZGIgIm1ldGFuZXR4LmNoZW1pY2FsIiAtdW5pcSAtc2tpcCAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE2L291dHB1dHMvZGF0YXNldF9jY2M3YjRmMC0xY2I3LTQ2ZTktYWI4MC1iMjU3MWU4Y2ExY2YuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBhbm5vdGF0aW9ucyBmb3VuZCBmb3IgMTEwLzExMSBtZXRhYm9saXRlcwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZXhwb3J0IHwgYCAiTUVUQUJPTElURSIgYCB8CiAgICAgICB8IGRiIHwgYCAibWV0YW5ldHguY2hlbWljYWwiIGAgfAogICAgICAgfCB1bmlxIHwgYCB0cnVlIGAgfAogICAgICAgfCBza2lwIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdFBhdGh3YXlzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkV4dHJhY3RQYXRod2F5cyAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9lL2YvYy9kYXRhc2V0X2VmY2VkNjRmLTI3YTItNDhiNS05MTVmLWJmYWMyNjhjNzk5MS5kYXQiIC1wICJDaXRyaWNfQWNpZF9DeWNsZStGb2xhdGVfTWV0YWJvbGlzbSt0b3RvIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE4L291dHB1dHMvZGF0YXNldF9lN2I2MjQ5YS0yY2JhLTQyMzktYTRjNi0yN2Y0MzU5YWMyZDEuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBYZm0xMTU4CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgbmV0d29yayBleHBvcnRlZC4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgTnVtYmVyIG9mIHJlYWN0aW9ucyBpbiBvcmlnaW5hbCBuZXR3b3JrOiAxMTU4CiAgICAgIE51bWJlciBvZiBzcGVjaWVzIGluIG9yaWdpbmFsIG5ldHdvcms6IDExMDcKICAgICAgTnVtYmVyIG9mIGdlbmVzIGluIG9yaWdpbmFsIG5ldHdvcms6IDU3MQogICAgICBOdW1iZXIgb2YgcmVhY3Rpb25zIGluIHBhdGh3YXkgQ2l0cmljX0FjaWRfQ3ljbGUgKENpdHJpY19BY2lkX0N5Y2xlKTogMTEKICAgICAgTnVtYmVyIG9mIHNwZWNpZXMgaW4gcGF0aHdheSBDaXRyaWNfQWNpZF9DeWNsZSAoQ2l0cmljX0FjaWRfQ3ljbGUpOiAyNgogICAgICBOdW1iZXIgb2YgZ2VuZXMgaW4gcGF0aHdheSBDaXRyaWNfQWNpZF9DeWNsZSAoQ2l0cmljX0FjaWRfQ3ljbGUpOiAxOAogICAgICBOdW1iZXIgb2YgcmVhY3Rpb25zIGluIHBhdGh3YXkgRm9sYXRlX01ldGFib2xpc20gKEZvbGF0ZV9NZXRhYm9saXNtKTogNgogICAgICBOdW1iZXIgb2Ygc3BlY2llcyBpbiBwYXRod2F5IEZvbGF0ZV9NZXRhYm9saXNtIChGb2xhdGVfTWV0YWJvbGlzbSk6IDE2CiAgICAgIE51bWJlciBvZiBnZW5lcyBpbiBwYXRod2F5IEZvbGF0ZV9NZXRhYm9saXNtIChGb2xhdGVfTWV0YWJvbGlzbSk6IDgKICAgICAgRXJyb3I6IFBhdGh3YXkgdG90byBub3QgZm91bmQgaW4gbmV0d29yaywgcGxlYXNlIGNoZWNrIHNibWwgZmlsZS4KICAgICAgTnVtYmVyIG9mIHJlYWN0aW9ucyBpbiBuZXR3b3JrOiAxNwogICAgICBOdW1iZXIgb2Ygc3BlY2llcyBpbiBuZXR3b3JrOiAzNQogICAgICBOdW1iZXIgb2YgZ2VuZXMgaW4gbmV0d29yazogMjUKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHBhdGh3YXlJZCB8IGAgIkNpdHJpY19BY2lkX0N5Y2xlK0ZvbGF0ZV9NZXRhYm9saXNtK3RvdG8iIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdFN1YkJpcE5ldHdvcmsgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5FeHRyYWN0U3ViQmlwTmV0d29yayAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8xLzMvZi9kYXRhc2V0XzEzZjI5YzRlLWEzZDEtNDRmNi1iNDZkLTNlNjI2ZWM0MGQ3MC5kYXQiIC1zICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzkvZi8wL2RhdGFzZXRfOWYwMDY1ZmQtNmYwNC00ODU4LWJhZTMtNWQwZTkxMWIxMWUyLmRhdCIgLXQgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMS80LzkvZGF0YXNldF8xNDlkNTRmNy05ZGM1LTQyNTgtYjM2Ni1iN2RkYzEyYmY2OGQuZGF0IiAgLXNjICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzAvYS8xL2RhdGFzZXRfMGExN2EzMmUtMmYzOC00ZmNjLWE0MDktZGQwMmE4MDdiYzBmLmRhdCIgLWsgIjEiICAtZiAiZ21sIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIzL291dHB1dHMvZGF0YXNldF84NDQ5MmE2OS1mM2U3LTQ4ZWItYTM0Ni1lZjFjNTBjZWJlOGQuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgcmVhZGluZyBTQk1MLi4uCiAgICAgIGltcG9ydGluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBleHRyYWN0aW5nIHNvdXJjZXMgYW5kIHRhcmdldHMKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgYmxrZFJlYWN0aW9uRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgayB8IGAgIjEiIGAgfAogICAgICAgfCBzdCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9FeHRyYWN0U3ViTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLkV4dHJhY3RTdWJOZXR3b3JrIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzQvYy84L2RhdGFzZXRfNGM4OThjZjctYTY3NC00OTBkLTlmMTEtZmE5YWQxMTBkNWEzLmRhdCIgLXMgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvZi9mL2EvZGF0YXNldF9mZmFmYjE3NS03MzllLTRmMjAtOWYzNC05MDAwM2IxNzNhM2IuZGF0IiAtdCAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy85LzMvYy9kYXRhc2V0XzkzYzU4YWU5LTNjOTgtNGU3Yi1iZDczLTRiYjhkOGZjZjYyZi5kYXQiICAgIC1rICIxIiAgLWYgImdtbCIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yNy9vdXRwdXRzL2RhdGFzZXRfYzMzZGNhMjctNjc2MS00NGVhLTg2YmYtOGM2N2NkOTliMDQ0LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgIGV4dHJhY3Rpbmcgc291cmNlcyBhbmQgdGFyZ2V0cwoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBHTUwgY3JlYXRlZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHdlaWdodEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGNoZW1pY2FsU2ltIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGsgfCBgICIxIiBgIHwKICAgICAgIHwgc3QgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdFN1YlJlYWN0aW9uTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLkV4dHJhY3RTdWJSZWFjdGlvbk5ldHdvcmsgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYi8wLzYvZGF0YXNldF9iMDYxMzQ0Yi04ODA4LTQxZjktODkxNi1mMDRiYjg0Y2VhZjcuZGF0IiAtcyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9lLzAvMS9kYXRhc2V0X2UwMWQ0YTczLWE2Y2YtNGYxYS04NjUwLWE4MDdjMzQyOGY4YS5kYXQiICAtdCAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy84LzIvZS9kYXRhc2V0XzgyZWMyNmM0LTk2ZDItNDAxNy05MWQ5LTNiZGI1NTAyMGIzYi5kYXQiIC1zYyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy83LzQvNi9kYXRhc2V0Xzc0NmYwMTM0LTY1YjgtNDk4Ny1iNzc0LTZmOTc3MTI1NTBlMy5kYXQiIC1rICIxIiAgLWYgImdtbCIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8zMi9vdXRwdXRzL2RhdGFzZXRfOThlYjgzNDgtMzU5Yy00YmVhLTllODEtODZiODFjZDk1NzY2LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVsZW1lbnQgLy8gQ29weXJpZ2h0IDIwMjUgbGNvdHRyZXQgbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBub3QgZm91bmQgaW4gbmV0d29yawogICAgICBFbGVtZW50IC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyBub3QgZm91bmQgaW4gbmV0d29yawogICAgICBFbGVtZW50IC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBub3QgZm91bmQgaW4gbmV0d29yawogICAgICBFbGVtZW50IC8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgLy8gbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIDE0IHNpZGUgY29tcG91bmRzIG5vdCBmb3VuZCBpbiBuZXR3b3JrLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICByZWFkaW5nIFNCTUwuLi4KICAgICAgUmVhZCBmaWxlIGNvbnRhaW5pbmcgc2lkZSBjb21wb3VuZHMuLi4KICAgICAgZXh0cmFjdGluZyBzb3VyY2VzIGFuZCB0YXJnZXRzCiAgICAgIEdNTCBjcmVhdGVkLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCBrIHwgYCAiMSIgYCB8CiAgICAgICB8IHN0IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZm9ybWF0IHwgYCAiZ21sIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0ZiY1RvTm90ZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuRmJjVG9Ob3RlcyAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy80LzEvZC9kYXRhc2V0XzQxZDUzZDVjLWQ0OTItNDk5NC1hMjAzLTkwZGY3NGM2ZmQxYi5kYXQiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMzQvb3V0cHV0cy9kYXRhc2V0X2EzNzI0OGE3LTA5ZDAtNDE2Ni05N2I1LTcyNGVhYzk1ZjMyMi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgaU1MMTUxNQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBpTUwxNTE1CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBpTUwxNTE1CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaGFzUHJvcGVydHksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBoYXNQcm9wZXJ0eSwgc2V0IHRvIEhBU19QUk9QRVJUWQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0dldEJpZ2dNb2RlbFByb3Rlb21lIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBiaWdnLkdldEJpZ2dNb2RlbFByb3Rlb21lIC1tICJlX2NvbGlfY29yZSIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8zNS9vdXRwdXRzL2RhdGFzZXRfM2FjN2Y2ZGYtM2ZmMS00OWQ1LWEyNTgtODcwMDQxNGFhYTgxLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IG1vZGVsSWQgfCBgICJlX2NvbGlfY29yZSIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgImRhdGEiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0RW50aXRpZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuR2V0RW50aXRpZXMgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNS9mL2QvZGF0YXNldF81ZmQ0N2U2Mi0zYTE0LTQ2ZTctYjBjZS01NTkzNDdjZTMyNWYuZGF0IiAgICAgICAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzM3L291dHB1dHMvZGF0YXNldF83YzM1OTk0Ny1iOWYyLTQ2YmItOTQzYi1mOWMwZDEwYzY5M2EuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHByaW50TWV0YWJvbGl0ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBwcmludFJlYWN0aW9ucyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHByaW50Q29tcGFydG1lbnRzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcHJpbnRQYXRod2F5cyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHByaW50R2VuZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBub1R5cGVDb2wgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0RW50aXRpZXMgKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuR2V0RW50aXRpZXMgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMy82LzcvZGF0YXNldF8zNjdhN2RmMC0xMmQ4LTRjYjItYWNjNC0yOTZiY2UxOTIxYzguZGF0IiAtbSAtciAtYyAgLWcgLW50IC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMzkvb3V0cHV0cy9kYXRhc2V0XzgyNTViMWNkLThkMjAtNDIzMC1hY2RjLTBhMWZmODU5OGIzOS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgcHJpbnRNZXRhYm9saXRlcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcHJpbnRSZWFjdGlvbnMgfCBgIHRydWUgYCB8CiAgICAgICB8IHByaW50Q29tcGFydG1lbnRzIHwgYCB0cnVlIGAgfAogICAgICAgfCBwcmludFBhdGh3YXlzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcHJpbnRHZW5lcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbm9UeXBlQ29sIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0R2VuZXNGcm9tUmVhY3Rpb25zIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkdldEdlbmVzRnJvbVJlYWN0aW9ucyAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy81LzYvZi9kYXRhc2V0XzU2ZjY1MzhlLTMyNjktNDViMy1hYmJlLWY5YTAwMjdhOTMyOS5kYXQiIC1yICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzQvNS8zL2RhdGFzZXRfNDUzYWU3YjUtMDRmNy00ZTk2LWE5ZWItZjJjNjAwOWUzYWFiLmRhdCIgLXNlcCAiCSIgIC1jb2wgIjEiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNDIvb3V0cHV0cy9kYXRhc2V0XzdhMzcxM2QyLTFiNjAtNDEzMS04MzM1LTEzOGQ5ODU0MGZiNC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgcmVhY3Rpb25zIG1hcHBlZAogICAgICAwIHJlYWN0aW9ucyBub3QgZm91bmQgaW4gbW9kZWwKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNlcCB8IGAgIlx0IiBgIHwKICAgICAgIHwgaGFzSGVhZGVyIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgaSB8IGAgIjEiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0TWV0YWJvbGl0ZUF0dHJpYnV0ZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuR2V0TWV0YWJvbGl0ZUF0dHJpYnV0ZXMgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvZi9iL2MvZGF0YXNldF9mYmM4MjQxOC00NGY1LTQ3YTItYjE1My0xODg0NGI0MGRkZDAuZGF0IiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzQ0L291dHB1dHMvZGF0YXNldF8zZmY4YTA1Mi1mYTFmLTQ5MWEtYmE2YS1mNzRjNTIyNzY3ZmYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0UmVhY3RhbnRzRnJvbVJlYWN0aW9ucyAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5HZXRSZWFjdGFudHNGcm9tUmVhY3Rpb25zIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2MvNi8yL2RhdGFzZXRfYzYyYTJhOTYtZTJlNy00NmZhLWE0YWUtOThmNjI5ODk2ODc2LmRhdCIgLXIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNy9lL2IvZGF0YXNldF83ZWIyNDVlZS0xMjUwLTQ1NDAtOGFkMi0zNWFkYWQxNzlmNDEuZGF0IiAtc2VwICIJIiAgLWNvbCAiMSIgICAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzQ3L291dHB1dHMvZGF0YXNldF81YmY5MDg2MS0yNTJlLTQzYzEtYmQ2MC1hNGU3OGI4ZmE0MzcuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIHJlYWN0aW9ucyBtYXBwZWQKICAgICAgMCByZWFjdGlvbnMgbm90IGZvdW5kIGluIG1vZGVsCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBzZXAgfCBgICJcdCIgYCB8CiAgICAgICB8IGhhc0hlYWRlciB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGkgfCBgICIxIiBgIHwKICAgICAgIHwgcHJpbnRTdWJzdHJhdGVzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcHJpbnRQcm9kdWN0cyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9HZXRSZWFjdGFudHNGcm9tUmVhY3Rpb25zIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkdldFJlYWN0YW50c0Zyb21SZWFjdGlvbnMgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMC80LzcvZGF0YXNldF8wNDdjYTQyNi1mYjYzLTQ2YjgtOGY2ZC0xYmI5ZTM3YzE0YmQuZGF0IiAtciAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8xL2EvNC9kYXRhc2V0XzFhNGI3ODJhLTg0MmYtNGYwYS1hN2ZiLTdhYzI0YzM5MmM5OC5kYXQiIC1zZXAgIgkiICAtY29sICIxIiAtcyAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC81MC9vdXRwdXRzL2RhdGFzZXRfOWJjNDM3NTctMzhkOC00YWZiLWE2YzgtYzc2ZGRlNjZlMmY5LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMiByZWFjdGlvbnMgbWFwcGVkCiAgICAgIDAgcmVhY3Rpb25zIG5vdCBmb3VuZCBpbiBtb2RlbAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgc2VwIHwgYCAiXHQiIGAgfAogICAgICAgfCBoYXNIZWFkZXIgfCBgIGZhbHNlIGAgfAogICAgICAgfCBpIHwgYCAiMSIgYCB8CiAgICAgICB8IHByaW50U3Vic3RyYXRlcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcHJpbnRQcm9kdWN0cyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9HZXRSZWFjdGFudHNGcm9tUmVhY3Rpb25zIChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkdldFJlYWN0YW50c0Zyb21SZWFjdGlvbnMgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvZS9hLzYvZGF0YXNldF9lYTY3NzlmMi0wZjMyLTRlMmQtYjFjYy1iMTQwNmFhOGQyOTguZGF0IiAtciAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy84LzIvNC9kYXRhc2V0XzgyNDI1ZTQ4LTI4YmMtNDQ2My04NmJjLTBkYWFjZTAxYjA5Ni5kYXQiIC1zZXAgIgkiICAtY29sICIxIiAgLXAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC81My9vdXRwdXRzL2RhdGFzZXRfNmI0YTE0NmUtYjYxMC00OTAyLWFhNmEtZTNjM2I0ZTE0YzJiLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMiByZWFjdGlvbnMgbWFwcGVkCiAgICAgIDAgcmVhY3Rpb25zIG5vdCBmb3VuZCBpbiBtb2RlbAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgc2VwIHwgYCAiXHQiIGAgfAogICAgICAgfCBoYXNIZWFkZXIgfCBgIGZhbHNlIGAgfAogICAgICAgfCBpIHwgYCAiMSIgYCB8CiAgICAgICB8IHByaW50U3Vic3RyYXRlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHByaW50UHJvZHVjdHMgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9Mb2FkUG9pbnQgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5Mb2FkUG9pbnQgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNS81L2UvZGF0YXNldF81NWUwZTU5Mi04MDIzLTRiNjktYmM0NS0yOWJlMzAzNTIyNWEuZGF0IiAtayAiMSIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC81NS9vdXRwdXRzL2RhdGFzZXRfNDY0YTM0M2MtYWEyNi00YjIwLTlkM2MtZmE2Mjk0M2UyMGQxLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBuZXR3b3JrLi4uCiAgICAgIENvbXB1dGluZyBsb2FkIHBvaW50cy4uLgogICAgICBFeHBvcnQgcmVzdWx0cy4uLgogICAgICBkb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgc2lkZUNvbXBvdW5kRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgayB8IGAgIjEiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfTWV0YWJvUmFuayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLk1ldGFib1JhbmsgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMC9mL2YvZGF0YXNldF8wZmZmY2UzYS1kNWVjLTQ3NmItODJmZi1iN2MwOWZiN2FiYzYuZGF0IiAtcyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8xLzYvMS9kYXRhc2V0XzE2MThkYmQwLTU2YzMtNDIwMi04ODdhLTI5MGJhMzJiODlkMS5kYXQiIC1zYyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy80LzYvNC9kYXRhc2V0XzQ2NGM5MThlLWRlYjQtNGU5ZC1iOTIyLWYxMzI3YzIyNDI2YS5kYXQiIC1tYXggIjE1MDAwIiAtdCAiMC4wMDEiIC1kICIwLjg1IiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzU5L291dHB1dHMvZGF0YXNldF81Yzg5NjIwNC01YzFiLTRjYzUtYjVlMC1lNWMyNDFhNTEyY2EuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICAyIGlzb2xhdGVkIG5vZGVzIHJlbW92ZWQgCiAgICAgIHRyYW5zaXRpb24gcHJvYmFiaWxpdGllcyBjb21wdXRlZAogICAgICB0cmFuc2l0aW9uIHByb2JhYmlsaXRpZXMgY29tcHV0ZWQgKHJldmVyc2UgZ3JhcGgpCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBjb21wb3VuZCBncmFwaCBjcmVhdGVkLgogICAgICByZW1vdmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICA2IGNvbXBvdW5kcyByZW1vdmVkLgogICAgICB3ZWlnaHRzIGNvbXB1dGVkLgogICAgICByZXZlcnNlIGdyYXBoIGNyZWF0ZWQuCiAgICAgIHNlZWRzIGZpbGUgaW1wb3J0ZWQKICAgICAgMyBzZWVkcwogICAgICBnbG9iYWwgcGFnZVJhbmsgY29tcHV0ZWQKICAgICAgZ2xvYmFsIGNoZWlSYW5rIGNvbXB1dGVkCiAgICAgIHBhZ2VSYW5rIGNvbXB1dGVkCiAgICAgIGNoZWlSYW5rIGNvbXB1dGVkCiAgICAgIGRvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBlZGdlV2VpZ2h0c0ZpbGVQYXRocyB8IGAgTm9uZSBgIHwKICAgICAgIHwgbWF4TmJPZkl0ZXIgfCBgICIxNTAwMCIgYCB8CiAgICAgICB8IHRvbGVyYW5jZSB8IGAgIjAuMDAxIiBgIHwKICAgICAgIHwgZGFtcGluZ0ZhY3RvciB8IGAgIjAuODUiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfTmV0d29ya1N1bW1hcnkgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5OZXR3b3JrU3VtbWFyeSAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9jL2IvZS9kYXRhc2V0X2NiZTc3ZTgyLTUzYjEtNDg4YS1iZjZlLTNkYjE4YTlkZjQ3MS5kYXQiICAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC82MS9vdXRwdXRzL2RhdGFzZXRfOTVlZmRmMGQtNjIxNC00M2Q5LTkxYjItMDczOWJmOGFmOTNiLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBncmFwaC4uLgogICAgICBwZXJmb3JtIGJhc2ljIGFuYWx5c2lzLi4uCiAgICAgIGV4dHJhY3QgY29ubmVjdGVkIGNvbXBvbmVudC4uLgogICAgICBDb21wdXRlIGRlbnNpdHkuLi4KICAgICAgQ29tcHV0ZSBsb2NhbCBjbHVzdGVyaW5nIGNvZWZmaWNpZW50cy4uLgogICAgICBDb21wdXRlIGRlZ3JlZSBzdGF0aXN0aWNzLi4uCiAgICAgIENvbXB1dGUgZGlzdGFuY2VzLi4uCiAgICAgIENvbXB1dGUgZGlzdGFuY2VzIHN0YXRpc3RpY3MuLi4KICAgICAgQ29tcHV0ZSBjZW50cmFsaXR5Li4uCiAgICAgIAlDbG9zZW5lc3MgZG9uZS4KICAgICAgRG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHNraXBkaXN0IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZGlyZWN0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfT1JBcGF0aHdheUVucmljaG1lbnQgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG1hcHBpbmcuT1JBcGF0aHdheUVucmljaG1lbnQgLXRoICIwLjAiIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2IvMy83L2RhdGFzZXRfYjM3YzQwNWMtMDc2YS00NWE1LTk1MTMtNTBjMTdiNWFjNmE4LmRhdCIgLWQgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMC81LzkvZGF0YXNldF8wNTkxN2ViMi1iMDJkLTQ0MTMtYWQ5Ny1lMGIwMTZkOTQ2MDQuZGF0IiAtYyAiQmVuamFtaW5pSG9jaGJlcmciIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNjQvb3V0cHV0cy9kYXRhc2V0X2NiOWE5Njg5LTA1OTEtNGJiNS04ODUzLTVlNTQ0YzZhYWIzNi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCiAgICAgIEltcG9ydCBkYXRhLi4uCiAgICAgIDMgY29tcG91bmRzIGltcG9ydGVkLgogICAgICAgRG9uZS4KICAgICAgUGVyZm9ybSBQYXRod2F5IEVucmljaG1lbnQuLi4gRG9uZS4KICAgICAgRXhwb3J0IHJlc3VsdHMuLi4KICAgICAgZG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHRoIHwgYCAiMC4wIiBgIHwKICAgICAgIHwgY29yciB8IGAgIkJlbmphbWluaUhvY2hiZXJnIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX09SQXBhdGh3YXlFbnJpY2htZW50IChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBtYXBwaW5nLk9SQXBhdGh3YXlFbnJpY2htZW50IC10aCAiMC4wMDUiIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzMvZi9kL2RhdGFzZXRfM2ZkN2VhMGYtZDE4MC00OGQyLTllZTUtZGFlY2I0YjE4ZWJiLmRhdCIgLWQgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMy9lLzQvZGF0YXNldF8zZTRmNjE0YS0yNzQzLTRiYWQtYTM4MS1iM2I5OWQ4ZWFlMTcuZGF0IiAtYyAiSG9sbUJvbmZlcnJvbmkiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNjcvb3V0cHV0cy9kYXRhc2V0X2VjNzkxMGIxLTgwMzMtNDIxMS1iM2FhLTc4ODE2NzczODBjNy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCiAgICAgIEltcG9ydCBkYXRhLi4uCiAgICAgIDMgY29tcG91bmRzIGltcG9ydGVkLgogICAgICAgRG9uZS4KICAgICAgUGVyZm9ybSBQYXRod2F5IEVucmljaG1lbnQuLi4gRG9uZS4KICAgICAgU2VsZWN0IHNpZ25pZmljYW50IHBhdGh3YXlzLi4uCiAgICAgIAkyIHNpZ25pZmljYW50IHBhdGh3YXlzIGZvdW5kLgogICAgICAgRG9uZS4KICAgICAgRXhwb3J0IHJlc3VsdHMuLi4KICAgICAgZG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHRoIHwgYCAiMC4wMDUiIGAgfAogICAgICAgfCBjb3JyIHwgYCAiSG9sbUJvbmZlcnJvbmkiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUHJlY3Vyc29yTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlByZWN1cnNvck5ldHdvcmsgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMS81LzYvZGF0YXNldF8xNTY4Zjg4NS0yZjc5LTQxMTktYTkxYy05YTM1MzgzNWFlZmQuZGF0IiAtdCAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy85LzIvOS9kYXRhc2V0XzkyOWIyY2JhLWI2YWQtNGFmNC04ZGFiLTk1NGNmOGI1NmU1OC5kYXQiIC1mICJnbWwiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNzAvb3V0cHV0cy9kYXRhc2V0XzIyZDA1OWJmLTkzYWItNDUwYi1iNWMxLTg0OWY0ZDMwODJkOC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBHTUwgY3JlYXRlZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHJlYWN0aW9uVG9JZ25vcmVGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlJlYWN0aW9uRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNi9hL2UvZGF0YXNldF82YWU5YzU0ZS1lMGNkLTRhY2YtYjE2OC0wYzA3YTlhM2ZlNTUuZGF0IiAgIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNzIvb3V0cHV0cy9kYXRhc2V0X2U0NTIzYzQyLTg0MzctNDViOS1iYjAzLTYyNTFiMjk5ZjYxMi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1JlYWN0aW9uRGlzdGFuY2VNYXRyaXggKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5SZWFjdGlvbkRpc3RhbmNlTWF0cml4IC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzUvNS8zL2RhdGFzZXRfNTUzYmY3NDAtNjRlYi00Y2UzLWFiOGYtZTY4YmQ0ZmU0ZTk4LmRhdCIgIC11IC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNzQvb3V0cHV0cy9kYXRhc2V0XzU4NWQwMDU2LWIwYmMtNDI5ZS05ZWY2LTU3NDhlYjMyYzllNy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlJlYWN0aW9uRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYi9lL2IvZGF0YXNldF9iZWIxN2U4Zi00ZWNhLTQwOGItYmIwOS01ODIwMTFlODAzM2EuZGF0IiAtc2MgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYy9mLzAvZGF0YXNldF9jZjAwZTBmNC0zNWMyLTQ0MTktYTg1Ni04YjYwYmEwNjI4NDEuZGF0IiAgLXUgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC83Ny9vdXRwdXRzL2RhdGFzZXRfNzA3NDJhZjgtYzAwOC00MDY3LTkxZTUtNDQ5NmQ1MTI1N2NlLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICAxIHNpZGUgY29tcG91bmRzIHRvIGlnbm9yZSBkdXJpbmcgZ3JhcGggYnVpbGQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAoVGVzdCAjIDQpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlJlYWN0aW9uRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNy9mLzMvZGF0YXNldF83ZjNiZWI3ZC02MTdiLTQ0MDEtYTBlZC00ZWE1ZDdjMWM4MTMuZGF0IiAgLXJlICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzAvOS81L2RhdGFzZXRfMDk1NTM2MzYtY2FjYi00NWNjLWFjYTMtNjc2NjRlNjBiYjk5LmRhdCIgLXUgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC84MC9vdXRwdXRzL2RhdGFzZXRfMDk3NmYxMzQtNDJiYy00MTEwLWExNGYtYWVkMGU4MTJiNjk3LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLgogICAgICByZW1vdmluZyByZWFjdGlvbnMgdG8gZXhjbHVkZS4uLgogICAgICAxIHJlYWN0aW9ucyBpZ25vcmVkIGR1cmluZyBncmFwaCBidWlsZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJ4bkZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHdlaWdodEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9SZWFjdGlvbkRpc3RhbmNlTWF0cml4IChUZXN0ICMgNSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8wL2EvYi9kYXRhc2V0XzBhYmQwMjRkLWFiYjYtNDA1MS1iMTZhLWQ0MTUzZjI3NWQ0MC5kYXQiIC1zYyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy85LzkvMC9kYXRhc2V0Xzk5MDcwMzc2LTMzOTktNDA4Ny1hMTA2LWI2YWQ4NDViN2E2NS5kYXQiICAtcmUgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvOS80LzYvZGF0YXNldF85NDY4MTY1Ny1jYmJjLTQ0NmEtOGM3Yy0xMGUxODc2ODEyMzMuZGF0IiAtdSAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzg0L291dHB1dHMvZGF0YXNldF83NjQzODNjYS02NzA3LTRhNGItOWFiMC0xNjQ1ZDFhMDY5YzIuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDEgc2lkZSBjb21wb3VuZHMgdG8gaWdub3JlIGR1cmluZyBncmFwaCBidWlsZAogICAgICByZW1vdmluZyByZWFjdGlvbnMgdG8gZXhjbHVkZS4uLgogICAgICAxIHJlYWN0aW9ucyBpZ25vcmVkIGR1cmluZyBncmFwaCBidWlsZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJ4bkZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHdlaWdodEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9SZWFjdGlvbkRpc3RhbmNlTWF0cml4IChUZXN0ICMgNik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8xLzYvZC9kYXRhc2V0XzE2ZDM5OTVhLTg2YzgtNGI3Zi1hOWUxLWU4YmFmYTRlNDAzNC5kYXQiIC1zYyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy85LzEvOC9kYXRhc2V0XzkxOGFmNDk0LWQ2MzEtNGYzOS05MmRhLTViYTQ2YTZlYmE0Yi5kYXQiICAtcmUgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYy8zLzAvZGF0YXNldF9jMzAxZjQzYS0yM2QwLTQ2NjctYmM0OC0wMTA3NGE2MDRjNDcuZGF0IiAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC84OC9vdXRwdXRzL2RhdGFzZXRfYjA0NGE2OTktMDExNC00ZmNjLTg1ZTItODk5OTlmM2FmMDFkLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICAxIHNpZGUgY29tcG91bmRzIHRvIGlnbm9yZSBkdXJpbmcgZ3JhcGggYnVpbGQKICAgICAgcmVtb3ZpbmcgcmVhY3Rpb25zIHRvIGV4Y2x1ZGUuLi4KICAgICAgMSByZWFjdGlvbnMgaWdub3JlZCBkdXJpbmcgZ3JhcGggYnVpbGQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBkZWdyZWUgfCBgIGZhbHNlIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NibWwyQ2FyYm9uU2tlbGV0b25OZXQgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy82L2EvOS9kYXRhc2V0XzZhOTk4YmI1LTkzOGQtNDRlNy04YTA3LWVhMjlkZGNmOGM3MC5kYXQiIC1nICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzEvZC83L2RhdGFzZXRfMWQ3MzFiYjItYWNmMC00YjA0LWE0NjYtMWFjZDUwYmJhZWEzLmRhdCIgICAgICAgLWYgImdtbCIgICAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzkxL291dHB1dHMvZGF0YXNldF85ZjNmYjVkMC1iM2VkLTQ4OTgtOWIwYi1mNDIwNDM4ZWZjY2MuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIDExMSBub2RlcyBhbmQgMjAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgIEV4cG9ydGluZy4uLkdNTCBjcmVhdGVkLgogICAgICAgRG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGtlZXBTaW5nbGVDYXJib24gfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnZUNvbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnZUVkZ2VzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcmVtb3ZlSXNvbGF0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY29tcHV0ZVdlaWdodCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IG1haW4gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmcm9tSW5kZXhlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNhcmJvblNrZWxldG9uTmV0IChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ2FyYm9uU2tlbGV0b25OZXQgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvOC9jLzAvZGF0YXNldF84YzA0NWI5NC0yNTllLTQ0MjYtOGYzNi00MzViMWQxODFjNDUuZGF0IiAtZyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8xLzkvOS9kYXRhc2V0XzE5OTljMTFjLTE5MjAtNDU3My1hZTQ4LTA1ZDA0ZDgwNDI1Yy5kYXQiIC1rcyAgICAgIC1mICJnbWwiICAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC85NC9vdXRwdXRzL2RhdGFzZXRfMjgyOTMwZTItNzQyYi00MzA0LWIzZWEtMjgzMTk3ZjQ1OWIwLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgMCBlZGdlcyBpbiBmaWxlIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGgKICAgICAgMjA1IHdlaWdodHMgc2V0IGFtb25nIDUwMiBlZGdlcyBpbiBncmFwaAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi43NSByZWFjdGlvbnMgYW5kIDExMSBtZXRhYm9saXRlcyByZWFkLgogICAgICAgRG9uZS4KICAgICAgQnVpbGRpbmcgTmV0d29yay4uLjExMSBub2RlcyBhbmQgNTAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgICBEb25lLgogICAgICBQcm9jZXNzaW5nIGF0b20gbWFwcGluZ3MuLi5Eb25lLgogICAgICAxMTEgbm9kZXMgYW5kIDIwNSBlZGdlcyBjcmVhdGVkLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBrZWVwU2luZ2xlQ2FyYm9uIHwgYCB0cnVlIGAgfAogICAgICAgfCBtZXJnZUNvbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnZUVkZ2VzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcmVtb3ZlSXNvbGF0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY29tcHV0ZVdlaWdodCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IG1haW4gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmcm9tSW5kZXhlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNhcmJvblNrZWxldG9uTmV0IChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ2FyYm9uU2tlbGV0b25OZXQgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYi8zLzcvZGF0YXNldF9iMzczNzAwZi02NjI1LTQ1ZjUtODBkMC0wOTg3NGFkNzExODIuZGF0IiAtZyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy83LzAvNC9kYXRhc2V0XzcwNDc0YWExLTI5NGYtNDQyZC1hY2NhLTQ0YzY5ODVlOTNmZi5kYXQiICAtbWMgICAgIC1mICJnbWwiICAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC85Ny9vdXRwdXRzL2RhdGFzZXRfMzAwOTMxYTEtNGYzZS00MTAyLWFmYjAtYzc3ZGJkMjgxOWE4LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgMCBlZGdlcyBpbiBmaWxlIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGgKICAgICAgMjA1IHdlaWdodHMgc2V0IGFtb25nIDUwMiBlZGdlcyBpbiBncmFwaAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi43NSByZWFjdGlvbnMgYW5kIDExMSBtZXRhYm9saXRlcyByZWFkLgogICAgICAgRG9uZS4KICAgICAgQnVpbGRpbmcgTmV0d29yay4uLjExMSBub2RlcyBhbmQgNTAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgICBEb25lLgogICAgICBQcm9jZXNzaW5nIGF0b20gbWFwcGluZ3MuLi5Eb25lLgogICAgICBNZXJnaW5nIGNvbXBhcnRtZW50cy4uLiBEb25lLgogICAgICBTa2lwIGNvbXBvdW5kcyB3aXRoIGxlc3MgdGhhbiB0d28gY2FyYm9ucyBkZXRlY3RlZC4uLgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIDgzIG5vZGVzIGFuZCAyMDIgZWRnZXMgY3JlYXRlZC4KICAgICAgRXhwb3J0aW5nLi4uR01MIGNyZWF0ZWQuCiAgICAgICBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAoVGVzdCAjIDQpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkNhcmJvblNrZWxldG9uTmV0IC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2EvOC8yL2RhdGFzZXRfYTgyNjYyNzgtMDNjZi00MGZjLTllYzEtNDhiZDljYzk4MDI2LmRhdCIgLWcgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvZC8wLzIvZGF0YXNldF9kMDI2ODFmOC0yN2YxLTQ4MTctOWJkNy00OTA0Mjg0NTNkZDIuZGF0IiAgIC1tZSAgICAtZiAiZ21sIiAgIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTAwL291dHB1dHMvZGF0YXNldF8xNGU5ODI1Ny03ZDgyLTQwOWEtYTZhMC1lOTA1NjE4NzM5MDAuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIE1lcmdpbmcgZWRnZXMuLi4gRG9uZS4KICAgICAgMTExIG5vZGVzIGFuZCAxNDMgZWRnZXMgY3JlYXRlZC4KICAgICAgRXhwb3J0aW5nLi4uR01MIGNyZWF0ZWQuCiAgICAgICBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIHRydWUgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAoVGVzdCAjIDUpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkNhcmJvblNrZWxldG9uTmV0IC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzgvMS80L2RhdGFzZXRfODE0OGVjYzQtYzYxYS00YTBmLWJjOWEtOWRiMGZhMmQxYzg1LmRhdCIgLWcgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNS85LzgvZGF0YXNldF81OThlNGQ5Zi1hNjI0LTRkYmYtODY4My03NGZiODgwZWIwODYuZGF0IiAgICAtcmkgICAtZiAiZ21sIiAgIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTAzL291dHB1dHMvZGF0YXNldF8wZWVmODAxMS1kMGIyLTRiOTItYjcxYy1mMmQxMDJkMDFmODguZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCiAgICAgIDE2IGlzb2xhdGVkIG5vZGVzIHJlbW92ZWQgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIFJlbW92ZSBpc29sYXRlZCBub2Rlcy4uLgogICAgICAJcmVtb3ZpbmcgQ08yCiAgICAgIAlyZW1vdmluZyBIMk8KICAgICAgCXJlbW92aW5nIGZydWN0b3NlLTMtcGhvc3BoYXRlCiAgICAgIAlyZW1vdmluZyAzLWtldG8tYmV0YS1ELWdhbGFjdG9zZQogICAgICAJcmVtb3ZpbmcgZ2FsYWN0b3NlCiAgICAgIAlyZW1vdmluZyBIMk8KICAgICAgCXJlbW92aW5nIEgrCiAgICAgIAlyZW1vdmluZyBIMk8KICAgICAgCXJlbW92aW5nIEgyTwogICAgICAJcmVtb3ZpbmcgSCsKICAgICAgCXJlbW92aW5nIEgrCiAgICAgIAlyZW1vdmluZyBQUGkKICAgICAgCXJlbW92aW5nIGZydWN0b3NlCiAgICAgIAlyZW1vdmluZyBDTzIKICAgICAgCXJlbW92aW5nIFBpCiAgICAgIAlyZW1vdmluZyBIKwogICAgICAgRG9uZS4KICAgICAgOTUgbm9kZXMgYW5kIDIwMiBlZGdlcyBjcmVhdGVkLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBrZWVwU2luZ2xlQ2FyYm9uIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VDb21wIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY29tcHV0ZVdlaWdodCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IG1haW4gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmcm9tSW5kZXhlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNhcmJvblNrZWxldG9uTmV0IChUZXN0ICMgNik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ2FyYm9uU2tlbGV0b25OZXQgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvOS84L2YvZGF0YXNldF85OGYyNTM2Ny05Zjg2LTQyOWItYTI2Ny1mOGU2ZjcwNWY5MTMuZGF0IiAtZyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8wLzEvZi9kYXRhc2V0XzAxZmU0YzVjLWM5NDAtNGIwZS05NmY2LWRkMDc3YjI1MjMxYy5kYXQiICAgICAtdW4gIC1mICJnbWwiICAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMDYvb3V0cHV0cy9kYXRhc2V0XzY5OGNkZDhiLTQ1YjUtNGM4Ny1iY2Y4LTEwNzJkMGZmNzlkZC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIDAgZWRnZXMgaW4gZmlsZSBub3QgZm91bmQgaW4gdGhlIGdyYXBoCiAgICAgIDIwNSB3ZWlnaHRzIHNldCBhbW9uZyA1MDIgZWRnZXMgaW4gZ3JhcGgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uNzUgcmVhY3Rpb25zIGFuZCAxMTEgbWV0YWJvbGl0ZXMgcmVhZC4KICAgICAgIERvbmUuCiAgICAgIEJ1aWxkaW5nIE5ldHdvcmsuLi4xMTEgbm9kZXMgYW5kIDUwMiBlZGdlcyBjcmVhdGVkLgogICAgICAgRG9uZS4KICAgICAgUHJvY2Vzc2luZyBhdG9tIG1hcHBpbmdzLi4uRG9uZS4KICAgICAgQ3JlYXRlIFVuZGlyZWN0ZWQuLi4gRG9uZS4KICAgICAgU2tpcCBjb21wb3VuZHMgd2l0aCBsZXNzIHRoYW4gdHdvIGNhcmJvbnMgZGV0ZWN0ZWQuLi4KICAgICAgCWRpc2Nvbm5lY3RpbmcgQ08yCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAgRG9uZS4KICAgICAgMTExIG5vZGVzIGFuZCAyNzAgZWRnZXMgY3JlYXRlZC4KICAgICAgRXhwb3J0aW5nLi4uR01MIGNyZWF0ZWQuCiAgICAgICBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAoVGVzdCAjIDcpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkNhcmJvblNrZWxldG9uTmV0IC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2QvNi81L2RhdGFzZXRfZDY1MGQ4MWQtZDYzYS00Njc2LTgzYzgtM2ViMjZlMGZhODc5LmRhdCIgLWcgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMC8wL2IvZGF0YXNldF8wMGI2ZmY1Mi0wODBiLTQ0MmEtYTdlOS1jMWZiMDZlZGQ0YTMuZGF0IiAgICAgICAtZiAibWF0cml4IiAgIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTA5L291dHB1dHMvZGF0YXNldF9jMjNiYjBmYy03YjA1LTQ2MjYtYmRlNS02YjI1YjNlNTgzOTYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIDExMSBub2RlcyBhbmQgMjAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgIEV4cG9ydGluZy4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjb21wdXRlV2VpZ2h0IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZm9ybWF0IHwgYCAibWF0cml4IiBgIHwKICAgICAgIHwgbWFpbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZyb21JbmRleGVzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NibWwyQ2FyYm9uU2tlbGV0b25OZXQgKFRlc3QgIyA4KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8xLzkvYy9kYXRhc2V0XzE5Y2NjMzFlLTIyZDEtNGIxOS05ZDczLTYzYjQyOWQ5YjNkMC5kYXQiIC1nICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2EvNS9hL2RhdGFzZXRfYTVhMThiZTMtMTI4Ny00ZTkwLTkzYTctNTdjYzIxNWJlNTBiLmRhdCIgICAgICAgLWYgImdtbCIgIC1maSAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzExMi9vdXRwdXRzL2RhdGFzZXRfMWY1MjcwZDQtZmY0Zi00NzIwLTliYTEtMGJjYmY1M2RiODZlLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgMCBlZGdlcyBpbiBmaWxlIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGgKICAgICAgMjA2IHdlaWdodHMgc2V0IGFtb25nIDUwMiBlZGdlcyBpbiBncmFwaAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi43NSByZWFjdGlvbnMgYW5kIDExMSBtZXRhYm9saXRlcyByZWFkLgogICAgICAgRG9uZS4KICAgICAgQnVpbGRpbmcgTmV0d29yay4uLjExMSBub2RlcyBhbmQgNTAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgICBEb25lLgogICAgICBQcm9jZXNzaW5nIGF0b20gbWFwcGluZ3MuLi5Eb25lLgogICAgICBTa2lwIGNvbXBvdW5kcyB3aXRoIGxlc3MgdGhhbiB0d28gY2FyYm9ucyBkZXRlY3RlZC4uLgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgCWRpc2Nvbm5lY3RpbmcgQ08yCiAgICAgICBEb25lLgogICAgICAxMTEgbm9kZXMgYW5kIDIwMyBlZGdlcyBjcmVhdGVkLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBrZWVwU2luZ2xlQ2FyYm9uIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VDb21wIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNvbXBvdW5kR3JhcGggKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJDb21wb3VuZEdyYXBoIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzYvZi80L2RhdGFzZXRfNmY0Y2I3OTgtOTRkMy00OGMwLTg0OTQtZWUwMjExYWU3ZDM5LmRhdCIgLXNjICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzcvMS84L2RhdGFzZXRfNzE4ODFiMjAtNzM3ZC00YzcxLTgzMDAtZTBiZjkxZmEyNzE2LmRhdCIgLW1jICJubyIgICAgICAtZiAiZ21sIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzExNS9vdXRwdXRzL2RhdGFzZXRfNDc1ZDQ1Y2QtNjBiNS00ODlmLTkxNTctMzRjN2Y2MjUyZmEzLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCiAgICAgIEJ1aWxkaW5nIE5ldHdvcmsuLi4gRG9uZS4KICAgICAgcmVtb3Zpbmcgc2lkZSBjb21wb3VuZHMuLi4KICAgICAgUmVhZCBmaWxlIGNvbnRhaW5pbmcgc2lkZSBjb21wb3VuZHMuLi4KICAgICAgNiBjb21wb3VuZHMgcmVtb3ZlZC4KICAgICAgIERvbmUuCiAgICAgIEV4cG9ydGluZy4uLkdNTCBjcmVhdGVkLgogICAgICAgRG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IG1lcmdpbmdTdHJhdCB8IGAgIm5vIiBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDb21wb3VuZEdyYXBoIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ29tcG91bmRHcmFwaCAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8zLzAvMC9kYXRhc2V0XzMwMDBlMTNiLWI4ZjUtNDk3Mi05M2IyLTZjNzAxNTk3M2UwZi5kYXQiIC1zYyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy83LzQvNC9kYXRhc2V0Xzc0NGEwNmQzLTY4NGYtNDg1Yy1iMjFmLWI4MGM2MTZiMTY3OC5kYXQiIC1tYyAiYnlfaWQiICAtcmkgLWR3IC11biAtdHAgLWYgImdtbCIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMTgvb3V0cHV0cy9kYXRhc2V0X2FjYjI5NmFhLTEyYjUtNDBjOS1hMjFmLTA4MmRhZDdmOTkxYS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIDEyIGlzb2xhdGVkIG5vZGVzIHJlbW92ZWQgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLiBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uIERvbmUuCiAgICAgIHJlbW92aW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDYgY29tcG91bmRzIHJlbW92ZWQuCiAgICAgICBEb25lLgogICAgICBDcmVhdGUgVW5kaXJlY3RlZC4uLiBEb25lLgogICAgICBTZXR0aW5nIGVkZ2Ugd2VpZ2h0cyAodGFyZ2V0IGRlZ3JlZSkuLi4KICAgICAgIERvbmUuCiAgICAgIE1lcmdpbmcgY29tcGFydG1lbnRzLi4uIERvbmUuCiAgICAgIFJlbW92ZSBpc29sYXRlZCBub2Rlcy4uLgogICAgICAJcmVtb3ZpbmcgTV9zX2MKICAgICAgCXJlbW92aW5nIERfR2x5Y2VyYWxkZWh5ZGUKICAgICAgCXJlbW92aW5nIHNuX0dseWNlcm9fM19waG9zcGhvZXRoYW5vbGFtaW5lCiAgICAgIAlyZW1vdmluZyBzbl9HbHljZXJvXzNfcGhvc3Bob2Nob2xpbmUKICAgICAgCXJlbW92aW5nIHNuX0dseWNlcm9fM19waG9zcGhvXzFfaW5vc2l0b2wKICAgICAgCXJlbW92aW5nIFAxX1A0X0Jpc181X19hZGVub3N5bF9fdGV0cmFwaG9zcGhhdGUKICAgICAgCXJlbW92aW5nIE1fY3lzX0RfYwogICAgICAJcmVtb3ZpbmcgTV9tZXRfRF9jCiAgICAgIAlyZW1vdmluZyBtZXRoYW5lc3VsZm9uYXRlCiAgICAgIAlyZW1vdmluZyBQMV9QNV9CaXNfNV9fYWRlbm9zeWxfX3BlbnRhcGhvc3BoYXRlCiAgICAgIAlyZW1vdmluZyBHbHljZXJvcGhvc3Bob2dseWNlcm9sCiAgICAgIAlyZW1vdmluZyBHbHljZXJvcGhvc3Bob3NlcmluZQogICAgICAgRG9uZS4KICAgICAgQ29tcHV0ZSB0cmFuc2l0aW9uIG1hdHJpeC4uLiBEb25lLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBtZXJnaW5nU3RyYXQgfCBgICJieV9pZCIgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCB0cnVlIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjb21wdXRlV2VpZ2h0IHwgYCB0cnVlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJHcmFwaCAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkdyYXBoIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2QvNS9jL2RhdGFzZXRfZDVjODllNTQtZDI0ZS00OTlhLWI3M2EtZmViYTBlMTcyNzc0LmRhdCIgIC1jICAtZiAiZ21sIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyMC9vdXRwdXRzL2RhdGFzZXRfMDhiZGM0ODItOTI2NS00ZWU1LWJkZmYtYTE1YTM2ZTg3YTE2LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBiaXBhcnRpdGUgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjb21wb3VuZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcmVhY3Rpb24gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJHcmFwaCAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkdyYXBoIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzkvYy9lL2RhdGFzZXRfOWNlNGQyNGUtM2Q1ZC00ODljLTg4YzItZWRhZjU0MTQ4MzgwLmRhdCIgLWIgICAtZiAiZ21sIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyMi9vdXRwdXRzL2RhdGFzZXRfODgwMWE4OGEtZGY3My00NWQ2LTlkZDQtMzQ5ZDczYzUxOTFkLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBiaXBhcnRpdGUgfCBgIHRydWUgYCB8CiAgICAgICB8IGNvbXBvdW5kIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcmVhY3Rpb24gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJHcmFwaCAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkdyYXBoIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzYvYi8yL2RhdGFzZXRfNmIyOWUwOTktNDZiNi00NWY5LWJiOWUtNmNjMWQwNTdlMzgxLmRhdCIgICAtciAtZiAiZ21sIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyNC9vdXRwdXRzL2RhdGFzZXRfYzExMDJkM2UtZjcxYi00NDMwLWFlNDEtODMwMjhkODRlMDc3LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBiaXBhcnRpdGUgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjb21wb3VuZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlYWN0aW9uIHwgYCB0cnVlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJUYWIgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJUYWIgLWlyciAiLS0+IiAtcmV2ICI8PT0+IiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9jL2IvYi9kYXRhc2V0X2NiYjAwZjg4LTE1NzEtNDZkYy1hZmY4LTdhNmQ4OTkyNjZmMy5kYXQiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTI2L291dHB1dHMvZGF0YXNldF9jYzdkNmM3Yy0xYTc4LTQ2YTAtOGQzNi0wMDJjMDI2ZjIzNDUuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGkgfCBgICItLT4iIGAgfAogICAgICAgfCByIHwgYCAiPD09PiIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMlRhYiAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMlRhYiAtaXJyICItPiIgLXJldiAiPSIgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMy9hLzMvZGF0YXNldF8zYTNlMjdiOS1jZmU2LTRlZDctOGYwMi0zNmJkODZmZjg1MzkuZGF0IiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyOC9vdXRwdXRzL2RhdGFzZXRfYjFjOTZhMzEtODJlMy00OTI4LTkwYmItNmFhYzI0YWZjODFlLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBpIHwgYCAiLT4iIGAgfAogICAgICAgfCByIHwgYCAiPSIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sV2l6YXJkIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWxXaXphcmQgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvZS8wLzUvZGF0YXNldF9lMDU2M2M1Yi0yNDJiLTRjZDEtYmY1Ny1jODk3YmJjOTQ1NDguZGF0IiAtcmljIC1yMCAtbWMgImJ5X2lkIiAtcmRyIC1yRVggInMiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTMwL291dHB1dHMvZGF0YXNldF9lMzIxNTEyMi1iMTk0LTQwYTItYjQ5OS00NTRjZTQ5MGVlOWUuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfODliYjlhNGVfYzQ1YV80YjY5Xzg4MjJfYWY4MzFlZmU5ZWE2CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLiBEb25lLgoKCiAgICAgIAljb21wYXJ0bWVudHM6CTUKICAgICAgCW1ldGFib2xpdGVzOgkxMTEKICAgICAgCXJlYWN0aW9uczoJNzUKICAgICAgCWVuenltZXM6CTg1CiAgICAgIAlnZW5lczoJODYKICAgICAgCXByb3RlaW46CTg2CiAgICAgIAlwYXRod2F5OgkzCgoKICAgICAgcmVtb3ZpbmcgcmVhY3Rpb24gd2l0aCBudWxsIGZsdXggYm91bmRzLi4uCiAgICAgIDAgImNsb3NlZCIgcmVhY3Rpb25zIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBleHRlcm5hbCBjb21wYXJ0bWVudC4uLgogICAgICAxMyBleHRlcm5hbCBzcGVjaWVzIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBpc29sYXRlZCBjb21wb3VuZHMuLi4KICAgICAgMCBpc29sYXRlZCBjb21wb3VuZHMgcmVtb3ZlZCBmcm9tIG5ldHdvcmsuCiAgICAgIE1lcmdpbmcgY29tcGFydG1lbnRzLi4uIERvbmUuCiAgICAgIHJlbW92aW5nIGR1cGxpY2F0ZWQgcmVhY3Rpb25zLi4uCiAgICAgIDEgZHVwbGljYXRlZCByZWFjdGlvbnMgcmVtb3ZlZCBmcm9tIG5ldHdvcmsuCgoKICAgICAgCWNvbXBhcnRtZW50czoJMQogICAgICAJbWV0YWJvbGl0ZXM6CTQ5CiAgICAgIAlyZWFjdGlvbnM6CTM0CiAgICAgIAllbnp5bWVzOgk4NQogICAgICAJZ2VuZXM6CTg2CiAgICAgIAlwcm90ZWluOgk4NgogICAgICAJcGF0aHdheToJMwoKCiAgICAgIEV4cG9ydGluZy4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgaW5wdXRTaWRlIHwgYCBOb25lIGAgfAogICAgICAgfCB0b0tlZXBDIHwgYCBOb25lIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgaW5wdXRSZWFjdGlvbnMgfCBgIE5vbmUgYCB8CiAgICAgICB8IHRvS2VlcFIgfCBgIE5vbmUgYCB8CiAgICAgICB8IHJlbW92ZU5vRmx1eCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAiYnlfaWQiIGAgfAogICAgICAgfCByZW1vdmVEdXBsaWNhdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBleGNoYW5nZUNvbXBUb1JlbW92ZSB8IGAgInMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbFdpemFyZCAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sV2l6YXJkIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzYvNi9kL2RhdGFzZXRfNjZkN2EzNmEtZTY4Ny00ZThmLWFhYzctZDA3NGQzZWFlYTk3LmRhdCIgLXJjICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzMvZC9lL2RhdGFzZXRfM2RlOGVkNjItYjMxYy00ZTY5LWI2MWMtZjZkYmE1M2E4ZjYyLmRhdCIgLXJpYyAtcnIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMi9lLzUvZGF0YXNldF8yZTUzODJhZi01OGZmLTQ4MDctYWU3OS0yZWE0YzhlMjljOGEuZGF0IiAtcjAgLW1jICJubyIgLXJkciAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEzNC9vdXRwdXRzL2RhdGFzZXRfZGM5MTNjYmQtOTFhNC00ZDA4LTljNmItNWNmZDViY2IzOGU2LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIFhmbTExNTgKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4gRG9uZS4KCgogICAgICAJY29tcGFydG1lbnRzOgkzCiAgICAgIAltZXRhYm9saXRlczoJMTEwNwogICAgICAJcmVhY3Rpb25zOgkxMTU4CiAgICAgIAllbnp5bWVzOgk1MTQKICAgICAgCWdlbmVzOgk1NzIKICAgICAgCXByb3RlaW46CTU3MgogICAgICAJcGF0aHdheToJNDgKCgogICAgICByZW1vdmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICA2IHNpZGUgY29tcG91bmRzIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBzaWRlIHJlYWN0aW9uLi4uCiAgICAgIDIgaXJyZWxldmFudCByZWFjdGlvbnMgcmVtb3ZlZCBmcm9tIG5ldHdvcmsuCiAgICAgIHJlbW92aW5nIHJlYWN0aW9uIHdpdGggbnVsbCBmbHV4IGJvdW5kcy4uLgogICAgICAwICJjbG9zZWQiIHJlYWN0aW9ucyByZW1vdmVkIGZyb20gbmV0d29yay4KICAgICAgcmVtb3ZpbmcgaXNvbGF0ZWQgY29tcG91bmRzLi4uCiAgICAgIDAgaXNvbGF0ZWQgY29tcG91bmRzIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBkdXBsaWNhdGVkIHJlYWN0aW9ucy4uLgogICAgICAwIGR1cGxpY2F0ZWQgcmVhY3Rpb25zIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgoKCiAgICAgIAljb21wYXJ0bWVudHM6CTMKICAgICAgCW1ldGFib2xpdGVzOgkxMTAxCiAgICAgIAlyZWFjdGlvbnM6CTExNTIKICAgICAgCWVuenltZXM6CTUxNAogICAgICAJZ2VuZXM6CTU3MgogICAgICAJcHJvdGVpbjoJNTcyCiAgICAgIAlwYXRod2F5Ogk0OAoKCiAgICAgIEV4cG9ydGluZy4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgdG9LZWVwQyB8IGAgTm9uZSBgIHwKICAgICAgIHwgcmVtb3ZlSXNvbGF0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IHRvS2VlcFIgfCBgIE5vbmUgYCB8CiAgICAgICB8IHJlbW92ZU5vRmx1eCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAibm8iIGAgfAogICAgICAgfCByZW1vdmVEdXBsaWNhdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBleGNoYW5nZUNvbXBUb1JlbW92ZSB8IGAgIiIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TY29wZU5ldHdvcmsgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TY29wZU5ldHdvcmsgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvOS9iL2IvZGF0YXNldF85YmIyNjc1Ny1lNGNmLTRmMWUtOTIxMi02N2JjMTM0NDk2YTkuZGF0IiAtcyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9lLzcvZS9kYXRhc2V0X2U3ZTViN2ZkLTc2OGItNGM1Zi04NGVhLTE2MzkzNTk1MmVjMS5kYXQiIC1zYyAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9hL2IvMC9kYXRhc2V0X2FiMDk5NTRjLThhZTctNDNjZi1iNWRjLWUyOTQ4Y2E2ZTlhZC5kYXQiICAgLWYgImdtbCIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMzgvb3V0cHV0cy9kYXRhc2V0XzM5NjJlNzJhLWY4NTItNGE2Yy1iYTI4LWM1ZDEzYzZiNDc4Mi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICByZWFkaW5nIFNCTUwuLi4KICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBpbmNsdWRlU2lkZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZWFjdGlvblRvSWdub3JlRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdHJhY2UgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2VlZHNBbmRUYXJnZXRzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuU2VlZHNBbmRUYXJnZXRzIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2EvOC81L2RhdGFzZXRfYTg1ZmViOTEtZTAxNy00MjVhLWJlZDAtNzAyOGE4NTViNDM5LmRhdCIgLXMgICAgICAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNDAvb3V0cHV0cy9kYXRhc2V0X2FkYWZmZGY3LTBjYTktNDBmMy05MmI1LTBjYTA0NGUxMDE5Ny5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBncmFwaC4uLgogICAgICBkb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgaW5wdXRTaWRlIHwgYCBOb25lIGAgfAogICAgICAgfCBjb21wIHwgYCAiIiBgIHwKICAgICAgIHwgc291cmNlIHwgYCB0cnVlIGAgfAogICAgICAgfCBzaW5rIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm90c291cmNlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm90c2luayB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGtlZXBJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVzZUJvcmVuc3RlaW5BbGcgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1c2VJbnRlcm5hbCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZWVkc0FuZFRhcmdldHMgKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TZWVkc0FuZFRhcmdldHMgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNS8zL2QvZGF0YXNldF81M2RhZDZiZi1mZTEwLTRkNzgtOGY4OS05NzMxMTVjOGEwZWIuZGF0IiAtYyAiZSIgIC10ICAgICAtaW4gLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNDIvb3V0cHV0cy9kYXRhc2V0X2M0YjIxMjJiLThhNjItNDk4OC04OWRkLWJlZDE2N2YxNTljZC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBncmFwaC4uLgogICAgICBkb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgaW5wdXRTaWRlIHwgYCBOb25lIGAgfAogICAgICAgfCBjb21wIHwgYCAiZSIgYCB8CiAgICAgICB8IHNvdXJjZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHNpbmsgfCBgIHRydWUgYCB8CiAgICAgICB8IG5vdHNvdXJjZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5vdHNpbmsgfCBgIGZhbHNlIGAgfAogICAgICAgfCBrZWVwSXNvbGF0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1c2VCb3JlbnN0ZWluQWxnIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdXNlSW50ZXJuYWwgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZWVkc0FuZFRhcmdldHMgKFRlc3QgIyAzKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TZWVkc0FuZFRhcmdldHMgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMC9iLzMvZGF0YXNldF8wYjNhYzI1MS1hM2Q1LTRjZjQtYjc2Mi0zZGRiYmIyYmY0NWEuZGF0IiAtYyAiZSIgIC10ICAgIC1CICAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE0NC9vdXRwdXRzL2RhdGFzZXRfODdmNTkyMDItMGUwNC00ODI3LWIwN2QtMDAwNjMzZWZlNzdlLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgcmVhZGluZyBTQk1MLi4uCiAgICAgIENyZWF0aW5nIGdyYXBoLi4uCiAgICAgIGRvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBpbnB1dFNpZGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGNvbXAgfCBgICJlIiBgIHwKICAgICAgIHwgc291cmNlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgc2luayB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbm90c291cmNlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm90c2luayB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGtlZXBJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVzZUJvcmVuc3RlaW5BbGcgfCBgIHRydWUgYCB8CiAgICAgICB8IHVzZUludGVybmFsIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldENoYXJnZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0Q2hhcmdlcyAtY2MgIjIiIC1jaSAiMSIgICAtbiAiMCIgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMC8yLzcvZGF0YXNldF8wMjc1OWEyNy02NWIzLTQzNGUtYTFlMC04ZmM1MTNhZGViMWMuZGF0IiAtdGFiICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzIvOS84L2RhdGFzZXRfMjk4MDc0ZTUtNTQyNi00MzNmLTg0YTctYzIwMGIwYzBiNTNiLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTQ3L291dHB1dHMvZGF0YXNldF85OWYxZjU1ZS0yYTMyLTRiNTItOGM1MS0zN2M4Y2Y0ODQ5YzguZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF9jYWJlNjNjY19iYzljXzQzMThfOTY0Y180NjE4NTViMDg3YWEKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGF0dHJpYnV0aW9ucwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sY2hhcmdlIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hhcmdlcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGFyZ2VzIC1jYyAiMiIgLWNpICIxIiAgIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9mLzAvNy9kYXRhc2V0X2YwNzZlOGVjLTAzNjAtNDM0OC1hMmE3LWQyZDM4ZmRlZDZjNy5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMi81LzMvZGF0YXNldF8yNTM4OGUwZS01N2RkLTQ3YjQtYmZiOC1lNThkNmRkOTJiZGIuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNTAvb3V0cHV0cy9kYXRhc2V0X2Q3Y2ZjY2JkLWViYjgtNGU2Zi05YmY4LWVlMTZlY2ZhYWM4MS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzZlNjQxYTc4XzIxNWFfNDkyY19hMGViXzY2ODVlNWU0YTRlNQogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDEgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xjaGFyZ2UgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRDaGFyZ2VzIChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldENoYXJnZXMgLWNjICIyIiAtY2kgIjEiICAgLW4gIjEiIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2YvYi9hL2RhdGFzZXRfZmJhNDRkZTctMTUxYS00YzYzLTg5OTAtNjgwZWVkYjVmOTc4LmRhdCIgLXRhYiAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8xLzUvMy9kYXRhc2V0XzE1M2ExZmI4LTQ4N2EtNGMxMS1hMWRmLTZhMTAyNmQwM2NmZi5kYXQiIC1jICIjIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE1My9vdXRwdXRzL2RhdGFzZXRfYTE2MWZlOTYtMDA4Yy00YWU0LTg5YmYtMzZmNGQ1MmZhMWY2LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfNmI3ZWYwNWRfNGZjMF80MDExXzliNTBfNTRiZjlhM2FjMzU1CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMSBhdHRyaWJ1dGlvbnMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGNoYXJnZSB8IGAgIjIiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMSIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldENoYXJnZXMgKFRlc3QgIyA0KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0Q2hhcmdlcyAtY2MgIjIiIC1jaSAiMSIgICAtbiAiMCIgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYi81LzQvZGF0YXNldF9iNTQwNTMxZi0zNWZjLTRlMmYtODkzNi02NWYyMGVkMGQ0N2IuZGF0IiAtdGFiICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzYvNC9kL2RhdGFzZXRfNjRkNmE0NTQtNGMxYS00YjQ4LWFlZmItYzIxNWY2MmNhNmI4LmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTU2L291dHB1dHMvZGF0YXNldF82M2FkY2ExNC1kOWQyLTQ2NDgtYmU1MS0zYTk4MjNmMTI5OWUuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF8wMzY4N2FiYl9lMjgwXzQ2MzJfOGE2OF8wZmZlZDNhZGZmMGIKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGF0dHJpYnV0aW9ucwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sY2hhcmdlIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hhcmdlcyAoVGVzdCAjIDUpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGFyZ2VzIC1jYyAiMiIgLWNpICIxIiAtcCAtcyAtbiAiMCIgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNC9kL2YvZGF0YXNldF80ZGY4NmQxZS01YjNmLTQ1MTAtOTRiNC00ZWQ0NjkwMWI1N2MuZGF0IiAtdGFiICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzIvNC84L2RhdGFzZXRfMjQ4ZTA4MWMtMGFkZC00ZGFiLWJhMzgtZWVjMTUwNjU3MmVjLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTU5L291dHB1dHMvZGF0YXNldF9lYjRlODBjZi1iZjM4LTQxOGYtOTM0ZS1lMDE0Nzg1ZTE3MWUuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDMgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xjaGFyZ2UgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hlbWljYWxGb3JtdWxhcyAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGVtaWNhbEZvcm11bGFzIC1jZiAiMiIgLWNpICIxIiAgIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9kLzMvYi9kYXRhc2V0X2QzYjBlYTMxLTI4OTEtNGQxMS05MTFlLWFkYThhOTg3ODRkMy5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNi81L2UvZGF0YXNldF82NWUyNTA5Zi1iNWQzLTRlMmMtOGM3MS04ZjQyYjAzNDY4YTkuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNjIvb3V0cHV0cy9kYXRhc2V0XzU2Zjk0OTEwLTdlNGQtNGUwMy04ZWU1LTZkNGFkZjRlMjI4NS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2UxYzJlZTI2XzI1NjdfNDgxZV84MmE1XzllNTA3YTdiZjg1NAogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hlbWljYWxGb3JtdWxhcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGVtaWNhbEZvcm11bGFzIC1jZiAiMiIgLWNpICIxIiAgIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy82LzMvZi9kYXRhc2V0XzYzZjQ5MjgzLWZkMTYtNDA1Zi1hZWVhLWVjZjY0MzcyN2Y2MS5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYS9iLzMvZGF0YXNldF9hYjNiNjU5ZS0zMTY5LTQ4MDQtYTNiNC00MGU4OTAzMmFlMjQuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNjUvb3V0cHV0cy9kYXRhc2V0XzY4NGI1NGQ1LTY1N2MtNDEwNi1hZWU5LWU2ODFiMmI0YjA0YS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMQogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICAqKioqKioqKgogICAgICBbV2FybmluZ11BdHRyaWJ1dGUgIjEyQ0g0TyIgbm90IHdlbGwgZm9ybWF0dGVkCiAgICAgICoqKioqKioqCiAgICAgIEVycm9yIHdoaWxlIHNldHRpbmcgZm9ybXVsYXMKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGZvcm11bGEgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRFY051bWJlcnMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0RWNOdW1iZXJzIC1jZWMgIjIiIC1jaSAiMSIgIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8wL2EvYy9kYXRhc2V0XzBhYzE4NWM5LTE0NWYtNDVkNC04M2I0LTM4ZDQxNzhhY2MyMS5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNS8zLzEvZGF0YXNldF81MzE2MmQ0OC0xYTJhLTQ4MWYtYjdkNy0xYjg5OGM1YjQ3YjAuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNjgvb3V0cHV0cy9kYXRhc2V0X2VlMDliY2UxLTAzZGMtNDJiMy1iNjRhLWUwOWYxMzZjM2MyZC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2ZiZTAyZTllX2YzMTBfNDIyY19hZTM0XzVmOWZlN2ZjYTc3MgogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgcmVhY3Rpb25zIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sZWMgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldEVjTnVtYmVycyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRFY051bWJlcnMgLWNlYyAiMiIgLWNpICIxIiAgLW4gIjAiIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2MvYS8wL2RhdGFzZXRfY2EwZWYzZWYtMDNhZS00Yjk3LTg0YzAtNDkzMjE5Y2MwNGUyLmRhdCIgLXRhYiAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8yLzcvMS9kYXRhc2V0XzI3MTI4NGEzLTRkNzYtNDJmZC05YWNiLTMzN2Y4N2ZlNWY2ZS5kYXQiIC1jICIjIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE3MS9vdXRwdXRzL2RhdGFzZXRfOGYwOTFmNjUtNDAwOC00NjlhLTljYzAtMjQwYTk0NzQyNzdlLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAxCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgICoqKioqKioqCiAgICAgIFtXYXJuaW5nXUF0dHJpYnV0ZSAiMS4yLjMuNC41IiBub3Qgd2VsbCBmb3JtYXR0ZWQKICAgICAgKioqKioqKioKICAgICAgRXJyb3IgaW4gc2V0dGluZyBFQ3MKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGVjIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRHcHJzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldEdwcnMgLWNncHIgIjIiIC1jaSAiMSIgIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8xL2YvZi9kYXRhc2V0XzFmZjdhM2M3LTQ1NDEtNDc4YS1iYTIyLTJlNGJkYmNhM2ZlZi5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNy80LzQvZGF0YXNldF83NDRmZmIxYy1kYzdjLTQzMDItOTBmYS1mNzE0ZjA4ZmE2OGIuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNzQvb3V0cHV0cy9kYXRhc2V0X2JmZDk2YWRmLWI5YjAtNGQyZC04ZjU2LWYzYmYyY2Q3NTExYy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzM4MjQ0MGFmX2QwZjJfNGRhN19hZDgyXzJkZmMxOGE0MDA3ZAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZ2VuZSBhc3NvY2lhdGlvbnMgY3JlYXRlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sZ3ByIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRJZHMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0SWRzIC1jbmV3ICIyIiAtY2kgIjEiICAgLXQgIk1FVEFCT0xJVEUiIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy80L2UvMi9kYXRhc2V0XzRlMmE1OGNlLWI0YzItNGEzOS05ODJlLTFmMjMxNTIyY2I4MS5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvMy9mL2MvZGF0YXNldF8zZmMwNTZhNy00YjFjLTQ0NTEtODU3YS1lYTNlMDBmZjVkNzAuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNzcvb3V0cHV0cy9kYXRhc2V0X2EwYTQwZDk1LTUxODItNGNjMC04N2U0LTQxODE3OTE5MGU4My5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzBkOWQ0MzYxXzc1N2NfNGY4N19iNDBkXzFiYTJiOGEwNjQ3ZQogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZW50aXRpZXMgcHJvY2Vzc2VkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIk1FVEFCT0xJVEUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRJZHMgKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0SWRzIC1jbmV3ICIyIiAtY2kgIjEiICAgLXQgIlJFQUNUSU9OIiAtbiAiMCIgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNy9hLzAvZGF0YXNldF83YTA4YTE4My1hNDdhLTQ3NmEtOWYxZS03NDQ4NTJmYjJiZDEuZGF0IiAtdGFiICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzUvNy80L2RhdGFzZXRfNTc0NGM2ZmMtNjYwMi00YjBhLTk1ZTktOTIzZTIwYWEwZTNkLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTgwL291dHB1dHMvZGF0YXNldF8wNTM4MmZkZi03ZGIxLTQxNjYtYWE3Yy0wN2VkNTA2NTZmODMuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF9lNzNiZmNjM184YjA4XzQyZGJfYjAwNF9iZjgwNjcxYjc5YTQKICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGVudGl0aWVzIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sbmFtZSB8IGAgIjIiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG8gfCBgICJSRUFDVElPTiIgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldElkcyAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRJZHMgLWNuZXcgIjIiIC1jaSAiMSIgICAtdCAiUEFUSFdBWSIgLW4gIjAiIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzcvMS85L2RhdGFzZXRfNzE5Y2ZlNWMtZWZjMi00Y2ZjLWIwNmUtMTBlOGRkZGUyODE5LmRhdCIgLXRhYiAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9lLzYvNy9kYXRhc2V0X2U2N2M3ODhjLTM1N2YtNDBhNy1iYTIzLWYzOGRjZDFjMmYzMi5kYXQiIC1jICIjIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE4My9vdXRwdXRzL2RhdGFzZXRfN2NlODE2MWMtYzUwNS00NDc4LTk2YzAtNjAxNTY3NGI0ZTc4LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIFhmbTExNTgKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGVudGl0aWVzIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sbmFtZSB8IGAgIjIiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG8gfCBgICJQQVRIV0FZIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0SWRzIChUZXN0ICMgNCk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldElkcyAtY25ldyAiMiIgLWNpICIxIiAgIC10ICJHRU5FIiAtbiAiMCIgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYS9hL2UvZGF0YXNldF9hYWU2MzRiMi0yNzQ1LTQ4ODktODBmNS01NmQ2ZGQ2OTYyOTkuZGF0IiAtdGFiICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzYvYi82L2RhdGFzZXRfNmI2YjA3ZDgtMDQ5ZS00NzM4LTgwOTMtZjJlOGEyMmMyM2MwLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTg2L291dHB1dHMvZGF0YXNldF82ZmFjZjRmMS0yMjFjLTRkZTQtOGRiOS1jNzA0ODVkNTAxMmEuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgQ2hlbWljYWwgZm9ybXVsYSBub3QgaW4gZ29vZCBmb3JtYXQgKEM0MS41NTQwNjE4Mzc1NDAwNzVINzEuNzg1NTM1Mzc5NDg5NjROOS44NTM4MjQwMDg4NDAxNU8xNC45MzgyNDQwMTczODk5MzRQMC44ODExMjAwMjU4MDAwMTU2UjEuMjc2NzU2NDc4MzE4OTNFLTE1TW43LjM0OTE5RS00TW83LjM3Njg1RS02Q2wwLjAwNTUzMjYzOUswLjIwNzQ3Mzk1MUNvMi42NzQxMUUtNUN1Ny41MzM2MUUtNFMwLjI0NzAwOTE1Njc4MDAwMDAyWm4zLjYyMzg4RS00TWcwLjAwOTIyMTA2NE5pMy40MzAyNEUtNENhMC4wMDU1MzI2MzlGZTAuMDE3MzQ2NTE1Mzk5OTk5OTk4KSBmb3IgTV9CSU9NQVNTX1hGX2MKICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZW50aXRpZXMgcHJvY2Vzc2VkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIkdFTkUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRJZHMgKFRlc3QgIyA1KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0SWRzIC1jbmV3ICIyIiAtY2kgIjEiICAgLXQgIkNPTVBBUlRNRU5UIiAtbiAiMCIgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYy9hL2IvZGF0YXNldF9jYWJhYzdhZC0yMjExLTQ5MzQtOTdlOS05ZmNlMzU1OTA2ZWEuZGF0IiAtdGFiICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzcvNi84L2RhdGFzZXRfNzY4ZGEyZGEtNTUzZC00NDUxLWFlNDEtMGQ2YzNjMTAxNDBjLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTg5L291dHB1dHMvZGF0YXNldF80ODRmMzc1ZS0xYjFiLTRlODAtYWE1Mi02MDgxNmUwZTM1YjMuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZW50aXRpZXMgcHJvY2Vzc2VkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIkNPTVBBUlRNRU5UIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0TmFtZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0TmFtZXMgLWNuYW1lICIyIiAtY2kgIjEiICAgLXQgIk1FVEFCT0xJVEUiIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy8xL2IvZS9kYXRhc2V0XzFiZTZkOTNkLTI4ZmUtNDczNi1hODMzLWUwNDA2NjU1YjI2Yy5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNi84L2EvZGF0YXNldF82OGFmMGI2MC01Nzc2LTRkOGYtYTgwYS03NGExYjFjMTQyODUuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xOTIvb3V0cHV0cy9kYXRhc2V0X2U1ZDkwZjI1LWQ5M2UtNDUzNC05MDY2LTBiOGMyZWRjNjk0Zi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzhkZWVmMzA5XzgxN2RfNDQ1ZF84NDkzXzljOTEwZmVjODBhNgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIk1FVEFCT0xJVEUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXROYW1lcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXROYW1lcyAtY25hbWUgIjIiIC1jaSAiMSIgICAtdCAiUkVBQ1RJT04iIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy80LzMvMy9kYXRhc2V0XzQzM2IwMTBmLWMxZTUtNDBjMi05N2YwLTY4ZmEyNjdhYjA2ZC5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvOS82LzUvZGF0YXNldF85NjUzYzZkZC0zMTY1LTRiYTktODkxZi05MjlhY2M2MDZlOTYuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xOTUvb3V0cHV0cy9kYXRhc2V0XzI3ZWM2NmJjLWNkMDQtNDgzMS04YWVhLWE2YThlM2U5YzllOS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzExOTNhODEwX2IzMjBfNGZmN184Y2Q4XzVmYWIzYzRmNTdlYwogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIlJFQUNUSU9OIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0TmFtZXMgKFRlc3QgIyAzKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0TmFtZXMgLWNuYW1lICIyIiAtY2kgIjEiICAgLXQgIlBBVEhXQVkiIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9mLzIvMC9kYXRhc2V0X2YyMGM0OGQ0LWU4NmQtNDllMS04NTY4LTk0NGMwZWQ0OWI4YS5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvOC9lLzkvZGF0YXNldF84ZTliNGJjZi1lN2RhLTQ2MzMtOTc4Ni0yNTdhNDJkMDg2N2YuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xOTgvb3V0cHV0cy9kYXRhc2V0XzliOTgzNmEzLWI2ZjItNDQxNi05M2FlLTdkYmY5OWQ1ZTVhMy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBYZm0xMTU4CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBDaGVtaWNhbCBmb3JtdWxhIG5vdCBpbiBnb29kIGZvcm1hdCAoQzQxLjU1NDA2MTgzNzU0MDA3NUg3MS43ODU1MzUzNzk0ODk2NE45Ljg1MzgyNDAwODg0MDE1TzE0LjkzODI0NDAxNzM4OTkzNFAwLjg4MTEyMDAyNTgwMDAxNTZSMS4yNzY3NTY0NzgzMTg5M0UtMTVNbjcuMzQ5MTlFLTRNbzcuMzc2ODVFLTZDbDAuMDA1NTMyNjM5SzAuMjA3NDczOTUxQ28yLjY3NDExRS01Q3U3LjUzMzYxRS00UzAuMjQ3MDA5MTU2NzgwMDAwMDJabjMuNjIzODhFLTRNZzAuMDA5MjIxMDY0TmkzLjQzMDI0RS00Q2EwLjAwNTUzMjYzOUZlMC4wMTczNDY1MTUzOTk5OTk5OTgpIGZvciBNX0JJT01BU1NfWEZfYwogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMiBhdHRyaWJ1dGlvbnMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbG5hbWUgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBvIHwgYCAiUEFUSFdBWSIgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldE5hbWVzIChUZXN0ICMgNCk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldE5hbWVzIC1jbmFtZSAiMiIgLWNpICIxIiAgIC10ICJHRU5FIiAtbiAiMCIgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYi9mL2EvZGF0YXNldF9iZmFkNmM5OC0zNWVjLTRhODMtYjBlOC0zYjVmYTYyNjFkYzMuZGF0IiAtdGFiICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzcvMC85L2RhdGFzZXRfNzA5OTMwOGUtNjk2OS00MjE1LTgzZjctOGI3YjhhMDYxNWYxLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjAxL291dHB1dHMvZGF0YXNldF9lYzRlMTgwNi0zODQ4LTQ0YzItOTkzMC1iMzA0YWUwOTA1OTYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgQ2hlbWljYWwgZm9ybXVsYSBub3QgaW4gZ29vZCBmb3JtYXQgKEM0MS41NTQwNjE4Mzc1NDAwNzVINzEuNzg1NTM1Mzc5NDg5NjROOS44NTM4MjQwMDg4NDAxNU8xNC45MzgyNDQwMTczODk5MzRQMC44ODExMjAwMjU4MDAwMTU2UjEuMjc2NzU2NDc4MzE4OTNFLTE1TW43LjM0OTE5RS00TW83LjM3Njg1RS02Q2wwLjAwNTUzMjYzOUswLjIwNzQ3Mzk1MUNvMi42NzQxMUUtNUN1Ny41MzM2MUUtNFMwLjI0NzAwOTE1Njc4MDAwMDAyWm4zLjYyMzg4RS00TWcwLjAwOTIyMTA2NE5pMy40MzAyNEUtNENhMC4wMDU1MzI2MzlGZTAuMDE3MzQ2NTE1Mzk5OTk5OTk4KSBmb3IgTV9CSU9NQVNTX1hGX2MKICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIkdFTkUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRQYXRod2F5cyAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRQYXRod2F5cyAtY3AgIjIiIC1zZXAgInwiIC1jaSAiMSIgIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy85LzYvYS9kYXRhc2V0Xzk2YWJjMWU3LTYwMjYtNDMxZC1hZDQxLTMzOTU2OGFlYzI0Zi5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNy83LzIvZGF0YXNldF83NzIzYTQxZC05ZWY4LTQ1NzgtOTU3Ni1lMGU1ZWM1MjQzZmMuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMDQvb3V0cHV0cy9kYXRhc2V0Xzg5YTZhNjU1LTUwNTAtNGY5NC1iOTIxLTE0NjAwNThkYmViNC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2U1YzNmMjNjXzZiNWNfNGI3Zl85NjdhX2E5MTIxMDUwN2Q3YQogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDMgcmVhY3Rpb25zIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29scCB8IGAgIjIiIGAgfAogICAgICAgfCBzZXAgfCBgICJ8IiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldFBhdGh3YXlzIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldFBhdGh3YXlzIC1jcCAiMiIgLXNlcCAiICsgIiAtY2kgIjEiICAtbiAiMCIgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYy8yL2YvZGF0YXNldF9jMmYwYTkwMy04ZmIzLTQwMTAtYWY5Yy03Y2MyM2Y2M2U2NzkuZGF0IiAtdGFiICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzkvMy84L2RhdGFzZXRfOTM4ODhkMGUtY2RmYy00Y2Y3LWI3NGItOWZiZTE5MTgwYzc2LmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjA3L291dHB1dHMvZGF0YXNldF9iZWY3OTRkMi03MDNjLTRhMGItYjBmMy0xNGM3YzI4OWRhNTMuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF9hMDFkMTJlYV85OTc4XzQ2ZGRfYjQzYl83OThjMDQ3NDBkZDYKICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAzIHJlYWN0aW9ucyBwcm9jZXNzZWQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbHAgfCBgICIyIiBgIHwKICAgICAgIHwgc2VwIHwgYCAiICsgIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldFJlZmVyZW5jZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0UmVmZXJlbmNlcyAtY3IgIjIiIC1yZWYgIkluQ2hpIiAtY2kgIjEiICAgLXQgIk1FVEFCT0xJVEUiIC1uICIwIiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy81LzUvZi9kYXRhc2V0XzU1ZmQ0N2RlLWM3MjMtNGE1MS1iMDFkLTJlYWE4YmQ1ODY2MS5kYXQiIC10YWIgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvYS9kL2QvZGF0YXNldF9hZGQ1ZTExMy00MDljLTQzZDAtOTkxZS1kNzMyZTkyMTAzYmYuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMTAvb3V0cHV0cy9kYXRhc2V0X2Q0Y2M0NzAxLTI5YWItNGJlYS1hMzRjLWExNzQ5NGQ3NGYxMC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzI5YzhjNjQxXzFmZmRfNDg5NF85ZDY0XzliYzQ3NzJiMDUxOAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xSZWYgfCBgICIyIiBgIHwKICAgICAgIHwgcmVmIHwgYCAiSW5DaGkiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG8gfCBgICJNRVRBQk9MSVRFIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2lkZUNvbXBvdW5kc1NjYW4gKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TaWRlQ29tcG91bmRzU2NhbiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy81LzcvOC9kYXRhc2V0XzU3ODU2ZWE2LWU1ZjUtNDk3Yi05YWZhLTI5N2NmZmVkMjQ4Zi5kYXQiICAgLWQgIjQwMCIgICAtbSAibm8iIC1vICIvdG1wL3RtcGpneHdyYWJqL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjEyL291dHB1dHMvZGF0YXNldF9hYTQ2MTU5Ni0yMjdjLTQ5ZjctOWMxNy0zNzliODk4Y2FlYTQuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICByZWFkaW5nIFNCTUwuLi4KICAgICAgQ3JlYXRpbmcgbmV0d29yay4uLgogICAgICBTY2FuaW5nLi4uCiAgICAgIGRvbmUKICAgICAgZm91bmQgNiBzaWRlIGNvbXBvdW5kIGFtb25nIDExMDcgY29tcG91bmRzCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBzaWRlT25seSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5vUmVwb3J0VmFsdWUgfCBgIGZhbHNlIGAgfAogICAgICAgfCBkZWdyZWUgfCBgICI0MDAiIGAgfAogICAgICAgfCBkZWdyZWVQcmVjZW50aWxlIHwgYCAibmFuIiBgIHwKICAgICAgIHwgZmxhZ0lub3JnYW5pYyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZsYWdOb0Zvcm11bGEgfCBgIGZhbHNlIGAgfAogICAgICAgfCBwYXJhbGxlbEVkZ2UgfCBgICJuYW4iIGAgfAogICAgICAgfCBtZXJnaW5nU3RyYXQgfCBgICJubyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TaWRlQ29tcG91bmRzU2NhbiAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlNpZGVDb21wb3VuZHNTY2FuIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzEvZi85L2RhdGFzZXRfMWY5OTAxNzQtM2VkMi00Yjk5LWE1ZjgtZDY2ZWE5ZDZjNjA2LmRhdCIgIC1pZCAtZCAiNDAwIiAgIC1tICJubyIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMTQvb3V0cHV0cy9kYXRhc2V0X2Q0MGI5ZWI3LWI0YTctNDAzMC05NjQwLTM2YjkyODU5ZDFjMC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBuZXR3b3JrLi4uCiAgICAgIFNjYW5pbmcuLi4KICAgICAgZG9uZQogICAgICBmb3VuZCA2IHNpZGUgY29tcG91bmQgYW1vbmcgMTEwNyBjb21wb3VuZHMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVPbmx5IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm9SZXBvcnRWYWx1ZSB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCAiNDAwIiBgIHwKICAgICAgIHwgZGVncmVlUHJlY2VudGlsZSB8IGAgIm5hbiIgYCB8CiAgICAgICB8IGZsYWdJbm9yZ2FuaWMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmbGFnTm9Gb3JtdWxhIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcGFyYWxsZWxFZGdlIHwgYCAibmFuIiBgIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAibm8iIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfVGFiMlNibWwgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuVGFiMlNibWwgLWNpICIxIiAtY2YgIjIiICAgLWUgIl9iIiAtaXJyICItLT4iIC1yZXYgIjw9PT4iIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2EvZi8wL2RhdGFzZXRfYWYwNjIwZjMtNDcxMC00ZDE0LWE3NDgtZWU5Njc3M2Y1MjA4LmRhdCIgLWlkICJOQSIgIC1kY3B0ICJjIiAtbiAiMCIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMTYvb3V0cHV0cy9kYXRhc2V0XzBmYzdlYmU3LWU1YjAtNDgwNi04ZjJkLWNmNGFkNGFjNjEzYi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2M1ODc3NDE4XzE0ZjlfNDMyZV9iMmUwXzkxZWQ4YmMxZTMwYwogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFRoZSBpbnB1dCBmaWxlIGxvb2tzIGdvb2QgYW5kIGNvbnRhaW5zIDcgcmVhY3Rpb25zCiAgICAgIDcgcmVhY3Rpb25zLCA4IG1ldGFib2xpdGVzIGFuZCAyIGNvbXBhcnRtZW50cyBjcmVhdGVkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IHJwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBlIHwgYCAiX2IiIGAgfAogICAgICAgfCBpIHwgYCAiLS0+IiBgIHwKICAgICAgIHwgciB8IGAgIjw9PT4iIGAgfAogICAgICAgfCBpZCB8IGAgIk5BIiBgIHwKICAgICAgIHwgY3JlYXRlQ29tcGFydG1lbnQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBkZWZhdWx0Q29tcGFydG1lbnQgfCBgICJjIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBqZ3h3cmFiai9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAidGFidWxhciIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9UYWIyU2JtbCAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5UYWIyU2JtbCAtY2kgIjIiIC1jZiAiMyIgICAtZSAiX2IiIC1pcnIgIi0tPiIgLXJldiAiPD09PiIgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNC80LzQvZGF0YXNldF80NDQ2YmQxZi04YjE0LTQ4MWUtODVkOS1jYjg0NzIyMjI3M2YuZGF0IiAtaWQgIk5BIiAgLWRjcHQgImMiIC1uICIwIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIxOC9vdXRwdXRzL2RhdGFzZXRfZjc3ZmU3NTktY2RkZS00YTE1LWE5MzgtYzgyNDAwOTgwNjYwLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfNmE2YmM0MDZfOGExZF80ZDlkX2I5NTBfMDExNjJlYzM2ZThjCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgVGhlIGlucHV0IGZpbGUgbG9va3MgZ29vZCBhbmQgY29udGFpbnMgNyByZWFjdGlvbnMKICAgICAgNyByZWFjdGlvbnMsIDggbWV0YWJvbGl0ZXMgYW5kIDIgY29tcGFydG1lbnRzIGNyZWF0ZWQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGlkIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGZvcm11bGEgfCBgICIzIiBgIHwKICAgICAgIHwgcnAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGUgfCBgICJfYiIgYCB8CiAgICAgICB8IGkgfCBgICItLT4iIGAgfAogICAgICAgfCByIHwgYCAiPD09PiIgYCB8CiAgICAgICB8IGlkIHwgYCAiTkEiIGAgfAogICAgICAgfCBjcmVhdGVDb21wYXJ0bWVudCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RhYjJTYm1sIChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlRhYjJTYm1sIC1jaSAiMSIgLWNmICIyIiAgIC1lICJfYiIgLWlyciAiLT4iIC1yZXYgIj0iIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2YvNC8zL2RhdGFzZXRfZjQzODQzMzMtYjRlNy00NDc1LWJkMjYtZjAxMGNlN2FhYTI2LmRhdCIgLWlkICJOQSIgIC1kY3B0ICJjIiAtbiAiMCIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMjAvb3V0cHV0cy9kYXRhc2V0X2NkMDhiOGJiLTVlNDgtNGE0MC1hNjZkLTVlYjVhMDVhODQwMi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzQ1Njc2N2EyX2M3YzdfNDVjNl9hN2ExXzNhNmU2OTMzMTA3ZQogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFRoZSBpbnB1dCBmaWxlIGxvb2tzIGdvb2QgYW5kIGNvbnRhaW5zIDcgcmVhY3Rpb25zCiAgICAgIDcgcmVhY3Rpb25zLCA4IG1ldGFib2xpdGVzIGFuZCAyIGNvbXBhcnRtZW50cyBjcmVhdGVkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IHJwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBlIHwgYCAiX2IiIGAgfAogICAgICAgfCBpIHwgYCAiLT4iIGAgfAogICAgICAgfCByIHwgYCAiPSIgYCB8CiAgICAgICB8IGlkIHwgYCAiTkEiIGAgfAogICAgICAgfCBjcmVhdGVDb21wYXJ0bWVudCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RhYjJTYm1sIChUZXN0ICMgNCk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlRhYjJTYm1sIC1jaSAiMSIgLWNmICIyIiAtcnAgLW1wIC1lICJfZSIgLWlyciAiLS0+IiAtcmV2ICI8PT0+IiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy83LzIvYi9kYXRhc2V0XzcyYmU4ZDhmLTI5NTQtNGVkNi05MGQ2LTMxYjgyOTEzNDE4Ny5kYXQiIC1pZCAiTkEiIC1jcHQgLWRjcHQgImMiIC1uICIwIiAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIyMi9vdXRwdXRzL2RhdGFzZXRfZmI5YjRjMzQtNGIyNy00ODhlLWEzNjMtZGM3MzhlODlkZGRlLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfNjNkYTFlZDBfZWNiY180MjY0X2I3NmJfNWRmNjI1ZjRkMDJiCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgVGhlIGlucHV0IGZpbGUgbG9va3MgZ29vZCBhbmQgY29udGFpbnMgNyByZWFjdGlvbnMKICAgICAgNyByZWFjdGlvbnMsIDggbWV0YWJvbGl0ZXMgYW5kIDIgY29tcGFydG1lbnRzIGNyZWF0ZWQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IGNvbGZvcm11bGEgfCBgICIyIiBgIHwKICAgICAgIHwgcnAgfCBgIHRydWUgYCB8CiAgICAgICB8IG1wIHwgYCB0cnVlIGAgfAogICAgICAgfCBlIHwgYCAiX2UiIGAgfAogICAgICAgfCBpIHwgYCAiLS0+IiBgIHwKICAgICAgIHwgciB8IGAgIjw9PT4iIGAgfAogICAgICAgfCBpZCB8IGAgIk5BIiBgIHwKICAgICAgIHwgY3JlYXRlQ29tcGFydG1lbnQgfCBgIHRydWUgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RhYjJTYm1sIChUZXN0ICMgNSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlRhYjJTYm1sIC1jaSAiMSIgLWNmICIyIiAgIC1lICJfYiIgLWlyciAiLS0+IiAtcmV2ICI8PT0+IiAtaSAiL3RtcC90bXBqZ3h3cmFiai9maWxlcy9hL2YvZC9kYXRhc2V0X2FmZDRjN2M1LTdiNTMtNDcwYi1iZjQ3LTYyNzUwMmE2NGNlMS5kYXQiIC1pZCAibXlNb2RlbCIgIC1kY3B0ICJjIiAtbiAiMCIgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMjQvb3V0cHV0cy9kYXRhc2V0XzU0YTExZDMxLTZhYjktNGJhZi1iMWMxLWQ5MTJkMjZmMzhkZC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgbXlNb2RlbAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFRoZSBpbnB1dCBmaWxlIGxvb2tzIGdvb2QgYW5kIGNvbnRhaW5zIDcgcmVhY3Rpb25zCiAgICAgIDcgcmVhY3Rpb25zLCA4IG1ldGFib2xpdGVzIGFuZCAyIGNvbXBhcnRtZW50cyBjcmVhdGVkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IHJwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBlIHwgYCAiX2IiIGAgfAogICAgICAgfCBpIHwgYCAiLS0+IiBgIHwKICAgICAgIHwgciB8IGAgIjw9PT4iIGAgfAogICAgICAgfCBpZCB8IGAgIm15TW9kZWwiIGAgfAogICAgICAgfCBjcmVhdGVDb21wYXJ0bWVudCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RvcG9sb2dpY2FsUGF0aHdheUFuYWx5c2lzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuVG9wb2xvZ2ljYWxQYXRod2F5QW5hbHlzaXMgLWkgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvZS84L2MvZGF0YXNldF9lOGM3NWY5Mi02NjNhLTRiYmQtYmQ5ZS03OWY5YjMwMTUyNzIuZGF0IiAtc2MgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvZi8wLzIvZGF0YXNldF9mMDJjYzc0NC0zMGM1LTRjZGQtYjM4Ny0yZTk5NjgyODU4NmMuZGF0IiAtbWMgIm5vIiAgIC1ub2kgIi90bXAvdG1wamd4d3JhYmovZmlsZXMvNC8zL2MvZGF0YXNldF80M2NlODgyMC1kZjAwLTQzOGItYTdhYi1hZTY3NDY0MTRmMzguZGF0IiAgLW8gIi90bXAvdG1wamd4d3JhYmovam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMjgvb3V0cHV0cy9kYXRhc2V0X2QyZjdjOTFlLWY3ZTUtNGFhMi04ODhlLWIzYWJkNTc1Nzc2MC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCgoKICAgICAgQnVpbGRpbmcgZ3JhcGguLi5SZW1vdmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICA2IGNvbXBvdW5kcyByZW1vdmVkLgogICAgICAgTmV0d29yayBzdWNjZXNzZnVsbHkgY3JlYXRlZC4KCgogICAgICBJbXBvcnRpbmcgbm9kZXMgb2YgaW50ZXJlc3QKICAgICAgRG9uZS4KICAgICAgQ29tcHV0aW5nIFBhdGh3YXkgdG9wb2xvZ3kgQW5hbHlzaXMuLi4gKG1heSB0YWtlIGEgd2hpbGUpCiAgICAgIERvbmUuCiAgICAgIEV4cG9ydGluZy4uLkRvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBtZXJnaW5nU3RyYXQgfCBgICJubyIgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG91dCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wamd4d3JhYmovZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9Ub3BvbG9naWNhbFBhdGh3YXlBbmFseXNpcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlRvcG9sb2dpY2FsUGF0aHdheUFuYWx5c2lzIC1pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzMvMi80L2RhdGFzZXRfMzI0OGVhMTItZDc2NC00NDAwLWE5YWItODNhZmNhZDlkMGZiLmRhdCIgLXNjICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzLzcvMi85L2RhdGFzZXRfNzI5MjdhNTQtYWZkYi00OWFmLTgxMTQtMTQwNzc0NWFkZTljLmRhdCIgLW1jICJieV9pZCIgLXJpIC11biAtbm9pICIvdG1wL3RtcGpneHdyYWJqL2ZpbGVzL2QvOS9kL2RhdGFzZXRfZDlkMzI1YjItZWZkYi00ZWU2LWJhYzYtNWNkYzU2NzQwMjZhLmRhdCIgLW91dCAtbyAiL3RtcC90bXBqZ3h3cmFiai9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIzMi9vdXRwdXRzL2RhdGFzZXRfNDAyMzkwZWItYzg1MC00YmQ5LTk1YTItOTdmMWNmYmEwODFkLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICAxMiBpc29sYXRlZCBub2RlcyByZW1vdmVkIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4gRG9uZS4KCgogICAgICBCdWlsZGluZyBncmFwaC4uLlJlbW92aW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDYgY29tcG91bmRzIHJlbW92ZWQuCiAgICAgIENyZWF0ZSBVbmRpcmVjdGVkLi4uIERvbmUuCiAgICAgIE1lcmdpbmcgY29tcGFydG1lbnRzLi4uIERvbmUuCiAgICAgIFJlbW92ZSBpc29sYXRlZCBub2Rlcy4uLgogICAgICAJcmVtb3Zpbmcgc25fR2x5Y2Vyb18zX3Bob3NwaG9jaG9saW5lCiAgICAgIAlyZW1vdmluZyBzbl9HbHljZXJvXzNfcGhvc3Bob2V0aGFub2xhbWluZQogICAgICAJcmVtb3ZpbmcgUDFfUDRfQmlzXzVfX2FkZW5vc3lsX190ZXRyYXBob3NwaGF0ZQogICAgICAJcmVtb3ZpbmcgbWV0aGFuZXN1bGZvbmF0ZQogICAgICAJcmVtb3ZpbmcgTV9tZXRfRF9jCiAgICAgIAlyZW1vdmluZyBHbHljZXJvcGhvc3Bob3NlcmluZQogICAgICAJcmVtb3ZpbmcgRF9HbHljZXJhbGRlaHlkZQogICAgICAJcmVtb3ZpbmcgR2x5Y2Vyb3Bob3NwaG9nbHljZXJvbAogICAgICAJcmVtb3Zpbmcgc25fR2x5Y2Vyb18zX3Bob3NwaG9fMV9pbm9zaXRvbAogICAgICAJcmVtb3ZpbmcgUDFfUDVfQmlzXzVfX2FkZW5vc3lsX19wZW50YXBob3NwaGF0ZQogICAgICAJcmVtb3ZpbmcgTV9zX2MKICAgICAgCXJlbW92aW5nIE1fY3lzX0RfYwogICAgICAgRG9uZS4KICAgICAgIE5ldHdvcmsgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuCgoKICAgICAgSW1wb3J0aW5nIG5vZGVzIG9mIGludGVyZXN0CiAgICAgIERvbmUuCiAgICAgIENvbXB1dGluZyBQYXRod2F5IHRvcG9sb2d5IEFuYWx5c2lzLi4uIChtYXkgdGFrZSBhIHdoaWxlKQogICAgICBEb25lLgogICAgICBFeHBvcnRpbmcuLi5Eb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAiYnlfaWQiIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgb3V0IHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGpneHdyYWJqL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCjwvZGV0YWlscz4K')); </script> </body> </html> \ No newline at end of file
--- a/tools/attributes/ExtractAnnotations/ExtractAnnotations.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/ExtractAnnotations/ExtractAnnotations.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractAnnotations" name="ExtractAnnotations" version="2.0.0"> +<tool id="met4j_ExtractAnnotations" name="ExtractAnnotations" version="2.0.1"> <description>Extract databases' references from SBML annotations or notes.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.ExtractAnnotations -i "$inputPath" -export "$export" @@ -34,40 +34,73 @@ </outputs> <tests> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="export" value="METABOLITE"/> + <param name="db" value="metanetx.chemical"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="146"/> + <has_n_columns n="2"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="export" value="METABOLITE"/> + <param name="db" value="metanetx.chemical"/> + <param name="skip" value="true"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="145"/> + <has_n_columns n="2"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="export" value="METABOLITE"/> + <param name="db" value="metanetx.chemical"/> + <param name="skip" value="true"/> + <param name="uniq" value="true"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="111"/> + <has_n_columns n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Extract databases' references from SBML annotations or notes. The references are exported as a tabulated file with one column with the SBML compound, reaction or gene identifiers, and one column with the corresponding database identifier.The name of the targeted database need to be provided under the same form than the one used in the notes field or the identifiers.org uri.]]></help>
--- a/tools/attributes/ExtractPathways/ExtractPathways.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/ExtractPathways/ExtractPathways.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractPathways" name="ExtractPathways" version="2.0.0"> +<tool id="met4j_ExtractPathways" name="ExtractPathways" version="2.0.1"> <description>Extract pathway(s) from a SBML file and create a sub-network SBML file</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.ExtractPathways -i "$inputPath" -p "$pathwayId" @@ -24,15 +24,25 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="pathwayId" value="Citric_Acid_Cycle+Folate_Metabolism+toto"/> + <output ftype="sbml" name="outputPath"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*<reaction.*" n="17"/> + <has_line_matching expression=".*groups:id=.*" n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Extract pathway(s) from a SBML file and create a sub-network SBML file]]></help>
--- a/tools/attributes/GetEntities/GetEntities.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/GetEntities/GetEntities.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetEntities" name="GetEntities" version="2.0.0"> +<tool id="met4j_GetEntities" name="GetEntities" version="2.0.1"> <description>Parse a SBML file to return a list of entities composing the network: metabolites, reactions, genes and others.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetEntities -i "$sbml" $printMetabolites @@ -30,29 +30,52 @@ </outputs> <tests> <test> + <param name="sbml" value="Human-GEM_pathways.xml"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_text_matching expression="GENE" n="86"/> + <has_text_matching expression="METABOLITE" n="111"/> + <has_text_matching expression="REACTION" n="75"/> + <has_text_matching expression="PATHWAY" n="3"/> + <has_text_matching expression="COMPARTMENT" n="5"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="Human-GEM_pathways.xml"/> + <param name="printReactions" value="true"/> + <param name="printMetabolites" value="true"/> + <param name="printGenes" value="true"/> + <param name="printCompartments" value="true"/> + <param name="noTypeCol" value="true"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_n_lines n="277"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Parse a SBML file to return a list of entities composing the network: metabolites, reactions, genes and others.The output file is a tabulated file with two columns, one with entity identifiers, and one with the entity type. If no entity type is selected, all of them are returned by default. Only identifiers are written, attributes can be extracted from dedicated apps or from the Sbml2Tab app.]]></help>
--- a/tools/attributes/GetGenesFromReactions/GetGenesFromReactions.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/GetGenesFromReactions/GetGenesFromReactions.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetGenesFromReactions" name="GetGenesFromReactions" version="2.0.0"> +<tool id="met4j_GetGenesFromReactions" name="GetGenesFromReactions" version="2.0.1"> <description>Get gene lists from a list of reactions and a SBML file.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetGenesFromReactions -i "$sbml" -r "$reactionFile" @@ -34,15 +34,25 @@ </outputs> <tests> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="reactionFile" value="XF_network_R_Seed.tab"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_n_lines n="2"/> + <has_line_matching expression="R_GLUN.*XFCFBP8418_026750" n="1"/> + <has_line_matching expression="R_ACGS.*XFCFBP8418_025260" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Get associated gene list from a list of reactions and a SBML file. Parse SBML GPR annotations and output a tab-separated file with one row per gene, associated reaction identifiers from input file in first column, gene identifiers in second column.]]></help>
--- a/tools/attributes/GetMetaboliteAttributes/GetMetaboliteAttributes.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/GetMetaboliteAttributes/GetMetaboliteAttributes.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetMetaboliteAttributes" name="GetMetaboliteAttributes" version="2.0.0"> +<tool id="met4j_GetMetaboliteAttributes" name="GetMetaboliteAttributes" version="2.0.1"> <description>Create a tabulated file with metabolite attributes from a SBML file</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetMetaboliteAttributes -i "$sbml" -o "$outputFile" @@ -18,15 +18,25 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_n_lines n="9"/> + <has_n_columns n="6"/> + <has_line_matching expression=".*1S/C2H6O/c1-2-3/h3H,2H2,1H3.*" n="1"/> + <has_line_matching expression=".*C.*NC.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a tabulated file with metabolite attributes from a SBML file]]></help>
--- a/tools/attributes/GetReactantsFromReactions/GetReactantsFromReactions.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/GetReactantsFromReactions/GetReactantsFromReactions.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetReactantsFromReactions" name="GetReactantsFromReactions" version="2.0.0"> +<tool id="met4j_GetReactantsFromReactions" name="GetReactantsFromReactions" version="2.0.1"> <description>Get reactant lists from a list of reactions and a SBML file.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetReactantsFromReactions -i "$sbml" -r "$reactionFile" @@ -38,36 +38,65 @@ </outputs> <tests> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="reactionFile" value="XF_network_R_Seed.tab"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_text_matching expression="R_GLUN" n="4"/> + <has_text_matching expression="R_ACGS" n="5"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="reactionFile" value="XF_network_R_Seed.tab"/> + <param name="printSubstrates" value="true"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_text_matching expression="R_GLUN" n="2"/> + <has_text_matching expression="R_ACGS" n="5"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="reactionFile" value="XF_network_R_Seed.tab"/> + <param name="printProducts" value="true"/> + <output ftype="tsv" name="outputFile"> + <assert_contents> + <has_text_matching expression="R_GLUN" n="2"/> + <has_text_matching expression="R_ACGS" n="5"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Get reactant lists from a list of reactions and a Sbml file. Output a tab-separated file with one row per reactant, reaction identifiers in first column, reactant identifiers in second column. It can provides substrates, products, or both (by default). In the case of reversible reactions, all reactants are considered as both substrates and products]]></help>
--- a/tools/attributes/SetCharges/SetCharges.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/SetCharges/SetCharges.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetCharges" name="SetCharges" version="2.0.0"> +<tool id="met4j_SetCharges" name="SetCharges" version="2.0.1"> <description>Set charge to metabolites in a SBML file from a tabulated file containing the metabolite ids and the charges</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetCharges#if str($colcharge) != 'nan': -cc "$colcharge" @@ -50,63 +50,117 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="charges.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:charge=.2.*" n="1"/> + <has_line_matching expression=".*fbc:charge=.-3.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="chargesWithComment.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:charge=.2.*" n="1" negate="true"/> + <has_line_matching expression=".*fbc:charge=.-3.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="charges.tsv"/> + <param name="nSkip" value="1"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:charge=.2.*" n="1" negate="true"/> + <has_line_matching expression=".*fbc:charge=.-3.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="charges.tsv"/> + <param name="ci" value="2"/> + <param name="cc" value="3"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:charge=.2.*" n="1"/> + <has_line_matching expression=".*fbc:charge=.-3.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="chargesXF.tsv"/> + <param name="p" value="true"/> + <param name="s" value="true"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:charge=.-1000.*" n="3"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Set charge to metabolites in a SBML file from a tabulated file containing the metabolite ids and the charges
--- a/tools/attributes/SetChemicalFormulas/SetChemicalFormulas.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/SetChemicalFormulas/SetChemicalFormulas.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetChemicalFormulas" name="SetChemicalFormulas" version="2.0.0"> +<tool id="met4j_SetChemicalFormulas" name="SetChemicalFormulas" version="2.0.1"> <description>Set Formula to network metabolites from a tabulated file containing the metabolite ids and the formulas</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetChemicalFormulas#if str($colformula) != 'nan': -cf "$colformula" @@ -50,19 +50,32 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="formula.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*CH6O6.*" n="2"/> + <has_line_matching expression=".*CH12O4.*" n="2"/> + </assert_contents> + </output> + </test> <test expect_failure="true"> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="formulaBad.tsv"/> + </test> </tests> <help><![CDATA[Set Formula to network metabolites from a tabulated file containing the metabolite ids and the formulas
--- a/tools/attributes/SetEcNumbers/SetEcNumbers.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/SetEcNumbers/SetEcNumbers.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetEcNumbers" name="SetEcNumbers" version="2.0.0"> +<tool id="met4j_SetEcNumbers" name="SetEcNumbers" version="2.0.1"> <description>Set EC numbers to reactions in a SBML file from a tabulated file containing the reaction ids and the EC numbers</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetEcNumbers#if str($colec) != 'nan': -cec "$colec" @@ -48,19 +48,32 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="ec.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*1.1.1.1.*" n="2"/> + <has_line_matching expression=".*1.2.3.4.*" n="2"/> + </assert_contents> + </output> + </test> <test expect_failure="true"> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="ecBad.tsv"/> + </test> </tests> <help><![CDATA[Set EC numbers to reactions in a SBML file from a tabulated file containing the reaction ids and the EC numbers
--- a/tools/attributes/SetGprs/SetGprs.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/SetGprs/SetGprs.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetGprs" name="SetGprs" version="2.0.0"> +<tool id="met4j_SetGprs" name="SetGprs" version="2.0.1"> <description>Create a new SBML file from an original sbml file and a tabulated file containing reaction ids and Gene association written in a cobra way</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetGprs#if str($colgpr) != 'nan': -cgpr "$colgpr" @@ -48,22 +48,39 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="gpr.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:id=.G1.*" n="1"/> + <has_line_matching expression=".*fbc:id=.G2.*" n="1"/> + <has_line_matching expression=".*fbc:id=.G3.*" n="1"/> + <has_line_matching expression=".*fbc:id=.G4.*" n="1"/> + <has_line_matching expression=".*fbc:geneProductRef fbc:geneProduct=.G1.*" n="1"/> + <has_line_matching expression=".*fbc:geneProductRef fbc:geneProduct=.G2.*" n="1"/> + <has_line_matching expression=".*fbc:geneProductRef fbc:geneProduct=.G3.*" n="1"/> + <has_line_matching expression=".*fbc:geneProductRef fbc:geneProduct=.G4.*" n="1"/> + <has_line_matching expression=".*fbc:and.*" n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a new SBML file from an original sbml file and a tabulated file containing reaction ids and Gene association written in a cobra way
--- a/tools/attributes/SetIds/SetIds.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/SetIds/SetIds.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetIds" name="SetIds" version="2.0.0"> +<tool id="met4j_SetIds" name="SetIds" version="2.0.1"> <description>Set new ids to network objects in a SBML file from a tabulated file containing the old ids and the new ids</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetIds#if str($colname) != 'nan': -cnew "$colname" @@ -62,63 +62,117 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="idMetabolites.tsv"/> + <param name="o" value="METABOLITE"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*id=.metaboliteA.*" n="1"/> + <has_line_matching expression=".*id=.metaboliteB.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="idReactions.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*id=.reaction1.*" n="1"/> + <has_line_matching expression=".*id=.reaction2.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="idPathways.tsv"/> + <param name="o" value="PATHWAY"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*groups:id=.CEB.*" n="1"/> + <has_line_matching expression=".*groups:id=.NSP.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="idGenes.tsv"/> + <param name="o" value="GENE"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:id=.G1.*" n="1"/> + <has_line_matching expression=".*fbc:id=.G2.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="idCompartments.tsv"/> + <param name="o" value="COMPARTMENT"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*id=.cytosol.*" n="1"/> + <has_line_matching expression=".*id=.extra.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Set new ids to network objects in a SBML file from a tabulated file containing the old ids and the new ids
--- a/tools/attributes/SetNames/SetNames.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/SetNames/SetNames.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetNames" name="SetNames" version="2.0.0"> +<tool id="met4j_SetNames" name="SetNames" version="2.0.1"> <description>Set names to network objects in a SBML file from a tabulated file containing the object ids and the names</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetNames#if str($colname) != 'nan': -cname "$colname" @@ -62,51 +62,94 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="namesMetabolites.tsv"/> + <param name="o" value="METABOLITE"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*metaboliteA.*" n="1"/> + <has_line_matching expression=".*metaboliteB.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="namesReactions.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*reaction1.*" n="1"/> + <has_line_matching expression=".*reaction2.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="namesPathways.tsv"/> + <param name="o" value="PATHWAY"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*groups:name=.CEB.*" n="1"/> + <has_line_matching expression=".*groups:name=.NSP.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="tab" value="namesGenes.tsv"/> + <param name="o" value="GENE"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*fbc:name=.G1.*" n="1"/> + <has_line_matching expression=".*fbc:name=.G2.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Set names to network objects in a SBML file from a tabulated file containing the object ids and the names
--- a/tools/attributes/SetPathways/SetPathways.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/SetPathways/SetPathways.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetPathways" name="SetPathways" version="2.0.0"> +<tool id="met4j_SetPathways" name="SetPathways" version="2.0.1"> <description>Set pathway to reactions in a network from a tabulated file containing the reaction ids and the pathways</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetPathways#if str($colp) != 'nan': -cp "$colp" @@ -56,31 +56,56 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="pathways.tsv"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*groups:id=.*" n="3"/> + <has_line_matching expression=".*groups:id=.p1.*" n="1"/> + <has_line_matching expression=".*groups:id=.p2.*" n="1"/> + <has_line_matching expression=".*groups:id=.p3.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="pathwaysOtherSep.tsv"/> + <param name="sep" value=" + "/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*groups:id=.*" n="3"/> + <has_line_matching expression=".*groups:id=.p1.*" n="1"/> + <has_line_matching expression=".*groups:id=.p2.*" n="1"/> + <has_line_matching expression=".*groups:id=.p3.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Set pathway to reactions in a network from a tabulated file containing the reaction ids and the pathways
--- a/tools/attributes/SetReferences/SetReferences.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/attributes/SetReferences/SetReferences.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetReferences" name="SetReferences" version="2.0.0"> +<tool id="met4j_SetReferences" name="SetReferences" version="2.0.1"> <description>Add references to network objects in a SBML file from a tabulated file containing the metabolite ids and the references</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetReferences#if str($colRef) != 'nan': -cr "$colRef" @@ -68,17 +68,29 @@ </outputs> <tests> <test> + <param name="sbml" value="toy_model.xml"/> + <param name="tab" value="refs.tsv"/> + <param name="ref" value="InChi"/> + <param name="o" value="METABOLITE"/> + <output ftype="sbml" name="out"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*C2H6O.*" n="3"/> + <has_line_matching expression=".*C6H8O6.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Add references to network objects in a SBML file from a tabulated file containing the metabolite ids and the references
--- a/tools/bigg/GetBiggModelProteome/GetBiggModelProteome.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/bigg/GetBiggModelProteome/GetBiggModelProteome.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetBiggModelProteome" name="GetBiggModelProteome" version="2.0.0"> +<tool id="met4j_GetBiggModelProteome" name="GetBiggModelProteome" version="2.0.1"> <description>Get proteome in fasta format of a model present in the BIGG database</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh bigg.GetBiggModelProteome -m "$modelId" -o "$outputFile" @@ -22,12 +22,19 @@ </outputs> <tests> <test maxseconds="120"> + <param name="modelId" value="e_coli_core"/> + <output ftype="fasta" name="outputFile"> + <assert_contents> + <has_line_matching expression=".*name=.*" n="136"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Get proteome in fasta format of a model present in the BIGG database]]></help>
--- a/tools/convert/FbcToNotes/FbcToNotes.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/convert/FbcToNotes/FbcToNotes.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_FbcToNotes" name="FbcToNotes" version="2.0.0"> +<tool id="met4j_FbcToNotes" name="FbcToNotes" version="2.0.1"> <description>Convert FBC package annotations to sbml html notes</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.FbcToNotes -i "$inputPath" -o "$outputPath" @@ -18,13 +18,21 @@ </outputs> <tests> <test> + <param name="inputPath" value="ECOL.xml"/> + <output ftype="sbml" name="outputPath"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*GENE_ASSOCIATION: b2312.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Convert FBC package annotations to sbml html notes (see https://www.degruyter.com/document/doi/10.1515/jib-2017-0082/html)]]></help>
--- a/tools/convert/Kegg2Sbml/Kegg2Sbml.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/convert/Kegg2Sbml/Kegg2Sbml.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Kegg2Sbml" name="Kegg2Sbml" version="2.0.0"> +<tool id="met4j_Kegg2Sbml" name="Kegg2Sbml" version="2.0.1"> <description>Build a SBML file from KEGG organism-specific pathways. Uses Kegg API.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Kegg2Sbml#if str($org): -org "$org"
--- a/tools/convert/Sbml2CarbonSkeletonNet/Sbml2CarbonSkeletonNet.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/convert/Sbml2CarbonSkeletonNet/Sbml2CarbonSkeletonNet.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2CarbonSkeletonNet" name="Sbml2CarbonSkeletonNet" version="2.0.0"> +<tool id="met4j_Sbml2CarbonSkeletonNet" name="Sbml2CarbonSkeletonNet" version="2.0.1"> <description>Create a carbon skeleton graph representation of a SBML file content, using GSAM atom-mapping file (see https://forgemia.inra.fr/metexplore/gsam)</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2CarbonSkeletonNet -i "$inputPath" -g "$inputAAM" @@ -46,90 +46,168 @@ </outputs> <tests> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2602"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="keepSingleCarbon" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2629"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="mergeComp" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2406"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="mergeEdges" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2071"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="removeIsolated" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2490"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="undirected" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="3214"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions.tab"/> + <param name="format" value="matrix"/> + <output name="output"> + <assert_contents> + <has_n_lines n="112"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="inputAAM" value="Human-GEM_pathways-transitions2.tab"/> + <param name="fromIndexes" value="true"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_n_lines n="2611"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Metabolic networks used for quantitative analysis often contain links that are irrelevant for graph-based structural analysis. For example, inclusion of side compounds or modelling artifacts such as 'biomass' nodes. Focusing on links between compounds that share parts of their carbon skeleton allows to avoid many transitions involving side compounds, and removes entities without defined chemical structure. This app produces a Carbon Skeleton Network relevant for graph-based analysis of metabolism, in GML or matrix format, from a SBML and an GSAM atom mapping file. GSAM (see https://forgemia.inra.fr/metexplore/gsam) performs atom mapping at genome-scale level using the Reaction Decoder Tool (https://github.com/asad/ReactionDecoder) and allows to compute the number of conserved atoms of a given type between reactants.This app also enables Markov-chain based analysis of metabolic networks by computing reaction-normalized transition probabilities on the Carbon Skeleton Network.]]></help>
--- a/tools/convert/Sbml2CompoundGraph/Sbml2CompoundGraph.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/convert/Sbml2CompoundGraph/Sbml2CompoundGraph.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2CompoundGraph" name="Sbml2CompoundGraph" version="2.0.0"> +<tool id="met4j_Sbml2CompoundGraph" name="Sbml2CompoundGraph" version="2.0.1"> <description>Advanced creation of a compound graph representation of a SBML file content</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2CompoundGraph -i "$inputPath" #if str($inputSide) != 'None': @@ -54,31 +54,56 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="1101"/> + <has_line_matching expression=".*edge.*" n="5581"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <param name="undirected" value="true"/> + <param name="computeWeight" value="true"/> + <param name="removeIsolated" value="true"/> + <param name="degree" value="true"/> + <param name="mergingStrat" value="by_id"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="793"/> + <has_line_matching expression=".*edge.*" n="9372"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Metabolic networks used for quantitative analysis often contain links that are irrelevant for graph-based structural analysis. For example, inclusion of side compounds or modelling artifacts such as 'biomass' nodes.
--- a/tools/convert/Sbml2Graph/Sbml2Graph.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/convert/Sbml2Graph/Sbml2Graph.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2Graph" name="Sbml2Graph" version="2.0.0"> +<tool id="met4j_Sbml2Graph" name="Sbml2Graph" version="2.0.1"> <description>Create a graph representation of a SBML file content, and export it in graph file format.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2Graph -i "$inputPath" $bipartite @@ -34,38 +34,69 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="8"/> + <has_line_matching expression=".*edge.*" n="9"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="bipartite" value="true"/> + <param name="compound" value="false"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="15"/> + <has_line_matching expression=".*edge.*" n="17"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="reaction" value="true"/> + <param name="compound" value="false"/> + <param name="format" value="gml"/> + <output name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="7"/> + <has_line_matching expression=".*edge.*" n="8"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a graph representation of a SBML file content, and export it in graph file format.
--- a/tools/convert/Sbml2PathwayNet/Sbml2PathwayNet.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/convert/Sbml2PathwayNet/Sbml2PathwayNet.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2PathwayNet" name="Sbml2PathwayNet" version="2.0.0"> +<tool id="met4j_Sbml2PathwayNet" name="Sbml2PathwayNet" version="2.0.1"> <description>Creation of a Pathway Network representation of a SBML file content</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2PathwayNet -i "$inputPath" #if str($inputSide) != 'None':
--- a/tools/convert/Sbml2Tab/Sbml2Tab.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/convert/Sbml2Tab/Sbml2Tab.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2Tab" name="Sbml2Tab" version="2.0.0"> +<tool id="met4j_Sbml2Tab" name="Sbml2Tab" version="2.0.1"> <description>Create a tabulated file listing reaction attributes from a SBML file</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2Tab#if str($i): -irr "$i" @@ -34,28 +34,50 @@ </outputs> <tests> <test> + <param name="in" value="toy_model.xml"/> + <output ftype="tsv" name="out"> + <assert_contents> + <has_n_lines n="8"/> + <has_n_columns n="9"/> + <has_text text="2.0 E[c] --> D[c]"/> + <has_text text="A[c] <==> B[c]"/> + </assert_contents> + </output> + </test> <test> + <param name="in" value="toy_model.xml"/> + <param name="i" value="->"/> + <param name="r" value="="/> + <output ftype="tsv" name="out"> + <assert_contents> + <has_n_lines n="8"/> + <has_n_columns n="9"/> + <has_text text="2.0 E[c] -> D[c]"/> + <has_text text="A[c] = B[c]"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a tabulated file listing reaction attributes from a SBML file]]></help>
--- a/tools/convert/SbmlWizard/SbmlWizard.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/convert/SbmlWizard/SbmlWizard.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SbmlWizard" name="SbmlWizard" version="2.0.0"> +<tool id="met4j_SbmlWizard" name="SbmlWizard" version="2.0.1"> <description>General SBML model processing</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.SbmlWizard -i "$inputPath" #if str($inputSide) != 'None': @@ -56,30 +56,54 @@ </outputs> <tests> <test> + <param name="inputPath" value="Human-GEM_pathways.xml"/> + <param name="removeIsolated" value="true"/> + <param name="removeNoFlux" value="true"/> + <param name="mergingStrat" value="by_id"/> + <param name="removeDuplicated" value="true"/> + <param name="exchangeCompToRemove" value="s"/> + <output ftype="sbml" name="outputPath"> + <assert_contents> + <has_text text="</sbml>"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="removeIsolated" value="true"/> + <param name="removeNoFlux" value="true"/> + <param name="removeDuplicated" value="true"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <param name="inputReactions" value="XF_network_R_Seed.tab"/> + <output ftype="sbml" name="outputPath"> + <assert_contents> + <has_text text="</sbml>"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[General SBML model processing including compound removal (such as side compounds or isolated compounds), reaction removal (ex. blocked or exchange reaction), and compartment merging]]></help>
--- a/tools/convert/Tab2Sbml/Tab2Sbml.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/convert/Tab2Sbml/Tab2Sbml.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Tab2Sbml" name="Tab2Sbml" version="2.0.0"> +<tool id="met4j_Tab2Sbml" name="Tab2Sbml" version="2.0.1"> <description>Create a Sbml File from a tabulated file that contains the reaction ids and the formulas</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Tab2Sbml#if str($colid) != 'nan': -ci "$colid" @@ -76,63 +76,117 @@ </outputs> <tests> <test> + <param name="in" value="toy_model.tsv"/> + <output ftype="sbml" name="sbml"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*reaction .*" n="7"/> + <has_line_matching expression=".*species .*" n="8"/> + </assert_contents> + </output> + </test> <test> + <param name="in" value="toy_model_otherColumns.tsv"/> + <param name="colid" value="2"/> + <param name="colformula" value="3"/> + <output ftype="sbml" name="sbml"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*reaction .*" n="7"/> + <has_line_matching expression=".*species .*" n="8"/> + </assert_contents> + </output> + </test> <test> + <param name="in" value="toy_model_otherSigns.tsv"/> + <param name="i" value="->"/> + <param name="r" value="="/> + <output ftype="sbml" name="sbml"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*reaction .*" n="7"/> + <has_line_matching expression=".*species .*" n="8"/> + </assert_contents> + </output> + </test> <test> + <param name="in" value="toy_model.tsv"/> + <param name="rp" value="true"/> + <param name="mp" value="true"/> + <param name="e" value="_e"/> + <param name="createCompartment" value="true"/> + <output ftype="sbml" name="sbml"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*boundaryCondition=.true.*" n="3"/> + <has_line_matching expression=".*id=.M_A_ext_e.*" n="1"/> + <has_line_matching expression=".*id=.R_reac2.*" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="in" value="toy_model.tsv"/> + <param name="id" value="myModel"/> + <output ftype="sbml" name="sbml"> + <assert_contents> + <is_valid_xml/> + <has_line_matching expression=".*myModel.*" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a Sbml File from a tabulated file that contains the reaction ids and the formulas]]></help>
--- a/tools/mapping/NameMatcher/NameMatcher.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/mapping/NameMatcher/NameMatcher.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_NameMatcher" name="NameMatcher" version="2.0.0"> +<tool id="met4j_NameMatcher" name="NameMatcher" version="2.0.1"> <description>This tool runs edit-distance based fuzzy matching to perform near-similar name matching between a metabolic model and a list of chemical names in a dataset. A harmonization processing is performed on chemical names with substitutions of common patterns among synonyms, in order to create aliases on which classical fuzzy matching can be run efficiently.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh mapping.NameMatcher#if str($n): -nMatch "$n" @@ -60,6 +60,7 @@ </outputs> <tests/> <help><![CDATA[Metabolic models and Metabolomics Data often refer compounds only by using their common names, which vary greatly according to the source, thus impeding interoperability between models, databases and experimental data. This requires a tedious step of manual mapping. Fuzzy matching is a range of methods which can potentially helps fasten this process, by allowing the search for near-similar names. Fuzzy matching is primarily designed for common language search engines and is frequently based on edit distance, i.e. the number of edits to transform a character string into another, effectively managing typo, case and special character variations, and allowing auto-completion. However, edit-distance based search fall short when mapping chemical names: As an example, alpha-D-Glucose et Glucose would require more edits than between Fructose and Glucose. + This tool runs edit-distance based fuzzy matching to perform near-similar name matching between a metabolic model and a list of chemical names in a dataset. A harmonization processing is performed on chemical names with substitutions of common patterns among synonyms, in order to create aliases on which classical fuzzy matching can be run efficiently.]]></help> <citations/> </tool>
--- a/tools/mapping/ORApathwayEnrichment/ORApathwayEnrichment.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/mapping/ORApathwayEnrichment/ORApathwayEnrichment.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ORApathwayEnrichment" name="ORApathwayEnrichment" version="2.0.0"> +<tool id="met4j_ORApathwayEnrichment" name="ORApathwayEnrichment" version="2.0.1"> <description>Perform Over Representation Analysis for Pathway Enrichment, using one-tailed exact Fisher Test.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh mapping.ORApathwayEnrichment#if str($th) != 'nan': -th "$th" @@ -32,39 +32,62 @@ </outputs> <tests> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="input" value="XF_network_C_NOI.txt"/> + <output name="outputFile"> + <assert_contents> + <has_n_columns n="3"/> + <has_n_lines n="3"/> + </assert_contents> + </output> + </test> <test> + <param name="sbml" value="XF_network.sbml"/> + <param name="input" value="XF_network_C_NOI.txt"/> + <param name="corr" value="HolmBonferroni"/> + <param name="th" value="0.005"/> + <output name="outputFile"> + <assert_contents> + <has_n_columns n="3"/> + <has_n_lines n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Perform Over Representation Analysis for Pathway Enrichment, using one-tailed exact Fisher Test. The fisher exact test computes the probability p to randomly get the given set of values. This version computes the probability to get at least the given overlap between the given set and the given modality : Sum the hypergeometric probability with increasing target/query intersection cardinality. + The hypergeometric probability is computed from the following contingency table entries. (values in cells correspond to the marginal totals of each intersection groups) Query !Query Target a b !Target c d + The probability of obtaining the set of value is computed as following: p = ((a+b)!(c+d)!(a+c)!(b+d)!)/(a!b!c!d!(a+b+c+d)!) + The obtained p-value is then adjusted for multiple testing using one of the following methods: - Bonferroni: adjusted p-value = p*n - Benjamini-Hochberg: adjusted p-value = p*n/k
--- a/tools/networkAnalysis/BipartiteDistanceMatrix/BipartiteDistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/BipartiteDistanceMatrix/BipartiteDistanceMatrix.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_BipartiteDistanceMatrix" name="BipartiteDistanceMatrix" version="2.0.0"> +<tool id="met4j_BipartiteDistanceMatrix" name="BipartiteDistanceMatrix" version="2.0.1"> <description>Create a compound to reactions distance matrix.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.BipartiteDistanceMatrix -i "$inputPath" #if str($sideCompoundFile) != 'None':
--- a/tools/networkAnalysis/ChemSimilarityWeighting/ChemSimilarityWeighting.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/ChemSimilarityWeighting/ChemSimilarityWeighting.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ChemSimilarityWeighting" name="ChemSimilarityWeighting" version="2.0.0"> +<tool id="met4j_ChemSimilarityWeighting" name="ChemSimilarityWeighting" version="2.0.1"> <description>Provides tabulated compound graph edge list, with one column with reactant pair's chemical similarity.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ChemSimilarityWeighting#if str($type): -f "$type" @@ -68,7 +68,7 @@ <help><![CDATA[Provides tabulated compound graph edge list, with one column with reactant pair's chemical similarity.Chemical similarity has been proposed as edge weight for finding meaningful paths in metabolic networks, using shortest (lightest) path search.]]></help> <citations> <citation type="doi">10.1093/bioinformatics/btg217</citation> + <citation type="doi">10.1093/bioinformatics/btu760</citation> <citation type="doi">10.1093/bioinformatics/bti116</citation> - <citation type="doi">10.1093/bioinformatics/btu760</citation> </citations> </tool>
--- a/tools/networkAnalysis/ChokePoint/ChokePoint.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/ChokePoint/ChokePoint.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ChokePoint" name="ChokePoint" version="2.0.0"> +<tool id="met4j_ChokePoint" name="ChokePoint" version="2.0.1"> <description>Compute the Choke points of a metabolic network.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ChokePoint -i "$inputPath" -o "$outputPath" @@ -18,15 +18,25 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="695"/> + <has_n_columns n="3"/> + <has_line_matching expression="R_ADEtex.*adenine_transport_via_diffusion__extracellular_to_periplasm_.*M_ade_e <==> M_ade_p" n="1"/> + <has_line_matching expression="R_AGDC_r.*R_AGDC_r.*M_acgam6p_c \+ M_h2o_c --> M_ac_c \+ M_gam6p_c" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Compute the Choke points of a metabolic network.
--- a/tools/networkAnalysis/DegreeWeighting/DegreeWeighting.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/DegreeWeighting/DegreeWeighting.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_DegreeWeighting" name="DegreeWeighting" version="2.0.0"> +<tool id="met4j_DegreeWeighting" name="DegreeWeighting" version="2.0.1"> <description>Provides tabulated compound graph edge list, with one column with target's degree.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.DegreeWeighting#if str($pow): -pow "$pow"
--- a/tools/networkAnalysis/DistanceMatrix/DistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/DistanceMatrix/DistanceMatrix.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_DistanceMatrix" name="DistanceMatrix" version="2.0.0"> +<tool id="met4j_DistanceMatrix" name="DistanceMatrix" version="2.0.1"> <description>Create a compound to compound distance matrix.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.DistanceMatrix -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -34,30 +34,54 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="9"/> + <has_line_matching expression="id,A,A_ext,B,C,D,D_ext,E,E_ext" n="1"/> + <has_line_matching expression="B,1.0,Infinity,0.0,2.0,1.0,2.0,Infinity,Infinity" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="sideCompoundFile" value="sides.txt"/> + <param name="degree" value="true"/> + <param name="undirected" value="true"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="8"/> + <has_line_matching expression="id,A,B,C,D,D_ext,E,E_ext" n="1"/> + <has_line_matching expression="A,0.0,4.0,4.0,20.0,21.0,24.0,25.0" n="1"/> + <has_line_matching expression="B,4.0,0.0,8.0,16.0,17.0,20.0,21.0" n="1"/> + <has_line_matching expression="C,4.0,8.0,0.0,16.0,17.0,20.0,21.0" n="1"/> + <has_line_matching expression="D,8.0,4.0,4.0,0.0,1.0,4.0,5.0" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a compound to compound distance matrix.
--- a/tools/networkAnalysis/ExtractSubBipNetwork/ExtractSubBipNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/ExtractSubBipNetwork/ExtractSubBipNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubBipNetwork" name="ExtractSubBipNetwork" version="2.0.0"> +<tool id="met4j_ExtractSubBipNetwork" name="ExtractSubBipNetwork" version="2.0.1"> <description>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds and/or reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubBipNetwork -i "$inputPath" -s "$sourcePath" @@ -54,17 +54,29 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="sourcePath" value="seeds.txt"/> + <param name="targetPath" value="targets.txt"/> + <param name="sideCompoundFile" value="sc.txt"/> + <param name="format" value="gml"/> + <output ftype="txt" name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="5"/> + <has_line_matching expression=".*edge.*" n="4"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds and/or reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.
--- a/tools/networkAnalysis/ExtractSubNetwork/ExtractSubNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/ExtractSubNetwork/ExtractSubNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubNetwork" name="ExtractSubNetwork" version="2.0.0"> +<tool id="met4j_ExtractSubNetwork" name="ExtractSubNetwork" version="2.0.1"> <description>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds of interests ids, one per row.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubNetwork -i "$inputPath" -s "$sourcePath" @@ -56,29 +56,41 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="sourcePath" value="seeds.txt"/> + <param name="targetPath" value="targets.txt"/> + <param name="format" value="gml"/> + <output ftype="txt" name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="3"/> + <has_line_matching expression=".*edge.*" n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds of interests ids, one per row. The subnetwork corresponds to the part of the network that connects compounds from the first list to compounds from the second list. Sources and targets list can have elements in common. The connecting part can be defined as the union of shortest or k-shortest paths between sources and targets, or the Steiner tree connecting them. The relevance of considered path can be increased by weighting the edges using degree squared, chemical similarity (require InChI or SMILES annotations) or any provided weighting. + See previous works on subnetwork extraction for parameters recommendations.]]></help> <citations> + <citation type="doi">10.1093/nar/gki437</citation> + <citation type="doi">10.1093/bioinformatics/btg217</citation> <citation type="doi">10.1093/bib/bbv115</citation> <citation type="doi">10.1016/j.biosystems.2011.05.004</citation> + <citation type="doi">10.1093/bioinformatics/bti116</citation> <citation type="doi">10.1016/j.jmb.2005.09.079</citation> <citation type="doi">10.1093/bioinformatics/btu760</citation> - <citation type="doi">10.1093/nar/gki437</citation> - <citation type="doi">10.1093/bioinformatics/bti116</citation> - <citation type="doi">10.1093/bioinformatics/btg217</citation> </citations> </tool>
--- a/tools/networkAnalysis/ExtractSubReactionNetwork/ExtractSubReactionNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/ExtractSubReactionNetwork/ExtractSubReactionNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubReactionNetwork" name="ExtractSubReactionNetwork" version="2.0.0"> +<tool id="met4j_ExtractSubReactionNetwork" name="ExtractSubReactionNetwork" version="2.0.1"> <description>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubReactionNetwork -i "$inputPath" -s "$sourcePath" @@ -54,17 +54,29 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="sourcePath" value="seeds.txt"/> + <param name="targetPath" value="targets.txt"/> + <param name="sideCompoundFile" value="sides.txt"/> + <param name="format" value="gml"/> + <output ftype="txt" name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="3"/> + <has_line_matching expression=".*edge.*" n="2"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a subnetwork from a metabolic network in SBML format, and two files containing lists of reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.
--- a/tools/networkAnalysis/LoadPoint/LoadPoint.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/LoadPoint/LoadPoint.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_LoadPoint" name="LoadPoint" version="2.0.0"> +<tool id="met4j_LoadPoint" name="LoadPoint" version="2.0.1"> <description>Compute the Load points of a metabolic network. Load points constitute an indicator of lethality and can help identifying drug targets.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.LoadPoint -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -30,13 +30,21 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_columns n="3"/> + <has_n_lines n="8"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Compute the Load points of a metabolic network. Load points constitute an indicator of lethality and can help identifying drug targets.
--- a/tools/networkAnalysis/MetaboRank/MetaboRank.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/MetaboRank/MetaboRank.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_MetaboRank" name="MetaboRank" version="2.0.0"> +<tool id="met4j_MetaboRank" name="MetaboRank" version="2.0.1"> <description>Compute the MetaboRank, a custom personalized PageRank for metabolic network.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.MetaboRank -i "$sbmlFilePath" -s "$seedsFilePath" @@ -44,15 +44,25 @@ </outputs> <tests> <test> + <param name="sbmlFilePath" value="XF_network.sbml"/> + <param name="seedsFilePath" value="XF_network_C_Seed.tab"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <output name="output"> + <assert_contents> + <has_n_lines n="1100"/> + <has_n_columns n="11"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Compute the MetaboRank, a custom personalized PageRank for metabolic network.
--- a/tools/networkAnalysis/NetworkSummary/NetworkSummary.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/NetworkSummary/NetworkSummary.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_NetworkSummary" name="NetworkSummary" version="2.0.0"> +<tool id="met4j_NetworkSummary" name="NetworkSummary" version="2.0.1"> <description>Create a report summarizing several graph measures characterising the structure of a metabolic network.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.NetworkSummary -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -26,12 +26,19 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <output name="outputPath"> + <assert_contents> + <has_n_lines min="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a report summarizing several graph measures characterising the structure of a metabolic network.
--- a/tools/networkAnalysis/PrecursorNetwork/PrecursorNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/PrecursorNetwork/PrecursorNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_PrecursorNetwork" name="PrecursorNetwork" version="2.0.0"> +<tool id="met4j_PrecursorNetwork" name="PrecursorNetwork" version="2.0.1"> <description>Perform a network expansion from a set of compound targets to create a precursor network.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.PrecursorNetwork -i "$sbmlFilePath" -t "$targetsFilePath" @@ -38,15 +38,25 @@ </outputs> <tests> <test> + <param name="sbmlFilePath" value="toy_model.xml"/> + <param name="targetsFilePath" value="targets.txt"/> + <param name="format" value="gml"/> + <output ftype="txt" name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="13"/> + <has_line_matching expression=".*edge.*" n="15"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Perform a network expansion from a set of compound targets to create a precursor network.
--- a/tools/networkAnalysis/ReactionDistanceMatrix/ReactionDistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/ReactionDistanceMatrix/ReactionDistanceMatrix.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ReactionDistanceMatrix" name="ReactionDistanceMatrix" version="2.0.0"> +<tool id="met4j_ReactionDistanceMatrix" name="ReactionDistanceMatrix" version="2.0.1"> <description>Create a reaction to reaction distance matrix.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ReactionDistanceMatrix -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -38,91 +38,172 @@ </outputs> <tests> <test> + <param name="inputPath" value="toy_model.xml"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="8"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5,reac6,reac7" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0,Infinity,Infinity" n="1"/> + <has_line_matching expression="reac2,Infinity,0.0,1.0,1.0,2.0,Infinity,Infinity" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="undirected" value="true"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="8"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5,reac6,reac7" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0,5.0,4.0" n="1"/> + <has_line_matching expression="reac2,1.0,0.0,1.0,1.0,2.0,4.0,3.0" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="undirected" value="true"/> + <param name="sideCompoundFile" value="sides.txt"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="8"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5,reac6,reac7" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0,5.0,4.0" n="1"/> + <has_line_matching expression="reac2,1.0,0.0,1.0,2.0,3.0,5.0,4.0" n="1"/> + <has_line_matching expression="reac3,1.0,1.0,0.0,1.0,2.0,4.0,3.0" n="1"/> + <has_line_matching expression="reac4,2.0,2.0,1.0,0.0,1.0,3.0,2.0" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="undirected" value="true"/> + <param name="rExclude" value="rexclude.txt"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="6"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0" n="1"/> + <has_line_matching expression="reac2,1.0,0.0,1.0,1.0,2.0" n="1"/> + <has_line_matching expression="reac3,1.0,1.0,0.0,1.0,2.0" n="1"/> + <has_line_matching expression="reac4,2.0,1.0,1.0,0.0,1.0" n="1"/> + <has_line_matching expression="reac5,3.0,2.0,2.0,1.0,0.0" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="undirected" value="true"/> + <param name="sideCompoundFile" value="sides.txt"/> + <param name="rExclude" value="rexclude.txt"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="6"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0" n="1"/> + <has_line_matching expression="reac2,1.0,0.0,1.0,2.0,3.0" n="1"/> + <has_line_matching expression="reac3,1.0,1.0,0.0,1.0,2.0" n="1"/> + <has_line_matching expression="reac4,2.0,2.0,1.0,0.0,1.0" n="1"/> + <has_line_matching expression="reac5,3.0,3.0,2.0,1.0,0.0" n="1"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="toy_model.xml"/> + <param name="sideCompoundFile" value="sides.txt"/> + <param name="rExclude" value="rexclude.txt"/> + <output ftype="csv" name="outputPath"> + <assert_contents> + <has_n_lines n="6"/> + <has_line_matching expression="id,reac1,reac2,reac3,reac4,reac5" n="1"/> + <has_line_matching expression="reac1,0.0,1.0,1.0,2.0,3.0" n="1"/> + <has_line_matching expression="reac2,Infinity,0.0,1.0,2.0,3.0" n="1"/> + <has_line_matching expression="reac3,Infinity,Infinity,0.0,1.0,2.0" n="1"/> + <has_line_matching expression="reac4,Infinity,Infinity,Infinity,0.0,1.0" n="1"/> + <has_line_matching expression="reac5,Infinity,Infinity,Infinity,Infinity,0.0" n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a reaction to reaction distance matrix.
--- a/tools/networkAnalysis/ScopeNetwork/ScopeNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/ScopeNetwork/ScopeNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ScopeNetwork" name="ScopeNetwork" version="2.0.0"> +<tool id="met4j_ScopeNetwork" name="ScopeNetwork" version="2.0.1"> <description>Perform a network expansion from a set of compound seeds to create a scope network</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ScopeNetwork -i "$sbmlFilePath" -s "$seedsFilePath" @@ -42,16 +42,27 @@ </outputs> <tests> <test> + <param name="sbmlFilePath" value="toy_model.xml"/> + <param name="seedsFilePath" value="seeds.txt"/> + <param name="sideCompoundFile" value="sides.txt"/> + <param name="format" value="gml"/> + <output ftype="txt" name="output"> + <assert_contents> + <has_line_matching expression=".*node.*" n="9"/> + <has_line_matching expression=".*edge.*" n="11"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Perform a network expansion from a set of compound seeds to create a scope network
--- a/tools/networkAnalysis/SeedsAndTargets/SeedsAndTargets.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/SeedsAndTargets/SeedsAndTargets.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SeedsAndTargets" name="SeedsAndTargets" version="2.0.0"> +<tool id="met4j_SeedsAndTargets" name="SeedsAndTargets" version="2.0.1"> <description>Identify exogenously acquired compounds, exogenously available producible compounds and/or dead ends metabolites from metabolic network topology</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.SeedsAndTargets -i "$inputPath" #if str($inputSide) != 'None': @@ -44,41 +44,75 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="source" value="true"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_columns n="1"/> + <has_n_lines n="109"/> + <has_line_matching expression="M_\S+_\w" n="109"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="sink" value="true"/> + <param name="useInternal" value="true"/> + <param name="comp" value="e"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_columns n="1"/> + <has_n_lines n="5"/> + <has_line_matching expression="^M_\S+_\w" n="5"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="sink" value="true"/> + <param name="useBorensteinAlg" value="true"/> + <param name="comp" value="e"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_columns n="1"/> + <has_n_lines n="26"/> + <has_line_matching expression="^M_\S+_\w" n="26"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Identify exogenously acquired compounds, exogenously available producible compounds and/or dead ends metabolites from metabolic network topology
--- a/tools/networkAnalysis/SideCompoundsScan/SideCompoundsScan.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/SideCompoundsScan/SideCompoundsScan.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SideCompoundsScan" name="SideCompoundsScan" version="2.0.0"> +<tool id="met4j_SideCompoundsScan" name="SideCompoundsScan" version="2.0.1"> <description>Scan a network to identify side compounds.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.SideCompoundsScan -i "$inputPath" $sideOnly @@ -50,23 +50,40 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="1108"/> + <has_n_columns n="4"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="noReportValue" value="true"/> + <output ftype="tsv" name="outputPath"> + <assert_contents> + <has_n_lines n="6"/> + <has_n_columns n="1"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Scan a network to identify side compounds.
--- a/tools/networkAnalysis/TopologicalPathwayAnalysis/TopologicalPathwayAnalysis.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/networkAnalysis/TopologicalPathwayAnalysis/TopologicalPathwayAnalysis.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_TopologicalPathwayAnalysis" name="TopologicalPathwayAnalysis" version="2.0.0"> +<tool id="met4j_TopologicalPathwayAnalysis" name="TopologicalPathwayAnalysis" version="2.0.1"> <description>Run a Topological Pathway Analysis (TPA) to identify key pathways based on topological properties of its constituting compounds.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.TopologicalPathwayAnalysis -i "$inputPath" #if str($inputSide) != 'None': @@ -42,30 +42,54 @@ </outputs> <tests> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="dataPath" value="XF_network_C_NOI.txt"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <output name="outputPath"> + <assert_contents> + <has_n_columns n="3"/> + <has_n_lines n="3"/> + </assert_contents> + </output> + </test> <test> + <param name="inputPath" value="XF_network.sbml"/> + <param name="dataPath" value="XF_network_C_NOI.txt"/> + <param name="inputSide" value="XF_network_C_Side.tab"/> + <param name="undirected" value="true"/> + <param name="removeIsolated" value="true"/> + <param name="out" value="true"/> + <param name="mergingStrat" value="by_id"/> + <output name="outputPath"> + <assert_contents> + <has_n_columns n="3"/> + <has_n_lines n="3"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Run a Topological Pathway Analysis (TPA) to identify key pathways based on topological properties of its constituting compounds.
--- a/tools/reconstruction/CreateMetaNetwork/CreateMetaNetwork.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/reconstruction/CreateMetaNetwork/CreateMetaNetwork.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_CreateMetaNetwork" name="CreateMetaNetwork" version="2.0.0"> +<tool id="met4j_CreateMetaNetwork" name="CreateMetaNetwork" version="2.0.1"> <description>Create a Meta-Network from two sub-networks in SBML format.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh reconstruction.CreateMetaNetwork -n1 "$sbml1FilePath" -n2 "$sbml2FilePath" @@ -60,18 +60,31 @@ </outputs> <tests> <test> + <param name="sbml1FilePath" value="Human-GEM_pathways.xml"/> + <param name="sbml2FilePath" value="ECOL.xml"/> + <param name="external1" value="s"/> + <param name="external2" value="e"/> + <param name="n1prefix" value="hsa"/> + <param name="n2prefix" value="eco"/> + <param name="mergingCriterion" value="by_metanetx"/> + <output ftype="sbml" name="outputPath"> + <assert_contents> + <has_text text="</sbml>"/> + </assert_contents> + </output> + </test> </tests> <help><![CDATA[Create a Meta-Network from two sub-networks in SBML format.
--- a/tools/reconstruction/SbmlCheckBalance/SbmlCheckBalance.xml Mon Feb 03 15:59:46 2025 +0000 +++ b/tools/reconstruction/SbmlCheckBalance/SbmlCheckBalance.xml Thu Feb 13 15:08:22 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SbmlCheckBalance" name="SbmlCheckBalance" version="2.0.0"> +<tool id="met4j_SbmlCheckBalance" name="SbmlCheckBalance" version="2.0.1"> <description>Check balance of all the reactions in a SBML.</description> <xrefs> <xref type="bio.tools">met4j</xref> </xrefs> <requirements> - <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.1</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh reconstruction.SbmlCheckBalance -i "$sbml" -out "$out"