internal/templates/PSFTests-2.0.0.0.xml

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>PSModuleDevelopment.Template.Template</T>
      <T>System.Object</T>
    </TN>
    <ToString>PSModuleDevelopment.Template.Template</ToString>
    <Props>
      <S N="Name">PSFTests</S>
      <Obj N="Type" RefId="1">
        <TN RefId="1">
          <T>PSModuleDevelopment.Template.TemplateType</T>
          <T>System.Enum</T>
          <T>System.ValueType</T>
          <T>System.Object</T>
        </TN>
        <ToString>Project</ToString>
        <I32>1</I32>
      </Obj>
      <Version N="Version">2.0.0.0</Version>
      <S N="Description">The PSFramework-based standard test suite for a PowerShell Module</S>
      <S N="Author">Friedrich Weinmann</S>
      <DT N="CreatedOn">2020-05-30T00:00:00+00:00</DT>
      <Obj N="Tags" RefId="2">
        <TN RefId="2">
          <T>System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]</T>
          <T>System.Object</T>
        </TN>
        <LST>
          <S>Tests</S>
          <S>PSFramework</S>
        </LST>
      </Obj>
      <Obj N="Parameters" RefId="3">
        <TNRef RefId="2" />
        <LST>
          <S>name</S>
        </LST>
      </Obj>
      <Obj N="Scripts" RefId="4">
        <TN RefId="3">
          <T>System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[PSModuleDevelopment.Template.ParameterScript, PSModuleDevelopment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]]</T>
          <T>System.Object</T>
        </TN>
        <DCT>
          <En>
            <S N="Key">testfolder</S>
            <Obj N="Value" RefId="5">
              <TN RefId="4">
                <T>PSModuleDevelopment.Template.ParameterScript</T>
                <T>System.Object</T>
              </TN>
              <ToString>PSModuleDevelopment.Template.ParameterScript</ToString>
              <Props>
                <S N="StringScript">_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009_</S>
                <S N="Name">testfolder</S>
                <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009_</SBK>
              </Props>
              <MS>
                <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAKdGVzdGZvbGRlcgkFAAAABQUAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBAwAAAAYGAAAACQ0KCQkJDQoJCQs=</BA>
              </MS>
            </Obj>
          </En>
          <En>
            <S N="Key">pesterconfig</S>
            <Obj N="Value" RefId="6">
              <TNRef RefId="4" />
              <ToString>PSModuleDevelopment.Template.ParameterScript</ToString>
              <Props>
                <S N="StringScript">_x000D__x000A__x000D__x000A__x0009__x0009_</S>
                <S N="Name">pesterconfig</S>
                <SBK N="ScriptBlock">_x000D__x000A__x000D__x000A__x0009__x0009_</SBK>
              </Props>
              <MS>
                <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAMcGVzdGVyY29uZmlnCQUAAAAFBQAAADtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgEAAAAKU2NyaXB0VGV4dAEDAAAABgYAAAAGDQoNCgkJCw==</BA>
              </MS>
            </Obj>
          </En>
          <En>
            <S N="Key">guid</S>
            <Obj N="Value" RefId="7">
              <TNRef RefId="4" />
              <ToString>PSModuleDevelopment.Template.ParameterScript</ToString>
              <Props>
                <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString()_x000D__x000A__x0009__x0009_</S>
                <S N="Name">guid</S>
                <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString()_x000D__x000A__x0009__x0009_</SBK>
              </Props>
              <MS>
                <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAEZ3VpZAkFAAAABQUAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBAwAAAAYGAAAALA0KCQkJW1N5c3RlbS5HdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCkNCgkJCw==</BA>
              </MS>
            </Obj>
          </En>
        </DCT>
      </Obj>
      <Obj N="Children" RefId="8">
        <TN RefId="5">
          <T>System.Collections.Generic.List`1[[PSModuleDevelopment.Template.TemplateItemBase, PSModuleDevelopment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]]</T>
          <T>System.Object</T>
        </TN>
        <LST>
          <Obj RefId="9">
            <TN RefId="6">
              <T>PSModuleDevelopment.Template.TemplateItemFolder</T>
              <T>PSModuleDevelopment.Template.TemplateItemBase</T>
              <T>System.Object</T>
            </TN>
            <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString>
            <Props>
              <Obj N="Children" RefId="10">
                <TNRef RefId="5" />
                <LST>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                </LST>
              </Obj>
              <S N="Name">functions</S>
              <S N="RelativePath">functions</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="11">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="12">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAACWZ1bmN0aW9ucwYFAAAACWZ1bmN0aW9ucwYGAAAAAsO+CQcAAAAJCAAAAAQDAAAAngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZVtdAgAAAAgICQkAAAABAAAAAQAAAAQHAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQoAAAAAAAAAAAAAAAEIAAAABwAAAAkKAAAAAAAAAAAAAAAHCQAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAkLAAAADQMRCgAAAAAAAAAFCwAAAC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUZpbGUJAAAABVZhbHVlCVBsYWluVGV4dBRDb250ZW50UGFyYW1ldGVyRmxhdBZDb250ZW50UGFyYW1ldGVyU2NyaXB0BE5hbWUMUmVsYXRpdmVQYXRoCklkZW50aWZpZXIXRmlsZVN5c3RlbVBhcmFtZXRlckZsYXQZRmlsZVN5c3RlbVBhcmFtZXRlclNjcmlwdAEAAwMBAQEDAwF/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAGDAAAANUBIyBEZXNjcmlwdGlvbg0KDQpUaGlzIGlzIHdoZXJlIHRoZSBmdW5jdGlvbiB0ZXN0cyBnby4NCg0KTWFrZSBzdXJlIHRvIHB1dCB0aGVtIGluIGZvbGRlcnMgcmVmbGVjdGluZyB0aGUgYWN0dWFsIG1vZHVsZSBzdHJ1Y3R1cmUuDQoNCkl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGFuZCBwdWJsaWMgZnVuY3Rpb25zIGhlcmUuAQkNAAAACQ4AAAAGDwAAAAlyZWFkbWUubWQGEAAAABNmdW5jdGlvbnNccmVhZG1lLm1kCQYAAAAJEgAAAAkTAAAAAQ0AAAAHAAAACQoAAAAAAAAAAAAAAAEOAAAABwAAAAkKAAAAAAAAAAAAAAABEgAAAAcAAAAJCgAAAAAAAAAAAAAAARMAAAAHAAAACQoAAAAAAAAAAAAAAAs=</BA>
            </MS>
          </Obj>
          <Obj RefId="13">
            <TNRef RefId="6" />
            <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString>
            <Props>
              <Obj N="Children" RefId="14">
                <TNRef RefId="5" />
                <LST>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                </LST>
              </Obj>
              <S N="Name">general</S>
              <S N="RelativePath">general</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="15">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="16">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAAB2dlbmVyYWwGBQAAAAdnZW5lcmFsBgYAAAACw74JBwAAAAkIAAAABAMAAACeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlW10CAAAACAgJCQAAAAgAAAAIAAAABAcAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCgAAAAAAAAAAAAAAAQgAAAAHAAAACQoAAAAAAAAAAAAAAAcJAAAAAAEAAAAIAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACQsAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAACREAAAAJEgAAABEKAAAAAAAAAAULAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYTAAAAggYjIExpc3Qgb2YgZm9yYmlkZGVuIGNvbW1hbmRzDQokZ2xvYmFsOkJhbm5lZENvbW1hbmRzID0gQCgNCgknV3JpdGUtSG9zdCcNCgknV3JpdGUtVmVyYm9zZScNCgknV3JpdGUtV2FybmluZycNCgknV3JpdGUtRXJyb3InDQoJJ1dyaXRlLU91dHB1dCcNCgknV3JpdGUtSW5mb3JtYXRpb24nDQoJJ1dyaXRlLURlYnVnJw0KCQ0KCSMgVXNlIENJTSBpbnN0ZWFkIHdoZXJlIHBvc3NpYmxlDQoJJ0dldC1XbWlPYmplY3QnDQoJJ0ludm9rZS1XbWlNZXRob2QnDQoJJ1JlZ2lzdGVyLVdtaUV2ZW50Jw0KCSdSZW1vdmUtV21pT2JqZWN0Jw0KCSdTZXQtV21pSW5zdGFuY2UnDQoNCgkjIFVzZSBHZXQtV2luRXZlbnQgaW5zdGVhZA0KCSdHZXQtRXZlbnRMb2cnDQopDQoNCjwjDQoJQ29udGFpbnMgbGlzdCBvZiBleGNlcHRpb25zIGZvciBiYW5uZWQgY21kbGV0cy4NCglJbnNlcnQgdGhlIGZpbGUgbmFtZXMgb2YgZmlsZXMgdGhhdCBtYXkgY29udGFpbiB0aGVtLg0KCQ0KCUV4YW1wbGU6DQoJIldyaXRlLUhvc3QiICA9IEAoJ1dyaXRlLVBTRkhvc3RDb2xvci5wczEnLCdXcml0ZS1QU0ZNZXNzYWdlLnBzMScpDQojPg0KJGdsb2JhbDpNYXlDb250YWluQ29tbWFuZCA9IEB7DQoJIldyaXRlLUhvc3QiICA9IEAoKQ0KCSJXcml0ZS1WZXJib3NlIiA9IEAoKQ0KCSJXcml0ZS1XYXJuaW5nIiA9IEAoKQ0KCSJXcml0ZS1FcnJvciIgID0gQCgpDQoJIldyaXRlLU91dHB1dCIgPSBAKCkNCgkiV3JpdGUtSW5mb3JtYXRpb24iID0gQCgpDQoJIldyaXRlLURlYnVnIiA9IEAoKQ0KfQEJFAAAAAkVAAAABhYAAAAcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMQYXAAAAJGdlbmVyYWxcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMQkGAAAACRkAAAAJGgAAAAEMAAAACwAAAAYbAAAA4BgkbW9kdWxlUm9vdCA9IChSZXNvbHZlLVBhdGggIiRnbG9iYWw6dGVzdHJvb3RcLi4iKS5QYXRoDQoNCi4gIiRnbG9iYWw6dGVzdHJvb3RcZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxIg0KDQpEZXNjcmliZSAiVmVyaWZ5aW5nIGludGVncml0eSBvZiBtb2R1bGUgZmlsZXMiIHsNCglCZWZvcmVBbGwgew0KCQlmdW5jdGlvbiBHZXQtRmlsZUVuY29kaW5nDQoJCXsNCgkJPCMNCgkJCS5TWU5PUFNJUw0KCQkJCVRlc3RzIGEgZmlsZSBmb3IgZW5jb2RpbmcuDQoJCQkNCgkJCS5ERVNDUklQVElPTg0KCQkJCVRlc3RzIGEgZmlsZSBmb3IgZW5jb2RpbmcuDQoJCQkNCgkJCS5QQVJBTUVURVIgUGF0aA0KCQkJCVRoZSBmaWxlIHRvIHRlc3QNCgkJIz4NCgkJCVtDbWRsZXRCaW5kaW5nKCldDQoJCQlQYXJhbSAoDQoJCQkJW1BhcmFtZXRlcihNYW5kYXRvcnkgPSAkVHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRUcnVlKV0NCgkJCQlbQWxpYXMoJ0Z1bGxOYW1lJyldDQoJCQkJW3N0cmluZ10NCgkJCQkkUGF0aA0KCQkJKQ0KCQkJDQoJCQlpZiAoJFBTVmVyc2lvblRhYmxlLlBTVmVyc2lvbi5NYWpvciAtbHQgNikNCgkJCXsNCgkJCQlbYnl0ZVtdXSRieXRlID0gZ2V0LWNvbnRlbnQgLUVuY29kaW5nIGJ5dGUgLVJlYWRDb3VudCA0IC1Ub3RhbENvdW50IDQgLVBhdGggJFBhdGgNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQlbYnl0ZVtdXSRieXRlID0gR2V0LUNvbnRlbnQgLUFzQnl0ZVN0cmVhbSAtUmVhZENvdW50IDQgLVRvdGFsQ291bnQgNCAtUGF0aCAkUGF0aA0KCQkJfQ0KCQkJDQoJCQlpZiAoJGJ5dGVbMF0gLWVxIDB4ZWYgLWFuZCAkYnl0ZVsxXSAtZXEgMHhiYiAtYW5kICRieXRlWzJdIC1lcSAweGJmKSB7ICdVVEY4IEJPTScgfQ0KCQkJZWxzZWlmICgkYnl0ZVswXSAtZXEgMHhmZSAtYW5kICRieXRlWzFdIC1lcSAweGZmKSB7ICdVbmljb2RlJyB9DQoJCQllbHNlaWYgKCRieXRlWzBdIC1lcSAwIC1hbmQgJGJ5dGVbMV0gLWVxIDAgLWFuZCAkYnl0ZVsyXSAtZXEgMHhmZSAtYW5kICRieXRlWzNdIC1lcSAweGZmKSB7ICdVVEYzMicgfQ0KCQkJZWxzZWlmICgkYnl0ZVswXSAtZXEgMHgyYiAtYW5kICRieXRlWzFdIC1lcSAweDJmIC1hbmQgJGJ5dGVbMl0gLWVxIDB4NzYpIHsgJ1VURjcnIH0NCgkJCWVsc2UgeyAnVW5rbm93bicgfQ0KCQl9DQoJfQ0KDQoJQ29udGV4dCAiVmFsaWRhdGluZyBQUzEgU2NyaXB0IGZpbGVzIiB7DQoJCSRhbGxGaWxlcyA9IEdldC1DaGlsZEl0ZW0gLVBhdGggJG1vZHVsZVJvb3QgLVJlY3Vyc2UgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiIHwgV2hlcmUtT2JqZWN0IEZ1bGxOYW1lIC1Ob3RMaWtlICIkbW9kdWxlUm9vdFx0ZXN0c1wqIg0KCQkNCgkJZm9yZWFjaCAoJGZpbGUgaW4gJGFsbEZpbGVzKQ0KCQl7DQoJCQkkbmFtZSA9ICRmaWxlLkZ1bGxOYW1lLlJlcGxhY2UoIiRtb2R1bGVSb290XCIsICcnKQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBVVEY4IGVuY29kaW5nIHdpdGggQnl0ZSBPcmRlciBNYXJrIiAtVGVzdENhc2VzIEB7IGZpbGUgPSAkZmlsZSB9IHsNCgkJCQlHZXQtRmlsZUVuY29kaW5nIC1QYXRoICRmaWxlLkZ1bGxOYW1lIHwgU2hvdWxkIC1CZSAnVVRGOCBCT00nDQoJCQl9DQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHRyYWlsaW5nIHNwYWNlIiAtVGVzdENhc2VzIEB7IGZpbGUgPSAkZmlsZSB9IHsNCgkJCQkoJGZpbGUgfCBTZWxlY3QtU3RyaW5nICJccyQiIHwgV2hlcmUtT2JqZWN0IHsgJF8uTGluZS5UcmltKCkuTGVuZ3RoIC1ndCAwfSkuTGluZU51bWJlciB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQkJfQ0KCQkJDQoJCQkkdG9rZW5zID0gJG51bGwNCgkJCSRwYXJzZUVycm9ycyA9ICRudWxsDQoJCQkkYXN0ID0gW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uTGFuZ3VhZ2UuUGFyc2VyXTo6UGFyc2VGaWxlKCRmaWxlLkZ1bGxOYW1lLCBbcmVmXSR0b2tlbnMsIFtyZWZdJHBhcnNlRXJyb3JzKQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBubyBzeW50YXggZXJyb3JzIiAtVGVzdENhc2VzIEB7IHBhcnNlRXJyb3JzID0gJHBhcnNlRXJyb3JzIH0gew0KCQkJCSRwYXJzZUVycm9ycyB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQkJfQ0KCQkJDQoJCQlmb3JlYWNoICgkY29tbWFuZCBpbiAkZ2xvYmFsOkJhbm5lZENvbW1hbmRzKQ0KCQkJew0KCQkJCWlmICgkZ2xvYmFsOk1heUNvbnRhaW5Db21tYW5kWyIkY29tbWFuZCJdIC1ub3Rjb250YWlucyAkZmlsZS5OYW1lKQ0KCQkJCXsNCgkJCQkJSXQgIlskbmFtZV0gU2hvdWxkIG5vdCB1c2UgJGNvbW1hbmQiIC1UZXN0Q2FzZXMgQHsgdG9rZW5zID0gJHRva2VuczsgY29tbWFuZCA9ICRjb21tYW5kIH0gew0KCQkJCQkJJHRva2VucyB8IFdoZXJlLU9iamVjdCBUZXh0IC1FUSAkY29tbWFuZCB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCQ0KCUNvbnRleHQgIlZhbGlkYXRpbmcgaGVscC50eHQgaGVscCBmaWxlcyIgew0KCQkkYWxsRmlsZXMgPSBHZXQtQ2hpbGRJdGVtIC1QYXRoICRtb2R1bGVSb290IC1SZWN1cnNlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIiouaGVscC50eHQiIHwgV2hlcmUtT2JqZWN0IEZ1bGxOYW1lIC1Ob3RMaWtlICIkbW9kdWxlUm9vdFx0ZXN0c1wqIg0KCQkNCgkJZm9yZWFjaCAoJGZpbGUgaW4gJGFsbEZpbGVzKQ0KCQl7DQoJCQkkbmFtZSA9ICRmaWxlLkZ1bGxOYW1lLlJlcGxhY2UoIiRtb2R1bGVSb290XCIsICcnKQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBVVEY4IGVuY29kaW5nIiAtVGVzdENhc2VzIEB7IGZpbGUgPSAkZmlsZSB9IHsNCgkJCQlHZXQtRmlsZUVuY29kaW5nIC1QYXRoICRmaWxlLkZ1bGxOYW1lIHwgU2hvdWxkIC1CZSAnVVRGOCBCT00nDQoJCQl9DQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHRyYWlsaW5nIHNwYWNlIiAtVGVzdENhc2VzIEB7IGZpbGUgPSAkZmlsZSB9IHsNCgkJCQkoJGZpbGUgfCBTZWxlY3QtU3RyaW5nICJccyQiIHwgV2hlcmUtT2JqZWN0IHsgJF8uTGluZS5UcmltKCkuTGVuZ3RoIC1ndCAwIH0gfCBNZWFzdXJlLU9iamVjdCkuQ291bnQgfCBTaG91bGQgLUJlIDANCgkJCX0NCgkJfQ0KCX0NCn0BCRwAAAAJHQAAAAYeAAAAF0ZpbGVJbnRlZ3JpdHkuVGVzdHMucHMxBh8AAAAfZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LlRlc3RzLnBzMQkGAAAACSEAAAAJIgAAAAENAAAACwAAAAYjAAAAnQUjIExpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQNCiRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMgPSBAKA0KICAgIA0KKQ0KDQo8Iw0KICBMaXN0IG9mIGFycmF5ZWQgZW51bWVyYXRpb25zLiBUaGVzZSBuZWVkIHRvIGJlIHRyZWF0ZWQgZGlmZmVyZW50bHkuIEFkZCBmdWxsIG5hbWUuDQogIEV4YW1wbGU6DQoNCiAgIlNxbGNvbGxhYm9yYXRpdmUuRGJhdG9vbHMuQ29ubmVjdGlvbi5NYW5hZ2VtZW50Q29ubmVjdGlvblR5cGVbXSINCiM+DQokZ2xvYmFsOkhlbHBUZXN0RW51bWVyYXRlZEFycmF5cyA9IEAoDQoJDQopDQoNCjwjDQogIFNvbWUgdHlwZXMgb24gcGFyYW1ldGVycyBqdXN0IGZhaWwgdGhlaXIgdmFsaWRhdGlvbiBubyBtYXR0ZXIgd2hhdC4NCiAgRm9yIHRob3NlIGl0IGJlY29tZXMgcG9zc2libGUgdG8gc2tpcCB0aGVtLCBieSBhZGRpbmcgdGhlbSB0byB0aGlzIGhhc2h0YWJsZS4NCiAgQWRkIGJ5IGZvbGxvd2luZyB0aGlzIGNvbnZlbnRpb246IDxjb21tYW5kIG5hbWU+ID0gQCg8bGlzdCBvZiBwYXJhbWV0ZXIgbmFtZXM+KQ0KICBFeGFtcGxlOg0KDQogICJHZXQtRGJhQ21PYmplY3QiICAgICAgID0gQCgiRG9Ob3RVc2UiKQ0KIz4NCiRnbG9iYWw6SGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZSA9IEB7DQogICAgDQp9DQoBCSQAAAAJJQAAAAYmAAAAE0hlbHAuRXhjZXB0aW9ucy5wczEGJwAAABtnZW5lcmFsXEhlbHAuRXhjZXB0aW9ucy5wczEJBgAAAAkpAAAACSoAAAABDgAAAAsAAAAGKwAAAOMzPCMNCiAgICAuTk9URVMNCiAgICAgICAgVGhlIG9yaWdpbmFsIHRlc3QgdGhpcyBpcyBiYXNlZCB1cG9uIHdhcyB3cml0dGVuIGJ5IEp1bmUgQmxlbmRlci4NCgkJQWZ0ZXIgc2V2ZXJhbCByb3VuZHMgb2YgbW9kaWZpY2F0aW9ucyBpdCBzdGFuZHMgbm93IGFzIGl0IGlzLCBidXQgdGhlIGhvbm9yIHJlbWFpbnMgaGVycy4NCg0KCQlUaGFuayB5b3UgSnVuZSwgZm9yIGFsbCB5b3UgaGF2ZSBkb25lIQ0KDQogICAgLkRFU0NSSVBUSU9ODQoJCVRoaXMgdGVzdCBldmFsdWF0ZXMgdGhlIGhlbHAgZm9yIGFsbCBjb21tYW5kcyBpbiBhIG1vZHVsZS4NCg0KCS5QQVJBTUVURVIgU2tpcFRlc3QNCgkJRGlzYWJsZXMgdGhpcyB0ZXN0Lg0KCQ0KCS5QQVJBTUVURVIgQ29tbWFuZFBhdGgNCgkJTGlzdCBvZiBwYXRocyB1bmRlciB3aGljaCB0aGUgc2NyaXB0IGZpbGVzIGFyZSBzdG9yZWQuDQoJCVRoaXMgdGVzdCBhc3N1bWVzIHRoYXQgYWxsIGZ1bmN0aW9ucyBoYXZlIHRoZWlyIG93biBmaWxlIHRoYXQgaXMgbmFtZWQgYWZ0ZXIgdGhlbXNlbHZlcy4NCgkJVGhlc2UgcGF0aHMgYXJlIHVzZWQgdG8gc2VhcmNoIGZvciBjb21tYW5kcyB0aGF0IHNob3VsZCBleGlzdCBhbmQgYmUgdGVzdGVkLg0KCQlXaWxsIHNlYXJjaCByZWN1cnNpdmVseSBhbmQgYWNjZXB0cyB3aWxkY2FyZHMsIG1ha2Ugc3VyZSBvbmx5IGZ1bmN0aW9ucyBhcmUgZm91bmQNCg0KCS5QQVJBTUVURVIgTW9kdWxlTmFtZQ0KCQlOYW1lIG9mIHRoZSBtb2R1bGUgdG8gYmUgdGVzdGVkLg0KCQlUaGUgbW9kdWxlIG11c3QgYWxyZWFkeSBiZSBpbXBvcnRlZA0KDQoJLlBBUkFNRVRFUiBFeGNlcHRpb25zRmlsZQ0KCQlGaWxlIGluIHdoaWNoIGV4Y2VwdGlvbnMgYW5kIGFkanVzdG1lbnRzIGFyZSBjb25maWd1cmVkLg0KCQlJbiBpdCB0aGVyZSBzaG91bGQgYmUgdHdvIGFycmF5cyBhbmQgYSBoYXNodGFibGUgZGVmaW5lZDoNCgkJCSRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMNCgkJCSRnbG9iYWw6SGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzDQoJCQkkZ2xvYmFsOkhlbHBUZXN0U2tpcFBhcmFtZXRlclR5cGUNCgkJVGhlc2UgY2FuIGJlIHVzZWQgdG8gdHdlYWsgdGhlIHRlc3RzIHNsaWdodGx5IGluIGNhc2VzIG9mIG5lZWQuDQoJCVNlZSB0aGUgZXhhbXBsZSBmaWxlIGZvciBleHBsYW5hdGlvbnMgb24gZWFjaCBvZiB0aGVzZSB1c2FnZSBhbmQgZWZmZWN0Lg0KIz4NCltDbWRsZXRCaW5kaW5nKCldDQpQYXJhbSAoDQoJW3N3aXRjaF0NCgkkU2tpcFRlc3QsDQoJDQoJW3N0cmluZ1tdXQ0KCSRDb21tYW5kUGF0aCA9IEAoIiRnbG9iYWw6dGVzdHJvb3RcLi5cZnVuY3Rpb25zIiwgIiRnbG9iYWw6dGVzdHJvb3RcLi5caW50ZXJuYWxcZnVuY3Rpb25zIiksDQoJDQoJW3N0cmluZ10NCgkkTW9kdWxlTmFtZSA9ICLDvm5hbWXDviIsDQoJDQoJW3N0cmluZ10NCgkkRXhjZXB0aW9uc0ZpbGUgPSAiJGdsb2JhbDp0ZXN0cm9vdFxnZW5lcmFsXEhlbHAuRXhjZXB0aW9ucy5wczEiDQopDQppZiAoJFNraXBUZXN0KSB7IHJldHVybiB9DQouICRFeGNlcHRpb25zRmlsZQ0KDQokaW5jbHVkZWROYW1lcyA9IChHZXQtQ2hpbGRJdGVtICRDb21tYW5kUGF0aCAtUmVjdXJzZSAtRmlsZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLnBzMSIpLkJhc2VOYW1lDQokY29tbWFuZHMgPSBHZXQtQ29tbWFuZCAtTW9kdWxlIChHZXQtTW9kdWxlICRNb2R1bGVOYW1lKSAtQ29tbWFuZFR5cGUgQ21kbGV0LCBGdW5jdGlvbiwgV29ya2Zsb3cgfCBXaGVyZS1PYmplY3QgTmFtZSAtaW4gJGluY2x1ZGVkTmFtZXMNCg0KIyMgV2hlbiB0ZXN0aW5nIGhlbHAsIHJlbWVtYmVyIHRoYXQgaGVscCBpcyBjYWNoZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNlc3Npb24uDQojIyBUbyB0ZXN0LCByZXN0YXJ0IHNlc3Npb24uDQoNCg0KZm9yZWFjaCAoJGNvbW1hbmQgaW4gJGNvbW1hbmRzKSB7DQogICAgJGNvbW1hbmROYW1lID0gJGNvbW1hbmQuTmFtZQ0KICAgIA0KICAgICMgU2tpcCBhbGwgZnVuY3Rpb25zIHRoYXQgYXJlIG9uIHRoZSBleGNsdXNpb25zIGxpc3QNCiAgICBpZiAoJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucyAtY29udGFpbnMgJGNvbW1hbmROYW1lKSB7IGNvbnRpbnVlIH0NCiAgICANCiAgICAjIFRoZSBtb2R1bGUtcXVhbGlmaWVkIGNvbW1hbmQgZmFpbHMgb24gTWljcm9zb2Z0LlBvd2VyU2hlbGwuQXJjaGl2ZSBjbWRsZXRzDQogICAgJEhlbHAgPSBHZXQtSGVscCAkY29tbWFuZE5hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUNCgkNCglEZXNjcmliZSAiVGVzdCBoZWxwIGZvciAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgDQoJCSMgSWYgaGVscCBpcyBub3QgZm91bmQsIHN5bm9wc2lzIGluIGF1dG8tZ2VuZXJhdGVkIGhlbHAgaXMgdGhlIHN5bnRheCBkaWFncmFtDQoJCUl0ICJzaG91bGQgbm90IGJlIGF1dG8tZ2VuZXJhdGVkIiAtVGVzdENhc2VzIEB7IEhlbHAgPSAkSGVscCB9IHsNCgkJCSRIZWxwLlN5bm9wc2lzIHwgU2hvdWxkIC1Ob3QgLUJlTGlrZSAnKmBbYDxDb21tb25QYXJhbWV0ZXJzYD5gXSonDQoJCX0NCiAgICAgICAgDQoJCSMgU2hvdWxkIGJlIGEgZGVzY3JpcHRpb24gZm9yIGV2ZXJ5IGZ1bmN0aW9uDQoJCUl0ICJnZXRzIGRlc2NyaXB0aW9uIGZvciAkY29tbWFuZE5hbWUiIC1UZXN0Q2FzZXMgQHsgSGVscCA9ICRIZWxwIH0gew0KCQkJJEhlbHAuRGVzY3JpcHRpb24gfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQogICAgICAgIA0KCQkjIFNob3VsZCBiZSBhdCBsZWFzdCBvbmUgZXhhbXBsZQ0KCQlJdCAiZ2V0cyBleGFtcGxlIGNvZGUgZnJvbSAkY29tbWFuZE5hbWUiIC1UZXN0Q2FzZXMgQHsgSGVscCA9ICRIZWxwIH0gew0KCQkJKCRIZWxwLkV4YW1wbGVzLkV4YW1wbGUgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKS5Db2RlIHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCQ0KCQkjIFNob3VsZCBiZSBhdCBsZWFzdCBvbmUgZXhhbXBsZSBkZXNjcmlwdGlvbg0KCQlJdCAiZ2V0cyBleGFtcGxlIGhlbHAgZnJvbSAkY29tbWFuZE5hbWUiIC1UZXN0Q2FzZXMgQHsgSGVscCA9ICRIZWxwIH0gew0KCQkJKCRIZWxwLkV4YW1wbGVzLkV4YW1wbGUuUmVtYXJrcyB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDEpLlRleHQgfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQogICAgICAgIA0KICAgICAgICBDb250ZXh0ICJUZXN0IHBhcmFtZXRlciBoZWxwIGZvciAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJGNvbW1vbiA9ICdEZWJ1ZycsICdFcnJvckFjdGlvbicsICdFcnJvclZhcmlhYmxlJywgJ0luZm9ybWF0aW9uQWN0aW9uJywgJ0luZm9ybWF0aW9uVmFyaWFibGUnLCAnT3V0QnVmZmVyJywgJ091dFZhcmlhYmxlJywgJ1BpcGVsaW5lVmFyaWFibGUnLCAnVmVyYm9zZScsICdXYXJuaW5nQWN0aW9uJywgJ1dhcm5pbmdWYXJpYWJsZScNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHBhcmFtZXRlcnMgPSAkY29tbWFuZC5QYXJhbWV0ZXJTZXRzLlBhcmFtZXRlcnMgfCBTb3J0LU9iamVjdCAtUHJvcGVydHkgTmFtZSAtVW5pcXVlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLW5vdGluICRjb21tb24NCiAgICAgICAgICAgICRwYXJhbWV0ZXJOYW1lcyA9ICRwYXJhbWV0ZXJzLk5hbWUNCiAgICAgICAgICAgICRIZWxwUGFyYW1ldGVyTmFtZXMgPSAkSGVscC5QYXJhbWV0ZXJzLlBhcmFtZXRlci5OYW1lIHwgU29ydC1PYmplY3QgLVVuaXF1ZQ0KICAgICAgICAgICAgZm9yZWFjaCAoJHBhcmFtZXRlciBpbiAkcGFyYW1ldGVycykgew0KICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJOYW1lID0gJHBhcmFtZXRlci5OYW1lDQogICAgICAgICAgICAgICAgJHBhcmFtZXRlckhlbHAgPSAkSGVscC5wYXJhbWV0ZXJzLnBhcmFtZXRlciB8IFdoZXJlLU9iamVjdCBOYW1lIC1FUSAkcGFyYW1ldGVyTmFtZQ0KCQkJDQoJCQkJIyBTaG91bGQgYmUgYSBkZXNjcmlwdGlvbiBmb3IgZXZlcnkgcGFyYW1ldGVyDQoJCQkJSXQgImdldHMgaGVscCBmb3IgcGFyYW1ldGVyOiAkcGFyYW1ldGVyTmFtZSA6IGluICRjb21tYW5kTmFtZSIgLVRlc3RDYXNlcyBAeyBwYXJhbWV0ZXJIZWxwID0gJHBhcmFtZXRlckhlbHAgfSB7DQoJCQkJCSRwYXJhbWV0ZXJIZWxwLkRlc2NyaXB0aW9uLlRleHQgfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KCQkJCX0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkY29kZU1hbmRhdG9yeSA9ICRwYXJhbWV0ZXIuSXNNYW5kYXRvcnkudG9TdHJpbmcoKQ0KCQkJCUl0ICJoZWxwIGZvciAkcGFyYW1ldGVyTmFtZSBwYXJhbWV0ZXIgaW4gJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IE1hbmRhdG9yeSB2YWx1ZSIgLVRlc3RDYXNlcyBAeyBwYXJhbWV0ZXJIZWxwID0gJHBhcmFtZXRlckhlbHA7IGNvZGVNYW5kYXRvcnkgPSAkY29kZU1hbmRhdG9yeSB9IHsNCgkJCQkJJHBhcmFtZXRlckhlbHAuUmVxdWlyZWQgfCBTaG91bGQgLUJlICRjb2RlTWFuZGF0b3J5DQoJCQkJfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICgkSGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZVskY29tbWFuZE5hbWVdIC1jb250YWlucyAkcGFyYW1ldGVyTmFtZSkgeyBjb250aW51ZSB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJGNvZGVUeXBlID0gJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLk5hbWUNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLklzRW51bSkgew0KICAgICAgICAgICAgICAgICAgICAjIEVudW1lcmF0aW9ucyBvZnRlbiBoYXZlIGlzc3VlcyB3aXRoIHRoZSB0eXBlbmFtZSBub3QgYmVpbmcgcmVsaWFibHkgYXZhaWxhYmxlDQogICAgICAgICAgICAgICAgICAgICRuYW1lcyA9ICRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZTo6R2V0TmFtZXMoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlKQ0KCQkJCQkJIyBQYXJhbWV0ZXIgdHlwZSBpbiBIZWxwIHNob3VsZCBtYXRjaCBjb2RlDQoJCQkJCUl0ICJoZWxwIGZvciAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGUgZm9yICRwYXJhbWV0ZXJOYW1lIiAtVGVzdENhc2VzIEB7IHBhcmFtZXRlckhlbHAgPSAkcGFyYW1ldGVySGVscDsgbmFtZXMgPSAkbmFtZXMgfSB7DQoJCQkJCQkkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZUdyb3VwLnBhcmFtZXRlclZhbHVlIHwgU2hvdWxkIC1iZSAkbmFtZXMNCgkJCQkJfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlaWYgKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5GdWxsTmFtZSAtaW4gJEhlbHBUZXN0RW51bWVyYXRlZEFycmF5cykgew0KICAgICAgICAgICAgICAgICAgICAjIEVudW1lcmF0aW9ucyBvZnRlbiBoYXZlIGlzc3VlcyB3aXRoIHRoZSB0eXBlbmFtZSBub3QgYmVpbmcgcmVsaWFibHkgYXZhaWxhYmxlDQogICAgICAgICAgICAgICAgICAgICRuYW1lcyA9IFtFbnVtXTo6R2V0TmFtZXMoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLkRlY2xhcmVkTWVtYmVyc1swXS5SZXR1cm5UeXBlKQ0KCQkJCQlJdCAiaGVscCBmb3IgJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IHBhcmFtZXRlciB0eXBlIGZvciAkcGFyYW1ldGVyTmFtZSIgLVRlc3RDYXNlcyBAeyBwYXJhbWV0ZXJIZWxwID0gJHBhcmFtZXRlckhlbHA7IG5hbWVzID0gJG5hbWVzIH0gew0KCQkJCQkJJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWVHcm91cC5wYXJhbWV0ZXJWYWx1ZSB8IFNob3VsZCAtYmUgJG5hbWVzDQoJCQkJCX0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICMgVG8gYXZvaWQgY2FsbGluZyBUcmltIG1ldGhvZCBvbiBhIG51bGwgb2JqZWN0Lg0KICAgICAgICAgICAgICAgICAgICAkaGVscFR5cGUgPSBpZiAoJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWUpIHsgJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWUuVHJpbSgpIH0NCgkJCQkJIyBQYXJhbWV0ZXIgdHlwZSBpbiBIZWxwIHNob3VsZCBtYXRjaCBjb2RlDQoJCQkJCUl0ICJoZWxwIGZvciAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGUgZm9yICRwYXJhbWV0ZXJOYW1lIiAtVGVzdENhc2VzIEB7IGhlbHBUeXBlID0gJGhlbHBUeXBlOyBjb2RlVHlwZSA9ICRjb2RlVHlwZSB9IHsNCgkJCQkJCSRoZWxwVHlwZSB8IFNob3VsZCAtYmUgJGNvZGVUeXBlDQoJCQkJCX0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3JlYWNoICgkaGVscFBhcm0gaW4gJEhlbHBQYXJhbWV0ZXJOYW1lcykgew0KCQkJCSMgU2hvdWxkbid0IGZpbmQgZXh0cmEgcGFyYW1ldGVycyBpbiBoZWxwLg0KCQkJCUl0ICJmaW5kcyBoZWxwIHBhcmFtZXRlciBpbiBjb2RlOiAkaGVscFBhcm0iIC1UZXN0Q2FzZXMgQHsgaGVscFBhcm0gPSAkaGVscFBhcm07IHBhcmFtZXRlck5hbWVzID0gJHBhcmFtZXRlck5hbWVzIH0gew0KCQkJCQkkaGVscFBhcm0gLWluICRwYXJhbWV0ZXJOYW1lcyB8IFNob3VsZCAtQmUgJHRydWUNCgkJCQl9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9AQksAAAACS0AAAAGLgAAAA5IZWxwLlRlc3RzLnBzMQYvAAAAFmdlbmVyYWxcSGVscC5UZXN0cy5wczEJBgAAAAkxAAAACTIAAAABDwAAAAsAAAAGMwAAAMsVRGVzY3JpYmUgIlZhbGlkYXRpbmcgdGhlIG1vZHVsZSBtYW5pZmVzdCIgew0KCSRtb2R1bGVSb290ID0gKFJlc29sdmUtUGF0aCAiJGdsb2JhbDp0ZXN0cm9vdFwuLiIpLlBhdGgNCgkkbWFuaWZlc3QgPSAoKEdldC1Db250ZW50ICIkbW9kdWxlUm9vdFzDvm5hbWXDvi5wc2QxIikgLWpvaW4gImBuIikgfCBJbnZva2UtRXhwcmVzc2lvbg0KCUNvbnRleHQgIkJhc2ljIHJlc291cmNlcyB2YWxpZGF0aW9uIiB7DQoJCSRmaWxlcyA9IEdldC1DaGlsZEl0ZW0gIiRtb2R1bGVSb290XGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbGUgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiDQoJCUl0ICJFeHBvcnRzIGFsbCBmdW5jdGlvbnMgaW4gdGhlIHB1YmxpYyBmb2xkZXIiIC1UZXN0Q2FzZXMgQHsgZmlsZXMgPSAkZmlsZXM7IG1hbmlmZXN0ID0gJG1hbmlmZXN0IH0gew0KCQkJDQoJCQkkZnVuY3Rpb25zID0gKENvbXBhcmUtT2JqZWN0IC1SZWZlcmVuY2VPYmplY3QgJGZpbGVzLkJhc2VOYW1lIC1EaWZmZXJlbmNlT2JqZWN0ICRtYW5pZmVzdC5GdW5jdGlvbnNUb0V4cG9ydCB8IFdoZXJlLU9iamVjdCBTaWRlSW5kaWNhdG9yIC1MaWtlICc8PScpLklucHV0T2JqZWN0DQoJCQkkZnVuY3Rpb25zIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCX0NCgkJSXQgIkV4cG9ydHMgbm8gZnVuY3Rpb24gdGhhdCBpc24ndCBhbHNvIHByZXNlbnQgaW4gdGhlIHB1YmxpYyBmb2xkZXIiIC1UZXN0Q2FzZXMgQHsgZmlsZXMgPSAkZmlsZXM7IG1hbmlmZXN0ID0gJG1hbmlmZXN0IH0gew0KCQkJJGZ1bmN0aW9ucyA9IChDb21wYXJlLU9iamVjdCAtUmVmZXJlbmNlT2JqZWN0ICRmaWxlcy5CYXNlTmFtZSAtRGlmZmVyZW5jZU9iamVjdCAkbWFuaWZlc3QuRnVuY3Rpb25zVG9FeHBvcnQgfCBXaGVyZS1PYmplY3QgU2lkZUluZGljYXRvciAtTGlrZSAnPT4nKS5JbnB1dE9iamVjdA0KCQkJJGZ1bmN0aW9ucyB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQoJCQ0KCQlJdCAiRXhwb3J0cyBub25lIG9mIGl0cyBpbnRlcm5hbCBmdW5jdGlvbnMiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyBtYW5pZmVzdCA9ICRtYW5pZmVzdCB9IHsNCgkJCSRmaWxlcyA9IEdldC1DaGlsZEl0ZW0gIiRtb2R1bGVSb290XGludGVybmFsXGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbGUgLUZpbHRlciAiKi5wczEiDQoJCQkkZmlsZXMgfCBXaGVyZS1PYmplY3QgQmFzZU5hbWUgLUluICRtYW5pZmVzdC5GdW5jdGlvbnNUb0V4cG9ydCB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQoJfQ0KCQ0KCUNvbnRleHQgIkluZGl2aWR1YWwgZmlsZSB2YWxpZGF0aW9uIiB7DQoJCUl0ICJUaGUgcm9vdCBtb2R1bGUgZmlsZSBleGlzdHMiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyBtYW5pZmVzdCA9ICRtYW5pZmVzdCB9IHsNCgkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJCgkbWFuaWZlc3QuUm9vdE1vZHVsZSkiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQl9DQoJCQ0KCQlmb3JlYWNoICgkZm9ybWF0IGluICRtYW5pZmVzdC5Gb3JtYXRzVG9Qcm9jZXNzKQ0KCQl7DQoJCQlJdCAiVGhlIGZpbGUgJGZvcm1hdCBzaG91bGQgZXhpc3QiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyBmb3JtYXQgPSAkZm9ybWF0IH0gew0KCQkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJGZvcm1hdCIgfCBTaG91bGQgLUJlICR0cnVlDQoJCQl9DQoJCX0NCgkJDQoJCWZvcmVhY2ggKCR0eXBlIGluICRtYW5pZmVzdC5UeXBlc1RvUHJvY2VzcykNCgkJew0KCQkJSXQgIlRoZSBmaWxlICR0eXBlIHNob3VsZCBleGlzdCIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IHR5cGUgPSAkdHlwZSB9IHsNCgkJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCR0eXBlIiB8IFNob3VsZCAtQmUgJHRydWUNCgkJCX0NCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJGFzc2VtYmx5IGluICRtYW5pZmVzdC5SZXF1aXJlZEFzc2VtYmxpZXMpDQoJCXsNCiAgICAgICAgICAgIGlmICgkYXNzZW1ibHkgLWxpa2UgIiouZGxsIikgew0KICAgICAgICAgICAgICAgIEl0ICJUaGUgZmlsZSAkYXNzZW1ibHkgc2hvdWxkIGV4aXN0IiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgYXNzZW1ibHkgPSAkYXNzZW1ibHkgfSB7DQogICAgICAgICAgICAgICAgICAgIFRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJGFzc2VtYmx5IiB8IFNob3VsZCAtQmUgJHRydWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBJdCAiVGhlIGZpbGUgJGFzc2VtYmx5IHNob3VsZCBsb2FkIGZyb20gdGhlIEdBQyIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IGFzc2VtYmx5ID0gJGFzc2VtYmx5IH0gew0KICAgICAgICAgICAgICAgICAgICB7IEFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgJGFzc2VtYmx5IH0gfCBTaG91bGQgLU5vdCAtVGhyb3cNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCgkJDQoJCWZvcmVhY2ggKCR0YWcgaW4gJG1hbmlmZXN0LlByaXZhdGVEYXRhLlBTRGF0YS5UYWdzKQ0KCQl7DQoJCQlJdCAiVGFncyBzaG91bGQgaGF2ZSBubyBzcGFjZXMgaW4gbmFtZSIgLVRlc3RDYXNlcyBAeyB0YWcgPSAkdGFnIH0gew0KCQkJCSR0YWcgLW1hdGNoICIgIiB8IFNob3VsZCAtQmUgJGZhbHNlDQoJCQl9DQoJCX0NCgl9DQp9AQk0AAAACTUAAAAGNgAAABJNYW5pZmVzdC5UZXN0cy5wczEGNwAAABpnZW5lcmFsXE1hbmlmZXN0LlRlc3RzLnBzMQkGAAAACTkAAAAJOgAAAAEQAAAACwAAAAY7AAAA6whbQ21kbGV0QmluZGluZygpXQ0KUGFyYW0gKA0KCVtzd2l0Y2hdDQoJJFNraXBUZXN0LA0KCQ0KCVtzdHJpbmdbXV0NCgkkQ29tbWFuZFBhdGggPSBAKCIkZ2xvYmFsOnRlc3Ryb290XC4uXGZ1bmN0aW9ucyIsICIkZ2xvYmFsOnRlc3Ryb290XC4uXGludGVybmFsXGZ1bmN0aW9ucyIpDQopDQoNCmlmICgkU2tpcFRlc3QpIHsgcmV0dXJuIH0NCg0KJGdsb2JhbDpfX3Blc3Rlcl9kYXRhLlNjcmlwdEFuYWx5emVyID0gTmV3LU9iamVjdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0DQoNCkRlc2NyaWJlICdJbnZva2luZyBQU1NjcmlwdEFuYWx5emVyIGFnYWluc3QgY29tbWFuZGJhc2UnIHsNCgkkY29tbWFuZEZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkQ29tbWFuZFBhdGggLVJlY3Vyc2UgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiDQoJJHNjcmlwdEFuYWx5emVyUnVsZXMgPSBHZXQtU2NyaXB0QW5hbHl6ZXJSdWxlDQoJDQoJZm9yZWFjaCAoJGZpbGUgaW4gJGNvbW1hbmRGaWxlcykNCgl7DQoJCUNvbnRleHQgIkFuYWx5emluZyAkKCRmaWxlLkJhc2VOYW1lKSIgew0KCQkJJGFuYWx5c2lzID0gSW52b2tlLVNjcmlwdEFuYWx5emVyIC1QYXRoICRmaWxlLkZ1bGxOYW1lIC1FeGNsdWRlUnVsZSBQU0F2b2lkVHJhaWxpbmdXaGl0ZXNwYWNlLCBQU1Nob3VsZFByb2Nlc3MNCgkJCQ0KCQkJZm9yRWFjaCAoJHJ1bGUgaW4gJHNjcmlwdEFuYWx5emVyUnVsZXMpDQoJCQl7DQoJCQkJSXQgIlNob3VsZCBwYXNzICRydWxlIiAtVGVzdENhc2VzIEB7IGFuYWx5c2lzID0gJGFuYWx5c2lzOyBydWxlID0gJHJ1bGUgfSB7DQoJCQkJCUlmICgkYW5hbHlzaXMuUnVsZU5hbWUgLWNvbnRhaW5zICRydWxlKQ0KCQkJCQl7DQoJCQkJCQkkYW5hbHlzaXMgfCBXaGVyZS1PYmplY3QgUnVsZU5hbWUgLUVRICRydWxlIC1vdXR2YXJpYWJsZSBmYWlsdXJlcyB8IEZvckVhY2gtT2JqZWN0IHsgJG51bGwgPSAkZ2xvYmFsOl9fcGVzdGVyX2RhdGEuU2NyaXB0QW5hbHl6ZXIuQWRkKCRfKSB9DQoJCQkJCQkNCgkJCQkJCTEgfCBTaG91bGQgLUJlIDANCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCTAgfCBTaG91bGQgLUJlIDANCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCn0BCTwAAAAJPQAAAAY+AAAAGlBTU2NyaXB0QW5hbHl6ZXIuVGVzdHMucHMxBj8AAAAiZ2VuZXJhbFxQU1NjcmlwdEFuYWx5emVyLlRlc3RzLnBzMQkGAAAACUEAAAAJQgAAAAERAAAACwAAAAZDAAAA/QMkZXhjZXB0aW9ucyA9IEB7IH0NCg0KPCMNCkEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgTUFZIGJlIGluIHRoZSBsYW5ndWFnZSBmaWxlcywgd2l0aG91dCBjYXVzaW5nIHRoZSB0ZXN0cyB0byBmYWlsLg0KVGhpcyBpcyBjb21tb25seSB1c2VkIGluIG1vZHVsZXMgdGhhdCBnZW5lcmF0ZSBsb2NhbGl6ZWQgbWVzc2FnZXMgc3RyYWlnaHQgZnJvbSBDIy4NClNwZWNpZnkgdGhlIGZ1bGwga2V5IGFzIGl0IGlzIHdyaXR0ZW4gaW4gdGhlIGxhbmd1YWdlIGZpbGVzLCBkbyBub3QgcHJlcGVuZCB0aGUgbW9kdWxlbmFtZSwNCmFzIHlvdSB3b3VsZCBoYXZlIHRvIGluIEMjIGNvZGUuDQoNCkV4YW1wbGU6DQokZXhjZXB0aW9uc1snTGVnYWxTdXJwbHVzJ10gPSBAKA0KICAgICdFeGNlcHRpb24uU3RyZWFtcy5GYWlsZWRDcmVhdGUnDQogICAgJ0V4Y2VwdGlvbi5TdHJlYW1zLkZhaWxlZERpc3Bvc2UnDQopDQojPg0KJGV4Y2VwdGlvbnNbJ0xlZ2FsU3VycGx1cyddID0gQCgNCg0KKQ0KDQokZXhjZXB0aW9ucwEJRAAAAAlFAAAABkYAAAAWc3RyaW5ncy5FeGNlcHRpb25zLnBzMQZHAAAAHmdlbmVyYWxcc3RyaW5ncy5FeGNlcHRpb25zLnBzMQkGAAAACUkAAAAJSgAAAAESAAAACwAAAAZLAAAAyQc8Iw0KLkRFU0NSSVBUSU9ODQogICAgVGhpcyB0ZXN0IHZlcmlmaWVzLCB0aGF0IGFsbCBzdHJpbmdzIHRoYXQgaGF2ZSBiZWVuIHVzZWQsDQogICAgYXJlIGxpc3RlZCBpbiB0aGUgbGFuZ3VhZ2UgZmlsZXMgYW5kIHRodXMgaGF2ZSBhIG1lc3NhZ2UgYmVpbmcgZGlzcGxheWVkLg0KDQogICAgSXQgYWxzbyBjaGVja3MsIHdoZXRoZXIgdGhlIGxhbmd1YWdlIGZpbGVzIGhhdmUgb3JwaGFuZWQgZW50cmllcyB0aGF0IG5lZWQgY2xlYW5pbmcgdXAuDQojPg0KDQoNCg0KRGVzY3JpYmUgIlRlc3RpbmcgbG9jYWxpemF0aW9uIHN0cmluZ3MiIHsNCgkkbW9kdWxlUm9vdCA9IChHZXQtTW9kdWxlIMO+bmFtZcO+KS5Nb2R1bGVCYXNlDQoJJHN0cmluZ3NSZXN1bHRzID0gRXhwb3J0LVBTTURTdHJpbmcgLU1vZHVsZVJvb3QgJG1vZHVsZVJvb3QNCgkkZXhjZXB0aW9ucyA9ICYgIiRnbG9iYWw6dGVzdHJvb3RcZ2VuZXJhbFxzdHJpbmdzLkV4Y2VwdGlvbnMucHMxIg0KCQ0KCWZvcmVhY2ggKCRzdHJpbmdFbnRyeSBpbiAkc3RyaW5nc1Jlc3VsdHMpIHsNCiAgICAgICAgaWYgKCRzdHJpbmdFbnRyeS5TdHJpbmcgLWVxICJrZXkiKSB7IGNvbnRpbnVlIH0gIyBTa2lwcGluZyB0aGUgdGVtcGxhdGUgZGVmYXVsdCBlbnRyeQ0KICAgICAgICBJdCAiU2hvdWxkIGJlIHVzZWQgJiBoYXZlIHRleHQ6ICQoJHN0cmluZ0VudHJ5LlN0cmluZykiIC1UZXN0Q2FzZXMgQHsgc3RyaW5nRW50cnkgPSAkc3RyaW5nRW50cnkgfSB7DQogICAgICAgICAgICBpZiAoJGV4Y2VwdGlvbnMuTGVnYWxTdXJwbHVzIC1ub3Rjb250YWlucyAkc3RyaW5nRW50cnkuU3RyaW5nKSB7DQogICAgICAgICAgICAgICAgJHN0cmluZ0VudHJ5LlN1cnBsdXMgfCBTaG91bGQgLUJlRmFsc2UNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRzdHJpbmdFbnRyeS5UZXh0IHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCiAgICAgICAgfQ0KICAgIH0NCn0BCUwAAAAJTQAAAAZOAAAAEXN0cmluZ3MuVGVzdHMucHMxBk8AAAAZZ2VuZXJhbFxzdHJpbmdzLlRlc3RzLnBzMQkGAAAACVEAAAAJUgAAAAEUAAAABwAAAAkKAAAAAAAAAAAAAAABFQAAAAcAAAAJCgAAAAAAAAAAAAAAARkAAAAHAAAACQoAAAAAAAAAAAAAAAEaAAAABwAAAAkKAAAAAAAAAAAAAAABHAAAAAcAAAAJCgAAAAAAAAAAAAAAAR0AAAAHAAAACQoAAAAAAAAAAAAAAAEhAAAABwAAAAkKAAAAAAAAAAAAAAABIgAAAAcAAAAJCgAAAAAAAAAAAAAAASQAAAAHAAAACQoAAAAAAAAAAAAAAAElAAAABwAAAAkKAAAAAAAAAAAAAAABKQAAAAcAAAAJCgAAAAAAAAAAAAAAASoAAAAHAAAACQoAAAAAAAAAAAAAAAEsAAAABwAAAAlUAAAAAQAAAAEAAAABLQAAAAcAAAAJCgAAAAAAAAAAAAAAATEAAAAHAAAACQoAAAAAAAAAAAAAAAEyAAAABwAAAAkKAAAAAAAAAAAAAAABNAAAAAcAAAAJVgAAAAEAAAABAAAAATUAAAAHAAAACQoAAAAAAAAAAAAAAAE5AAAABwAAAAkKAAAAAAAAAAAAAAABOgAAAAcAAAAJCgAAAAAAAAAAAAAAATwAAAAHAAAACQoAAAAAAAAAAAAAAAE9AAAABwAAAAkKAAAAAAAAAAAAAAABQQAAAAcAAAAJCgAAAAAAAAAAAAAAAUIAAAAHAAAACQoAAAAAAAAAAAAAAAFEAAAABwAAAAkKAAAAAAAAAAAAAAABRQAAAAcAAAAJCgAAAAAAAAAAAAAAAUkAAAAHAAAACQoAAAAAAAAAAAAAAAFKAAAABwAAAAkKAAAAAAAAAAAAAAABTAAAAAcAAAAJWAAAAAEAAAABAAAAAU0AAAAHAAAACQoAAAAAAAAAAAAAAAFRAAAABwAAAAkKAAAAAAAAAAAAAAABUgAAAAcAAAAJCgAAAAAAAAAAAAAAEVQAAAAEAAAABloAAAAEbmFtZQ0DEVYAAAAEAAAABlsAAAAEbmFtZQ0DEVgAAAAEAAAABlwAAAAEbmFtZQ0DCw==</BA>
            </MS>
          </Obj>
          <Obj RefId="17">
            <TN RefId="7">
              <T>PSModuleDevelopment.Template.TemplateItemFile</T>
              <T>PSModuleDevelopment.Template.TemplateItemBase</T>
              <T>System.Object</T>
            </TN>
            <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString>
            <Props>
              <S N="Value">param (_x000D__x000A__x0009_$TestGeneral = $true,_x000D__x000A__x0009__x000D__x000A__x0009_$TestFunctions = $true,_x000D__x000A__x0009__x000D__x000A__x0009_[ValidateSet('None', 'Normal', 'Detailed', 'Diagnostic')]_x000D__x000A__x0009_[Alias('Show')]_x000D__x000A__x0009_$Output = "None",_x000D__x000A__x0009__x000D__x000A__x0009_$Include = "*",_x000D__x000A__x0009__x000D__x000A__x0009_$Exclude = ""_x000D__x000A_)_x000D__x000A__x000D__x000A_Write-PSFMessage -Level Important -Message "Starting Tests"_x000D__x000A__x000D__x000A_Write-PSFMessage -Level Important -Message "Importing Module"_x000D__x000A__x000D__x000A_$global:testroot = $PSScriptRoot_x000D__x000A_$global:__pester_data = @{ }_x000D__x000A__x000D__x000A_Remove-Module þnameþ -ErrorAction Ignore_x000D__x000A_Import-Module "$PSScriptRoot\..\þnameþ.psd1"_x000D__x000A_Import-Module "$PSScriptRoot\..\þnameþ.psm1" -Force_x000D__x000A__x000D__x000A_# Need to import explicitly so we can use the configuration class_x000D__x000A_Import-Module Pester_x000D__x000A__x000D__x000A_þ!testfolder!þ_x000D__x000A__x000D__x000A_$totalFailed = 0_x000D__x000A_$totalRun = 0_x000D__x000A__x000D__x000A_$testresults = @()_x000D__x000A_$config = [PesterConfiguration]::Default_x000D__x000A_þ!pesterconfig!þ_x000D__x000A__x000D__x000A_#region Run General Tests_x000D__x000A_if ($TestGeneral)_x000D__x000A_{_x000D__x000A__x0009_Write-PSFMessage -Level Important -Message "Modules imported, proceeding with general tests"_x000D__x000A__x0009_foreach ($file in (Get-ChildItem "$PSScriptRoot\general" | Where-Object Name -like "*.Tests.ps1"))_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_if ($file.Name -notlike $Include) { continue }_x000D__x000A__x0009__x0009_if ($file.Name -like $Exclude) { continue }_x000D__x000A__x000D__x000A__x0009__x0009_Write-PSFMessage -Level Significant -Message " Executing &lt;c='em'&gt;$($file.Name)&lt;/c&gt;"_x000D__x000A__x0009__x0009_$config.TestResult.OutputPath = Join-Path "$PSScriptRoot\..\..\TestResults" "TEST-$($file.BaseName).xml"_x000D__x000A__x0009__x0009_$config.Run.Path = $file.FullName_x000D__x000A__x0009__x0009_$config.Run.PassThru = $true_x000D__x000A__x0009__x0009_$config.Output.Verbosity = $Output_x000D__x000A_ _x0009_$results = Invoke-Pester -Configuration $config_x000D__x000A__x0009__x0009_foreach ($result in $results)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$totalRun += $result.TotalCount_x000D__x000A__x0009__x0009__x0009_$totalFailed += $result.FailedCount_x000D__x000A__x0009__x0009__x0009_$result.Tests | Where-Object Result -ne 'Passed' | ForEach-Object {_x000D__x000A__x0009__x0009__x0009__x0009_$testresults += [pscustomobject]@{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Block = $_.Block_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Name_x0009_ = "It $($_.Name)"_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Result = $_.Result_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Message = $_.ErrorRecord.DisplayErrorMessage_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A_}_x000D__x000A_#endregion Run General Tests_x000D__x000A__x000D__x000A_$global:__pester_data.ScriptAnalyzer | Out-Host_x000D__x000A__x000D__x000A_#region Test Commands_x000D__x000A_if ($TestFunctions)_x000D__x000A_{_x000D__x000A__x0009_Write-PSFMessage -Level Important -Message "Proceeding with individual tests"_x000D__x000A__x0009_foreach ($file in (Get-ChildItem "$PSScriptRoot\functions" -Recurse -File | Where-Object Name -like "*Tests.ps1"))_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_if ($file.Name -notlike $Include) { continue }_x000D__x000A__x0009__x0009_if ($file.Name -like $Exclude) { continue }_x000D__x000A__x0009__x0009__x000D__x000A__x0009__x0009_Write-PSFMessage -Level Significant -Message " Executing $($file.Name)"_x000D__x000A__x0009__x0009_$config.TestResult.OutputPath = Join-Path "$PSScriptRoot\..\..\TestResults" "TEST-$($file.BaseName).xml"_x000D__x000A__x0009__x0009_$config.Run.Path = $file.FullName_x000D__x000A__x0009__x0009_$config.Run.PassThru = $true_x000D__x000A__x0009__x0009_$config.Output.Verbosity = $Output_x000D__x000A_ _x0009_$results = Invoke-Pester -Configuration $config_x000D__x000A__x0009__x0009_foreach ($result in $results)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$totalRun += $result.TotalCount_x000D__x000A__x0009__x0009__x0009_$totalFailed += $result.FailedCount_x000D__x000A__x0009__x0009__x0009_$result.Tests | Where-Object Result -ne 'Passed' | ForEach-Object {_x000D__x000A__x0009__x0009__x0009__x0009_$testresults += [pscustomobject]@{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Block = $_.Block_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Name_x0009_ = "It $($_.Name)"_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Result = $_.Result_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Message = $_.ErrorRecord.DisplayErrorMessage_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A_}_x000D__x000A_#endregion Test Commands_x000D__x000A__x000D__x000A_$testresults | Sort-Object Describe, Context, Name, Result, Message | Format-List_x000D__x000A__x000D__x000A_if ($totalFailed -eq 0) { Write-PSFMessage -Level Critical -Message "All &lt;c='em'&gt;$totalRun&lt;/c&gt; tests executed without a single failure!" }_x000D__x000A_else { Write-PSFMessage -Level Critical -Message "&lt;c='em'&gt;$totalFailed tests&lt;/c&gt; out of &lt;c='sub'&gt;$totalRun&lt;/c&gt; tests failed!" }_x000D__x000A__x000D__x000A_if ($totalFailed -gt 0)_x000D__x000A_{_x000D__x000A__x0009_throw "$totalFailed / $totalRun tests failed!"_x000D__x000A_}</S>
              <B N="PlainText">true</B>
              <Obj N="ContentParameterFlat" RefId="18">
                <TNRef RefId="2" />
                <LST>
                  <S>name</S>
                </LST>
              </Obj>
              <Obj N="ContentParameterScript" RefId="19">
                <TNRef RefId="2" />
                <LST>
                  <S>testfolder</S>
                  <S>pesterconfig</S>
                </LST>
              </Obj>
              <S N="Name">pester.ps1</S>
              <S N="RelativePath">pester.ps1</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="20">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="21">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAqRtwYXJhbSAoDQoJJFRlc3RHZW5lcmFsID0gJHRydWUsDQoJDQoJJFRlc3RGdW5jdGlvbnMgPSAkdHJ1ZSwNCgkNCglbVmFsaWRhdGVTZXQoJ05vbmUnLCAnTm9ybWFsJywgJ0RldGFpbGVkJywgJ0RpYWdub3N0aWMnKV0NCglbQWxpYXMoJ1Nob3cnKV0NCgkkT3V0cHV0ID0gIk5vbmUiLA0KCQ0KCSRJbmNsdWRlID0gIioiLA0KCQ0KCSRFeGNsdWRlID0gIiINCikNCg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJTdGFydGluZyBUZXN0cyINCg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJJbXBvcnRpbmcgTW9kdWxlIg0KDQokZ2xvYmFsOnRlc3Ryb290ID0gJFBTU2NyaXB0Um9vdA0KJGdsb2JhbDpfX3Blc3Rlcl9kYXRhID0gQHsgfQ0KDQpSZW1vdmUtTW9kdWxlIMO+bmFtZcO+IC1FcnJvckFjdGlvbiBJZ25vcmUNCkltcG9ydC1Nb2R1bGUgIiRQU1NjcmlwdFJvb3RcLi5cw75uYW1lw74ucHNkMSINCkltcG9ydC1Nb2R1bGUgIiRQU1NjcmlwdFJvb3RcLi5cw75uYW1lw74ucHNtMSIgLUZvcmNlDQoNCiMgTmVlZCB0byBpbXBvcnQgZXhwbGljaXRseSBzbyB3ZSBjYW4gdXNlIHRoZSBjb25maWd1cmF0aW9uIGNsYXNzDQpJbXBvcnQtTW9kdWxlIFBlc3Rlcg0KDQrDviF0ZXN0Zm9sZGVyIcO+DQoNCiR0b3RhbEZhaWxlZCA9IDANCiR0b3RhbFJ1biA9IDANCg0KJHRlc3RyZXN1bHRzID0gQCgpDQokY29uZmlnID0gW1Blc3RlckNvbmZpZ3VyYXRpb25dOjpEZWZhdWx0DQrDviFwZXN0ZXJjb25maWchw74NCg0KI3JlZ2lvbiBSdW4gR2VuZXJhbCBUZXN0cw0KaWYgKCRUZXN0R2VuZXJhbCkNCnsNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIk1vZHVsZXMgaW1wb3J0ZWQsIHByb2NlZWRpbmcgd2l0aCBnZW5lcmFsIHRlc3RzIg0KCWZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtICIkUFNTY3JpcHRSb290XGdlbmVyYWwiIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIiouVGVzdHMucHMxIikpDQoJew0KCQlpZiAoJGZpbGUuTmFtZSAtbm90bGlrZSAkSW5jbHVkZSkgeyBjb250aW51ZSB9DQoJCWlmICgkZmlsZS5OYW1lIC1saWtlICRFeGNsdWRlKSB7IGNvbnRpbnVlIH0NCg0KCQlXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBTaWduaWZpY2FudCAtTWVzc2FnZSAiICBFeGVjdXRpbmcgPGM9J2VtJz4kKCRmaWxlLk5hbWUpPC9jPiINCgkJJGNvbmZpZy5UZXN0UmVzdWx0Lk91dHB1dFBhdGggPSBKb2luLVBhdGggIiRQU1NjcmlwdFJvb3RcLi5cLi5cVGVzdFJlc3VsdHMiICJURVNULSQoJGZpbGUuQmFzZU5hbWUpLnhtbCINCgkJJGNvbmZpZy5SdW4uUGF0aCA9ICRmaWxlLkZ1bGxOYW1lDQoJCSRjb25maWcuUnVuLlBhc3NUaHJ1ID0gJHRydWUNCgkJJGNvbmZpZy5PdXRwdXQuVmVyYm9zaXR5ID0gJE91dHB1dA0KICAgIAkkcmVzdWx0cyA9IEludm9rZS1QZXN0ZXIgLUNvbmZpZ3VyYXRpb24gJGNvbmZpZw0KCQlmb3JlYWNoICgkcmVzdWx0IGluICRyZXN1bHRzKQ0KCQl7DQoJCQkkdG90YWxSdW4gKz0gJHJlc3VsdC5Ub3RhbENvdW50DQoJCQkkdG90YWxGYWlsZWQgKz0gJHJlc3VsdC5GYWlsZWRDb3VudA0KCQkJJHJlc3VsdC5UZXN0cyB8IFdoZXJlLU9iamVjdCBSZXN1bHQgLW5lICdQYXNzZWQnIHwgRm9yRWFjaC1PYmplY3Qgew0KCQkJCSR0ZXN0cmVzdWx0cyArPSBbcHNjdXN0b21vYmplY3RdQHsNCgkJCQkJQmxvY2sgICAgPSAkXy5CbG9jaw0KCQkJCQlOYW1lCSA9ICJJdCAkKCRfLk5hbWUpIg0KCQkJCQlSZXN1bHQgICA9ICRfLlJlc3VsdA0KCQkJCQlNZXNzYWdlICA9ICRfLkVycm9yUmVjb3JkLkRpc3BsYXlFcnJvck1lc3NhZ2UNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQojZW5kcmVnaW9uIFJ1biBHZW5lcmFsIFRlc3RzDQoNCiRnbG9iYWw6X19wZXN0ZXJfZGF0YS5TY3JpcHRBbmFseXplciB8IE91dC1Ib3N0DQoNCiNyZWdpb24gVGVzdCBDb21tYW5kcw0KaWYgKCRUZXN0RnVuY3Rpb25zKQ0Kew0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiUHJvY2VlZGluZyB3aXRoIGluZGl2aWR1YWwgdGVzdHMiDQoJZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gIiRQU1NjcmlwdFJvb3RcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqVGVzdHMucHMxIikpDQoJew0KCQlpZiAoJGZpbGUuTmFtZSAtbm90bGlrZSAkSW5jbHVkZSkgeyBjb250aW51ZSB9DQoJCWlmICgkZmlsZS5OYW1lIC1saWtlICRFeGNsdWRlKSB7IGNvbnRpbnVlIH0NCgkJDQoJCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIFNpZ25pZmljYW50IC1NZXNzYWdlICIgIEV4ZWN1dGluZyAkKCRmaWxlLk5hbWUpIg0KCQkkY29uZmlnLlRlc3RSZXN1bHQuT3V0cHV0UGF0aCA9IEpvaW4tUGF0aCAiJFBTU2NyaXB0Um9vdFwuLlwuLlxUZXN0UmVzdWx0cyIgIlRFU1QtJCgkZmlsZS5CYXNlTmFtZSkueG1sIg0KCQkkY29uZmlnLlJ1bi5QYXRoID0gJGZpbGUuRnVsbE5hbWUNCgkJJGNvbmZpZy5SdW4uUGFzc1RocnUgPSAkdHJ1ZQ0KCQkkY29uZmlnLk91dHB1dC5WZXJib3NpdHkgPSAkT3V0cHV0DQogICAgCSRyZXN1bHRzID0gSW52b2tlLVBlc3RlciAtQ29uZmlndXJhdGlvbiAkY29uZmlnDQoJCWZvcmVhY2ggKCRyZXN1bHQgaW4gJHJlc3VsdHMpDQoJCXsNCgkJCSR0b3RhbFJ1biArPSAkcmVzdWx0LlRvdGFsQ291bnQNCgkJCSR0b3RhbEZhaWxlZCArPSAkcmVzdWx0LkZhaWxlZENvdW50DQoJCQkkcmVzdWx0LlRlc3RzIHwgV2hlcmUtT2JqZWN0IFJlc3VsdCAtbmUgJ1Bhc3NlZCcgfCBGb3JFYWNoLU9iamVjdCB7DQoJCQkJJHRlc3RyZXN1bHRzICs9IFtwc2N1c3RvbW9iamVjdF1Aew0KCQkJCQlCbG9jayAgICA9ICRfLkJsb2NrDQoJCQkJCU5hbWUJID0gIkl0ICQoJF8uTmFtZSkiDQoJCQkJCVJlc3VsdCAgID0gJF8uUmVzdWx0DQoJCQkJCU1lc3NhZ2UgID0gJF8uRXJyb3JSZWNvcmQuRGlzcGxheUVycm9yTWVzc2FnZQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCn0NCiNlbmRyZWdpb24gVGVzdCBDb21tYW5kcw0KDQokdGVzdHJlc3VsdHMgfCBTb3J0LU9iamVjdCBEZXNjcmliZSwgQ29udGV4dCwgTmFtZSwgUmVzdWx0LCBNZXNzYWdlIHwgRm9ybWF0LUxpc3QNCg0KaWYgKCR0b3RhbEZhaWxlZCAtZXEgMCkgeyBXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBDcml0aWNhbCAtTWVzc2FnZSAiQWxsIDxjPSdlbSc+JHRvdGFsUnVuPC9jPiB0ZXN0cyBleGVjdXRlZCB3aXRob3V0IGEgc2luZ2xlIGZhaWx1cmUhIiB9DQplbHNlIHsgV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgQ3JpdGljYWwgLU1lc3NhZ2UgIjxjPSdlbSc+JHRvdGFsRmFpbGVkIHRlc3RzPC9jPiBvdXQgb2YgPGM9J3N1Yic+JHRvdGFsUnVuPC9jPiB0ZXN0cyBmYWlsZWQhIiB9DQoNCmlmICgkdG90YWxGYWlsZWQgLWd0IDApDQp7DQoJdGhyb3cgIiR0b3RhbEZhaWxlZCAvICR0b3RhbFJ1biB0ZXN0cyBmYWlsZWQhIg0KfQEJBAAAAAkFAAAABgYAAAAKcGVzdGVyLnBzMQYHAAAACnBlc3Rlci5wczEGCAAAAALDvgkJAAAACQoAAAAEBAAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkLAAAAAQAAAAEAAAABBQAAAAQAAAAJDAAAAAIAAAACAAAAAQkAAAAEAAAACQ0AAAAAAAAAAAAAAAEKAAAABAAAAAkNAAAAAAAAAAAAAAARCwAAAAQAAAAGDgAAAARuYW1lDQMRDAAAAAQAAAAGDwAAAAp0ZXN0Zm9sZGVyBhAAAAAMcGVzdGVyY29uZmlnDQIRDQAAAAAAAAAL</BA>
            </MS>
          </Obj>
          <Obj RefId="22">
            <TNRef RefId="7" />
            <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString>
            <Props>
              <S N="Value"># Description_x000D__x000A__x000D__x000A_This is the folder, where all the tests go._x000D__x000A__x000D__x000A_Those are subdivided in two categories:_x000D__x000A__x000D__x000A_ - General_x000D__x000A_ - Function_x000D__x000A__x000D__x000A_## General Tests_x000D__x000A__x000D__x000A_General tests are function generic and test for general policies._x000D__x000A__x000D__x000A_These test scan answer questions such as:_x000D__x000A__x000D__x000A_ - Is my module following my style guides?_x000D__x000A_ - Does any of my scripts have a syntax error?_x000D__x000A_ - Do my scripts use commands I do not want them to use?_x000D__x000A_ - Do my commands follow best practices?_x000D__x000A_ - Do my commands have proper help?_x000D__x000A__x000D__x000A_Basically, these allow a general module health check._x000D__x000A__x000D__x000A_These tests are already provided as part of the template._x000D__x000A__x000D__x000A_## Function Tests_x000D__x000A__x000D__x000A_A healthy module should provide unit and integration tests for the commands &amp; components it ships._x000D__x000A_Only then can be guaranteed, that they will actually perform as promised._x000D__x000A__x000D__x000A_However, as each such test must be specific to the function it tests, there cannot be much in the way of templates.</S>
              <B N="PlainText">true</B>
              <Obj N="ContentParameterFlat" RefId="23">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="ContentParameterScript" RefId="24">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <S N="Name">readme.md</S>
              <S N="RelativePath">readme.md</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="25">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="26">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAogcjIERlc2NyaXB0aW9uDQoNClRoaXMgaXMgdGhlIGZvbGRlciwgd2hlcmUgYWxsIHRoZSB0ZXN0cyBnby4NCg0KVGhvc2UgYXJlIHN1YmRpdmlkZWQgaW4gdHdvIGNhdGVnb3JpZXM6DQoNCiAtIEdlbmVyYWwNCiAtIEZ1bmN0aW9uDQoNCiMjIEdlbmVyYWwgVGVzdHMNCg0KR2VuZXJhbCB0ZXN0cyBhcmUgZnVuY3Rpb24gZ2VuZXJpYyBhbmQgdGVzdCBmb3IgZ2VuZXJhbCBwb2xpY2llcy4NCg0KVGhlc2UgdGVzdCBzY2FuIGFuc3dlciBxdWVzdGlvbnMgc3VjaCBhczoNCg0KIC0gSXMgbXkgbW9kdWxlIGZvbGxvd2luZyBteSBzdHlsZSBndWlkZXM/DQogLSBEb2VzIGFueSBvZiBteSBzY3JpcHRzIGhhdmUgYSBzeW50YXggZXJyb3I/DQogLSBEbyBteSBzY3JpcHRzIHVzZSBjb21tYW5kcyBJIGRvIG5vdCB3YW50IHRoZW0gdG8gdXNlPw0KIC0gRG8gbXkgY29tbWFuZHMgZm9sbG93IGJlc3QgcHJhY3RpY2VzPw0KIC0gRG8gbXkgY29tbWFuZHMgaGF2ZSBwcm9wZXIgaGVscD8NCg0KQmFzaWNhbGx5LCB0aGVzZSBhbGxvdyBhIGdlbmVyYWwgbW9kdWxlIGhlYWx0aCBjaGVjay4NCg0KVGhlc2UgdGVzdHMgYXJlIGFscmVhZHkgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgdGVtcGxhdGUuDQoNCiMjIEZ1bmN0aW9uIFRlc3RzDQoNCkEgaGVhbHRoeSBtb2R1bGUgc2hvdWxkIHByb3ZpZGUgdW5pdCBhbmQgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSBjb21tYW5kcyAmIGNvbXBvbmVudHMgaXQgc2hpcHMuDQpPbmx5IHRoZW4gY2FuIGJlIGd1YXJhbnRlZWQsIHRoYXQgdGhleSB3aWxsIGFjdHVhbGx5IHBlcmZvcm0gYXMgcHJvbWlzZWQuDQoNCkhvd2V2ZXIsIGFzIGVhY2ggc3VjaCB0ZXN0IG11c3QgYmUgc3BlY2lmaWMgdG8gdGhlIGZ1bmN0aW9uIGl0IHRlc3RzLCB0aGVyZSBjYW5ub3QgYmUgbXVjaCBpbiB0aGUgd2F5IG9mIHRlbXBsYXRlcy4BCQQAAAAJBQAAAAYGAAAACXJlYWRtZS5tZAYHAAAACXJlYWRtZS5tZAYIAAAAAsO+CQkAAAAJCgAAAAQEAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQsAAAAAAAAAAAAAAAEFAAAABAAAAAkLAAAAAAAAAAAAAAABCQAAAAQAAAAJCwAAAAAAAAAAAAAAAQoAAAAEAAAACQsAAAAAAAAAAAAAABELAAAAAAAAAAs=</BA>
            </MS>
          </Obj>
        </LST>
      </Obj>
    </Props>
    <MS>
      <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGUKAAAABE5hbWUEVHlwZQdWZXJzaW9uC0Rlc2NyaXB0aW9uBkF1dGhvcglDcmVhdGVkT24EVGFncwpQYXJhbWV0ZXJzB1NjcmlwdHMIQ2hpbGRyZW4BBAMBAQADAwMDKVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVUeXBlAgAAAA5TeXN0ZW0uVmVyc2lvbg1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dgAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQIAAAAGAwAAAAhQU0ZUZXN0cwX8////KVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVUeXBlAQAAAAd2YWx1ZV9fAAgCAAAAAQAAAAkFAAAABgYAAABBVGhlIFBTRnJhbWV3b3JrLWJhc2VkIHN0YW5kYXJkIHRlc3Qgc3VpdGUgZm9yIGEgUG93ZXJTaGVsbCBNb2R1bGUGBwAAABJGcmllZHJpY2ggV2Vpbm1hbm4AgHJlLATYiAkIAAAACQkAAAAJCgAAAAkLAAAABAUAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIAgAAAAAAAAAAAAAAAAAAAAQIAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQwAAAACAAAAAAAAAAEJAAAACAAAAAkNAAAAAQAAAAEAAAAECgAAAIACU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdCwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQQAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQ1LZXlWYWx1ZVBhaXJzAAMAAwgWU3lzdGVtLk9yZGluYWxDb21wYXJlcgiEAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdCwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXVtdAwAAAAkOAAAAAwAAAAkPAAAABAsAAACeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlW10CAAAACAgJEAAAAAQAAAAEAAAAEQwAAAACAAAABhEAAAAFVGVzdHMGEgAAAAtQU0ZyYW1ld29yaxENAAAABAAAAAYTAAAABG5hbWUNAwQOAAAAFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIBAAAAC19pZ25vcmVDYXNlAAEBBw8AAAAAAQAAAAMAAAADggJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0E7P///4ICU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAgAAAANrZXkFdmFsdWUBBCxQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdAIAAAAGFQAAAAp0ZXN0Zm9sZGVyCRYAAAAB6f///+z///8GGAAAAAxwZXN0ZXJjb25maWcJGQAAAAHm////7P///wYbAAAABGd1aWQJHAAAAAcQAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACR0AAAAJHgAAAAkfAAAACSAAAAAMIQAAAF9TeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQUWAAAALFBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0AgAAAAROYW1lC1NjcmlwdEJsb2NrAQQ7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIhAAAAAgAAAAkVAAAACSMAAAABGQAAABYAAAAJGAAAAAklAAAAARwAAAAWAAAACRsAAAAJJwAAAAUdAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJKAAAAAYpAAAACWZ1bmN0aW9ucwYqAAAACWZ1bmN0aW9ucwYrAAAAAsO+CSwAAAAJLQAAAAEeAAAAHQAAAAkuAAAABi8AAAAHZ2VuZXJhbAYwAAAAB2dlbmVyYWwJKwAAAAkyAAAACTMAAAAFHwAAAC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUZpbGUJAAAABVZhbHVlCVBsYWluVGV4dBRDb250ZW50UGFyYW1ldGVyRmxhdBZDb250ZW50UGFyYW1ldGVyU2NyaXB0BE5hbWUMUmVsYXRpdmVQYXRoCklkZW50aWZpZXIXRmlsZVN5c3RlbVBhcmFtZXRlckZsYXQZRmlsZVN5c3RlbVBhcmFtZXRlclNjcmlwdAEAAwMBAQEDAwF/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAGNAAAAKkbcGFyYW0gKA0KCSRUZXN0R2VuZXJhbCA9ICR0cnVlLA0KCQ0KCSRUZXN0RnVuY3Rpb25zID0gJHRydWUsDQoJDQoJW1ZhbGlkYXRlU2V0KCdOb25lJywgJ05vcm1hbCcsICdEZXRhaWxlZCcsICdEaWFnbm9zdGljJyldDQoJW0FsaWFzKCdTaG93JyldDQoJJE91dHB1dCA9ICJOb25lIiwNCgkNCgkkSW5jbHVkZSA9ICIqIiwNCgkNCgkkRXhjbHVkZSA9ICIiDQopDQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiU3RhcnRpbmcgVGVzdHMiDQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiSW1wb3J0aW5nIE1vZHVsZSINCg0KJGdsb2JhbDp0ZXN0cm9vdCA9ICRQU1NjcmlwdFJvb3QNCiRnbG9iYWw6X19wZXN0ZXJfZGF0YSA9IEB7IH0NCg0KUmVtb3ZlLU1vZHVsZSDDvm5hbWXDviAtRXJyb3JBY3Rpb24gSWdub3JlDQpJbXBvcnQtTW9kdWxlICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+LnBzZDEiDQpJbXBvcnQtTW9kdWxlICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+LnBzbTEiIC1Gb3JjZQ0KDQojIE5lZWQgdG8gaW1wb3J0IGV4cGxpY2l0bHkgc28gd2UgY2FuIHVzZSB0aGUgY29uZmlndXJhdGlvbiBjbGFzcw0KSW1wb3J0LU1vZHVsZSBQZXN0ZXINCg0Kw74hdGVzdGZvbGRlciHDvg0KDQokdG90YWxGYWlsZWQgPSAwDQokdG90YWxSdW4gPSAwDQoNCiR0ZXN0cmVzdWx0cyA9IEAoKQ0KJGNvbmZpZyA9IFtQZXN0ZXJDb25maWd1cmF0aW9uXTo6RGVmYXVsdA0Kw74hcGVzdGVyY29uZmlnIcO+DQoNCiNyZWdpb24gUnVuIEdlbmVyYWwgVGVzdHMNCmlmICgkVGVzdEdlbmVyYWwpDQp7DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJNb2R1bGVzIGltcG9ydGVkLCBwcm9jZWVkaW5nIHdpdGggZ2VuZXJhbCB0ZXN0cyINCglmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJFBTU2NyaXB0Um9vdFxnZW5lcmFsIiB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLlRlc3RzLnBzMSIpKQ0KCXsNCgkJaWYgKCRmaWxlLk5hbWUgLW5vdGxpa2UgJEluY2x1ZGUpIHsgY29udGludWUgfQ0KCQlpZiAoJGZpbGUuTmFtZSAtbGlrZSAkRXhjbHVkZSkgeyBjb250aW51ZSB9DQoNCgkJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgU2lnbmlmaWNhbnQgLU1lc3NhZ2UgIiAgRXhlY3V0aW5nIDxjPSdlbSc+JCgkZmlsZS5OYW1lKTwvYz4iDQoJCSRjb25maWcuVGVzdFJlc3VsdC5PdXRwdXRQYXRoID0gSm9pbi1QYXRoICIkUFNTY3JpcHRSb290XC4uXC4uXFRlc3RSZXN1bHRzIiAiVEVTVC0kKCRmaWxlLkJhc2VOYW1lKS54bWwiDQoJCSRjb25maWcuUnVuLlBhdGggPSAkZmlsZS5GdWxsTmFtZQ0KCQkkY29uZmlnLlJ1bi5QYXNzVGhydSA9ICR0cnVlDQoJCSRjb25maWcuT3V0cHV0LlZlcmJvc2l0eSA9ICRPdXRwdXQNCiAgICAJJHJlc3VsdHMgPSBJbnZva2UtUGVzdGVyIC1Db25maWd1cmF0aW9uICRjb25maWcNCgkJZm9yZWFjaCAoJHJlc3VsdCBpbiAkcmVzdWx0cykNCgkJew0KCQkJJHRvdGFsUnVuICs9ICRyZXN1bHQuVG90YWxDb3VudA0KCQkJJHRvdGFsRmFpbGVkICs9ICRyZXN1bHQuRmFpbGVkQ291bnQNCgkJCSRyZXN1bHQuVGVzdHMgfCBXaGVyZS1PYmplY3QgUmVzdWx0IC1uZSAnUGFzc2VkJyB8IEZvckVhY2gtT2JqZWN0IHsNCgkJCQkkdGVzdHJlc3VsdHMgKz0gW3BzY3VzdG9tb2JqZWN0XUB7DQoJCQkJCUJsb2NrICAgID0gJF8uQmxvY2sNCgkJCQkJTmFtZQkgPSAiSXQgJCgkXy5OYW1lKSINCgkJCQkJUmVzdWx0ICAgPSAkXy5SZXN1bHQNCgkJCQkJTWVzc2FnZSAgPSAkXy5FcnJvclJlY29yZC5EaXNwbGF5RXJyb3JNZXNzYWdlDQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KfQ0KI2VuZHJlZ2lvbiBSdW4gR2VuZXJhbCBUZXN0cw0KDQokZ2xvYmFsOl9fcGVzdGVyX2RhdGEuU2NyaXB0QW5hbHl6ZXIgfCBPdXQtSG9zdA0KDQojcmVnaW9uIFRlc3QgQ29tbWFuZHMNCmlmICgkVGVzdEZ1bmN0aW9ucykNCnsNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIlByb2NlZWRpbmcgd2l0aCBpbmRpdmlkdWFsIHRlc3RzIg0KCWZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtICIkUFNTY3JpcHRSb290XGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbGUgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKlRlc3RzLnBzMSIpKQ0KCXsNCgkJaWYgKCRmaWxlLk5hbWUgLW5vdGxpa2UgJEluY2x1ZGUpIHsgY29udGludWUgfQ0KCQlpZiAoJGZpbGUuTmFtZSAtbGlrZSAkRXhjbHVkZSkgeyBjb250aW51ZSB9DQoJCQ0KCQlXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBTaWduaWZpY2FudCAtTWVzc2FnZSAiICBFeGVjdXRpbmcgJCgkZmlsZS5OYW1lKSINCgkJJGNvbmZpZy5UZXN0UmVzdWx0Lk91dHB1dFBhdGggPSBKb2luLVBhdGggIiRQU1NjcmlwdFJvb3RcLi5cLi5cVGVzdFJlc3VsdHMiICJURVNULSQoJGZpbGUuQmFzZU5hbWUpLnhtbCINCgkJJGNvbmZpZy5SdW4uUGF0aCA9ICRmaWxlLkZ1bGxOYW1lDQoJCSRjb25maWcuUnVuLlBhc3NUaHJ1ID0gJHRydWUNCgkJJGNvbmZpZy5PdXRwdXQuVmVyYm9zaXR5ID0gJE91dHB1dA0KICAgIAkkcmVzdWx0cyA9IEludm9rZS1QZXN0ZXIgLUNvbmZpZ3VyYXRpb24gJGNvbmZpZw0KCQlmb3JlYWNoICgkcmVzdWx0IGluICRyZXN1bHRzKQ0KCQl7DQoJCQkkdG90YWxSdW4gKz0gJHJlc3VsdC5Ub3RhbENvdW50DQoJCQkkdG90YWxGYWlsZWQgKz0gJHJlc3VsdC5GYWlsZWRDb3VudA0KCQkJJHJlc3VsdC5UZXN0cyB8IFdoZXJlLU9iamVjdCBSZXN1bHQgLW5lICdQYXNzZWQnIHwgRm9yRWFjaC1PYmplY3Qgew0KCQkJCSR0ZXN0cmVzdWx0cyArPSBbcHNjdXN0b21vYmplY3RdQHsNCgkJCQkJQmxvY2sgICAgPSAkXy5CbG9jaw0KCQkJCQlOYW1lCSA9ICJJdCAkKCRfLk5hbWUpIg0KCQkJCQlSZXN1bHQgICA9ICRfLlJlc3VsdA0KCQkJCQlNZXNzYWdlICA9ICRfLkVycm9yUmVjb3JkLkRpc3BsYXlFcnJvck1lc3NhZ2UNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQojZW5kcmVnaW9uIFRlc3QgQ29tbWFuZHMNCg0KJHRlc3RyZXN1bHRzIHwgU29ydC1PYmplY3QgRGVzY3JpYmUsIENvbnRleHQsIE5hbWUsIFJlc3VsdCwgTWVzc2FnZSB8IEZvcm1hdC1MaXN0DQoNCmlmICgkdG90YWxGYWlsZWQgLWVxIDApIHsgV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgQ3JpdGljYWwgLU1lc3NhZ2UgIkFsbCA8Yz0nZW0nPiR0b3RhbFJ1bjwvYz4gdGVzdHMgZXhlY3V0ZWQgd2l0aG91dCBhIHNpbmdsZSBmYWlsdXJlISIgfQ0KZWxzZSB7IFdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIENyaXRpY2FsIC1NZXNzYWdlICI8Yz0nZW0nPiR0b3RhbEZhaWxlZCB0ZXN0czwvYz4gb3V0IG9mIDxjPSdzdWInPiR0b3RhbFJ1bjwvYz4gdGVzdHMgZmFpbGVkISIgfQ0KDQppZiAoJHRvdGFsRmFpbGVkIC1ndCAwKQ0Kew0KCXRocm93ICIkdG90YWxGYWlsZWQgLyAkdG90YWxSdW4gdGVzdHMgZmFpbGVkISINCn0BCTUAAAAJNgAAAAY3AAAACnBlc3Rlci5wczEGOAAAAApwZXN0ZXIucHMxCSsAAAAJOgAAAAk7AAAAASAAAAAfAAAABjwAAACiByMgRGVzY3JpcHRpb24NCg0KVGhpcyBpcyB0aGUgZm9sZGVyLCB3aGVyZSBhbGwgdGhlIHRlc3RzIGdvLg0KDQpUaG9zZSBhcmUgc3ViZGl2aWRlZCBpbiB0d28gY2F0ZWdvcmllczoNCg0KIC0gR2VuZXJhbA0KIC0gRnVuY3Rpb24NCg0KIyMgR2VuZXJhbCBUZXN0cw0KDQpHZW5lcmFsIHRlc3RzIGFyZSBmdW5jdGlvbiBnZW5lcmljIGFuZCB0ZXN0IGZvciBnZW5lcmFsIHBvbGljaWVzLg0KDQpUaGVzZSB0ZXN0IHNjYW4gYW5zd2VyIHF1ZXN0aW9ucyBzdWNoIGFzOg0KDQogLSBJcyBteSBtb2R1bGUgZm9sbG93aW5nIG15IHN0eWxlIGd1aWRlcz8NCiAtIERvZXMgYW55IG9mIG15IHNjcmlwdHMgaGF2ZSBhIHN5bnRheCBlcnJvcj8NCiAtIERvIG15IHNjcmlwdHMgdXNlIGNvbW1hbmRzIEkgZG8gbm90IHdhbnQgdGhlbSB0byB1c2U/DQogLSBEbyBteSBjb21tYW5kcyBmb2xsb3cgYmVzdCBwcmFjdGljZXM/DQogLSBEbyBteSBjb21tYW5kcyBoYXZlIHByb3BlciBoZWxwPw0KDQpCYXNpY2FsbHksIHRoZXNlIGFsbG93IGEgZ2VuZXJhbCBtb2R1bGUgaGVhbHRoIGNoZWNrLg0KDQpUaGVzZSB0ZXN0cyBhcmUgYWxyZWFkeSBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZS4NCg0KIyMgRnVuY3Rpb24gVGVzdHMNCg0KQSBoZWFsdGh5IG1vZHVsZSBzaG91bGQgcHJvdmlkZSB1bml0IGFuZCBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIGNvbW1hbmRzICYgY29tcG9uZW50cyBpdCBzaGlwcy4NCk9ubHkgdGhlbiBjYW4gYmUgZ3VhcmFudGVlZCwgdGhhdCB0aGV5IHdpbGwgYWN0dWFsbHkgcGVyZm9ybSBhcyBwcm9taXNlZC4NCg0KSG93ZXZlciwgYXMgZWFjaCBzdWNoIHRlc3QgbXVzdCBiZSBzcGVjaWZpYyB0byB0aGUgZnVuY3Rpb24gaXQgdGVzdHMsIHRoZXJlIGNhbm5vdCBiZSBtdWNoIGluIHRoZSB3YXkgb2YgdGVtcGxhdGVzLgEJPQAAAAk+AAAABj8AAAAJcmVhZG1lLm1kBkAAAAAJcmVhZG1lLm1kCSsAAAAJQgAAAAlDAAAABSMAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBIQAAAAZEAAAACQ0KCQkJDQoJCQElAAAAIwAAAAZFAAAABg0KDQoJCQEnAAAAIwAAAAZGAAAALA0KCQkJW1N5c3RlbS5HdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCkNCgkJASgAAAALAAAACUcAAAABAAAAAQAAAAEsAAAACAAAAAlIAAAAAAAAAAAAAAABLQAAAAgAAAAJSAAAAAAAAAAAAAAAAS4AAAALAAAACUkAAAAIAAAACAAAAAEyAAAACAAAAAlIAAAAAAAAAAAAAAABMwAAAAgAAAAJSAAAAAAAAAAAAAAAATUAAAAIAAAACUsAAAABAAAAAQAAAAE2AAAACAAAAAlMAAAAAgAAAAIAAAABOgAAAAgAAAAJSAAAAAAAAAAAAAAAATsAAAAIAAAACUgAAAAAAAAAAAAAAAE9AAAACAAAAAlIAAAAAAAAAAAAAAABPgAAAAgAAAAJSAAAAAAAAAAAAAAAAUIAAAAIAAAACUgAAAAAAAAAAAAAAAFDAAAACAAAAAlIAAAAAAAAAAAAAAAHRwAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAlOAAAADQMRSAAAAAAAAAAHSQAAAAABAAAACAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAlPAAAACVAAAAAJUQAAAAlSAAAACVMAAAAJVAAAAAlVAAAACVYAAAARSwAAAAQAAAAGVwAAAARuYW1lDQMRTAAAAAQAAAAGWAAAAAp0ZXN0Zm9sZGVyBlkAAAAMcGVzdGVyY29uZmlnDQIBTgAAAB8AAAAGWgAAANUBIyBEZXNjcmlwdGlvbg0KDQpUaGlzIGlzIHdoZXJlIHRoZSBmdW5jdGlvbiB0ZXN0cyBnby4NCg0KTWFrZSBzdXJlIHRvIHB1dCB0aGVtIGluIGZvbGRlcnMgcmVmbGVjdGluZyB0aGUgYWN0dWFsIG1vZHVsZSBzdHJ1Y3R1cmUuDQoNCkl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGFuZCBwdWJsaWMgZnVuY3Rpb25zIGhlcmUuAQlbAAAACVwAAAAGXQAAAAlyZWFkbWUubWQGXgAAABNmdW5jdGlvbnNccmVhZG1lLm1kCSsAAAAJYAAAAAlhAAAAAU8AAAAfAAAABmIAAACCBiMgTGlzdCBvZiBmb3JiaWRkZW4gY29tbWFuZHMNCiRnbG9iYWw6QmFubmVkQ29tbWFuZHMgPSBAKA0KCSdXcml0ZS1Ib3N0Jw0KCSdXcml0ZS1WZXJib3NlJw0KCSdXcml0ZS1XYXJuaW5nJw0KCSdXcml0ZS1FcnJvcicNCgknV3JpdGUtT3V0cHV0Jw0KCSdXcml0ZS1JbmZvcm1hdGlvbicNCgknV3JpdGUtRGVidWcnDQoJDQoJIyBVc2UgQ0lNIGluc3RlYWQgd2hlcmUgcG9zc2libGUNCgknR2V0LVdtaU9iamVjdCcNCgknSW52b2tlLVdtaU1ldGhvZCcNCgknUmVnaXN0ZXItV21pRXZlbnQnDQoJJ1JlbW92ZS1XbWlPYmplY3QnDQoJJ1NldC1XbWlJbnN0YW5jZScNCg0KCSMgVXNlIEdldC1XaW5FdmVudCBpbnN0ZWFkDQoJJ0dldC1FdmVudExvZycNCikNCg0KPCMNCglDb250YWlucyBsaXN0IG9mIGV4Y2VwdGlvbnMgZm9yIGJhbm5lZCBjbWRsZXRzLg0KCUluc2VydCB0aGUgZmlsZSBuYW1lcyBvZiBmaWxlcyB0aGF0IG1heSBjb250YWluIHRoZW0uDQoJDQoJRXhhbXBsZToNCgkiV3JpdGUtSG9zdCIgID0gQCgnV3JpdGUtUFNGSG9zdENvbG9yLnBzMScsJ1dyaXRlLVBTRk1lc3NhZ2UucHMxJykNCiM+DQokZ2xvYmFsOk1heUNvbnRhaW5Db21tYW5kID0gQHsNCgkiV3JpdGUtSG9zdCIgID0gQCgpDQoJIldyaXRlLVZlcmJvc2UiID0gQCgpDQoJIldyaXRlLVdhcm5pbmciID0gQCgpDQoJIldyaXRlLUVycm9yIiAgPSBAKCkNCgkiV3JpdGUtT3V0cHV0IiA9IEAoKQ0KCSJXcml0ZS1JbmZvcm1hdGlvbiIgPSBAKCkNCgkiV3JpdGUtRGVidWciID0gQCgpDQp9AQljAAAACWQAAAAGZQAAABxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxBmYAAAAkZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxCSsAAAAJaAAAAAlpAAAAAVAAAAAfAAAABmoAAADgGCRtb2R1bGVSb290ID0gKFJlc29sdmUtUGF0aCAiJGdsb2JhbDp0ZXN0cm9vdFwuLiIpLlBhdGgNCg0KLiAiJGdsb2JhbDp0ZXN0cm9vdFxnZW5lcmFsXEZpbGVJbnRlZ3JpdHkuRXhjZXB0aW9ucy5wczEiDQoNCkRlc2NyaWJlICJWZXJpZnlpbmcgaW50ZWdyaXR5IG9mIG1vZHVsZSBmaWxlcyIgew0KCUJlZm9yZUFsbCB7DQoJCWZ1bmN0aW9uIEdldC1GaWxlRW5jb2RpbmcNCgkJew0KCQk8Iw0KCQkJLlNZTk9QU0lTDQoJCQkJVGVzdHMgYSBmaWxlIGZvciBlbmNvZGluZy4NCgkJCQ0KCQkJLkRFU0NSSVBUSU9ODQoJCQkJVGVzdHMgYSBmaWxlIGZvciBlbmNvZGluZy4NCgkJCQ0KCQkJLlBBUkFNRVRFUiBQYXRoDQoJCQkJVGhlIGZpbGUgdG8gdGVzdA0KCQkjPg0KCQkJW0NtZGxldEJpbmRpbmcoKV0NCgkJCVBhcmFtICgNCgkJCQlbUGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRUcnVlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJFRydWUpXQ0KCQkJCVtBbGlhcygnRnVsbE5hbWUnKV0NCgkJCQlbc3RyaW5nXQ0KCQkJCSRQYXRoDQoJCQkpDQoJCQkNCgkJCWlmICgkUFNWZXJzaW9uVGFibGUuUFNWZXJzaW9uLk1ham9yIC1sdCA2KQ0KCQkJew0KCQkJCVtieXRlW11dJGJ5dGUgPSBnZXQtY29udGVudCAtRW5jb2RpbmcgYnl0ZSAtUmVhZENvdW50IDQgLVRvdGFsQ291bnQgNCAtUGF0aCAkUGF0aA0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCVtieXRlW11dJGJ5dGUgPSBHZXQtQ29udGVudCAtQXNCeXRlU3RyZWFtIC1SZWFkQ291bnQgNCAtVG90YWxDb3VudCA0IC1QYXRoICRQYXRoDQoJCQl9DQoJCQkNCgkJCWlmICgkYnl0ZVswXSAtZXEgMHhlZiAtYW5kICRieXRlWzFdIC1lcSAweGJiIC1hbmQgJGJ5dGVbMl0gLWVxIDB4YmYpIHsgJ1VURjggQk9NJyB9DQoJCQllbHNlaWYgKCRieXRlWzBdIC1lcSAweGZlIC1hbmQgJGJ5dGVbMV0gLWVxIDB4ZmYpIHsgJ1VuaWNvZGUnIH0NCgkJCWVsc2VpZiAoJGJ5dGVbMF0gLWVxIDAgLWFuZCAkYnl0ZVsxXSAtZXEgMCAtYW5kICRieXRlWzJdIC1lcSAweGZlIC1hbmQgJGJ5dGVbM10gLWVxIDB4ZmYpIHsgJ1VURjMyJyB9DQoJCQllbHNlaWYgKCRieXRlWzBdIC1lcSAweDJiIC1hbmQgJGJ5dGVbMV0gLWVxIDB4MmYgLWFuZCAkYnl0ZVsyXSAtZXEgMHg3NikgeyAnVVRGNycgfQ0KCQkJZWxzZSB7ICdVbmtub3duJyB9DQoJCX0NCgl9DQoNCglDb250ZXh0ICJWYWxpZGF0aW5nIFBTMSBTY3JpcHQgZmlsZXMiIHsNCgkJJGFsbEZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkbW9kdWxlUm9vdCAtUmVjdXJzZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLnBzMSIgfCBXaGVyZS1PYmplY3QgRnVsbE5hbWUgLU5vdExpa2UgIiRtb2R1bGVSb290XHRlc3RzXCoiDQoJCQ0KCQlmb3JlYWNoICgkZmlsZSBpbiAkYWxsRmlsZXMpDQoJCXsNCgkJCSRuYW1lID0gJGZpbGUuRnVsbE5hbWUuUmVwbGFjZSgiJG1vZHVsZVJvb3RcIiwgJycpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIFVURjggZW5jb2Rpbmcgd2l0aCBCeXRlIE9yZGVyIE1hcmsiIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCUdldC1GaWxlRW5jb2RpbmcgLVBhdGggJGZpbGUuRnVsbE5hbWUgfCBTaG91bGQgLUJlICdVVEY4IEJPTScNCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UiIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCSgkZmlsZSB8IFNlbGVjdC1TdHJpbmcgIlxzJCIgfCBXaGVyZS1PYmplY3QgeyAkXy5MaW5lLlRyaW0oKS5MZW5ndGggLWd0IDB9KS5MaW5lTnVtYmVyIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQl9DQoJCQkNCgkJCSR0b2tlbnMgPSAkbnVsbA0KCQkJJHBhcnNlRXJyb3JzID0gJG51bGwNCgkJCSRhc3QgPSBbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5MYW5ndWFnZS5QYXJzZXJdOjpQYXJzZUZpbGUoJGZpbGUuRnVsbE5hbWUsIFtyZWZdJHRva2VucywgW3JlZl0kcGFyc2VFcnJvcnMpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHN5bnRheCBlcnJvcnMiIC1UZXN0Q2FzZXMgQHsgcGFyc2VFcnJvcnMgPSAkcGFyc2VFcnJvcnMgfSB7DQoJCQkJJHBhcnNlRXJyb3JzIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQl9DQoJCQkNCgkJCWZvcmVhY2ggKCRjb21tYW5kIGluICRnbG9iYWw6QmFubmVkQ29tbWFuZHMpDQoJCQl7DQoJCQkJaWYgKCRnbG9iYWw6TWF5Q29udGFpbkNvbW1hbmRbIiRjb21tYW5kIl0gLW5vdGNvbnRhaW5zICRmaWxlLk5hbWUpDQoJCQkJew0KCQkJCQlJdCAiWyRuYW1lXSBTaG91bGQgbm90IHVzZSAkY29tbWFuZCIgLVRlc3RDYXNlcyBAeyB0b2tlbnMgPSAkdG9rZW5zOyBjb21tYW5kID0gJGNvbW1hbmQgfSB7DQoJCQkJCQkkdG9rZW5zIHwgV2hlcmUtT2JqZWN0IFRleHQgLUVRICRjb21tYW5kIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJDQoJQ29udGV4dCAiVmFsaWRhdGluZyBoZWxwLnR4dCBoZWxwIGZpbGVzIiB7DQoJCSRhbGxGaWxlcyA9IEdldC1DaGlsZEl0ZW0gLVBhdGggJG1vZHVsZVJvb3QgLVJlY3Vyc2UgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5oZWxwLnR4dCIgfCBXaGVyZS1PYmplY3QgRnVsbE5hbWUgLU5vdExpa2UgIiRtb2R1bGVSb290XHRlc3RzXCoiDQoJCQ0KCQlmb3JlYWNoICgkZmlsZSBpbiAkYWxsRmlsZXMpDQoJCXsNCgkJCSRuYW1lID0gJGZpbGUuRnVsbE5hbWUuUmVwbGFjZSgiJG1vZHVsZVJvb3RcIiwgJycpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIFVURjggZW5jb2RpbmciIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCUdldC1GaWxlRW5jb2RpbmcgLVBhdGggJGZpbGUuRnVsbE5hbWUgfCBTaG91bGQgLUJlICdVVEY4IEJPTScNCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UiIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCSgkZmlsZSB8IFNlbGVjdC1TdHJpbmcgIlxzJCIgfCBXaGVyZS1PYmplY3QgeyAkXy5MaW5lLlRyaW0oKS5MZW5ndGggLWd0IDAgfSB8IE1lYXN1cmUtT2JqZWN0KS5Db3VudCB8IFNob3VsZCAtQmUgMA0KCQkJfQ0KCQl9DQoJfQ0KfQEJawAAAAlsAAAABm0AAAAXRmlsZUludGVncml0eS5UZXN0cy5wczEGbgAAAB9nZW5lcmFsXEZpbGVJbnRlZ3JpdHkuVGVzdHMucHMxCSsAAAAJcAAAAAlxAAAAAVEAAAAfAAAABnIAAACdBSMgTGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaWdub3JlZA0KJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucyA9IEAoDQogICAgDQopDQoNCjwjDQogIExpc3Qgb2YgYXJyYXllZCBlbnVtZXJhdGlvbnMuIFRoZXNlIG5lZWQgdG8gYmUgdHJlYXRlZCBkaWZmZXJlbnRseS4gQWRkIGZ1bGwgbmFtZS4NCiAgRXhhbXBsZToNCg0KICAiU3FsY29sbGFib3JhdGl2ZS5EYmF0b29scy5Db25uZWN0aW9uLk1hbmFnZW1lbnRDb25uZWN0aW9uVHlwZVtdIg0KIz4NCiRnbG9iYWw6SGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzID0gQCgNCgkNCikNCg0KPCMNCiAgU29tZSB0eXBlcyBvbiBwYXJhbWV0ZXJzIGp1c3QgZmFpbCB0aGVpciB2YWxpZGF0aW9uIG5vIG1hdHRlciB3aGF0Lg0KICBGb3IgdGhvc2UgaXQgYmVjb21lcyBwb3NzaWJsZSB0byBza2lwIHRoZW0sIGJ5IGFkZGluZyB0aGVtIHRvIHRoaXMgaGFzaHRhYmxlLg0KICBBZGQgYnkgZm9sbG93aW5nIHRoaXMgY29udmVudGlvbjogPGNvbW1hbmQgbmFtZT4gPSBAKDxsaXN0IG9mIHBhcmFtZXRlciBuYW1lcz4pDQogIEV4YW1wbGU6DQoNCiAgIkdldC1EYmFDbU9iamVjdCIgICAgICAgPSBAKCJEb05vdFVzZSIpDQojPg0KJGdsb2JhbDpIZWxwVGVzdFNraXBQYXJhbWV0ZXJUeXBlID0gQHsNCiAgICANCn0NCgEJcwAAAAl0AAAABnUAAAATSGVscC5FeGNlcHRpb25zLnBzMQZ2AAAAG2dlbmVyYWxcSGVscC5FeGNlcHRpb25zLnBzMQkrAAAACXgAAAAJeQAAAAFSAAAAHwAAAAZ6AAAA4zM8Iw0KICAgIC5OT1RFUw0KICAgICAgICBUaGUgb3JpZ2luYWwgdGVzdCB0aGlzIGlzIGJhc2VkIHVwb24gd2FzIHdyaXR0ZW4gYnkgSnVuZSBCbGVuZGVyLg0KCQlBZnRlciBzZXZlcmFsIHJvdW5kcyBvZiBtb2RpZmljYXRpb25zIGl0IHN0YW5kcyBub3cgYXMgaXQgaXMsIGJ1dCB0aGUgaG9ub3IgcmVtYWlucyBoZXJzLg0KDQoJCVRoYW5rIHlvdSBKdW5lLCBmb3IgYWxsIHlvdSBoYXZlIGRvbmUhDQoNCiAgICAuREVTQ1JJUFRJT04NCgkJVGhpcyB0ZXN0IGV2YWx1YXRlcyB0aGUgaGVscCBmb3IgYWxsIGNvbW1hbmRzIGluIGEgbW9kdWxlLg0KDQoJLlBBUkFNRVRFUiBTa2lwVGVzdA0KCQlEaXNhYmxlcyB0aGlzIHRlc3QuDQoJDQoJLlBBUkFNRVRFUiBDb21tYW5kUGF0aA0KCQlMaXN0IG9mIHBhdGhzIHVuZGVyIHdoaWNoIHRoZSBzY3JpcHQgZmlsZXMgYXJlIHN0b3JlZC4NCgkJVGhpcyB0ZXN0IGFzc3VtZXMgdGhhdCBhbGwgZnVuY3Rpb25zIGhhdmUgdGhlaXIgb3duIGZpbGUgdGhhdCBpcyBuYW1lZCBhZnRlciB0aGVtc2VsdmVzLg0KCQlUaGVzZSBwYXRocyBhcmUgdXNlZCB0byBzZWFyY2ggZm9yIGNvbW1hbmRzIHRoYXQgc2hvdWxkIGV4aXN0IGFuZCBiZSB0ZXN0ZWQuDQoJCVdpbGwgc2VhcmNoIHJlY3Vyc2l2ZWx5IGFuZCBhY2NlcHRzIHdpbGRjYXJkcywgbWFrZSBzdXJlIG9ubHkgZnVuY3Rpb25zIGFyZSBmb3VuZA0KDQoJLlBBUkFNRVRFUiBNb2R1bGVOYW1lDQoJCU5hbWUgb2YgdGhlIG1vZHVsZSB0byBiZSB0ZXN0ZWQuDQoJCVRoZSBtb2R1bGUgbXVzdCBhbHJlYWR5IGJlIGltcG9ydGVkDQoNCgkuUEFSQU1FVEVSIEV4Y2VwdGlvbnNGaWxlDQoJCUZpbGUgaW4gd2hpY2ggZXhjZXB0aW9ucyBhbmQgYWRqdXN0bWVudHMgYXJlIGNvbmZpZ3VyZWQuDQoJCUluIGl0IHRoZXJlIHNob3VsZCBiZSB0d28gYXJyYXlzIGFuZCBhIGhhc2h0YWJsZSBkZWZpbmVkOg0KCQkJJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucw0KCQkJJGdsb2JhbDpIZWxwVGVzdEVudW1lcmF0ZWRBcnJheXMNCgkJCSRnbG9iYWw6SGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZQ0KCQlUaGVzZSBjYW4gYmUgdXNlZCB0byB0d2VhayB0aGUgdGVzdHMgc2xpZ2h0bHkgaW4gY2FzZXMgb2YgbmVlZC4NCgkJU2VlIHRoZSBleGFtcGxlIGZpbGUgZm9yIGV4cGxhbmF0aW9ucyBvbiBlYWNoIG9mIHRoZXNlIHVzYWdlIGFuZCBlZmZlY3QuDQojPg0KW0NtZGxldEJpbmRpbmcoKV0NClBhcmFtICgNCglbc3dpdGNoXQ0KCSRTa2lwVGVzdCwNCgkNCglbc3RyaW5nW11dDQoJJENvbW1hbmRQYXRoID0gQCgiJGdsb2JhbDp0ZXN0cm9vdFwuLlxmdW5jdGlvbnMiLCAiJGdsb2JhbDp0ZXN0cm9vdFwuLlxpbnRlcm5hbFxmdW5jdGlvbnMiKSwNCgkNCglbc3RyaW5nXQ0KCSRNb2R1bGVOYW1lID0gIsO+bmFtZcO+IiwNCgkNCglbc3RyaW5nXQ0KCSRFeGNlcHRpb25zRmlsZSA9ICIkZ2xvYmFsOnRlc3Ryb290XGdlbmVyYWxcSGVscC5FeGNlcHRpb25zLnBzMSINCikNCmlmICgkU2tpcFRlc3QpIHsgcmV0dXJuIH0NCi4gJEV4Y2VwdGlvbnNGaWxlDQoNCiRpbmNsdWRlZE5hbWVzID0gKEdldC1DaGlsZEl0ZW0gJENvbW1hbmRQYXRoIC1SZWN1cnNlIC1GaWxlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIioucHMxIikuQmFzZU5hbWUNCiRjb21tYW5kcyA9IEdldC1Db21tYW5kIC1Nb2R1bGUgKEdldC1Nb2R1bGUgJE1vZHVsZU5hbWUpIC1Db21tYW5kVHlwZSBDbWRsZXQsIEZ1bmN0aW9uLCBXb3JrZmxvdyB8IFdoZXJlLU9iamVjdCBOYW1lIC1pbiAkaW5jbHVkZWROYW1lcw0KDQojIyBXaGVuIHRlc3RpbmcgaGVscCwgcmVtZW1iZXIgdGhhdCBoZWxwIGlzIGNhY2hlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggc2Vzc2lvbi4NCiMjIFRvIHRlc3QsIHJlc3RhcnQgc2Vzc2lvbi4NCg0KDQpmb3JlYWNoICgkY29tbWFuZCBpbiAkY29tbWFuZHMpIHsNCiAgICAkY29tbWFuZE5hbWUgPSAkY29tbWFuZC5OYW1lDQogICAgDQogICAgIyBTa2lwIGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgb24gdGhlIGV4Y2x1c2lvbnMgbGlzdA0KICAgIGlmICgkZ2xvYmFsOkZ1bmN0aW9uSGVscFRlc3RFeGNlcHRpb25zIC1jb250YWlucyAkY29tbWFuZE5hbWUpIHsgY29udGludWUgfQ0KICAgIA0KICAgICMgVGhlIG1vZHVsZS1xdWFsaWZpZWQgY29tbWFuZCBmYWlscyBvbiBNaWNyb3NvZnQuUG93ZXJTaGVsbC5BcmNoaXZlIGNtZGxldHMNCiAgICAkSGVscCA9IEdldC1IZWxwICRjb21tYW5kTmFtZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQ0KCQ0KCURlc2NyaWJlICJUZXN0IGhlbHAgZm9yICRjb21tYW5kTmFtZSIgew0KICAgICAgICANCgkJIyBJZiBoZWxwIGlzIG5vdCBmb3VuZCwgc3lub3BzaXMgaW4gYXV0by1nZW5lcmF0ZWQgaGVscCBpcyB0aGUgc3ludGF4IGRpYWdyYW0NCgkJSXQgInNob3VsZCBub3QgYmUgYXV0by1nZW5lcmF0ZWQiIC1UZXN0Q2FzZXMgQHsgSGVscCA9ICRIZWxwIH0gew0KCQkJJEhlbHAuU3lub3BzaXMgfCBTaG91bGQgLU5vdCAtQmVMaWtlICcqYFtgPENvbW1vblBhcmFtZXRlcnNgPmBdKicNCgkJfQ0KICAgICAgICANCgkJIyBTaG91bGQgYmUgYSBkZXNjcmlwdGlvbiBmb3IgZXZlcnkgZnVuY3Rpb24NCgkJSXQgImdldHMgZGVzY3JpcHRpb24gZm9yICRjb21tYW5kTmFtZSIgLVRlc3RDYXNlcyBAeyBIZWxwID0gJEhlbHAgfSB7DQoJCQkkSGVscC5EZXNjcmlwdGlvbiB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQoJCX0NCiAgICAgICAgDQoJCSMgU2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBleGFtcGxlDQoJCUl0ICJnZXRzIGV4YW1wbGUgY29kZSBmcm9tICRjb21tYW5kTmFtZSIgLVRlc3RDYXNlcyBAeyBIZWxwID0gJEhlbHAgfSB7DQoJCQkoJEhlbHAuRXhhbXBsZXMuRXhhbXBsZSB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDEpLkNvZGUgfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQoJDQoJCSMgU2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBleGFtcGxlIGRlc2NyaXB0aW9uDQoJCUl0ICJnZXRzIGV4YW1wbGUgaGVscCBmcm9tICRjb21tYW5kTmFtZSIgLVRlc3RDYXNlcyBAeyBIZWxwID0gJEhlbHAgfSB7DQoJCQkoJEhlbHAuRXhhbXBsZXMuRXhhbXBsZS5SZW1hcmtzIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuVGV4dCB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQoJCX0NCiAgICAgICAgDQogICAgICAgIENvbnRleHQgIlRlc3QgcGFyYW1ldGVyIGhlbHAgZm9yICRjb21tYW5kTmFtZSIgew0KICAgICAgICAgICAgDQogICAgICAgICAgICAkY29tbW9uID0gJ0RlYnVnJywgJ0Vycm9yQWN0aW9uJywgJ0Vycm9yVmFyaWFibGUnLCAnSW5mb3JtYXRpb25BY3Rpb24nLCAnSW5mb3JtYXRpb25WYXJpYWJsZScsICdPdXRCdWZmZXInLCAnT3V0VmFyaWFibGUnLCAnUGlwZWxpbmVWYXJpYWJsZScsICdWZXJib3NlJywgJ1dhcm5pbmdBY3Rpb24nLCAnV2FybmluZ1ZhcmlhYmxlJw0KICAgICAgICAgICAgDQogICAgICAgICAgICAkcGFyYW1ldGVycyA9ICRjb21tYW5kLlBhcmFtZXRlclNldHMuUGFyYW1ldGVycyB8IFNvcnQtT2JqZWN0IC1Qcm9wZXJ0eSBOYW1lIC1VbmlxdWUgfCBXaGVyZS1PYmplY3QgTmFtZSAtbm90aW4gJGNvbW1vbg0KICAgICAgICAgICAgJHBhcmFtZXRlck5hbWVzID0gJHBhcmFtZXRlcnMuTmFtZQ0KICAgICAgICAgICAgJEhlbHBQYXJhbWV0ZXJOYW1lcyA9ICRIZWxwLlBhcmFtZXRlcnMuUGFyYW1ldGVyLk5hbWUgfCBTb3J0LU9iamVjdCAtVW5pcXVlDQogICAgICAgICAgICBmb3JlYWNoICgkcGFyYW1ldGVyIGluICRwYXJhbWV0ZXJzKSB7DQogICAgICAgICAgICAgICAgJHBhcmFtZXRlck5hbWUgPSAkcGFyYW1ldGVyLk5hbWUNCiAgICAgICAgICAgICAgICAkcGFyYW1ldGVySGVscCA9ICRIZWxwLnBhcmFtZXRlcnMucGFyYW1ldGVyIHwgV2hlcmUtT2JqZWN0IE5hbWUgLUVRICRwYXJhbWV0ZXJOYW1lDQoJCQkNCgkJCQkjIFNob3VsZCBiZSBhIGRlc2NyaXB0aW9uIGZvciBldmVyeSBwYXJhbWV0ZXINCgkJCQlJdCAiZ2V0cyBoZWxwIGZvciBwYXJhbWV0ZXI6ICRwYXJhbWV0ZXJOYW1lIDogaW4gJGNvbW1hbmROYW1lIiAtVGVzdENhc2VzIEB7IHBhcmFtZXRlckhlbHAgPSAkcGFyYW1ldGVySGVscCB9IHsNCgkJCQkJJHBhcmFtZXRlckhlbHAuRGVzY3JpcHRpb24uVGV4dCB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQoJCQkJfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICRjb2RlTWFuZGF0b3J5ID0gJHBhcmFtZXRlci5Jc01hbmRhdG9yeS50b1N0cmluZygpDQoJCQkJSXQgImhlbHAgZm9yICRwYXJhbWV0ZXJOYW1lIHBhcmFtZXRlciBpbiAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgTWFuZGF0b3J5IHZhbHVlIiAtVGVzdENhc2VzIEB7IHBhcmFtZXRlckhlbHAgPSAkcGFyYW1ldGVySGVscDsgY29kZU1hbmRhdG9yeSA9ICRjb2RlTWFuZGF0b3J5IH0gew0KCQkJCQkkcGFyYW1ldGVySGVscC5SZXF1aXJlZCB8IFNob3VsZCAtQmUgJGNvZGVNYW5kYXRvcnkNCgkJCQl9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCRIZWxwVGVzdFNraXBQYXJhbWV0ZXJUeXBlWyRjb21tYW5kTmFtZV0gLWNvbnRhaW5zICRwYXJhbWV0ZXJOYW1lKSB7IGNvbnRpbnVlIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkY29kZVR5cGUgPSAkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuTmFtZQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICgkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuSXNFbnVtKSB7DQogICAgICAgICAgICAgICAgICAgICMgRW51bWVyYXRpb25zIG9mdGVuIGhhdmUgaXNzdWVzIHdpdGggdGhlIHR5cGVuYW1lIG5vdCBiZWluZyByZWxpYWJseSBhdmFpbGFibGUNCiAgICAgICAgICAgICAgICAgICAgJG5hbWVzID0gJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlOjpHZXROYW1lcygkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUpDQoJCQkJCQkjIFBhcmFtZXRlciB0eXBlIGluIEhlbHAgc2hvdWxkIG1hdGNoIGNvZGUNCgkJCQkJSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIC1UZXN0Q2FzZXMgQHsgcGFyYW1ldGVySGVscCA9ICRwYXJhbWV0ZXJIZWxwOyBuYW1lcyA9ICRuYW1lcyB9IHsNCgkJCQkJCSRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlR3JvdXAucGFyYW1ldGVyVmFsdWUgfCBTaG91bGQgLWJlICRuYW1lcw0KCQkJCQl9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2VpZiAoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLkZ1bGxOYW1lIC1pbiAkSGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzKSB7DQogICAgICAgICAgICAgICAgICAgICMgRW51bWVyYXRpb25zIG9mdGVuIGhhdmUgaXNzdWVzIHdpdGggdGhlIHR5cGVuYW1lIG5vdCBiZWluZyByZWxpYWJseSBhdmFpbGFibGUNCiAgICAgICAgICAgICAgICAgICAgJG5hbWVzID0gW0VudW1dOjpHZXROYW1lcygkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuRGVjbGFyZWRNZW1iZXJzWzBdLlJldHVyblR5cGUpDQoJCQkJCUl0ICJoZWxwIGZvciAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGUgZm9yICRwYXJhbWV0ZXJOYW1lIiAtVGVzdENhc2VzIEB7IHBhcmFtZXRlckhlbHAgPSAkcGFyYW1ldGVySGVscDsgbmFtZXMgPSAkbmFtZXMgfSB7DQoJCQkJCQkkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZUdyb3VwLnBhcmFtZXRlclZhbHVlIHwgU2hvdWxkIC1iZSAkbmFtZXMNCgkJCQkJfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgIyBUbyBhdm9pZCBjYWxsaW5nIFRyaW0gbWV0aG9kIG9uIGEgbnVsbCBvYmplY3QuDQogICAgICAgICAgICAgICAgICAgICRoZWxwVHlwZSA9IGlmICgkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZSkgeyAkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZS5UcmltKCkgfQ0KCQkJCQkjIFBhcmFtZXRlciB0eXBlIGluIEhlbHAgc2hvdWxkIG1hdGNoIGNvZGUNCgkJCQkJSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIC1UZXN0Q2FzZXMgQHsgaGVscFR5cGUgPSAkaGVscFR5cGU7IGNvZGVUeXBlID0gJGNvZGVUeXBlIH0gew0KCQkJCQkJJGhlbHBUeXBlIHwgU2hvdWxkIC1iZSAkY29kZVR5cGUNCgkJCQkJfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvcmVhY2ggKCRoZWxwUGFybSBpbiAkSGVscFBhcmFtZXRlck5hbWVzKSB7DQoJCQkJIyBTaG91bGRuJ3QgZmluZCBleHRyYSBwYXJhbWV0ZXJzIGluIGhlbHAuDQoJCQkJSXQgImZpbmRzIGhlbHAgcGFyYW1ldGVyIGluIGNvZGU6ICRoZWxwUGFybSIgLVRlc3RDYXNlcyBAeyBoZWxwUGFybSA9ICRoZWxwUGFybTsgcGFyYW1ldGVyTmFtZXMgPSAkcGFyYW1ldGVyTmFtZXMgfSB7DQoJCQkJCSRoZWxwUGFybSAtaW4gJHBhcmFtZXRlck5hbWVzIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQkJCX0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0BCXsAAAAJfAAAAAZ9AAAADkhlbHAuVGVzdHMucHMxBn4AAAAWZ2VuZXJhbFxIZWxwLlRlc3RzLnBzMQkrAAAACYAAAAAJgQAAAAFTAAAAHwAAAAaCAAAAyxVEZXNjcmliZSAiVmFsaWRhdGluZyB0aGUgbW9kdWxlIG1hbmlmZXN0IiB7DQoJJG1vZHVsZVJvb3QgPSAoUmVzb2x2ZS1QYXRoICIkZ2xvYmFsOnRlc3Ryb290XC4uIikuUGF0aA0KCSRtYW5pZmVzdCA9ICgoR2V0LUNvbnRlbnQgIiRtb2R1bGVSb290XMO+bmFtZcO+LnBzZDEiKSAtam9pbiAiYG4iKSB8IEludm9rZS1FeHByZXNzaW9uDQoJQ29udGV4dCAiQmFzaWMgcmVzb3VyY2VzIHZhbGlkYXRpb24iIHsNCgkJJGZpbGVzID0gR2V0LUNoaWxkSXRlbSAiJG1vZHVsZVJvb3RcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLnBzMSINCgkJSXQgIkV4cG9ydHMgYWxsIGZ1bmN0aW9ucyBpbiB0aGUgcHVibGljIGZvbGRlciIgLVRlc3RDYXNlcyBAeyBmaWxlcyA9ICRmaWxlczsgbWFuaWZlc3QgPSAkbWFuaWZlc3QgfSB7DQoJCQkNCgkJCSRmdW5jdGlvbnMgPSAoQ29tcGFyZS1PYmplY3QgLVJlZmVyZW5jZU9iamVjdCAkZmlsZXMuQmFzZU5hbWUgLURpZmZlcmVuY2VPYmplY3QgJG1hbmlmZXN0LkZ1bmN0aW9uc1RvRXhwb3J0IHwgV2hlcmUtT2JqZWN0IFNpZGVJbmRpY2F0b3IgLUxpa2UgJzw9JykuSW5wdXRPYmplY3QNCgkJCSRmdW5jdGlvbnMgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCQlJdCAiRXhwb3J0cyBubyBmdW5jdGlvbiB0aGF0IGlzbid0IGFsc28gcHJlc2VudCBpbiB0aGUgcHVibGljIGZvbGRlciIgLVRlc3RDYXNlcyBAeyBmaWxlcyA9ICRmaWxlczsgbWFuaWZlc3QgPSAkbWFuaWZlc3QgfSB7DQoJCQkkZnVuY3Rpb25zID0gKENvbXBhcmUtT2JqZWN0IC1SZWZlcmVuY2VPYmplY3QgJGZpbGVzLkJhc2VOYW1lIC1EaWZmZXJlbmNlT2JqZWN0ICRtYW5pZmVzdC5GdW5jdGlvbnNUb0V4cG9ydCB8IFdoZXJlLU9iamVjdCBTaWRlSW5kaWNhdG9yIC1MaWtlICc9PicpLklucHV0T2JqZWN0DQoJCQkkZnVuY3Rpb25zIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCX0NCgkJDQoJCUl0ICJFeHBvcnRzIG5vbmUgb2YgaXRzIGludGVybmFsIGZ1bmN0aW9ucyIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IG1hbmlmZXN0ID0gJG1hbmlmZXN0IH0gew0KCQkJJGZpbGVzID0gR2V0LUNoaWxkSXRlbSAiJG1vZHVsZVJvb3RcaW50ZXJuYWxcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsZSAtRmlsdGVyICIqLnBzMSINCgkJCSRmaWxlcyB8IFdoZXJlLU9iamVjdCBCYXNlTmFtZSAtSW4gJG1hbmlmZXN0LkZ1bmN0aW9uc1RvRXhwb3J0IHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCX0NCgl9DQoJDQoJQ29udGV4dCAiSW5kaXZpZHVhbCBmaWxlIHZhbGlkYXRpb24iIHsNCgkJSXQgIlRoZSByb290IG1vZHVsZSBmaWxlIGV4aXN0cyIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IG1hbmlmZXN0ID0gJG1hbmlmZXN0IH0gew0KCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkKCRtYW5pZmVzdC5Sb290TW9kdWxlKSIgfCBTaG91bGQgLUJlICR0cnVlDQoJCX0NCgkJDQoJCWZvcmVhY2ggKCRmb3JtYXQgaW4gJG1hbmlmZXN0LkZvcm1hdHNUb1Byb2Nlc3MpDQoJCXsNCgkJCUl0ICJUaGUgZmlsZSAkZm9ybWF0IHNob3VsZCBleGlzdCIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IGZvcm1hdCA9ICRmb3JtYXQgfSB7DQoJCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkZm9ybWF0IiB8IFNob3VsZCAtQmUgJHRydWUNCgkJCX0NCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJHR5cGUgaW4gJG1hbmlmZXN0LlR5cGVzVG9Qcm9jZXNzKQ0KCQl7DQoJCQlJdCAiVGhlIGZpbGUgJHR5cGUgc2hvdWxkIGV4aXN0IiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgdHlwZSA9ICR0eXBlIH0gew0KCQkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJHR5cGUiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQkJfQ0KCQl9DQoJCQ0KCQlmb3JlYWNoICgkYXNzZW1ibHkgaW4gJG1hbmlmZXN0LlJlcXVpcmVkQXNzZW1ibGllcykNCgkJew0KICAgICAgICAgICAgaWYgKCRhc3NlbWJseSAtbGlrZSAiKi5kbGwiKSB7DQogICAgICAgICAgICAgICAgSXQgIlRoZSBmaWxlICRhc3NlbWJseSBzaG91bGQgZXhpc3QiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyBhc3NlbWJseSA9ICRhc3NlbWJseSB9IHsNCiAgICAgICAgICAgICAgICAgICAgVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkYXNzZW1ibHkiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIEl0ICJUaGUgZmlsZSAkYXNzZW1ibHkgc2hvdWxkIGxvYWQgZnJvbSB0aGUgR0FDIiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgYXNzZW1ibHkgPSAkYXNzZW1ibHkgfSB7DQogICAgICAgICAgICAgICAgICAgIHsgQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSAkYXNzZW1ibHkgfSB8IFNob3VsZCAtTm90IC1UaHJvdw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KCQkNCgkJZm9yZWFjaCAoJHRhZyBpbiAkbWFuaWZlc3QuUHJpdmF0ZURhdGEuUFNEYXRhLlRhZ3MpDQoJCXsNCgkJCUl0ICJUYWdzIHNob3VsZCBoYXZlIG5vIHNwYWNlcyBpbiBuYW1lIiAtVGVzdENhc2VzIEB7IHRhZyA9ICR0YWcgfSB7DQoJCQkJJHRhZyAtbWF0Y2ggIiAiIHwgU2hvdWxkIC1CZSAkZmFsc2UNCgkJCX0NCgkJfQ0KCX0NCn0BCYMAAAAJhAAAAAaFAAAAEk1hbmlmZXN0LlRlc3RzLnBzMQaGAAAAGmdlbmVyYWxcTWFuaWZlc3QuVGVzdHMucHMxCSsAAAAJiAAAAAmJAAAAAVQAAAAfAAAABooAAADrCFtDbWRsZXRCaW5kaW5nKCldDQpQYXJhbSAoDQoJW3N3aXRjaF0NCgkkU2tpcFRlc3QsDQoJDQoJW3N0cmluZ1tdXQ0KCSRDb21tYW5kUGF0aCA9IEAoIiRnbG9iYWw6dGVzdHJvb3RcLi5cZnVuY3Rpb25zIiwgIiRnbG9iYWw6dGVzdHJvb3RcLi5caW50ZXJuYWxcZnVuY3Rpb25zIikNCikNCg0KaWYgKCRTa2lwVGVzdCkgeyByZXR1cm4gfQ0KDQokZ2xvYmFsOl9fcGVzdGVyX2RhdGEuU2NyaXB0QW5hbHl6ZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QNCg0KRGVzY3JpYmUgJ0ludm9raW5nIFBTU2NyaXB0QW5hbHl6ZXIgYWdhaW5zdCBjb21tYW5kYmFzZScgew0KCSRjb21tYW5kRmlsZXMgPSBHZXQtQ2hpbGRJdGVtIC1QYXRoICRDb21tYW5kUGF0aCAtUmVjdXJzZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLnBzMSINCgkkc2NyaXB0QW5hbHl6ZXJSdWxlcyA9IEdldC1TY3JpcHRBbmFseXplclJ1bGUNCgkNCglmb3JlYWNoICgkZmlsZSBpbiAkY29tbWFuZEZpbGVzKQ0KCXsNCgkJQ29udGV4dCAiQW5hbHl6aW5nICQoJGZpbGUuQmFzZU5hbWUpIiB7DQoJCQkkYW5hbHlzaXMgPSBJbnZva2UtU2NyaXB0QW5hbHl6ZXIgLVBhdGggJGZpbGUuRnVsbE5hbWUgLUV4Y2x1ZGVSdWxlIFBTQXZvaWRUcmFpbGluZ1doaXRlc3BhY2UsIFBTU2hvdWxkUHJvY2Vzcw0KCQkJDQoJCQlmb3JFYWNoICgkcnVsZSBpbiAkc2NyaXB0QW5hbHl6ZXJSdWxlcykNCgkJCXsNCgkJCQlJdCAiU2hvdWxkIHBhc3MgJHJ1bGUiIC1UZXN0Q2FzZXMgQHsgYW5hbHlzaXMgPSAkYW5hbHlzaXM7IHJ1bGUgPSAkcnVsZSB9IHsNCgkJCQkJSWYgKCRhbmFseXNpcy5SdWxlTmFtZSAtY29udGFpbnMgJHJ1bGUpDQoJCQkJCXsNCgkJCQkJCSRhbmFseXNpcyB8IFdoZXJlLU9iamVjdCBSdWxlTmFtZSAtRVEgJHJ1bGUgLW91dHZhcmlhYmxlIGZhaWx1cmVzIHwgRm9yRWFjaC1PYmplY3QgeyAkbnVsbCA9ICRnbG9iYWw6X19wZXN0ZXJfZGF0YS5TY3JpcHRBbmFseXplci5BZGQoJF8pIH0NCgkJCQkJCQ0KCQkJCQkJMSB8IFNob3VsZCAtQmUgMA0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJMCB8IFNob3VsZCAtQmUgMA0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KfQEJiwAAAAmMAAAABo0AAAAaUFNTY3JpcHRBbmFseXplci5UZXN0cy5wczEGjgAAACJnZW5lcmFsXFBTU2NyaXB0QW5hbHl6ZXIuVGVzdHMucHMxCSsAAAAJkAAAAAmRAAAAAVUAAAAfAAAABpIAAAD9AyRleGNlcHRpb25zID0gQHsgfQ0KDQo8Iw0KQSBsaXN0IG9mIGVudHJpZXMgdGhhdCBNQVkgYmUgaW4gdGhlIGxhbmd1YWdlIGZpbGVzLCB3aXRob3V0IGNhdXNpbmcgdGhlIHRlc3RzIHRvIGZhaWwuDQpUaGlzIGlzIGNvbW1vbmx5IHVzZWQgaW4gbW9kdWxlcyB0aGF0IGdlbmVyYXRlIGxvY2FsaXplZCBtZXNzYWdlcyBzdHJhaWdodCBmcm9tIEMjLg0KU3BlY2lmeSB0aGUgZnVsbCBrZXkgYXMgaXQgaXMgd3JpdHRlbiBpbiB0aGUgbGFuZ3VhZ2UgZmlsZXMsIGRvIG5vdCBwcmVwZW5kIHRoZSBtb2R1bGVuYW1lLA0KYXMgeW91IHdvdWxkIGhhdmUgdG8gaW4gQyMgY29kZS4NCg0KRXhhbXBsZToNCiRleGNlcHRpb25zWydMZWdhbFN1cnBsdXMnXSA9IEAoDQogICAgJ0V4Y2VwdGlvbi5TdHJlYW1zLkZhaWxlZENyZWF0ZScNCiAgICAnRXhjZXB0aW9uLlN0cmVhbXMuRmFpbGVkRGlzcG9zZScNCikNCiM+DQokZXhjZXB0aW9uc1snTGVnYWxTdXJwbHVzJ10gPSBAKA0KDQopDQoNCiRleGNlcHRpb25zAQmTAAAACZQAAAAGlQAAABZzdHJpbmdzLkV4Y2VwdGlvbnMucHMxBpYAAAAeZ2VuZXJhbFxzdHJpbmdzLkV4Y2VwdGlvbnMucHMxCSsAAAAJmAAAAAmZAAAAAVYAAAAfAAAABpoAAADJBzwjDQouREVTQ1JJUFRJT04NCiAgICBUaGlzIHRlc3QgdmVyaWZpZXMsIHRoYXQgYWxsIHN0cmluZ3MgdGhhdCBoYXZlIGJlZW4gdXNlZCwNCiAgICBhcmUgbGlzdGVkIGluIHRoZSBsYW5ndWFnZSBmaWxlcyBhbmQgdGh1cyBoYXZlIGEgbWVzc2FnZSBiZWluZyBkaXNwbGF5ZWQuDQoNCiAgICBJdCBhbHNvIGNoZWNrcywgd2hldGhlciB0aGUgbGFuZ3VhZ2UgZmlsZXMgaGF2ZSBvcnBoYW5lZCBlbnRyaWVzIHRoYXQgbmVlZCBjbGVhbmluZyB1cC4NCiM+DQoNCg0KDQpEZXNjcmliZSAiVGVzdGluZyBsb2NhbGl6YXRpb24gc3RyaW5ncyIgew0KCSRtb2R1bGVSb290ID0gKEdldC1Nb2R1bGUgw75uYW1lw74pLk1vZHVsZUJhc2UNCgkkc3RyaW5nc1Jlc3VsdHMgPSBFeHBvcnQtUFNNRFN0cmluZyAtTW9kdWxlUm9vdCAkbW9kdWxlUm9vdA0KCSRleGNlcHRpb25zID0gJiAiJGdsb2JhbDp0ZXN0cm9vdFxnZW5lcmFsXHN0cmluZ3MuRXhjZXB0aW9ucy5wczEiDQoJDQoJZm9yZWFjaCAoJHN0cmluZ0VudHJ5IGluICRzdHJpbmdzUmVzdWx0cykgew0KICAgICAgICBpZiAoJHN0cmluZ0VudHJ5LlN0cmluZyAtZXEgImtleSIpIHsgY29udGludWUgfSAjIFNraXBwaW5nIHRoZSB0ZW1wbGF0ZSBkZWZhdWx0IGVudHJ5DQogICAgICAgIEl0ICJTaG91bGQgYmUgdXNlZCAmIGhhdmUgdGV4dDogJCgkc3RyaW5nRW50cnkuU3RyaW5nKSIgLVRlc3RDYXNlcyBAeyBzdHJpbmdFbnRyeSA9ICRzdHJpbmdFbnRyeSB9IHsNCiAgICAgICAgICAgIGlmICgkZXhjZXB0aW9ucy5MZWdhbFN1cnBsdXMgLW5vdGNvbnRhaW5zICRzdHJpbmdFbnRyeS5TdHJpbmcpIHsNCiAgICAgICAgICAgICAgICAkc3RyaW5nRW50cnkuU3VycGx1cyB8IFNob3VsZCAtQmVGYWxzZQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHN0cmluZ0VudHJ5LlRleHQgfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KICAgICAgICB9DQogICAgfQ0KfQEJmwAAAAmcAAAABp0AAAARc3RyaW5ncy5UZXN0cy5wczEGngAAABlnZW5lcmFsXHN0cmluZ3MuVGVzdHMucHMxCSsAAAAJoAAAAAmhAAAAAVsAAAAIAAAACUgAAAAAAAAAAAAAAAFcAAAACAAAAAlIAAAAAAAAAAAAAAABYAAAAAgAAAAJSAAAAAAAAAAAAAAAAWEAAAAIAAAACUgAAAAAAAAAAAAAAAFjAAAACAAAAAlIAAAAAAAAAAAAAAABZAAAAAgAAAAJSAAAAAAAAAAAAAAAAWgAAAAIAAAACUgAAAAAAAAAAAAAAAFpAAAACAAAAAlIAAAAAAAAAAAAAAABawAAAAgAAAAJSAAAAAAAAAAAAAAAAWwAAAAIAAAACUgAAAAAAAAAAAAAAAFwAAAACAAAAAlIAAAAAAAAAAAAAAABcQAAAAgAAAAJSAAAAAAAAAAAAAAAAXMAAAAIAAAACUgAAAAAAAAAAAAAAAF0AAAACAAAAAlIAAAAAAAAAAAAAAABeAAAAAgAAAAJSAAAAAAAAAAAAAAAAXkAAAAIAAAACUgAAAAAAAAAAAAAAAF7AAAACAAAAAmjAAAAAQAAAAEAAAABfAAAAAgAAAAJSAAAAAAAAAAAAAAAAYAAAAAIAAAACUgAAAAAAAAAAAAAAAGBAAAACAAAAAlIAAAAAAAAAAAAAAABgwAAAAgAAAAJpQAAAAEAAAABAAAAAYQAAAAIAAAACUgAAAAAAAAAAAAAAAGIAAAACAAAAAlIAAAAAAAAAAAAAAABiQAAAAgAAAAJSAAAAAAAAAAAAAAAAYsAAAAIAAAACUgAAAAAAAAAAAAAAAGMAAAACAAAAAlIAAAAAAAAAAAAAAABkAAAAAgAAAAJSAAAAAAAAAAAAAAAAZEAAAAIAAAACUgAAAAAAAAAAAAAAAGTAAAACAAAAAlIAAAAAAAAAAAAAAABlAAAAAgAAAAJSAAAAAAAAAAAAAAAAZgAAAAIAAAACUgAAAAAAAAAAAAAAAGZAAAACAAAAAlIAAAAAAAAAAAAAAABmwAAAAgAAAAJpwAAAAEAAAABAAAAAZwAAAAIAAAACUgAAAAAAAAAAAAAAAGgAAAACAAAAAlIAAAAAAAAAAAAAAABoQAAAAgAAAAJSAAAAAAAAAAAAAAAEaMAAAAEAAAABqkAAAAEbmFtZQ0DEaUAAAAEAAAABqoAAAAEbmFtZQ0DEacAAAAEAAAABqsAAAAEbmFtZQ0DCw==</BA>
    </MS>
  </Obj>
</Objs>