internal/templates/PSFTests-2.0.1.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.1</Version>
      <S N="Description">The PSFramework-based standard test suite for a PowerShell Module</S>
      <S N="Author">Friedrich Weinmann</S>
      <DT N="CreatedOn">2024-06-02T00: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="Parameters2" RefId="8">
        <TN RefId="5">
          <T>System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[PSModuleDevelopment.Template.Parameter.ParameterBase, PSModuleDevelopment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]]</T>
          <T>System.Object</T>
        </TN>
        <DCT />
      </Obj>
      <Obj N="Children" RefId="9">
        <TN RefId="6">
          <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="10">
            <TN RefId="7">
              <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="11">
                <TNRef RefId="6" />
                <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="12">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="13">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAACWZ1bmN0aW9ucwYFAAAACWZ1bmN0aW9ucwYGAAAAAsO+CQcAAAAJCAAAAAQDAAAAngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZVtdAgAAAAgICQkAAAABAAAAAQAAAAQHAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQoAAAAAAAAAAAAAAAEIAAAABwAAAAkKAAAAAAAAAAAAAAAHCQAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAkLAAAADQMRCgAAAAAAAAAFCwAAAC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUZpbGUJAAAABVZhbHVlCVBsYWluVGV4dBRDb250ZW50UGFyYW1ldGVyRmxhdBZDb250ZW50UGFyYW1ldGVyU2NyaXB0BE5hbWUMUmVsYXRpdmVQYXRoCklkZW50aWZpZXIXRmlsZVN5c3RlbVBhcmFtZXRlckZsYXQZRmlsZVN5c3RlbVBhcmFtZXRlclNjcmlwdAEAAwMBAQEDAwF/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAGDAAAANUBIyBEZXNjcmlwdGlvbg0KDQpUaGlzIGlzIHdoZXJlIHRoZSBmdW5jdGlvbiB0ZXN0cyBnby4NCg0KTWFrZSBzdXJlIHRvIHB1dCB0aGVtIGluIGZvbGRlcnMgcmVmbGVjdGluZyB0aGUgYWN0dWFsIG1vZHVsZSBzdHJ1Y3R1cmUuDQoNCkl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGFuZCBwdWJsaWMgZnVuY3Rpb25zIGhlcmUuAQkNAAAACQ4AAAAGDwAAAAlyZWFkbWUubWQGEAAAABNmdW5jdGlvbnNccmVhZG1lLm1kCQYAAAAJEgAAAAkTAAAAAQ0AAAAHAAAACQoAAAAAAAAAAAAAAAEOAAAABwAAAAkKAAAAAAAAAAAAAAABEgAAAAcAAAAJCgAAAAAAAAAAAAAAARMAAAAHAAAACQoAAAAAAAAAAAAAAAs=</BA>
            </MS>
          </Obj>
          <Obj RefId="14">
            <TNRef RefId="7" />
            <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString>
            <Props>
              <Obj N="Children" RefId="15">
                <TNRef RefId="6" />
                <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="16">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="17">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAAB2dlbmVyYWwGBQAAAAdnZW5lcmFsBgYAAAACw74JBwAAAAkIAAAABAMAAACeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlW10CAAAACAgJCQAAAAgAAAAIAAAABAcAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCgAAAAAAAAAAAAAAAQgAAAAHAAAACQoAAAAAAAAAAAAAAAcJAAAAAAEAAAAIAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACQsAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAACREAAAAJEgAAABEKAAAAAAAAAAULAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYTAAAA+QkjIExpc3Qgb2YgZm9yYmlkZGVuIGNvbW1hbmRzDQokZ2xvYmFsOkJhbm5lZENvbW1hbmRzID0gQCgNCgknV3JpdGUtSG9zdCcNCgknV3JpdGUtVmVyYm9zZScNCgknV3JpdGUtV2FybmluZycNCgknV3JpdGUtRXJyb3InDQoJJ1dyaXRlLU91dHB1dCcNCgknV3JpdGUtSW5mb3JtYXRpb24nDQoJJ1dyaXRlLURlYnVnJw0KCQ0KCSMgVXNlIENJTSBpbnN0ZWFkIHdoZXJlIHBvc3NpYmxlDQoJJ0dldC1XbWlPYmplY3QnDQoJJ0ludm9rZS1XbWlNZXRob2QnDQoJJ1JlZ2lzdGVyLVdtaUV2ZW50Jw0KCSdSZW1vdmUtV21pT2JqZWN0Jw0KCSdTZXQtV21pSW5zdGFuY2UnDQoNCgkjIFVzZSBHZXQtV2luRXZlbnQgaW5zdGVhZA0KCSdHZXQtRXZlbnRMb2cnDQoNCgkjIFVzZXIgUHJlZmVyZW5jZSBzaG91bGQgbm90IGJlIHVzZWQgaW4gYXV0b21hdGlvbg0KCSdDbGVhci1Ib3N0JyAjIENvbnNvbGUgU2NyZWVuIGJlbG9uZ3MgdG8gdGhlIHVzZXINCgknU2V0LUxvY2F0aW9uJyAjIENvbnNvbGUgcGF0aCBiZWxvbmdzIHRvIHRoZSB1c2VyLiBVc2UgJFBTU2NyaXB0Um9vdCBpbnN0ZWFkLg0KDQoJIyBEeW5hbWljIFZhcmlhYmxlcyBhcmUgdW5kZXNpcmFibGUuIFVzZSBoYXNodGFibGUgaW5zdGVhZC4NCgknR2V0LVZhcmlhYmxlJw0KCSdTZXQtVmFyaWFibGUnDQoJJ0NsZWFyLVZhcmlhYmxlJw0KCSdSZW1vdmUtVmFyaWFibGUnDQoJJ05ldy1WYXJpYWJsZScNCg0KCSMgRHluYW1pYyBDb2RlIGV4ZWN1dGlvbiBzaG91bGQgbm90IHJlcXVpcmUgdGhpcw0KCSdJbnZva2UtRXhwcmVzc2lvbicgIyBDb25zaWRlciBzcGxhdHRpbmcgaW5zdGVhZC4gWWVzLCB5b3UgY2FuIHNwbGF0IHBhcmFtZXRlcnMgZm9yIGV4dGVybmFsIGFwcGxpY2F0aW9ucyENCikNCg0KPCMNCglDb250YWlucyBsaXN0IG9mIGV4Y2VwdGlvbnMgZm9yIGJhbm5lZCBjbWRsZXRzLg0KCUluc2VydCB0aGUgZmlsZSBuYW1lcyBvZiBmaWxlcyB0aGF0IG1heSBjb250YWluIHRoZW0uDQoJDQoJRXhhbXBsZToNCgkiV3JpdGUtSG9zdCIgID0gQCgnV3JpdGUtUFNGSG9zdENvbG9yLnBzMScsJ1dyaXRlLVBTRk1lc3NhZ2UucHMxJykNCiM+DQokZ2xvYmFsOk1heUNvbnRhaW5Db21tYW5kID0gQHsNCgkiV3JpdGUtSG9zdCIgID0gQCgpDQoJIldyaXRlLVZlcmJvc2UiID0gQCgpDQoJIldyaXRlLVdhcm5pbmciID0gQCgpDQoJIldyaXRlLUVycm9yIiAgPSBAKCkNCgkiV3JpdGUtT3V0cHV0IiA9IEAoKQ0KCSJXcml0ZS1JbmZvcm1hdGlvbiIgPSBAKCkNCgkiV3JpdGUtRGVidWciID0gQCgpDQp9AQkUAAAACRUAAAAGFgAAABxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxBhcAAAAkZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxCQYAAAAJGQAAAAkaAAAAAQwAAAALAAAABhsAAADgGCRtb2R1bGVSb290ID0gKFJlc29sdmUtUGF0aCAiJGdsb2JhbDp0ZXN0cm9vdFwuLiIpLlBhdGgNCg0KLiAiJGdsb2JhbDp0ZXN0cm9vdFxnZW5lcmFsXEZpbGVJbnRlZ3JpdHkuRXhjZXB0aW9ucy5wczEiDQoNCkRlc2NyaWJlICJWZXJpZnlpbmcgaW50ZWdyaXR5IG9mIG1vZHVsZSBmaWxlcyIgew0KCUJlZm9yZUFsbCB7DQoJCWZ1bmN0aW9uIEdldC1GaWxlRW5jb2RpbmcNCgkJew0KCQk8Iw0KCQkJLlNZTk9QU0lTDQoJCQkJVGVzdHMgYSBmaWxlIGZvciBlbmNvZGluZy4NCgkJCQ0KCQkJLkRFU0NSSVBUSU9ODQoJCQkJVGVzdHMgYSBmaWxlIGZvciBlbmNvZGluZy4NCgkJCQ0KCQkJLlBBUkFNRVRFUiBQYXRoDQoJCQkJVGhlIGZpbGUgdG8gdGVzdA0KCQkjPg0KCQkJW0NtZGxldEJpbmRpbmcoKV0NCgkJCVBhcmFtICgNCgkJCQlbUGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRUcnVlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJFRydWUpXQ0KCQkJCVtBbGlhcygnRnVsbE5hbWUnKV0NCgkJCQlbc3RyaW5nXQ0KCQkJCSRQYXRoDQoJCQkpDQoJCQkNCgkJCWlmICgkUFNWZXJzaW9uVGFibGUuUFNWZXJzaW9uLk1ham9yIC1sdCA2KQ0KCQkJew0KCQkJCVtieXRlW11dJGJ5dGUgPSBnZXQtY29udGVudCAtRW5jb2RpbmcgYnl0ZSAtUmVhZENvdW50IDQgLVRvdGFsQ291bnQgNCAtUGF0aCAkUGF0aA0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCVtieXRlW11dJGJ5dGUgPSBHZXQtQ29udGVudCAtQXNCeXRlU3RyZWFtIC1SZWFkQ291bnQgNCAtVG90YWxDb3VudCA0IC1QYXRoICRQYXRoDQoJCQl9DQoJCQkNCgkJCWlmICgkYnl0ZVswXSAtZXEgMHhlZiAtYW5kICRieXRlWzFdIC1lcSAweGJiIC1hbmQgJGJ5dGVbMl0gLWVxIDB4YmYpIHsgJ1VURjggQk9NJyB9DQoJCQllbHNlaWYgKCRieXRlWzBdIC1lcSAweGZlIC1hbmQgJGJ5dGVbMV0gLWVxIDB4ZmYpIHsgJ1VuaWNvZGUnIH0NCgkJCWVsc2VpZiAoJGJ5dGVbMF0gLWVxIDAgLWFuZCAkYnl0ZVsxXSAtZXEgMCAtYW5kICRieXRlWzJdIC1lcSAweGZlIC1hbmQgJGJ5dGVbM10gLWVxIDB4ZmYpIHsgJ1VURjMyJyB9DQoJCQllbHNlaWYgKCRieXRlWzBdIC1lcSAweDJiIC1hbmQgJGJ5dGVbMV0gLWVxIDB4MmYgLWFuZCAkYnl0ZVsyXSAtZXEgMHg3NikgeyAnVVRGNycgfQ0KCQkJZWxzZSB7ICdVbmtub3duJyB9DQoJCX0NCgl9DQoNCglDb250ZXh0ICJWYWxpZGF0aW5nIFBTMSBTY3JpcHQgZmlsZXMiIHsNCgkJJGFsbEZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkbW9kdWxlUm9vdCAtUmVjdXJzZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLnBzMSIgfCBXaGVyZS1PYmplY3QgRnVsbE5hbWUgLU5vdExpa2UgIiRtb2R1bGVSb290XHRlc3RzXCoiDQoJCQ0KCQlmb3JlYWNoICgkZmlsZSBpbiAkYWxsRmlsZXMpDQoJCXsNCgkJCSRuYW1lID0gJGZpbGUuRnVsbE5hbWUuUmVwbGFjZSgiJG1vZHVsZVJvb3RcIiwgJycpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIFVURjggZW5jb2Rpbmcgd2l0aCBCeXRlIE9yZGVyIE1hcmsiIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCUdldC1GaWxlRW5jb2RpbmcgLVBhdGggJGZpbGUuRnVsbE5hbWUgfCBTaG91bGQgLUJlICdVVEY4IEJPTScNCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UiIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCSgkZmlsZSB8IFNlbGVjdC1TdHJpbmcgIlxzJCIgfCBXaGVyZS1PYmplY3QgeyAkXy5MaW5lLlRyaW0oKS5MZW5ndGggLWd0IDB9KS5MaW5lTnVtYmVyIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQl9DQoJCQkNCgkJCSR0b2tlbnMgPSAkbnVsbA0KCQkJJHBhcnNlRXJyb3JzID0gJG51bGwNCgkJCSRhc3QgPSBbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5MYW5ndWFnZS5QYXJzZXJdOjpQYXJzZUZpbGUoJGZpbGUuRnVsbE5hbWUsIFtyZWZdJHRva2VucywgW3JlZl0kcGFyc2VFcnJvcnMpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHN5bnRheCBlcnJvcnMiIC1UZXN0Q2FzZXMgQHsgcGFyc2VFcnJvcnMgPSAkcGFyc2VFcnJvcnMgfSB7DQoJCQkJJHBhcnNlRXJyb3JzIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQl9DQoJCQkNCgkJCWZvcmVhY2ggKCRjb21tYW5kIGluICRnbG9iYWw6QmFubmVkQ29tbWFuZHMpDQoJCQl7DQoJCQkJaWYgKCRnbG9iYWw6TWF5Q29udGFpbkNvbW1hbmRbIiRjb21tYW5kIl0gLW5vdGNvbnRhaW5zICRmaWxlLk5hbWUpDQoJCQkJew0KCQkJCQlJdCAiWyRuYW1lXSBTaG91bGQgbm90IHVzZSAkY29tbWFuZCIgLVRlc3RDYXNlcyBAeyB0b2tlbnMgPSAkdG9rZW5zOyBjb21tYW5kID0gJGNvbW1hbmQgfSB7DQoJCQkJCQkkdG9rZW5zIHwgV2hlcmUtT2JqZWN0IFRleHQgLUVRICRjb21tYW5kIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJDQoJQ29udGV4dCAiVmFsaWRhdGluZyBoZWxwLnR4dCBoZWxwIGZpbGVzIiB7DQoJCSRhbGxGaWxlcyA9IEdldC1DaGlsZEl0ZW0gLVBhdGggJG1vZHVsZVJvb3QgLVJlY3Vyc2UgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5oZWxwLnR4dCIgfCBXaGVyZS1PYmplY3QgRnVsbE5hbWUgLU5vdExpa2UgIiRtb2R1bGVSb290XHRlc3RzXCoiDQoJCQ0KCQlmb3JlYWNoICgkZmlsZSBpbiAkYWxsRmlsZXMpDQoJCXsNCgkJCSRuYW1lID0gJGZpbGUuRnVsbE5hbWUuUmVwbGFjZSgiJG1vZHVsZVJvb3RcIiwgJycpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIFVURjggZW5jb2RpbmciIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCUdldC1GaWxlRW5jb2RpbmcgLVBhdGggJGZpbGUuRnVsbE5hbWUgfCBTaG91bGQgLUJlICdVVEY4IEJPTScNCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UiIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCSgkZmlsZSB8IFNlbGVjdC1TdHJpbmcgIlxzJCIgfCBXaGVyZS1PYmplY3QgeyAkXy5MaW5lLlRyaW0oKS5MZW5ndGggLWd0IDAgfSB8IE1lYXN1cmUtT2JqZWN0KS5Db3VudCB8IFNob3VsZCAtQmUgMA0KCQkJfQ0KCQl9DQoJfQ0KfQEJHAAAAAkdAAAABh4AAAAXRmlsZUludGVncml0eS5UZXN0cy5wczEGHwAAAB9nZW5lcmFsXEZpbGVJbnRlZ3JpdHkuVGVzdHMucHMxCQYAAAAJIQAAAAkiAAAAAQ0AAAALAAAABiMAAACdBSMgTGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaWdub3JlZA0KJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucyA9IEAoDQogICAgDQopDQoNCjwjDQogIExpc3Qgb2YgYXJyYXllZCBlbnVtZXJhdGlvbnMuIFRoZXNlIG5lZWQgdG8gYmUgdHJlYXRlZCBkaWZmZXJlbnRseS4gQWRkIGZ1bGwgbmFtZS4NCiAgRXhhbXBsZToNCg0KICAiU3FsY29sbGFib3JhdGl2ZS5EYmF0b29scy5Db25uZWN0aW9uLk1hbmFnZW1lbnRDb25uZWN0aW9uVHlwZVtdIg0KIz4NCiRnbG9iYWw6SGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzID0gQCgNCgkNCikNCg0KPCMNCiAgU29tZSB0eXBlcyBvbiBwYXJhbWV0ZXJzIGp1c3QgZmFpbCB0aGVpciB2YWxpZGF0aW9uIG5vIG1hdHRlciB3aGF0Lg0KICBGb3IgdGhvc2UgaXQgYmVjb21lcyBwb3NzaWJsZSB0byBza2lwIHRoZW0sIGJ5IGFkZGluZyB0aGVtIHRvIHRoaXMgaGFzaHRhYmxlLg0KICBBZGQgYnkgZm9sbG93aW5nIHRoaXMgY29udmVudGlvbjogPGNvbW1hbmQgbmFtZT4gPSBAKDxsaXN0IG9mIHBhcmFtZXRlciBuYW1lcz4pDQogIEV4YW1wbGU6DQoNCiAgIkdldC1EYmFDbU9iamVjdCIgICAgICAgPSBAKCJEb05vdFVzZSIpDQojPg0KJGdsb2JhbDpIZWxwVGVzdFNraXBQYXJhbWV0ZXJUeXBlID0gQHsNCiAgICANCn0NCgEJJAAAAAklAAAABiYAAAATSGVscC5FeGNlcHRpb25zLnBzMQYnAAAAG2dlbmVyYWxcSGVscC5FeGNlcHRpb25zLnBzMQkGAAAACSkAAAAJKgAAAAEOAAAACwAAAAYrAAAA4DQ8Iw0KICAgIC5OT1RFUw0KICAgICAgICBUaGUgb3JpZ2luYWwgdGVzdCB0aGlzIGlzIGJhc2VkIHVwb24gd2FzIHdyaXR0ZW4gYnkgSnVuZSBCbGVuZGVyLg0KCQlBZnRlciBzZXZlcmFsIHJvdW5kcyBvZiBtb2RpZmljYXRpb25zIGl0IHN0YW5kcyBub3cgYXMgaXQgaXMsIGJ1dCB0aGUgaG9ub3IgcmVtYWlucyBoZXJzLg0KDQoJCVRoYW5rIHlvdSBKdW5lLCBmb3IgYWxsIHlvdSBoYXZlIGRvbmUhDQoNCiAgICAuREVTQ1JJUFRJT04NCgkJVGhpcyB0ZXN0IGV2YWx1YXRlcyB0aGUgaGVscCBmb3IgYWxsIGNvbW1hbmRzIGluIGEgbW9kdWxlLg0KDQoJLlBBUkFNRVRFUiBTa2lwVGVzdA0KCQlEaXNhYmxlcyB0aGlzIHRlc3QuDQoJDQoJLlBBUkFNRVRFUiBDb21tYW5kUGF0aA0KCQlMaXN0IG9mIHBhdGhzIHVuZGVyIHdoaWNoIHRoZSBzY3JpcHQgZmlsZXMgYXJlIHN0b3JlZC4NCgkJVGhpcyB0ZXN0IGFzc3VtZXMgdGhhdCBhbGwgZnVuY3Rpb25zIGhhdmUgdGhlaXIgb3duIGZpbGUgdGhhdCBpcyBuYW1lZCBhZnRlciB0aGVtc2VsdmVzLg0KCQlUaGVzZSBwYXRocyBhcmUgdXNlZCB0byBzZWFyY2ggZm9yIGNvbW1hbmRzIHRoYXQgc2hvdWxkIGV4aXN0IGFuZCBiZSB0ZXN0ZWQuDQoJCVdpbGwgc2VhcmNoIHJlY3Vyc2l2ZWx5IGFuZCBhY2NlcHRzIHdpbGRjYXJkcywgbWFrZSBzdXJlIG9ubHkgZnVuY3Rpb25zIGFyZSBmb3VuZA0KDQoJLlBBUkFNRVRFUiBNb2R1bGVOYW1lDQoJCU5hbWUgb2YgdGhlIG1vZHVsZSB0byBiZSB0ZXN0ZWQuDQoJCVRoZSBtb2R1bGUgbXVzdCBhbHJlYWR5IGJlIGltcG9ydGVkDQoNCgkuUEFSQU1FVEVSIEV4Y2VwdGlvbnNGaWxlDQoJCUZpbGUgaW4gd2hpY2ggZXhjZXB0aW9ucyBhbmQgYWRqdXN0bWVudHMgYXJlIGNvbmZpZ3VyZWQuDQoJCUluIGl0IHRoZXJlIHNob3VsZCBiZSB0d28gYXJyYXlzIGFuZCBhIGhhc2h0YWJsZSBkZWZpbmVkOg0KCQkJJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucw0KCQkJJGdsb2JhbDpIZWxwVGVzdEVudW1lcmF0ZWRBcnJheXMNCgkJCSRnbG9iYWw6SGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZQ0KCQlUaGVzZSBjYW4gYmUgdXNlZCB0byB0d2VhayB0aGUgdGVzdHMgc2xpZ2h0bHkgaW4gY2FzZXMgb2YgbmVlZC4NCgkJU2VlIHRoZSBleGFtcGxlIGZpbGUgZm9yIGV4cGxhbmF0aW9ucyBvbiBlYWNoIG9mIHRoZXNlIHVzYWdlIGFuZCBlZmZlY3QuDQojPg0KW0NtZGxldEJpbmRpbmcoKV0NClBhcmFtICgNCglbc3dpdGNoXQ0KCSRTa2lwVGVzdCwNCgkNCglbc3RyaW5nW11dDQoJJENvbW1hbmRQYXRoID0gQCgiJGdsb2JhbDp0ZXN0cm9vdFwuLlxmdW5jdGlvbnMiLCAiJGdsb2JhbDp0ZXN0cm9vdFwuLlxpbnRlcm5hbFxmdW5jdGlvbnMiKSwNCgkNCglbc3RyaW5nXQ0KCSRNb2R1bGVOYW1lID0gIsO+bmFtZcO+IiwNCgkNCglbc3RyaW5nXQ0KCSRFeGNlcHRpb25zRmlsZSA9ICIkZ2xvYmFsOnRlc3Ryb290XGdlbmVyYWxcSGVscC5FeGNlcHRpb25zLnBzMSINCikNCmlmICgkU2tpcFRlc3QpIHsgcmV0dXJuIH0NCi4gJEV4Y2VwdGlvbnNGaWxlDQoNCiRpbmNsdWRlZE5hbWVzID0gKEdldC1DaGlsZEl0ZW0gJENvbW1hbmRQYXRoIC1SZWN1cnNlIC1GaWxlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIioucHMxIikuQmFzZU5hbWUNCiRjb21tYW5kVHlwZXMgPSBAKCdDbWRsZXQnLCAnRnVuY3Rpb24nKQ0KaWYgKCRQU1ZlcnNpb25UYWJsZS5QU0VkaXRpb24gLWVxICdEZXNrdG9wJyApIHsgJGNvbW1hbmRUeXBlcyArPSAnV29ya2Zsb3cnIH0NCiRjb21tYW5kcyA9IEdldC1Db21tYW5kIC1Nb2R1bGUgKEdldC1Nb2R1bGUgJE1vZHVsZU5hbWUpIC1Db21tYW5kVHlwZSAkY29tbWFuZFR5cGVzIHwgV2hlcmUtT2JqZWN0IE5hbWUgLUluICRpbmNsdWRlZE5hbWVzDQoNCiMjIFdoZW4gdGVzdGluZyBoZWxwLCByZW1lbWJlciB0aGF0IGhlbHAgaXMgY2FjaGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzZXNzaW9uLg0KIyMgVG8gdGVzdCwgcmVzdGFydCBzZXNzaW9uLg0KDQoNCmZvcmVhY2ggKCRjb21tYW5kIGluICRjb21tYW5kcykgew0KICAgICRjb21tYW5kTmFtZSA9ICRjb21tYW5kLk5hbWUNCiAgICANCiAgICAjIFNraXAgYWxsIGZ1bmN0aW9ucyB0aGF0IGFyZSBvbiB0aGUgZXhjbHVzaW9ucyBsaXN0DQogICAgaWYgKCRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMgLWNvbnRhaW5zICRjb21tYW5kTmFtZSkgeyBjb250aW51ZSB9DQogICAgDQogICAgIyBUaGUgbW9kdWxlLXF1YWxpZmllZCBjb21tYW5kIGZhaWxzIG9uIE1pY3Jvc29mdC5Qb3dlclNoZWxsLkFyY2hpdmUgY21kbGV0cw0KICAgICRIZWxwID0gR2V0LUhlbHAgJGNvbW1hbmROYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlDQoJDQoJRGVzY3JpYmUgIlRlc3QgaGVscCBmb3IgJGNvbW1hbmROYW1lIiB7DQogICAgICAgIA0KCQkjIElmIGhlbHAgaXMgbm90IGZvdW5kLCBzeW5vcHNpcyBpbiBhdXRvLWdlbmVyYXRlZCBoZWxwIGlzIHRoZSBzeW50YXggZGlhZ3JhbQ0KCQlJdCAic2hvdWxkIG5vdCBiZSBhdXRvLWdlbmVyYXRlZCIgLVRlc3RDYXNlcyBAeyBIZWxwID0gJEhlbHAgfSB7DQoJCQkkSGVscC5TeW5vcHNpcyB8IFNob3VsZCAtTm90IC1CZUxpa2UgJypgW2A8Q29tbW9uUGFyYW1ldGVyc2A+YF0qJw0KCQl9DQogICAgICAgIA0KCQkjIFNob3VsZCBiZSBhIGRlc2NyaXB0aW9uIGZvciBldmVyeSBmdW5jdGlvbg0KCQlJdCAiZ2V0cyBkZXNjcmlwdGlvbiBmb3IgJGNvbW1hbmROYW1lIiAtVGVzdENhc2VzIEB7IEhlbHAgPSAkSGVscCB9IHsNCgkJCSRIZWxwLkRlc2NyaXB0aW9uIHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KICAgICAgICANCgkJIyBTaG91bGQgYmUgYXQgbGVhc3Qgb25lIGV4YW1wbGUNCgkJSXQgImdldHMgZXhhbXBsZSBjb2RlIGZyb20gJGNvbW1hbmROYW1lIiAtVGVzdENhc2VzIEB7IEhlbHAgPSAkSGVscCB9IHsNCgkJCSgkSGVscC5FeGFtcGxlcy5FeGFtcGxlIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuQ29kZSB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQoJCX0NCgkNCgkJIyBTaG91bGQgYmUgYXQgbGVhc3Qgb25lIGV4YW1wbGUgZGVzY3JpcHRpb24NCgkJSXQgImdldHMgZXhhbXBsZSBoZWxwIGZyb20gJGNvbW1hbmROYW1lIiAtVGVzdENhc2VzIEB7IEhlbHAgPSAkSGVscCB9IHsNCgkJCSgkSGVscC5FeGFtcGxlcy5FeGFtcGxlLlJlbWFya3MgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKS5UZXh0IHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KICAgICAgICANCiAgICAgICAgQ29udGV4dCAiVGVzdCBwYXJhbWV0ZXIgaGVscCBmb3IgJGNvbW1hbmROYW1lIiB7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRjb21tb24gPSAnRGVidWcnLCAnRXJyb3JBY3Rpb24nLCAnRXJyb3JWYXJpYWJsZScsICdJbmZvcm1hdGlvbkFjdGlvbicsICdJbmZvcm1hdGlvblZhcmlhYmxlJywgJ091dEJ1ZmZlcicsICdPdXRWYXJpYWJsZScsICdQaXBlbGluZVZhcmlhYmxlJywgJ1ZlcmJvc2UnLCAnV2FybmluZ0FjdGlvbicsICdXYXJuaW5nVmFyaWFibGUnLCAnUHJvZ3Jlc3NBY3Rpb24nDQogICAgICAgICAgICANCiAgICAgICAgICAgICRwYXJhbWV0ZXJzID0gJGNvbW1hbmQuUGFyYW1ldGVyU2V0cy5QYXJhbWV0ZXJzIHwgU29ydC1PYmplY3QgLVByb3BlcnR5IE5hbWUgLVVuaXF1ZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1ub3RpbiAkY29tbW9uDQogICAgICAgICAgICAkcGFyYW1ldGVyTmFtZXMgPSAkcGFyYW1ldGVycy5OYW1lDQogICAgICAgICAgICAkSGVscFBhcmFtZXRlck5hbWVzID0gJEhlbHAuUGFyYW1ldGVycy5QYXJhbWV0ZXIuTmFtZSB8IFNvcnQtT2JqZWN0IC1VbmlxdWUNCiAgICAgICAgICAgIGZvcmVhY2ggKCRwYXJhbWV0ZXIgaW4gJHBhcmFtZXRlcnMpIHsNCiAgICAgICAgICAgICAgICAkcGFyYW1ldGVyTmFtZSA9ICRwYXJhbWV0ZXIuTmFtZQ0KICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJIZWxwID0gJEhlbHAucGFyYW1ldGVycy5wYXJhbWV0ZXIgfCBXaGVyZS1PYmplY3QgTmFtZSAtRVEgJHBhcmFtZXRlck5hbWUNCgkJCQ0KCQkJCSMgU2hvdWxkIGJlIGEgZGVzY3JpcHRpb24gZm9yIGV2ZXJ5IHBhcmFtZXRlcg0KCQkJCUl0ICJnZXRzIGhlbHAgZm9yIHBhcmFtZXRlcjogJHBhcmFtZXRlck5hbWUgOiBpbiAkY29tbWFuZE5hbWUiIC1UZXN0Q2FzZXMgQHsgcGFyYW1ldGVySGVscCA9ICRwYXJhbWV0ZXJIZWxwIH0gew0KCQkJCQkkcGFyYW1ldGVySGVscC5EZXNjcmlwdGlvbi5UZXh0IHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJCQl9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJGNvZGVNYW5kYXRvcnkgPSAkcGFyYW1ldGVyLklzTWFuZGF0b3J5LnRvU3RyaW5nKCkNCgkJCQlJdCAiaGVscCBmb3IgJHBhcmFtZXRlck5hbWUgcGFyYW1ldGVyIGluICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBNYW5kYXRvcnkgdmFsdWUiIC1UZXN0Q2FzZXMgQHsgcGFyYW1ldGVySGVscCA9ICRwYXJhbWV0ZXJIZWxwOyBjb2RlTWFuZGF0b3J5ID0gJGNvZGVNYW5kYXRvcnkgfSB7DQoJCQkJCSRwYXJhbWV0ZXJIZWxwLlJlcXVpcmVkIHwgU2hvdWxkIC1CZSAkY29kZU1hbmRhdG9yeQ0KCQkJCX0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoJEhlbHBUZXN0U2tpcFBhcmFtZXRlclR5cGVbJGNvbW1hbmROYW1lXSAtY29udGFpbnMgJHBhcmFtZXRlck5hbWUpIHsgY29udGludWUgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICRjb2RlVHlwZSA9ICRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5OYW1lDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5Jc0VudW0pIHsNCiAgICAgICAgICAgICAgICAgICAgIyBFbnVtZXJhdGlvbnMgb2Z0ZW4gaGF2ZSBpc3N1ZXMgd2l0aCB0aGUgdHlwZW5hbWUgbm90IGJlaW5nIHJlbGlhYmx5IGF2YWlsYWJsZQ0KICAgICAgICAgICAgICAgICAgICAkbmFtZXMgPSAkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGU6OkdldE5hbWVzKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZSkNCgkJCQkJCSMgUGFyYW1ldGVyIHR5cGUgaW4gSGVscCBzaG91bGQgbWF0Y2ggY29kZQ0KCQkJCQlJdCAiaGVscCBmb3IgJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IHBhcmFtZXRlciB0eXBlIGZvciAkcGFyYW1ldGVyTmFtZSIgLVRlc3RDYXNlcyBAeyBwYXJhbWV0ZXJIZWxwID0gJHBhcmFtZXRlckhlbHA7IG5hbWVzID0gJG5hbWVzIH0gew0KCQkJCQkJJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWVHcm91cC5wYXJhbWV0ZXJWYWx1ZSB8IFNob3VsZCAtYmUgJG5hbWVzDQoJCQkJCX0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZWlmICgkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUgLWluICRIZWxwVGVzdEVudW1lcmF0ZWRBcnJheXMpIHsNCiAgICAgICAgICAgICAgICAgICAgIyBFbnVtZXJhdGlvbnMgb2Z0ZW4gaGF2ZSBpc3N1ZXMgd2l0aCB0aGUgdHlwZW5hbWUgbm90IGJlaW5nIHJlbGlhYmx5IGF2YWlsYWJsZQ0KICAgICAgICAgICAgICAgICAgICAkbmFtZXMgPSBbRW51bV06OkdldE5hbWVzKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5EZWNsYXJlZE1lbWJlcnNbMF0uUmV0dXJuVHlwZSkNCgkJCQkJSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIC1UZXN0Q2FzZXMgQHsgcGFyYW1ldGVySGVscCA9ICRwYXJhbWV0ZXJIZWxwOyBuYW1lcyA9ICRuYW1lcyB9IHsNCgkJCQkJCSRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlR3JvdXAucGFyYW1ldGVyVmFsdWUgfCBTaG91bGQgLWJlICRuYW1lcw0KCQkJCQl9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAjIFRvIGF2b2lkIGNhbGxpbmcgVHJpbSBtZXRob2Qgb24gYSBudWxsIG9iamVjdC4NCiAgICAgICAgICAgICAgICAgICAgJGhlbHBUeXBlID0gaWYgKCRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlKSB7ICRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlLlRyaW0oKSB9DQoJCQkJCSMgUGFyYW1ldGVyIHR5cGUgaW4gSGVscCBzaG91bGQgbWF0Y2ggY29kZQ0KCQkJCQlJdCAiaGVscCBmb3IgJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IHBhcmFtZXRlciB0eXBlIGZvciAkcGFyYW1ldGVyTmFtZSIgLVRlc3RDYXNlcyBAeyBoZWxwVHlwZSA9ICRoZWxwVHlwZTsgY29kZVR5cGUgPSAkY29kZVR5cGUgfSB7DQoJCQkJCQkkaGVscFR5cGUgfCBTaG91bGQgLWJlICRjb2RlVHlwZQ0KCQkJCQl9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yZWFjaCAoJGhlbHBQYXJtIGluICRIZWxwUGFyYW1ldGVyTmFtZXMpIHsNCgkJCQkjIFNob3VsZG4ndCBmaW5kIGV4dHJhIHBhcmFtZXRlcnMgaW4gaGVscC4NCgkJCQlJdCAiZmluZHMgaGVscCBwYXJhbWV0ZXIgaW4gY29kZTogJGhlbHBQYXJtIiAtVGVzdENhc2VzIEB7IGhlbHBQYXJtID0gJGhlbHBQYXJtOyBwYXJhbWV0ZXJOYW1lcyA9ICRwYXJhbWV0ZXJOYW1lcyB9IHsNCgkJCQkJJGhlbHBQYXJtIC1pbiAkcGFyYW1ldGVyTmFtZXMgfCBTaG91bGQgLUJlICR0cnVlDQoJCQkJfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQEJLAAAAAktAAAABi4AAAAOSGVscC5UZXN0cy5wczEGLwAAABZnZW5lcmFsXEhlbHAuVGVzdHMucHMxCQYAAAAJMQAAAAkyAAAAAQ8AAAALAAAABjMAAADLFURlc2NyaWJlICJWYWxpZGF0aW5nIHRoZSBtb2R1bGUgbWFuaWZlc3QiIHsNCgkkbW9kdWxlUm9vdCA9IChSZXNvbHZlLVBhdGggIiRnbG9iYWw6dGVzdHJvb3RcLi4iKS5QYXRoDQoJJG1hbmlmZXN0ID0gKChHZXQtQ29udGVudCAiJG1vZHVsZVJvb3Rcw75uYW1lw74ucHNkMSIpIC1qb2luICJgbiIpIHwgSW52b2tlLUV4cHJlc3Npb24NCglDb250ZXh0ICJCYXNpYyByZXNvdXJjZXMgdmFsaWRhdGlvbiIgew0KCQkkZmlsZXMgPSBHZXQtQ2hpbGRJdGVtICIkbW9kdWxlUm9vdFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIioucHMxIg0KCQlJdCAiRXhwb3J0cyBhbGwgZnVuY3Rpb25zIGluIHRoZSBwdWJsaWMgZm9sZGVyIiAtVGVzdENhc2VzIEB7IGZpbGVzID0gJGZpbGVzOyBtYW5pZmVzdCA9ICRtYW5pZmVzdCB9IHsNCgkJCQ0KCQkJJGZ1bmN0aW9ucyA9IChDb21wYXJlLU9iamVjdCAtUmVmZXJlbmNlT2JqZWN0ICRmaWxlcy5CYXNlTmFtZSAtRGlmZmVyZW5jZU9iamVjdCAkbWFuaWZlc3QuRnVuY3Rpb25zVG9FeHBvcnQgfCBXaGVyZS1PYmplY3QgU2lkZUluZGljYXRvciAtTGlrZSAnPD0nKS5JbnB1dE9iamVjdA0KCQkJJGZ1bmN0aW9ucyB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQoJCUl0ICJFeHBvcnRzIG5vIGZ1bmN0aW9uIHRoYXQgaXNuJ3QgYWxzbyBwcmVzZW50IGluIHRoZSBwdWJsaWMgZm9sZGVyIiAtVGVzdENhc2VzIEB7IGZpbGVzID0gJGZpbGVzOyBtYW5pZmVzdCA9ICRtYW5pZmVzdCB9IHsNCgkJCSRmdW5jdGlvbnMgPSAoQ29tcGFyZS1PYmplY3QgLVJlZmVyZW5jZU9iamVjdCAkZmlsZXMuQmFzZU5hbWUgLURpZmZlcmVuY2VPYmplY3QgJG1hbmlmZXN0LkZ1bmN0aW9uc1RvRXhwb3J0IHwgV2hlcmUtT2JqZWN0IFNpZGVJbmRpY2F0b3IgLUxpa2UgJz0+JykuSW5wdXRPYmplY3QNCgkJCSRmdW5jdGlvbnMgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCQkNCgkJSXQgIkV4cG9ydHMgbm9uZSBvZiBpdHMgaW50ZXJuYWwgZnVuY3Rpb25zIiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgbWFuaWZlc3QgPSAkbWFuaWZlc3QgfSB7DQoJCQkkZmlsZXMgPSBHZXQtQ2hpbGRJdGVtICIkbW9kdWxlUm9vdFxpbnRlcm5hbFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIC1GaWx0ZXIgIioucHMxIg0KCQkJJGZpbGVzIHwgV2hlcmUtT2JqZWN0IEJhc2VOYW1lIC1JbiAkbWFuaWZlc3QuRnVuY3Rpb25zVG9FeHBvcnQgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCX0NCgkNCglDb250ZXh0ICJJbmRpdmlkdWFsIGZpbGUgdmFsaWRhdGlvbiIgew0KCQlJdCAiVGhlIHJvb3QgbW9kdWxlIGZpbGUgZXhpc3RzIiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgbWFuaWZlc3QgPSAkbWFuaWZlc3QgfSB7DQoJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCQoJG1hbmlmZXN0LlJvb3RNb2R1bGUpIiB8IFNob3VsZCAtQmUgJHRydWUNCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJGZvcm1hdCBpbiAkbWFuaWZlc3QuRm9ybWF0c1RvUHJvY2VzcykNCgkJew0KCQkJSXQgIlRoZSBmaWxlICRmb3JtYXQgc2hvdWxkIGV4aXN0IiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgZm9ybWF0ID0gJGZvcm1hdCB9IHsNCgkJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCRmb3JtYXQiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQkJfQ0KCQl9DQoJCQ0KCQlmb3JlYWNoICgkdHlwZSBpbiAkbWFuaWZlc3QuVHlwZXNUb1Byb2Nlc3MpDQoJCXsNCgkJCUl0ICJUaGUgZmlsZSAkdHlwZSBzaG91bGQgZXhpc3QiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyB0eXBlID0gJHR5cGUgfSB7DQoJCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkdHlwZSIgfCBTaG91bGQgLUJlICR0cnVlDQoJCQl9DQoJCX0NCgkJDQoJCWZvcmVhY2ggKCRhc3NlbWJseSBpbiAkbWFuaWZlc3QuUmVxdWlyZWRBc3NlbWJsaWVzKQ0KCQl7DQogICAgICAgICAgICBpZiAoJGFzc2VtYmx5IC1saWtlICIqLmRsbCIpIHsNCiAgICAgICAgICAgICAgICBJdCAiVGhlIGZpbGUgJGFzc2VtYmx5IHNob3VsZCBleGlzdCIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IGFzc2VtYmx5ID0gJGFzc2VtYmx5IH0gew0KICAgICAgICAgICAgICAgICAgICBUZXN0LVBhdGggIiRtb2R1bGVSb290XCRhc3NlbWJseSIgfCBTaG91bGQgLUJlICR0cnVlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgSXQgIlRoZSBmaWxlICRhc3NlbWJseSBzaG91bGQgbG9hZCBmcm9tIHRoZSBHQUMiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyBhc3NlbWJseSA9ICRhc3NlbWJseSB9IHsNCiAgICAgICAgICAgICAgICAgICAgeyBBZGQtVHlwZSAtQXNzZW1ibHlOYW1lICRhc3NlbWJseSB9IHwgU2hvdWxkIC1Ob3QgLVRocm93DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoJCQ0KCQlmb3JlYWNoICgkdGFnIGluICRtYW5pZmVzdC5Qcml2YXRlRGF0YS5QU0RhdGEuVGFncykNCgkJew0KCQkJSXQgIlRhZ3Mgc2hvdWxkIGhhdmUgbm8gc3BhY2VzIGluIG5hbWUiIC1UZXN0Q2FzZXMgQHsgdGFnID0gJHRhZyB9IHsNCgkJCQkkdGFnIC1tYXRjaCAiICIgfCBTaG91bGQgLUJlICRmYWxzZQ0KCQkJfQ0KCQl9DQoJfQ0KfQEJNAAAAAk1AAAABjYAAAASTWFuaWZlc3QuVGVzdHMucHMxBjcAAAAaZ2VuZXJhbFxNYW5pZmVzdC5UZXN0cy5wczEJBgAAAAk5AAAACToAAAABEAAAAAsAAAAGOwAAANMMW0NtZGxldEJpbmRpbmcoKV0NClBhcmFtICgNCglbc3dpdGNoXQ0KCSRTa2lwVGVzdCwNCg0KCVtzdHJpbmdbXV0NCgkkQ29tbWFuZFBhdGggPSBAKCIkZ2xvYmFsOnRlc3Ryb290XC4uXGZ1bmN0aW9ucyIsICIkZ2xvYmFsOnRlc3Ryb290XC4uXGludGVybmFsXGZ1bmN0aW9ucyIpDQopDQoNCkJlZm9yZURpc2NvdmVyeSB7DQoJaWYgKCRTa2lwVGVzdCkgeyByZXR1cm4gfQ0KDQoJJGdsb2JhbDpfX3Blc3Rlcl9kYXRhLlNjcmlwdEFuYWx5emVyID0gTmV3LU9iamVjdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0DQoNCgkjIENyZWF0ZSBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwYXRoIGFuZCBiYXNlbmFtZSBvZiBhbGwgZmlsZXMgdG8gdGVzdA0KCSRjb21tYW5kRmlsZXMgPSAkQ29tbWFuZFBhdGggfCBGb3JFYWNoLU9iamVjdCB7DQoJCUdldC1DaGlsZEl0ZW0gLVBhdGggJF8gLVJlY3Vyc2UgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiDQoJfSB8IEZvckVhY2gtT2JqZWN0IHsNCgkJQHsNCgkJCUJhc2VOYW1lID0gJF8uQmFzZU5hbWUNCgkJCUZ1bGxOYW1lID0gJF8uRnVsbE5hbWUNCgkJfQ0KCX0NCg0KCSMgQ3JlYXRlIGFuIGFycmF5IGNvbnRhaW4gYWxsIHJ1bGVzDQoJJHNjcmlwdEFuYWx5emVyUnVsZXMgPSBHZXQtU2NyaXB0QW5hbHl6ZXJSdWxlIHwgRm9yRWFjaC1PYmplY3Qgew0KCQlAew0KCQkJUnVsZU5hbWUgPSAkXy5SdWxlTmFtZQ0KCQl9DQoJfQ0KfQ0KDQpEZXNjcmliZSAnSW52b2tpbmcgUFNTY3JpcHRBbmFseXplciBhZ2FpbnN0IGNvbW1hbmRiYXNlJyB7DQoNCglDb250ZXh0ICJBbmFseXppbmcgPEJhc2VOYW1lPiIgLUZvckVhY2ggJGNvbW1hbmRGaWxlcyB7DQoJCUJlZm9yZUFsbCB7DQoJCQkkYW5hbHlzaXMgPSBJbnZva2UtU2NyaXB0QW5hbHl6ZXIgLVBhdGggJEZ1bGxOYW1lIC1FeGNsdWRlUnVsZSBQU0F2b2lkVHJhaWxpbmdXaGl0ZXNwYWNlLCBQU1Nob3VsZFByb2Nlc3MNCgkJfQ0KDQoJCUl0ICJTaG91bGQgcGFzcyA8UnVsZU5hbWU+IiAtRm9yZWFjaCAkc2NyaXB0QW5hbHl6ZXJSdWxlcyB7DQoJCQkjIFRlc3QgaWYgdGhlIHJ1bGUgaXMgcHJlc2VudCBhbmQgaWYgc28gY3JlYXRlIGEgc3RyaW5nIGNvbnRhaW5pbmcgbW9yZSBpbmZvIHdoaWNoIHdpbGwgYmUgc2hvd24gaW4gdGhlIGRldGFpbHMgb2YgdGhlIHRlc3Qgb3V0cHV0LiBJZiBpdCdzIGVtcHR5IHRoZSB0ZXN0IGlzIHN1Y2Nlc2Z1bGwgYXMgdGhlcmUgaXMgbm8gcHJvYmxlbSB3aXRoIHRoaXMgcnVsZS4NCgkJCSRhbmFseXNpcyB8IFdoZXJlLU9iamVjdCBSdWxlTmFtZSAtRVEgJFJ1bGVOYW1lIHwgRm9yZWFjaC1PYmplY3Qgew0KCQkJCSMgQ3JlYXRlIGEgc3RyaW5nDQoJCQkJIiQoJF8uU2V2ZXJpdHkpIGF0IExpbmUgJCgkXy5MaW5lKSBDb2x1bW4gJCgkXy5Db2x1bW4pIHdpdGggJyQoJF8uRXh0ZW50KSciDQoJCQkJIyBBZGQgdGhlIGRhdGEgKGFuZCBzdXByZXNzIHRoZSBvdXRwdXQpIHRvIHRoZSBnbG9iYWwgdmFyaWFibGUgZm9yIGxhdGVyIHVzZQ0KCQkJCSRudWxsID0gJGdsb2JhbDpfX3Blc3Rlcl9kYXRhLlNjcmlwdEFuYWx5emVyLkFkZCgkXykNCgkJCX0gfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCX0NCn0BCTwAAAAJPQAAAAY+AAAAGlBTU2NyaXB0QW5hbHl6ZXIuVGVzdHMucHMxBj8AAAAiZ2VuZXJhbFxQU1NjcmlwdEFuYWx5emVyLlRlc3RzLnBzMQkGAAAACUEAAAAJQgAAAAERAAAACwAAAAZDAAAA5gckZXhjZXB0aW9ucyA9IEB7IH0NCg0KPCMNCkEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgTUFZIGJlIGluIHRoZSBsYW5ndWFnZSBmaWxlcywgd2l0aG91dCBjYXVzaW5nIHRoZSB0ZXN0cyB0byBmYWlsLg0KVGhpcyBpcyBjb21tb25seSB1c2VkIGluIG1vZHVsZXMgdGhhdCBnZW5lcmF0ZSBsb2NhbGl6ZWQgbWVzc2FnZXMgc3RyYWlnaHQgZnJvbSBDIy4NClNwZWNpZnkgdGhlIGZ1bGwga2V5IGFzIGl0IGlzIHdyaXR0ZW4gaW4gdGhlIGxhbmd1YWdlIGZpbGVzLCBkbyBub3QgcHJlcGVuZCB0aGUgbW9kdWxlbmFtZSwNCmFzIHlvdSB3b3VsZCBoYXZlIHRvIGluIEMjIGNvZGUuDQoNCkV4YW1wbGU6DQokZXhjZXB0aW9uc1snTGVnYWxTdXJwbHVzJ10gPSBAKA0KICAgICdFeGNlcHRpb24uU3RyZWFtcy5GYWlsZWRDcmVhdGUnDQogICAgJ0V4Y2VwdGlvbi5TdHJlYW1zLkZhaWxlZERpc3Bvc2UnDQopDQojPg0KJGV4Y2VwdGlvbnNbJ0xlZ2FsU3VycGx1cyddID0gQCgNCg0KKQ0KPCMNCkEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgTUFZIGJlIHVzZWQgd2l0aG91dCBuZWVkaW5nIHRvIGhhdmUgdGV4dCBkZWZpbmVkLg0KVGhpcyBpcyBpbnRlbmRlZCBmb3IgbW9kdWxlcyAocmUtKXVzaW5nIHN0cmluZ3MgcHJvdmlkZWQgYnkgYW5vdGhlciBtb2R1bGUNCiM+DQokZXhjZXB0aW9uc1snTm9UZXh0TmVlZGVkJ10gPSBAKA0KCSdWYWxpZGF0ZS5GU1BhdGgnDQoJJ1ZhbGlkYXRlLkZTUGF0aC5GaWxlJw0KCSdWYWxpZGF0ZS5GU1BhdGguRmlsZU9yUGFyZW50Jw0KCSdWYWxpZGF0ZS5GU1BhdGguRm9sZGVyJw0KCSdWYWxpZGF0ZS5QYXRoJw0KCSdWYWxpZGF0ZS5QYXRoLkNvbnRhaW5lcicNCgknVmFsaWRhdGUuUGF0aC5MZWFmJw0KCSdWYWxpZGF0ZS5UaW1lU3Bhbi5Qb3NpdGl2ZScNCgknVmFsaWRhdGUuVXJpLkFic29sdXRlJw0KCSdWYWxpZGF0ZS5VcmkuQWJzb2x1dGUuRmlsZScNCgknVmFsaWRhdGUuVXJpLkFic29sdXRlLkh0dHBzJw0KKQ0KDQokZXhjZXB0aW9ucwEJRAAAAAlFAAAABkYAAAAWc3RyaW5ncy5FeGNlcHRpb25zLnBzMQZHAAAAHmdlbmVyYWxcc3RyaW5ncy5FeGNlcHRpb25zLnBzMQkGAAAACUkAAAAJSgAAAAESAAAACwAAAAZLAAAAlwg8Iw0KLkRFU0NSSVBUSU9ODQogICAgVGhpcyB0ZXN0IHZlcmlmaWVzLCB0aGF0IGFsbCBzdHJpbmdzIHRoYXQgaGF2ZSBiZWVuIHVzZWQsDQogICAgYXJlIGxpc3RlZCBpbiB0aGUgbGFuZ3VhZ2UgZmlsZXMgYW5kIHRodXMgaGF2ZSBhIG1lc3NhZ2UgYmVpbmcgZGlzcGxheWVkLg0KDQogICAgSXQgYWxzbyBjaGVja3MsIHdoZXRoZXIgdGhlIGxhbmd1YWdlIGZpbGVzIGhhdmUgb3JwaGFuZWQgZW50cmllcyB0aGF0IG5lZWQgY2xlYW5pbmcgdXAuDQojPg0KDQoNCg0KRGVzY3JpYmUgIlRlc3RpbmcgbG9jYWxpemF0aW9uIHN0cmluZ3MiIHsNCgkkbW9kdWxlUm9vdCA9IChHZXQtTW9kdWxlIMO+bmFtZcO+KS5Nb2R1bGVCYXNlDQoJJHN0cmluZ3NSZXN1bHRzID0gRXhwb3J0LVBTTURTdHJpbmcgLU1vZHVsZVJvb3QgJG1vZHVsZVJvb3QNCgkkZXhjZXB0aW9ucyA9ICYgIiRnbG9iYWw6dGVzdHJvb3RcZ2VuZXJhbFxzdHJpbmdzLkV4Y2VwdGlvbnMucHMxIg0KCQ0KCWZvcmVhY2ggKCRzdHJpbmdFbnRyeSBpbiAkc3RyaW5nc1Jlc3VsdHMpIHsNCiAgICAgICAgaWYgKCRzdHJpbmdFbnRyeS5TdHJpbmcgLWVxICJrZXkiKSB7IGNvbnRpbnVlIH0gIyBTa2lwcGluZyB0aGUgdGVtcGxhdGUgZGVmYXVsdCBlbnRyeQ0KCQlJdCAiU2hvdWxkIGJlIHVzZWQgJiBoYXZlIHRleHQ6ICQoJHN0cmluZ0VudHJ5LlN0cmluZykiIC1UZXN0Q2FzZXMgQHsgc3RyaW5nRW50cnkgPSAkc3RyaW5nRW50cnk7IGV4Y2VwdGlvbnMgPSAkZXhjZXB0aW9ucyB9IHsNCiAgICAgICAgICAgIGlmICgkZXhjZXB0aW9ucy5MZWdhbFN1cnBsdXMgLW5vdGNvbnRhaW5zICRzdHJpbmdFbnRyeS5TdHJpbmcpIHsNCiAgICAgICAgICAgICAgICAkc3RyaW5nRW50cnkuU3VycGx1cyB8IFNob3VsZCAtQmVGYWxzZQ0KCQkJfQ0KCQkJaWYgKCRleGNlcHRpb25zLk5vVGV4dE5lZWRlZCAtbm90Y29udGFpbnMgJHN0cmluZ0VudHJ5LlN0cmluZykgew0KCQkJCSRzdHJpbmdFbnRyeS5UZXh0IHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJCX0NCiAgICAgICAgfQ0KICAgIH0NCn0BCUwAAAAJTQAAAAZOAAAAEXN0cmluZ3MuVGVzdHMucHMxBk8AAAAZZ2VuZXJhbFxzdHJpbmdzLlRlc3RzLnBzMQkGAAAACVEAAAAJUgAAAAEUAAAABwAAAAkKAAAAAAAAAAAAAAABFQAAAAcAAAAJCgAAAAAAAAAAAAAAARkAAAAHAAAACQoAAAAAAAAAAAAAAAEaAAAABwAAAAkKAAAAAAAAAAAAAAABHAAAAAcAAAAJCgAAAAAAAAAAAAAAAR0AAAAHAAAACQoAAAAAAAAAAAAAAAEhAAAABwAAAAkKAAAAAAAAAAAAAAABIgAAAAcAAAAJCgAAAAAAAAAAAAAAASQAAAAHAAAACQoAAAAAAAAAAAAAAAElAAAABwAAAAkKAAAAAAAAAAAAAAABKQAAAAcAAAAJCgAAAAAAAAAAAAAAASoAAAAHAAAACQoAAAAAAAAAAAAAAAEsAAAABwAAAAlUAAAAAQAAAAEAAAABLQAAAAcAAAAJCgAAAAAAAAAAAAAAATEAAAAHAAAACQoAAAAAAAAAAAAAAAEyAAAABwAAAAkKAAAAAAAAAAAAAAABNAAAAAcAAAAJVgAAAAEAAAABAAAAATUAAAAHAAAACQoAAAAAAAAAAAAAAAE5AAAABwAAAAkKAAAAAAAAAAAAAAABOgAAAAcAAAAJCgAAAAAAAAAAAAAAATwAAAAHAAAACQoAAAAAAAAAAAAAAAE9AAAABwAAAAkKAAAAAAAAAAAAAAABQQAAAAcAAAAJCgAAAAAAAAAAAAAAAUIAAAAHAAAACQoAAAAAAAAAAAAAAAFEAAAABwAAAAkKAAAAAAAAAAAAAAABRQAAAAcAAAAJCgAAAAAAAAAAAAAAAUkAAAAHAAAACQoAAAAAAAAAAAAAAAFKAAAABwAAAAkKAAAAAAAAAAAAAAABTAAAAAcAAAAJWAAAAAEAAAABAAAAAU0AAAAHAAAACQoAAAAAAAAAAAAAAAFRAAAABwAAAAkKAAAAAAAAAAAAAAABUgAAAAcAAAAJCgAAAAAAAAAAAAAAEVQAAAAEAAAABloAAAAEbmFtZQ0DEVYAAAAEAAAABlsAAAAEbmFtZQ0DEVgAAAAEAAAABlwAAAAEbmFtZQ0DCw==</BA>
            </MS>
          </Obj>
          <Obj RefId="18">
            <TN RefId="8">
              <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="19">
                <TNRef RefId="2" />
                <LST>
                  <S>name</S>
                </LST>
              </Obj>
              <Obj N="ContentParameterScript" RefId="20">
                <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="21">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="22">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAqRtwYXJhbSAoDQoJJFRlc3RHZW5lcmFsID0gJHRydWUsDQoJDQoJJFRlc3RGdW5jdGlvbnMgPSAkdHJ1ZSwNCgkNCglbVmFsaWRhdGVTZXQoJ05vbmUnLCAnTm9ybWFsJywgJ0RldGFpbGVkJywgJ0RpYWdub3N0aWMnKV0NCglbQWxpYXMoJ1Nob3cnKV0NCgkkT3V0cHV0ID0gIk5vbmUiLA0KCQ0KCSRJbmNsdWRlID0gIioiLA0KCQ0KCSRFeGNsdWRlID0gIiINCikNCg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJTdGFydGluZyBUZXN0cyINCg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJJbXBvcnRpbmcgTW9kdWxlIg0KDQokZ2xvYmFsOnRlc3Ryb290ID0gJFBTU2NyaXB0Um9vdA0KJGdsb2JhbDpfX3Blc3Rlcl9kYXRhID0gQHsgfQ0KDQpSZW1vdmUtTW9kdWxlIMO+bmFtZcO+IC1FcnJvckFjdGlvbiBJZ25vcmUNCkltcG9ydC1Nb2R1bGUgIiRQU1NjcmlwdFJvb3RcLi5cw75uYW1lw74ucHNkMSINCkltcG9ydC1Nb2R1bGUgIiRQU1NjcmlwdFJvb3RcLi5cw75uYW1lw74ucHNtMSIgLUZvcmNlDQoNCiMgTmVlZCB0byBpbXBvcnQgZXhwbGljaXRseSBzbyB3ZSBjYW4gdXNlIHRoZSBjb25maWd1cmF0aW9uIGNsYXNzDQpJbXBvcnQtTW9kdWxlIFBlc3Rlcg0KDQrDviF0ZXN0Zm9sZGVyIcO+DQoNCiR0b3RhbEZhaWxlZCA9IDANCiR0b3RhbFJ1biA9IDANCg0KJHRlc3RyZXN1bHRzID0gQCgpDQokY29uZmlnID0gW1Blc3RlckNvbmZpZ3VyYXRpb25dOjpEZWZhdWx0DQrDviFwZXN0ZXJjb25maWchw74NCg0KI3JlZ2lvbiBSdW4gR2VuZXJhbCBUZXN0cw0KaWYgKCRUZXN0R2VuZXJhbCkNCnsNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIk1vZHVsZXMgaW1wb3J0ZWQsIHByb2NlZWRpbmcgd2l0aCBnZW5lcmFsIHRlc3RzIg0KCWZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtICIkUFNTY3JpcHRSb290XGdlbmVyYWwiIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIiouVGVzdHMucHMxIikpDQoJew0KCQlpZiAoJGZpbGUuTmFtZSAtbm90bGlrZSAkSW5jbHVkZSkgeyBjb250aW51ZSB9DQoJCWlmICgkZmlsZS5OYW1lIC1saWtlICRFeGNsdWRlKSB7IGNvbnRpbnVlIH0NCg0KCQlXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBTaWduaWZpY2FudCAtTWVzc2FnZSAiICBFeGVjdXRpbmcgPGM9J2VtJz4kKCRmaWxlLk5hbWUpPC9jPiINCgkJJGNvbmZpZy5UZXN0UmVzdWx0Lk91dHB1dFBhdGggPSBKb2luLVBhdGggIiRQU1NjcmlwdFJvb3RcLi5cLi5cVGVzdFJlc3VsdHMiICJURVNULSQoJGZpbGUuQmFzZU5hbWUpLnhtbCINCgkJJGNvbmZpZy5SdW4uUGF0aCA9ICRmaWxlLkZ1bGxOYW1lDQoJCSRjb25maWcuUnVuLlBhc3NUaHJ1ID0gJHRydWUNCgkJJGNvbmZpZy5PdXRwdXQuVmVyYm9zaXR5ID0gJE91dHB1dA0KICAgIAkkcmVzdWx0cyA9IEludm9rZS1QZXN0ZXIgLUNvbmZpZ3VyYXRpb24gJGNvbmZpZw0KCQlmb3JlYWNoICgkcmVzdWx0IGluICRyZXN1bHRzKQ0KCQl7DQoJCQkkdG90YWxSdW4gKz0gJHJlc3VsdC5Ub3RhbENvdW50DQoJCQkkdG90YWxGYWlsZWQgKz0gJHJlc3VsdC5GYWlsZWRDb3VudA0KCQkJJHJlc3VsdC5UZXN0cyB8IFdoZXJlLU9iamVjdCBSZXN1bHQgLW5lICdQYXNzZWQnIHwgRm9yRWFjaC1PYmplY3Qgew0KCQkJCSR0ZXN0cmVzdWx0cyArPSBbcHNjdXN0b21vYmplY3RdQHsNCgkJCQkJQmxvY2sgICAgPSAkXy5CbG9jaw0KCQkJCQlOYW1lCSA9ICJJdCAkKCRfLk5hbWUpIg0KCQkJCQlSZXN1bHQgICA9ICRfLlJlc3VsdA0KCQkJCQlNZXNzYWdlICA9ICRfLkVycm9yUmVjb3JkLkRpc3BsYXlFcnJvck1lc3NhZ2UNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQojZW5kcmVnaW9uIFJ1biBHZW5lcmFsIFRlc3RzDQoNCiRnbG9iYWw6X19wZXN0ZXJfZGF0YS5TY3JpcHRBbmFseXplciB8IE91dC1Ib3N0DQoNCiNyZWdpb24gVGVzdCBDb21tYW5kcw0KaWYgKCRUZXN0RnVuY3Rpb25zKQ0Kew0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiUHJvY2VlZGluZyB3aXRoIGluZGl2aWR1YWwgdGVzdHMiDQoJZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gIiRQU1NjcmlwdFJvb3RcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqVGVzdHMucHMxIikpDQoJew0KCQlpZiAoJGZpbGUuTmFtZSAtbm90bGlrZSAkSW5jbHVkZSkgeyBjb250aW51ZSB9DQoJCWlmICgkZmlsZS5OYW1lIC1saWtlICRFeGNsdWRlKSB7IGNvbnRpbnVlIH0NCgkJDQoJCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIFNpZ25pZmljYW50IC1NZXNzYWdlICIgIEV4ZWN1dGluZyAkKCRmaWxlLk5hbWUpIg0KCQkkY29uZmlnLlRlc3RSZXN1bHQuT3V0cHV0UGF0aCA9IEpvaW4tUGF0aCAiJFBTU2NyaXB0Um9vdFwuLlwuLlxUZXN0UmVzdWx0cyIgIlRFU1QtJCgkZmlsZS5CYXNlTmFtZSkueG1sIg0KCQkkY29uZmlnLlJ1bi5QYXRoID0gJGZpbGUuRnVsbE5hbWUNCgkJJGNvbmZpZy5SdW4uUGFzc1RocnUgPSAkdHJ1ZQ0KCQkkY29uZmlnLk91dHB1dC5WZXJib3NpdHkgPSAkT3V0cHV0DQogICAgCSRyZXN1bHRzID0gSW52b2tlLVBlc3RlciAtQ29uZmlndXJhdGlvbiAkY29uZmlnDQoJCWZvcmVhY2ggKCRyZXN1bHQgaW4gJHJlc3VsdHMpDQoJCXsNCgkJCSR0b3RhbFJ1biArPSAkcmVzdWx0LlRvdGFsQ291bnQNCgkJCSR0b3RhbEZhaWxlZCArPSAkcmVzdWx0LkZhaWxlZENvdW50DQoJCQkkcmVzdWx0LlRlc3RzIHwgV2hlcmUtT2JqZWN0IFJlc3VsdCAtbmUgJ1Bhc3NlZCcgfCBGb3JFYWNoLU9iamVjdCB7DQoJCQkJJHRlc3RyZXN1bHRzICs9IFtwc2N1c3RvbW9iamVjdF1Aew0KCQkJCQlCbG9jayAgICA9ICRfLkJsb2NrDQoJCQkJCU5hbWUJID0gIkl0ICQoJF8uTmFtZSkiDQoJCQkJCVJlc3VsdCAgID0gJF8uUmVzdWx0DQoJCQkJCU1lc3NhZ2UgID0gJF8uRXJyb3JSZWNvcmQuRGlzcGxheUVycm9yTWVzc2FnZQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCn0NCiNlbmRyZWdpb24gVGVzdCBDb21tYW5kcw0KDQokdGVzdHJlc3VsdHMgfCBTb3J0LU9iamVjdCBEZXNjcmliZSwgQ29udGV4dCwgTmFtZSwgUmVzdWx0LCBNZXNzYWdlIHwgRm9ybWF0LUxpc3QNCg0KaWYgKCR0b3RhbEZhaWxlZCAtZXEgMCkgeyBXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBDcml0aWNhbCAtTWVzc2FnZSAiQWxsIDxjPSdlbSc+JHRvdGFsUnVuPC9jPiB0ZXN0cyBleGVjdXRlZCB3aXRob3V0IGEgc2luZ2xlIGZhaWx1cmUhIiB9DQplbHNlIHsgV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgQ3JpdGljYWwgLU1lc3NhZ2UgIjxjPSdlbSc+JHRvdGFsRmFpbGVkIHRlc3RzPC9jPiBvdXQgb2YgPGM9J3N1Yic+JHRvdGFsUnVuPC9jPiB0ZXN0cyBmYWlsZWQhIiB9DQoNCmlmICgkdG90YWxGYWlsZWQgLWd0IDApDQp7DQoJdGhyb3cgIiR0b3RhbEZhaWxlZCAvICR0b3RhbFJ1biB0ZXN0cyBmYWlsZWQhIg0KfQEJBAAAAAkFAAAABgYAAAAKcGVzdGVyLnBzMQYHAAAACnBlc3Rlci5wczEGCAAAAALDvgkJAAAACQoAAAAEBAAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkLAAAAAQAAAAEAAAABBQAAAAQAAAAJDAAAAAIAAAACAAAAAQkAAAAEAAAACQ0AAAAAAAAAAAAAAAEKAAAABAAAAAkNAAAAAAAAAAAAAAARCwAAAAQAAAAGDgAAAARuYW1lDQMRDAAAAAQAAAAGDwAAAAp0ZXN0Zm9sZGVyBhAAAAAMcGVzdGVyY29uZmlnDQIRDQAAAAAAAAAL</BA>
            </MS>
          </Obj>
          <Obj RefId="23">
            <TNRef RefId="8" />
            <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="24">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="ContentParameterScript" RefId="25">
                <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="26">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="27">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAogcjIERlc2NyaXB0aW9uDQoNClRoaXMgaXMgdGhlIGZvbGRlciwgd2hlcmUgYWxsIHRoZSB0ZXN0cyBnby4NCg0KVGhvc2UgYXJlIHN1YmRpdmlkZWQgaW4gdHdvIGNhdGVnb3JpZXM6DQoNCiAtIEdlbmVyYWwNCiAtIEZ1bmN0aW9uDQoNCiMjIEdlbmVyYWwgVGVzdHMNCg0KR2VuZXJhbCB0ZXN0cyBhcmUgZnVuY3Rpb24gZ2VuZXJpYyBhbmQgdGVzdCBmb3IgZ2VuZXJhbCBwb2xpY2llcy4NCg0KVGhlc2UgdGVzdCBzY2FuIGFuc3dlciBxdWVzdGlvbnMgc3VjaCBhczoNCg0KIC0gSXMgbXkgbW9kdWxlIGZvbGxvd2luZyBteSBzdHlsZSBndWlkZXM/DQogLSBEb2VzIGFueSBvZiBteSBzY3JpcHRzIGhhdmUgYSBzeW50YXggZXJyb3I/DQogLSBEbyBteSBzY3JpcHRzIHVzZSBjb21tYW5kcyBJIGRvIG5vdCB3YW50IHRoZW0gdG8gdXNlPw0KIC0gRG8gbXkgY29tbWFuZHMgZm9sbG93IGJlc3QgcHJhY3RpY2VzPw0KIC0gRG8gbXkgY29tbWFuZHMgaGF2ZSBwcm9wZXIgaGVscD8NCg0KQmFzaWNhbGx5LCB0aGVzZSBhbGxvdyBhIGdlbmVyYWwgbW9kdWxlIGhlYWx0aCBjaGVjay4NCg0KVGhlc2UgdGVzdHMgYXJlIGFscmVhZHkgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgdGVtcGxhdGUuDQoNCiMjIEZ1bmN0aW9uIFRlc3RzDQoNCkEgaGVhbHRoeSBtb2R1bGUgc2hvdWxkIHByb3ZpZGUgdW5pdCBhbmQgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSBjb21tYW5kcyAmIGNvbXBvbmVudHMgaXQgc2hpcHMuDQpPbmx5IHRoZW4gY2FuIGJlIGd1YXJhbnRlZWQsIHRoYXQgdGhleSB3aWxsIGFjdHVhbGx5IHBlcmZvcm0gYXMgcHJvbWlzZWQuDQoNCkhvd2V2ZXIsIGFzIGVhY2ggc3VjaCB0ZXN0IG11c3QgYmUgc3BlY2lmaWMgdG8gdGhlIGZ1bmN0aW9uIGl0IHRlc3RzLCB0aGVyZSBjYW5ub3QgYmUgbXVjaCBpbiB0aGUgd2F5IG9mIHRlbXBsYXRlcy4BCQQAAAAJBQAAAAYGAAAACXJlYWRtZS5tZAYHAAAACXJlYWRtZS5tZAYIAAAAAsO+CQkAAAAJCgAAAAQEAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQsAAAAAAAAAAAAAAAEFAAAABAAAAAkLAAAAAAAAAAAAAAABCQAAAAQAAAAJCwAAAAAAAAAAAAAAAQoAAAAEAAAACQsAAAAAAAAAAAAAABELAAAAAAAAAAs=</BA>
            </MS>
          </Obj>
        </LST>
      </Obj>
      <I32 N="Generation">1</I32>
    </Props>
    <MS>
      <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGUMAAAABE5hbWUEVHlwZQdWZXJzaW9uC0Rlc2NyaXB0aW9uBkF1dGhvcglDcmVhdGVkT24EVGFncwpQYXJhbWV0ZXJzB1NjcmlwdHMLUGFyYW1ldGVyczIIQ2hpbGRyZW4KR2VuZXJhdGlvbgEEAwEBAAMDAwMDAClQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlVHlwZQIAAAAOU3lzdGVtLlZlcnNpb24Nf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXYACU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdCwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXYgCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlci5QYXJhbWV0ZXJCYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQgCAAAABgMAAAAIUFNGVGVzdHMF/P///ylQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlVHlwZQEAAAAHdmFsdWVfXwAIAgAAAAEAAAAJBQAAAAYGAAAAQVRoZSBQU0ZyYW1ld29yay1iYXNlZCBzdGFuZGFyZCB0ZXN0IHN1aXRlIGZvciBhIFBvd2VyU2hlbGwgTW9kdWxlBgcAAAASRnJpZWRyaWNoIFdlaW5tYW5uAIA08paC3IgJCAAAAAkJAAAACQoAAAAJCwAAAAkMAAAAAQAAAAQFAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAAAQAAAP////8ECAAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkNAAAAAgAAAAAAAAABCQAAAAgAAAAJDgAAAAEAAAABAAAABAoAAACAAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUNS2V5VmFsdWVQYWlycwADAAMIFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIIhAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV1bXQMAAAAJDwAAAAMAAAAJEAAAAAQLAAAAiAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyLlBhcmFtZXRlckJhc2UsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUAAwAIFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIIAAAAAAkPAAAAAAAAAAQMAAAAngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZVtdAgAAAAgICRIAAAAEAAAABAAAABENAAAAAgAAAAYTAAAABVRlc3RzBhQAAAALUFNGcmFtZXdvcmsRDgAAAAQAAAAGFQAAAARuYW1lDQMEDwAAABZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyAQAAAAtfaWdub3JlQ2FzZQABAQcQAAAAAAEAAAADAAAAA4ICU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dBOr///+CAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdCwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQIAAAADa2V5BXZhbHVlAQQsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABhcAAAAKdGVzdGZvbGRlcgkYAAAAAef////q////BhoAAAAMcGVzdGVyY29uZmlnCRsAAAAB5P///+r///8GHQAAAARndWlkCR4AAAAHEgAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAkfAAAACSAAAAAJIQAAAAkiAAAADCMAAABfU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbiwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFGAAAACxQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdAIAAAAETmFtZQtTY3JpcHRCbG9jawEEO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyIwAAAAIAAAAJFwAAAAklAAAAARsAAAAYAAAACRoAAAAJJwAAAAEeAAAAGAAAAAkdAAAACSkAAAAFHwAAAC9QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUZvbGRlcgYAAAAIQ2hpbGRyZW4ETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AwEBAQMDngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACSoAAAAGKwAAAAlmdW5jdGlvbnMGLAAAAAlmdW5jdGlvbnMGLQAAAALDvgkuAAAACS8AAAABIAAAAB8AAAAJMAAAAAYxAAAAB2dlbmVyYWwGMgAAAAdnZW5lcmFsCS0AAAAJNAAAAAk1AAAABSEAAAAtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1GaWxlCQAAAAVWYWx1ZQlQbGFpblRleHQUQ29udGVudFBhcmFtZXRlckZsYXQWQ29udGVudFBhcmFtZXRlclNjcmlwdAROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQBAAMDAQEBAwMBf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAABjYAAACpG3BhcmFtICgNCgkkVGVzdEdlbmVyYWwgPSAkdHJ1ZSwNCgkNCgkkVGVzdEZ1bmN0aW9ucyA9ICR0cnVlLA0KCQ0KCVtWYWxpZGF0ZVNldCgnTm9uZScsICdOb3JtYWwnLCAnRGV0YWlsZWQnLCAnRGlhZ25vc3RpYycpXQ0KCVtBbGlhcygnU2hvdycpXQ0KCSRPdXRwdXQgPSAiTm9uZSIsDQoJDQoJJEluY2x1ZGUgPSAiKiIsDQoJDQoJJEV4Y2x1ZGUgPSAiIg0KKQ0KDQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIlN0YXJ0aW5nIFRlc3RzIg0KDQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIkltcG9ydGluZyBNb2R1bGUiDQoNCiRnbG9iYWw6dGVzdHJvb3QgPSAkUFNTY3JpcHRSb290DQokZ2xvYmFsOl9fcGVzdGVyX2RhdGEgPSBAeyB9DQoNClJlbW92ZS1Nb2R1bGUgw75uYW1lw74gLUVycm9yQWN0aW9uIElnbm9yZQ0KSW1wb3J0LU1vZHVsZSAiJFBTU2NyaXB0Um9vdFwuLlzDvm5hbWXDvi5wc2QxIg0KSW1wb3J0LU1vZHVsZSAiJFBTU2NyaXB0Um9vdFwuLlzDvm5hbWXDvi5wc20xIiAtRm9yY2UNCg0KIyBOZWVkIHRvIGltcG9ydCBleHBsaWNpdGx5IHNvIHdlIGNhbiB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gY2xhc3MNCkltcG9ydC1Nb2R1bGUgUGVzdGVyDQoNCsO+IXRlc3Rmb2xkZXIhw74NCg0KJHRvdGFsRmFpbGVkID0gMA0KJHRvdGFsUnVuID0gMA0KDQokdGVzdHJlc3VsdHMgPSBAKCkNCiRjb25maWcgPSBbUGVzdGVyQ29uZmlndXJhdGlvbl06OkRlZmF1bHQNCsO+IXBlc3RlcmNvbmZpZyHDvg0KDQojcmVnaW9uIFJ1biBHZW5lcmFsIFRlc3RzDQppZiAoJFRlc3RHZW5lcmFsKQ0Kew0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiTW9kdWxlcyBpbXBvcnRlZCwgcHJvY2VlZGluZyB3aXRoIGdlbmVyYWwgdGVzdHMiDQoJZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gIiRQU1NjcmlwdFJvb3RcZ2VuZXJhbCIgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5UZXN0cy5wczEiKSkNCgl7DQoJCWlmICgkZmlsZS5OYW1lIC1ub3RsaWtlICRJbmNsdWRlKSB7IGNvbnRpbnVlIH0NCgkJaWYgKCRmaWxlLk5hbWUgLWxpa2UgJEV4Y2x1ZGUpIHsgY29udGludWUgfQ0KDQoJCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIFNpZ25pZmljYW50IC1NZXNzYWdlICIgIEV4ZWN1dGluZyA8Yz0nZW0nPiQoJGZpbGUuTmFtZSk8L2M+Ig0KCQkkY29uZmlnLlRlc3RSZXN1bHQuT3V0cHV0UGF0aCA9IEpvaW4tUGF0aCAiJFBTU2NyaXB0Um9vdFwuLlwuLlxUZXN0UmVzdWx0cyIgIlRFU1QtJCgkZmlsZS5CYXNlTmFtZSkueG1sIg0KCQkkY29uZmlnLlJ1bi5QYXRoID0gJGZpbGUuRnVsbE5hbWUNCgkJJGNvbmZpZy5SdW4uUGFzc1RocnUgPSAkdHJ1ZQ0KCQkkY29uZmlnLk91dHB1dC5WZXJib3NpdHkgPSAkT3V0cHV0DQogICAgCSRyZXN1bHRzID0gSW52b2tlLVBlc3RlciAtQ29uZmlndXJhdGlvbiAkY29uZmlnDQoJCWZvcmVhY2ggKCRyZXN1bHQgaW4gJHJlc3VsdHMpDQoJCXsNCgkJCSR0b3RhbFJ1biArPSAkcmVzdWx0LlRvdGFsQ291bnQNCgkJCSR0b3RhbEZhaWxlZCArPSAkcmVzdWx0LkZhaWxlZENvdW50DQoJCQkkcmVzdWx0LlRlc3RzIHwgV2hlcmUtT2JqZWN0IFJlc3VsdCAtbmUgJ1Bhc3NlZCcgfCBGb3JFYWNoLU9iamVjdCB7DQoJCQkJJHRlc3RyZXN1bHRzICs9IFtwc2N1c3RvbW9iamVjdF1Aew0KCQkJCQlCbG9jayAgICA9ICRfLkJsb2NrDQoJCQkJCU5hbWUJID0gIkl0ICQoJF8uTmFtZSkiDQoJCQkJCVJlc3VsdCAgID0gJF8uUmVzdWx0DQoJCQkJCU1lc3NhZ2UgID0gJF8uRXJyb3JSZWNvcmQuRGlzcGxheUVycm9yTWVzc2FnZQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCn0NCiNlbmRyZWdpb24gUnVuIEdlbmVyYWwgVGVzdHMNCg0KJGdsb2JhbDpfX3Blc3Rlcl9kYXRhLlNjcmlwdEFuYWx5emVyIHwgT3V0LUhvc3QNCg0KI3JlZ2lvbiBUZXN0IENvbW1hbmRzDQppZiAoJFRlc3RGdW5jdGlvbnMpDQp7DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJQcm9jZWVkaW5nIHdpdGggaW5kaXZpZHVhbCB0ZXN0cyINCglmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJFBTU2NyaXB0Um9vdFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIipUZXN0cy5wczEiKSkNCgl7DQoJCWlmICgkZmlsZS5OYW1lIC1ub3RsaWtlICRJbmNsdWRlKSB7IGNvbnRpbnVlIH0NCgkJaWYgKCRmaWxlLk5hbWUgLWxpa2UgJEV4Y2x1ZGUpIHsgY29udGludWUgfQ0KCQkNCgkJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgU2lnbmlmaWNhbnQgLU1lc3NhZ2UgIiAgRXhlY3V0aW5nICQoJGZpbGUuTmFtZSkiDQoJCSRjb25maWcuVGVzdFJlc3VsdC5PdXRwdXRQYXRoID0gSm9pbi1QYXRoICIkUFNTY3JpcHRSb290XC4uXC4uXFRlc3RSZXN1bHRzIiAiVEVTVC0kKCRmaWxlLkJhc2VOYW1lKS54bWwiDQoJCSRjb25maWcuUnVuLlBhdGggPSAkZmlsZS5GdWxsTmFtZQ0KCQkkY29uZmlnLlJ1bi5QYXNzVGhydSA9ICR0cnVlDQoJCSRjb25maWcuT3V0cHV0LlZlcmJvc2l0eSA9ICRPdXRwdXQNCiAgICAJJHJlc3VsdHMgPSBJbnZva2UtUGVzdGVyIC1Db25maWd1cmF0aW9uICRjb25maWcNCgkJZm9yZWFjaCAoJHJlc3VsdCBpbiAkcmVzdWx0cykNCgkJew0KCQkJJHRvdGFsUnVuICs9ICRyZXN1bHQuVG90YWxDb3VudA0KCQkJJHRvdGFsRmFpbGVkICs9ICRyZXN1bHQuRmFpbGVkQ291bnQNCgkJCSRyZXN1bHQuVGVzdHMgfCBXaGVyZS1PYmplY3QgUmVzdWx0IC1uZSAnUGFzc2VkJyB8IEZvckVhY2gtT2JqZWN0IHsNCgkJCQkkdGVzdHJlc3VsdHMgKz0gW3BzY3VzdG9tb2JqZWN0XUB7DQoJCQkJCUJsb2NrICAgID0gJF8uQmxvY2sNCgkJCQkJTmFtZQkgPSAiSXQgJCgkXy5OYW1lKSINCgkJCQkJUmVzdWx0ICAgPSAkXy5SZXN1bHQNCgkJCQkJTWVzc2FnZSAgPSAkXy5FcnJvclJlY29yZC5EaXNwbGF5RXJyb3JNZXNzYWdlDQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KfQ0KI2VuZHJlZ2lvbiBUZXN0IENvbW1hbmRzDQoNCiR0ZXN0cmVzdWx0cyB8IFNvcnQtT2JqZWN0IERlc2NyaWJlLCBDb250ZXh0LCBOYW1lLCBSZXN1bHQsIE1lc3NhZ2UgfCBGb3JtYXQtTGlzdA0KDQppZiAoJHRvdGFsRmFpbGVkIC1lcSAwKSB7IFdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIENyaXRpY2FsIC1NZXNzYWdlICJBbGwgPGM9J2VtJz4kdG90YWxSdW48L2M+IHRlc3RzIGV4ZWN1dGVkIHdpdGhvdXQgYSBzaW5nbGUgZmFpbHVyZSEiIH0NCmVsc2UgeyBXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBDcml0aWNhbCAtTWVzc2FnZSAiPGM9J2VtJz4kdG90YWxGYWlsZWQgdGVzdHM8L2M+IG91dCBvZiA8Yz0nc3ViJz4kdG90YWxSdW48L2M+IHRlc3RzIGZhaWxlZCEiIH0NCg0KaWYgKCR0b3RhbEZhaWxlZCAtZ3QgMCkNCnsNCgl0aHJvdyAiJHRvdGFsRmFpbGVkIC8gJHRvdGFsUnVuIHRlc3RzIGZhaWxlZCEiDQp9AQk3AAAACTgAAAAGOQAAAApwZXN0ZXIucHMxBjoAAAAKcGVzdGVyLnBzMQktAAAACTwAAAAJPQAAAAEiAAAAIQAAAAY+AAAAogcjIERlc2NyaXB0aW9uDQoNClRoaXMgaXMgdGhlIGZvbGRlciwgd2hlcmUgYWxsIHRoZSB0ZXN0cyBnby4NCg0KVGhvc2UgYXJlIHN1YmRpdmlkZWQgaW4gdHdvIGNhdGVnb3JpZXM6DQoNCiAtIEdlbmVyYWwNCiAtIEZ1bmN0aW9uDQoNCiMjIEdlbmVyYWwgVGVzdHMNCg0KR2VuZXJhbCB0ZXN0cyBhcmUgZnVuY3Rpb24gZ2VuZXJpYyBhbmQgdGVzdCBmb3IgZ2VuZXJhbCBwb2xpY2llcy4NCg0KVGhlc2UgdGVzdCBzY2FuIGFuc3dlciBxdWVzdGlvbnMgc3VjaCBhczoNCg0KIC0gSXMgbXkgbW9kdWxlIGZvbGxvd2luZyBteSBzdHlsZSBndWlkZXM/DQogLSBEb2VzIGFueSBvZiBteSBzY3JpcHRzIGhhdmUgYSBzeW50YXggZXJyb3I/DQogLSBEbyBteSBzY3JpcHRzIHVzZSBjb21tYW5kcyBJIGRvIG5vdCB3YW50IHRoZW0gdG8gdXNlPw0KIC0gRG8gbXkgY29tbWFuZHMgZm9sbG93IGJlc3QgcHJhY3RpY2VzPw0KIC0gRG8gbXkgY29tbWFuZHMgaGF2ZSBwcm9wZXIgaGVscD8NCg0KQmFzaWNhbGx5LCB0aGVzZSBhbGxvdyBhIGdlbmVyYWwgbW9kdWxlIGhlYWx0aCBjaGVjay4NCg0KVGhlc2UgdGVzdHMgYXJlIGFscmVhZHkgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgdGVtcGxhdGUuDQoNCiMjIEZ1bmN0aW9uIFRlc3RzDQoNCkEgaGVhbHRoeSBtb2R1bGUgc2hvdWxkIHByb3ZpZGUgdW5pdCBhbmQgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSBjb21tYW5kcyAmIGNvbXBvbmVudHMgaXQgc2hpcHMuDQpPbmx5IHRoZW4gY2FuIGJlIGd1YXJhbnRlZWQsIHRoYXQgdGhleSB3aWxsIGFjdHVhbGx5IHBlcmZvcm0gYXMgcHJvbWlzZWQuDQoNCkhvd2V2ZXIsIGFzIGVhY2ggc3VjaCB0ZXN0IG11c3QgYmUgc3BlY2lmaWMgdG8gdGhlIGZ1bmN0aW9uIGl0IHRlc3RzLCB0aGVyZSBjYW5ub3QgYmUgbXVjaCBpbiB0aGUgd2F5IG9mIHRlbXBsYXRlcy4BCT8AAAAJQAAAAAZBAAAACXJlYWRtZS5tZAZCAAAACXJlYWRtZS5tZAktAAAACUQAAAAJRQAAAAUlAAAAO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyAQAAAApTY3JpcHRUZXh0ASMAAAAGRgAAAAkNCgkJCQ0KCQkBJwAAACUAAAAGRwAAAAYNCg0KCQkBKQAAACUAAAAGSAAAACwNCgkJCVtTeXN0ZW0uR3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygpDQoJCQEqAAAADAAAAAlJAAAAAQAAAAEAAAABLgAAAAgAAAAJSgAAAAAAAAAAAAAAAS8AAAAIAAAACUoAAAAAAAAAAAAAAAEwAAAADAAAAAlLAAAACAAAAAgAAAABNAAAAAgAAAAJSgAAAAAAAAAAAAAAATUAAAAIAAAACUoAAAAAAAAAAAAAAAE3AAAACAAAAAlNAAAAAQAAAAEAAAABOAAAAAgAAAAJTgAAAAIAAAACAAAAATwAAAAIAAAACUoAAAAAAAAAAAAAAAE9AAAACAAAAAlKAAAAAAAAAAAAAAABPwAAAAgAAAAJSgAAAAAAAAAAAAAAAUAAAAAIAAAACUoAAAAAAAAAAAAAAAFEAAAACAAAAAlKAAAAAAAAAAAAAAABRQAAAAgAAAAJSgAAAAAAAAAAAAAAB0kAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJUAAAAA0DEUoAAAAAAAAAB0sAAAAAAQAAAAgAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJUQAAAAlSAAAACVMAAAAJVAAAAAlVAAAACVYAAAAJVwAAAAlYAAAAEU0AAAAEAAAABlkAAAAEbmFtZQ0DEU4AAAAEAAAABloAAAAKdGVzdGZvbGRlcgZbAAAADHBlc3RlcmNvbmZpZw0CAVAAAAAhAAAABlwAAADVASMgRGVzY3JpcHRpb24NCg0KVGhpcyBpcyB3aGVyZSB0aGUgZnVuY3Rpb24gdGVzdHMgZ28uDQoNCk1ha2Ugc3VyZSB0byBwdXQgdGhlbSBpbiBmb2xkZXJzIHJlZmxlY3RpbmcgdGhlIGFjdHVhbCBtb2R1bGUgc3RydWN0dXJlLg0KDQpJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBpbnRlcm5hbCBhbmQgcHVibGljIGZ1bmN0aW9ucyBoZXJlLgEJXQAAAAleAAAABl8AAAAJcmVhZG1lLm1kBmAAAAATZnVuY3Rpb25zXHJlYWRtZS5tZAktAAAACWIAAAAJYwAAAAFRAAAAIQAAAAZkAAAA+QkjIExpc3Qgb2YgZm9yYmlkZGVuIGNvbW1hbmRzDQokZ2xvYmFsOkJhbm5lZENvbW1hbmRzID0gQCgNCgknV3JpdGUtSG9zdCcNCgknV3JpdGUtVmVyYm9zZScNCgknV3JpdGUtV2FybmluZycNCgknV3JpdGUtRXJyb3InDQoJJ1dyaXRlLU91dHB1dCcNCgknV3JpdGUtSW5mb3JtYXRpb24nDQoJJ1dyaXRlLURlYnVnJw0KCQ0KCSMgVXNlIENJTSBpbnN0ZWFkIHdoZXJlIHBvc3NpYmxlDQoJJ0dldC1XbWlPYmplY3QnDQoJJ0ludm9rZS1XbWlNZXRob2QnDQoJJ1JlZ2lzdGVyLVdtaUV2ZW50Jw0KCSdSZW1vdmUtV21pT2JqZWN0Jw0KCSdTZXQtV21pSW5zdGFuY2UnDQoNCgkjIFVzZSBHZXQtV2luRXZlbnQgaW5zdGVhZA0KCSdHZXQtRXZlbnRMb2cnDQoNCgkjIFVzZXIgUHJlZmVyZW5jZSBzaG91bGQgbm90IGJlIHVzZWQgaW4gYXV0b21hdGlvbg0KCSdDbGVhci1Ib3N0JyAjIENvbnNvbGUgU2NyZWVuIGJlbG9uZ3MgdG8gdGhlIHVzZXINCgknU2V0LUxvY2F0aW9uJyAjIENvbnNvbGUgcGF0aCBiZWxvbmdzIHRvIHRoZSB1c2VyLiBVc2UgJFBTU2NyaXB0Um9vdCBpbnN0ZWFkLg0KDQoJIyBEeW5hbWljIFZhcmlhYmxlcyBhcmUgdW5kZXNpcmFibGUuIFVzZSBoYXNodGFibGUgaW5zdGVhZC4NCgknR2V0LVZhcmlhYmxlJw0KCSdTZXQtVmFyaWFibGUnDQoJJ0NsZWFyLVZhcmlhYmxlJw0KCSdSZW1vdmUtVmFyaWFibGUnDQoJJ05ldy1WYXJpYWJsZScNCg0KCSMgRHluYW1pYyBDb2RlIGV4ZWN1dGlvbiBzaG91bGQgbm90IHJlcXVpcmUgdGhpcw0KCSdJbnZva2UtRXhwcmVzc2lvbicgIyBDb25zaWRlciBzcGxhdHRpbmcgaW5zdGVhZC4gWWVzLCB5b3UgY2FuIHNwbGF0IHBhcmFtZXRlcnMgZm9yIGV4dGVybmFsIGFwcGxpY2F0aW9ucyENCikNCg0KPCMNCglDb250YWlucyBsaXN0IG9mIGV4Y2VwdGlvbnMgZm9yIGJhbm5lZCBjbWRsZXRzLg0KCUluc2VydCB0aGUgZmlsZSBuYW1lcyBvZiBmaWxlcyB0aGF0IG1heSBjb250YWluIHRoZW0uDQoJDQoJRXhhbXBsZToNCgkiV3JpdGUtSG9zdCIgID0gQCgnV3JpdGUtUFNGSG9zdENvbG9yLnBzMScsJ1dyaXRlLVBTRk1lc3NhZ2UucHMxJykNCiM+DQokZ2xvYmFsOk1heUNvbnRhaW5Db21tYW5kID0gQHsNCgkiV3JpdGUtSG9zdCIgID0gQCgpDQoJIldyaXRlLVZlcmJvc2UiID0gQCgpDQoJIldyaXRlLVdhcm5pbmciID0gQCgpDQoJIldyaXRlLUVycm9yIiAgPSBAKCkNCgkiV3JpdGUtT3V0cHV0IiA9IEAoKQ0KCSJXcml0ZS1JbmZvcm1hdGlvbiIgPSBAKCkNCgkiV3JpdGUtRGVidWciID0gQCgpDQp9AQllAAAACWYAAAAGZwAAABxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxBmgAAAAkZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxCS0AAAAJagAAAAlrAAAAAVIAAAAhAAAABmwAAADgGCRtb2R1bGVSb290ID0gKFJlc29sdmUtUGF0aCAiJGdsb2JhbDp0ZXN0cm9vdFwuLiIpLlBhdGgNCg0KLiAiJGdsb2JhbDp0ZXN0cm9vdFxnZW5lcmFsXEZpbGVJbnRlZ3JpdHkuRXhjZXB0aW9ucy5wczEiDQoNCkRlc2NyaWJlICJWZXJpZnlpbmcgaW50ZWdyaXR5IG9mIG1vZHVsZSBmaWxlcyIgew0KCUJlZm9yZUFsbCB7DQoJCWZ1bmN0aW9uIEdldC1GaWxlRW5jb2RpbmcNCgkJew0KCQk8Iw0KCQkJLlNZTk9QU0lTDQoJCQkJVGVzdHMgYSBmaWxlIGZvciBlbmNvZGluZy4NCgkJCQ0KCQkJLkRFU0NSSVBUSU9ODQoJCQkJVGVzdHMgYSBmaWxlIGZvciBlbmNvZGluZy4NCgkJCQ0KCQkJLlBBUkFNRVRFUiBQYXRoDQoJCQkJVGhlIGZpbGUgdG8gdGVzdA0KCQkjPg0KCQkJW0NtZGxldEJpbmRpbmcoKV0NCgkJCVBhcmFtICgNCgkJCQlbUGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRUcnVlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJFRydWUpXQ0KCQkJCVtBbGlhcygnRnVsbE5hbWUnKV0NCgkJCQlbc3RyaW5nXQ0KCQkJCSRQYXRoDQoJCQkpDQoJCQkNCgkJCWlmICgkUFNWZXJzaW9uVGFibGUuUFNWZXJzaW9uLk1ham9yIC1sdCA2KQ0KCQkJew0KCQkJCVtieXRlW11dJGJ5dGUgPSBnZXQtY29udGVudCAtRW5jb2RpbmcgYnl0ZSAtUmVhZENvdW50IDQgLVRvdGFsQ291bnQgNCAtUGF0aCAkUGF0aA0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCVtieXRlW11dJGJ5dGUgPSBHZXQtQ29udGVudCAtQXNCeXRlU3RyZWFtIC1SZWFkQ291bnQgNCAtVG90YWxDb3VudCA0IC1QYXRoICRQYXRoDQoJCQl9DQoJCQkNCgkJCWlmICgkYnl0ZVswXSAtZXEgMHhlZiAtYW5kICRieXRlWzFdIC1lcSAweGJiIC1hbmQgJGJ5dGVbMl0gLWVxIDB4YmYpIHsgJ1VURjggQk9NJyB9DQoJCQllbHNlaWYgKCRieXRlWzBdIC1lcSAweGZlIC1hbmQgJGJ5dGVbMV0gLWVxIDB4ZmYpIHsgJ1VuaWNvZGUnIH0NCgkJCWVsc2VpZiAoJGJ5dGVbMF0gLWVxIDAgLWFuZCAkYnl0ZVsxXSAtZXEgMCAtYW5kICRieXRlWzJdIC1lcSAweGZlIC1hbmQgJGJ5dGVbM10gLWVxIDB4ZmYpIHsgJ1VURjMyJyB9DQoJCQllbHNlaWYgKCRieXRlWzBdIC1lcSAweDJiIC1hbmQgJGJ5dGVbMV0gLWVxIDB4MmYgLWFuZCAkYnl0ZVsyXSAtZXEgMHg3NikgeyAnVVRGNycgfQ0KCQkJZWxzZSB7ICdVbmtub3duJyB9DQoJCX0NCgl9DQoNCglDb250ZXh0ICJWYWxpZGF0aW5nIFBTMSBTY3JpcHQgZmlsZXMiIHsNCgkJJGFsbEZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkbW9kdWxlUm9vdCAtUmVjdXJzZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLnBzMSIgfCBXaGVyZS1PYmplY3QgRnVsbE5hbWUgLU5vdExpa2UgIiRtb2R1bGVSb290XHRlc3RzXCoiDQoJCQ0KCQlmb3JlYWNoICgkZmlsZSBpbiAkYWxsRmlsZXMpDQoJCXsNCgkJCSRuYW1lID0gJGZpbGUuRnVsbE5hbWUuUmVwbGFjZSgiJG1vZHVsZVJvb3RcIiwgJycpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIFVURjggZW5jb2Rpbmcgd2l0aCBCeXRlIE9yZGVyIE1hcmsiIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCUdldC1GaWxlRW5jb2RpbmcgLVBhdGggJGZpbGUuRnVsbE5hbWUgfCBTaG91bGQgLUJlICdVVEY4IEJPTScNCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UiIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCSgkZmlsZSB8IFNlbGVjdC1TdHJpbmcgIlxzJCIgfCBXaGVyZS1PYmplY3QgeyAkXy5MaW5lLlRyaW0oKS5MZW5ndGggLWd0IDB9KS5MaW5lTnVtYmVyIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQl9DQoJCQkNCgkJCSR0b2tlbnMgPSAkbnVsbA0KCQkJJHBhcnNlRXJyb3JzID0gJG51bGwNCgkJCSRhc3QgPSBbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5MYW5ndWFnZS5QYXJzZXJdOjpQYXJzZUZpbGUoJGZpbGUuRnVsbE5hbWUsIFtyZWZdJHRva2VucywgW3JlZl0kcGFyc2VFcnJvcnMpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHN5bnRheCBlcnJvcnMiIC1UZXN0Q2FzZXMgQHsgcGFyc2VFcnJvcnMgPSAkcGFyc2VFcnJvcnMgfSB7DQoJCQkJJHBhcnNlRXJyb3JzIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQl9DQoJCQkNCgkJCWZvcmVhY2ggKCRjb21tYW5kIGluICRnbG9iYWw6QmFubmVkQ29tbWFuZHMpDQoJCQl7DQoJCQkJaWYgKCRnbG9iYWw6TWF5Q29udGFpbkNvbW1hbmRbIiRjb21tYW5kIl0gLW5vdGNvbnRhaW5zICRmaWxlLk5hbWUpDQoJCQkJew0KCQkJCQlJdCAiWyRuYW1lXSBTaG91bGQgbm90IHVzZSAkY29tbWFuZCIgLVRlc3RDYXNlcyBAeyB0b2tlbnMgPSAkdG9rZW5zOyBjb21tYW5kID0gJGNvbW1hbmQgfSB7DQoJCQkJCQkkdG9rZW5zIHwgV2hlcmUtT2JqZWN0IFRleHQgLUVRICRjb21tYW5kIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJDQoJQ29udGV4dCAiVmFsaWRhdGluZyBoZWxwLnR4dCBoZWxwIGZpbGVzIiB7DQoJCSRhbGxGaWxlcyA9IEdldC1DaGlsZEl0ZW0gLVBhdGggJG1vZHVsZVJvb3QgLVJlY3Vyc2UgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5oZWxwLnR4dCIgfCBXaGVyZS1PYmplY3QgRnVsbE5hbWUgLU5vdExpa2UgIiRtb2R1bGVSb290XHRlc3RzXCoiDQoJCQ0KCQlmb3JlYWNoICgkZmlsZSBpbiAkYWxsRmlsZXMpDQoJCXsNCgkJCSRuYW1lID0gJGZpbGUuRnVsbE5hbWUuUmVwbGFjZSgiJG1vZHVsZVJvb3RcIiwgJycpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIFVURjggZW5jb2RpbmciIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCUdldC1GaWxlRW5jb2RpbmcgLVBhdGggJGZpbGUuRnVsbE5hbWUgfCBTaG91bGQgLUJlICdVVEY4IEJPTScNCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UiIC1UZXN0Q2FzZXMgQHsgZmlsZSA9ICRmaWxlIH0gew0KCQkJCSgkZmlsZSB8IFNlbGVjdC1TdHJpbmcgIlxzJCIgfCBXaGVyZS1PYmplY3QgeyAkXy5MaW5lLlRyaW0oKS5MZW5ndGggLWd0IDAgfSB8IE1lYXN1cmUtT2JqZWN0KS5Db3VudCB8IFNob3VsZCAtQmUgMA0KCQkJfQ0KCQl9DQoJfQ0KfQEJbQAAAAluAAAABm8AAAAXRmlsZUludGVncml0eS5UZXN0cy5wczEGcAAAAB9nZW5lcmFsXEZpbGVJbnRlZ3JpdHkuVGVzdHMucHMxCS0AAAAJcgAAAAlzAAAAAVMAAAAhAAAABnQAAACdBSMgTGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaWdub3JlZA0KJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucyA9IEAoDQogICAgDQopDQoNCjwjDQogIExpc3Qgb2YgYXJyYXllZCBlbnVtZXJhdGlvbnMuIFRoZXNlIG5lZWQgdG8gYmUgdHJlYXRlZCBkaWZmZXJlbnRseS4gQWRkIGZ1bGwgbmFtZS4NCiAgRXhhbXBsZToNCg0KICAiU3FsY29sbGFib3JhdGl2ZS5EYmF0b29scy5Db25uZWN0aW9uLk1hbmFnZW1lbnRDb25uZWN0aW9uVHlwZVtdIg0KIz4NCiRnbG9iYWw6SGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzID0gQCgNCgkNCikNCg0KPCMNCiAgU29tZSB0eXBlcyBvbiBwYXJhbWV0ZXJzIGp1c3QgZmFpbCB0aGVpciB2YWxpZGF0aW9uIG5vIG1hdHRlciB3aGF0Lg0KICBGb3IgdGhvc2UgaXQgYmVjb21lcyBwb3NzaWJsZSB0byBza2lwIHRoZW0sIGJ5IGFkZGluZyB0aGVtIHRvIHRoaXMgaGFzaHRhYmxlLg0KICBBZGQgYnkgZm9sbG93aW5nIHRoaXMgY29udmVudGlvbjogPGNvbW1hbmQgbmFtZT4gPSBAKDxsaXN0IG9mIHBhcmFtZXRlciBuYW1lcz4pDQogIEV4YW1wbGU6DQoNCiAgIkdldC1EYmFDbU9iamVjdCIgICAgICAgPSBAKCJEb05vdFVzZSIpDQojPg0KJGdsb2JhbDpIZWxwVGVzdFNraXBQYXJhbWV0ZXJUeXBlID0gQHsNCiAgICANCn0NCgEJdQAAAAl2AAAABncAAAATSGVscC5FeGNlcHRpb25zLnBzMQZ4AAAAG2dlbmVyYWxcSGVscC5FeGNlcHRpb25zLnBzMQktAAAACXoAAAAJewAAAAFUAAAAIQAAAAZ8AAAA4DQ8Iw0KICAgIC5OT1RFUw0KICAgICAgICBUaGUgb3JpZ2luYWwgdGVzdCB0aGlzIGlzIGJhc2VkIHVwb24gd2FzIHdyaXR0ZW4gYnkgSnVuZSBCbGVuZGVyLg0KCQlBZnRlciBzZXZlcmFsIHJvdW5kcyBvZiBtb2RpZmljYXRpb25zIGl0IHN0YW5kcyBub3cgYXMgaXQgaXMsIGJ1dCB0aGUgaG9ub3IgcmVtYWlucyBoZXJzLg0KDQoJCVRoYW5rIHlvdSBKdW5lLCBmb3IgYWxsIHlvdSBoYXZlIGRvbmUhDQoNCiAgICAuREVTQ1JJUFRJT04NCgkJVGhpcyB0ZXN0IGV2YWx1YXRlcyB0aGUgaGVscCBmb3IgYWxsIGNvbW1hbmRzIGluIGEgbW9kdWxlLg0KDQoJLlBBUkFNRVRFUiBTa2lwVGVzdA0KCQlEaXNhYmxlcyB0aGlzIHRlc3QuDQoJDQoJLlBBUkFNRVRFUiBDb21tYW5kUGF0aA0KCQlMaXN0IG9mIHBhdGhzIHVuZGVyIHdoaWNoIHRoZSBzY3JpcHQgZmlsZXMgYXJlIHN0b3JlZC4NCgkJVGhpcyB0ZXN0IGFzc3VtZXMgdGhhdCBhbGwgZnVuY3Rpb25zIGhhdmUgdGhlaXIgb3duIGZpbGUgdGhhdCBpcyBuYW1lZCBhZnRlciB0aGVtc2VsdmVzLg0KCQlUaGVzZSBwYXRocyBhcmUgdXNlZCB0byBzZWFyY2ggZm9yIGNvbW1hbmRzIHRoYXQgc2hvdWxkIGV4aXN0IGFuZCBiZSB0ZXN0ZWQuDQoJCVdpbGwgc2VhcmNoIHJlY3Vyc2l2ZWx5IGFuZCBhY2NlcHRzIHdpbGRjYXJkcywgbWFrZSBzdXJlIG9ubHkgZnVuY3Rpb25zIGFyZSBmb3VuZA0KDQoJLlBBUkFNRVRFUiBNb2R1bGVOYW1lDQoJCU5hbWUgb2YgdGhlIG1vZHVsZSB0byBiZSB0ZXN0ZWQuDQoJCVRoZSBtb2R1bGUgbXVzdCBhbHJlYWR5IGJlIGltcG9ydGVkDQoNCgkuUEFSQU1FVEVSIEV4Y2VwdGlvbnNGaWxlDQoJCUZpbGUgaW4gd2hpY2ggZXhjZXB0aW9ucyBhbmQgYWRqdXN0bWVudHMgYXJlIGNvbmZpZ3VyZWQuDQoJCUluIGl0IHRoZXJlIHNob3VsZCBiZSB0d28gYXJyYXlzIGFuZCBhIGhhc2h0YWJsZSBkZWZpbmVkOg0KCQkJJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucw0KCQkJJGdsb2JhbDpIZWxwVGVzdEVudW1lcmF0ZWRBcnJheXMNCgkJCSRnbG9iYWw6SGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZQ0KCQlUaGVzZSBjYW4gYmUgdXNlZCB0byB0d2VhayB0aGUgdGVzdHMgc2xpZ2h0bHkgaW4gY2FzZXMgb2YgbmVlZC4NCgkJU2VlIHRoZSBleGFtcGxlIGZpbGUgZm9yIGV4cGxhbmF0aW9ucyBvbiBlYWNoIG9mIHRoZXNlIHVzYWdlIGFuZCBlZmZlY3QuDQojPg0KW0NtZGxldEJpbmRpbmcoKV0NClBhcmFtICgNCglbc3dpdGNoXQ0KCSRTa2lwVGVzdCwNCgkNCglbc3RyaW5nW11dDQoJJENvbW1hbmRQYXRoID0gQCgiJGdsb2JhbDp0ZXN0cm9vdFwuLlxmdW5jdGlvbnMiLCAiJGdsb2JhbDp0ZXN0cm9vdFwuLlxpbnRlcm5hbFxmdW5jdGlvbnMiKSwNCgkNCglbc3RyaW5nXQ0KCSRNb2R1bGVOYW1lID0gIsO+bmFtZcO+IiwNCgkNCglbc3RyaW5nXQ0KCSRFeGNlcHRpb25zRmlsZSA9ICIkZ2xvYmFsOnRlc3Ryb290XGdlbmVyYWxcSGVscC5FeGNlcHRpb25zLnBzMSINCikNCmlmICgkU2tpcFRlc3QpIHsgcmV0dXJuIH0NCi4gJEV4Y2VwdGlvbnNGaWxlDQoNCiRpbmNsdWRlZE5hbWVzID0gKEdldC1DaGlsZEl0ZW0gJENvbW1hbmRQYXRoIC1SZWN1cnNlIC1GaWxlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIioucHMxIikuQmFzZU5hbWUNCiRjb21tYW5kVHlwZXMgPSBAKCdDbWRsZXQnLCAnRnVuY3Rpb24nKQ0KaWYgKCRQU1ZlcnNpb25UYWJsZS5QU0VkaXRpb24gLWVxICdEZXNrdG9wJyApIHsgJGNvbW1hbmRUeXBlcyArPSAnV29ya2Zsb3cnIH0NCiRjb21tYW5kcyA9IEdldC1Db21tYW5kIC1Nb2R1bGUgKEdldC1Nb2R1bGUgJE1vZHVsZU5hbWUpIC1Db21tYW5kVHlwZSAkY29tbWFuZFR5cGVzIHwgV2hlcmUtT2JqZWN0IE5hbWUgLUluICRpbmNsdWRlZE5hbWVzDQoNCiMjIFdoZW4gdGVzdGluZyBoZWxwLCByZW1lbWJlciB0aGF0IGhlbHAgaXMgY2FjaGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzZXNzaW9uLg0KIyMgVG8gdGVzdCwgcmVzdGFydCBzZXNzaW9uLg0KDQoNCmZvcmVhY2ggKCRjb21tYW5kIGluICRjb21tYW5kcykgew0KICAgICRjb21tYW5kTmFtZSA9ICRjb21tYW5kLk5hbWUNCiAgICANCiAgICAjIFNraXAgYWxsIGZ1bmN0aW9ucyB0aGF0IGFyZSBvbiB0aGUgZXhjbHVzaW9ucyBsaXN0DQogICAgaWYgKCRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMgLWNvbnRhaW5zICRjb21tYW5kTmFtZSkgeyBjb250aW51ZSB9DQogICAgDQogICAgIyBUaGUgbW9kdWxlLXF1YWxpZmllZCBjb21tYW5kIGZhaWxzIG9uIE1pY3Jvc29mdC5Qb3dlclNoZWxsLkFyY2hpdmUgY21kbGV0cw0KICAgICRIZWxwID0gR2V0LUhlbHAgJGNvbW1hbmROYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlDQoJDQoJRGVzY3JpYmUgIlRlc3QgaGVscCBmb3IgJGNvbW1hbmROYW1lIiB7DQogICAgICAgIA0KCQkjIElmIGhlbHAgaXMgbm90IGZvdW5kLCBzeW5vcHNpcyBpbiBhdXRvLWdlbmVyYXRlZCBoZWxwIGlzIHRoZSBzeW50YXggZGlhZ3JhbQ0KCQlJdCAic2hvdWxkIG5vdCBiZSBhdXRvLWdlbmVyYXRlZCIgLVRlc3RDYXNlcyBAeyBIZWxwID0gJEhlbHAgfSB7DQoJCQkkSGVscC5TeW5vcHNpcyB8IFNob3VsZCAtTm90IC1CZUxpa2UgJypgW2A8Q29tbW9uUGFyYW1ldGVyc2A+YF0qJw0KCQl9DQogICAgICAgIA0KCQkjIFNob3VsZCBiZSBhIGRlc2NyaXB0aW9uIGZvciBldmVyeSBmdW5jdGlvbg0KCQlJdCAiZ2V0cyBkZXNjcmlwdGlvbiBmb3IgJGNvbW1hbmROYW1lIiAtVGVzdENhc2VzIEB7IEhlbHAgPSAkSGVscCB9IHsNCgkJCSRIZWxwLkRlc2NyaXB0aW9uIHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KICAgICAgICANCgkJIyBTaG91bGQgYmUgYXQgbGVhc3Qgb25lIGV4YW1wbGUNCgkJSXQgImdldHMgZXhhbXBsZSBjb2RlIGZyb20gJGNvbW1hbmROYW1lIiAtVGVzdENhc2VzIEB7IEhlbHAgPSAkSGVscCB9IHsNCgkJCSgkSGVscC5FeGFtcGxlcy5FeGFtcGxlIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuQ29kZSB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQoJCX0NCgkNCgkJIyBTaG91bGQgYmUgYXQgbGVhc3Qgb25lIGV4YW1wbGUgZGVzY3JpcHRpb24NCgkJSXQgImdldHMgZXhhbXBsZSBoZWxwIGZyb20gJGNvbW1hbmROYW1lIiAtVGVzdENhc2VzIEB7IEhlbHAgPSAkSGVscCB9IHsNCgkJCSgkSGVscC5FeGFtcGxlcy5FeGFtcGxlLlJlbWFya3MgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKS5UZXh0IHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KICAgICAgICANCiAgICAgICAgQ29udGV4dCAiVGVzdCBwYXJhbWV0ZXIgaGVscCBmb3IgJGNvbW1hbmROYW1lIiB7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRjb21tb24gPSAnRGVidWcnLCAnRXJyb3JBY3Rpb24nLCAnRXJyb3JWYXJpYWJsZScsICdJbmZvcm1hdGlvbkFjdGlvbicsICdJbmZvcm1hdGlvblZhcmlhYmxlJywgJ091dEJ1ZmZlcicsICdPdXRWYXJpYWJsZScsICdQaXBlbGluZVZhcmlhYmxlJywgJ1ZlcmJvc2UnLCAnV2FybmluZ0FjdGlvbicsICdXYXJuaW5nVmFyaWFibGUnLCAnUHJvZ3Jlc3NBY3Rpb24nDQogICAgICAgICAgICANCiAgICAgICAgICAgICRwYXJhbWV0ZXJzID0gJGNvbW1hbmQuUGFyYW1ldGVyU2V0cy5QYXJhbWV0ZXJzIHwgU29ydC1PYmplY3QgLVByb3BlcnR5IE5hbWUgLVVuaXF1ZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1ub3RpbiAkY29tbW9uDQogICAgICAgICAgICAkcGFyYW1ldGVyTmFtZXMgPSAkcGFyYW1ldGVycy5OYW1lDQogICAgICAgICAgICAkSGVscFBhcmFtZXRlck5hbWVzID0gJEhlbHAuUGFyYW1ldGVycy5QYXJhbWV0ZXIuTmFtZSB8IFNvcnQtT2JqZWN0IC1VbmlxdWUNCiAgICAgICAgICAgIGZvcmVhY2ggKCRwYXJhbWV0ZXIgaW4gJHBhcmFtZXRlcnMpIHsNCiAgICAgICAgICAgICAgICAkcGFyYW1ldGVyTmFtZSA9ICRwYXJhbWV0ZXIuTmFtZQ0KICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJIZWxwID0gJEhlbHAucGFyYW1ldGVycy5wYXJhbWV0ZXIgfCBXaGVyZS1PYmplY3QgTmFtZSAtRVEgJHBhcmFtZXRlck5hbWUNCgkJCQ0KCQkJCSMgU2hvdWxkIGJlIGEgZGVzY3JpcHRpb24gZm9yIGV2ZXJ5IHBhcmFtZXRlcg0KCQkJCUl0ICJnZXRzIGhlbHAgZm9yIHBhcmFtZXRlcjogJHBhcmFtZXRlck5hbWUgOiBpbiAkY29tbWFuZE5hbWUiIC1UZXN0Q2FzZXMgQHsgcGFyYW1ldGVySGVscCA9ICRwYXJhbWV0ZXJIZWxwIH0gew0KCQkJCQkkcGFyYW1ldGVySGVscC5EZXNjcmlwdGlvbi5UZXh0IHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJCQl9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJGNvZGVNYW5kYXRvcnkgPSAkcGFyYW1ldGVyLklzTWFuZGF0b3J5LnRvU3RyaW5nKCkNCgkJCQlJdCAiaGVscCBmb3IgJHBhcmFtZXRlck5hbWUgcGFyYW1ldGVyIGluICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBNYW5kYXRvcnkgdmFsdWUiIC1UZXN0Q2FzZXMgQHsgcGFyYW1ldGVySGVscCA9ICRwYXJhbWV0ZXJIZWxwOyBjb2RlTWFuZGF0b3J5ID0gJGNvZGVNYW5kYXRvcnkgfSB7DQoJCQkJCSRwYXJhbWV0ZXJIZWxwLlJlcXVpcmVkIHwgU2hvdWxkIC1CZSAkY29kZU1hbmRhdG9yeQ0KCQkJCX0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoJEhlbHBUZXN0U2tpcFBhcmFtZXRlclR5cGVbJGNvbW1hbmROYW1lXSAtY29udGFpbnMgJHBhcmFtZXRlck5hbWUpIHsgY29udGludWUgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICRjb2RlVHlwZSA9ICRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5OYW1lDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5Jc0VudW0pIHsNCiAgICAgICAgICAgICAgICAgICAgIyBFbnVtZXJhdGlvbnMgb2Z0ZW4gaGF2ZSBpc3N1ZXMgd2l0aCB0aGUgdHlwZW5hbWUgbm90IGJlaW5nIHJlbGlhYmx5IGF2YWlsYWJsZQ0KICAgICAgICAgICAgICAgICAgICAkbmFtZXMgPSAkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGU6OkdldE5hbWVzKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZSkNCgkJCQkJCSMgUGFyYW1ldGVyIHR5cGUgaW4gSGVscCBzaG91bGQgbWF0Y2ggY29kZQ0KCQkJCQlJdCAiaGVscCBmb3IgJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IHBhcmFtZXRlciB0eXBlIGZvciAkcGFyYW1ldGVyTmFtZSIgLVRlc3RDYXNlcyBAeyBwYXJhbWV0ZXJIZWxwID0gJHBhcmFtZXRlckhlbHA7IG5hbWVzID0gJG5hbWVzIH0gew0KCQkJCQkJJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWVHcm91cC5wYXJhbWV0ZXJWYWx1ZSB8IFNob3VsZCAtYmUgJG5hbWVzDQoJCQkJCX0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZWlmICgkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUgLWluICRIZWxwVGVzdEVudW1lcmF0ZWRBcnJheXMpIHsNCiAgICAgICAgICAgICAgICAgICAgIyBFbnVtZXJhdGlvbnMgb2Z0ZW4gaGF2ZSBpc3N1ZXMgd2l0aCB0aGUgdHlwZW5hbWUgbm90IGJlaW5nIHJlbGlhYmx5IGF2YWlsYWJsZQ0KICAgICAgICAgICAgICAgICAgICAkbmFtZXMgPSBbRW51bV06OkdldE5hbWVzKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5EZWNsYXJlZE1lbWJlcnNbMF0uUmV0dXJuVHlwZSkNCgkJCQkJSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIC1UZXN0Q2FzZXMgQHsgcGFyYW1ldGVySGVscCA9ICRwYXJhbWV0ZXJIZWxwOyBuYW1lcyA9ICRuYW1lcyB9IHsNCgkJCQkJCSRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlR3JvdXAucGFyYW1ldGVyVmFsdWUgfCBTaG91bGQgLWJlICRuYW1lcw0KCQkJCQl9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAjIFRvIGF2b2lkIGNhbGxpbmcgVHJpbSBtZXRob2Qgb24gYSBudWxsIG9iamVjdC4NCiAgICAgICAgICAgICAgICAgICAgJGhlbHBUeXBlID0gaWYgKCRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlKSB7ICRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlLlRyaW0oKSB9DQoJCQkJCSMgUGFyYW1ldGVyIHR5cGUgaW4gSGVscCBzaG91bGQgbWF0Y2ggY29kZQ0KCQkJCQlJdCAiaGVscCBmb3IgJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IHBhcmFtZXRlciB0eXBlIGZvciAkcGFyYW1ldGVyTmFtZSIgLVRlc3RDYXNlcyBAeyBoZWxwVHlwZSA9ICRoZWxwVHlwZTsgY29kZVR5cGUgPSAkY29kZVR5cGUgfSB7DQoJCQkJCQkkaGVscFR5cGUgfCBTaG91bGQgLWJlICRjb2RlVHlwZQ0KCQkJCQl9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yZWFjaCAoJGhlbHBQYXJtIGluICRIZWxwUGFyYW1ldGVyTmFtZXMpIHsNCgkJCQkjIFNob3VsZG4ndCBmaW5kIGV4dHJhIHBhcmFtZXRlcnMgaW4gaGVscC4NCgkJCQlJdCAiZmluZHMgaGVscCBwYXJhbWV0ZXIgaW4gY29kZTogJGhlbHBQYXJtIiAtVGVzdENhc2VzIEB7IGhlbHBQYXJtID0gJGhlbHBQYXJtOyBwYXJhbWV0ZXJOYW1lcyA9ICRwYXJhbWV0ZXJOYW1lcyB9IHsNCgkJCQkJJGhlbHBQYXJtIC1pbiAkcGFyYW1ldGVyTmFtZXMgfCBTaG91bGQgLUJlICR0cnVlDQoJCQkJfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQEJfQAAAAl+AAAABn8AAAAOSGVscC5UZXN0cy5wczEGgAAAABZnZW5lcmFsXEhlbHAuVGVzdHMucHMxCS0AAAAJggAAAAmDAAAAAVUAAAAhAAAABoQAAADLFURlc2NyaWJlICJWYWxpZGF0aW5nIHRoZSBtb2R1bGUgbWFuaWZlc3QiIHsNCgkkbW9kdWxlUm9vdCA9IChSZXNvbHZlLVBhdGggIiRnbG9iYWw6dGVzdHJvb3RcLi4iKS5QYXRoDQoJJG1hbmlmZXN0ID0gKChHZXQtQ29udGVudCAiJG1vZHVsZVJvb3Rcw75uYW1lw74ucHNkMSIpIC1qb2luICJgbiIpIHwgSW52b2tlLUV4cHJlc3Npb24NCglDb250ZXh0ICJCYXNpYyByZXNvdXJjZXMgdmFsaWRhdGlvbiIgew0KCQkkZmlsZXMgPSBHZXQtQ2hpbGRJdGVtICIkbW9kdWxlUm9vdFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIioucHMxIg0KCQlJdCAiRXhwb3J0cyBhbGwgZnVuY3Rpb25zIGluIHRoZSBwdWJsaWMgZm9sZGVyIiAtVGVzdENhc2VzIEB7IGZpbGVzID0gJGZpbGVzOyBtYW5pZmVzdCA9ICRtYW5pZmVzdCB9IHsNCgkJCQ0KCQkJJGZ1bmN0aW9ucyA9IChDb21wYXJlLU9iamVjdCAtUmVmZXJlbmNlT2JqZWN0ICRmaWxlcy5CYXNlTmFtZSAtRGlmZmVyZW5jZU9iamVjdCAkbWFuaWZlc3QuRnVuY3Rpb25zVG9FeHBvcnQgfCBXaGVyZS1PYmplY3QgU2lkZUluZGljYXRvciAtTGlrZSAnPD0nKS5JbnB1dE9iamVjdA0KCQkJJGZ1bmN0aW9ucyB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQoJCUl0ICJFeHBvcnRzIG5vIGZ1bmN0aW9uIHRoYXQgaXNuJ3QgYWxzbyBwcmVzZW50IGluIHRoZSBwdWJsaWMgZm9sZGVyIiAtVGVzdENhc2VzIEB7IGZpbGVzID0gJGZpbGVzOyBtYW5pZmVzdCA9ICRtYW5pZmVzdCB9IHsNCgkJCSRmdW5jdGlvbnMgPSAoQ29tcGFyZS1PYmplY3QgLVJlZmVyZW5jZU9iamVjdCAkZmlsZXMuQmFzZU5hbWUgLURpZmZlcmVuY2VPYmplY3QgJG1hbmlmZXN0LkZ1bmN0aW9uc1RvRXhwb3J0IHwgV2hlcmUtT2JqZWN0IFNpZGVJbmRpY2F0b3IgLUxpa2UgJz0+JykuSW5wdXRPYmplY3QNCgkJCSRmdW5jdGlvbnMgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCQkNCgkJSXQgIkV4cG9ydHMgbm9uZSBvZiBpdHMgaW50ZXJuYWwgZnVuY3Rpb25zIiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgbWFuaWZlc3QgPSAkbWFuaWZlc3QgfSB7DQoJCQkkZmlsZXMgPSBHZXQtQ2hpbGRJdGVtICIkbW9kdWxlUm9vdFxpbnRlcm5hbFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIC1GaWx0ZXIgIioucHMxIg0KCQkJJGZpbGVzIHwgV2hlcmUtT2JqZWN0IEJhc2VOYW1lIC1JbiAkbWFuaWZlc3QuRnVuY3Rpb25zVG9FeHBvcnQgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCX0NCgkNCglDb250ZXh0ICJJbmRpdmlkdWFsIGZpbGUgdmFsaWRhdGlvbiIgew0KCQlJdCAiVGhlIHJvb3QgbW9kdWxlIGZpbGUgZXhpc3RzIiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgbWFuaWZlc3QgPSAkbWFuaWZlc3QgfSB7DQoJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCQoJG1hbmlmZXN0LlJvb3RNb2R1bGUpIiB8IFNob3VsZCAtQmUgJHRydWUNCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJGZvcm1hdCBpbiAkbWFuaWZlc3QuRm9ybWF0c1RvUHJvY2VzcykNCgkJew0KCQkJSXQgIlRoZSBmaWxlICRmb3JtYXQgc2hvdWxkIGV4aXN0IiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgZm9ybWF0ID0gJGZvcm1hdCB9IHsNCgkJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCRmb3JtYXQiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQkJfQ0KCQl9DQoJCQ0KCQlmb3JlYWNoICgkdHlwZSBpbiAkbWFuaWZlc3QuVHlwZXNUb1Byb2Nlc3MpDQoJCXsNCgkJCUl0ICJUaGUgZmlsZSAkdHlwZSBzaG91bGQgZXhpc3QiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyB0eXBlID0gJHR5cGUgfSB7DQoJCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkdHlwZSIgfCBTaG91bGQgLUJlICR0cnVlDQoJCQl9DQoJCX0NCgkJDQoJCWZvcmVhY2ggKCRhc3NlbWJseSBpbiAkbWFuaWZlc3QuUmVxdWlyZWRBc3NlbWJsaWVzKQ0KCQl7DQogICAgICAgICAgICBpZiAoJGFzc2VtYmx5IC1saWtlICIqLmRsbCIpIHsNCiAgICAgICAgICAgICAgICBJdCAiVGhlIGZpbGUgJGFzc2VtYmx5IHNob3VsZCBleGlzdCIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IGFzc2VtYmx5ID0gJGFzc2VtYmx5IH0gew0KICAgICAgICAgICAgICAgICAgICBUZXN0LVBhdGggIiRtb2R1bGVSb290XCRhc3NlbWJseSIgfCBTaG91bGQgLUJlICR0cnVlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgSXQgIlRoZSBmaWxlICRhc3NlbWJseSBzaG91bGQgbG9hZCBmcm9tIHRoZSBHQUMiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyBhc3NlbWJseSA9ICRhc3NlbWJseSB9IHsNCiAgICAgICAgICAgICAgICAgICAgeyBBZGQtVHlwZSAtQXNzZW1ibHlOYW1lICRhc3NlbWJseSB9IHwgU2hvdWxkIC1Ob3QgLVRocm93DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoJCQ0KCQlmb3JlYWNoICgkdGFnIGluICRtYW5pZmVzdC5Qcml2YXRlRGF0YS5QU0RhdGEuVGFncykNCgkJew0KCQkJSXQgIlRhZ3Mgc2hvdWxkIGhhdmUgbm8gc3BhY2VzIGluIG5hbWUiIC1UZXN0Q2FzZXMgQHsgdGFnID0gJHRhZyB9IHsNCgkJCQkkdGFnIC1tYXRjaCAiICIgfCBTaG91bGQgLUJlICRmYWxzZQ0KCQkJfQ0KCQl9DQoJfQ0KfQEJhQAAAAmGAAAABocAAAASTWFuaWZlc3QuVGVzdHMucHMxBogAAAAaZ2VuZXJhbFxNYW5pZmVzdC5UZXN0cy5wczEJLQAAAAmKAAAACYsAAAABVgAAACEAAAAGjAAAANMMW0NtZGxldEJpbmRpbmcoKV0NClBhcmFtICgNCglbc3dpdGNoXQ0KCSRTa2lwVGVzdCwNCg0KCVtzdHJpbmdbXV0NCgkkQ29tbWFuZFBhdGggPSBAKCIkZ2xvYmFsOnRlc3Ryb290XC4uXGZ1bmN0aW9ucyIsICIkZ2xvYmFsOnRlc3Ryb290XC4uXGludGVybmFsXGZ1bmN0aW9ucyIpDQopDQoNCkJlZm9yZURpc2NvdmVyeSB7DQoJaWYgKCRTa2lwVGVzdCkgeyByZXR1cm4gfQ0KDQoJJGdsb2JhbDpfX3Blc3Rlcl9kYXRhLlNjcmlwdEFuYWx5emVyID0gTmV3LU9iamVjdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0DQoNCgkjIENyZWF0ZSBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwYXRoIGFuZCBiYXNlbmFtZSBvZiBhbGwgZmlsZXMgdG8gdGVzdA0KCSRjb21tYW5kRmlsZXMgPSAkQ29tbWFuZFBhdGggfCBGb3JFYWNoLU9iamVjdCB7DQoJCUdldC1DaGlsZEl0ZW0gLVBhdGggJF8gLVJlY3Vyc2UgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiDQoJfSB8IEZvckVhY2gtT2JqZWN0IHsNCgkJQHsNCgkJCUJhc2VOYW1lID0gJF8uQmFzZU5hbWUNCgkJCUZ1bGxOYW1lID0gJF8uRnVsbE5hbWUNCgkJfQ0KCX0NCg0KCSMgQ3JlYXRlIGFuIGFycmF5IGNvbnRhaW4gYWxsIHJ1bGVzDQoJJHNjcmlwdEFuYWx5emVyUnVsZXMgPSBHZXQtU2NyaXB0QW5hbHl6ZXJSdWxlIHwgRm9yRWFjaC1PYmplY3Qgew0KCQlAew0KCQkJUnVsZU5hbWUgPSAkXy5SdWxlTmFtZQ0KCQl9DQoJfQ0KfQ0KDQpEZXNjcmliZSAnSW52b2tpbmcgUFNTY3JpcHRBbmFseXplciBhZ2FpbnN0IGNvbW1hbmRiYXNlJyB7DQoNCglDb250ZXh0ICJBbmFseXppbmcgPEJhc2VOYW1lPiIgLUZvckVhY2ggJGNvbW1hbmRGaWxlcyB7DQoJCUJlZm9yZUFsbCB7DQoJCQkkYW5hbHlzaXMgPSBJbnZva2UtU2NyaXB0QW5hbHl6ZXIgLVBhdGggJEZ1bGxOYW1lIC1FeGNsdWRlUnVsZSBQU0F2b2lkVHJhaWxpbmdXaGl0ZXNwYWNlLCBQU1Nob3VsZFByb2Nlc3MNCgkJfQ0KDQoJCUl0ICJTaG91bGQgcGFzcyA8UnVsZU5hbWU+IiAtRm9yZWFjaCAkc2NyaXB0QW5hbHl6ZXJSdWxlcyB7DQoJCQkjIFRlc3QgaWYgdGhlIHJ1bGUgaXMgcHJlc2VudCBhbmQgaWYgc28gY3JlYXRlIGEgc3RyaW5nIGNvbnRhaW5pbmcgbW9yZSBpbmZvIHdoaWNoIHdpbGwgYmUgc2hvd24gaW4gdGhlIGRldGFpbHMgb2YgdGhlIHRlc3Qgb3V0cHV0LiBJZiBpdCdzIGVtcHR5IHRoZSB0ZXN0IGlzIHN1Y2Nlc2Z1bGwgYXMgdGhlcmUgaXMgbm8gcHJvYmxlbSB3aXRoIHRoaXMgcnVsZS4NCgkJCSRhbmFseXNpcyB8IFdoZXJlLU9iamVjdCBSdWxlTmFtZSAtRVEgJFJ1bGVOYW1lIHwgRm9yZWFjaC1PYmplY3Qgew0KCQkJCSMgQ3JlYXRlIGEgc3RyaW5nDQoJCQkJIiQoJF8uU2V2ZXJpdHkpIGF0IExpbmUgJCgkXy5MaW5lKSBDb2x1bW4gJCgkXy5Db2x1bW4pIHdpdGggJyQoJF8uRXh0ZW50KSciDQoJCQkJIyBBZGQgdGhlIGRhdGEgKGFuZCBzdXByZXNzIHRoZSBvdXRwdXQpIHRvIHRoZSBnbG9iYWwgdmFyaWFibGUgZm9yIGxhdGVyIHVzZQ0KCQkJCSRudWxsID0gJGdsb2JhbDpfX3Blc3Rlcl9kYXRhLlNjcmlwdEFuYWx5emVyLkFkZCgkXykNCgkJCX0gfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCX0NCn0BCY0AAAAJjgAAAAaPAAAAGlBTU2NyaXB0QW5hbHl6ZXIuVGVzdHMucHMxBpAAAAAiZ2VuZXJhbFxQU1NjcmlwdEFuYWx5emVyLlRlc3RzLnBzMQktAAAACZIAAAAJkwAAAAFXAAAAIQAAAAaUAAAA5gckZXhjZXB0aW9ucyA9IEB7IH0NCg0KPCMNCkEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgTUFZIGJlIGluIHRoZSBsYW5ndWFnZSBmaWxlcywgd2l0aG91dCBjYXVzaW5nIHRoZSB0ZXN0cyB0byBmYWlsLg0KVGhpcyBpcyBjb21tb25seSB1c2VkIGluIG1vZHVsZXMgdGhhdCBnZW5lcmF0ZSBsb2NhbGl6ZWQgbWVzc2FnZXMgc3RyYWlnaHQgZnJvbSBDIy4NClNwZWNpZnkgdGhlIGZ1bGwga2V5IGFzIGl0IGlzIHdyaXR0ZW4gaW4gdGhlIGxhbmd1YWdlIGZpbGVzLCBkbyBub3QgcHJlcGVuZCB0aGUgbW9kdWxlbmFtZSwNCmFzIHlvdSB3b3VsZCBoYXZlIHRvIGluIEMjIGNvZGUuDQoNCkV4YW1wbGU6DQokZXhjZXB0aW9uc1snTGVnYWxTdXJwbHVzJ10gPSBAKA0KICAgICdFeGNlcHRpb24uU3RyZWFtcy5GYWlsZWRDcmVhdGUnDQogICAgJ0V4Y2VwdGlvbi5TdHJlYW1zLkZhaWxlZERpc3Bvc2UnDQopDQojPg0KJGV4Y2VwdGlvbnNbJ0xlZ2FsU3VycGx1cyddID0gQCgNCg0KKQ0KPCMNCkEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgTUFZIGJlIHVzZWQgd2l0aG91dCBuZWVkaW5nIHRvIGhhdmUgdGV4dCBkZWZpbmVkLg0KVGhpcyBpcyBpbnRlbmRlZCBmb3IgbW9kdWxlcyAocmUtKXVzaW5nIHN0cmluZ3MgcHJvdmlkZWQgYnkgYW5vdGhlciBtb2R1bGUNCiM+DQokZXhjZXB0aW9uc1snTm9UZXh0TmVlZGVkJ10gPSBAKA0KCSdWYWxpZGF0ZS5GU1BhdGgnDQoJJ1ZhbGlkYXRlLkZTUGF0aC5GaWxlJw0KCSdWYWxpZGF0ZS5GU1BhdGguRmlsZU9yUGFyZW50Jw0KCSdWYWxpZGF0ZS5GU1BhdGguRm9sZGVyJw0KCSdWYWxpZGF0ZS5QYXRoJw0KCSdWYWxpZGF0ZS5QYXRoLkNvbnRhaW5lcicNCgknVmFsaWRhdGUuUGF0aC5MZWFmJw0KCSdWYWxpZGF0ZS5UaW1lU3Bhbi5Qb3NpdGl2ZScNCgknVmFsaWRhdGUuVXJpLkFic29sdXRlJw0KCSdWYWxpZGF0ZS5VcmkuQWJzb2x1dGUuRmlsZScNCgknVmFsaWRhdGUuVXJpLkFic29sdXRlLkh0dHBzJw0KKQ0KDQokZXhjZXB0aW9ucwEJlQAAAAmWAAAABpcAAAAWc3RyaW5ncy5FeGNlcHRpb25zLnBzMQaYAAAAHmdlbmVyYWxcc3RyaW5ncy5FeGNlcHRpb25zLnBzMQktAAAACZoAAAAJmwAAAAFYAAAAIQAAAAacAAAAlwg8Iw0KLkRFU0NSSVBUSU9ODQogICAgVGhpcyB0ZXN0IHZlcmlmaWVzLCB0aGF0IGFsbCBzdHJpbmdzIHRoYXQgaGF2ZSBiZWVuIHVzZWQsDQogICAgYXJlIGxpc3RlZCBpbiB0aGUgbGFuZ3VhZ2UgZmlsZXMgYW5kIHRodXMgaGF2ZSBhIG1lc3NhZ2UgYmVpbmcgZGlzcGxheWVkLg0KDQogICAgSXQgYWxzbyBjaGVja3MsIHdoZXRoZXIgdGhlIGxhbmd1YWdlIGZpbGVzIGhhdmUgb3JwaGFuZWQgZW50cmllcyB0aGF0IG5lZWQgY2xlYW5pbmcgdXAuDQojPg0KDQoNCg0KRGVzY3JpYmUgIlRlc3RpbmcgbG9jYWxpemF0aW9uIHN0cmluZ3MiIHsNCgkkbW9kdWxlUm9vdCA9IChHZXQtTW9kdWxlIMO+bmFtZcO+KS5Nb2R1bGVCYXNlDQoJJHN0cmluZ3NSZXN1bHRzID0gRXhwb3J0LVBTTURTdHJpbmcgLU1vZHVsZVJvb3QgJG1vZHVsZVJvb3QNCgkkZXhjZXB0aW9ucyA9ICYgIiRnbG9iYWw6dGVzdHJvb3RcZ2VuZXJhbFxzdHJpbmdzLkV4Y2VwdGlvbnMucHMxIg0KCQ0KCWZvcmVhY2ggKCRzdHJpbmdFbnRyeSBpbiAkc3RyaW5nc1Jlc3VsdHMpIHsNCiAgICAgICAgaWYgKCRzdHJpbmdFbnRyeS5TdHJpbmcgLWVxICJrZXkiKSB7IGNvbnRpbnVlIH0gIyBTa2lwcGluZyB0aGUgdGVtcGxhdGUgZGVmYXVsdCBlbnRyeQ0KCQlJdCAiU2hvdWxkIGJlIHVzZWQgJiBoYXZlIHRleHQ6ICQoJHN0cmluZ0VudHJ5LlN0cmluZykiIC1UZXN0Q2FzZXMgQHsgc3RyaW5nRW50cnkgPSAkc3RyaW5nRW50cnk7IGV4Y2VwdGlvbnMgPSAkZXhjZXB0aW9ucyB9IHsNCiAgICAgICAgICAgIGlmICgkZXhjZXB0aW9ucy5MZWdhbFN1cnBsdXMgLW5vdGNvbnRhaW5zICRzdHJpbmdFbnRyeS5TdHJpbmcpIHsNCiAgICAgICAgICAgICAgICAkc3RyaW5nRW50cnkuU3VycGx1cyB8IFNob3VsZCAtQmVGYWxzZQ0KCQkJfQ0KCQkJaWYgKCRleGNlcHRpb25zLk5vVGV4dE5lZWRlZCAtbm90Y29udGFpbnMgJHN0cmluZ0VudHJ5LlN0cmluZykgew0KCQkJCSRzdHJpbmdFbnRyeS5UZXh0IHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJCX0NCiAgICAgICAgfQ0KICAgIH0NCn0BCZ0AAAAJngAAAAafAAAAEXN0cmluZ3MuVGVzdHMucHMxBqAAAAAZZ2VuZXJhbFxzdHJpbmdzLlRlc3RzLnBzMQktAAAACaIAAAAJowAAAAFdAAAACAAAAAlKAAAAAAAAAAAAAAABXgAAAAgAAAAJSgAAAAAAAAAAAAAAAWIAAAAIAAAACUoAAAAAAAAAAAAAAAFjAAAACAAAAAlKAAAAAAAAAAAAAAABZQAAAAgAAAAJSgAAAAAAAAAAAAAAAWYAAAAIAAAACUoAAAAAAAAAAAAAAAFqAAAACAAAAAlKAAAAAAAAAAAAAAABawAAAAgAAAAJSgAAAAAAAAAAAAAAAW0AAAAIAAAACUoAAAAAAAAAAAAAAAFuAAAACAAAAAlKAAAAAAAAAAAAAAABcgAAAAgAAAAJSgAAAAAAAAAAAAAAAXMAAAAIAAAACUoAAAAAAAAAAAAAAAF1AAAACAAAAAlKAAAAAAAAAAAAAAABdgAAAAgAAAAJSgAAAAAAAAAAAAAAAXoAAAAIAAAACUoAAAAAAAAAAAAAAAF7AAAACAAAAAlKAAAAAAAAAAAAAAABfQAAAAgAAAAJpQAAAAEAAAABAAAAAX4AAAAIAAAACUoAAAAAAAAAAAAAAAGCAAAACAAAAAlKAAAAAAAAAAAAAAABgwAAAAgAAAAJSgAAAAAAAAAAAAAAAYUAAAAIAAAACacAAAABAAAAAQAAAAGGAAAACAAAAAlKAAAAAAAAAAAAAAABigAAAAgAAAAJSgAAAAAAAAAAAAAAAYsAAAAIAAAACUoAAAAAAAAAAAAAAAGNAAAACAAAAAlKAAAAAAAAAAAAAAABjgAAAAgAAAAJSgAAAAAAAAAAAAAAAZIAAAAIAAAACUoAAAAAAAAAAAAAAAGTAAAACAAAAAlKAAAAAAAAAAAAAAABlQAAAAgAAAAJSgAAAAAAAAAAAAAAAZYAAAAIAAAACUoAAAAAAAAAAAAAAAGaAAAACAAAAAlKAAAAAAAAAAAAAAABmwAAAAgAAAAJSgAAAAAAAAAAAAAAAZ0AAAAIAAAACakAAAABAAAAAQAAAAGeAAAACAAAAAlKAAAAAAAAAAAAAAABogAAAAgAAAAJSgAAAAAAAAAAAAAAAaMAAAAIAAAACUoAAAAAAAAAAAAAABGlAAAABAAAAAarAAAABG5hbWUNAxGnAAAABAAAAAasAAAABG5hbWUNAxGpAAAABAAAAAatAAAABG5hbWUNAws=</BA>
    </MS>
  </Obj>
</Objs>