Mercurial > repos > metexplore > met4j
changeset 10:6a112eaf8f38 draft
planemo upload for repository https://forgemia.inra.fr/metexplore/met4j-galaxy commit 71071300dd662ad01bd064abcf6866a192eeea95
line wrap: on
line diff
--- a/build/tools/BipartiteDistanceMatrix/BipartiteDistanceMatrix.xml Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/BipartiteDistanceMatrix/BipartiteDistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_BipartiteDistanceMatrix" name="BipartiteDistanceMatrix" version="develop"> +<tool id="met4j_BipartiteDistanceMatrix" name="BipartiteDistanceMatrix" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/ChemSimilarityWeighting/ChemSimilarityWeighting.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ChemSimilarityWeighting" name="ChemSimilarityWeighting" version="develop"> +<tool id="met4j_ChemSimilarityWeighting" name="ChemSimilarityWeighting" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ChemSimilarityWeighting#if str($type): -f "$type"
--- a/build/tools/ChokePoint/ChokePoint.xml Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/ChokePoint/ChokePoint.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ChokePoint" name="ChokePoint" version="develop"> +<tool id="met4j_ChokePoint" name="ChokePoint" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ChokePoint -i "$inputPath" -o "$outputPath" @@ -18,125 +18,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/CreateMetaNetwork/CreateMetaNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_CreateMetaNetwork" name="CreateMetaNetwork" version="develop"> +<tool id="met4j_CreateMetaNetwork" name="CreateMetaNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh reconstruction.CreateMetaNetwork -n1 "$sbml1FilePath" -n2 "$sbml2FilePath" @@ -60,148 +60,18 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/DegreeWeighting/DegreeWeighting.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_DegreeWeighting" name="DegreeWeighting" version="develop"> +<tool id="met4j_DegreeWeighting" name="DegreeWeighting" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/DistanceMatrix/DistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_DistanceMatrix" name="DistanceMatrix" version="develop"> +<tool id="met4j_DistanceMatrix" name="DistanceMatrix" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.DistanceMatrix -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -34,294 +34,30 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/ExtractAnnotations/ExtractAnnotations.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractAnnotations" name="ExtractAnnotations" version="develop"> +<tool id="met4j_ExtractAnnotations" name="ExtractAnnotations" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.ExtractAnnotations -i "$inputPath" -export "$export" @@ -34,238 +34,40 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/ExtractPathways/ExtractPathways.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractPathways" name="ExtractPathways" version="develop"> +<tool id="met4j_ExtractPathways" name="ExtractPathways" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.ExtractPathways -i "$inputPath" -p "$pathwayId" @@ -24,125 +24,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/ExtractSubBipNetwork/ExtractSubBipNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubBipNetwork" name="ExtractSubBipNetwork" version="develop"> +<tool id="met4j_ExtractSubBipNetwork" name="ExtractSubBipNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubBipNetwork -i "$inputPath" -s "$sourcePath" @@ -54,53 +54,17 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/ExtractSubNetwork/ExtractSubNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubNetwork" name="ExtractSubNetwork" version="develop"> +<tool id="met4j_ExtractSubNetwork" name="ExtractSubNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubNetwork -i "$inputPath" -s "$sourcePath" @@ -56,55 +56,21 @@ </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/bib/bbv115</citation>
--- a/build/tools/ExtractSubReactionNetwork/ExtractSubReactionNetwork.xml Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/ExtractSubReactionNetwork/ExtractSubReactionNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubReactionNetwork" name="ExtractSubReactionNetwork" version="develop"> +<tool id="met4j_ExtractSubReactionNetwork" name="ExtractSubReactionNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubReactionNetwork -i "$inputPath" -s "$sourcePath" @@ -54,53 +54,17 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/FbcToNotes/FbcToNotes.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_FbcToNotes" name="FbcToNotes" version="develop"> +<tool id="met4j_FbcToNotes" name="FbcToNotes" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.FbcToNotes -i "$inputPath" -o "$outputPath" @@ -18,101 +18,13 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/GetBiggModelProteome/GetBiggModelProteome.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetBiggModelProteome" name="GetBiggModelProteome" version="develop"> +<tool id="met4j_GetBiggModelProteome" name="GetBiggModelProteome" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh bigg.GetBiggModelProteome -m "$modelId" -o "$outputFile" @@ -22,54 +22,12 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/GetEntities/GetEntities.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetEntities" name="GetEntities" version="develop"> +<tool id="met4j_GetEntities" name="GetEntities" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetEntities -i "$sbml" $printMetabolites @@ -30,167 +30,29 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/GetGenesFromReactions/GetGenesFromReactions.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetGenesFromReactions" name="GetGenesFromReactions" version="develop"> +<tool id="met4j_GetGenesFromReactions" name="GetGenesFromReactions" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetGenesFromReactions -i "$sbml" -r "$reactionFile" @@ -34,125 +34,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/GetMetaboliteAttributes/GetMetaboliteAttributes.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetMetaboliteAttributes" name="GetMetaboliteAttributes" version="develop"> +<tool id="met4j_GetMetaboliteAttributes" name="GetMetaboliteAttributes" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetMetaboliteAttributes -i "$sbml" -o "$outputFile" @@ -18,75 +18,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/GetReactantsFromReactions/GetReactantsFromReactions.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetReactantsFromReactions" name="GetReactantsFromReactions" version="develop"> +<tool id="met4j_GetReactantsFromReactions" name="GetReactantsFromReactions" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetReactantsFromReactions -i "$sbml" -r "$reactionFile" @@ -38,355 +38,36 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/Kegg2Sbml/Kegg2Sbml.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Kegg2Sbml" name="Kegg2Sbml" version="develop"> +<tool id="met4j_Kegg2Sbml" name="Kegg2Sbml" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/LoadPoint/LoadPoint.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_LoadPoint" name="LoadPoint" version="develop"> +<tool id="met4j_LoadPoint" name="LoadPoint" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.LoadPoint -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -30,101 +30,13 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/MetaboRank/MetaboRank.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_MetaboRank" name="MetaboRank" version="develop"> +<tool id="met4j_MetaboRank" name="MetaboRank" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.MetaboRank -i "$sbmlFilePath" -s "$seedsFilePath" @@ -44,125 +44,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/NameMatcher/NameMatcher.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_NameMatcher" name="NameMatcher" version="develop"> +<tool id="met4j_NameMatcher" name="NameMatcher" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh mapping.NameMatcher#if str($n): -nMatch "$n" @@ -60,7 +60,6 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/NetworkSummary/NetworkSummary.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_NetworkSummary" name="NetworkSummary" version="develop"> +<tool id="met4j_NetworkSummary" name="NetworkSummary" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.NetworkSummary -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -26,89 +26,12 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/ORApathwayEnrichment/ORApathwayEnrichment.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ORApathwayEnrichment" name="ORApathwayEnrichment" version="develop"> +<tool id="met4j_ORApathwayEnrichment" name="ORApathwayEnrichment" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh mapping.ORApathwayEnrichment#if str($th) != 'nan': -th "$th" @@ -32,262 +32,39 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/PrecursorNetwork/PrecursorNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_PrecursorNetwork" name="PrecursorNetwork" version="develop"> +<tool id="met4j_PrecursorNetwork" name="PrecursorNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.PrecursorNetwork -i "$sbmlFilePath" -t "$targetsFilePath" @@ -38,45 +38,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/ReactionDistanceMatrix/ReactionDistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ReactionDistanceMatrix" name="ReactionDistanceMatrix" version="develop"> +<tool id="met4j_ReactionDistanceMatrix" name="ReactionDistanceMatrix" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ReactionDistanceMatrix -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -38,982 +38,91 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/Sbml2CarbonSkeletonNet/Sbml2CarbonSkeletonNet.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2CarbonSkeletonNet" name="Sbml2CarbonSkeletonNet" version="develop"> +<tool id="met4j_Sbml2CarbonSkeletonNet" name="Sbml2CarbonSkeletonNet" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2CarbonSkeletonNet -i "$inputPath" -g "$inputAAM" @@ -46,324 +46,90 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/Sbml2CompoundGraph/Sbml2CompoundGraph.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2CompoundGraph" name="Sbml2CompoundGraph" version="develop"> +<tool id="met4j_Sbml2CompoundGraph" name="Sbml2CompoundGraph" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2CompoundGraph -i "$inputPath" #if str($inputSide) != 'None': @@ -54,106 +54,31 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/Sbml2Graph/Sbml2Graph.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2Graph" name="Sbml2Graph" version="develop"> +<tool id="met4j_Sbml2Graph" name="Sbml2Graph" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2Graph -i "$inputPath" $bipartite @@ -34,134 +34,38 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/Sbml2PathwayNet/Sbml2PathwayNet.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2PathwayNet" name="Sbml2PathwayNet" version="develop"> +<tool id="met4j_Sbml2PathwayNet" name="Sbml2PathwayNet" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/Sbml2Tab/Sbml2Tab.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2Tab" name="Sbml2Tab" version="develop"> +<tool id="met4j_Sbml2Tab" name="Sbml2Tab" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2Tab#if str($i): -irr "$i" @@ -34,270 +34,28 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SbmlCheckBalance/SbmlCheckBalance.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SbmlCheckBalance" name="SbmlCheckBalance" version="develop"> +<tool id="met4j_SbmlCheckBalance" name="SbmlCheckBalance" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SbmlWizard/SbmlWizard.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SbmlWizard" name="SbmlWizard" version="develop"> +<tool id="met4j_SbmlWizard" name="SbmlWizard" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.SbmlWizard -i "$inputPath" #if str($inputSide) != 'None': @@ -56,174 +56,30 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/ScopeNetwork/ScopeNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ScopeNetwork" name="ScopeNetwork" version="develop"> +<tool id="met4j_ScopeNetwork" name="ScopeNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ScopeNetwork -i "$sbmlFilePath" -s "$seedsFilePath" @@ -42,49 +42,16 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SeedsAndTargets/SeedsAndTargets.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SeedsAndTargets" name="SeedsAndTargets" version="develop"> +<tool id="met4j_SeedsAndTargets" name="SeedsAndTargets" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.SeedsAndTargets -i "$inputPath" #if str($inputSide) != 'None': @@ -44,415 +44,41 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SetCharges/SetCharges.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetCharges" name="SetCharges" version="develop"> +<tool id="met4j_SetCharges" name="SetCharges" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetCharges#if str($colcharge) != 'nan': -cc "$colcharge" @@ -50,387 +50,63 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SetChemicalFormulas/SetChemicalFormulas.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetChemicalFormulas" name="SetChemicalFormulas" version="develop"> +<tool id="met4j_SetChemicalFormulas" name="SetChemicalFormulas" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetChemicalFormulas#if str($colformula) != 'nan': -cf "$colformula" @@ -50,97 +50,19 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SetEcNumbers/SetEcNumbers.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetEcNumbers" name="SetEcNumbers" version="develop"> +<tool id="met4j_SetEcNumbers" name="SetEcNumbers" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetEcNumbers#if str($colec) != 'nan': -cec "$colec" @@ -48,97 +48,19 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SetGprs/SetGprs.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetGprs" name="SetGprs" version="develop"> +<tool id="met4j_SetGprs" name="SetGprs" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetGprs#if str($colgpr) != 'nan': -cgpr "$colgpr" @@ -48,124 +48,22 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SetIds/SetIds.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetIds" name="SetIds" version="develop"> +<tool id="met4j_SetIds" name="SetIds" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetIds#if str($colname) != 'nan': -cnew "$colname" @@ -62,387 +62,63 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SetNames/SetNames.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetNames" name="SetNames" version="develop"> +<tool id="met4j_SetNames" name="SetNames" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetNames#if str($colname) != 'nan': -cname "$colname" @@ -62,309 +62,51 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SetPathways/SetPathways.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetPathways" name="SetPathways" version="develop"> +<tool id="met4j_SetPathways" name="SetPathways" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetPathways#if str($colp) != 'nan': -cp "$colp" @@ -56,181 +56,31 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SetReferences/SetReferences.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetReferences" name="SetReferences" version="develop"> +<tool id="met4j_SetReferences" name="SetReferences" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetReferences#if str($colRef) != 'nan': -cr "$colRef" @@ -68,89 +68,17 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/SideCompoundsScan/SideCompoundsScan.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SideCompoundsScan" name="SideCompoundsScan" version="develop"> +<tool id="met4j_SideCompoundsScan" name="SideCompoundsScan" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.SideCompoundsScan -i "$inputPath" $sideOnly @@ -50,210 +50,23 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/Tab2Sbml/Tab2Sbml.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Tab2Sbml" name="Tab2Sbml" version="develop"> +<tool id="met4j_Tab2Sbml" name="Tab2Sbml" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Tab2Sbml#if str($colid) != 'nan': -ci "$colid" @@ -76,657 +76,63 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/build/tools/TopologicalPathwayAnalysis/TopologicalPathwayAnalysis.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_TopologicalPathwayAnalysis" name="TopologicalPathwayAnalysis" version="develop"> +<tool id="met4j_TopologicalPathwayAnalysis" name="TopologicalPathwayAnalysis" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.TopologicalPathwayAnalysis -i "$inputPath" #if str($inputSide) != 'None': @@ -42,294 +42,30 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tests.html Mon Feb 03 15:59:46 2025 +0000 @@ -285,7 +285,7 @@ var md = window.markdownit({ html: true, }); - target.innerHTML = md.render(atob('IyMgVGVzdCBTdW1tYXJ5Cgo8ZGl2IGNsYXNzPSJwcm9ncmVzcyI+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzIiBzdHlsZT0id2lkdGg6IDEwMC4wJSIgYXJpYS12YWx1ZW5vdz0iODQiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9Ijg0IiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgdGl0bGU9Ijg0IFBhc3NlZCI+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci13YXJuaW5nIiBzdHlsZT0id2lkdGg6IDAuMCUiIGFyaWEtdmFsdWVub3c9IjAiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9Ijg0IiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgdGl0bGU9IjAgU2tpcHBlZCI+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1kYW5nZXIiIHN0eWxlPSJ3aWR0aDogMC4wJSIgYXJpYS12YWx1ZW5vdz0iMCIgYXJpYS12YWx1ZW1pbj0iMCIgYXJpYS12YWx1ZW1heD0iODQiIHRpdGxlPSIwIEZhaWxlZCBvciBFcnJvcmVkIj4KICA8L2Rpdj4KPC9kaXY+Cgp8IFRlc3QgU3RhdGUgfCBDb3VudCB8CnwgLS0tLS0tLS0tLSB8IC0tLS0tIHwKfCBUb3RhbCAgICAgIHwgODQgfAp8IFBhc3NlZCAgICAgfCA4NCB8CnwgRXJyb3IgICAgICB8IDAgfAp8IEZhaWx1cmUgICAgfCAwIHwKfCBTa2lwcGVkICAgIHwgMCB8CgoKPGRldGFpbHMgPjxzdW1tYXJ5PlBhc3NlZCBUZXN0czwvc3VtbWFyeT4KCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfQ2hva2VQb2ludCAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLkNob2tlUG9pbnQgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZC9iLzEvZGF0YXNldF9kYjFmZDMyZC0wZjNkLTQxZWQtOGQ3Zi1mMDdkOWYxNmRhNDcuZGF0IiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIvb3V0cHV0cy9kYXRhc2V0XzliNWZjMjc2LWNkZjAtNDhjYi1hOWRhLWQ2MmMzMWEwYTA4NC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBuZXR3b3JrLi4uCiAgICAgIENvbXB1dGluZyBjaG9rZSBwb2ludHMuLi4KICAgICAgRXhwb3J0IHJlc3VsdHMuLi4KICAgICAgZG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9DcmVhdGVNZXRhTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggcmVjb25zdHJ1Y3Rpb24uQ3JlYXRlTWV0YU5ldHdvcmsgLW4xICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzMvMC8xL2RhdGFzZXRfMzAxZjNiODEtMTEwNy00MjZlLTllZTUtYzVjOTI1YjY0NmQ5LmRhdCIgLW4yICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzcvMS85L2RhdGFzZXRfNzE5ZTcwYTgtN2NjZS00NDBhLTgyYTAtNzhkZTk5MTRhOGQwLmRhdCIgLW4xZXggInMiIC1uMmV4ICJlIiAtbjFweCAiaHNhIiAtbjJweCAiZWNvIiAgIC1tYyAiYnlfbWV0YW5ldHgiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNS9vdXRwdXRzL2RhdGFzZXRfNjU4YmM0MGMtODNkZC00ODc5LThhNjgtZDk3NjQ5ODRlNTEwLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgaU1MMTUxNQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBpTUwxNTE1CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfOTE4YTI1OWJfZjhmZl80NDRiX2E5YjZfYTNiYjViZmI4YjI5CiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBJbXBvcnRpbmcgbmV0d29yayAxLi4uIERvbmUuCiAgICAgIEltcG9ydGluZyBuZXR3b3JrIDIuLi4gRG9uZS4KICAgICAgQ3JlYXRpbmcgbWV0YS1uZXR3b3JrLi4uIERvbmUuCiAgICAgIEV4cG9ydGluZyBNZXRhTmV0d29yay4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZXh0ZXJuYWwxIHwgYCAicyIgYCB8CiAgICAgICB8IGV4dGVybmFsMiB8IGAgImUiIGAgfAogICAgICAgfCBuMXByZWZpeCB8IGAgImhzYSIgYCB8CiAgICAgICB8IG4ycHJlZml4IHwgYCAiZWNvIiBgIHwKICAgICAgIHwga2VlcENvbXBhcnRtZW50IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZmlyc3RJc01ldGEgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnaW5nQ3JpdGVyaW9uIHwgYCAiYnlfbWV0YW5ldHgiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRGlzdGFuY2VNYXRyaXggKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5EaXN0YW5jZU1hdHJpeCAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy80LzAvOC9kYXRhc2V0XzQwOGZiZDFkLWVhMmEtNGZlZC04Y2JiLTRiYTVhNGRhMWNhOS5kYXQiICAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC83L291dHB1dHMvZGF0YXNldF80OGI5Njc2NC0yYWNmLTRlZDktOWFlMS1jMGY3NjY0ZDRhOGYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHNlZWRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCBkZWdyZWUgfCBgIGZhbHNlIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0Rpc3RhbmNlTWF0cml4IChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMC9jLzYvZGF0YXNldF8wYzYzNzEzOC1hYmQ5LTRkNTEtODc1My1kYzZjZjAwYjQ2ZDcuZGF0IiAtc2MgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZC82LzUvZGF0YXNldF9kNjVlNjg3Ni1iNGRmLTQyMzgtOTNjNi1jNzk4ZTQ0NzhhNzYuZGF0IiAtZHcgLXUgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMC9vdXRwdXRzL2RhdGFzZXRfNmViMWQzOTAtZTVjOS00YzM3LTg2NmItZTk0MjgzYzI4NzRhLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlbW92aW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDEgc2lkZSBjb21wb3VuZHMgaWdub3JlZCBkdXJpbmcgZ3JhcGggYnVpbGQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBzZWVkRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCB0cnVlIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdEFubm90YXRpb25zIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkV4dHJhY3RBbm5vdGF0aW9ucyAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy85L2UvNy9kYXRhc2V0XzllNzhkZDI3LWQzODctNGFlNS1iY2NlLTExMTU3M2IxNjFjOC5kYXQiIC1leHBvcnQgIk1FVEFCT0xJVEUiIC1kYiAibWV0YW5ldHguY2hlbWljYWwiICAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMi9vdXRwdXRzL2RhdGFzZXRfYzVhMzlkNmUtYjUxMy00ODhjLTg3MTQtZGI1ZWMwMWJhZGZmLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgYW5ub3RhdGlvbnMgZm91bmQgZm9yIDExMC8xMTEgbWV0YWJvbGl0ZXMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGV4cG9ydCB8IGAgIk1FVEFCT0xJVEUiIGAgfAogICAgICAgfCBkYiB8IGAgIm1ldGFuZXR4LmNoZW1pY2FsIiBgIHwKICAgICAgIHwgdW5pcSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHNraXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdEFubm90YXRpb25zIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkV4dHJhY3RBbm5vdGF0aW9ucyAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8zLzEvYy9kYXRhc2V0XzMxYzY3MjRiLTUwYzYtNDNjMS05NjVjLWRhMDhlMDhiMjJiZi5kYXQiIC1leHBvcnQgIk1FVEFCT0xJVEUiIC1kYiAibWV0YW5ldHguY2hlbWljYWwiICAtc2tpcCAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE0L291dHB1dHMvZGF0YXNldF9lNzhhODk0Yy05YjFkLTRiOGEtYWMzMy1jYjViN2I4ODNiMTMuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBhbm5vdGF0aW9ucyBmb3VuZCBmb3IgMTEwLzExMSBtZXRhYm9saXRlcwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZXhwb3J0IHwgYCAiTUVUQUJPTElURSIgYCB8CiAgICAgICB8IGRiIHwgYCAibWV0YW5ldHguY2hlbWljYWwiIGAgfAogICAgICAgfCB1bmlxIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgc2tpcCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0V4dHJhY3RBbm5vdGF0aW9ucyAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5FeHRyYWN0QW5ub3RhdGlvbnMgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNS9iL2MvZGF0YXNldF81YmNkYjE4Yy1hNzBjLTRiODEtOWM3MS04ZWUzNzNjN2EyMDUuZGF0IiAtZXhwb3J0ICJNRVRBQk9MSVRFIiAtZGIgIm1ldGFuZXR4LmNoZW1pY2FsIiAtdW5pcSAtc2tpcCAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE2L291dHB1dHMvZGF0YXNldF9kZGZlYzRlZC04NmE4LTQ1OTMtYjY4Mi00N2M5ODA0M2VjNTkuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBhbm5vdGF0aW9ucyBmb3VuZCBmb3IgMTEwLzExMSBtZXRhYm9saXRlcwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZXhwb3J0IHwgYCAiTUVUQUJPTElURSIgYCB8CiAgICAgICB8IGRiIHwgYCAibWV0YW5ldHguY2hlbWljYWwiIGAgfAogICAgICAgfCB1bmlxIHwgYCB0cnVlIGAgfAogICAgICAgfCBza2lwIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdFBhdGh3YXlzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkV4dHJhY3RQYXRod2F5cyAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9lLzQvMi9kYXRhc2V0X2U0MjZkNDQ0LWY1OTItNDA4NC05OGU0LWMzY2Y2OWRjOWU4OS5kYXQiIC1wICJDaXRyaWNfQWNpZF9DeWNsZStGb2xhdGVfTWV0YWJvbGlzbSt0b3RvIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE4L291dHB1dHMvZGF0YXNldF9lZDY5Mzg5ZC1hNTMyLTRhOTEtYmQ0OS03MjZmZTVlY2M2MjguZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBYZm0xMTU4CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgbmV0d29yayBleHBvcnRlZC4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgTnVtYmVyIG9mIHJlYWN0aW9ucyBpbiBvcmlnaW5hbCBuZXR3b3JrOiAxMTU4CiAgICAgIE51bWJlciBvZiBzcGVjaWVzIGluIG9yaWdpbmFsIG5ldHdvcms6IDExMDcKICAgICAgTnVtYmVyIG9mIGdlbmVzIGluIG9yaWdpbmFsIG5ldHdvcms6IDU3MQogICAgICBOdW1iZXIgb2YgcmVhY3Rpb25zIGluIHBhdGh3YXkgQ2l0cmljX0FjaWRfQ3ljbGUgKENpdHJpY19BY2lkX0N5Y2xlKTogMTEKICAgICAgTnVtYmVyIG9mIHNwZWNpZXMgaW4gcGF0aHdheSBDaXRyaWNfQWNpZF9DeWNsZSAoQ2l0cmljX0FjaWRfQ3ljbGUpOiAyNgogICAgICBOdW1iZXIgb2YgZ2VuZXMgaW4gcGF0aHdheSBDaXRyaWNfQWNpZF9DeWNsZSAoQ2l0cmljX0FjaWRfQ3ljbGUpOiAxOAogICAgICBOdW1iZXIgb2YgcmVhY3Rpb25zIGluIHBhdGh3YXkgRm9sYXRlX01ldGFib2xpc20gKEZvbGF0ZV9NZXRhYm9saXNtKTogNgogICAgICBOdW1iZXIgb2Ygc3BlY2llcyBpbiBwYXRod2F5IEZvbGF0ZV9NZXRhYm9saXNtIChGb2xhdGVfTWV0YWJvbGlzbSk6IDE2CiAgICAgIE51bWJlciBvZiBnZW5lcyBpbiBwYXRod2F5IEZvbGF0ZV9NZXRhYm9saXNtIChGb2xhdGVfTWV0YWJvbGlzbSk6IDgKICAgICAgRXJyb3I6IFBhdGh3YXkgdG90byBub3QgZm91bmQgaW4gbmV0d29yaywgcGxlYXNlIGNoZWNrIHNibWwgZmlsZS4KICAgICAgTnVtYmVyIG9mIHJlYWN0aW9ucyBpbiBuZXR3b3JrOiAxNwogICAgICBOdW1iZXIgb2Ygc3BlY2llcyBpbiBuZXR3b3JrOiAzNQogICAgICBOdW1iZXIgb2YgZ2VuZXMgaW4gbmV0d29yazogMjUKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHBhdGh3YXlJZCB8IGAgIkNpdHJpY19BY2lkX0N5Y2xlK0ZvbGF0ZV9NZXRhYm9saXNtK3RvdG8iIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdFN1YkJpcE5ldHdvcmsgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5FeHRyYWN0U3ViQmlwTmV0d29yayAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9kLzAvYS9kYXRhc2V0X2QwYWVkOGZiLWJkMDEtNDM3Yi1hZTJkLWFhOTc0ZmQ3ZTFmYy5kYXQiIC1zICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzIvNy8wL2RhdGFzZXRfMjcwMzMxNzgtNDI5NS00ZWJkLTlhOWMtYzcyOGM4MTA4MDAwLmRhdCIgLXQgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvOS8xLzQvZGF0YXNldF85MTRjMmJhNC1lYWE0LTQ3Y2MtYTUxNS04MzRmN2E3ZjRkZTEuZGF0IiAgLXNjICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2MvMC80L2RhdGFzZXRfYzA0MTNkOTEtNjNjOS00OGQyLWJlYjYtOWZiZTcwOTlmYjVkLmRhdCIgLWsgIjEiICAtZiAiZ21sIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIzL291dHB1dHMvZGF0YXNldF82YTM0MzcwNi1iYjEwLTQ3YTEtOWYwMi1jZTEzYjE1NmVhNDQuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgcmVhZGluZyBTQk1MLi4uCiAgICAgIGltcG9ydGluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBleHRyYWN0aW5nIHNvdXJjZXMgYW5kIHRhcmdldHMKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgYmxrZFJlYWN0aW9uRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgayB8IGAgIjEiIGAgfAogICAgICAgfCBzdCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9FeHRyYWN0U3ViTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLkV4dHJhY3RTdWJOZXR3b3JrIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzYvNC83L2RhdGFzZXRfNjQ3MDQwYTctYTM4OS00MGFkLTg5NWEtMTM0Y2U1MjE4MGNhLmRhdCIgLXMgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvYS9iLzEvZGF0YXNldF9hYjEzYWIyMy05MmVkLTQ3ZWQtYWViYy0zNjhiZjkzNjdkMGEuZGF0IiAtdCAiL3RtcC90bXA5OW53YjZ3My9maWxlcy82LzcvYS9kYXRhc2V0XzY3YTU2Y2YzLTgwMDYtNGJhNS04MDc0LTUxNjk3OTViMDU1My5kYXQiICAgIC1rICIxIiAgLWYgImdtbCIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yNy9vdXRwdXRzL2RhdGFzZXRfYjA1MTM0YjktYTM2Zi00NzhkLTkzZWMtM2UxYWFjZDRjOTgxLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgIGV4dHJhY3Rpbmcgc291cmNlcyBhbmQgdGFyZ2V0cwoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBHTUwgY3JlYXRlZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHdlaWdodEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGNoZW1pY2FsU2ltIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGsgfCBgICIxIiBgIHwKICAgICAgIHwgc3QgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfRXh0cmFjdFN1YlJlYWN0aW9uTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLkV4dHJhY3RTdWJSZWFjdGlvbk5ldHdvcmsgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZC9kL2MvZGF0YXNldF9kZGMxODE2Yi04MjgzLTQ1ZTQtOWNlNi0yZTgxOTdkYTQ5ZmEuZGF0IiAtcyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8yLzYvMi9kYXRhc2V0XzI2MmQzM2M2LTMxNGMtNGZjNC04NjI2LTYzOThhMzUwMWVmMS5kYXQiICAtdCAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9jLzMvNy9kYXRhc2V0X2MzNzUxZGNmLTM4ZDQtNDVjNC05YTg5LWU2MzQ1NWNlZDE3ZC5kYXQiIC1zYyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9lLzAvNC9kYXRhc2V0X2UwNDYwMDBiLWJjOGItNGQzNy1iZWM1LTc1MTI3ZDhhNWE5NS5kYXQiIC1rICIxIiAgLWYgImdtbCIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8zMi9vdXRwdXRzL2RhdGFzZXRfMzEyMTdlMjUtMTZjZi00Njg1LTk0ZTUtMTZjNzdlZGIzZjUzLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVsZW1lbnQgLy8gQ29weXJpZ2h0IDIwMjUgbGNvdHRyZXQgbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBub3QgZm91bmQgaW4gbmV0d29yawogICAgICBFbGVtZW50IC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyBub3QgZm91bmQgaW4gbmV0d29yawogICAgICBFbGVtZW50IC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBub3QgZm91bmQgaW4gbmV0d29yawogICAgICBFbGVtZW50IC8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgLy8gbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gbm90IGZvdW5kIGluIG5ldHdvcmsKICAgICAgRWxlbWVudCAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIEVsZW1lbnQgIG5vdCBmb3VuZCBpbiBuZXR3b3JrCiAgICAgIDE0IHNpZGUgY29tcG91bmRzIG5vdCBmb3VuZCBpbiBuZXR3b3JrLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICByZWFkaW5nIFNCTUwuLi4KICAgICAgUmVhZCBmaWxlIGNvbnRhaW5pbmcgc2lkZSBjb21wb3VuZHMuLi4KICAgICAgZXh0cmFjdGluZyBzb3VyY2VzIGFuZCB0YXJnZXRzCiAgICAgIEdNTCBjcmVhdGVkLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCBrIHwgYCAiMSIgYCB8CiAgICAgICB8IHN0IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZm9ybWF0IHwgYCAiZ21sIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0ZiY1RvTm90ZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuRmJjVG9Ob3RlcyAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8yLzcvYS9kYXRhc2V0XzI3YTMwYTQzLWJhYWMtNDgwMC1iYWMwLTM0YjZlNTBmYmM1MS5kYXQiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMzQvb3V0cHV0cy9kYXRhc2V0XzE1N2E2MTZiLWM1ZDctNDkxYy1hNjk2LWI2YWQyYmQ4MWYxZS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgaU1MMTUxNQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBpTUwxNTE1CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBpTUwxNTE1CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaGFzUHJvcGVydHksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBoYXNQcm9wZXJ0eSwgc2V0IHRvIEhBU19QUk9QRVJUWQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX0dldEJpZ2dNb2RlbFByb3Rlb21lIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBiaWdnLkdldEJpZ2dNb2RlbFByb3Rlb21lIC1tICJlX2NvbGlfY29yZSIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8zNS9vdXRwdXRzL2RhdGFzZXRfYTlhN2FmMmItMzIxZi00NmQ1LWE4ZjQtNThmMWJhZTA0MDE2LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IG1vZGVsSWQgfCBgICJlX2NvbGlfY29yZSIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgImRhdGEiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0RW50aXRpZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuR2V0RW50aXRpZXMgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZS80LzkvZGF0YXNldF9lNDllMmU4My0wM2NmLTQ0ZDUtYmY2Yi1lNDk4ZGUwNjYyZjguZGF0IiAgICAgICAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzM3L291dHB1dHMvZGF0YXNldF9mNzgxZDA1OC1iM2IzLTQ1NmEtODA0ZC1iZjk0ZDg3YzhhZjkuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHByaW50TWV0YWJvbGl0ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBwcmludFJlYWN0aW9ucyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHByaW50Q29tcGFydG1lbnRzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcHJpbnRQYXRod2F5cyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHByaW50R2VuZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBub1R5cGVDb2wgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0RW50aXRpZXMgKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuR2V0RW50aXRpZXMgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvYy85L2EvZGF0YXNldF9jOWFlYzAwZS1mNjdkLTRlY2ItOWVjMC02MDA1YTE3ZWUwYmYuZGF0IiAtbSAtciAtYyAgLWcgLW50IC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMzkvb3V0cHV0cy9kYXRhc2V0X2MzNTgxMmM3LTc0MjktNDVkYS1iMWMxLWY5ZjAzNGM2ZmI0Ny5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgcHJpbnRNZXRhYm9saXRlcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcHJpbnRSZWFjdGlvbnMgfCBgIHRydWUgYCB8CiAgICAgICB8IHByaW50Q29tcGFydG1lbnRzIHwgYCB0cnVlIGAgfAogICAgICAgfCBwcmludFBhdGh3YXlzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcHJpbnRHZW5lcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbm9UeXBlQ29sIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0R2VuZXNGcm9tUmVhY3Rpb25zIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkdldEdlbmVzRnJvbVJlYWN0aW9ucyAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9jLzQvZC9kYXRhc2V0X2M0ZDRlMjdlLTIwNTItNDQ1Zi04MDY4LWRhYmM5NWExZTgwNC5kYXQiIC1yICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzYvMy9jL2RhdGFzZXRfNjNjNTBkYjgtNTA0ZS00MjhmLTlmMzYtY2UwMDUzZWVjNDI0LmRhdCIgLXNlcCAiCSIgIC1jb2wgIjEiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNDIvb3V0cHV0cy9kYXRhc2V0Xzc3YWZhOTM1LTBmM2ItNDA1YS04NWRiLTMzMjA4MDE0ZmQzMC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgcmVhY3Rpb25zIG1hcHBlZAogICAgICAwIHJlYWN0aW9ucyBub3QgZm91bmQgaW4gbW9kZWwKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNlcCB8IGAgIlx0IiBgIHwKICAgICAgIHwgaGFzSGVhZGVyIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgaSB8IGAgIjEiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0TWV0YWJvbGl0ZUF0dHJpYnV0ZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuR2V0TWV0YWJvbGl0ZUF0dHJpYnV0ZXMgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMy8wL2MvZGF0YXNldF8zMGM1ODBkYS04ZjM4LTQ0MjEtYTJjMC0xOTM0YzYzODc1OWEuZGF0IiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzQ0L291dHB1dHMvZGF0YXNldF9kNmE4MTI5MS1kZmJjLTQ1NTItYWIzZS0zY2RjNmJhZWE5Y2MuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfR2V0UmVhY3RhbnRzRnJvbVJlYWN0aW9ucyAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5HZXRSZWFjdGFudHNGcm9tUmVhY3Rpb25zIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2QvYS9kL2RhdGFzZXRfZGFkOWNmY2EtMDJkYS00ZGFlLTgwYzMtNTI0MmM4MTQ0ODkwLmRhdCIgLXIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNi9iL2YvZGF0YXNldF82YmYxYThhMS01NDQyLTQ5MjctYTFjNS04YmZiYTlmNGExOGEuZGF0IiAtc2VwICIJIiAgLWNvbCAiMSIgICAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzQ3L291dHB1dHMvZGF0YXNldF83ZWUyMzA4YS05YWMwLTQ2NjctOTk2NC0wYTAwZGY2NGMyYWYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIHJlYWN0aW9ucyBtYXBwZWQKICAgICAgMCByZWFjdGlvbnMgbm90IGZvdW5kIGluIG1vZGVsCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBzZXAgfCBgICJcdCIgYCB8CiAgICAgICB8IGhhc0hlYWRlciB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGkgfCBgICIxIiBgIHwKICAgICAgIHwgcHJpbnRTdWJzdHJhdGVzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcHJpbnRQcm9kdWN0cyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9HZXRSZWFjdGFudHNGcm9tUmVhY3Rpb25zIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkdldFJlYWN0YW50c0Zyb21SZWFjdGlvbnMgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNC85LzkvZGF0YXNldF80OTlkMDkxYi1mNzY2LTQzZDItYTgzZi1hZDA0NzQ3YjAxNzUuZGF0IiAtciAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9jLzUvZS9kYXRhc2V0X2M1ZTgzNWZiLTFhOGQtNDI3My05OTlhLTJmYWU4MDNhY2ViYy5kYXQiIC1zZXAgIgkiICAtY29sICIxIiAtcyAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC81MC9vdXRwdXRzL2RhdGFzZXRfOTgwMGI0ZjYtZDRhNS00MGY0LThiMWItZDAyZWVlMDM5YjExLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMiByZWFjdGlvbnMgbWFwcGVkCiAgICAgIDAgcmVhY3Rpb25zIG5vdCBmb3VuZCBpbiBtb2RlbAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgc2VwIHwgYCAiXHQiIGAgfAogICAgICAgfCBoYXNIZWFkZXIgfCBgIGZhbHNlIGAgfAogICAgICAgfCBpIHwgYCAiMSIgYCB8CiAgICAgICB8IHByaW50U3Vic3RyYXRlcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcHJpbnRQcm9kdWN0cyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9HZXRSZWFjdGFudHNGcm9tUmVhY3Rpb25zIChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLkdldFJlYWN0YW50c0Zyb21SZWFjdGlvbnMgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNi82L2QvZGF0YXNldF82NmQxZTY3MS0xYTJiLTQ1MDQtYmVkMy1hMWE1NzczZGFmNGQuZGF0IiAtciAiL3RtcC90bXA5OW53YjZ3My9maWxlcy82L2IvZC9kYXRhc2V0XzZiZGJiM2I3LWM3OGItNGM2Yi04MmIwLWUxNWVmZWRjN2U2OC5kYXQiIC1zZXAgIgkiICAtY29sICIxIiAgLXAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC81My9vdXRwdXRzL2RhdGFzZXRfNjgxNGE1NTAtYTZjMS00MGZjLWFlZTctYzNkNzZkYjhlMGFhLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMiByZWFjdGlvbnMgbWFwcGVkCiAgICAgIDAgcmVhY3Rpb25zIG5vdCBmb3VuZCBpbiBtb2RlbAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgc2VwIHwgYCAiXHQiIGAgfAogICAgICAgfCBoYXNIZWFkZXIgfCBgIGZhbHNlIGAgfAogICAgICAgfCBpIHwgYCAiMSIgYCB8CiAgICAgICB8IHByaW50U3Vic3RyYXRlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHByaW50UHJvZHVjdHMgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9Mb2FkUG9pbnQgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5Mb2FkUG9pbnQgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvYy83L2YvZGF0YXNldF9jN2ZjYTViNi01NzVlLTRjNzUtODRjNy03YWRjYWMzZWYyM2MuZGF0IiAtayAiMSIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC81NS9vdXRwdXRzL2RhdGFzZXRfYzAwNGZhNmEtNzAzMi00ZmY3LTg5M2QtMGI0NTFmNmM0OGM2LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBuZXR3b3JrLi4uCiAgICAgIENvbXB1dGluZyBsb2FkIHBvaW50cy4uLgogICAgICBFeHBvcnQgcmVzdWx0cy4uLgogICAgICBkb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgc2lkZUNvbXBvdW5kRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgayB8IGAgIjEiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfTWV0YWJvUmFuayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLk1ldGFib1JhbmsgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNy85L2YvZGF0YXNldF83OWZhYWZmMC05OGEwLTRmOWMtYmJiZS05ZGI1MjNjMTlmMzIuZGF0IiAtcyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8xL2QvNi9kYXRhc2V0XzFkNjc3N2I2LTY5NDItNDFlYy1iYjQxLTRkMTc2M2UyYTJhYy5kYXQiIC1zYyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9lLzUvYi9kYXRhc2V0X2U1YjAwYWEyLTM3YzItNDVlMS05YzAwLWUwZDBkNDhlOTc1YS5kYXQiIC1tYXggIjE1MDAwIiAtdCAiMC4wMDEiIC1kICIwLjg1IiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzU5L291dHB1dHMvZGF0YXNldF8zMTY2NGUyMi1kMWVlLTRhMmItODUyMC01OWNhM2E0MmEyZjMuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICAyIGlzb2xhdGVkIG5vZGVzIHJlbW92ZWQgCiAgICAgIHRyYW5zaXRpb24gcHJvYmFiaWxpdGllcyBjb21wdXRlZAogICAgICB0cmFuc2l0aW9uIHByb2JhYmlsaXRpZXMgY29tcHV0ZWQgKHJldmVyc2UgZ3JhcGgpCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBjb21wb3VuZCBncmFwaCBjcmVhdGVkLgogICAgICByZW1vdmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICA2IGNvbXBvdW5kcyByZW1vdmVkLgogICAgICB3ZWlnaHRzIGNvbXB1dGVkLgogICAgICByZXZlcnNlIGdyYXBoIGNyZWF0ZWQuCiAgICAgIHNlZWRzIGZpbGUgaW1wb3J0ZWQKICAgICAgMyBzZWVkcwogICAgICBnbG9iYWwgcGFnZVJhbmsgY29tcHV0ZWQKICAgICAgZ2xvYmFsIGNoZWlSYW5rIGNvbXB1dGVkCiAgICAgIHBhZ2VSYW5rIGNvbXB1dGVkCiAgICAgIGNoZWlSYW5rIGNvbXB1dGVkCiAgICAgIGRvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBlZGdlV2VpZ2h0c0ZpbGVQYXRocyB8IGAgTm9uZSBgIHwKICAgICAgIHwgbWF4TmJPZkl0ZXIgfCBgICIxNTAwMCIgYCB8CiAgICAgICB8IHRvbGVyYW5jZSB8IGAgIjAuMDAxIiBgIHwKICAgICAgIHwgZGFtcGluZ0ZhY3RvciB8IGAgIjAuODUiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfTmV0d29ya1N1bW1hcnkgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5OZXR3b3JrU3VtbWFyeSAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy84L2UvZS9kYXRhc2V0XzhlZTI4MWQzLWRkNDgtNDU4Yy05OWViLTAyZDg2ODhiZDdhNi5kYXQiICAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC82MS9vdXRwdXRzL2RhdGFzZXRfYmQ1M2I2ZGMtMDQxNi00M2UwLWFkMTEtYWRlMzVkNjljNmY4LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBncmFwaC4uLgogICAgICBwZXJmb3JtIGJhc2ljIGFuYWx5c2lzLi4uCiAgICAgIGV4dHJhY3QgY29ubmVjdGVkIGNvbXBvbmVudC4uLgogICAgICBDb21wdXRlIGRlbnNpdHkuLi4KICAgICAgQ29tcHV0ZSBsb2NhbCBjbHVzdGVyaW5nIGNvZWZmaWNpZW50cy4uLgogICAgICBDb21wdXRlIGRlZ3JlZSBzdGF0aXN0aWNzLi4uCiAgICAgIENvbXB1dGUgZGlzdGFuY2VzLi4uCiAgICAgIENvbXB1dGUgZGlzdGFuY2VzIHN0YXRpc3RpY3MuLi4KICAgICAgQ29tcHV0ZSBjZW50cmFsaXR5Li4uCiAgICAgIAlDbG9zZW5lc3MgZG9uZS4KICAgICAgRG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHNraXBkaXN0IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZGlyZWN0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfT1JBcGF0aHdheUVucmljaG1lbnQgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG1hcHBpbmcuT1JBcGF0aHdheUVucmljaG1lbnQgLXRoICIwLjAiIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzcvNS9lL2RhdGFzZXRfNzVlZGEyNTUtNzIyNC00ZGEzLThmZTQtMDAyMzlkZDRlNjE3LmRhdCIgLWQgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMC8zL2YvZGF0YXNldF8wM2YyN2I2Yy00Yzc4LTRiMzEtOGQ3Mi1lY2VjNWZhN2FhM2QuZGF0IiAtYyAiQmVuamFtaW5pSG9jaGJlcmciIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNjQvb3V0cHV0cy9kYXRhc2V0XzhkNTg1ZTEyLWRiYWQtNDNkZC1hMDJmLWE5YjlmMjMzM2U1ZS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCiAgICAgIEltcG9ydCBkYXRhLi4uCiAgICAgIDMgY29tcG91bmRzIGltcG9ydGVkLgogICAgICAgRG9uZS4KICAgICAgUGVyZm9ybSBQYXRod2F5IEVucmljaG1lbnQuLi4gRG9uZS4KICAgICAgRXhwb3J0IHJlc3VsdHMuLi4KICAgICAgZG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHRoIHwgYCAiMC4wIiBgIHwKICAgICAgIHwgY29yciB8IGAgIkJlbmphbWluaUhvY2hiZXJnIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX09SQXBhdGh3YXlFbnJpY2htZW50IChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBtYXBwaW5nLk9SQXBhdGh3YXlFbnJpY2htZW50IC10aCAiMC4wMDUiIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzIvYS9hL2RhdGFzZXRfMmFhNWZkZmYtZWYzNS00ODBiLWE4YzMtNzEzYTc0NTNiYjk4LmRhdCIgLWQgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZS9jLzMvZGF0YXNldF9lYzNjMWRkNS0zNTNmLTQ1OGEtODBhMi00ZmNiY2ZmZTBlYzIuZGF0IiAtYyAiSG9sbUJvbmZlcnJvbmkiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNjcvb3V0cHV0cy9kYXRhc2V0XzkxNzA1YWE0LTU1MjUtNGUxZS04YTUwLWI2ZDk4ZGU2ZTYwZS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCiAgICAgIEltcG9ydCBkYXRhLi4uCiAgICAgIDMgY29tcG91bmRzIGltcG9ydGVkLgogICAgICAgRG9uZS4KICAgICAgUGVyZm9ybSBQYXRod2F5IEVucmljaG1lbnQuLi4gRG9uZS4KICAgICAgU2VsZWN0IHNpZ25pZmljYW50IHBhdGh3YXlzLi4uCiAgICAgIAkyIHNpZ25pZmljYW50IHBhdGh3YXlzIGZvdW5kLgogICAgICAgRG9uZS4KICAgICAgRXhwb3J0IHJlc3VsdHMuLi4KICAgICAgZG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHRoIHwgYCAiMC4wMDUiIGAgfAogICAgICAgfCBjb3JyIHwgYCAiSG9sbUJvbmZlcnJvbmkiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUHJlY3Vyc29yTmV0d29yayAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlByZWN1cnNvck5ldHdvcmsgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvOS9hL2IvZGF0YXNldF85YWI4YmRjNy03YTM5LTRjMDctYTczOS0wZTU4NzA1ODI0NDcuZGF0IiAtdCAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8xL2QvYS9kYXRhc2V0XzFkYWI2Y2EzLWJjN2EtNDBhYi05ZGZiLWI3OTNhMGMzY2RmZC5kYXQiIC1mICJnbWwiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNzAvb3V0cHV0cy9kYXRhc2V0XzlhNDlkM2Q0LTU3MjUtNDk5YS1iM2I1LWU2NWVjYzhiODIwMC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBHTUwgY3JlYXRlZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHJlYWN0aW9uVG9JZ25vcmVGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlJlYWN0aW9uRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvYi8xL2MvZGF0YXNldF9iMWM2NjFlMS0xYjY5LTRjMTAtODYxMC02MTBmYjYzNDg4OGEuZGF0IiAgIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNzIvb3V0cHV0cy9kYXRhc2V0X2QwOTM2OTRhLWJiNmMtNGExOS1hOGM0LWEwZjVlNjM4OWViMS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1JlYWN0aW9uRGlzdGFuY2VNYXRyaXggKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5SZWFjdGlvbkRpc3RhbmNlTWF0cml4IC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2QvMS85L2RhdGFzZXRfZDE5ZmZhMTYtOWExZC00ZjcwLWExNDgtZmJhNzQ1YTllNWY5LmRhdCIgIC11IC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvNzQvb3V0cHV0cy9kYXRhc2V0Xzc1YWI1NGMwLWU2NDQtNDVmMi04N2Q2LThhZDI1MTAzYjkzMi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlJlYWN0aW9uRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvOC8xL2MvZGF0YXNldF84MWNhOGU1ZC1jNWU0LTQzYjgtYWEwMC0wNGYwOTVmMDE5NmIuZGF0IiAtc2MgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvOC9lLzMvZGF0YXNldF84ZTM1OWM5OS1kZDllLTQyNmItYTc4My02ZTYwNzEyZWYyYzMuZGF0IiAgLXUgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC83Ny9vdXRwdXRzL2RhdGFzZXRfMjNhZDYwMDEtY2EzMS00ODJkLWJhOGUtZmJmYWY2ZDM2YjlkLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICAxIHNpZGUgY29tcG91bmRzIHRvIGlnbm9yZSBkdXJpbmcgZ3JhcGggYnVpbGQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJFeGNsdWRlIHwgYCBOb25lIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAoVGVzdCAjIDQpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlJlYWN0aW9uRGlzdGFuY2VNYXRyaXggLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvYS85L2UvZGF0YXNldF9hOWVkOWI2Yi1jMzMyLTQyMDAtOWQyNC00YTM3MzI5ODM1NWQuZGF0IiAgLXJlICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzUvMS8wL2RhdGFzZXRfNTEwYzRiMGEtYmYyZS00YTY4LTgwZjctMDE2N2Q1ZThhNTcxLmRhdCIgLXUgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC84MC9vdXRwdXRzL2RhdGFzZXRfNjRlYzVjY2UtODQ0Ny00MzlkLWIwM2UtMWJmZTMyYmFkOTJmLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLgogICAgICByZW1vdmluZyByZWFjdGlvbnMgdG8gZXhjbHVkZS4uLgogICAgICAxIHJlYWN0aW9ucyBpZ25vcmVkIGR1cmluZyBncmFwaCBidWlsZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVDb21wb3VuZEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJ4bkZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHdlaWdodEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9SZWFjdGlvbkRpc3RhbmNlTWF0cml4IChUZXN0ICMgNSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8zLzAvNy9kYXRhc2V0XzMwNzQyYjliLTU4NDEtNDAxNS1hYTI0LTc0MmY1MmQ1M2ZkNi5kYXQiIC1zYyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy81LzgvZC9kYXRhc2V0XzU4ZDE0MGQ5LTIzZDktNGI4Ny05OTY2LWY0ZGMyMDI3NmNiNi5kYXQiICAtcmUgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNi9lLzAvZGF0YXNldF82ZTA3ODQzOS0xNDA4LTQ4YWYtYThlMS1lMjVlODliMWYzZTEuZGF0IiAtdSAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzg0L291dHB1dHMvZGF0YXNldF83OWQzYTlkNi05OTQ3LTQ0ZDctYmUwMy0xNWM0OTZlOGI5NmEuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDEgc2lkZSBjb21wb3VuZHMgdG8gaWdub3JlIGR1cmluZyBncmFwaCBidWlsZAogICAgICByZW1vdmluZyByZWFjdGlvbnMgdG8gZXhjbHVkZS4uLgogICAgICAxIHJlYWN0aW9ucyBpZ25vcmVkIGR1cmluZyBncmFwaCBidWlsZC4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGRlZ3JlZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJ4bkZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHdlaWdodEZpbGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9SZWFjdGlvbkRpc3RhbmNlTWF0cml4IChUZXN0ICMgNik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuUmVhY3Rpb25EaXN0YW5jZU1hdHJpeCAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy82LzkvZS9kYXRhc2V0XzY5ZWQ2MzAwLWM3OGYtNGE5My05MmE3LTBmNjE2MDRmMDY5ZC5kYXQiIC1zYyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy81L2YvZS9kYXRhc2V0XzVmZTQ2NzIyLTg0YTUtNDcxYy1hYzBjLWM5ZjU5NzI2NGY4NC5kYXQiICAtcmUgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZi85LzIvZGF0YXNldF9mOTIxYmU1MS1jZDI5LTQyOGYtYTJlMS0xODk3ZjE0N2JlODQuZGF0IiAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC84OC9vdXRwdXRzL2RhdGFzZXRfZmYzNDA2MmQtODE2MS00Y2JjLWIzODktYjdmMDk5MjRkMTczLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICAxIHNpZGUgY29tcG91bmRzIHRvIGlnbm9yZSBkdXJpbmcgZ3JhcGggYnVpbGQKICAgICAgcmVtb3ZpbmcgcmVhY3Rpb25zIHRvIGV4Y2x1ZGUuLi4KICAgICAgMSByZWFjdGlvbnMgaWdub3JlZCBkdXJpbmcgZ3JhcGggYnVpbGQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBkZWdyZWUgfCBgIGZhbHNlIGAgfAogICAgICAgfCByeG5GaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NibWwyQ2FyYm9uU2tlbGV0b25OZXQgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy85L2UvOS9kYXRhc2V0XzllOWNkZGI2LTZmMGMtNDIwMS1hNjljLTZiZmQyNGNjOWE0Yy5kYXQiIC1nICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2IvYS84L2RhdGFzZXRfYmE4N2VkNjQtYzkxYi00YzE1LTk3ODMtNzdkNjZlZTY2N2RiLmRhdCIgICAgICAgLWYgImdtbCIgICAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzkxL291dHB1dHMvZGF0YXNldF8yOGQxMDkxNS04OWQ1LTQxNzMtOGYwYS1lMWZhZmJjYzc3NWQuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIDExMSBub2RlcyBhbmQgMjAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgIEV4cG9ydGluZy4uLkdNTCBjcmVhdGVkLgogICAgICAgRG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGtlZXBTaW5nbGVDYXJib24gfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnZUNvbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnZUVkZ2VzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcmVtb3ZlSXNvbGF0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY29tcHV0ZVdlaWdodCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IG1haW4gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmcm9tSW5kZXhlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNhcmJvblNrZWxldG9uTmV0IChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ2FyYm9uU2tlbGV0b25OZXQgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMS85L2YvZGF0YXNldF8xOWY5OWYzYS04ZTkzLTQzNTYtOGJhMC01NjJjMjI1MWU0ZmUuZGF0IiAtZyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy84LzMvNS9kYXRhc2V0XzgzNTRiN2UzLTk5YmQtNDg5OC1iOTBmLTRhNTkyYzA3MDNjMi5kYXQiIC1rcyAgICAgIC1mICJnbWwiICAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC85NC9vdXRwdXRzL2RhdGFzZXRfMTI1MDU3NmUtZDFmMy00YzMwLWE5NTktYzVhYzc4MjRkMzY0LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgMCBlZGdlcyBpbiBmaWxlIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGgKICAgICAgMjA1IHdlaWdodHMgc2V0IGFtb25nIDUwMiBlZGdlcyBpbiBncmFwaAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi43NSByZWFjdGlvbnMgYW5kIDExMSBtZXRhYm9saXRlcyByZWFkLgogICAgICAgRG9uZS4KICAgICAgQnVpbGRpbmcgTmV0d29yay4uLjExMSBub2RlcyBhbmQgNTAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgICBEb25lLgogICAgICBQcm9jZXNzaW5nIGF0b20gbWFwcGluZ3MuLi5Eb25lLgogICAgICAxMTEgbm9kZXMgYW5kIDIwNSBlZGdlcyBjcmVhdGVkLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBrZWVwU2luZ2xlQ2FyYm9uIHwgYCB0cnVlIGAgfAogICAgICAgfCBtZXJnZUNvbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtZXJnZUVkZ2VzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcmVtb3ZlSXNvbGF0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY29tcHV0ZVdlaWdodCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IG1haW4gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmcm9tSW5kZXhlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNhcmJvblNrZWxldG9uTmV0IChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ2FyYm9uU2tlbGV0b25OZXQgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNy8zL2MvZGF0YXNldF83M2M5NTFkMC05NmRiLTRkNGQtOGM2My0zN2Y2OWFjNTdhOWYuZGF0IiAtZyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9lLzAvOS9kYXRhc2V0X2UwOTg4NTk2LWM5MmEtNGIyYy1hOGI5LTU3Y2RkMGNhYTY5Zi5kYXQiICAtbWMgICAgIC1mICJnbWwiICAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC85Ny9vdXRwdXRzL2RhdGFzZXRfZGQwY2Q5NTMtZDJjOC00ZmUyLTljNGItZTUwODU3ODg1NWRhLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgMCBlZGdlcyBpbiBmaWxlIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGgKICAgICAgMjA1IHdlaWdodHMgc2V0IGFtb25nIDUwMiBlZGdlcyBpbiBncmFwaAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi43NSByZWFjdGlvbnMgYW5kIDExMSBtZXRhYm9saXRlcyByZWFkLgogICAgICAgRG9uZS4KICAgICAgQnVpbGRpbmcgTmV0d29yay4uLjExMSBub2RlcyBhbmQgNTAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgICBEb25lLgogICAgICBQcm9jZXNzaW5nIGF0b20gbWFwcGluZ3MuLi5Eb25lLgogICAgICBNZXJnaW5nIGNvbXBhcnRtZW50cy4uLiBEb25lLgogICAgICBTa2lwIGNvbXBvdW5kcyB3aXRoIGxlc3MgdGhhbiB0d28gY2FyYm9ucyBkZXRlY3RlZC4uLgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIDgzIG5vZGVzIGFuZCAyMDIgZWRnZXMgY3JlYXRlZC4KICAgICAgRXhwb3J0aW5nLi4uR01MIGNyZWF0ZWQuCiAgICAgICBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAoVGVzdCAjIDQpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkNhcmJvblNrZWxldG9uTmV0IC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2UvOC81L2RhdGFzZXRfZTg1ZGIxNjEtZGIwYi00NjhjLWFlMzgtNzRhNDc1NjE2MTdiLmRhdCIgLWcgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNy9mL2UvZGF0YXNldF83ZmU2YTkzNC1mYWJkLTQ0MzEtYjU5My1hMTc5YTQ0M2EwNTAuZGF0IiAgIC1tZSAgICAtZiAiZ21sIiAgIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTAwL291dHB1dHMvZGF0YXNldF8zZGJmZTQ0YS1lZWYyLTRlZjgtYjllNi1jYmY5NzRhZGM1Y2UuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIE1lcmdpbmcgZWRnZXMuLi4gRG9uZS4KICAgICAgMTExIG5vZGVzIGFuZCAxNDMgZWRnZXMgY3JlYXRlZC4KICAgICAgRXhwb3J0aW5nLi4uR01MIGNyZWF0ZWQuCiAgICAgICBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIHRydWUgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAoVGVzdCAjIDUpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkNhcmJvblNrZWxldG9uTmV0IC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzQvNi9jL2RhdGFzZXRfNDZjMjljOTUtNDc0ZC00NDM0LWFhNDAtZDA1NTMwNDJhNWE1LmRhdCIgLWcgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNy82LzkvZGF0YXNldF83NjlkZTU5Zi04ZDllLTQzMGItODNiYy1hZWFhMjM1YzVhZTYuZGF0IiAgICAtcmkgICAtZiAiZ21sIiAgIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTAzL291dHB1dHMvZGF0YXNldF82MTU4YWI4ZC00MjFmLTRiNGEtYjFiNC00ZmQzZTg3MmNmYjUuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCiAgICAgIDE2IGlzb2xhdGVkIG5vZGVzIHJlbW92ZWQgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIFJlbW92ZSBpc29sYXRlZCBub2Rlcy4uLgogICAgICAJcmVtb3ZpbmcgQ08yCiAgICAgIAlyZW1vdmluZyBIMk8KICAgICAgCXJlbW92aW5nIGZydWN0b3NlLTMtcGhvc3BoYXRlCiAgICAgIAlyZW1vdmluZyAzLWtldG8tYmV0YS1ELWdhbGFjdG9zZQogICAgICAJcmVtb3ZpbmcgZ2FsYWN0b3NlCiAgICAgIAlyZW1vdmluZyBIMk8KICAgICAgCXJlbW92aW5nIEgrCiAgICAgIAlyZW1vdmluZyBIMk8KICAgICAgCXJlbW92aW5nIEgyTwogICAgICAJcmVtb3ZpbmcgSCsKICAgICAgCXJlbW92aW5nIEgrCiAgICAgIAlyZW1vdmluZyBQUGkKICAgICAgCXJlbW92aW5nIGZydWN0b3NlCiAgICAgIAlyZW1vdmluZyBDTzIKICAgICAgCXJlbW92aW5nIFBpCiAgICAgIAlyZW1vdmluZyBIKwogICAgICAgRG9uZS4KICAgICAgOTUgbm9kZXMgYW5kIDIwMiBlZGdlcyBjcmVhdGVkLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBrZWVwU2luZ2xlQ2FyYm9uIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VDb21wIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY29tcHV0ZVdlaWdodCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZvcm1hdCB8IGAgImdtbCIgYCB8CiAgICAgICB8IG1haW4gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmcm9tSW5kZXhlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNhcmJvblNrZWxldG9uTmV0IChUZXN0ICMgNik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ2FyYm9uU2tlbGV0b25OZXQgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNi81L2MvZGF0YXNldF82NWMwMWE5MC0zN2JhLTQ3MTUtODljOC1lYWNmNzAzMGJjYTEuZGF0IiAtZyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9mL2IvNy9kYXRhc2V0X2ZiN2Q2ZThiLTM2OWMtNDIzYS04OTZhLTVkYzRjMTY4NjM5MS5kYXQiICAgICAtdW4gIC1mICJnbWwiICAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMDYvb3V0cHV0cy9kYXRhc2V0X2E4NzMyYTU0LTAyMjQtNDIwMy04MzYyLTlmZTA0YWE4ZmZmMS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIDAgZWRnZXMgaW4gZmlsZSBub3QgZm91bmQgaW4gdGhlIGdyYXBoCiAgICAgIDIwNSB3ZWlnaHRzIHNldCBhbW9uZyA1MDIgZWRnZXMgaW4gZ3JhcGgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uNzUgcmVhY3Rpb25zIGFuZCAxMTEgbWV0YWJvbGl0ZXMgcmVhZC4KICAgICAgIERvbmUuCiAgICAgIEJ1aWxkaW5nIE5ldHdvcmsuLi4xMTEgbm9kZXMgYW5kIDUwMiBlZGdlcyBjcmVhdGVkLgogICAgICAgRG9uZS4KICAgICAgUHJvY2Vzc2luZyBhdG9tIG1hcHBpbmdzLi4uRG9uZS4KICAgICAgQ3JlYXRlIFVuZGlyZWN0ZWQuLi4gRG9uZS4KICAgICAgU2tpcCBjb21wb3VuZHMgd2l0aCBsZXNzIHRoYW4gdHdvIGNhcmJvbnMgZGV0ZWN0ZWQuLi4KICAgICAgCWRpc2Nvbm5lY3RpbmcgQ08yCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAgRG9uZS4KICAgICAgMTExIG5vZGVzIGFuZCAyNzAgZWRnZXMgY3JlYXRlZC4KICAgICAgRXhwb3J0aW5nLi4uR01MIGNyZWF0ZWQuCiAgICAgICBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAoVGVzdCAjIDcpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkNhcmJvblNrZWxldG9uTmV0IC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2YvMy84L2RhdGFzZXRfZjM4YTc5Y2UtNjhlZC00NDNmLTllZGMtOTZkYzg4MGYzYzE4LmRhdCIgLWcgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvYy83LzkvZGF0YXNldF9jNzk4OWFlNi03MDVmLTQ5OWUtYmU2ZC0xMTUzYzZlNmZiMzAuZGF0IiAgICAgICAtZiAibWF0cml4IiAgIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTA5L291dHB1dHMvZGF0YXNldF8zN2Q0ZTFjMC03NGU5LTQ5NTQtYWU2Yy02ODVhZDU4MGI4NTYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICAwIGVkZ2VzIGluIGZpbGUgbm90IGZvdW5kIGluIHRoZSBncmFwaAogICAgICAyMDUgd2VpZ2h0cyBzZXQgYW1vbmcgNTAyIGVkZ2VzIGluIGdyYXBoCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLjc1IHJlYWN0aW9ucyBhbmQgMTExIG1ldGFib2xpdGVzIHJlYWQuCiAgICAgICBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uMTExIG5vZGVzIGFuZCA1MDIgZWRnZXMgY3JlYXRlZC4KICAgICAgIERvbmUuCiAgICAgIFByb2Nlc3NpbmcgYXRvbSBtYXBwaW5ncy4uLkRvbmUuCiAgICAgIFNraXAgY29tcG91bmRzIHdpdGggbGVzcyB0aGFuIHR3byBjYXJib25zIGRldGVjdGVkLi4uCiAgICAgIAlkaXNjb25uZWN0aW5nIENPMgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgIERvbmUuCiAgICAgIDExMSBub2RlcyBhbmQgMjAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgIEV4cG9ydGluZy4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwga2VlcFNpbmdsZUNhcmJvbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlQ29tcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVuZGlyZWN0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjb21wdXRlV2VpZ2h0IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZm9ybWF0IHwgYCAibWF0cml4IiBgIHwKICAgICAgIHwgbWFpbiB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZyb21JbmRleGVzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NibWwyQ2FyYm9uU2tlbGV0b25OZXQgKFRlc3QgIyA4KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJDYXJib25Ta2VsZXRvbk5ldCAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9iL2YvMC9kYXRhc2V0X2JmMDBhZTg5LWVhNTgtNGM3MC1hNTA4LTc0ZmJhYjU0ZTNjOS5kYXQiIC1nICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2YvOC8zL2RhdGFzZXRfZjgzY2JmNTMtYTQxMy00NjAxLTllNGQtZWY3MzFlZGNkZjAwLmRhdCIgICAgICAgLWYgImdtbCIgIC1maSAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzExMi9vdXRwdXRzL2RhdGFzZXRfNWVkZTlmZmMtOGE2MS00NTExLWIxMGItNTU3NjAyYjM0NmIyLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBIdW1hbkdFTQogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgSHVtYW5HRU0KICAgICAgMCBlZGdlcyBpbiBmaWxlIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGgKICAgICAgMjA2IHdlaWdodHMgc2V0IGFtb25nIDUwMiBlZGdlcyBpbiBncmFwaAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi43NSByZWFjdGlvbnMgYW5kIDExMSBtZXRhYm9saXRlcyByZWFkLgogICAgICAgRG9uZS4KICAgICAgQnVpbGRpbmcgTmV0d29yay4uLjExMSBub2RlcyBhbmQgNTAyIGVkZ2VzIGNyZWF0ZWQuCiAgICAgICBEb25lLgogICAgICBQcm9jZXNzaW5nIGF0b20gbWFwcGluZ3MuLi5Eb25lLgogICAgICBTa2lwIGNvbXBvdW5kcyB3aXRoIGxlc3MgdGhhbiB0d28gY2FyYm9ucyBkZXRlY3RlZC4uLgogICAgICAJZGlzY29ubmVjdGluZyBDTzIKICAgICAgCWRpc2Nvbm5lY3RpbmcgQ08yCiAgICAgICBEb25lLgogICAgICAxMTEgbm9kZXMgYW5kIDIwMyBlZGdlcyBjcmVhdGVkLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBrZWVwU2luZ2xlQ2FyYm9uIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VDb21wIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBtYWluIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZnJvbUluZGV4ZXMgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMkNvbXBvdW5kR3JhcGggKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJDb21wb3VuZEdyYXBoIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzQvNy9iL2RhdGFzZXRfNDdiZjkzN2YtYzg3YS00OWM0LTlhYTItNjhiMWY5NWYxZTY4LmRhdCIgLXNjICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzIvZS8xL2RhdGFzZXRfMmUxNjBhYzMtNTQxNC00YjFiLWI2MTktY2ViMmVjZmY3OGY0LmRhdCIgLW1jICJubyIgICAgICAtZiAiZ21sIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzExNS9vdXRwdXRzL2RhdGFzZXRfOGZjNDdiMzgtMzUyZC00Yjc1LTlmNzMtNTkwMGU1ODk0YTRhLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCiAgICAgIEJ1aWxkaW5nIE5ldHdvcmsuLi4gRG9uZS4KICAgICAgcmVtb3Zpbmcgc2lkZSBjb21wb3VuZHMuLi4KICAgICAgUmVhZCBmaWxlIGNvbnRhaW5pbmcgc2lkZSBjb21wb3VuZHMuLi4KICAgICAgNiBjb21wb3VuZHMgcmVtb3ZlZC4KICAgICAgIERvbmUuCiAgICAgIEV4cG9ydGluZy4uLkdNTCBjcmVhdGVkLgogICAgICAgRG9uZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IG1lcmdpbmdTdHJhdCB8IGAgIm5vIiBgIHwKICAgICAgIHwgbWVyZ2VFZGdlcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNvbXB1dGVXZWlnaHQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJDb21wb3VuZEdyYXBoIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWwyQ29tcG91bmRHcmFwaCAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8yLzcvNi9kYXRhc2V0XzI3NjY3YTRlLTM0ZDItNDI5ZC1iNDNjLTI3ZTVjZjExMmMzOC5kYXQiIC1zYyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9mLzcvNS9kYXRhc2V0X2Y3NWQzNjE2LTVlZTctNDAzNi04NGNiLWZjNmQ3YWU0MWI0YS5kYXQiIC1tYyAiYnlfaWQiICAtcmkgLWR3IC11biAtdHAgLWYgImdtbCIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMTgvb3V0cHV0cy9kYXRhc2V0XzFlY2Y5OWVlLTUwNjktNDY2Yy04ODgzLTNiZjdlMTYzNTc2My5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIDEyIGlzb2xhdGVkIG5vZGVzIHJlbW92ZWQgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLiBEb25lLgogICAgICBCdWlsZGluZyBOZXR3b3JrLi4uIERvbmUuCiAgICAgIHJlbW92aW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDYgY29tcG91bmRzIHJlbW92ZWQuCiAgICAgICBEb25lLgogICAgICBDcmVhdGUgVW5kaXJlY3RlZC4uLiBEb25lLgogICAgICBTZXR0aW5nIGVkZ2Ugd2VpZ2h0cyAodGFyZ2V0IGRlZ3JlZSkuLi4KICAgICAgIERvbmUuCiAgICAgIE1lcmdpbmcgY29tcGFydG1lbnRzLi4uIERvbmUuCiAgICAgIFJlbW92ZSBpc29sYXRlZCBub2Rlcy4uLgogICAgICAJcmVtb3ZpbmcgTV9zX2MKICAgICAgCXJlbW92aW5nIERfR2x5Y2VyYWxkZWh5ZGUKICAgICAgCXJlbW92aW5nIHNuX0dseWNlcm9fM19waG9zcGhvZXRoYW5vbGFtaW5lCiAgICAgIAlyZW1vdmluZyBzbl9HbHljZXJvXzNfcGhvc3Bob2Nob2xpbmUKICAgICAgCXJlbW92aW5nIHNuX0dseWNlcm9fM19waG9zcGhvXzFfaW5vc2l0b2wKICAgICAgCXJlbW92aW5nIFAxX1A0X0Jpc181X19hZGVub3N5bF9fdGV0cmFwaG9zcGhhdGUKICAgICAgCXJlbW92aW5nIE1fY3lzX0RfYwogICAgICAJcmVtb3ZpbmcgTV9tZXRfRF9jCiAgICAgIAlyZW1vdmluZyBtZXRoYW5lc3VsZm9uYXRlCiAgICAgIAlyZW1vdmluZyBQMV9QNV9CaXNfNV9fYWRlbm9zeWxfX3BlbnRhcGhvc3BoYXRlCiAgICAgIAlyZW1vdmluZyBHbHljZXJvcGhvc3Bob2dseWNlcm9sCiAgICAgIAlyZW1vdmluZyBHbHljZXJvcGhvc3Bob3NlcmluZQogICAgICAgRG9uZS4KICAgICAgQ29tcHV0ZSB0cmFuc2l0aW9uIG1hdHJpeC4uLiBEb25lLgogICAgICBFeHBvcnRpbmcuLi5HTUwgY3JlYXRlZC4KICAgICAgIERvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBtZXJnaW5nU3RyYXQgfCBgICJieV9pZCIgYCB8CiAgICAgICB8IG1lcmdlRWRnZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCB0cnVlIGAgfAogICAgICAgfCB3ZWlnaHRGaWxlIHwgYCBOb25lIGAgfAogICAgICAgfCB1bmRpcmVjdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBjb21wdXRlV2VpZ2h0IHwgYCB0cnVlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJHcmFwaCAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkdyYXBoIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2QvNy9kL2RhdGFzZXRfZDdkYWM4NmMtY2EwNy00ZTUwLWEwZjEtMWE4M2VlMDhhMWMxLmRhdCIgIC1jICAtZiAiZ21sIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyMC9vdXRwdXRzL2RhdGFzZXRfNjkzZmQyYWEtN2JhMC00ZDY4LThlYzgtOTljODRkNjg5ZTg4LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBiaXBhcnRpdGUgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjb21wb3VuZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcmVhY3Rpb24gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJHcmFwaCAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkdyYXBoIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzkvZS83L2RhdGFzZXRfOWU3YWE2OWMtMGVmZi00ODQ4LWFjMTItNGMxZDUxMDdjNTczLmRhdCIgLWIgICAtZiAiZ21sIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyMi9vdXRwdXRzL2RhdGFzZXRfNTc5NWE1ZTEtOGQ0MS00Zjk3LWIyZmEtYzU4M2VkYzM3MWY5LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBiaXBhcnRpdGUgfCBgIHRydWUgYCB8CiAgICAgICB8IGNvbXBvdW5kIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcmVhY3Rpb24gfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJHcmFwaCAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMkdyYXBoIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzkvYS83L2RhdGFzZXRfOWE3MzViZmMtMmIyOS00ZDFhLThiYjItMTUxN2U4MGQxMzk2LmRhdCIgICAtciAtZiAiZ21sIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyNC9vdXRwdXRzL2RhdGFzZXRfMjJhNWVjMDktNTQxNi00ZWRmLThjZTctNmJjZGViZDYxY2ZjLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBiaXBhcnRpdGUgfCBgIGZhbHNlIGAgfAogICAgICAgfCBjb21wb3VuZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHJlYWN0aW9uIHwgYCB0cnVlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbDJUYWIgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuU2JtbDJUYWIgLWlyciAiLS0+IiAtcmV2ICI8PT0+IiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8xL2UvYy9kYXRhc2V0XzFlY2Y5NzEzLTZlMzgtNDE0NS04NDZiLWY4MDQwYzgwMzA1NC5kYXQiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTI2L291dHB1dHMvZGF0YXNldF9kNDUyOTUxOS1iMTUwLTRhNGYtYjc2YS0zYWRiNGZkOTFlODEuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGkgfCBgICItLT4iIGAgfAogICAgICAgfCByIHwgYCAiPD09PiIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sMlRhYiAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sMlRhYiAtaXJyICItPiIgLXJldiAiPSIgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZS84LzUvZGF0YXNldF9lODUxZGE4OC0zZDg4LTQwNDYtYTkwYi04YmQ1NDQ3NWM4ZWEuZGF0IiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEyOC9vdXRwdXRzL2RhdGFzZXRfMDBkNDFhZTctYmYxOS00OTA0LWJjYzUtMDQwN2IzZmEzYTliLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBpIHwgYCAiLT4iIGAgfAogICAgICAgfCByIHwgYCAiPSIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TYm1sV2l6YXJkIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlNibWxXaXphcmQgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZS9iLzQvZGF0YXNldF9lYjRmYmVkYi1iNTRkLTQwODMtOTMxZi1mOWFjZDcxMjdlNzkuZGF0IiAtcmljIC1yMCAtbWMgImJ5X2lkIiAtcmRyIC1yRVggInMiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTMwL291dHB1dHMvZGF0YXNldF9lYzRiNWViZS1jYmE3LTQwNzktYTdmZC0yYTdmY2E5NjJhNmIuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIEh1bWFuR0VNCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfMGQ2YzJlZWRfZTQ3Y180MjBkX2FmZWNfMjlkOWRjMzFlZDJmCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBCYWQgcHJvcGVydHkgaW4gYW5ub3RhdGlvbnM6IGlzRGVzY3JpYmVkQnksIHNldCB0byBIQVNfUFJPUEVSVFkKICAgICAgQmFkIHByb3BlcnR5IGluIGFubm90YXRpb25zOiBpc0Rlc2NyaWJlZEJ5LCBzZXQgdG8gSEFTX1BST1BFUlRZCiAgICAgIEJhZCBwcm9wZXJ0eSBpbiBhbm5vdGF0aW9uczogaXNEZXNjcmliZWRCeSwgc2V0IHRvIEhBU19QUk9QRVJUWQogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFJlYWRpbmcgU0JNTC4uLiBEb25lLgoKCiAgICAgIAljb21wYXJ0bWVudHM6CTUKICAgICAgCW1ldGFib2xpdGVzOgkxMTEKICAgICAgCXJlYWN0aW9uczoJNzUKICAgICAgCWVuenltZXM6CTg1CiAgICAgIAlnZW5lczoJODYKICAgICAgCXByb3RlaW46CTg2CiAgICAgIAlwYXRod2F5OgkzCgoKICAgICAgcmVtb3ZpbmcgcmVhY3Rpb24gd2l0aCBudWxsIGZsdXggYm91bmRzLi4uCiAgICAgIDAgImNsb3NlZCIgcmVhY3Rpb25zIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBleHRlcm5hbCBjb21wYXJ0bWVudC4uLgogICAgICAxMyBleHRlcm5hbCBzcGVjaWVzIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBpc29sYXRlZCBjb21wb3VuZHMuLi4KICAgICAgMCBpc29sYXRlZCBjb21wb3VuZHMgcmVtb3ZlZCBmcm9tIG5ldHdvcmsuCiAgICAgIE1lcmdpbmcgY29tcGFydG1lbnRzLi4uIERvbmUuCiAgICAgIHJlbW92aW5nIGR1cGxpY2F0ZWQgcmVhY3Rpb25zLi4uCiAgICAgIDEgZHVwbGljYXRlZCByZWFjdGlvbnMgcmVtb3ZlZCBmcm9tIG5ldHdvcmsuCgoKICAgICAgCWNvbXBhcnRtZW50czoJMQogICAgICAJbWV0YWJvbGl0ZXM6CTQ5CiAgICAgIAlyZWFjdGlvbnM6CTM0CiAgICAgIAllbnp5bWVzOgk4NQogICAgICAJZ2VuZXM6CTg2CiAgICAgIAlwcm90ZWluOgk4NgogICAgICAJcGF0aHdheToJMwoKCiAgICAgIEV4cG9ydGluZy4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgaW5wdXRTaWRlIHwgYCBOb25lIGAgfAogICAgICAgfCB0b0tlZXBDIHwgYCBOb25lIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgaW5wdXRSZWFjdGlvbnMgfCBgIE5vbmUgYCB8CiAgICAgICB8IHRvS2VlcFIgfCBgIE5vbmUgYCB8CiAgICAgICB8IHJlbW92ZU5vRmx1eCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAiYnlfaWQiIGAgfAogICAgICAgfCByZW1vdmVEdXBsaWNhdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBleGNoYW5nZUNvbXBUb1JlbW92ZSB8IGAgInMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2JtbFdpemFyZCAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5TYm1sV2l6YXJkIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2MvNi80L2RhdGFzZXRfYzY0NjFmYzMtMjNiMi00OWQyLThlYWQtZDJmZDRiN2NmZWY3LmRhdCIgLXJjICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzEvMi8wL2RhdGFzZXRfMTIwOTQ4ZDUtYzg1MC00YzlkLTk1ZGEtNGE1Njg4NWExZDc0LmRhdCIgLXJpYyAtcnIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvOS9lL2MvZGF0YXNldF85ZWNlYjc4Ni1mN2U3LTQ0ODAtYTc3ZC1lNDEyZjIyOWEzZTcuZGF0IiAtcjAgLW1jICJubyIgLXJkciAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzEzNC9vdXRwdXRzL2RhdGFzZXRfODhkNzViNTUtMDNiMy00ZjkxLTk4NWEtNDEzZDgwOGUyYjFkLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIFhmbTExNTgKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4gRG9uZS4KCgogICAgICAJY29tcGFydG1lbnRzOgkzCiAgICAgIAltZXRhYm9saXRlczoJMTEwNwogICAgICAJcmVhY3Rpb25zOgkxMTU4CiAgICAgIAllbnp5bWVzOgk1MTQKICAgICAgCWdlbmVzOgk1NzIKICAgICAgCXByb3RlaW46CTU3MgogICAgICAJcGF0aHdheToJNDgKCgogICAgICByZW1vdmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICA2IHNpZGUgY29tcG91bmRzIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBzaWRlIHJlYWN0aW9uLi4uCiAgICAgIDIgaXJyZWxldmFudCByZWFjdGlvbnMgcmVtb3ZlZCBmcm9tIG5ldHdvcmsuCiAgICAgIHJlbW92aW5nIHJlYWN0aW9uIHdpdGggbnVsbCBmbHV4IGJvdW5kcy4uLgogICAgICAwICJjbG9zZWQiIHJlYWN0aW9ucyByZW1vdmVkIGZyb20gbmV0d29yay4KICAgICAgcmVtb3ZpbmcgaXNvbGF0ZWQgY29tcG91bmRzLi4uCiAgICAgIDAgaXNvbGF0ZWQgY29tcG91bmRzIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgogICAgICByZW1vdmluZyBkdXBsaWNhdGVkIHJlYWN0aW9ucy4uLgogICAgICAwIGR1cGxpY2F0ZWQgcmVhY3Rpb25zIHJlbW92ZWQgZnJvbSBuZXR3b3JrLgoKCiAgICAgIAljb21wYXJ0bWVudHM6CTMKICAgICAgCW1ldGFib2xpdGVzOgkxMTAxCiAgICAgIAlyZWFjdGlvbnM6CTExNTIKICAgICAgCWVuenltZXM6CTUxNAogICAgICAJZ2VuZXM6CTU3MgogICAgICAJcHJvdGVpbjoJNTcyCiAgICAgIAlwYXRod2F5Ogk0OAoKCiAgICAgIEV4cG9ydGluZy4uLiBEb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgdG9LZWVwQyB8IGAgTm9uZSBgIHwKICAgICAgIHwgcmVtb3ZlSXNvbGF0ZWQgfCBgIHRydWUgYCB8CiAgICAgICB8IHRvS2VlcFIgfCBgIE5vbmUgYCB8CiAgICAgICB8IHJlbW92ZU5vRmx1eCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAibm8iIGAgfAogICAgICAgfCByZW1vdmVEdXBsaWNhdGVkIHwgYCB0cnVlIGAgfAogICAgICAgfCBleGNoYW5nZUNvbXBUb1JlbW92ZSB8IGAgIiIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TY29wZU5ldHdvcmsgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TY29wZU5ldHdvcmsgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZi9mLzMvZGF0YXNldF9mZjMzNzE5NS0zNDIxLTQxMjItYjZhZS1mYjQ4ZjU2YTk4ZWQuZGF0IiAtcyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy83LzcvZC9kYXRhc2V0Xzc3ZDhmNDI4LWJhMzYtNDRjNi1hNGIzLTA4YWYwNDkwYzg3Yy5kYXQiIC1zYyAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8wLzcvMi9kYXRhc2V0XzA3MjFiNDQ1LTM3YWEtNGQ1YS05MGQ0LWRmZDFiMzA4ZDhlZC5kYXQiICAgLWYgImdtbCIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xMzgvb3V0cHV0cy9kYXRhc2V0X2FjYjU0ZDg5LWQ2OGQtNDBmMC04OGY4LTNiY2Y3Nzc2NWFkZS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICByZWFkaW5nIFNCTUwuLi4KICAgICAgR01MIGNyZWF0ZWQuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBpbmNsdWRlU2lkZXMgfCBgIGZhbHNlIGAgfAogICAgICAgfCByZWFjdGlvblRvSWdub3JlRmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdHJhY2UgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmb3JtYXQgfCBgICJnbWwiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2VlZHNBbmRUYXJnZXRzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuU2VlZHNBbmRUYXJnZXRzIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzUvOC9hL2RhdGFzZXRfNThhNDE4ZDktZDU0Ni00YzMxLTljYzctYmFkMzk0Mzk2ZTFmLmRhdCIgLXMgICAgICAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNDAvb3V0cHV0cy9kYXRhc2V0X2I0NjNhMjQ4LTI0OTktNGU2Yy1iMDkzLWQzZjNjODdjN2ZmMy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBncmFwaC4uLgogICAgICBkb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgaW5wdXRTaWRlIHwgYCBOb25lIGAgfAogICAgICAgfCBjb21wIHwgYCAiIiBgIHwKICAgICAgIHwgc291cmNlIHwgYCB0cnVlIGAgfAogICAgICAgfCBzaW5rIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm90c291cmNlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm90c2luayB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGtlZXBJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVzZUJvcmVuc3RlaW5BbGcgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1c2VJbnRlcm5hbCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZWVkc0FuZFRhcmdldHMgKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TZWVkc0FuZFRhcmdldHMgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMS9jLzYvZGF0YXNldF8xYzY2YmE1NC1kYjhiLTQwNjUtYmI3Zi05NjkwOTQ2M2U2MDguZGF0IiAtYyAiZSIgIC10ICAgICAtaW4gLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNDIvb3V0cHV0cy9kYXRhc2V0XzZiYzBjODgwLWY3NjItNDYwZC04ZWQ0LWY1NGMxOTQzNTUzNC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBncmFwaC4uLgogICAgICBkb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgaW5wdXRTaWRlIHwgYCBOb25lIGAgfAogICAgICAgfCBjb21wIHwgYCAiZSIgYCB8CiAgICAgICB8IHNvdXJjZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHNpbmsgfCBgIHRydWUgYCB8CiAgICAgICB8IG5vdHNvdXJjZSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5vdHNpbmsgfCBgIGZhbHNlIGAgfAogICAgICAgfCBrZWVwSXNvbGF0ZWQgfCBgIGZhbHNlIGAgfAogICAgICAgfCB1c2VCb3JlbnN0ZWluQWxnIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgdXNlSW50ZXJuYWwgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZWVkc0FuZFRhcmdldHMgKFRlc3QgIyAzKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TZWVkc0FuZFRhcmdldHMgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZi8yLzUvZGF0YXNldF9mMjUwZDNkZC1lZjZkLTRlMTAtOWJkNy04YTBlODZjNDYzMDIuZGF0IiAtYyAiZSIgIC10ICAgIC1CICAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE0NC9vdXRwdXRzL2RhdGFzZXRfYTQ1OGFiM2EtZmI1NS00NGYxLWFlMTQtODBhNWI5NmMxMDM4LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgcmVhZGluZyBTQk1MLi4uCiAgICAgIENyZWF0aW5nIGdyYXBoLi4uCiAgICAgIGRvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBpbnB1dFNpZGUgfCBgIE5vbmUgYCB8CiAgICAgICB8IGNvbXAgfCBgICJlIiBgIHwKICAgICAgIHwgc291cmNlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgc2luayB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgbm90c291cmNlIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm90c2luayB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGtlZXBJc29sYXRlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHVzZUJvcmVuc3RlaW5BbGcgfCBgIHRydWUgYCB8CiAgICAgICB8IHVzZUludGVybmFsIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldENoYXJnZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0Q2hhcmdlcyAtY2MgIjIiIC1jaSAiMSIgICAtbiAiMCIgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZS84LzkvZGF0YXNldF9lODllZGRiMy1jOTMzLTQ4YzAtYmQwMy1iN2NjY2MzNmVlMGEuZGF0IiAtdGFiICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzgvYi8zL2RhdGFzZXRfOGIzOWIzNjgtMTdjZS00NTZiLWEyNGYtYWRkZDE0MzY5YjA0LmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTQ3L291dHB1dHMvZGF0YXNldF9jMzgzNGFhMC1kMGVmLTQ3YjAtODgxZC1jZDY4NDAzY2M2YmYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF80MTg3MTgxNV9mNGY0XzQzN2VfYTg1MF84OTI3YWFmNjYwYzMKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGF0dHJpYnV0aW9ucwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sY2hhcmdlIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hhcmdlcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGFyZ2VzIC1jYyAiMiIgLWNpICIxIiAgIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9mLzEvNC9kYXRhc2V0X2YxNGVlZjg4LTA2ZWYtNGIzNC05YjE0LWI2M2I4YjE3OTQ1Ny5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNi8wLzAvZGF0YXNldF82MDBiZDkzYy0zNWEwLTQ5MTUtYjQ5Mi00ZDEyNWI0YTQ1ZDcuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNTAvb3V0cHV0cy9kYXRhc2V0Xzc2MDU0ODZhLTc5NzEtNDY1MC1hNmM4LTE0OTYzZWI5YjRkNC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzZhNTQzMjAyXzk2MzZfNDgxNV84Yzc4XzlmMDk3NDNiZjZmZAogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDEgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xjaGFyZ2UgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRDaGFyZ2VzIChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldENoYXJnZXMgLWNjICIyIiAtY2kgIjEiICAgLW4gIjEiIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2YvZC8wL2RhdGFzZXRfZmQwOWVhZmItZjg4Ni00MWRhLTllMDktN2M1OWQ3YzNkY2JlLmRhdCIgLXRhYiAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8wLzUvMi9kYXRhc2V0XzA1MmY2MWUxLTk3ZTUtNDM4Yy1hZjEzLWQxZjE0MTdkNGE0OS5kYXQiIC1jICIjIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE1My9vdXRwdXRzL2RhdGFzZXRfM2JkZDk2MzktZjBlMy00YWU2LTlkMmYtNmI3MzgyNmEyNmE0LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfYmU5MzMwN2RfZjRmOV80NTZjXzg2OTVfM2JmMmUyZmNlOWJjCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMSBhdHRyaWJ1dGlvbnMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGNoYXJnZSB8IGAgIjIiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMSIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldENoYXJnZXMgKFRlc3QgIyA0KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0Q2hhcmdlcyAtY2MgIjIiIC1jaSAiMSIgICAtbiAiMCIgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNy8yL2MvZGF0YXNldF83MmM4MTg4Zi0yOGE4LTQ2ZjEtYWViYy0zOWEzMmU0Mjc1NjcuZGF0IiAtdGFiICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzcvZC81L2RhdGFzZXRfN2Q1ZWNiZGItMDA1Ny00MWJjLWIxNmEtMGE3M2YwZjJhY2Q3LmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTU2L291dHB1dHMvZGF0YXNldF9mYjc3MTEzMy1iYTZjLTQyNjUtOTZjYS03N2EwM2NmN2Q5OGQuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF83ZWJiNzBiN19iOGY5XzQwMTNfYTA4YV80NGYzYWVhNWVmZWUKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGF0dHJpYnV0aW9ucwoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sY2hhcmdlIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hhcmdlcyAoVGVzdCAjIDUpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGFyZ2VzIC1jYyAiMiIgLWNpICIxIiAtcCAtcyAtbiAiMCIgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNC9mLzIvZGF0YXNldF80ZjIxZmUwYi1mNTc5LTQyYjQtYWM4Yi1jNWYyYjY0NzY1MmMuZGF0IiAtdGFiICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzQvMS84L2RhdGFzZXRfNDE4Nzc5NDAtM2I3MC00MWQxLWFkY2EtNjcwYzg0MTJjZTMzLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTU5L291dHB1dHMvZGF0YXNldF85MGFhNzkyZC03YTBmLTRiY2MtYWE2Yi1lNzM4ZTQ5ZGVhNGQuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDMgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xjaGFyZ2UgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hlbWljYWxGb3JtdWxhcyAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGVtaWNhbEZvcm11bGFzIC1jZiAiMiIgLWNpICIxIiAgIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9jL2QvZC9kYXRhc2V0X2NkZDEyNmY0LTliODMtNDJiMi04NzE2LTc1ZWQ5MDQ5YWZjMS5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMC8xL2UvZGF0YXNldF8wMWU0YzQ0Ny04NWM3LTRmNjYtOWI2Ny00OGYzODg2OGM3YTcuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNjIvb3V0cHV0cy9kYXRhc2V0X2E2M2YzZTM4LWVjZmEtNDY5MS1hZDUzLTZiYjk3NTRjNTUyMi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzYzZjM5ZGMxX2Q4ZDNfNGRiOV9iYTFjX2RjZTlmY2Q3MzIyYQogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0Q2hlbWljYWxGb3JtdWxhcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRDaGVtaWNhbEZvcm11bGFzIC1jZiAiMiIgLWNpICIxIiAgIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy82LzcvZS9kYXRhc2V0XzY3ZWE0NjVjLWQyOWQtNDMxNy1hOWNhLWVkZTBlNjYwNWM5Yi5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNi9kL2IvZGF0YXNldF82ZGI0ODJmMi1lY2M3LTQ0MDYtOGU4Ni0wODU5MmNkYzdjOWEuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNjUvb3V0cHV0cy9kYXRhc2V0XzU0ZWRhYjZhLTBhYTEtNGNlZi05ZTA3LTdhZTI2MzY1MTA2Ni5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMQogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICAqKioqKioqKgogICAgICBbV2FybmluZ11BdHRyaWJ1dGUgIjEyQ0g0TyIgbm90IHdlbGwgZm9ybWF0dGVkCiAgICAgICoqKioqKioqCiAgICAgIEVycm9yIHdoaWxlIHNldHRpbmcgZm9ybXVsYXMKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGZvcm11bGEgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRFY051bWJlcnMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0RWNOdW1iZXJzIC1jZWMgIjIiIC1jaSAiMSIgIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9lL2YvNS9kYXRhc2V0X2VmNTRjMzhmLWQ2YzAtNDNhMi1hMWE2LTBmZmM0ZWJiNGUzYi5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMS84LzgvZGF0YXNldF8xODg1N2U1Yi1mMzIwLTRhMjMtYjBiZS05ZGZhZjE0ZGE2MjcuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNjgvb3V0cHV0cy9kYXRhc2V0X2UzZjVlYjE0LWRiYjAtNDUzNC1iMGFhLWNkODQ2ZmZiY2M4Ni5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzkzNzg4Yzg0XzAwYmNfNDc1M19iOWE2X2I2ZWI2Y2EzNTA1YwogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgcmVhY3Rpb25zIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sZWMgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldEVjTnVtYmVycyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRFY051bWJlcnMgLWNlYyAiMiIgLWNpICIxIiAgLW4gIjAiIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2MvOS9mL2RhdGFzZXRfYzlmNGM3YjEtMzBlYy00ZWRiLWExYzMtNmFkZDY5M2Q3ZTc1LmRhdCIgLXRhYiAiL3RtcC90bXA5OW53YjZ3My9maWxlcy84L2MvMy9kYXRhc2V0XzhjMzdiMzcwLWIzNDItNDZmNC04MDBiLTdhNjRkNGE2MTAyOS5kYXQiIC1jICIjIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE3MS9vdXRwdXRzL2RhdGFzZXRfNzQ2ZmRiNGItNTU4NS00NWVmLWFjMWItODkyNjM4MTgzNzE2LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAxCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCAKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgCiAgICAgICoqKioqKioqCiAgICAgIFtXYXJuaW5nXUF0dHJpYnV0ZSAiMS4yLjMuNC41IiBub3Qgd2VsbCBmb3JtYXR0ZWQKICAgICAgKioqKioqKioKICAgICAgRXJyb3IgaW4gc2V0dGluZyBFQ3MKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGVjIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRHcHJzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldEdwcnMgLWNncHIgIjIiIC1jaSAiMSIgIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy83LzYvMy9kYXRhc2V0Xzc2MzU5YzFlLTYzMjMtNGQwMS1hOTQ1LWI0YjFkYjkyMDBlYy5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvOS82LzEvZGF0YXNldF85NjEzYTU1OC0wMDQ2LTRmOGQtODNmNy1kZjUxZDBlYmM3ZGEuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNzQvb3V0cHV0cy9kYXRhc2V0XzBhNzYzY2Y3LWQ3NDQtNGVjNC05Y2Q4LWYzZDc4OTIyYThiOC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzQ4OGIzMzUzXzk0OWFfNDNhNl9iN2M2XzhlZDYyODE1MDlmNQogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZ2VuZSBhc3NvY2lhdGlvbnMgY3JlYXRlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sZ3ByIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRJZHMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0SWRzIC1jbmV3ICIyIiAtY2kgIjEiICAgLXQgIk1FVEFCT0xJVEUiIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9mL2MvNS9kYXRhc2V0X2ZjNTFmYWRhLWMxMGEtNDE1Yi1hMDBkLTA0MGQwOTY1N2JkZi5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZi9iLzYvZGF0YXNldF9mYjZjOWVlMy1mYTg3LTQzZWUtYTNlMS02YzJmY2RkYmEzMzAuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNzcvb3V0cHV0cy9kYXRhc2V0XzViYTZjM2ZmLTJlZTMtNDhiYS04MGNlLTc4ODVlOTYzZDFjYy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzI4M2YzZGZiXzZiNmJfNGI2N19iOTY4XzA2MzljMzA3MTliNgogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZW50aXRpZXMgcHJvY2Vzc2VkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIk1FVEFCT0xJVEUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRJZHMgKFRlc3QgIyAyKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0SWRzIC1jbmV3ICIyIiAtY2kgIjEiICAgLXQgIlJFQUNUSU9OIiAtbiAiMCIgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvOS85LzAvZGF0YXNldF85OTBkZDI5OS0xMDQwLTRjMTEtOGI2Zi1mM2U4ZTIyY2VjZTkuZGF0IiAtdGFiICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzUvNC81L2RhdGFzZXRfNTQ1Mjk2MzAtY2YyOC00NWRiLTk0NGEtYmRiNjg5YzU4NTZlLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTgwL291dHB1dHMvZGF0YXNldF84YmNjNTcwOC0yYzJhLTQ1MDktODBjNy04ZGEyNTNmZTNkYWUuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF9mZTcyN2M1M181OTcxXzQzODNfYWYxZl8wYjBmODE2MThjNjEKICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGVudGl0aWVzIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sbmFtZSB8IGAgIjIiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG8gfCBgICJSRUFDVElPTiIgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldElkcyAoVGVzdCAjIDMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRJZHMgLWNuZXcgIjIiIC1jaSAiMSIgICAtdCAiUEFUSFdBWSIgLW4gIjAiIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2UvZi9hL2RhdGFzZXRfZWZhMjg2ODctMDc0YS00NTBjLWE3OTEtOWUwZmI2YzgwNmI3LmRhdCIgLXRhYiAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9jLzIvMS9kYXRhc2V0X2MyMWM1Yzg5LTc1MDEtNDdjNS1iNDY3LTEzNGIxZDk3MTExMS5kYXQiIC1jICIjIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE4My9vdXRwdXRzL2RhdGFzZXRfOWQ2OWQ5NDUtYTdmMC00OGNiLWFhMzItMmNmOGU1Y2I3ODBkLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIFhmbTExNTgKICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAyIGVudGl0aWVzIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29sbmFtZSB8IGAgIjIiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG8gfCBgICJQQVRIV0FZIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0SWRzIChUZXN0ICMgNCk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldElkcyAtY25ldyAiMiIgLWNpICIxIiAgIC10ICJHRU5FIiAtbiAiMCIgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvOC8zLzcvZGF0YXNldF84MzdjZjA0ZS1jMDJjLTQ2NmEtYWQ2ZS05ZDAzYTdmNTI4OTAuZGF0IiAtdGFiICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzkvNS80L2RhdGFzZXRfOTU0YmE1ZDMtNmIyMi00YjJhLWE5NTMtMDA1NGE3OGUyYjljLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTg2L291dHB1dHMvZGF0YXNldF85MWUwNDVhYS0wYmY3LTQ5OWItYjc0ZS1jZWZhMWRlMmNjNjcuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgQ2hlbWljYWwgZm9ybXVsYSBub3QgaW4gZ29vZCBmb3JtYXQgKEM0MS41NTQwNjE4Mzc1NDAwNzVINzEuNzg1NTM1Mzc5NDg5NjROOS44NTM4MjQwMDg4NDAxNU8xNC45MzgyNDQwMTczODk5MzRQMC44ODExMjAwMjU4MDAwMTU2UjEuMjc2NzU2NDc4MzE4OTNFLTE1TW43LjM0OTE5RS00TW83LjM3Njg1RS02Q2wwLjAwNTUzMjYzOUswLjIwNzQ3Mzk1MUNvMi42NzQxMUUtNUN1Ny41MzM2MUUtNFMwLjI0NzAwOTE1Njc4MDAwMDAyWm4zLjYyMzg4RS00TWcwLjAwOTIyMTA2NE5pMy40MzAyNEUtNENhMC4wMDU1MzI2MzlGZTAuMDE3MzQ2NTE1Mzk5OTk5OTk4KSBmb3IgTV9CSU9NQVNTX1hGX2MKICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZW50aXRpZXMgcHJvY2Vzc2VkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIkdFTkUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRJZHMgKFRlc3QgIyA1KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0SWRzIC1jbmV3ICIyIiAtY2kgIjEiICAgLXQgIkNPTVBBUlRNRU5UIiAtbiAiMCIgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMi9lLzUvZGF0YXNldF8yZTVmMGFhYS0yY2I5LTRjZWItOWI5YS02ZTc5YzdiN2I0YjkuZGF0IiAtdGFiICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzYvMi80L2RhdGFzZXRfNjI0ZjkxMWEtNmRjMC00N2E1LWExZWUtNWZhMmEzMzZlYTI0LmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTg5L291dHB1dHMvZGF0YXNldF8xYjFiZDgxZS1iNmRmLTQ2OWMtYTk0Ny04ZmE3NDMzYzExMWIuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIENoZW1pY2FsIGZvcm11bGEgbm90IGluIGdvb2QgZm9ybWF0IChDNDEuNTU0MDYxODM3NTQwMDc1SDcxLjc4NTUzNTM3OTQ4OTY0TjkuODUzODI0MDA4ODQwMTVPMTQuOTM4MjQ0MDE3Mzg5OTM0UDAuODgxMTIwMDI1ODAwMDE1NlIxLjI3Njc1NjQ3ODMxODkzRS0xNU1uNy4zNDkxOUUtNE1vNy4zNzY4NUUtNkNsMC4wMDU1MzI2MzlLMC4yMDc0NzM5NTFDbzIuNjc0MTFFLTVDdTcuNTMzNjFFLTRTMC4yNDcwMDkxNTY3ODAwMDAwMlpuMy42MjM4OEUtNE1nMC4wMDkyMjEwNjROaTMuNDMwMjRFLTRDYTAuMDA1NTMyNjM5RmUwLjAxNzM0NjUxNTM5OTk5OTk5OCkgZm9yIE1fQklPTUFTU19YRl9jCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgZW50aXRpZXMgcHJvY2Vzc2VkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIkNPTVBBUlRNRU5UIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0TmFtZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0TmFtZXMgLWNuYW1lICIyIiAtY2kgIjEiICAgLXQgIk1FVEFCT0xJVEUiIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9hLzkvNy9kYXRhc2V0X2E5NzBlZTRlLTY3NDctNDE4YS1iYWU4LThhZDFjZmI3ZThkZS5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMC9mLzIvZGF0YXNldF8wZjJhMTZkNi04YjcyLTRhM2MtYTAwNS03NWM3Y2FmMjRhYjMuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xOTIvb3V0cHV0cy9kYXRhc2V0Xzc3ZGVlNmRiLTA5OWEtNDcwNS1hN2JiLTMwNmM4MDRlYjRkNS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2U4NjI2ZjRjXzFmNjdfNDk5Zl84NTUxXzNjMTc1ZmQ3ODUwMAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIk1FVEFCT0xJVEUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXROYW1lcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXROYW1lcyAtY25hbWUgIjIiIC1jaSAiMSIgICAtdCAiUkVBQ1RJT04iIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9mLzgvMS9kYXRhc2V0X2Y4MTYyYzJhLWEzOTEtNGVhMS05ZGY5LTVjZjZhNzgxMTU3ZC5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvZC8wLzkvZGF0YXNldF9kMDlkZDE0Mi1hZTJhLTRjMjMtYTVmYS03MTY1NDg4NWQ1MGUuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xOTUvb3V0cHV0cy9kYXRhc2V0XzVkNmU3Mzg1LTUyYmYtNGYyYi05OTA3LTBlODkxNWFiNTJjZS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2EwMGQyZTE2XzA4N2ZfNDMzYl85MmE3X2RmN2MwNjNkYTAwMgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIlJFQUNUSU9OIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2V0TmFtZXMgKFRlc3QgIyAzKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0TmFtZXMgLWNuYW1lICIyIiAtY2kgIjEiICAgLXQgIlBBVEhXQVkiIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9lLzAvMi9kYXRhc2V0X2UwMmU0M2IzLWZmYTMtNDQwMi1hNzk5LWNhZTA0ODBiYTI5Ni5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNi8xL2UvZGF0YXNldF82MWVjMDNiMS05YzNiLTQwMGQtYmM1YS03MGJiNjQ5MmRmNGUuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xOTgvb3V0cHV0cy9kYXRhc2V0XzFkNjZhOTY4LTcxNDItNDllZC1hOGZiLTlmNzI2NTQzYzlmMy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBYZm0xMTU4CiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBDaGVtaWNhbCBmb3JtdWxhIG5vdCBpbiBnb29kIGZvcm1hdCAoQzQxLjU1NDA2MTgzNzU0MDA3NUg3MS43ODU1MzUzNzk0ODk2NE45Ljg1MzgyNDAwODg0MDE1TzE0LjkzODI0NDAxNzM4OTkzNFAwLjg4MTEyMDAyNTgwMDAxNTZSMS4yNzY3NTY0NzgzMTg5M0UtMTVNbjcuMzQ5MTlFLTRNbzcuMzc2ODVFLTZDbDAuMDA1NTMyNjM5SzAuMjA3NDczOTUxQ28yLjY3NDExRS01Q3U3LjUzMzYxRS00UzAuMjQ3MDA5MTU2NzgwMDAwMDJabjMuNjIzODhFLTRNZzAuMDA5MjIxMDY0TmkzLjQzMDI0RS00Q2EwLjAwNTUzMjYzOUZlMC4wMTczNDY1MTUzOTk5OTk5OTgpIGZvciBNX0JJT01BU1NfWEZfYwogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgMiBhdHRyaWJ1dGlvbnMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbG5hbWUgfCBgICIyIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IHMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBvIHwgYCAiUEFUSFdBWSIgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldE5hbWVzIChUZXN0ICMgNCk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldE5hbWVzIC1jbmFtZSAiMiIgLWNpICIxIiAgIC10ICJHRU5FIiAtbiAiMCIgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMi8zLzUvZGF0YXNldF8yMzVhYmI3Mi1jMWQ0LTRlMjUtOTIwYi0yOTA2MzZhYjdmYTAuZGF0IiAtdGFiICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzgvNS8zL2RhdGFzZXRfODUzOTQwMTItOGM0My00YWQ2LTlhZWItZTQxNmQ2ZGNkNzgzLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjAxL291dHB1dHMvZGF0YXNldF9kOWVkMmRmOS05OTViLTQwOWEtYjhhYi0xNDBhODUwOTg5OGUuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgZ3JvdXBzIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBhbm5vdCBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgWGZtMTE1OAogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgQ2hlbWljYWwgZm9ybXVsYSBub3QgaW4gZ29vZCBmb3JtYXQgKEM0MS41NTQwNjE4Mzc1NDAwNzVINzEuNzg1NTM1Mzc5NDg5NjROOS44NTM4MjQwMDg4NDAxNU8xNC45MzgyNDQwMTczODk5MzRQMC44ODExMjAwMjU4MDAwMTU2UjEuMjc2NzU2NDc4MzE4OTNFLTE1TW43LjM0OTE5RS00TW83LjM3Njg1RS02Q2wwLjAwNTUzMjYzOUswLjIwNzQ3Mzk1MUNvMi42NzQxMUUtNUN1Ny41MzM2MUUtNFMwLjI0NzAwOTE1Njc4MDAwMDAyWm4zLjYyMzg4RS00TWcwLjAwOTIyMTA2NE5pMy40MzAyNEUtNENhMC4wMDU1MzI2MzlGZTAuMDE3MzQ2NTE1Mzk5OTk5OTk4KSBmb3IgTV9CSU9NQVNTX1hGX2MKICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xuYW1lIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IHAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBzIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbyB8IGAgIkdFTkUiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjIHwgYCAiIyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TZXRQYXRod2F5cyAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggYXR0cmlidXRlcy5TZXRQYXRod2F5cyAtY3AgIjIiIC1zZXAgInwiIC1jaSAiMSIgIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9jLzUvYi9kYXRhc2V0X2M1YmY5OTIzLThmMDAtNDhkYS05NDZjLWJmMGE4NDhiMTcyOC5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMC9hL2EvZGF0YXNldF8wYWE2ZmQ3YS0wMDFlLTQ5MWMtODAyNi04ZDFkMGU4YTdjZTguZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMDQvb3V0cHV0cy9kYXRhc2V0X2M2MDk1YzhhLWRmZTAtNDMwNi05ZmM0LWUzMjZkNGM2NWJlZC5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2YzNjgyZjljXzA2YTNfNDdhNV9hMzQ5XzRiYjlmYmJmNmQ0MgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDMgcmVhY3Rpb25zIHByb2Nlc3NlZAoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgY29scCB8IGAgIjIiIGAgfAogICAgICAgfCBzZXAgfCBgICJ8IiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldFBhdGh3YXlzIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBhdHRyaWJ1dGVzLlNldFBhdGh3YXlzIC1jcCAiMiIgLXNlcCAiICsgIiAtY2kgIjEiICAtbiAiMCIgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMi9kLzgvZGF0YXNldF8yZDgzYmZjZC01NzcxLTRiMzMtYWY4Ni1lMzI0YzFmOGY3MjkuZGF0IiAtdGFiICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2IvMy84L2RhdGFzZXRfYjM4MmU1YWYtMmNlNC00MDIzLThjMTYtMWU0M2UzYWQ3OWNkLmRhdCIgLWMgIiMiIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjA3L291dHB1dHMvZGF0YXNldF82MWU1MTZjMy0zMzM3LTQ5ODktYjFmZC01N2Y0YTg2YTE5NmMuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGFubm90IHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCAKICAgICAgUGFyc2luZyBCaW9uZXR3b3JrIF83M2ExZmZmMV9hY2JkXzRhNjVfODVmZF80MDZmZTI3YzEwM2YKICAgICAgR2VuZXJhdGluZyBGbHV4IEJhbGFuY2UgQ29uc3RyYWludHMgbW9kdWxlcy4uLgogICAgICBHZW5lcmF0aW5nIFBhdGh3YXlzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgTm90ZXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICAzIHJlYWN0aW9ucyBwcm9jZXNzZWQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbHAgfCBgICIyIiBgIHwKICAgICAgIHwgc2VwIHwgYCAiICsgIiBgIHwKICAgICAgIHwgY29saWQgfCBgICIxIiBgIHwKICAgICAgIHwgcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5Ta2lwIHwgYCAiMCIgYCB8CiAgICAgICB8IGMgfCBgICIjIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAicmRmIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1NldFJlZmVyZW5jZXMgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGF0dHJpYnV0ZXMuU2V0UmVmZXJlbmNlcyAtY3IgIjIiIC1yZWYgIkluQ2hpIiAtY2kgIjEiICAgLXQgIk1FVEFCT0xJVEUiIC1uICIwIiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8xLzgvZi9kYXRhc2V0XzE4ZjBiZTZiLTU4ODMtNGQ0ZC1hNTI3LTNjNDFmMGU2ODUxYS5kYXQiIC10YWIgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMy9jLzYvZGF0YXNldF8zYzZmZGZlNC1mMTE4LTQwNzgtOWQ3MS05YTk3ZmE0ZDEyZjAuZGF0IiAtYyAiIyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMTAvb3V0cHV0cy9kYXRhc2V0Xzg3ZjUzY2RhLTUyYTctNDIxYi05MmY2LTBiNGNmNDAwMjU3ZS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgCiAgICAgIFN0YXJ0aW5nIGZiYyB2ZXJzaW9uIDIgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgYW5ub3QgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIAogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzdlZjIyMDU1XzhhMGFfNDlkOF9iYTQ1XzBjNmEyMDMwYWFiMgogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIDIgYXR0cmlidXRpb25zCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xSZWYgfCBgICIyIiBgIHwKICAgICAgIHwgcmVmIHwgYCAiSW5DaGkiIGAgfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG8gfCBgICJNRVRBQk9MSVRFIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgYyB8IGAgIiMiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfU2lkZUNvbXBvdW5kc1NjYW4gKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIG5ldHdvcmtBbmFseXNpcy5TaWRlQ29tcG91bmRzU2NhbiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy9hLzAvOS9kYXRhc2V0X2EwOTk3YjhiLTFiOTktNGVjOC04ZDQ0LTI5ZDg4YzNlMjFhOS5kYXQiICAgLWQgIjQwMCIgICAtbSAibm8iIC1vICIvdG1wL3RtcDk5bndiNnczL2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjEyL291dHB1dHMvZGF0YXNldF9jYTZkNzA4Ny04MzdmLTQ2NmYtOGZiZi00M2I1MWJhZTM2ZTYuZGF0IgogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIEVSUk9SIFN0YXR1c0xvZ2dlciBSZWNvbmZpZ3VyYXRpb24gZmFpbGVkOiBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciAnMzA5NDZlMDknIGF0ICdudWxsJyBpbiAnbnVsbCcKICAgICAgVmVyaWZ5aW5nIGVuYWJsZWQgUGx1Z2lucy4uLgogICAgICBQYXJzaW5nIG1vZGVsIFhmbTExNTgKICAgICAgU3RhcnRpbmcgZmJjIHZlcnNpb24gMiBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICByZWFkaW5nIFNCTUwuLi4KICAgICAgQ3JlYXRpbmcgbmV0d29yay4uLgogICAgICBTY2FuaW5nLi4uCiAgICAgIGRvbmUKICAgICAgZm91bmQgNiBzaWRlIGNvbXBvdW5kIGFtb25nIDExMDcgY29tcG91bmRzCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBzaWRlT25seSB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG5vUmVwb3J0VmFsdWUgfCBgIGZhbHNlIGAgfAogICAgICAgfCBkZWdyZWUgfCBgICI0MDAiIGAgfAogICAgICAgfCBkZWdyZWVQcmVjZW50aWxlIHwgYCAibmFuIiBgIHwKICAgICAgIHwgZmxhZ0lub3JnYW5pYyB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGZsYWdOb0Zvcm11bGEgfCBgIGZhbHNlIGAgfAogICAgICAgfCBwYXJhbGxlbEVkZ2UgfCBgICJuYW4iIGAgfAogICAgICAgfCBtZXJnaW5nU3RyYXQgfCBgICJubyIgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9TaWRlQ29tcG91bmRzU2NhbiAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlNpZGVDb21wb3VuZHNTY2FuIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzMvYy85L2RhdGFzZXRfM2M5YzRkN2ItYzc4Yi00NjAyLTk1ZTgtMDMzNzZlNjI3YjBhLmRhdCIgIC1pZCAtZCAiNDAwIiAgIC1tICJubyIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMTQvb3V0cHV0cy9kYXRhc2V0X2VhMWQ5NDE0LTAwMWUtNDZkOS05NTAyLTczMTljOGQzZTFhOS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBmYmMgdmVyc2lvbiAyIHBsdWdpbi4uLgogICAgICBTdGFydGluZyBub3RlIHBsdWdpbi4uLgogICAgICBFbmQgUGFyc2luZyBtb2RlbCBYZm0xMTU4CgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIHJlYWRpbmcgU0JNTC4uLgogICAgICBDcmVhdGluZyBuZXR3b3JrLi4uCiAgICAgIFNjYW5pbmcuLi4KICAgICAgZG9uZQogICAgICBmb3VuZCA2IHNpZGUgY29tcG91bmQgYW1vbmcgMTEwNyBjb21wb3VuZHMKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHNpZGVPbmx5IHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbm9SZXBvcnRWYWx1ZSB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgZGVncmVlIHwgYCAiNDAwIiBgIHwKICAgICAgIHwgZGVncmVlUHJlY2VudGlsZSB8IGAgIm5hbiIgYCB8CiAgICAgICB8IGZsYWdJbm9yZ2FuaWMgfCBgIGZhbHNlIGAgfAogICAgICAgfCBmbGFnTm9Gb3JtdWxhIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgcGFyYWxsZWxFZGdlIHwgYCAibmFuIiBgIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAibm8iIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgbWV0NGpfVGFiMlNibWwgKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIHNoIC91c3IvYmluL21ldDRqLnNoIGNvbnZlcnQuVGFiMlNibWwgLWNpICIxIiAtY2YgIjIiICAgLWUgIl9iIiAtaXJyICItLT4iIC1yZXYgIjw9PT4iIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2UvNC8wL2RhdGFzZXRfZTQwNTJhZjgtYjYzZC00ZjhhLWFhNzYtYzdiOWNmMmRhMDFkLmRhdCIgLWlkICJOQSIgIC1kY3B0ICJjIiAtbiAiMCIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMTYvb3V0cHV0cy9kYXRhc2V0X2NjNzRiYzY4LTE2OGUtNDA3My05NjMzLWYzNmU2N2Q3NjRkNS5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgXzY3NmZmMzgzXzUyYjhfNGY0Zl9iZjVkXzVmMjZjODUzNTBkNwogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFRoZSBpbnB1dCBmaWxlIGxvb2tzIGdvb2QgYW5kIGNvbnRhaW5zIDcgcmVhY3Rpb25zCiAgICAgIDcgcmVhY3Rpb25zLCA4IG1ldGFib2xpdGVzIGFuZCAyIGNvbXBhcnRtZW50cyBjcmVhdGVkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IHJwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBlIHwgYCAiX2IiIGAgfAogICAgICAgfCBpIHwgYCAiLS0+IiBgIHwKICAgICAgIHwgciB8IGAgIjw9PT4iIGAgfAogICAgICAgfCBpZCB8IGAgIk5BIiBgIHwKICAgICAgIHwgY3JlYXRlQ29tcGFydG1lbnQgfCBgIGZhbHNlIGAgfAogICAgICAgfCBkZWZhdWx0Q29tcGFydG1lbnQgfCBgICJjIiBgIHwKICAgICAgIHwgblNraXAgfCBgICIwIiBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXA5OW53YjZ3My9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAidGFidWxhciIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9UYWIyU2JtbCAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggY29udmVydC5UYWIyU2JtbCAtY2kgIjIiIC1jZiAiMyIgICAtZSAiX2IiIC1pcnIgIi0tPiIgLXJldiAiPD09PiIgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvOC85LzYvZGF0YXNldF84OTZkODdiOS1mODk3LTQ0ZDctYTRiZS1jMWU5ZGI2ZDM3ZWIuZGF0IiAtaWQgIk5BIiAgLWRjcHQgImMiIC1uICIwIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIxOC9vdXRwdXRzL2RhdGFzZXRfYWVjNjQxZjMtZjQ4Mi00NTZmLTkxOTQtOGExODNlOWViOGE1LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfNGMxMTQyNWJfMjY2ZV80YzBlX2EwYTNfYWNkZTJmMTgzNTA2CiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgVGhlIGlucHV0IGZpbGUgbG9va3MgZ29vZCBhbmQgY29udGFpbnMgNyByZWFjdGlvbnMKICAgICAgNyByZWFjdGlvbnMsIDggbWV0YWJvbGl0ZXMgYW5kIDIgY29tcGFydG1lbnRzIGNyZWF0ZWQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGlkIHwgYCAiMiIgYCB8CiAgICAgICB8IGNvbGZvcm11bGEgfCBgICIzIiBgIHwKICAgICAgIHwgcnAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBtcCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGUgfCBgICJfYiIgYCB8CiAgICAgICB8IGkgfCBgICItLT4iIGAgfAogICAgICAgfCByIHwgYCAiPD09PiIgYCB8CiAgICAgICB8IGlkIHwgYCAiTkEiIGAgfAogICAgICAgfCBjcmVhdGVDb21wYXJ0bWVudCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RhYjJTYm1sIChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlRhYjJTYm1sIC1jaSAiMSIgLWNmICIyIiAgIC1lICJfYiIgLWlyciAiLT4iIC1yZXYgIj0iIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2UvNC9hL2RhdGFzZXRfZTRhZGI0OTYtZDllNC00NmVlLWI1ZGMtNjk2NjJiNjllYTQzLmRhdCIgLWlkICJOQSIgIC1kY3B0ICJjIiAtbiAiMCIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMjAvb3V0cHV0cy9kYXRhc2V0X2IwY2IxNDk1LTAyNmYtNGU0MC1hYTAwLTIzNjQzMmRmYjVlMi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgX2UwMzE5ZjdkX2Q2NjdfNDJlMF9hODM0X2IzODkwZDAzNmM2NAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBOb3Rlcy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIEFubm90YXRpb25zLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFRoZSBpbnB1dCBmaWxlIGxvb2tzIGdvb2QgYW5kIGNvbnRhaW5zIDcgcmVhY3Rpb25zCiAgICAgIDcgcmVhY3Rpb25zLCA4IG1ldGFib2xpdGVzIGFuZCAyIGNvbXBhcnRtZW50cyBjcmVhdGVkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IHJwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBlIHwgYCAiX2IiIGAgfAogICAgICAgfCBpIHwgYCAiLT4iIGAgfAogICAgICAgfCByIHwgYCAiPSIgYCB8CiAgICAgICB8IGlkIHwgYCAiTkEiIGAgfAogICAgICAgfCBjcmVhdGVDb21wYXJ0bWVudCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RhYjJTYm1sIChUZXN0ICMgNCk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlRhYjJTYm1sIC1jaSAiMSIgLWNmICIyIiAtcnAgLW1wIC1lICJfZSIgLWlyciAiLS0+IiAtcmV2ICI8PT0+IiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy8yLzIvOS9kYXRhc2V0XzIyOTQ4ZDI0LTNhOGUtNDhlNC1hN2Q1LWE1ZTgzZDQ4ODY5OC5kYXQiIC1pZCAiTkEiIC1jcHQgLWRjcHQgImMiIC1uICIwIiAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIyMi9vdXRwdXRzL2RhdGFzZXRfZDM4MDc1MTEtMDdmZS00ZDNjLTk0ZDktNTMxZGJmZjVjZDliLmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFBhcnNpbmcgQmlvbmV0d29yayBfNTE4ZWU5NTBfZWE2N180MTJmXzhiNGFfZWFlYTM1MmVlODkyCiAgICAgIEdlbmVyYXRpbmcgRmx1eCBCYWxhbmNlIENvbnN0cmFpbnRzIG1vZHVsZXMuLi4KICAgICAgR2VuZXJhdGluZyBQYXRod2F5cy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgTW9kZWwgQW5ub3RhdGlvbnMuLi4KCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgVGhlIGlucHV0IGZpbGUgbG9va3MgZ29vZCBhbmQgY29udGFpbnMgNyByZWFjdGlvbnMKICAgICAgNyByZWFjdGlvbnMsIDggbWV0YWJvbGl0ZXMgYW5kIDIgY29tcGFydG1lbnRzIGNyZWF0ZWQKCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGNvbGlkIHwgYCAiMSIgYCB8CiAgICAgICB8IGNvbGZvcm11bGEgfCBgICIyIiBgIHwKICAgICAgIHwgcnAgfCBgIHRydWUgYCB8CiAgICAgICB8IG1wIHwgYCB0cnVlIGAgfAogICAgICAgfCBlIHwgYCAiX2UiIGAgfAogICAgICAgfCBpIHwgYCAiLS0+IiBgIHwKICAgICAgIHwgciB8IGAgIjw9PT4iIGAgfAogICAgICAgfCBpZCB8IGAgIk5BIiBgIHwKICAgICAgIHwgY3JlYXRlQ29tcGFydG1lbnQgfCBgIHRydWUgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RhYjJTYm1sIChUZXN0ICMgNSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBjb252ZXJ0LlRhYjJTYm1sIC1jaSAiMSIgLWNmICIyIiAgIC1lICJfYiIgLWlyciAiLS0+IiAtcmV2ICI8PT0+IiAtaSAiL3RtcC90bXA5OW53YjZ3My9maWxlcy81LzQvNi9kYXRhc2V0XzU0NjYyNWI3LThlMTgtNDgxYy04MGYxLTc3MDdjOTRjYmMzYi5kYXQiIC1pZCAibXlNb2RlbCIgIC1kY3B0ICJjIiAtbiAiMCIgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMjQvb3V0cHV0cy9kYXRhc2V0X2Q2ZDE4NWYzLWQyOWQtNDZjZS1hMTZmLTI0YTQyN2RmZDNhNi5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBQYXJzaW5nIEJpb25ldHdvcmsgbXlNb2RlbAogICAgICBHZW5lcmF0aW5nIEZsdXggQmFsYW5jZSBDb25zdHJhaW50cyBtb2R1bGVzLi4uCiAgICAgIEdlbmVyYXRpbmcgUGF0aHdheXMuLi4KICAgICAgR2VuZXJhdGluZyBNb2RlbCBBbm5vdGF0aW9ucy4uLgogICAgICBHZW5lcmF0aW5nIE1vZGVsIE5vdGVzLi4uCgogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIExhdW5jaCBtZXQ0ai10b29sYm94CiAgICAgIFRoZSBpbnB1dCBmaWxlIGxvb2tzIGdvb2QgYW5kIGNvbnRhaW5zIDcgcmVhY3Rpb25zCiAgICAgIDcgcmVhY3Rpb25zLCA4IG1ldGFib2xpdGVzIGFuZCAyIGNvbXBhcnRtZW50cyBjcmVhdGVkCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBjb2xpZCB8IGAgIjEiIGAgfAogICAgICAgfCBjb2xmb3JtdWxhIHwgYCAiMiIgYCB8CiAgICAgICB8IHJwIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgbXAgfCBgIGZhbHNlIGAgfAogICAgICAgfCBlIHwgYCAiX2IiIGAgfAogICAgICAgfCBpIHwgYCAiLS0+IiBgIHwKICAgICAgIHwgciB8IGAgIjw9PT4iIGAgfAogICAgICAgfCBpZCB8IGAgIm15TW9kZWwiIGAgfAogICAgICAgfCBjcmVhdGVDb21wYXJ0bWVudCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGRlZmF1bHRDb21wYXJ0bWVudCB8IGAgImMiIGAgfAogICAgICAgfCBuU2tpcCB8IGAgIjAiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJ0YWJ1bGFyIiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IG1ldDRqX1RvcG9sb2dpY2FsUGF0aHdheUFuYWx5c2lzIChUZXN0ICMgMSk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBzaCAvdXNyL2Jpbi9tZXQ0ai5zaCBuZXR3b3JrQW5hbHlzaXMuVG9wb2xvZ2ljYWxQYXRod2F5QW5hbHlzaXMgLWkgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvMi9mL2EvZGF0YXNldF8yZmFiZjg3Mi05ZmQ2LTRkNDUtYjA4My02NGQxN2I1ZTdkNjcuZGF0IiAtc2MgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvOC8wLzIvZGF0YXNldF84MDI5MDQ3Yi03YmFlLTQ1NjItOTQ5YS03NzllMWIwMGRkZjguZGF0IiAtbWMgIm5vIiAgIC1ub2kgIi90bXAvdG1wOTlud2I2dzMvZmlsZXMvNi8xLzkvZGF0YXNldF82MTk3ZTMyZi1hZDJiLTRiZDgtOWUyNS05ZDgzOTQ3OTIwN2UuZGF0IiAgLW8gIi90bXAvdG1wOTlud2I2dzMvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yMjgvb3V0cHV0cy9kYXRhc2V0XzRhZGFhMzE1LTNjODgtNDdmYi04MGE1LTFjODM5MWQ3MDczYy5kYXQiCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgRVJST1IgU3RhdHVzTG9nZ2VyIFJlY29uZmlndXJhdGlvbiBmYWlsZWQ6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yICczMDk0NmUwOScgYXQgJ251bGwnIGluICdudWxsJwogICAgICBWZXJpZnlpbmcgZW5hYmxlZCBQbHVnaW5zLi4uCiAgICAgIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICBTdGFydGluZyBncm91cHMgcGx1Z2luLi4uCiAgICAgIFN0YXJ0aW5nIG5vdGUgcGx1Z2luLi4uCiAgICAgIEVuZCBQYXJzaW5nIG1vZGVsIFhmbTExNTgKCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgTGF1bmNoIG1ldDRqLXRvb2xib3gKICAgICAgUmVhZGluZyBTQk1MLi4uIERvbmUuCgoKICAgICAgQnVpbGRpbmcgZ3JhcGguLi5SZW1vdmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICBSZWFkIGZpbGUgY29udGFpbmluZyBzaWRlIGNvbXBvdW5kcy4uLgogICAgICA2IGNvbXBvdW5kcyByZW1vdmVkLgogICAgICAgTmV0d29yayBzdWNjZXNzZnVsbHkgY3JlYXRlZC4KCgogICAgICBJbXBvcnRpbmcgbm9kZXMgb2YgaW50ZXJlc3QKICAgICAgRG9uZS4KICAgICAgQ29tcHV0aW5nIFBhdGh3YXkgdG9wb2xvZ3kgQW5hbHlzaXMuLi4gKG1heSB0YWtlIGEgd2hpbGUpCiAgICAgIERvbmUuCiAgICAgIEV4cG9ydGluZy4uLkRvbmUuCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBtZXJnaW5nU3RyYXQgfCBgICJubyIgYCB8CiAgICAgICB8IHJlbW92ZUlzb2xhdGVkIHwgYCBmYWxzZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IG91dCB8IGAgZmFsc2UgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wOTlud2I2dzMvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgInJkZiIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBtZXQ0al9Ub3BvbG9naWNhbFBhdGh3YXlBbmFseXNpcyAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgc2ggL3Vzci9iaW4vbWV0NGouc2ggbmV0d29ya0FuYWx5c2lzLlRvcG9sb2dpY2FsUGF0aHdheUFuYWx5c2lzIC1pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzkvNS82L2RhdGFzZXRfOTU2Yzk2Y2EtYmMzOS00OTY1LWFhNDgtODAwZjA4MzQ1MGU5LmRhdCIgLXNjICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzLzYvNC9iL2RhdGFzZXRfNjRiZDdmZTEtYzQ4Yy00NGIzLWE4ODgtZWU4YzUxZWY3OWJiLmRhdCIgLW1jICJieV9pZCIgLXJpIC11biAtbm9pICIvdG1wL3RtcDk5bndiNnczL2ZpbGVzL2QvOS9jL2RhdGFzZXRfZDljZjE3MGYtNDM3OS00Y2E3LWI5ZjEtNGExOWFkYTRiMzEzLmRhdCIgLW91dCAtbyAiL3RtcC90bXA5OW53YjZ3My9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIzMi9vdXRwdXRzL2RhdGFzZXRfNGRiYzg0NjItNWZkZS00MTAwLTgxMWQtMjEyYmFiODVhNTE5LmRhdCIKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICBFUlJPUiBTdGF0dXNMb2dnZXIgUmVjb25maWd1cmF0aW9uIGZhaWxlZDogTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgJzMwOTQ2ZTA5JyBhdCAnbnVsbCcgaW4gJ251bGwnCiAgICAgIFZlcmlmeWluZyBlbmFibGVkIFBsdWdpbnMuLi4KICAgICAgUGFyc2luZyBtb2RlbCBYZm0xMTU4CiAgICAgIFN0YXJ0aW5nIGdyb3VwcyBwbHVnaW4uLi4KICAgICAgU3RhcnRpbmcgbm90ZSBwbHVnaW4uLi4KICAgICAgRW5kIFBhcnNpbmcgbW9kZWwgWGZtMTE1OAogICAgICAxMiBpc29sYXRlZCBub2RlcyByZW1vdmVkIAoKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBMYXVuY2ggbWV0NGotdG9vbGJveAogICAgICBSZWFkaW5nIFNCTUwuLi4gRG9uZS4KCgogICAgICBCdWlsZGluZyBncmFwaC4uLlJlbW92aW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIFJlYWQgZmlsZSBjb250YWluaW5nIHNpZGUgY29tcG91bmRzLi4uCiAgICAgIDYgY29tcG91bmRzIHJlbW92ZWQuCiAgICAgIENyZWF0ZSBVbmRpcmVjdGVkLi4uIERvbmUuCiAgICAgIE1lcmdpbmcgY29tcGFydG1lbnRzLi4uIERvbmUuCiAgICAgIFJlbW92ZSBpc29sYXRlZCBub2Rlcy4uLgogICAgICAJcmVtb3Zpbmcgc25fR2x5Y2Vyb18zX3Bob3NwaG9jaG9saW5lCiAgICAgIAlyZW1vdmluZyBzbl9HbHljZXJvXzNfcGhvc3Bob2V0aGFub2xhbWluZQogICAgICAJcmVtb3ZpbmcgUDFfUDRfQmlzXzVfX2FkZW5vc3lsX190ZXRyYXBob3NwaGF0ZQogICAgICAJcmVtb3ZpbmcgbWV0aGFuZXN1bGZvbmF0ZQogICAgICAJcmVtb3ZpbmcgTV9tZXRfRF9jCiAgICAgIAlyZW1vdmluZyBHbHljZXJvcGhvc3Bob3NlcmluZQogICAgICAJcmVtb3ZpbmcgRF9HbHljZXJhbGRlaHlkZQogICAgICAJcmVtb3ZpbmcgR2x5Y2Vyb3Bob3NwaG9nbHljZXJvbAogICAgICAJcmVtb3Zpbmcgc25fR2x5Y2Vyb18zX3Bob3NwaG9fMV9pbm9zaXRvbAogICAgICAJcmVtb3ZpbmcgUDFfUDVfQmlzXzVfX2FkZW5vc3lsX19wZW50YXBob3NwaGF0ZQogICAgICAJcmVtb3ZpbmcgTV9zX2MKICAgICAgCXJlbW92aW5nIE1fY3lzX0RfYwogICAgICAgRG9uZS4KICAgICAgIE5ldHdvcmsgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuCgoKICAgICAgSW1wb3J0aW5nIG5vZGVzIG9mIGludGVyZXN0CiAgICAgIERvbmUuCiAgICAgIENvbXB1dGluZyBQYXRod2F5IHRvcG9sb2d5IEFuYWx5c2lzLi4uIChtYXkgdGFrZSBhIHdoaWxlKQogICAgICBEb25lLgogICAgICBFeHBvcnRpbmcuLi5Eb25lLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgbWVyZ2luZ1N0cmF0IHwgYCAiYnlfaWQiIGAgfAogICAgICAgfCByZW1vdmVJc29sYXRlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgd2VpZ2h0RmlsZSB8IGAgTm9uZSBgIHwKICAgICAgIHwgdW5kaXJlY3RlZCB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgb3V0IHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDk5bndiNnczL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJyZGYiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCjwvZGV0YWlscz4K')); + 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')); </script> </body> </html> \ No newline at end of file
--- a/tools/attributes/ExtractAnnotations/ExtractAnnotations.xml Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/ExtractAnnotations/ExtractAnnotations.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractAnnotations" name="ExtractAnnotations" version="develop"> +<tool id="met4j_ExtractAnnotations" name="ExtractAnnotations" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.ExtractAnnotations -i "$inputPath" -export "$export" @@ -34,238 +34,40 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/ExtractPathways/ExtractPathways.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractPathways" name="ExtractPathways" version="develop"> +<tool id="met4j_ExtractPathways" name="ExtractPathways" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.ExtractPathways -i "$inputPath" -p "$pathwayId" @@ -24,125 +24,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/GetEntities/GetEntities.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetEntities" name="GetEntities" version="develop"> +<tool id="met4j_GetEntities" name="GetEntities" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetEntities -i "$sbml" $printMetabolites @@ -30,167 +30,29 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/GetGenesFromReactions/GetGenesFromReactions.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetGenesFromReactions" name="GetGenesFromReactions" version="develop"> +<tool id="met4j_GetGenesFromReactions" name="GetGenesFromReactions" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetGenesFromReactions -i "$sbml" -r "$reactionFile" @@ -34,125 +34,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/GetMetaboliteAttributes/GetMetaboliteAttributes.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetMetaboliteAttributes" name="GetMetaboliteAttributes" version="develop"> +<tool id="met4j_GetMetaboliteAttributes" name="GetMetaboliteAttributes" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetMetaboliteAttributes -i "$sbml" -o "$outputFile" @@ -18,75 +18,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/GetReactantsFromReactions/GetReactantsFromReactions.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetReactantsFromReactions" name="GetReactantsFromReactions" version="develop"> +<tool id="met4j_GetReactantsFromReactions" name="GetReactantsFromReactions" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.GetReactantsFromReactions -i "$sbml" -r "$reactionFile" @@ -38,355 +38,36 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/SetCharges/SetCharges.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetCharges" name="SetCharges" version="develop"> +<tool id="met4j_SetCharges" name="SetCharges" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetCharges#if str($colcharge) != 'nan': -cc "$colcharge" @@ -50,387 +50,63 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/SetChemicalFormulas/SetChemicalFormulas.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetChemicalFormulas" name="SetChemicalFormulas" version="develop"> +<tool id="met4j_SetChemicalFormulas" name="SetChemicalFormulas" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetChemicalFormulas#if str($colformula) != 'nan': -cf "$colformula" @@ -50,97 +50,19 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/SetEcNumbers/SetEcNumbers.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetEcNumbers" name="SetEcNumbers" version="develop"> +<tool id="met4j_SetEcNumbers" name="SetEcNumbers" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetEcNumbers#if str($colec) != 'nan': -cec "$colec" @@ -48,97 +48,19 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/SetGprs/SetGprs.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetGprs" name="SetGprs" version="develop"> +<tool id="met4j_SetGprs" name="SetGprs" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetGprs#if str($colgpr) != 'nan': -cgpr "$colgpr" @@ -48,124 +48,22 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/SetIds/SetIds.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetIds" name="SetIds" version="develop"> +<tool id="met4j_SetIds" name="SetIds" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetIds#if str($colname) != 'nan': -cnew "$colname" @@ -62,387 +62,63 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/SetNames/SetNames.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetNames" name="SetNames" version="develop"> +<tool id="met4j_SetNames" name="SetNames" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetNames#if str($colname) != 'nan': -cname "$colname" @@ -62,309 +62,51 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/SetPathways/SetPathways.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetPathways" name="SetPathways" version="develop"> +<tool id="met4j_SetPathways" name="SetPathways" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetPathways#if str($colp) != 'nan': -cp "$colp" @@ -56,181 +56,31 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/attributes/SetReferences/SetReferences.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SetReferences" name="SetReferences" version="develop"> +<tool id="met4j_SetReferences" name="SetReferences" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh attributes.SetReferences#if str($colRef) != 'nan': -cr "$colRef" @@ -68,89 +68,17 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/bigg/GetBiggModelProteome/GetBiggModelProteome.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_GetBiggModelProteome" name="GetBiggModelProteome" version="develop"> +<tool id="met4j_GetBiggModelProteome" name="GetBiggModelProteome" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh bigg.GetBiggModelProteome -m "$modelId" -o "$outputFile" @@ -22,54 +22,12 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/convert/FbcToNotes/FbcToNotes.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_FbcToNotes" name="FbcToNotes" version="develop"> +<tool id="met4j_FbcToNotes" name="FbcToNotes" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.FbcToNotes -i "$inputPath" -o "$outputPath" @@ -18,101 +18,13 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/convert/Kegg2Sbml/Kegg2Sbml.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Kegg2Sbml" name="Kegg2Sbml" version="develop"> +<tool id="met4j_Kegg2Sbml" name="Kegg2Sbml" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/convert/Sbml2CarbonSkeletonNet/Sbml2CarbonSkeletonNet.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2CarbonSkeletonNet" name="Sbml2CarbonSkeletonNet" version="develop"> +<tool id="met4j_Sbml2CarbonSkeletonNet" name="Sbml2CarbonSkeletonNet" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2CarbonSkeletonNet -i "$inputPath" -g "$inputAAM" @@ -46,324 +46,90 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/convert/Sbml2CompoundGraph/Sbml2CompoundGraph.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2CompoundGraph" name="Sbml2CompoundGraph" version="develop"> +<tool id="met4j_Sbml2CompoundGraph" name="Sbml2CompoundGraph" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2CompoundGraph -i "$inputPath" #if str($inputSide) != 'None': @@ -54,106 +54,31 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/convert/Sbml2Graph/Sbml2Graph.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2Graph" name="Sbml2Graph" version="develop"> +<tool id="met4j_Sbml2Graph" name="Sbml2Graph" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2Graph -i "$inputPath" $bipartite @@ -34,134 +34,38 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/convert/Sbml2PathwayNet/Sbml2PathwayNet.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2PathwayNet" name="Sbml2PathwayNet" version="develop"> +<tool id="met4j_Sbml2PathwayNet" name="Sbml2PathwayNet" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/convert/Sbml2Tab/Sbml2Tab.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Sbml2Tab" name="Sbml2Tab" version="develop"> +<tool id="met4j_Sbml2Tab" name="Sbml2Tab" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Sbml2Tab#if str($i): -irr "$i" @@ -34,270 +34,28 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/convert/SbmlWizard/SbmlWizard.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SbmlWizard" name="SbmlWizard" version="develop"> +<tool id="met4j_SbmlWizard" name="SbmlWizard" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.SbmlWizard -i "$inputPath" #if str($inputSide) != 'None': @@ -56,174 +56,30 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/convert/Tab2Sbml/Tab2Sbml.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_Tab2Sbml" name="Tab2Sbml" version="develop"> +<tool id="met4j_Tab2Sbml" name="Tab2Sbml" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh convert.Tab2Sbml#if str($colid) != 'nan': -ci "$colid" @@ -76,657 +76,63 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/mapping/NameMatcher/NameMatcher.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_NameMatcher" name="NameMatcher" version="develop"> +<tool id="met4j_NameMatcher" name="NameMatcher" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh mapping.NameMatcher#if str($n): -nMatch "$n" @@ -60,7 +60,6 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/mapping/ORApathwayEnrichment/ORApathwayEnrichment.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ORApathwayEnrichment" name="ORApathwayEnrichment" version="develop"> +<tool id="met4j_ORApathwayEnrichment" name="ORApathwayEnrichment" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh mapping.ORApathwayEnrichment#if str($th) != 'nan': -th "$th" @@ -32,262 +32,39 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/BipartiteDistanceMatrix/BipartiteDistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_BipartiteDistanceMatrix" name="BipartiteDistanceMatrix" version="develop"> +<tool id="met4j_BipartiteDistanceMatrix" name="BipartiteDistanceMatrix" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/ChemSimilarityWeighting/ChemSimilarityWeighting.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ChemSimilarityWeighting" name="ChemSimilarityWeighting" version="develop"> +<tool id="met4j_ChemSimilarityWeighting" name="ChemSimilarityWeighting" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ChemSimilarityWeighting#if str($type): -f "$type"
--- a/tools/networkAnalysis/ChokePoint/ChokePoint.xml Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/ChokePoint/ChokePoint.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ChokePoint" name="ChokePoint" version="develop"> +<tool id="met4j_ChokePoint" name="ChokePoint" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ChokePoint -i "$inputPath" -o "$outputPath" @@ -18,125 +18,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/DegreeWeighting/DegreeWeighting.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_DegreeWeighting" name="DegreeWeighting" version="develop"> +<tool id="met4j_DegreeWeighting" name="DegreeWeighting" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/DistanceMatrix/DistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_DistanceMatrix" name="DistanceMatrix" version="develop"> +<tool id="met4j_DistanceMatrix" name="DistanceMatrix" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.DistanceMatrix -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -34,294 +34,30 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/ExtractSubBipNetwork/ExtractSubBipNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubBipNetwork" name="ExtractSubBipNetwork" version="develop"> +<tool id="met4j_ExtractSubBipNetwork" name="ExtractSubBipNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubBipNetwork -i "$inputPath" -s "$sourcePath" @@ -54,53 +54,17 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/ExtractSubNetwork/ExtractSubNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubNetwork" name="ExtractSubNetwork" version="develop"> +<tool id="met4j_ExtractSubNetwork" name="ExtractSubNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubNetwork -i "$inputPath" -s "$sourcePath" @@ -56,55 +56,21 @@ </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/bib/bbv115</citation>
--- a/tools/networkAnalysis/ExtractSubReactionNetwork/ExtractSubReactionNetwork.xml Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/ExtractSubReactionNetwork/ExtractSubReactionNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ExtractSubReactionNetwork" name="ExtractSubReactionNetwork" version="develop"> +<tool id="met4j_ExtractSubReactionNetwork" name="ExtractSubReactionNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ExtractSubReactionNetwork -i "$inputPath" -s "$sourcePath" @@ -54,53 +54,17 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/LoadPoint/LoadPoint.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_LoadPoint" name="LoadPoint" version="develop"> +<tool id="met4j_LoadPoint" name="LoadPoint" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.LoadPoint -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -30,101 +30,13 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/MetaboRank/MetaboRank.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_MetaboRank" name="MetaboRank" version="develop"> +<tool id="met4j_MetaboRank" name="MetaboRank" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.MetaboRank -i "$sbmlFilePath" -s "$seedsFilePath" @@ -44,125 +44,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/NetworkSummary/NetworkSummary.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_NetworkSummary" name="NetworkSummary" version="develop"> +<tool id="met4j_NetworkSummary" name="NetworkSummary" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.NetworkSummary -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -26,89 +26,12 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/PrecursorNetwork/PrecursorNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_PrecursorNetwork" name="PrecursorNetwork" version="develop"> +<tool id="met4j_PrecursorNetwork" name="PrecursorNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.PrecursorNetwork -i "$sbmlFilePath" -t "$targetsFilePath" @@ -38,45 +38,15 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/ReactionDistanceMatrix/ReactionDistanceMatrix.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ReactionDistanceMatrix" name="ReactionDistanceMatrix" version="develop"> +<tool id="met4j_ReactionDistanceMatrix" name="ReactionDistanceMatrix" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ReactionDistanceMatrix -i "$inputPath" #if str($sideCompoundFile) != 'None': @@ -38,982 +38,91 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/ScopeNetwork/ScopeNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_ScopeNetwork" name="ScopeNetwork" version="develop"> +<tool id="met4j_ScopeNetwork" name="ScopeNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.ScopeNetwork -i "$sbmlFilePath" -s "$seedsFilePath" @@ -42,49 +42,16 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/SeedsAndTargets/SeedsAndTargets.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SeedsAndTargets" name="SeedsAndTargets" version="develop"> +<tool id="met4j_SeedsAndTargets" name="SeedsAndTargets" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.SeedsAndTargets -i "$inputPath" #if str($inputSide) != 'None': @@ -44,415 +44,41 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/SideCompoundsScan/SideCompoundsScan.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SideCompoundsScan" name="SideCompoundsScan" version="develop"> +<tool id="met4j_SideCompoundsScan" name="SideCompoundsScan" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.SideCompoundsScan -i "$inputPath" $sideOnly @@ -50,210 +50,23 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/networkAnalysis/TopologicalPathwayAnalysis/TopologicalPathwayAnalysis.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_TopologicalPathwayAnalysis" name="TopologicalPathwayAnalysis" version="develop"> +<tool id="met4j_TopologicalPathwayAnalysis" name="TopologicalPathwayAnalysis" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh networkAnalysis.TopologicalPathwayAnalysis -i "$inputPath" #if str($inputSide) != 'None': @@ -42,294 +42,30 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/reconstruction/CreateMetaNetwork/CreateMetaNetwork.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_CreateMetaNetwork" name="CreateMetaNetwork" version="develop"> +<tool id="met4j_CreateMetaNetwork" name="CreateMetaNetwork" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh reconstruction.CreateMetaNetwork -n1 "$sbml1FilePath" -n2 "$sbml2FilePath" @@ -60,148 +60,18 @@ </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 Fri Jan 31 18:28:53 2025 +0000 +++ b/tools/reconstruction/SbmlCheckBalance/SbmlCheckBalance.xml Mon Feb 03 15:59:46 2025 +0000 @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<tool id="met4j_SbmlCheckBalance" name="SbmlCheckBalance" version="develop"> +<tool id="met4j_SbmlCheckBalance" name="SbmlCheckBalance" version="2.0.0"> <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:develop</container> + <container type="singularity">oras://registry.forgemia.inra.fr/metexplore/met4j/met4j-singularity:2.0.0</container> </requirements> <command detect_errors="exit_code"><![CDATA[sh /usr/bin/met4j.sh reconstruction.SbmlCheckBalance -i "$sbml" -out "$out"